@@ -7,22 +7,34 @@ import (
77)
88
99var (
10- errInvalidLength = errors .New ("invalid inn length" )
11- errInvalidValue = errors .New ("invalid inn value" )
10+ errInvalidINNLength = errors .New ("invalid inn length" )
11+ errInvalidBIKLength = errors .New ("invalid bik length" )
12+
13+ errInvalidValue = errors .New ("invalid code value" )
14+
15+ errInvalidBIKCountryCode = errors .New ("invalid bik country code" )
1216)
1317
18+ func strToArr (str string ) ([]int , error ) {
19+ numbers := strings .Split (str , "" )
20+ arr := make ([]int , 0 , len (numbers ))
21+ for _ , number := range numbers {
22+ number , err := strconv .Atoi (number )
23+ if err != nil {
24+ return []int {}, errInvalidValue
25+ }
26+ arr = append (arr , number )
27+ }
28+ return arr , nil
29+ }
30+
1431func ValidateINN (inn string ) (bool , error ) {
1532 if len (inn ) != 10 && len (inn ) != 12 {
16- return false , errInvalidLength
33+ return false , errInvalidINNLength
1734 }
18- innNumbers := strings .Split (inn , "" )
19- innArr := make ([]int , 0 , len (inn ))
20- for _ , str := range innNumbers {
21- number , err := strconv .Atoi (str )
22- if err != nil {
23- return false , errInvalidValue
24- }
25- innArr = append (innArr , number )
35+ innArr , err := strToArr (inn )
36+ if err != nil {
37+ return false , err
2638 }
2739 if len (inn ) == 10 {
2840 controlNumber := ((2 * innArr [0 ] + 4 * innArr [1 ] + 10 * innArr [2 ] + 3 * innArr [3 ] + 5 * innArr [4 ] + 9 * innArr [5 ] + 4 * innArr [6 ] + 6 * innArr [7 ] + 8 * innArr [8 ]) % 11 ) % 10
@@ -34,7 +46,25 @@ func ValidateINN(inn string) (bool, error) {
3446}
3547
3648func ValidateBIK (bik string ) (bool , error ) {
37- return false , nil
49+ if len (bik ) != 9 {
50+ return false , errInvalidBIKLength
51+ }
52+ bikArr , err := strToArr (bik )
53+ if err != nil {
54+ return false , err
55+ }
56+ if bikArr [0 ] != 0 && bik [1 ] != 4 {
57+ return false , errInvalidBIKCountryCode
58+ }
59+ if bikArr [6 ] == 0 && bikArr [7 ] == 1 && bikArr [8 ] == 0 {
60+ return true , nil
61+ }
62+ latestTriadStr := bik [6 :]
63+ code , err := strconv .Atoi (latestTriadStr )
64+ if err != nil {
65+ return false , errInvalidValue
66+ }
67+ return code >= 50 && code < 1000 , nil
3868}
3969
4070func ValidateOGRN (ogrn string ) (bool , error ) {
0 commit comments