diff --git a/pytrustnfe/ChaveNFe.py b/pytrustnfe/ChaveNFe.py index 2bdac6c..0ef4bd5 100644 --- a/pytrustnfe/ChaveNFe.py +++ b/pytrustnfe/ChaveNFe.py @@ -8,15 +8,15 @@ Created on 23/06/2015 class ChaveNFe(object): - def __init__(self, valores): - self.cnpj = '' - self.estado = '' - self.emissao = '' - self.modelo = '' - self.serie = '' - self.numero = '' - self.tipo = '' - self.codigo = '' + def __init__(self, **kwargs): + self.cnpj = kwargs.pop('cnpj', '') + self.estado = kwargs.pop('estado', '') + self.emissao = kwargs.pop('emissao', '') + self.modelo = kwargs.pop('modelo', '') + self.serie = kwargs.pop('serie', '') + self.numero = kwargs.pop('numero', '') + self.tipo = kwargs.pop('tipo', '') + self.codigo = kwargs.pop('codigo', '') def validar(self): assert self.cnpj != '', 'CNPJ necessário para criar chave NF-e' diff --git a/pytrustnfe/test/test_utils.py b/pytrustnfe/test/test_utils.py index d8dc4cd..36488ae 100644 --- a/pytrustnfe/test/test_utils.py +++ b/pytrustnfe/test/test_utils.py @@ -7,10 +7,18 @@ Created on Jun 16, 2015 import mock import unittest import datetime -from pytrustnfe.utils import date_tostring, datetime_tostring +from pytrustnfe.utils import date_tostring, datetime_tostring, \ + gerar_chave, gerar_consulta_recibo +from pytrustnfe.ChaveNFe import ChaveNFe +from pytrustnfe.xml.DynamicXml import DynamicXml class test_utils(unittest.TestCase): + kwargs = { + 'cnpj': '33009911002506', 'estado': '52', 'emissao': '0604', + 'modelo': '55', 'serie': '012', 'numero': '000000780', + 'tipo': '0', 'codigo': '26730161' + } def test_date_tostring(self): hoje = datetime.date.today() @@ -25,3 +33,94 @@ class test_utils(unittest.TestCase): self.assertEqual(data, hoje.strftime("%d-%m-%y %H:%M:%S"), "Não convertido corretamente") self.assertRaises(Exception, datetime_tostring, "Not a date") + + def test_geracao_chave(self): + chave = ChaveNFe(**self.kwargs) + str_chave = gerar_chave(chave) + chave_correta = '52060433009911002506550120000007800267301615' + self.assertEqual(str_chave, chave_correta, + "Geração de chave nf-e incorreta") + + str_chave = gerar_chave(chave, prefix='NFe') + chave_correta = 'NFe52060433009911002506550120000007800267301615' + self.assertEqual(str_chave, chave_correta, + "Geração de chave nf-e com prefixo incorreta") + + self.assertRaises(Exception, gerar_chave, "Not a ChaveNFe object") + self.assertRaises(Exception, gerar_chave, "Not a ChaveNFe object") + + def test_geracao_recibo(self): + recibo = DynamicXml('EnviNFe') + recibo.tpAmb = '1' + recibo.infRec.nRec = '0001' + consulta = gerar_consulta_recibo(recibo) + self.assertEqual(str(consulta.nRec), '0001', 'Número do recibo inválido') + self.assertEqual(str(consulta.tpAmb), '1', 'Tipo de ambiente inválido') + + self.assertIsInstance(consulta, DynamicXml, + 'Consulta recibo deve ser do tipo DynamicXml') + + def test_chave_nfe(self): + chave = ChaveNFe(**self.kwargs) + with self.assertRaises(AssertionError) as cm: + chave.cnpj = '' + chave.validar() + chave.cnpj = '1234567891011' + self.assertEqual('CNPJ necessário para criar chave NF-e', + cm.exception.message, + 'Validação da chave nf-e incorreta') + + with self.assertRaises(AssertionError) as cm: + chave.estado = '' + chave.validar() + chave.estado = '42' + self.assertEqual('Estado necessário para criar chave NF-e', + cm.exception.message, + 'Validação da chave nf-e incorreta') + + with self.assertRaises(AssertionError) as cm: + chave.emissao = '' + chave.validar() + chave.emissao = '0' + self.assertEqual('Emissão necessário para criar chave NF-e', + cm.exception.message, + 'Validação da chave nf-e incorreta') + + with self.assertRaises(AssertionError) as cm: + chave.modelo = '' + chave.validar() + chave.modelo = '55' + self.assertEqual('Modelo necessário para criar chave NF-e', + cm.exception.message, + 'Validação da chave nf-e incorreta') + + with self.assertRaises(AssertionError) as cm: + chave.serie = '' + chave.validar() + chave.serie = '012' + self.assertEqual('Série necessária para criar chave NF-e', + cm.exception.message, + 'Validação da chave nf-e incorreta') + + with self.assertRaises(AssertionError) as cm: + chave.numero = '' + chave.validar() + chave.numero = '000000780' + self.assertEqual('Número necessário para criar chave NF-e', + cm.exception.message, + 'Validação da chave nf-e incorreta') + + with self.assertRaises(AssertionError) as cm: + chave.tipo = '' + chave.validar() + chave.tipo = '42' + self.assertEqual('Tipo necessário para criar chave NF-e', + cm.exception.message, + 'Validação da chave nf-e incorreta') + + with self.assertRaises(AssertionError) as cm: + chave.codigo = '' + chave.validar() + self.assertEqual('Código necessário para criar chave NF-e', + cm.exception.message, + 'Validação da chave nf-e incorreta') diff --git a/pytrustnfe/utils.py b/pytrustnfe/utils.py index ffe9aea..b142c2f 100644 --- a/pytrustnfe/utils.py +++ b/pytrustnfe/utils.py @@ -6,6 +6,7 @@ Created on 22/06/2015 ''' from datetime import date, datetime from pytrustnfe.ChaveNFe import ChaveNFe +from pytrustnfe.xml.DynamicXml import DynamicXml def date_tostring(data): @@ -18,7 +19,7 @@ def datetime_tostring(data): return data.strftime("%d-%m-%y %H:%M:%S") -def gerar_consulta_recibo(recibo): +def gerar_consulta_recibo(recibo): c = DynamicXml('consReciNFe') c(xmlns="http://www.portalfiscal.inf.br/nfe", versao="2.00") c.tpAmb = recibo.tpAmb @@ -26,14 +27,26 @@ def gerar_consulta_recibo(recibo): return c -def gerar_chave(obj_chave): +def gerar_chave(obj_chave, prefix=None): assert isinstance(obj_chave, ChaveNFe), "Objeto deve ser do tipo ChaveNFe" obj_chave.validar() - return "%s%s%s%s%s%s%s%s" % (obj_chave.estado, obj_chave.emissao, - obj_chave.cnpj, obj_chave.modelo, - obj_chave.serie, obj_chave.numero, - obj_chave.tipo, obj_chave.codigo) - + chave_parcial = "%s%s%s%s%s%s%s%s" % (obj_chave.estado, obj_chave.emissao, + obj_chave.cnpj, obj_chave.modelo, + obj_chave.serie, obj_chave.numero, + obj_chave.tipo, obj_chave.codigo) + soma = 0 + contador = 2 + for c in reversed(chave_parcial): + soma += int(c) * contador + contador += 1 + if contador == 10: + contador = 2 + dv = (11 - soma % 11) if (soma % 11 != 0 and soma % 11 != 1) else 0 + if prefix: + return prefix + chave_parcial + str(dv) + return chave_parcial + str(dv) + + def descompacta_nfe_distribuicao(xml): pass