116 lines
2.1 KiB
Go
116 lines
2.1 KiB
Go
|
package utils
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
type RutType int8
|
||
|
|
||
|
const (
|
||
|
Run RutType = iota
|
||
|
Rut
|
||
|
)
|
||
|
|
||
|
func (r RutType) String() string {
|
||
|
switch r {
|
||
|
case Run:
|
||
|
return "RUN"
|
||
|
case Rut:
|
||
|
return "RUT"
|
||
|
default:
|
||
|
return "unknown"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func CleanRut(rut *string) {
|
||
|
*rut = strings.ToUpper(*rut)
|
||
|
*rut = strings.TrimSpace(*rut)
|
||
|
*rut = strings.Replace(*rut, ".", "", -1)
|
||
|
*rut = strings.Replace(*rut, "-", "", -1)
|
||
|
}
|
||
|
|
||
|
func PrettyRut(rut *string) {
|
||
|
tempRut := *rut
|
||
|
verifier := strings.ToUpper(tempRut[len(tempRut)-1:])
|
||
|
tempRut = tempRut[:len(tempRut)-1]
|
||
|
tempRut = Reverse(tempRut)
|
||
|
tempRut = InsertNth(tempRut, 3, '.')
|
||
|
tempRut = Reverse(tempRut)
|
||
|
tempRut = tempRut + "-" + verifier
|
||
|
*rut = tempRut
|
||
|
}
|
||
|
|
||
|
func IsValidRut(rut string) (bool, error) {
|
||
|
// rut should be 8 or 9 characters
|
||
|
if len(rut) != 8 && len(rut) != 9 {
|
||
|
return false, errors.New("incorrect RUT length")
|
||
|
}
|
||
|
|
||
|
verifier := strings.ToUpper(rut[len(rut)-1:])
|
||
|
tempRut := rut[:len(rut)-1]
|
||
|
|
||
|
_, err := strconv.Atoi(verifier)
|
||
|
if err != nil && verifier != "K" {
|
||
|
return false, errors.New("invalid RUT identifier")
|
||
|
}
|
||
|
|
||
|
generatedVerifier, err := generateVerifier(tempRut)
|
||
|
if err != nil {
|
||
|
return false, err
|
||
|
}
|
||
|
if verifier != generatedVerifier {
|
||
|
return false, errors.New("incorrect RUT verifier")
|
||
|
}
|
||
|
return true, nil
|
||
|
}
|
||
|
|
||
|
func GetRutType(rut string) (RutType, error) {
|
||
|
tempRut := rut[:len(rut)-1]
|
||
|
numericRut, err := strconv.Atoi(tempRut)
|
||
|
if err != nil {
|
||
|
return Run, errors.New("invalid RUN/RUT")
|
||
|
}
|
||
|
|
||
|
if numericRut < 100000000 && numericRut > 50000000 {
|
||
|
return Rut, nil
|
||
|
} else {
|
||
|
return Run, nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func generateVerifier(rut string) (string, error) {
|
||
|
if _, err := strconv.Atoi(rut); err != nil {
|
||
|
return "", errors.New("invalid RUT")
|
||
|
}
|
||
|
|
||
|
var multiplier = 2
|
||
|
var sum = 0
|
||
|
var remainder int
|
||
|
var division int
|
||
|
var rutLength = len(rut)
|
||
|
|
||
|
for i := rutLength - 1; i >= 0; i-- {
|
||
|
sum = sum + toInt(rut[i:i+1])*multiplier
|
||
|
multiplier++
|
||
|
if multiplier == 8 {
|
||
|
multiplier = 2
|
||
|
}
|
||
|
}
|
||
|
|
||
|
division = sum / 11
|
||
|
division = division * 11.0
|
||
|
remainder = sum - int(division)
|
||
|
|
||
|
if remainder != 0 {
|
||
|
remainder = 11 - remainder
|
||
|
}
|
||
|
|
||
|
if remainder == 10 {
|
||
|
return "K", nil
|
||
|
} else {
|
||
|
return strconv.Itoa(remainder), nil
|
||
|
}
|
||
|
}
|