From da7af52105462d5665b75e7f2264bf432159fe4c Mon Sep 17 00:00:00 2001 From: Leonardo Tada Date: Tue, 26 Jan 2016 19:48:12 -0200 Subject: [PATCH 1/6] =?UTF-8?q?Melhoria=20na=20exce=C3=A7=C3=A3o=20de=20er?= =?UTF-8?q?ros=20em=20NFe=20e=20timeout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pynfe/processamento/comunicacao.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pynfe/processamento/comunicacao.py b/pynfe/processamento/comunicacao.py index eb60913..91e4566 100644 --- a/pynfe/processamento/comunicacao.py +++ b/pynfe/processamento/comunicacao.py @@ -344,10 +344,10 @@ class ComunicacaoSefaz(Comunicacao): def _construir_xml_status_pr(self, cabecalho, metodo, dados): u"""Mota o XML para o envio via SOAP""" - raiz = etree.Element('{%s}Envelope'%NAMESPACE_SOAP, nsmap={'xsi': NAMESPACE_XSI, 'xsd': NAMESPACE_XSD,'soap': NAMESPACE_SOAP}) - c = etree.SubElement(raiz, '{%s}Header'%NAMESPACE_SOAP) + raiz = etree.Element('{%s}Envelope' % NAMESPACE_SOAP, nsmap={'xsi': NAMESPACE_XSI, 'xsd': NAMESPACE_XSD,'soap': NAMESPACE_SOAP}) + c = etree.SubElement(raiz, '{%s}Header' % NAMESPACE_SOAP) c.append(cabecalho) - body = etree.SubElement(raiz, '{%s}Body'%NAMESPACE_SOAP) + body = etree.SubElement(raiz, '{%s}Body' % NAMESPACE_SOAP) a = etree.SubElement(body, 'nfeDadosMsg', xmlns=NAMESPACE_METODO+metodo) a.append(dados) return raiz @@ -365,15 +365,15 @@ class ComunicacaoSefaz(Comunicacao): chave_cert = (cert, chave) # Abre a conexão HTTPS try: - xml_declaration='' + xml_declaration = '' xml = etree.tostring(xml, encoding='unicode', pretty_print=False).replace('\n','') xml = xml_declaration + xml # Faz o request com o servidor - result = requests.post(url, xml, headers=self._post_header(), cert=chave_cert, verify=False) - result.encoding='utf-8' + result = requests.post(url, xml, headers=self._post_header(), cert=chave_cert, verify=False, timeout=120) + result.encoding = 'utf-8' return result - except requests.exceptions.ConnectionError as e: + except requests.exceptions.RequestException as e: raise e finally: certificadoA1.excluir() From 179afcc7746ce6faede2d515141e526565dbb7d5 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Wed, 27 Jan 2016 17:26:35 -0200 Subject: [PATCH 2/6] Melhoria no arredondamento valor total nfe/nfce Melhoria no arredondamento valor total nfe/nfce, pois dava erro em alguns casos. 564 Total do Produto / Servico difere do somatorio dos itens. (vProd informado: 10958.27, vProd calculado: 10958.28) --- pynfe/processamento/serializacao.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index c077cb4..60eaed0 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -466,7 +466,7 @@ class SerializacaoXML(Serializacao): etree.SubElement(icms_total, 'vICMSDeson').text = str('{:.2f}').format(nota_fiscal.totais_icms_desonerado) # Valor Total do ICMS desonerado etree.SubElement(icms_total, 'vBCST').text = str('{:.2f}').format(nota_fiscal.totais_icms_st_base_calculo) etree.SubElement(icms_total, 'vST').text = str('{:.2f}').format(nota_fiscal.totais_icms_st_total) - etree.SubElement(icms_total, 'vProd').text = str('{:.2f}').format(nota_fiscal.totais_icms_total_produtos_e_servicos) + etree.SubElement(icms_total, 'vProd').text = str(nota_fiscal.totais_icms_total_produtos_e_servicos.quantize(Decimal('.001')).quantize(Decimal('.01'))) etree.SubElement(icms_total, 'vFrete').text = str('{:.2f}').format(nota_fiscal.totais_icms_total_frete) etree.SubElement(icms_total, 'vSeg').text = str('{:.2f}').format(nota_fiscal.totais_icms_total_seguro) etree.SubElement(icms_total, 'vDesc').text = str('{:.2f}').format(nota_fiscal.totais_icms_total_desconto) @@ -478,7 +478,7 @@ class SerializacaoXML(Serializacao): etree.SubElement(icms_total, 'vCOFINS').text = str('{:.2f}').format(nota_fiscal.totais_icms_cofins) etree.SubElement(icms_total, 'vOutro').text = str('{:.2f}').format(nota_fiscal.totais_icms_outras_despesas_acessorias) - etree.SubElement(icms_total, 'vNF').text = str('{:.2f}').format(nota_fiscal.totais_icms_total_nota) + etree.SubElement(icms_total, 'vNF').text = str(nota_fiscal.totais_icms_total_nota.quantize(Decimal('.001')).quantize(Decimal('.01'))) if nota_fiscal.totais_tributos_aproximado: etree.SubElement(icms_total, 'vTotTrib').text = str('{:.2f}').format(nota_fiscal.totais_tributos_aproximado) From 14521bbd2bc8d9c153d7286adc87c566855ec2b3 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Wed, 27 Jan 2016 17:49:25 -0200 Subject: [PATCH 3/6] Update serializacao.py --- pynfe/processamento/serializacao.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 60eaed0..7b05196 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import time +from decimal import Decimal from pynfe.entidades import NotaFiscal from pynfe.utils import etree, so_numeros, obter_municipio_por_codigo, \ obter_pais_por_codigo, obter_municipio_e_codigo, formatar_decimal, \ From 8d426c680b962fefe356937d965498099a1146a0 Mon Sep 17 00:00:00 2001 From: Leonardo Tada Date: Thu, 28 Jan 2016 19:39:29 -0200 Subject: [PATCH 4/6] =?UTF-8?q?Retirado=20arredondamento,=20pois=20deve=20?= =?UTF-8?q?vir=20correto=20o=20valor.=20Retirado=20c=C3=B3digo=20desnecess?= =?UTF-8?q?=C3=A1rio.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pynfe/processamento/serializacao.py | 43 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 7b05196..770052d 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- import time -from decimal import Decimal from pynfe.entidades import NotaFiscal from pynfe.utils import etree, so_numeros, obter_municipio_por_codigo, \ obter_pais_por_codigo, obter_municipio_e_codigo, formatar_decimal, \ @@ -227,12 +226,12 @@ class SerializacaoXML(Serializacao): etree.SubElement(prod, 'CFOP').text = produto_servico.cfop etree.SubElement(prod, 'uCom').text = produto_servico.unidade_comercial etree.SubElement(prod, 'qCom').text = str(produto_servico.quantidade_comercial or 0) - etree.SubElement(prod, 'vUnCom').text = str('{:.2f}').format(produto_servico.valor_unitario_comercial or 0) - etree.SubElement(prod, 'vProd').text = str('{:.2f}').format(produto_servico.valor_total_bruto or 0) + etree.SubElement(prod, 'vUnCom').text = '{:.2f}'.format(produto_servico.valor_unitario_comercial or 0) + etree.SubElement(prod, 'vProd').text = '{:.2f}'.format(produto_servico.valor_total_bruto or 0) etree.SubElement(prod, 'cEANTrib').text = produto_servico.ean_tributavel etree.SubElement(prod, 'uTrib').text = produto_servico.unidade_tributavel etree.SubElement(prod, 'qTrib').text = str(produto_servico.quantidade_tributavel) - etree.SubElement(prod, 'vUnTrib').text = str('{:.2f}').format(produto_servico.valor_unitario_tributavel) + etree.SubElement(prod, 'vUnTrib').text = '{:.2f}'.format(produto_servico.valor_unitario_tributavel) """ Indica se valor do Item (vProd) entra no valor total da NF-e (vProd) 0=Valor do item (vProd) não compõe o valor total da NF-e 1=Valor do item (vProd) compõe o valor total da NF-e (vProd) (v2.0) @@ -462,26 +461,26 @@ class SerializacaoXML(Serializacao): total = etree.SubElement(raiz, 'total') icms_total = etree.SubElement(total, 'ICMSTot') #etree.SubElement(icms_total, 'vBC').text = str(nota_fiscal.totais_icms_base_calculo) - etree.SubElement(icms_total, 'vBC').text = str('{:.2f}').format(nota_fiscal.totais_icms_base_calculo) - etree.SubElement(icms_total, 'vICMS').text = str('{:.2f}').format(nota_fiscal.totais_icms_total) - etree.SubElement(icms_total, 'vICMSDeson').text = str('{:.2f}').format(nota_fiscal.totais_icms_desonerado) # Valor Total do ICMS desonerado - etree.SubElement(icms_total, 'vBCST').text = str('{:.2f}').format(nota_fiscal.totais_icms_st_base_calculo) - etree.SubElement(icms_total, 'vST').text = str('{:.2f}').format(nota_fiscal.totais_icms_st_total) - etree.SubElement(icms_total, 'vProd').text = str(nota_fiscal.totais_icms_total_produtos_e_servicos.quantize(Decimal('.001')).quantize(Decimal('.01'))) - etree.SubElement(icms_total, 'vFrete').text = str('{:.2f}').format(nota_fiscal.totais_icms_total_frete) - etree.SubElement(icms_total, 'vSeg').text = str('{:.2f}').format(nota_fiscal.totais_icms_total_seguro) - etree.SubElement(icms_total, 'vDesc').text = str('{:.2f}').format(nota_fiscal.totais_icms_total_desconto) + etree.SubElement(icms_total, 'vBC').text = '{:.2f}'.format(nota_fiscal.totais_icms_base_calculo) + etree.SubElement(icms_total, 'vICMS').text = '{:.2f}'.format(nota_fiscal.totais_icms_total) + etree.SubElement(icms_total, 'vICMSDeson').text = '{:.2f}'.format(nota_fiscal.totais_icms_desonerado) # Valor Total do ICMS desonerado + etree.SubElement(icms_total, 'vBCST').text = '{:.2f}'.format(nota_fiscal.totais_icms_st_base_calculo) + etree.SubElement(icms_total, 'vST').text = '{:.2f}'.format(nota_fiscal.totais_icms_st_total) + etree.SubElement(icms_total, 'vProd').text = str(nota_fiscal.totais_icms_total_produtos_e_servicos) + etree.SubElement(icms_total, 'vFrete').text = '{:.2f}'.format(nota_fiscal.totais_icms_total_frete) + etree.SubElement(icms_total, 'vSeg').text = '{:.2f}'.format(nota_fiscal.totais_icms_total_seguro) + etree.SubElement(icms_total, 'vDesc').text = '{:.2f}'.format(nota_fiscal.totais_icms_total_desconto) # Tributos - etree.SubElement(icms_total, 'vII').text = str('{:.2f}').format(nota_fiscal.totais_icms_total_ii) - etree.SubElement(icms_total, 'vIPI').text = str('{:.2f}').format(nota_fiscal.totais_icms_total_ipi) - etree.SubElement(icms_total, 'vPIS').text = str('{:.2f}').format(nota_fiscal.totais_icms_pis) - etree.SubElement(icms_total, 'vCOFINS').text = str('{:.2f}').format(nota_fiscal.totais_icms_cofins) + etree.SubElement(icms_total, 'vII').text = '{:.2f}'.format(nota_fiscal.totais_icms_total_ii) + etree.SubElement(icms_total, 'vIPI').text = '{:.2f}'.format(nota_fiscal.totais_icms_total_ipi) + etree.SubElement(icms_total, 'vPIS').text = '{:.2f}'.format(nota_fiscal.totais_icms_pis) + etree.SubElement(icms_total, 'vCOFINS').text = '{:.2f}'.format(nota_fiscal.totais_icms_cofins) - etree.SubElement(icms_total, 'vOutro').text = str('{:.2f}').format(nota_fiscal.totais_icms_outras_despesas_acessorias) - etree.SubElement(icms_total, 'vNF').text = str(nota_fiscal.totais_icms_total_nota.quantize(Decimal('.001')).quantize(Decimal('.01'))) + etree.SubElement(icms_total, 'vOutro').text = '{:.2f}'.format(nota_fiscal.totais_icms_outras_despesas_acessorias) + etree.SubElement(icms_total, 'vNF').text = str(nota_fiscal.totais_icms_total_nota) if nota_fiscal.totais_tributos_aproximado: - etree.SubElement(icms_total, 'vTotTrib').text = str('{:.2f}').format(nota_fiscal.totais_tributos_aproximado) + etree.SubElement(icms_total, 'vTotTrib').text = '{:.2f}'.format(nota_fiscal.totais_tributos_aproximado) # Apenas NF-e if nota_fiscal.modelo == 55: @@ -496,7 +495,7 @@ class SerializacaoXML(Serializacao): nota_fiscal.transporte_transportadora, retorna_string=False, )) - + # Veículo if nota_fiscal.transporte_veiculo_placa and nota_fiscal.transporte_veiculo_uf: veiculo = etree.SubElement(transp, 'veicTransp') @@ -541,7 +540,7 @@ class SerializacaoXML(Serializacao): # Pagamento pag = etree.SubElement(raiz, 'pag') etree.SubElement(pag, 'tPag').text = str(nota_fiscal.tipo_pagamento).zfill(2) # 01=Dinheiro 02=Cheque 03=Cartão de Crédito 04=Cartão de Débito 05=Crédito Loja 10=Vale Alimentação 11=Vale Refeição 12=Vale Presente 13=Vale Combustível 99=Outros - etree.SubElement(pag, 'vPag').text = str('{:.2f}').format(nota_fiscal.totais_icms_total_nota) + etree.SubElement(pag, 'vPag').text = '{:.2f}'.format(nota_fiscal.totais_icms_total_nota) # Cartão NT2015.002 #cartao = etree.SubElement(pag, 'card') """ Tipo de Integração do processo de pagamento com o sistema de automação da empresa: From af1129c8f7d7d19b45ea9f7d34fa7a3320da5dbc Mon Sep 17 00:00:00 2001 From: Leonardo Tada Date: Tue, 8 Mar 2016 11:53:03 -0300 Subject: [PATCH 5/6] subprocess para check_call --- pynfe/processamento/assinatura.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pynfe/processamento/assinatura.py b/pynfe/processamento/assinatura.py index a609e32..6775484 100644 --- a/pynfe/processamento/assinatura.py +++ b/pynfe/processamento/assinatura.py @@ -55,7 +55,7 @@ class AssinaturaA1(Assinatura): with open('testes.xml', 'w') as arquivo: arquivo.write(remover_acentos(etree.tostring(xml, encoding="unicode", pretty_print=False))) - subprocess.call(['xmlsec1', '--sign', '--pkcs12', self.certificado, '--pwd', self.senha, '--crypto', 'openssl', '--output', 'funfa.xml', '--id-attr:Id', tag, 'testes.xml']) + subprocess.check_call(['xmlsec1', '--sign', '--pkcs12', self.certificado, '--pwd', self.senha, '--crypto', 'openssl', '--output', 'funfa.xml', '--id-attr:Id', tag, 'testes.xml']) xml = etree.parse('funfa.xml').getroot() if retorna_string: @@ -109,7 +109,7 @@ class AssinaturaA1(Assinatura): texto = texto.replace('ns1:', '').replace(':ns1', '') arquivo.write(texto) - subprocess.call(['xmlsec1', '--sign', '--pkcs12', self.certificado, + subprocess.check_call(['xmlsec1', '--sign', '--pkcs12', self.certificado, '--pwd', self.senha, '--crypto', 'openssl', '--output', 'nfse.xml', '--id-attr:Id', tag, 'nfse.xml']) @@ -154,7 +154,7 @@ class AssinaturaA1(Assinatura): texto = remover_acentos(etree.tostring(xml, encoding="unicode", pretty_print=False)) arquivo.write(texto) # assina lote - subprocess.call(['xmlsec1', '--sign', '--pkcs12', self.certificado, + subprocess.check_call(['xmlsec1', '--sign', '--pkcs12', self.certificado, '--pwd', self.senha, '--crypto', 'openssl', '--output', 'nfse.xml', '--id-attr:Id', tag, 'nfse.xml']) @@ -217,7 +217,7 @@ class AssinaturaA1(Assinatura): with open('nfse.xml', 'w') as arquivo: arquivo.write(remover_acentos(etree.tostring(xml, encoding="unicode", pretty_print=False).replace('\n',''))) - subprocess.call(['xmlsec1', '--sign', '--pkcs12', self.certificado, '--pwd', self.senha, '--crypto', 'openssl', '--output', 'funfa.xml', '--id-attr:Id', tag, 'nfse.xml']) + subprocess.check_call(['xmlsec1', '--sign', '--pkcs12', self.certificado, '--pwd', self.senha, '--crypto', 'openssl', '--output', 'funfa.xml', '--id-attr:Id', tag, 'nfse.xml']) if retorna_string: return open('funfa.xml', 'r').read() @@ -254,7 +254,7 @@ class AssinaturaA1(Assinatura): with open('nfse.xml', 'w') as arquivo: arquivo.write(remover_acentos(etree.tostring(xml, encoding="unicode", pretty_print=False).replace('\n',''))) - subprocess.call(['xmlsec1', '--sign', '--pkcs12', self.certificado, '--pwd', self.senha, '--crypto', 'openssl', '--output', 'funfa.xml', '--id-attr:Id', tag, 'nfse.xml']) + subprocess.check_call(['xmlsec1', '--sign', '--pkcs12', self.certificado, '--pwd', self.senha, '--crypto', 'openssl', '--output', 'funfa.xml', '--id-attr:Id', tag, 'nfse.xml']) xml = etree.parse('funfa.xml').getroot() if retorna_string: @@ -305,7 +305,7 @@ class AssinaturaA1(Assinatura): with open('nfse.xml', 'w') as arquivo: arquivo.write(remover_acentos(etree.tostring(xml, encoding="unicode", pretty_print=False).replace('\n',''))) - subprocess.call(['xmlsec1', '--sign', '--pkcs12', self.certificado, '--pwd', self.senha, '--crypto', 'openssl', '--output', 'funfa.xml', '--id-attr:Id', tag, 'nfse.xml']) + subprocess.check_call(['xmlsec1', '--sign', '--pkcs12', self.certificado, '--pwd', self.senha, '--crypto', 'openssl', '--output', 'funfa.xml', '--id-attr:Id', tag, 'nfse.xml']) xml = etree.parse('funfa.xml').getroot() if retorna_string: From 22655d895805302b8170bbb929491585332d5934 Mon Sep 17 00:00:00 2001 From: Leonardo Tada Date: Tue, 8 Mar 2016 15:16:05 -0300 Subject: [PATCH 6/6] valor do item com 4 casas decimais --- pynfe/processamento/serializacao.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 770052d..cbcf482 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -226,12 +226,12 @@ class SerializacaoXML(Serializacao): etree.SubElement(prod, 'CFOP').text = produto_servico.cfop etree.SubElement(prod, 'uCom').text = produto_servico.unidade_comercial etree.SubElement(prod, 'qCom').text = str(produto_servico.quantidade_comercial or 0) - etree.SubElement(prod, 'vUnCom').text = '{:.2f}'.format(produto_servico.valor_unitario_comercial or 0) + etree.SubElement(prod, 'vUnCom').text = '{:.4f}'.format(produto_servico.valor_unitario_comercial or 0) etree.SubElement(prod, 'vProd').text = '{:.2f}'.format(produto_servico.valor_total_bruto or 0) etree.SubElement(prod, 'cEANTrib').text = produto_servico.ean_tributavel etree.SubElement(prod, 'uTrib').text = produto_servico.unidade_tributavel etree.SubElement(prod, 'qTrib').text = str(produto_servico.quantidade_tributavel) - etree.SubElement(prod, 'vUnTrib').text = '{:.2f}'.format(produto_servico.valor_unitario_tributavel) + etree.SubElement(prod, 'vUnTrib').text = '{:.4f}'.format(produto_servico.valor_unitario_tributavel or 0) """ Indica se valor do Item (vProd) entra no valor total da NF-e (vProd) 0=Valor do item (vProd) não compõe o valor total da NF-e 1=Valor do item (vProd) compõe o valor total da NF-e (vProd) (v2.0)