InnValue::setInn()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 4
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 6
rs 10
1
<?php
2
3
4
namespace talismanfr\rosselhozbank\shared;
5
6
7
class InnValue
8
{
9
    /** @var string */
10
    private $inn;
11
12
    public function __construct(string $inn)
13
    {
14
        $this->setInn($inn);
15
    }
16
17
    /**
18
     * @return string
19
     */
20
    public function getInn(): string
21
    {
22
        return $this->inn;
23
    }
24
25
    /**
26
     * @param string $inn
27
     */
28
    private function setInn(string $inn): void
29
    {
30
        if($this->isValid($inn)){
31
            $this->inn=$inn;
32
        }else{
33
            throw new \InvalidArgumentException('INN not valid');
34
        }
35
    }
36
37
    /**
38
     *
39
     * @param   string  $inn   10-ти или 12-ти значное целое число
40
     * @return  bool    TRUE, если ИНН корректен и FALSE в противном случае
41
     */
42
    private function isValid(string $inn):bool
43
    {
44
        if (preg_match('/[^0-9]/', $inn)) {
45
            return false; //'ИНН может состоять только из цифр';
46
        } elseif (!in_array($inn_length = strlen($inn), [10, 12])) {
47
            return false;// 'ИНН может состоять только из 10 или 12 цифр';
48
        } else {
49
            $check_digit = function($inn, $coefficients) {
50
                $n = 0;
51
                foreach ($coefficients as $i => $k) {
52
                    $n += $k * (int) $inn{$i};
53
                }
54
                return $n % 11 % 10;
55
            };
56
            switch ($inn_length) {
57
                case 10:
58
                    $n10 = $check_digit($inn, [2, 4, 10, 3, 5, 9, 4, 6, 8]);
59
                    if ($n10 === (int) $inn{9}) {
60
                        return true;
61
                    }
62
                    break;
63
                case 12:
64
                    $n11 = $check_digit($inn, [7, 2, 4, 10, 3, 5, 9, 4, 6, 8]);
65
                    $n12 = $check_digit($inn, [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8]);
66
                    if (($n11 === (int) $inn{10}) && ($n12 === (int) $inn{11})) {
67
                        return true;
68
                    }
69
                    break;
70
            }
71
        }
72
73
        return false;
74
    }
75
76
}