alai-server/backend/utils/rut.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
}
}