From c7beb73a6bf52a690eb0ec06cd52d2ac6ef26aad Mon Sep 17 00:00:00 2001 From: Gabriela Cavalcante da Silva Date: Wed, 29 Jan 2020 10:44:37 -0300 Subject: [PATCH] add natal nfse --- pytrustnfe/nfse/natal/__init__.py | 77 ++++++++++++++++ pytrustnfe/nfse/natal/templates/Rps.xml | 101 +++++++++++++++++++++ pytrustnfe/nfse/natal/templates/cancelarNfse.xml | 15 +++ .../nfse/natal/templates/consultarLoteRps.xml | 7 ++ .../nfse/natal/templates/recepcionarLoteRps.xml | 13 +++ 5 files changed, 213 insertions(+) create mode 100644 pytrustnfe/nfse/natal/__init__.py create mode 100644 pytrustnfe/nfse/natal/templates/Rps.xml create mode 100644 pytrustnfe/nfse/natal/templates/cancelarNfse.xml create mode 100644 pytrustnfe/nfse/natal/templates/consultarLoteRps.xml create mode 100644 pytrustnfe/nfse/natal/templates/recepcionarLoteRps.xml diff --git a/pytrustnfe/nfse/natal/__init__.py b/pytrustnfe/nfse/natal/__init__.py new file mode 100644 index 0000000..a96948d --- /dev/null +++ b/pytrustnfe/nfse/natal/__init__.py @@ -0,0 +1,77 @@ +# © 2019 Danimar Ribeiro, Trustcode +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import os +from requests import Session +from zeep import Client +from zeep.transports import Transport +from requests.packages.urllib3 import disable_warnings + +from pytrustnfe.xml import render_xml, sanitize_response +from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key +from pytrustnfe.nfe.assinatura import Assinatura + + +def _render(certificado, method, **kwargs): + path = os.path.join(os.path.dirname(__file__), "templates") + xml_send = render_xml(path, "%s.xml" % method, True, **kwargs) + + reference = "" + signer = Assinatura(certificado.pfx, certificado.password) + xml_send = signer.assina_xml(xml_send, reference) + return xml_send + + +def _send(certificado, method, **kwargs): + base_url = "" + if kwargs["ambiente"] == "producao": + base_url = "https://aparecida.siltecnologia.com.br/tbw/services/Abrasf10?wsdl" + else: + base_url = "https://aparecida.siltecnologia.com.br/tbwhomologacao/services/Abrasf10?wsdl" + + cert, key = extract_cert_and_key_from_pfx(certificado.pfx, certificado.password) + cert, key = save_cert_key(cert, key) + + disable_warnings() + session = Session() + session.cert = (cert, key) + session.verify = False + transport = Transport(session=session) + + client = Client(base_url, transport=transport) + + xml_send = kwargs["xml"] + response = client.service[method](xml_send) + response, obj = sanitize_response(response) + return {"sent_xml": xml_send, "received_xml": response, "object": obj} + + +def xml_recepcionar_lote_rps(certificado, **kwargs): + return _render(certificado, "recepcionarLoteRps", **kwargs) + + +def recepcionar_lote_rps(certificado, **kwargs): + if "xml" not in kwargs: + kwargs["xml"] = xml_recepcionar_lote_rps(certificado, **kwargs) + return {"sent_xml": kwargs["xml"]} + # return _send(certificado, 'recepcionarLoteRps', **kwargs) + + +def xml_consultar_lote_rps(certificado, **kwargs): + return _render(certificado, "consultarLoteRps", **kwargs) + + +def consultar_lote_rps(certificado, **kwargs): + if "xml" not in kwargs: + kwargs["xml"] = xml_consultar_lote_rps(certificado, **kwargs) + return _send(certificado, "consultarLoteRps", **kwargs) + + +def xml_cancelar_nfse(certificado, **kwargs): + return _render(certificado, "cancelarNfse", **kwargs) + + +def cancelar_nfse(certificado, **kwargs): + if "xml" not in kwargs: + kwargs["xml"] = xml_cancelar_nfse(certificado, **kwargs) + return _send(certificado, "cancelarNfse", **kwargs) diff --git a/pytrustnfe/nfse/natal/templates/Rps.xml b/pytrustnfe/nfse/natal/templates/Rps.xml new file mode 100644 index 0000000..9dcd23c --- /dev/null +++ b/pytrustnfe/nfse/natal/templates/Rps.xml @@ -0,0 +1,101 @@ + + + + {{ rps.numero }} + {{ rps.serie }} + {{ rps.tipo_rps }} + + {{ rps.data_emissao }} + {{ rps.natureza_operacao }} + {{ rps.regime_tributacao }} + {{ rps.optante_simples }} + {{ rps.incentivador_cultural }} + + + {{ rps.servico.valor_servico }} + {{ rps.servico.iss_retido }} + {{ rps.servico.base_calculo }} + + {{ rps.servico.codigo_servico }} + {{ rps.servico.cnae_servico }} + {{ rps.servico.codigo_tributacao_municipio }} + {{ rps.servico.descricao }} + {{ rps.servico.codigo_municipio }} + + + + {{ rps.prestador.cnpj }} + {{ rps.prestador.inscricao_municipal }} + + {{ rps.prestador.razaosocial }} + {{ rps.prestador.fantasia }} + + {{ rps.prestador.endereco }} + {{ rps.prestador.numero }} + {{ rps.prestador.complemento }} + {{ rps.prestador.bairro }} + {{ rps.prestador.codigomunicipal }} + {{ rps.prestador.uf }} + {{ rps.prestador.cep }} + + + {{ rps.prestador.telefone }} + {{ rps.prestador.email }} + + + + + + {% if rps.tomador.cnpj_cpf|length == 14 %} + {{ rps.tomador.cnpj_cpf }} + {% endif %} + {% if rps.tomador.cnpj_cpf|length == 11 %} + {{ rps.tomador.cnpj_cpf }} + {% endif %} + + {% if rps.tomador.inscricao_municipal is defined -%} + {{ rps.tomador.inscricao_municipal }} + {% endif %} + + {{ rps.tomador.razao_social }} + + {{ rps.tomador.logradouro }} + {{ rps.tomador.numero }} + {% if rps.tomador.complemento is defined -%} + {{ rps.tomador.complemento }} + {% endif %} + {{ rps.tomador.bairro }} + {{ rps.tomador.codigo_municipio }} + {{ rps.tomador.uf }} + {{ rps.tomador.cep }} + + + {% if rps.tomador.telefone is defined -%} + {{ rps.tomador.telefone }} + {% endif %} + {% if rps.tomador.email is defined -%} + {{ rps.tomador.email }} + {% endif %} + + + {{ rps.tomador.orgao_gerador.codigo_municipio }} + {{ rps.tomador.orgao_gerador.uf }} + + + {% if rps.intermediario is defined -%} + + {{ rps.intermediario.razao_social }} + + {{ rps.intermediario.cnpj }} + + {{ rps.intermediario.inscricao_municipal }} + + {% endif %} + {% if rps.construcao_civil is defined -%} + + {{ rps.construcao_civil.codigo_obra }} + {{ rps.construcao_civil.art }} + + {% endif %} + + diff --git a/pytrustnfe/nfse/natal/templates/cancelarNfse.xml b/pytrustnfe/nfse/natal/templates/cancelarNfse.xml new file mode 100644 index 0000000..f5ec25b --- /dev/null +++ b/pytrustnfe/nfse/natal/templates/cancelarNfse.xml @@ -0,0 +1,15 @@ + + + + + {{ cancelamento.numero_nfse }} + + {{ cancelamento.cnpj_prestador }} + + {{ cancelamento.inscricao_municipal }} + {{ cancelamento.cidade }} + + {{ cancelamento.codigo_cancelamento }} + + + diff --git a/pytrustnfe/nfse/natal/templates/consultarLoteRps.xml b/pytrustnfe/nfse/natal/templates/consultarLoteRps.xml new file mode 100644 index 0000000..7e4df96 --- /dev/null +++ b/pytrustnfe/nfse/natal/templates/consultarLoteRps.xml @@ -0,0 +1,7 @@ + + + {{ consulta.cnpj_prestador }} + {{ consulta.inscricao_municipal }} + + {{ consulta.protocolo }} + diff --git a/pytrustnfe/nfse/natal/templates/recepcionarLoteRps.xml b/pytrustnfe/nfse/natal/templates/recepcionarLoteRps.xml new file mode 100644 index 0000000..0756b0e --- /dev/null +++ b/pytrustnfe/nfse/natal/templates/recepcionarLoteRps.xml @@ -0,0 +1,13 @@ + + + {{ nfse.numero_lote }} + {{ nfse.cnpj_prestador }} + {{ nfse.inscricao_municipal }} + {{ nfse.lista_rps|length }} + + {% for rps in nfse.lista_rps -%} + {% include 'Rps.xml' %} + {% endfor %} + + +