|
1 | 1 | package inn |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "strconv" |
5 | | - "strings" |
| 4 | + "fmt" |
6 | 5 |
|
7 | | - "github.com/sshaplygin/docs-code/models" |
8 | 6 | "github.com/sshaplygin/docs-code/utils" |
9 | 7 | ) |
10 | 8 |
|
11 | 9 | // Validate check to valid inn from input string. |
12 | 10 | // example: input format is 7707083893 |
13 | 11 | func Validate(inn string) (bool, error) { |
14 | | - if !IsCompany(inn) && !IsEntrepreneur(inn) { |
15 | | - return false, &models.CommonError{ |
16 | | - Method: packageName, |
17 | | - Err: models.ErrInvalidLength, |
18 | | - } |
19 | | - } |
20 | | - |
21 | | - innArr, err := transformInn(inn) |
| 12 | + innData, err := ParseINN(inn) |
22 | 13 | if err != nil { |
23 | | - return false, err |
24 | | - } |
25 | | - if len(inn) == 10 { |
26 | | - return hash10(innArr) == innArr[len(innArr)-1], nil |
| 14 | + return false, fmt.Errorf("parse %s model: %w", packageName, err) |
27 | 15 | } |
28 | 16 |
|
29 | | - return hash11(innArr) == innArr[len(innArr)-2] && hash12(innArr) == innArr[len(innArr)-1], nil |
| 17 | + return innData.IsValid() |
30 | 18 | } |
31 | 19 |
|
32 | | -// Generate generate random type inn string value. |
| 20 | +// Generate generate random type inn string value |
33 | 21 | func Generate() string { |
34 | | - if utils.RandomDigits(1)%2 == 1 { |
35 | | - return GeneratePhysical() |
36 | | - } |
37 | | - |
38 | | - return GenerateLegal() |
| 22 | + return NewINN(INNType(utils.RandomDigits(1) % 3)).String() |
39 | 23 | } |
40 | 24 |
|
41 | | -// IsEntrepreneur check inn for Entrepreneur type |
42 | | -func IsEntrepreneur(inn string) bool { |
43 | | - return len(inn) == lengthPhysical |
44 | | -} |
45 | | - |
46 | | -// IsCompany check inn for Company type |
47 | | -func IsCompany(inn string) bool { |
48 | | - return len(inn) == lengthLegal |
49 | | -} |
50 | | - |
51 | | -// GenerateLegal generate legal type inn string value. |
| 25 | +// GenerateLegal generate legal type inn string value |
52 | 26 | func GenerateLegal() string { |
53 | | - inn := strconv.FormatInt(utils.RandomDigits(9), 10) |
54 | | - innArr, _ := transformInn(inn) |
| 27 | + // inn := strconv.FormatInt(utils.RandomDigits(9), 10) |
| 28 | + // innArr, _ := transformInn(inn) |
55 | 29 |
|
56 | | - return inn + strconv.Itoa(hash10(innArr)) |
| 30 | + // return strings.Join([]string{inn, strconv.Itoa(hash10(innArr))}, "") |
| 31 | + return NewINN(INNType(utils.RandomDigits(1)%2 + 1)).String() |
57 | 32 | } |
58 | 33 |
|
59 | | -// GeneratePhysical generate physical type inn string value. |
| 34 | +// GeneratePhysical generate physical type inn string value |
60 | 35 | func GeneratePhysical() string { |
61 | | - inn := strconv.FormatInt(utils.RandomDigits(10), 10) |
62 | | - innArr, _ := transformInn(inn) |
63 | | - |
64 | | - hash1Num := hash11(innArr) |
65 | | - innArr = append(innArr, hash1Num) |
| 36 | + // inn := strconv.FormatInt(utils.RandomDigits(10), 10) |
| 37 | + // innArr, _ := transformInn(inn) |
66 | 38 |
|
67 | | - return strings.Join([]string{ |
68 | | - inn, |
69 | | - strconv.Itoa(hash1Num), |
70 | | - strconv.Itoa(hash12(innArr)), |
71 | | - }, "") |
72 | | -} |
73 | | - |
74 | | -func transformInn(inn string) ([]int, error) { |
75 | | - innNumbers := strings.Split(inn, "") |
76 | | - innArr := make([]int, 0, len(inn)) |
77 | | - |
78 | | - for _, str := range innNumbers { |
79 | | - number, err := strconv.Atoi(str) |
80 | | - if err != nil { |
81 | | - return nil, models.ErrInvalidValue |
82 | | - } |
83 | | - innArr = append(innArr, number) |
84 | | - } |
85 | | - |
86 | | - return innArr, nil |
87 | | -} |
88 | | - |
89 | | -func hash10(innArr []int) int { |
90 | | - return ((2*innArr[0] + 4*innArr[1] + 10*innArr[2] + 3*innArr[3] + |
91 | | - 5*innArr[4] + 9*innArr[5] + 4*innArr[6] + 6*innArr[7] + 8*innArr[8]) % 11) % 10 |
92 | | -} |
93 | | - |
94 | | -func hash11(innArr []int) int { |
95 | | - return ((7*innArr[0] + 2*innArr[1] + 4*innArr[2] + 10*innArr[3] + 3*innArr[4] + |
96 | | - 5*innArr[5] + 9*innArr[6] + 4*innArr[7] + 6*innArr[8] + 8*innArr[9]) % 11) % 10 |
97 | | -} |
| 39 | + // hash1Num := hash11(innArr) |
| 40 | + // innArr = append(innArr, hash1Num) |
98 | 41 |
|
99 | | -func hash12(innArr []int) int { |
100 | | - return ((3*innArr[0] + 7*innArr[1] + 2*innArr[2] + 4*innArr[3] + |
101 | | - 10*innArr[4] + 3*innArr[5] + 5*innArr[6] + 9*innArr[7] + 4*innArr[8] + |
102 | | - 6*innArr[9] + 8*innArr[10]) % 11) % 10 |
| 42 | + // return strings.Join([]string{inn, strconv.Itoa(hash1Num), strconv.Itoa(hash12(innArr))}, "") |
| 43 | + return NewINN(INNType(Physical)).String() |
103 | 44 | } |
0 commit comments