cnpj.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package utils
  2. import(
  3. "fmt"
  4. "regexp"
  5. "strconv"
  6. )
  7. func cnpjDigitoVerificado(cnpj []int, b int) (dv int) {
  8. i, j, soma, limit := 0, 4 + b, 0, 11 + b
  9. for ; i < limit; i++ {
  10. soma += cnpj[i] * j;
  11. if j == 2 { j = 9 } else { j -= 1 }
  12. }
  13. resto := soma % 11
  14. if resto < 2 { dv = 0 } else { dv = 11 - resto }
  15. return
  16. }
  17. func somenteNumeros(c string, vsize int) ([]int, error) {
  18. tmp := regexp.MustCompile("[^0-9]").ReplaceAll([]byte(c), []byte("") )
  19. size := len(tmp)
  20. cnpji := make([]int, size)
  21. // Valida tamanho
  22. if len(cnpji) != vsize {
  23. return cnpji, fmt.Errorf("Tamanho deve conter %d digitos sem caracteres especiais", vsize);
  24. }
  25. for i, val := range tmp {
  26. cnpji[i], _ = strconv.Atoi(string(val))
  27. }
  28. return cnpji, nil
  29. }
  30. func ValidarCnpj(cnpj string) error {
  31. cnpji, err := somenteNumeros(cnpj, 14)
  32. if err != nil {
  33. return err
  34. }
  35. // Valida primeiro dígito verificador
  36. if cnpji[12] == cnpjDigitoVerificado(cnpji, 1) {
  37. // Valida segundo dígito verificador
  38. if cnpji[13] == cnpjDigitoVerificado(cnpji, 2) {
  39. return nil
  40. }
  41. }
  42. return fmt.Errorf("CNPJ inválido");
  43. }
  44. func cpfDigitoVerificado(cpf []int, b int) (dv int) {
  45. soma, ini := 0, 9 + b
  46. for i := ini; i > 1; i -- {
  47. soma += i * cpf[ini - i]
  48. }
  49. resto := soma * 10%11
  50. if resto == 10 { dv = 0 } else { dv = resto }
  51. return
  52. }
  53. func ValidarCpf(cpf string) error {
  54. cpfi, err := somenteNumeros(cpf, 11)
  55. if err != nil {
  56. return err
  57. }
  58. // Valida primeiro dígito verificador
  59. if cpfi[9] == cpfDigitoVerificado(cpfi, 1) {
  60. // Valida segundo dígito verificador
  61. if cpfi[10] == cpfDigitoVerificado(cpfi, 2) {
  62. return nil
  63. }
  64. }
  65. return fmt.Errorf("CPF inválido");
  66. }