6 changed files with 205 additions and 3 deletions
-
81pytrustnfe/nfse/issnet/__init__.py
-
13pytrustnfe/nfse/issnet/templates/CancelarNfse.xml
-
7pytrustnfe/nfse/issnet/templates/ConsultarLoteRps.xml
-
13pytrustnfe/nfse/issnet/templates/RecepcionarLoteRps.xml
-
91pytrustnfe/nfse/issnet/templates/Rps.xml
-
3setup.py
@ -1,3 +1,80 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
# © 2016 Danimar Ribeiro, Trustcode |
|
||||
|
# © 2020 Danimar Ribeiro, Trustcode |
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
# 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 = "" |
||||
|
if method == "RecepcionarLoteRps": |
||||
|
reference = "rps%s" % kwargs["nfse"]["lista_rps"][0]["numero"] |
||||
|
|
||||
|
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://www.issnetonline.com.br/webserviceabrasf/duquedecaxias/servicos.asmx?wsdl" |
||||
|
else: |
||||
|
raise Exception('Não existe ambiente de homologação para este município!') |
||||
|
|
||||
|
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) |
||||
@ -0,0 +1,13 @@ |
|||||
|
<CancelarNfseEnvio xmlns="http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_cancelar_nfse_envio.xsd"> |
||||
|
<Pedido> |
||||
|
<InfPedidoCancelamento> |
||||
|
<IdentificacaoNfse> |
||||
|
<Numero>{{ cancelamento.numero_nfse }}</Numero> |
||||
|
<Cnpj>{{ cancelamento.cnpj_prestador }}</Cnpj> |
||||
|
<InscricaoMunicipal>{{ cancelamento.inscricao_municipal }}</InscricaoMunicipal> |
||||
|
<CodigoMunicipio>{{ cancelamento.cidade }}</CodigoMunicipio> |
||||
|
</IdentificacaoNfse> |
||||
|
<CodigoCancelamento>{{ cancelamento.codigo_cancelamento }}</CodigoCancelamento> |
||||
|
</InfPedidoCancelamento> |
||||
|
</Pedido> |
||||
|
</CancelarNfseEnvio> |
||||
@ -0,0 +1,7 @@ |
|||||
|
<ConsultarLoteRpsEnvio xmlns="http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_consultar_lote_rps_envio.xsd" xmlns:tipos="http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd"> |
||||
|
<Prestador> |
||||
|
<tipos:CpfCnpj><tipos:Cnpj>{{ consulta.cnpj_prestador }}</tipos:Cnpj></tipos:CpfCnpj> |
||||
|
<tipos:InscricaoMunicipal>{{ consulta.inscricao_municipal }}</tipos:InscricaoMunicipal> |
||||
|
</Prestador> |
||||
|
<Protocolo>{{ consulta.protocolo }}</Protocolo> |
||||
|
</ConsultarLoteRpsEnvio> |
||||
@ -0,0 +1,13 @@ |
|||||
|
<EnviarLoteRpsEnvio xmlns="http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_enviar_lote_rps_envio.xsd" xmlns:tipos="http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd"> |
||||
|
<LoteRps Id="lote{{ nfse.numero_lote }}"> |
||||
|
<tipos:NumeroLote>{{ nfse.numero_lote }}</tipos:NumeroLote> |
||||
|
<tipos:CpfCnpj><tipos:Cnpj>{{ nfse.cnpj_prestador }}</tipos:Cnpj></tipos:CpfCnpj> |
||||
|
<tipos:InscricaoMunicipal>{{ nfse.inscricao_municipal }}</tipos:InscricaoMunicipal> |
||||
|
<tipos:QuantidadeRps>{{ nfse.lista_rps|length }}</tipos:QuantidadeRps> |
||||
|
<ListaRps xmlns="http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd"> |
||||
|
{% for rps in nfse.lista_rps -%} |
||||
|
{% include 'Rps.xml' %} |
||||
|
{% endfor %} |
||||
|
</ListaRps> |
||||
|
</LoteRps> |
||||
|
</EnviarLoteRpsEnvio> |
||||
@ -0,0 +1,91 @@ |
|||||
|
<Rps> |
||||
|
<InfRps Id="rps{{ rps.numero }}"> |
||||
|
<IdentificacaoRps> |
||||
|
<Numero>{{ rps.numero }}</Numero> |
||||
|
<Serie>{{ rps.serie }}</Serie> |
||||
|
<Tipo>{{ rps.tipo_rps }}</Tipo> |
||||
|
</IdentificacaoRps> |
||||
|
<DataEmissao>{{ rps.data_emissao }}</DataEmissao> |
||||
|
<NaturezaOperacao>{{ rps.natureza_operacao }}</NaturezaOperacao> |
||||
|
<RegimeEspecialTributacao>{{ rps.regime_tributacao }}</RegimeEspecialTributacao> |
||||
|
<OptanteSimplesNacional>{{ rps.optante_simples }}</OptanteSimplesNacional> |
||||
|
<IncentivadorCultural>{{ rps.incentivador_cultural }}</IncentivadorCultural> |
||||
|
<Status>{{ rps.status }}</Status> |
||||
|
<RpsSubstituido> |
||||
|
<Numero>{{ rps.numero_substituido }}</Numero> |
||||
|
<Serie>{{ rps.serie_substituido }}</Serie> |
||||
|
<Tipo>{{ rps.tipo_substituido }}</Tipo> |
||||
|
</RpsSubstituido> |
||||
|
<Servico> |
||||
|
<Valores> |
||||
|
<ValorServicos>{{ rps.valor_servico }}</ValorServicos> |
||||
|
<ValorDeducoes>{{ rps.valor_deducao }}</ValorDeducoes> |
||||
|
<ValorPis>{{ rps.valor_pis }}</ValorPis> |
||||
|
<ValorCofins>{{ rps.valor_cofins }}</ValorCofins> |
||||
|
<ValorInss>{{ rps.valor_inss }}</ValorInss> |
||||
|
<ValorIr>{{ rps.valor_ir }}</ValorIr> |
||||
|
<ValorCsll>{{ rps.valor_csll }}</ValorCsll> |
||||
|
<IssRetido>{{ rps.iss_retido }}</IssRetido> |
||||
|
<ValorIss>{{ rps.valor_iss }}</ValorIss> |
||||
|
<ValorIssRetido>{{ rps.valor_iss_retido }}</ValorIssRetido> |
||||
|
<OutrasRetencoes>{{ rps.outras_retencoes }}</OutrasRetencoes> |
||||
|
<BaseCalculo>{{ rps.base_calculo }}</BaseCalculo> |
||||
|
<Aliquota>{{ rps.aliquota_issqn }}</Aliquota> |
||||
|
<ValorLiquidoNfse>{{ rps.valor_liquido_nfse }}</ValorLiquidoNfse> |
||||
|
<DescontoIncondicionado>{{ rps.desconto_incondicionado }}</DescontoIncondicionado> |
||||
|
<DescontoCondicionado>{{ rps.desconto_condicionado }}</DescontoCondicionado> |
||||
|
</Valores> |
||||
|
<ItemListaServico>{{ rps.codigo_servico }}</ItemListaServico> |
||||
|
<CodigoCnae>{{ rps.cnae_servico }}</CodigoCnae> |
||||
|
<CodigoTributacaoMunicipio>{{ rps.codigo_tributacao_municipio }}</CodigoTributacaoMunicipio> |
||||
|
<Discriminacao>{{ rps.descricao }}</Discriminacao> |
||||
|
<CodigoMunicipio>{{ rps.codigo_municipio }}</CodigoMunicipio> |
||||
|
</Servico> |
||||
|
<Prestador> |
||||
|
<CpfCnpj><Cnpj>{{ rps.prestador.cnpj }}</Cnpj></CpfCnpj> |
||||
|
<InscricaoMunicipal>{{ rps.prestador.inscricao_municipal }}</InscricaoMunicipal> |
||||
|
</Prestador> |
||||
|
<Tomador> |
||||
|
<IdentificacaoTomador> |
||||
|
<CpfCnpj> |
||||
|
{% if rps.tomador.cnpj_cpf|length == 14 %} |
||||
|
<Cnpj>{{ rps.tomador.cnpj_cpf }}</Cnpj> |
||||
|
{% endif %} |
||||
|
{% if rps.tomador.cnpj_cpf|length == 11 %} |
||||
|
<Cpf>{{ rps.tomador.cnpj_cpf }}</Cpf> |
||||
|
{% endif %} |
||||
|
</CpfCnpj> |
||||
|
<InscricaoMunicipal>{{ rps.tomador.inscricao_municipal }}</InscricaoMunicipal> |
||||
|
</IdentificacaoTomador> |
||||
|
<RazaoSocial>{{ rps.tomador.razao_social }}</RazaoSocial> |
||||
|
<Endereco> |
||||
|
<Endereco>{{ rps.tomador.logradouro }}</Endereco> |
||||
|
<Numero>{{ rps.tomador.numero }}</Numero> |
||||
|
<Complemento>{{ rps.tomador.complemento }}</Complemento> |
||||
|
<Bairro>{{ rps.tomador.bairro }}</Bairro> |
||||
|
<CodigoMunicipio>{{ rps.tomador.cidade }}</CodigoMunicipio> |
||||
|
<Uf>{{ rps.tomador.uf }}</Uf> |
||||
|
<Cep>{{ rps.tomador.cep }}</Cep> |
||||
|
</Endereco> |
||||
|
<Contato> |
||||
|
<Telefone>{{ rps.tomador.telefone }}</Telefone> |
||||
|
<Email>{{ rps.tomador.email }}</Email> |
||||
|
</Contato> |
||||
|
</Tomador> |
||||
|
{% if rps.intermediario is defined -%} |
||||
|
<IntermediarioServico> |
||||
|
<RazaoSocial>{{ rps.intermediario.razao_social }}</RazaoSocial> |
||||
|
<CpfCnpj> |
||||
|
<Cnpj>{{ rps.intermediario.cnpj }}</Cnpj> |
||||
|
</CpfCnpj> |
||||
|
<InscricaoMunicipal>{{ rps.intermediario.inscricao_municipal }}</InscricaoMunicipal> |
||||
|
</IntermediarioServico> |
||||
|
{% endif %} |
||||
|
{% if rps.construcao_civil is defined -%} |
||||
|
<ContrucaoCivil> |
||||
|
<CodigoObra>{{ rps.construcao_civil.codigo_obra }}</CodigoObra> |
||||
|
<Art>{{ rps.construcao_civil.art }}</Art> |
||||
|
</ContrucaoCivil> |
||||
|
{% endif %} |
||||
|
</InfRps> |
||||
|
</Rps> |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue