-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
124 lines (104 loc) · 2.39 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package main
import (
"strconv"
"strings"
)
func ParseAccountNumber(c string) string {
var accountNumber string
numbers := DivideChain(c)
for _, number := range numbers {
accountNumber += OCRToString(number)
}
return accountNumber
}
func DivideChain(c string) []string {
lines := strings.Split(c, "\n")
var digits []string
for i, line := range lines {
splitedLines := splitIntoArrays(line)
for range splitedLines {
if i == 0 {
digits = append(digits, "")
}
}
for j, splited := range splitedLines {
if i < 3 {
digits[j] = digits[j] + splited
}
}
}
return digits
}
func splitIntoArrays(line string) []string {
var result []string
for i := 0; i < len(line); i += 3 {
end := i + 3
if end > len(line) {
end = len(line)
}
result = append(result, line[i:end])
}
return result
}
func OCRToString(OCRNumber string) string {
number := numbers[OCRNumber]
if number == "" {
return "?"
}
return number
}
var numbers = map[string]string{
" _ | ||_|": "0",
" | |": "1",
" _ _||_ ": "2",
" _ _| _|": "3",
" |_| |": "4",
" _ |_ _|": "5",
" _ |_ |_|": "6",
" _ | |": "7",
" _ |_||_|": "8",
" _ |_| _|": "9",
}
func isValidAccount(an string) bool {
numbers := strings.Split(an, "")
return hasCorrectLenght(len(numbers)) && isValidChecksum(numbers)
}
func hasCorrectLenght(accountNumberLength int) bool {
return accountNumberLength == 9
}
func isValidChecksum(numbers []string) bool {
var total int
accountNumberLength := len(numbers)
for _, number := range numbers {
cn, _ := strconv.Atoi(number)
total = total + accountNumberLength*cn
accountNumberLength = accountNumberLength - 1
}
return total%11 == 0
}
func GetAccountsWithStatus(list []string) [][2]string {
var accountsList [][2]string
for _, account := range list {
status := setAccountStatus(account)
accountsList = append(accountsList, [2]string{0: account, 1: status})
}
return accountsList
}
func setAccountStatus(account string) string {
status := ""
if !isValidAccount(account) {
status = "ERR"
}
if strings.Contains(account, "?") {
status = "ILL"
}
return status
}
func ParseScannedFileToAccountsList(scannedAccounts []string) [][2]string {
var accountsList []string
for _, OCRAccount := range scannedAccounts {
accountNumber := ParseAccountNumber(OCRAccount)
accountsList = append(accountsList, accountNumber)
}
return GetAccountsWithStatus(accountsList)
}