associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Revisão 3e 2004-10-05 03:23:28

Excluir mensagem

VerificadorDeCnpj

Receita: Verificador de CPF

Quase tudo é cópia do script de verificação de CPF do Pedro Werneck, mas voltado para Cnpj (usei um algoritmo que achei na internet, o algoritmo referia-se a CGC/CNPJ, se algo estiver errado, ou se tudo estiver errado podem falar :). Esse módulo contém algumas funções e classes úteis para aplicações que envolvam cadastros e necessitem validar números de CNPJ antes de incluir no banco de dados..

Código

   1 #/usr/bin/env python
   2 # -*- coding:UTF-8 -*-
   3 
   4 
   5 """
   6 
   7 Este módulo fornece uma classe wrapper para ser usada com números de
   8 CNPJ(CGC), que além de oferecer um método simples de verificação, também
   9 conta com métodos para comparação e conversão.
  10 
  11 
  12 >>> a = CNPJ('12345678000199')
  13 >>> b = CNPJ('12.345.678/0001-99')
  14 >>> c = CNPJ([1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 1, 9, 8])
  15 >>> assert a.valido()
  16 >>> assert b.valido()
  17 >>> assert not c.valido()
  18 >>> assert a == b
  19 >>> assert not b == c
  20 >>> assert not a == c
  21 >>> assert eval(repr(a)) == a
  22 >>> assert eval(repr(b)) == b
  23 >>> assert eval(repr(c)) == c
  24 >>> assert str(a) == \"12.345.678/0001-99\"
  25 >>> assert str(b) == str(a)
  26 >>> assert str(c) == \"12.345.678/0001-98\"
  27 
  28 """
  29 
  30 
  31 
  32 
  33 class CNPJ(object):
  34 
  35     def __init__(self, cnpj):
  36         """Classe representando um número de CNPJ
  37 
  38         >>> a = CNPJ('12345678000199')
  39         >>> b = CNPJ('12.345.678/0001-99')
  40         >>> c = CNPJ([1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 1, 9, 8])
  41 
  42         """
  43         if isinstance(cnpj, basestring):
  44             if not cnpj.isdigit():
  45                 cnpj = cnpj.replace(".", "")
  46                 cnpj = cnpj.replace("-", "")
  47                 cnpj = cnpj.replace("/", "")
  48 
  49             if not cnpj.isdigit:
  50                 raise ValueError("Valor não segue a forma xx.xxx.xxx/xxxx-xx")
  51 
  52         if len(cnpj) < 14:
  53             raise ValueError("O número de CNPJ deve ter 14 digítos")
  54 
  55         self.cnpj = map(int, cnpj)
  56 
  57 
  58     def __getitem__(self, index):
  59         """Retorna o dígito em index como string
  60 
  61         >>> a = CNPJ('12345678000199')
  62         >>> a[9] == '0'
  63         True
  64         >>> a[10] == '0'
  65         True
  66         >>> a[9] == 0
  67         False
  68         >>> a[10] == 0
  69         False
  70 
  71         """
  72         return str(self.cnpj[index])
  73 
  74     def __repr__(self):
  75         """Retorna uma representação 'real', ou seja:
  76 
  77         eval(repr(cnpj)) == cnpj
  78 
  79         >>> a = CNPJ('12345678000199')
  80         >>> print repr(a)
  81         CNPJ('12345678000199')
  82         >>> eval(repr(a)) == a
  83         True
  84 
  85         """
  86         return "CNPJ('%s')" % ''.join([str(x) for x in self.cnpj])
  87 
  88     def __eq__(self, other):
  89         """Provê teste de igualdade para números de CNPJ
  90 
  91         >>> a = CNPJ('12345678000199')
  92         >>> b = CNPJ('12.345.678/0001-99')
  93         >>> c = CNPJ('12345678000198')
  94         >>> a == b
  95         True
  96         >>> a != c
  97         True
  98         >>> b != c
  99         True
 100 
 101         """
 102         if isinstance(other, CNPJ):
 103             return self.cnpj == other.cnpj
 104         return False
 105 
 106     def __str__(self):
 107         """Retorna uma string do CNPJ na forma com pontos e traço
 108 
 109         >>> a = CNPJ('12345678000199')
 110         >>> str(a)
 111         '12.345.678/0001-99'
 112 
 113         """
 114         d = ((2, "."), (6, "."), (10, "/"), (15, "-"))
 115         s = map(str, self.cnpj)
 116         for i, v in d:
 117             s.insert(i, v)
 118         r = ''.join(s)
 119         return r
 120 
 121     def valido(self):
 122         """Valida o número de cnpj
 123 
 124         >>> a = CNPJ('12.345.678/0001-99')
 125         >>> a.valido()
 126         True
 127         >>> b = CNPJ('12345678000198')
 128         >>> b.valido()
 129         False
 130 
 131         """
 132         cnpj = self.cnpj[:12]
 133         # pegamos apenas os 9 primeiros dígitos do cpf e geramos os
 134         # dois dígitos que faltam
 135         while len(cnpj) < 14:
 136 
 137             prod = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
 138             r = sum([x*y for (x, y) in zip(cnpj, prod)])%11
 139 
 140             if r > 1:
 141                 f = 11 - r
 142             else:
 143                 f = 0
 144             cnpj.append(f)
 145             prod.append(f*2)
 146 
 147         # se o número com os digítos faltantes coincidir com o número
 148         # original, então ele é válido
 149         return bool(cnpj == self.cnpj)
 150 
 151 
 152 
 153 if __name__ == "__main__":
 154 
 155     import doctest, sys
 156     doctest.testmod(sys.modules[__name__])

Volta para CookBook.


MichelThadeuSabchuk