From 9219ec424310c0d39750fdf319847166228bf53c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Wed, 8 Nov 2017 17:43:05 -0200 Subject: [PATCH 1/4] [FIX] Corrige erro 225 na NF-e, devido a caracteres especiais. --- pytrustnfe/xml/__init__.py | 16 ++++++++++++++-- setup.py | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/pytrustnfe/xml/__init__.py b/pytrustnfe/xml/__init__.py index bef5a53..99cd580 100644 --- a/pytrustnfe/xml/__init__.py +++ b/pytrustnfe/xml/__init__.py @@ -2,7 +2,6 @@ # © 2016 Danimar Ribeiro, Trustcode # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -import unicodedata from lxml import etree from lxml import objectify @@ -17,6 +16,7 @@ def recursively_empty(e): def render_xml(path, template_name, remove_empty, **nfe): + nfe = recursively_normalize(nfe) env = Environment( loader=FileSystemLoader(path), extensions=['jinja2.ext.with_']) @@ -53,6 +53,18 @@ def sanitize_response(response): continue i = elem.tag.find('}') if i >= 0: - elem.tag = elem.tag[i+1:] + elem.tag = elem.tag[i + 1:] objectify.deannotate(tree, cleanup_namespaces=True) return response, objectify.fromstring(etree.tostring(tree)) + + +def recursively_normalize(vals): + for item in vals: + if type(vals[item]) is str: + vals[item] = filters.normalize_str(vals[item]) + elif type(vals[item]) is dict: + recursively_normalize(vals[item]) + elif type(vals[item]) is list: + for a in vals[item]: + recursively_normalize(a) + return vals diff --git a/setup.py b/setup.py index 89374c1..a1add7c 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ # coding=utf-8 from setuptools import setup, find_packages -VERSION = "0.9.1" +VERSION = "0.9.2" setup( name="PyTrustNFe3", From 2138bd3ee2e663b501f7a47eecca9a9d386e0c4d Mon Sep 17 00:00:00 2001 From: Felipe Date: Thu, 14 Dec 2017 14:49:49 -0200 Subject: [PATCH 2/4] adicionado string.strip no recursive_normalize --- pytrustnfe/xml/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pytrustnfe/xml/__init__.py b/pytrustnfe/xml/__init__.py index 99cd580..0ed0ee5 100644 --- a/pytrustnfe/xml/__init__.py +++ b/pytrustnfe/xml/__init__.py @@ -61,6 +61,7 @@ def sanitize_response(response): def recursively_normalize(vals): for item in vals: if type(vals[item]) is str: + vals[item] = vals[item].strip() vals[item] = filters.normalize_str(vals[item]) elif type(vals[item]) is dict: recursively_normalize(vals[item]) From c2e2d1ed467e831b7223a0cabe4a3daf7a757ab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Thu, 14 Dec 2017 16:15:03 -0200 Subject: [PATCH 3/4] [WIP] Implementa NFS-e Campinas --- pytrustnfe/nfse/campinas/__init__.py | 80 +++++++++++ .../nfse/campinas/templates/ConsultaSeqRps.xsd | 30 +++++ .../nfse/campinas/templates/ConsultarLote.xml | 10 ++ .../nfse/campinas/templates/ConsultarLote.xsd | 46 +++++++ pytrustnfe/nfse/campinas/templates/cancelar.xml | 18 +++ pytrustnfe/nfse/campinas/templates/cancelar.xsd | 55 ++++++++ .../nfse/campinas/templates/consulta_notas.xml | 11 ++ .../nfse/campinas/templates/consulta_notas.xsd | 88 ++++++++++++ .../nfse/campinas/templates/consultarNFSeRps.xml | 19 +++ .../nfse/campinas/templates/consultarNFSeRps.xsd | 55 ++++++++ pytrustnfe/nfse/campinas/templates/enviar.xml | 108 +++++++++++++++ pytrustnfe/nfse/campinas/templates/enviar.xsd | 149 +++++++++++++++++++++ pytrustnfe/nfse/campinas/templates/soap_header.xml | 12 ++ 13 files changed, 681 insertions(+) create mode 100644 pytrustnfe/nfse/campinas/__init__.py create mode 100644 pytrustnfe/nfse/campinas/templates/ConsultaSeqRps.xsd create mode 100644 pytrustnfe/nfse/campinas/templates/ConsultarLote.xml create mode 100644 pytrustnfe/nfse/campinas/templates/ConsultarLote.xsd create mode 100644 pytrustnfe/nfse/campinas/templates/cancelar.xml create mode 100644 pytrustnfe/nfse/campinas/templates/cancelar.xsd create mode 100644 pytrustnfe/nfse/campinas/templates/consulta_notas.xml create mode 100644 pytrustnfe/nfse/campinas/templates/consulta_notas.xsd create mode 100644 pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xml create mode 100644 pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xsd create mode 100644 pytrustnfe/nfse/campinas/templates/enviar.xml create mode 100644 pytrustnfe/nfse/campinas/templates/enviar.xsd create mode 100644 pytrustnfe/nfse/campinas/templates/soap_header.xml diff --git a/pytrustnfe/nfse/campinas/__init__.py b/pytrustnfe/nfse/campinas/__init__.py new file mode 100644 index 0000000..ff5ef02 --- /dev/null +++ b/pytrustnfe/nfse/campinas/__init__.py @@ -0,0 +1,80 @@ +# -*- encoding: utf-8 -*- +# © 2017 Fábio Luna, Trustcode +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import os +import suds +from lxml import etree +from pytrustnfe.xml import render_xml, sanitize_response +from pytrustnfe.nfse.assinatura import Assinatura +from pytrustnfe import HttpClient + + +def _render_xml(certificado, method, **kwargs): + path = os.path.join(os.path.dirname(__file__), 'templates') + xml_send = render_xml(path, '%s.xml' % method, True, **kwargs) + xml_send = etree.tostring(xml_send) + + return xml_send + + +def _validate(method, xml): + path = os.path.join(os.path.dirname(__file__), 'templates') + schema = os.path.join(path, '%s.xsd' % method) + + nfe = etree.fromstring(xml) + esquema = etree.XMLSchema(etree.parse(schema)) + esquema.validate(nfe) + erros = [x.message for x in esquema.error_log] + return erros + + +def _send(certificado, method, **kwargs): + url = 'http://issdigital.campinas.sp.gov.br/WsNFe2/LoteRps.jws?wsdl' # noqa + + path = os.path.join(os.path.dirname(__file__), 'templates') + + if method == "testeEnviar": + xml_send = render_xml(path, 'testeEnviar', **kwargs) + else: + xml_send = render_xml(path, '%s.xml' % method, False) + client = HttpClient(url) + + pfx_path = certificado.save_pfx() + signer = Assinatura(pfx_path, certificado.password) + xml_signed = signer.assina_xml(xml_send, '') + + try: + response = getattr(client.service, method)(xml_signed) + response, obj = sanitize_response(response) + except suds.WebFault as e: + return { + 'sent_xml': xml_send, + 'received_xml': e.fault.faultstring, + 'object': None + } + + return { + 'sent_xml': xml_send, + 'received_xml': response, + 'object': obj + } + + +def enviar(certificado, **kwargs): + if kwargs['ambiente'] == 'producao': + return _send(certificado, 'enviar', **kwargs) + else: + return _send(certificado, 'testeEnviar', **kwargs) + + +def cancelar(certificado, ** kwargs): + return _send(certificado, 'cancelar', **kwargs) + + +def consulta_lote(certificado, **kwargs): + return _send(certificado, 'ConsultarLote', **kwargs) + + +def consultar_lote_rps(certificado, **kwarg): + return _send(certificado, 'consultarNFSeRps', **kwarg) diff --git a/pytrustnfe/nfse/campinas/templates/ConsultaSeqRps.xsd b/pytrustnfe/nfse/campinas/templates/ConsultaSeqRps.xsd new file mode 100644 index 0000000..94491a7 --- /dev/null +++ b/pytrustnfe/nfse/campinas/templates/ConsultaSeqRps.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pytrustnfe/nfse/campinas/templates/ConsultarLote.xml b/pytrustnfe/nfse/campinas/templates/ConsultarLote.xml new file mode 100644 index 0000000..24afc5d --- /dev/null +++ b/pytrustnfe/nfse/campinas/templates/ConsultarLote.xml @@ -0,0 +1,10 @@ + + + {{ consulta.cidade }} + {{ consulta.cpf_cnpj }} + 1 + {{ consulta.lote }} + + \ No newline at end of file diff --git a/pytrustnfe/nfse/campinas/templates/ConsultarLote.xsd b/pytrustnfe/nfse/campinas/templates/ConsultarLote.xsd new file mode 100644 index 0000000..068756f --- /dev/null +++ b/pytrustnfe/nfse/campinas/templates/ConsultarLote.xsd @@ -0,0 +1,46 @@ + + + + + + Schema utilizado para REQUISIçÂO de Consulta de Lote de RPS. + Este Schema XML é utilizado pelos Prestadores de serviços para consultarem Lote de RPS emitidos por eles. + + + + + + Cabeçalho do pedido. + + + + + + Informe o Codigo da Cidade. + + + + + Informe o CPF/CNPJ do Remetente autorizado a transmitir a mensagem XML. + + + + + Informe a Versão do Schema XML utilizado. + + + + + Informe o Número do Lote a ser consultado. + + + + + + + + + diff --git a/pytrustnfe/nfse/campinas/templates/cancelar.xml b/pytrustnfe/nfse/campinas/templates/cancelar.xml new file mode 100644 index 0000000..d72086b --- /dev/null +++ b/pytrustnfe/nfse/campinas/templates/cancelar.xml @@ -0,0 +1,18 @@ + + + {{ cancelamento.cidade }} + {{ cancelamento.cpf_cnpj }} + true + 1 + + + + {{ cancelamento.inscricao_municipal }} + {{ cancelamento.nota_id }} + {{ cancelamento.assinatura }} + {{ cancelamento.motivo }} + + + diff --git a/pytrustnfe/nfse/campinas/templates/cancelar.xsd b/pytrustnfe/nfse/campinas/templates/cancelar.xsd new file mode 100644 index 0000000..09f1938 --- /dev/null +++ b/pytrustnfe/nfse/campinas/templates/cancelar.xsd @@ -0,0 +1,55 @@ + + + + + + + + Schema utilizado para Cancelamento de NFSe. + Este Schema XML é utilizado pelos Prestadores de serviços cancelarem NFSe emitidas por eles. + + + + + + Cabeçalho do pedido. + + + + + + Informe o Codigo da Cidade. + + + + + Informe o CPF/CNPJ do Remetente autorizado a transmitir a mensagem XML. + + + + + Informe se as NF-e a serem canceladas farão parte de uma mesma transação. True - As NF-e só serão canceladas se não ocorrer nenhum evento de erro durante o processamento de todo o lote; False - As NF-e aptas a serem canceladas serão canceladas, mesmo que ocorram eventos de erro durante processamento do cancelamento de outras NF-e deste lote. + + + + + Informe a Versão do Schema XML utilizado. + + + + + + + + Detalhe do pedido de cancelamento de NFSe. Cada detalhe deverá conter a Chave de uma NFSe e sua respectiva assinatura de cancelamento. + + + + + + + diff --git a/pytrustnfe/nfse/campinas/templates/consulta_notas.xml b/pytrustnfe/nfse/campinas/templates/consulta_notas.xml new file mode 100644 index 0000000..4a666d0 --- /dev/null +++ b/pytrustnfe/nfse/campinas/templates/consulta_notas.xml @@ -0,0 +1,11 @@ + + +{{ consulta.cidade }} +{{ consulta.cpf_cnpj }} +{{ consulta.inscricao_municipal }} +{{ consulta.data_inicio }} +{{ consulta.data_final }} +{{ consulta.nota_inicial }} +1 + + \ No newline at end of file diff --git a/pytrustnfe/nfse/campinas/templates/consulta_notas.xsd b/pytrustnfe/nfse/campinas/templates/consulta_notas.xsd new file mode 100644 index 0000000..5784eb8 --- /dev/null +++ b/pytrustnfe/nfse/campinas/templates/consulta_notas.xsd @@ -0,0 +1,88 @@ + + + + + + + Schema utilizado para REQUISIÇAO de consultas + de notas que foram enviadas por lote de RPS. + Este Schema XML é utilizado pelos prestadores + de serviços para consultas de notas que foram enviadas por lote de + RPS. + + + + + + Cabeçalho do pedido. + + + + + + Informe o Codigo da Cidade. + + + + + + Informe o CPF/CNPJ do Remetente + autorizado a transmitir a mensagem XML. + + + + + Informe a Inscrição Municipal do + Prestador + + + + + Informe a data de início do período + transmitido (AAAA-MM-DD). + + + + + Informe a data final do período + transmitido (AAAA-MM-DD). + + + + + Numero da nota inicial da consulta. Ou + seja a consulta ira retornar as notas no periodo, onde o + numero da nota seja maior ou igual a esse numero. O retorno + não pode ultrapassar 500Kb. Caso não tenha o numero da nota, + passar o valor Zero, será retornado as notas geradas no + periodo até o limite de 500kb. + + + + + Informe a Versão. + + + + + + + + + + + + + diff --git a/pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xml b/pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xml new file mode 100644 index 0000000..6535559 --- /dev/null +++ b/pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xml @@ -0,0 +1,19 @@ + + + {{ consulta.cidade }} + {{ consulta.cpf_cnpj }} + true + 1 + + + + + {{ consulta.inscricao_municipal }} + {{ consulta.rps_id }} + {{ consulta.serie_prestacao }} + + + + diff --git a/pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xsd b/pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xsd new file mode 100644 index 0000000..c0e83bf --- /dev/null +++ b/pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xsd @@ -0,0 +1,55 @@ + + + + + + + + Schema utilizado para Consulta de NFSe. + Este Schema XML é utilizado pelos Prestadores de serviços consultarem NFSe emitidas por eles. + + + + + + Cabeçalho do pedido. + + + + + + Informe o Codigo da Cidade. + + + + + Informe o CPF/CNPJ do Remetente autorizado a transmitir a mensagem XML. + + + + + Informe se as NF-e a serem consultadas farão parte de uma mesma transação. Informe sempre True. + + + + + Informe a Versão do Schema XML utilizado. + + + + + + + + Detalhe do pedido de consulta de NFSe. Cada detalhe deverá conter a Chave de uma NFSe e sua respectiva assinatura de consulta. + + + + + + + diff --git a/pytrustnfe/nfse/campinas/templates/enviar.xml b/pytrustnfe/nfse/campinas/templates/enviar.xml new file mode 100644 index 0000000..7e4b178 --- /dev/null +++ b/pytrustnfe/nfse/campinas/templates/enviar.xml @@ -0,0 +1,108 @@ + + + {{ nfse.cidade }} + {{ nfse.cpf_cnpj }} + {{ nfse.remetente }} + {{ nfse.transacao }} + {{ nfse.data_inicio|format_date }} + {{ nfse.data_fim|format_date }} + {{ nfse.total_rps }} + {{ nfse.total_servicos }} + {{ nfse.total_deducoes }} + 1 + WS + + + {% for rps in nfse.lista_rps -%} + + {{ rps.assinatura }} + {{ rps.prestador.inscricao_municipal }} + + {{ rps.prestador.razao_social }} + RPS + {{ rps.serie }} + {{ rps.numero }} + {{ rps.data_emissao|format_datetime }} + + {{ rps.situacao }} + + 0 + 0 + 1900-01-01 + {{ rps.serie_prestacao }} + {{ rps.tomador.inscricao_municipal }} + {{ rps.tomador.cpf_cnpj }} + {{ rps.tomador.razao_social }} + + {{ rps.tomador.tipo_logradouro }} + + {{ rps.tomador.logradouro }} + {{ rps.tomador.numero }} + + {{ rps.tomador.tipo_bairro }} + {{ rps.tomador.bairro }} + {{ rps.tomador.cidade }} + {{ rps.tomador.cidade_descricao }} + + {{ rps.tomador.cep }} + {{ rps.tomador.email }} + {{ rps.codigo_atividade }} + {{ rps.aliquota_atividade }} + {{ rps.tipo_recolhimento }} + {{ rps.municipio_prestacao }} + + {{ rps.municipio_descricao_prestacao }} + + {{ rps.operacao }} + {{ rps.tributacao }} + {{ rps.valor_pis }} + {{ rps.valor_cofins }} + {{ rps.valor_inss }} + {{ rps.valor_ir }} + {{ rps.valor_csll }} + {{ rps.aliquota_pis }} + {{ rps.aliquota_cofins }} + {{ rps.aliquota_inss }} + {{ rps.aliquota_ir }} + {{ rps.aliquota_csll }} + {{ rps.descricao }} + {{ rps.prestador.ddd }} + {{ rps.prestador.telefone }} + {{ rps.tomador.ddd }} + {{ rps.tomador.telefone }} + {{ rps.motivo_cancelamento }} + {% if rps.deducoes|count > 0 %} + + {% for deducao in rps.deducoes -%} + + {{ deducao.por }} + {{ deducao.tipo }} + {{ deducao.cnpj_referencia }} + {{ deducao.nf_referencia }} + {{ deducao.valor_referencia }} + {{ deducao.percentual_deduzir }} + {{ deducao.valor_deduzir }} + + {% endfor %} + + {% endif %} + {% if rps.deducoes|count == 0 %} + + {% endif %} + + {% for item in rps.itens -%} + + {{ item.descricao }} + {{ item.quantidade }} + {{ item.valor_unitario }} + {{ item.valor_total }} + S + + {% endfor %} + + + {% endfor %} + + diff --git a/pytrustnfe/nfse/campinas/templates/enviar.xsd b/pytrustnfe/nfse/campinas/templates/enviar.xsd new file mode 100644 index 0000000..fedce41 --- /dev/null +++ b/pytrustnfe/nfse/campinas/templates/enviar.xsd @@ -0,0 +1,149 @@ + + + + + + Schema utilizado para envio de lote de RPS. + Este Schema XML é utilizado pelos prestadores + de serviços para substituição em lote de RPS por NFS-e. + + + + + + + Cabeçalho do Lote. + + + + + + Informe o Codigo da Cidade no Padrão SIAFI. + + + + + + + CNPJ do contribuinte ou CPF do Responsável Legal autorizado a entregar o lote. + + + + + + + Informe o Nome do Contribuinte ou do Responsável Legal + + + + + + + Informe se os RPS a serem + substituídos por + NF-e farão + parte de uma mesma transação. + True - Os RPS só serão + substituídos por NF-e se não + ocorrer nenhum evento de erro + durante o processamento de todo + o lote; False - Os RPS válidos + serão substituídos por NF-e, + mesmo que ocorram eventos de + erro durante processamento de + outros RPS deste lote. Por definição + estão sendo aceitos apenas lotes com RPS válidos, + o lote é + recusado caso haja algum RPS inválido. + + + + + + + Informe a data de início do + período + transmitido + (AAAA-MM-DD). + + + + + + + Informe a data final do período + transmitido + (AAAA-MM-DD). + + + + + + + Informe o total de RPS contidos + na mensagem + XML. OBS: O xml não pode ultrapassar o tamanho maximo de 500kb. + + + + + + + Informe o valor total dos + serviços prestados + dos RPS + contidos na mensagem XML. + + + + + + + Informe o valor total das + deduções dos RPS + contidos na + mensagem XML. + + + + + + + Informe a Versão do Schema XML + utilizado. + + + + + + Informe o Método de Envio + + + + + Versão da DLL de envio de lote. Não é necessário informar esse campo caso não utilize a DLL. + + + + + + + + + + Informe os RPS a serem substituidos por + NF-e. + + + + + + + diff --git a/pytrustnfe/nfse/campinas/templates/soap_header.xml b/pytrustnfe/nfse/campinas/templates/soap_header.xml new file mode 100644 index 0000000..e9d1dd2 --- /dev/null +++ b/pytrustnfe/nfse/campinas/templates/soap_header.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file From 22ac348b8b722a1b500488477f48119b0b6edb4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Wed, 20 Dec 2017 18:00:03 -0200 Subject: [PATCH 4/4] Implementa NFse de Campinas --- pytrustnfe/nfse/campinas/__init__.py | 58 ++++---- .../nfse/campinas/templates/ConsultaSeqRps.xsd | 30 ----- .../nfse/campinas/templates/ConsultarLote.xml | 10 -- .../nfse/campinas/templates/ConsultarLote.xsd | 46 ------- pytrustnfe/nfse/campinas/templates/cancelar.xsd | 55 -------- .../nfse/campinas/templates/consulta_notas.xsd | 88 ------------ .../nfse/campinas/templates/consultarLote.xml | 10 ++ .../nfse/campinas/templates/consultarNFSeRps.xml | 19 --- .../nfse/campinas/templates/consultarNFSeRps.xsd | 55 -------- pytrustnfe/nfse/campinas/templates/enviar.xsd | 149 --------------------- setup.py | 3 +- 11 files changed, 39 insertions(+), 484 deletions(-) delete mode 100644 pytrustnfe/nfse/campinas/templates/ConsultaSeqRps.xsd delete mode 100644 pytrustnfe/nfse/campinas/templates/ConsultarLote.xml delete mode 100644 pytrustnfe/nfse/campinas/templates/ConsultarLote.xsd delete mode 100644 pytrustnfe/nfse/campinas/templates/cancelar.xsd delete mode 100644 pytrustnfe/nfse/campinas/templates/consulta_notas.xsd create mode 100644 pytrustnfe/nfse/campinas/templates/consultarLote.xml delete mode 100644 pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xml delete mode 100644 pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xsd delete mode 100644 pytrustnfe/nfse/campinas/templates/enviar.xsd diff --git a/pytrustnfe/nfse/campinas/__init__.py b/pytrustnfe/nfse/campinas/__init__.py index ff5ef02..e5536af 100644 --- a/pytrustnfe/nfse/campinas/__init__.py +++ b/pytrustnfe/nfse/campinas/__init__.py @@ -6,27 +6,22 @@ import os import suds from lxml import etree from pytrustnfe.xml import render_xml, sanitize_response +from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key from pytrustnfe.nfse.assinatura import Assinatura -from pytrustnfe import HttpClient +from pytrustnfe.client import get_client -def _render_xml(certificado, method, **kwargs): +def _render(certificado, method, **kwargs): path = os.path.join(os.path.dirname(__file__), 'templates') - xml_send = render_xml(path, '%s.xml' % method, True, **kwargs) - xml_send = etree.tostring(xml_send) - - return xml_send - + if method == "testeEnviar": + xml_send = render_xml(path, 'enviar.xml', True, **kwargs) + else: + xml_send = render_xml(path, '%s.xml' % method, False, **kwargs) -def _validate(method, xml): - path = os.path.join(os.path.dirname(__file__), 'templates') - schema = os.path.join(path, '%s.xsd' % method) + if type(xml_send) != str: + xml_send = etree.tostring(xml_send) - nfe = etree.fromstring(xml) - esquema = etree.XMLSchema(etree.parse(schema)) - esquema.validate(nfe) - erros = [x.message for x in esquema.error_log] - return erros + return xml_send def _send(certificado, method, **kwargs): @@ -34,19 +29,19 @@ def _send(certificado, method, **kwargs): path = os.path.join(os.path.dirname(__file__), 'templates') - if method == "testeEnviar": - xml_send = render_xml(path, 'testeEnviar', **kwargs) - else: - xml_send = render_xml(path, '%s.xml' % method, False) - client = HttpClient(url) + xml_send = _render(path, method, **kwargs) + client = get_client(url) - pfx_path = certificado.save_pfx() - signer = Assinatura(pfx_path, certificado.password) - xml_signed = signer.assina_xml(xml_send, '') + if certificado: + cert, key = extract_cert_and_key_from_pfx( + certificado.pfx, certificado.password) + cert, key = save_cert_key(cert, key) + signer = Assinatura(cert, key, certificado.password) + xml_send = signer.assina_xml(xml_send, '') try: - response = getattr(client.service, method)(xml_signed) - response, obj = sanitize_response(response) + response = getattr(client.service, method)(xml_send) + response, obj = sanitize_response(response.encode()) except suds.WebFault as e: return { 'sent_xml': xml_send, @@ -62,18 +57,19 @@ def _send(certificado, method, **kwargs): def enviar(certificado, **kwargs): - if kwargs['ambiente'] == 'producao': - return _send(certificado, 'enviar', **kwargs) - else: - return _send(certificado, 'testeEnviar', **kwargs) + return _send(certificado, 'enviar', **kwargs) + + +def teste_enviar(certificado, **kwargs): + return _send(certificado, 'testeEnviar', **kwargs) def cancelar(certificado, ** kwargs): return _send(certificado, 'cancelar', **kwargs) -def consulta_lote(certificado, **kwargs): - return _send(certificado, 'ConsultarLote', **kwargs) +def consulta_lote(**kwargs): + return _send(False, 'consultarLote', **kwargs) def consultar_lote_rps(certificado, **kwarg): diff --git a/pytrustnfe/nfse/campinas/templates/ConsultaSeqRps.xsd b/pytrustnfe/nfse/campinas/templates/ConsultaSeqRps.xsd deleted file mode 100644 index 94491a7..0000000 --- a/pytrustnfe/nfse/campinas/templates/ConsultaSeqRps.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pytrustnfe/nfse/campinas/templates/ConsultarLote.xml b/pytrustnfe/nfse/campinas/templates/ConsultarLote.xml deleted file mode 100644 index 24afc5d..0000000 --- a/pytrustnfe/nfse/campinas/templates/ConsultarLote.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - {{ consulta.cidade }} - {{ consulta.cpf_cnpj }} - 1 - {{ consulta.lote }} - - \ No newline at end of file diff --git a/pytrustnfe/nfse/campinas/templates/ConsultarLote.xsd b/pytrustnfe/nfse/campinas/templates/ConsultarLote.xsd deleted file mode 100644 index 068756f..0000000 --- a/pytrustnfe/nfse/campinas/templates/ConsultarLote.xsd +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - Schema utilizado para REQUISIçÂO de Consulta de Lote de RPS. - Este Schema XML é utilizado pelos Prestadores de serviços para consultarem Lote de RPS emitidos por eles. - - - - - - Cabeçalho do pedido. - - - - - - Informe o Codigo da Cidade. - - - - - Informe o CPF/CNPJ do Remetente autorizado a transmitir a mensagem XML. - - - - - Informe a Versão do Schema XML utilizado. - - - - - Informe o Número do Lote a ser consultado. - - - - - - - - - diff --git a/pytrustnfe/nfse/campinas/templates/cancelar.xsd b/pytrustnfe/nfse/campinas/templates/cancelar.xsd deleted file mode 100644 index 09f1938..0000000 --- a/pytrustnfe/nfse/campinas/templates/cancelar.xsd +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - Schema utilizado para Cancelamento de NFSe. - Este Schema XML é utilizado pelos Prestadores de serviços cancelarem NFSe emitidas por eles. - - - - - - Cabeçalho do pedido. - - - - - - Informe o Codigo da Cidade. - - - - - Informe o CPF/CNPJ do Remetente autorizado a transmitir a mensagem XML. - - - - - Informe se as NF-e a serem canceladas farão parte de uma mesma transação. True - As NF-e só serão canceladas se não ocorrer nenhum evento de erro durante o processamento de todo o lote; False - As NF-e aptas a serem canceladas serão canceladas, mesmo que ocorram eventos de erro durante processamento do cancelamento de outras NF-e deste lote. - - - - - Informe a Versão do Schema XML utilizado. - - - - - - - - Detalhe do pedido de cancelamento de NFSe. Cada detalhe deverá conter a Chave de uma NFSe e sua respectiva assinatura de cancelamento. - - - - - - - diff --git a/pytrustnfe/nfse/campinas/templates/consulta_notas.xsd b/pytrustnfe/nfse/campinas/templates/consulta_notas.xsd deleted file mode 100644 index 5784eb8..0000000 --- a/pytrustnfe/nfse/campinas/templates/consulta_notas.xsd +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - Schema utilizado para REQUISIÇAO de consultas - de notas que foram enviadas por lote de RPS. - Este Schema XML é utilizado pelos prestadores - de serviços para consultas de notas que foram enviadas por lote de - RPS. - - - - - - Cabeçalho do pedido. - - - - - - Informe o Codigo da Cidade. - - - - - - Informe o CPF/CNPJ do Remetente - autorizado a transmitir a mensagem XML. - - - - - Informe a Inscrição Municipal do - Prestador - - - - - Informe a data de início do período - transmitido (AAAA-MM-DD). - - - - - Informe a data final do período - transmitido (AAAA-MM-DD). - - - - - Numero da nota inicial da consulta. Ou - seja a consulta ira retornar as notas no periodo, onde o - numero da nota seja maior ou igual a esse numero. O retorno - não pode ultrapassar 500Kb. Caso não tenha o numero da nota, - passar o valor Zero, será retornado as notas geradas no - periodo até o limite de 500kb. - - - - - Informe a Versão. - - - - - - - - - - - - - diff --git a/pytrustnfe/nfse/campinas/templates/consultarLote.xml b/pytrustnfe/nfse/campinas/templates/consultarLote.xml new file mode 100644 index 0000000..24afc5d --- /dev/null +++ b/pytrustnfe/nfse/campinas/templates/consultarLote.xml @@ -0,0 +1,10 @@ + + + {{ consulta.cidade }} + {{ consulta.cpf_cnpj }} + 1 + {{ consulta.lote }} + + \ No newline at end of file diff --git a/pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xml b/pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xml deleted file mode 100644 index 6535559..0000000 --- a/pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - {{ consulta.cidade }} - {{ consulta.cpf_cnpj }} - true - 1 - - - - - {{ consulta.inscricao_municipal }} - {{ consulta.rps_id }} - {{ consulta.serie_prestacao }} - - - - diff --git a/pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xsd b/pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xsd deleted file mode 100644 index c0e83bf..0000000 --- a/pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xsd +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - Schema utilizado para Consulta de NFSe. - Este Schema XML é utilizado pelos Prestadores de serviços consultarem NFSe emitidas por eles. - - - - - - Cabeçalho do pedido. - - - - - - Informe o Codigo da Cidade. - - - - - Informe o CPF/CNPJ do Remetente autorizado a transmitir a mensagem XML. - - - - - Informe se as NF-e a serem consultadas farão parte de uma mesma transação. Informe sempre True. - - - - - Informe a Versão do Schema XML utilizado. - - - - - - - - Detalhe do pedido de consulta de NFSe. Cada detalhe deverá conter a Chave de uma NFSe e sua respectiva assinatura de consulta. - - - - - - - diff --git a/pytrustnfe/nfse/campinas/templates/enviar.xsd b/pytrustnfe/nfse/campinas/templates/enviar.xsd deleted file mode 100644 index fedce41..0000000 --- a/pytrustnfe/nfse/campinas/templates/enviar.xsd +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - Schema utilizado para envio de lote de RPS. - Este Schema XML é utilizado pelos prestadores - de serviços para substituição em lote de RPS por NFS-e. - - - - - - - Cabeçalho do Lote. - - - - - - Informe o Codigo da Cidade no Padrão SIAFI. - - - - - - - CNPJ do contribuinte ou CPF do Responsável Legal autorizado a entregar o lote. - - - - - - - Informe o Nome do Contribuinte ou do Responsável Legal - - - - - - - Informe se os RPS a serem - substituídos por - NF-e farão - parte de uma mesma transação. - True - Os RPS só serão - substituídos por NF-e se não - ocorrer nenhum evento de erro - durante o processamento de todo - o lote; False - Os RPS válidos - serão substituídos por NF-e, - mesmo que ocorram eventos de - erro durante processamento de - outros RPS deste lote. Por definição - estão sendo aceitos apenas lotes com RPS válidos, - o lote é - recusado caso haja algum RPS inválido. - - - - - - - Informe a data de início do - período - transmitido - (AAAA-MM-DD). - - - - - - - Informe a data final do período - transmitido - (AAAA-MM-DD). - - - - - - - Informe o total de RPS contidos - na mensagem - XML. OBS: O xml não pode ultrapassar o tamanho maximo de 500kb. - - - - - - - Informe o valor total dos - serviços prestados - dos RPS - contidos na mensagem XML. - - - - - - - Informe o valor total das - deduções dos RPS - contidos na - mensagem XML. - - - - - - - Informe a Versão do Schema XML - utilizado. - - - - - - Informe o Método de Envio - - - - - Versão da DLL de envio de lote. Não é necessário informar esse campo caso não utilize a DLL. - - - - - - - - - - Informe os RPS a serem substituidos por - NF-e. - - - - - - - diff --git a/setup.py b/setup.py index a1add7c..ff137cf 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ # coding=utf-8 from setuptools import setup, find_packages -VERSION = "0.9.2" +VERSION = "0.9.3" setup( name="PyTrustNFe3", @@ -27,6 +27,7 @@ later (LGPLv2+)', 'nfe/templates/*xml', 'nfe/fonts/*ttf', 'nfse/paulistana/templates/*xml', + 'nfse/campinas/templates/*xml', 'nfse/ginfes/templates/*xml', 'nfse/simpliss/templates/*xml', 'nfse/betha/templates/*xml',