diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py
index 7482c6f..543ca03 100644
--- a/pytrustnfe/Servidores.py
+++ b/pytrustnfe/Servidores.py
@@ -142,7 +142,7 @@ SVRS = {
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', # noqa
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa
- WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx?wsdl', # noqa
+ WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl', # noqa
}
},
NFCE_MODELO: {
diff --git a/pytrustnfe/nfe/danfce.py b/pytrustnfe/nfe/danfce.py
index 7773798..9e64c24 100644
--- a/pytrustnfe/nfe/danfce.py
+++ b/pytrustnfe/nfe/danfce.py
@@ -122,16 +122,24 @@ class danfce(object):
self._drawCenteredParagraph(cEnd)
self.drawLine()
- def danfce_information(self):
- self.drawTitle(
- "DANFE NFC-e - Documento Auxiliar da Nota Fiscal de",
- 7, 'NimbusSanL-Bold')
+ def danfce_information(self, oXML=None):
+ el_ide = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}ide")
+ tipo_emissao = tagtext(oNode=el_ide, cTag='tpEmis')
+ if tipo_emissao in ('5', '9'):
+ self.current_height -= 5
+ self.drawTitle("EMITIDA EM CONTINGÊNCIA",9, 'NimbusSanL-Bold')
+ self.drawTitle("Pendente de autorização", 7, 'NimbusSanL-Bold')
+ self.drawLine()
+ else:
+ self.drawTitle(
+ "DANFE NFC-e - Documento Auxiliar da Nota Fiscal de",
+ 7, 'NimbusSanL-Bold')
- self.drawTitle("Consumidor Eletrônica", 7, 'NimbusSanL-Bold')
+ self.drawTitle("Consumidor Eletrônica", 7, 'NimbusSanL-Bold')
- self.drawString(
- "NFC-e não permite aproveitamento de crédito de ICMS", True)
- self.drawLine()
+ self.drawString(
+ "NFC-e não permite aproveitamento de crédito de ICMS", True)
+ self.drawLine()
def produtos(self, oXML=None, el_det=None, oPaginator=None,
list_desc=None, list_cod_prod=None):
@@ -309,18 +317,26 @@ class danfce(object):
dataSolicitacao = getdateUTC(tagtext(oNode=el_ide, cTag="dhEmi"))
dataSolicitacao = dataSolicitacao[0] + " " + dataSolicitacao[1]
- numProtocolo = tagtext(oNode=el_prot_nfe, cTag="nProt")
+ text = u"%s
%s
NFC-e nº%s Série %s %s
" % (
+ frase_chave_acesso, cnpj_cpf, nNFC, serie, dataSolicitacao)
- dataAutorizacao = getdateUTC(tagtext(oNode=el_prot_nfe,
- cTag='dhRecbto'))
- dataAutorizacao = dataAutorizacao[0] + " " + dataAutorizacao[1]
+ self._drawCenteredParagraph(text)
+
+ tipo_emissao = tagtext(oNode=el_ide, cTag='tpEmis')
+ if tipo_emissao in ('5', '9'):
+ self.current_height -= 8
+ self.drawTitle("EMITIDA EM CONTINGÊNCIA",9, 'NimbusSanL-Bold')
+ self.drawTitle("Pendente de autorização - Via Consumidor", 7, 'NimbusSanL-Bold')
+ else:
+ numProtocolo = tagtext(oNode=el_prot_nfe, cTag="nProt")
- text = u"%s
%s
NFC-e nº%s Série %s %s
\
-Protocolo de autorização: %s
Data de autorização %s
\
-" % (frase_chave_acesso, cnpj_cpf, nNFC, serie, dataSolicitacao,
- numProtocolo, dataAutorizacao)
+ dataAutorizacao = getdateUTC(tagtext(oNode=el_prot_nfe,
+ cTag='dhRecbto'))
+ dataAutorizacao = dataAutorizacao[0] + " " + dataAutorizacao[1]
- self._drawCenteredParagraph(text)
+ text = "Protocolo de autorização: %s
Data de autorização %s
" % (
+ numProtocolo, dataAutorizacao)
+ self._drawCenteredParagraph(text)
self.draw_qr_code(qrcode)
@@ -428,7 +444,7 @@ Protocolo de autorização: %s
Data de autorização %s
\
self.ide_emit(oXML=oXML)
# self.destinatario(oXML=oXML)
- self.danfce_information()
+ self.danfce_information(oXML=oXML)
self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPaginator[0],
list_desc=list_desc, list_cod_prod=list_cod_prod)
diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py
index 54ea885..9cbeea1 100644
--- a/pytrustnfe/nfe/danfe.py
+++ b/pytrustnfe/nfe/danfe.py
@@ -359,7 +359,7 @@ class danfe(object):
self.canvas.restoreState()
# Cancelado
- if tagtext(oNode=elem_evento, cTag='cStat') == '135':
+ if tagtext(oNode=elem_evento, cTag='cStat') in ('135', '155'):
self.canvas.saveState()
self.canvas.rotate(45)
self.canvas.setFont('NimbusSanL-Bold', 60)
diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml
index 84dc8f5..ce72360 100644
--- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml
+++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml
@@ -27,7 +27,7 @@
{{ ide.indFinal }}
{{ ide.indPres }}
{{ ide.procEmi }}
- Odoo Brasil 10
+ {{ ide.verProc }}
{% if ide.tpEmis != 1 %}
{{ ide.dhCont }}
{{ ide.xJust }}
@@ -263,9 +263,7 @@
{% endfor %}
{% endif %}
- {% if NFe.infNFe.compra is defined %}
- {{ NFe.infNFe.compra.xPed }}
- {% endif %}
+ {{ prod.xPed }}
{{ prod.nItemPed }}
{{ prod.nFCI }}
{% for rastro in prod.rastro %}
diff --git a/pytrustnfe/nfse/aparecida/__init__.py b/pytrustnfe/nfse/aparecida/__init__.py
new file mode 100644
index 0000000..9e063ec
--- /dev/null
+++ b/pytrustnfe/nfse/aparecida/__init__.py
@@ -0,0 +1,81 @@
+# © 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 _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/aparecida/templates/Rps.xml b/pytrustnfe/nfse/aparecida/templates/Rps.xml
new file mode 100644
index 0000000..d366389
--- /dev/null
+++ b/pytrustnfe/nfse/aparecida/templates/Rps.xml
@@ -0,0 +1,91 @@
+
+
+
+ {{ rps.numero }}
+ {{ rps.serie }}
+ {{ rps.tipo_rps }}
+
+ {{ rps.data_emissao }}
+ {{ rps.natureza_operacao }}
+ {{ rps.regime_tributacao }}
+ {{ rps.optante_simples }}
+ {{ rps.incentivador_cultural }}
+ {{ rps.status }}
+
+ {{ rps.numero_substituido }}
+ {{ rps.serie_substituido }}
+ {{ rps.tipo_substituido }}
+
+
+
+ {{ rps.valor_servico }}
+ {{ rps.valor_deducao }}
+ {{ rps.valor_pis }}
+ {{ rps.valor_cofins }}
+ {{ rps.valor_inss }}
+ {{ rps.valor_ir }}
+ {{ rps.valor_csll }}
+ {{ rps.iss_retido }}
+ {{ rps.valor_iss }}
+ {{ rps.valor_iss_retido }}
+ {{ rps.outras_retencoes }}
+ {{ rps.base_calculo }}
+ {{ rps.aliquota_issqn }}
+ {{ rps.valor_liquido_nfse }}
+ {{ rps.desconto_incondicionado }}
+ {{ rps.desconto_condicionado }}
+
+ {{ rps.codigo_servico }}
+ {{ rps.cnae_servico }}
+ {{ rps.codigo_tributacao_municipio }}
+ {{ rps.descricao }}
+ {{ rps.codigo_municipio }}
+
+
+ {{ rps.prestador.cnpj }}
+ {{ rps.prestador.inscricao_municipal }}
+
+
+
+
+ {% if rps.tomador.cnpj_cpf|length == 14 %}
+ {{ rps.tomador.cnpj_cpf }}
+ {% endif %}
+ {% if rps.tomador.cnpj_cpf|length == 11 %}
+ {{ rps.tomador.cnpj_cpf }}
+ {% endif %}
+
+ {{ rps.tomador.inscricao_municipal }}
+
+ {{ rps.tomador.razao_social }}
+
+ {{ rps.tomador.logradouro }}
+ {{ rps.tomador.numero }}
+ {{ rps.tomador.complemento }}
+ {{ rps.tomador.bairro }}
+ {{ rps.tomador.cidade }}
+ {{ rps.tomador.uf }}
+ {{ rps.tomador.cep }}
+
+
+ {{ rps.tomador.telefone }}
+ {{ rps.tomador.email }}
+
+
+ {% 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/aparecida/templates/cancelarNfse.xml b/pytrustnfe/nfse/aparecida/templates/cancelarNfse.xml
new file mode 100644
index 0000000..f5ec25b
--- /dev/null
+++ b/pytrustnfe/nfse/aparecida/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/aparecida/templates/consultarLoteRps.xml b/pytrustnfe/nfse/aparecida/templates/consultarLoteRps.xml
new file mode 100644
index 0000000..7e4df96
--- /dev/null
+++ b/pytrustnfe/nfse/aparecida/templates/consultarLoteRps.xml
@@ -0,0 +1,7 @@
+
+
+ {{ consulta.cnpj_prestador }}
+ {{ consulta.inscricao_municipal }}
+
+ {{ consulta.protocolo }}
+
diff --git a/pytrustnfe/nfse/aparecida/templates/recepcionarLoteRps.xml b/pytrustnfe/nfse/aparecida/templates/recepcionarLoteRps.xml
new file mode 100644
index 0000000..78dcaff
--- /dev/null
+++ b/pytrustnfe/nfse/aparecida/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 %}
+
+
+
diff --git a/pytrustnfe/nfse/simpliss/__init__.py b/pytrustnfe/nfse/simpliss/__init__.py
index 62daa4a..b93bd2d 100644
--- a/pytrustnfe/nfse/simpliss/__init__.py
+++ b/pytrustnfe/nfse/simpliss/__init__.py
@@ -40,7 +40,7 @@ def _send(method, **kwargs):
base_url = 'http://wshomologacao.simplissweb.com.br/nfseservice.svc' # noqa
base_url = 'http://wshomologacao.simplissweb.com.br/nfseservice.svc'
- xml_send = kwargs["xml"].replace('', '')
+ xml_send = kwargs["xml"]
path = os.path.join(os.path.dirname(__file__), 'templates')
soap = render_xml(path, 'SoapRequest.xml', False, soap_body=xml_send)
diff --git a/setup.py b/setup.py
index 9bb22a2..6ecb618 100644
--- a/setup.py
+++ b/setup.py
@@ -1,8 +1,7 @@
# coding=utf-8
from setuptools import setup, find_packages
-
-VERSION = "1.0.41"
+VERSION = "1.0.44"
setup(
@@ -39,6 +38,7 @@ later (LGPLv2+)',
'nfse/carioca/templates/*xml',
'nfse/bh/templates/*xml',
'nfse/mga/templates/*xml',
+ 'nfse/aparecida/templates/*xml',
'xml/schemas/*xsd',
]},
url='https://github.com/danimaribeiro/PyTrustNFe',
diff --git a/tests/test_servidores.py b/tests/test_servidores.py
index a072f97..e83ac1a 100644
--- a/tests/test_servidores.py
+++ b/tests/test_servidores.py
@@ -21,7 +21,7 @@ url_rs = 'https://nfe.sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao4.asmx?w
url_cad_rs = 'https://cad.sefazrs.rs.gov.br/ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl'
url_cad_sc = 'https://cad.svrs.rs.gov.br/ws/cadconsultacadastro/cadconsulta\
-cadastro2.asmx?wsdl'
+cadastro4.asmx?wsdl'
class test_servidores(unittest.TestCase):