From 1ad92b7927ff3e9b49dbb8819764322024931a22 Mon Sep 17 00:00:00 2001 From: Junior Tada Date: Mon, 10 Aug 2015 00:00:08 -0300 Subject: [PATCH] Implementado envio em contingencia --- pynfe/processamento/comunicacao.py | 2 +- pynfe/processamento/serializacao.py | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/pynfe/processamento/comunicacao.py b/pynfe/processamento/comunicacao.py index 5e2e878..025982c 100644 --- a/pynfe/processamento/comunicacao.py +++ b/pynfe/processamento/comunicacao.py @@ -61,7 +61,7 @@ class ComunicacaoSefaz(Comunicacao): if status == '100': raiz = etree.Element('nfeProc', xmlns=NAMESPACE_NFE, versao=VERSAO_PADRAO) raiz.append(nota_fiscal) - raiz.append(prot) + raiz.append(infProt) return 0, raiz else: # Retorna id do protocolo para posterior consulta em caso de sucesso. diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 7f6f9f4..67870b6 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -16,7 +16,8 @@ class Serializacao(object): Nao deve ser instanciada diretamente!""" _fonte_dados = None - _ambiente = 1 # 1 = Produção, 2 = Homologação + _ambiente = 1 # 1 = Produção, 2 = Homologação + _contingencia = None # Justificativa da entrada em contingência (min 20, max 256 caracteres) _nome_aplicacao = 'PyNFe' def __new__(cls, *args, **kwargs): @@ -25,9 +26,10 @@ class Serializacao(object): else: return super(Serializacao, cls).__new__(cls) - def __init__(self, fonte_dados, homologacao=False): + def __init__(self, fonte_dados, homologacao=False, contingencia=None): self._fonte_dados = fonte_dados self._ambiente = homologacao and 2 or 1 + self._contingencia = contingencia def exportar(self, destino, **kwargs): """Gera o(s) arquivo(s) de exportacao a partir da Nofa Fiscal eletronica @@ -359,6 +361,20 @@ class SerializacaoXML(Serializacao): etree.SubElement(ide, 'idDest').text = str(nota_fiscal.indicador_destino) etree.SubElement(ide, 'cMunFG').text = nota_fiscal.municipio etree.SubElement(ide, 'tpImp').text = str(nota_fiscal.tipo_impressao_danfe) + """ ### CONTINGENCIA ### + 1=Emissão normal (não em contingência); + 2=Contingência FS-IA, com impressão do DANFE em formulário de segurança; + 3=Contingência SCAN (Sistema de Contingência do Ambiente Nacional); + 4=Contingência DPEC (Declaração Prévia da Emissão em Contingência); + 5=Contingência FS-DA, com impressão do DANFE em formulário de segurança; + 6=Contingência SVC-AN (SEFAZ Virtual de Contingência do AN); + 7=Contingência SVC-RS (SEFAZ Virtual de Contingência do RS); + 9=Contingência off-line da NFC-e (as demais opções de contingência são válidas também para a NFC-e). + Para a NFC-e somente estão disponíveis e são válidas as opções de contingência 5 e 9. + """ + if self._contingencia != None: + if nota_fiscal.forma_emissao == '1': + nota_fiscal.forma_emissao = '9' etree.SubElement(ide, 'tpEmis').text = str(nota_fiscal.forma_emissao) etree.SubElement(ide, 'cDV').text = nota_fiscal.dv_codigo_numerico_aleatorio etree.SubElement(ide, 'tpAmb').text = str(self._ambiente) @@ -372,8 +388,9 @@ class SerializacaoXML(Serializacao): etree.SubElement(ide, 'procEmi').text = str(nota_fiscal.processo_emissao) etree.SubElement(ide, 'verProc').text = '%s %s'%(self._nome_aplicacao, nota_fiscal.versao_processo_emissao) ### CONTINGENCIA ### - #etree.SubElement(ide, 'dhCont').text = '' # Data e Hora da entrada em contingência AAAA-MM-DDThh:mm:ssTZD - #etree.SubElement(ide, 'xJust').text = '' # Justificativa da entrada em contingência (min 20, max 256 caracteres) + if self._contingencia != None: + etree.SubElement(ide, 'dhCont').text = nota_fiscal.data_emissao.strftime('%Y-%m-%dT%H:%M:%S') + tz # Data e Hora da entrada em contingência AAAA-MM-DDThh:mm:ssTZD + etree.SubElement(ide, 'xJust').text = nota_fiscal.self._contingencia # Justificativa da entrada em contingência (min 20, max 256 caracteres) # Emitente raiz.append(self._serializar_emitente(nota_fiscal.emitente, retorna_string=False))