From 3016a88292b5e339c26fe335b831664ad23a2608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marinho=20Brand=C3=A3o?= Date: Thu, 14 Jan 2010 00:07:27 -0200 Subject: [PATCH] Trabalhandon a serializacao para XML --- pynfe/entidades/notafiscal.py | 17 +++++++++++++---- pynfe/processamento/serializacao.py | 12 ++++++++---- tests/03-processamento-00-definicoes-gerais.txt | 14 +------------- tests/03-processamento-01-serializacao-xml.txt | 8 +++++--- 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/pynfe/entidades/notafiscal.py b/pynfe/entidades/notafiscal.py index 9e5558e..c1f9e24 100644 --- a/pynfe/entidades/notafiscal.py +++ b/pynfe/entidades/notafiscal.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +import random + from base import Entidade from pynfe import get_version from pynfe.utils.flags import NF_STATUS, NF_TIPOS_DOCUMENTO, NF_TIPOS_IMPRESSAO_DANFE,\ @@ -15,6 +17,12 @@ from decimal import Decimal class NotaFiscal(Entidade): status = NF_STATUS[0] + # Código numérico aleatório que compõe a chave de acesso + codigo_numerico_aleatorio = str() + + # Digito verificador do codigo numerico aleatorio + dv_codigo_numerico_aleatorio = str() + # Nota Fisca eletronica # - Modelo (formato: NN) modelo = int() @@ -335,8 +343,8 @@ class NotaFiscal(Entidade): @memoize def identificador_unico(self): # Monta 'Id' da raiz - # Ex.: NFe35080599999090910270550010000000015180051273 - return "NFe%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nNF)s%(cNF)s%(cDV)s"%{ + # Ex.: NFe35080599999090910270550010000000011518005123 + return "NFe%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nNF)s%(tpEmis)s%(cNF)s%(cDV)s"%{ 'uf': CODIGOS_ESTADOS[self.uf], 'ano': self.data_emissao.strftime('%y'), 'mes': self.data_emissao.strftime('%m'), @@ -344,8 +352,9 @@ class NotaFiscal(Entidade): 'mod': self.modelo, 'serie': str(self.serie).zfill(3), 'nNF': str(self.numero_nf).zfill(9), - 'cNF': '518005127'.zfill(9), # FIXME - 'cDV': '3', # FIXME + 'tpEmis': str(self.forma_emissao), + 'cNF': self.codigo_numerico_aleatorio.zfill(8), + 'cDV': self.dv_codigo_numerico_aleatorio, } class NotaFiscalReferenciada(Entidade): diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index e041fd1..aea0d42 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -193,12 +193,12 @@ class SerializacaoXML(Serializacao): return '' def _serializar_notas_fiscal(self, nota_fiscal, tag_raiz='infNFe', retorna_string=True): - raiz = etree.Element(tag_raiz, versao="1.10") + raiz = etree.Element(tag_raiz, versao="2.00") # Dados da Nota Fiscal ide = etree.SubElement(raiz, 'ide') etree.SubElement(ide, 'cUF').text = CODIGOS_ESTADOS[nota_fiscal.uf] - etree.SubElement(ide, 'cNF').text = '' # FIXME + etree.SubElement(ide, 'cNF').text = nota_fiscal.codigo_numerico_aleatorio etree.SubElement(ide, 'natOp').text = nota_fiscal.natureza_operacao etree.SubElement(ide, 'indPag').text = str(nota_fiscal.forma_pagamento) etree.SubElement(ide, 'mod').text = str(nota_fiscal.modelo) @@ -210,7 +210,7 @@ class SerializacaoXML(Serializacao): etree.SubElement(ide, 'cMunFG').text = nota_fiscal.municipio etree.SubElement(ide, 'tpImp').text = str(nota_fiscal.tipo_impressao_danfe) etree.SubElement(ide, 'tpEmis').text = str(nota_fiscal.forma_emissao) - etree.SubElement(ide, 'cDV').text = '3' # FIXME + etree.SubElement(ide, 'cDV').text = nota_fiscal.dv_codigo_numerico_aleatorio etree.SubElement(ide, 'tpAmb').text = str(self._ambiente) etree.SubElement(ide, 'finNFe').text = str(nota_fiscal.finalidade_emissao) etree.SubElement(ide, 'procEmi').text = str(nota_fiscal.processo_emissao) @@ -223,8 +223,12 @@ class SerializacaoXML(Serializacao): # Destinatário raiz.append(self._serializar_cliente(nota_fiscal.cliente, retorna_string=False)) + # Transporte + transp = etree.SubElement(raiz, 'transp') + transp.append(self._serializar_transportadora(nota_fiscal.transporte_transportadora, retorna_string=False)) + # 'Id' da tag raiz - # Ex.: NFe35080599999090910270550010000000015180051273 + # Ex.: NFe35080599999090910270550010000000011518005123 raiz.attrib['Id'] = nota_fiscal.identificador_unico if retorna_string: diff --git a/tests/03-processamento-00-definicoes-gerais.txt b/tests/03-processamento-00-definicoes-gerais.txt index a71eb2d..5893456 100644 --- a/tests/03-processamento-00-definicoes-gerais.txt +++ b/tests/03-processamento-00-definicoes-gerais.txt @@ -1,23 +1,11 @@ PROCESSAMENTO ============= - -Gerar arquivos XML ------------------- - -- Gera os arquivos XML a partir dos dados das instancias da NF-e -- Quando gerados me lote, apenas o primeiro arquivo deve ter o cabecalho - padrao do XML 1.0 - - -- Namespace - - - - A declaração do namespace da assinatura digital deverá ser realizada na - própria tag , conforme exemplo abaixo. - - Cada documento XML deverá ter o seu namespace individual em seu elemento raiz. Validar NF-e ------------ - Efetuar validacoes dos XSD no(s) XML(s) gerado(s) +- Validar nota_fiscal.dv_codigo_numerico_aleatorio (ver pagina 85 do manual de integracao) Assinar NF-e ------------ diff --git a/tests/03-processamento-01-serializacao-xml.txt b/tests/03-processamento-01-serializacao-xml.txt index 814b73c..515e3af 100644 --- a/tests/03-processamento-01-serializacao-xml.txt +++ b/tests/03-processamento-01-serializacao-xml.txt @@ -74,6 +74,8 @@ Instancia a NF ... forma_emissao=1, # Normal ... finalidade_emissao=1, ... municipio='3550308', + ... codigo_numerico_aleatorio='51800512', + ... dv_codigo_numerico_aleatorio='3', ... ) >>> _fonte_dados.contar_objetos() @@ -149,13 +151,13 @@ Serializando por partes - Gera os arquivos XML a partir dos dados das instancias da NF-e >>> print nota_fiscal.identificador_unico - NFe52100112345678000190550010000000015180051273 + NFe52100112345678000190550010000000011518005123 >>> print serializador._serializar_notas_fiscal(nota_fiscal) - + 52 - 518005127 + 51800512 Venda a vista 0 55