46 lines
905 B
Go
46 lines
905 B
Go
package national
|
|
|
|
import (
|
|
"backend/pkg/errors"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func IsValid(value string) (bool, error) {
|
|
valueCount := len(value)
|
|
if valueCount < 8 {
|
|
return false, errors.ErrNationalIDInvalid
|
|
}
|
|
|
|
if valueCount >= 8 && valueCount < 10 {
|
|
value = strings.Repeat("0", 10-valueCount) + value
|
|
}
|
|
|
|
var valueSlices []uint8
|
|
for _, s := range value {
|
|
i, err := strconv.ParseInt(string(s), 10, 8)
|
|
if err != nil {
|
|
return false, errors.ErrNationalIDInvalid
|
|
}
|
|
valueSlices = append(valueSlices, uint8(i))
|
|
}
|
|
|
|
s := calculateNationalIDNumbers(&valueSlices)
|
|
|
|
s %= 11
|
|
l := valueSlices[len(value)-1]
|
|
if (s < 2 && s != int(l)) || (s >= 2 && int(l) != 11-s) {
|
|
return false, errors.ErrNationalIDInvalid
|
|
}
|
|
|
|
return true, nil
|
|
}
|
|
|
|
func calculateNationalIDNumbers(valueSlices *[]uint8) (sum int) {
|
|
var i uint8
|
|
for i = 10; i >= 2; i-- {
|
|
sum += int(i * (*valueSlices)[10-i])
|
|
}
|
|
return sum
|
|
}
|