12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- package utils
- import(
- "fmt"
- "regexp"
- "strconv"
- )
- func cnpjDigitoVerificado(cnpj []int, b int) (dv int) {
- i, j, soma, limit := 0, 4 + b, 0, 11 + b
- for ; i < limit; i++ {
- soma += cnpj[i] * j;
- if j == 2 { j = 9 } else { j -= 1 }
- }
- resto := soma % 11
- if resto < 2 { dv = 0 } else { dv = 11 - resto }
- return
- }
- func somenteNumeros(c string, vsize int) ([]int, error) {
- tmp := regexp.MustCompile("[^0-9]").ReplaceAll([]byte(c), []byte("") )
- size := len(tmp)
- cnpji := make([]int, size)
- // Valida tamanho
- if len(cnpji) != vsize {
- return cnpji, fmt.Errorf("Tamanho deve conter %d digitos sem caracteres especiais", vsize);
- }
- for i, val := range tmp {
- cnpji[i], _ = strconv.Atoi(string(val))
- }
- return cnpji, nil
- }
- func ValidarCnpj(cnpj string) error {
- cnpji, err := somenteNumeros(cnpj, 14)
- if err != nil {
- return err
- }
- // Valida primeiro dígito verificador
- if cnpji[12] == cnpjDigitoVerificado(cnpji, 1) {
- // Valida segundo dígito verificador
- if cnpji[13] == cnpjDigitoVerificado(cnpji, 2) {
- return nil
- }
- }
- return fmt.Errorf("CNPJ inválido");
- }
- func cpfDigitoVerificado(cpf []int, b int) (dv int) {
- soma, ini := 0, 9 + b
- for i := ini; i > 1; i -- {
- soma += i * cpf[ini - i]
- }
- resto := soma * 10%11
- if resto == 10 { dv = 0 } else { dv = resto }
- return
- }
- func ValidarCpf(cpf string) error {
- cpfi, err := somenteNumeros(cpf, 11)
- if err != nil {
- return err
- }
- // Valida primeiro dígito verificador
- if cpfi[9] == cpfDigitoVerificado(cpfi, 1) {
- // Valida segundo dígito verificador
- if cpfi[10] == cpfDigitoVerificado(cpfi, 2) {
- return nil
- }
- }
- return fmt.Errorf("CPF inválido");
- }
|