@@ -18,6 +18,8 @@ func strToArr(str string) ([]int, error) {
1818 return arr , nil
1919}
2020
21+ // IsINNValid
22+ // example valid format is
2123func IsINNValid (inn string ) (bool , error ) {
2224 if len (inn ) != 10 && len (inn ) != 12 {
2325 return false , ErrInvalidINNLength
@@ -35,6 +37,8 @@ func IsINNValid(inn string) (bool, error) {
3537 return firstControlNumber == innArr [len (innArr )- 2 ] && secondControlNumber == innArr [len (innArr )- 1 ], nil
3638}
3739
40+ // IsBIKValid
41+ // example valid format is
3842func IsBIKValid (bik string ) (bool , error ) {
3943 if len (bik ) != 9 {
4044 return false , ErrInvalidBIKLength
@@ -55,18 +59,63 @@ func IsBIKValid(bik string) (bool, error) {
5559 return code >= 50 && code < 1000 , nil
5660}
5761
62+ // IsOGRNValid
63+ // example valid format is
5864func IsOGRNValid (ogrn string ) (bool , error ) {
59- return false , nil
65+ if len (ogrn ) != 13 {
66+ return false , ErrInvalidOGRNLength
67+ }
68+ ogrnArr , err := strToArr (ogrn )
69+ if err != nil {
70+ return false , err
71+ }
72+ code , _ := strconv .Atoi (ogrn [:12 ])
73+ return ogrnArr [len (ogrn )- 1 ] == code % 11 % 10 , nil
6074}
6175
76+ // IsOGRNIPValid check to valid OGRNIP format
77+ // example valid format is
6278func IsOGRNIPValid (ogrnip string ) (bool , error ) {
63- return false , nil
79+ if len (ogrnip ) != 15 {
80+ return false , ErrInvalidOGRNIPLength
81+ }
82+ ogrnipArr , err := strToArr (ogrnip )
83+ if err != nil {
84+ return false , err
85+ }
86+ if ogrnipArr [0 ] != 3 && ogrnipArr [0 ] != 4 {
87+ return false , ErrInvalidValue
88+ }
89+ code , _ := strconv .Atoi (ogrnip [:12 ])
90+ return ogrnipArr [len (ogrnip )- 1 ] == code % 13 % 10 , nil
6491}
6592
93+ // IsSNILSValid check
94+ // example valid format is `112-233-445 95`
6695func IsSNILSValid (snils string ) (bool , error ) {
67- return false , nil
96+ if len (snils ) != 14 {
97+ return false , ErrInvalidSNILSLength
98+ }
99+ fSnils := strings .ReplaceAll (snils , "-" , "" )
100+ fSnils = strings .ReplaceAll (fSnils , " " , "" )
101+ if len (snils ) != 11 {
102+ return false , ErrInvalidFormattedSNILSLength
103+ }
104+ snilsArr , err := strToArr (fSnils )
105+ if err != nil {
106+ return false , err
107+ }
108+ hashSum := 0
109+ hashLen := len (snilsArr ) - 2
110+ code , _ := strconv .Atoi (snils [hashLen :])
111+ for i , v := range snilsArr [:hashLen ] {
112+ hashSum += v * (hashLen - i )
113+ }
114+ return hashSum % 101 == code , nil
68115}
69116
117+ // IsKPPValid
118+ // example valid format is
70119func IsKPPValid (kpp string ) (bool , error ) {
71120 if len (kpp ) == 9 {
72121 return true , nil
0 commit comments