From 1cf9245882e12c67f7487b6ba5065888ae3eb4ac Mon Sep 17 00:00:00 2001 From: Gabriel De Los Rios Date: Sun, 6 Apr 2025 02:56:37 -0300 Subject: [PATCH] feat(search): add validations --- cuit/validations.go | 88 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 cuit/validations.go diff --git a/cuit/validations.go b/cuit/validations.go new file mode 100644 index 0000000..0f0679d --- /dev/null +++ b/cuit/validations.go @@ -0,0 +1,88 @@ +package cuit + +import ( + "regexp" + "strconv" + "strings" + + "github.com/gabdlr/api-cuit-go/utils" +) + +const CUIT_REGEX = `^([\d]{2}-[\d]{8}-[\d]{1}|[\d]{11})$` + +var CUIT_TYPES = map[uint8]bool{ + 30: true, + 33: true, + 34: true, +} + +func IsValid(cuit string) (isValidCuit bool) { + if validateFormat(cuit) { + cuit = standardizeCuit(cuit) + if validateCuitType(cuit) { + isValidCuit = validateWithVerifierDigit(cuit) + } + } + return isValidCuit +} + +func standardizeCuit(cuit string) string { + if len(cuit) > 11 { + cuit = strings.ReplaceAll(cuit, "-", "") + } + return cuit +} + +func validateWithVerifierDigit(cuit string) bool { + verificationResult := false + toVerify := utils.ReverseStringWithBuffer(cuit[:10]) + + weightUpResult := 0 + weightUpFactorCounter := -1 + weightUpCheckFactor := []int{2, 3, 4, 5, 6, 7} + + verifierDigit, err := strconv.Atoi(cuit[len(cuit)-1:]) + if err != nil { + return false + } + + for i := range 10 { + if i%6 == 0 { + weightUpFactorCounter += 1 + } + weightUp, err := strconv.Atoi(string(toVerify[i])) + if err != nil { + return verificationResult + } + weightUpResult += weightUp * weightUpCheckFactor[i-6*weightUpFactorCounter] + } + mod11WeightupResult := weightUpResult % 11 + + switch mod11WeightupResult { + case 11: + verificationResult = verifierDigit == 0 + case 10: + verificationResult = verifierDigit == 9 + default: + verificationResult = verifierDigit == 11-mod11WeightupResult + } + + return verificationResult +} + +func validateCuitType(cuit string) bool { + validationResult := false + cuitType, err := strconv.Atoi(cuit[:2]) + if err == nil { + validationResult = CUIT_TYPES[uint8(cuitType)] + } + return validationResult +} + +func validateFormat(cuit string) bool { + regexExp, err := regexp.Compile(CUIT_REGEX) + if err == nil { + return regexExp.MatchString(cuit) + } + return false +}