committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 1637 additions and 1090 deletions
-
8pytrustnfe/Servidores.py
-
700pytrustnfe/nfe/danfe.py
-
61pytrustnfe/nfse/dsf/__init__.py
-
0pytrustnfe/nfse/dsf/templates/cancelar.xml
-
0pytrustnfe/nfse/dsf/templates/consulta_notas.xml
-
0pytrustnfe/nfse/dsf/templates/consultarLote.xml
-
22pytrustnfe/nfse/dsf/templates/consultarNFSeRps.xml
-
0pytrustnfe/nfse/dsf/templates/enviar.xml
-
0pytrustnfe/nfse/dsf/templates/soap_header.xml
-
119pytrustnfe/nfse/floripa/__init__.py
-
7pytrustnfe/nfse/floripa/templates/cancelar_nota.xml
-
40pytrustnfe/nfse/floripa/templates/processar_nota.xml
-
1pytrustnfe/nfse/ginfes/__init__.py
-
2pytrustnfe/nfse/ginfes/templates/Rps.xml
-
76pytrustnfe/nfse/imperial/__init__.py
-
17pytrustnfe/nfse/imperial/templates/CANCELANOTAELETRONICA.xml
-
9pytrustnfe/nfse/imperial/templates/CONSULTANOTASPROTOCOLO.xml
-
9pytrustnfe/nfse/imperial/templates/CONSULTAPROTOCOLO.xml
-
81pytrustnfe/nfse/imperial/templates/PROCESSARPS.xml
-
5pytrustnfe/nfse/imperial/templates/SoapRequest.xml
-
14pytrustnfe/xml/__init__.py
-
6pytrustnfe/xml/filters.py
-
10requirements.txt
-
12setup.py
700
pytrustnfe/nfe/danfe.py
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,22 @@ |
|||||
|
<ns1:ReqConsultaNFSeRPS |
||||
|
xmlns:ns1="http://localhost:8080/WsNFe2/lote" |
||||
|
xmlns:tipos="http://localhost:8080/WsNFe2/tp" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://localhost:8080/WsNFe2/lote http://localhost:8080/WsNFe2/xsd/ReqConsultaNFSeRPS.xsd"> |
||||
|
<Cabecalho> |
||||
|
<CodCidade>{{ nfse.cidade }}</CodCidade> |
||||
|
<CPFCNPJRemetente>{{ nfse.cpf_cnpj }}</CPFCNPJRemetente> |
||||
|
<transacao>true</transacao> |
||||
|
<Versao>1</Versao> |
||||
|
</Cabecalho> |
||||
|
<Lote Id="lote:{{ nfse.lote }}"> |
||||
|
{% for rps in nfse.lista_rps -%} |
||||
|
<RPSConsulta> |
||||
|
<RPS Id="rps:{{ rps.numero }}"> |
||||
|
<InscricaoMunicipalPrestador>{{ rps.prestador.inscricao_municipal }}</InscricaoMunicipalPrestador> |
||||
|
<NumeroRPS>{{ rps.numero }}</NumeroRPS> |
||||
|
<SeriePrestacao>{{ rps.serie_prestacao }}</SeriePrestacao> |
||||
|
</RPS> |
||||
|
</RPSConsulta> |
||||
|
{% endfor %} |
||||
|
</Lote> |
||||
|
</ns1:ReqConsultaNFSeRPS> |
||||
@ -0,0 +1,119 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © 2017 Danimar Ribeiro, Trustcode |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
||||
|
|
||||
|
import os |
||||
|
import hashlib |
||||
|
import base64 |
||||
|
import requests |
||||
|
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 |
||||
|
|
||||
|
URLS = { |
||||
|
'producao': { |
||||
|
'processar_nota': 'https://nfps-e.pmf.sc.gov.br/api/v1/processamento/notas/processa', |
||||
|
'cancelar_nota': 'https://nfps-e.pmf.sc.gov.br/api/v1/cancelamento/notas/cancela' |
||||
|
}, |
||||
|
'homologacao': { |
||||
|
'processar_nota': 'https://nfps-e-hml.pmf.sc.gov.br/api/v1/processamento/notas/processa', |
||||
|
'cancelar_nota': 'https://nfps-e-hml.pmf.sc.gov.br/api/v1/cancelamento/notas/cancela' |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
def _render(certificado, method, **kwargs): |
||||
|
path = os.path.join(os.path.dirname(__file__), 'templates') |
||||
|
xml_send = render_xml(path, '%s.xml' % method, False, **kwargs) |
||||
|
|
||||
|
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, '') |
||||
|
return xml_send |
||||
|
|
||||
|
|
||||
|
def _get_oauth_token(**kwargs): |
||||
|
if kwargs['ambiente'] == 'producao': |
||||
|
url = 'https://nfps-e.pmf.sc.gov.br/api/v1/autenticacao/oauth/token' |
||||
|
else: |
||||
|
url = 'https://nfps-e-hml.pmf.sc.gov.br/api/v1/autenticacao/oauth/token' |
||||
|
|
||||
|
m = hashlib.md5() |
||||
|
secret = "%s:%s" % (kwargs["client_id"], kwargs["secret_id"]) |
||||
|
auth = base64.b64encode(secret.encode('utf-8')) |
||||
|
headers = { |
||||
|
"Content-Type": "application/x-www-form-urlencoded", |
||||
|
"Authorization": "Basic %s" % auth.decode('utf-8').replace('\n', '') |
||||
|
} |
||||
|
m.update(kwargs["password"].encode('utf-8')) |
||||
|
password = m.hexdigest().upper() |
||||
|
|
||||
|
dados = "grant_type=password&username=%s&password=%s&client_id=%s&client_secret=%s" % ( |
||||
|
kwargs["username"], password, kwargs["client_id"], kwargs["secret_id"]) |
||||
|
r = requests.post(url, data=dados, headers=headers) |
||||
|
if r.status_code == 200: |
||||
|
return r.json() |
||||
|
else: |
||||
|
return r.json() |
||||
|
|
||||
|
|
||||
|
def _send(certificado, method, **kwargs): |
||||
|
url = URLS[kwargs['ambiente']][method] |
||||
|
xml_send = kwargs['xml'] |
||||
|
|
||||
|
token = _get_oauth_token(**kwargs) |
||||
|
if "access_token" not in token: |
||||
|
raise Exception("%s - %s: %s" % (token["status"], token["error"], |
||||
|
token["message"])) |
||||
|
kwargs.update({"numero": 1, 'access_token': token["access_token"]}) |
||||
|
|
||||
|
headers = {"Accept": "application/xml;charset=UTF-8", |
||||
|
"Content-Type": "application/xml", |
||||
|
"Authorization": "Bearer %s" % kwargs['access_token']} |
||||
|
r = requests.post(url, headers=headers, data=xml_send) |
||||
|
|
||||
|
response, obj = sanitize_response(r.text.strip().encode('utf-8')) |
||||
|
return { |
||||
|
'sent_xml': xml_send, |
||||
|
'received_xml': response, |
||||
|
'object': obj, |
||||
|
'status_code': r.status_code, |
||||
|
} |
||||
|
|
||||
|
|
||||
|
def xml_processar_nota(certificado, **kwargs): |
||||
|
return _render(certificado, 'processar_nota', **kwargs) |
||||
|
|
||||
|
|
||||
|
def processar_nota(certificado, **kwargs): |
||||
|
if "xml" not in kwargs: |
||||
|
kwargs['xml'] = xml_processar_nota(certificado, **kwargs) |
||||
|
return _send(certificado, 'processar_nota', **kwargs) |
||||
|
|
||||
|
|
||||
|
def xml_cancelar_nota(certificado, **kwargs): |
||||
|
return _render(certificado, 'cancelar_nota', **kwargs) |
||||
|
|
||||
|
|
||||
|
def cancelar_nota(certificado, **kwargs): |
||||
|
if "xml" not in kwargs: |
||||
|
kwargs['xml'] = xml_cancelar_nota(certificado, **kwargs) |
||||
|
return _send(certificado, 'cancelar_nota', **kwargs) |
||||
|
|
||||
|
|
||||
|
def consultar_nota(certificado, **kwargs): |
||||
|
if kwargs['ambiente'] == 'producao': |
||||
|
url = "https://nfps-e.pmf.sc.gov.br/api/v1/consultas/notas/numero/%s" % (kwargs["numero"]) |
||||
|
else: |
||||
|
url = "https://nfps-e-hml.pmf.sc.gov.br/api/v1/consultas/notas/numero/%s" % (kwargs["numero"]) |
||||
|
|
||||
|
headers = {"Accept": "application/json", |
||||
|
"Authorization": "Bearer %s" % kwargs['access_token']} |
||||
|
r = requests.get(url, headers=headers) |
||||
|
print(r.status_code) |
||||
|
if r.status_code == 200: |
||||
|
return r.text |
||||
|
else: |
||||
|
return r.text |
||||
@ -0,0 +1,7 @@ |
|||||
|
<?xml version="1.0"?> |
||||
|
<xmlCancelamentoNfpse> |
||||
|
<motivoCancelamento>{{ cancelamento.motivo }}</motivoCancelamento> |
||||
|
<nuAedf>{{ cancelamento.aedf }}</nuAedf> |
||||
|
<nuNotaFiscal>{{ cancelamento.numero }}</nuNotaFiscal> |
||||
|
<codigoVerificacao>{{ cancelamento.codigo_verificacao }}</codigoVerificacao> |
||||
|
</xmlCancelamentoNfpse> |
||||
@ -0,0 +1,40 @@ |
|||||
|
<?xml version="1.0"?> |
||||
|
<xmlProcessamentoNfpse> |
||||
|
<bairroTomador>{{ rps.tomador.bairro|normalize|escape }}</bairroTomador> |
||||
|
<baseCalculo>{{ rps.base_calculo }}</baseCalculo> |
||||
|
<baseCalculoSubstituicao>0.0</baseCalculoSubstituicao> |
||||
|
<cfps>{{ rps.cfps }}</cfps> |
||||
|
<codigoMunicipioTomador>{{ rps.tomador.cidade }}</codigoMunicipioTomador> |
||||
|
<codigoPostalTomador>{{ rps.tomador.cep }}</codigoPostalTomador> |
||||
|
<complementoEnderecoTomador>{{ rps.tomador.complemento|normalize|escape }}</complementoEnderecoTomador> |
||||
|
<dadosAdicionais>{{ rps.observacoes|normalize|escape }}</dadosAdicionais> |
||||
|
<dataEmissao>{{ rps.data_emissao }}</dataEmissao> |
||||
|
<emailTomador>{{ rps.tomador.email }}</emailTomador> |
||||
|
<identificacao>{{ rps.numero }}</identificacao> |
||||
|
<identificacaoTomador>{{ rps.tomador.cnpj_cpf }}</identificacaoTomador> |
||||
|
<inscricaoMunicipalTomador>{{ rps.tomador.inscricao_municipal }}</inscricaoMunicipalTomador> |
||||
|
<itensServico> |
||||
|
{% for item in rps.itens_servico -%} |
||||
|
<itemServico> |
||||
|
<aliquota>{{ item.aliquota }}</aliquota> |
||||
|
<cst>{{ item.cst_servico }}</cst> |
||||
|
<descricaoServico>{{ item.descricao|normalize|escape }}</descricaoServico> |
||||
|
<idCNAE>{{ item.cnae }}</idCNAE> |
||||
|
<quantidade>{{ item.quantidade }}</quantidade> |
||||
|
<valorTotal>{{ item.valor_total }}</valorTotal> |
||||
|
<valorUnitario>{{ item.valor_unitario }}</valorUnitario> |
||||
|
</itemServico> |
||||
|
{% endfor %} |
||||
|
</itensServico> |
||||
|
<logradouroTomador>{{ rps.tomador.logradouro|normalize|escape }}</logradouroTomador> |
||||
|
<nomeMunicipioTomador></nomeMunicipioTomador> |
||||
|
<numeroAEDF>{{ rps.aedf }}</numeroAEDF> |
||||
|
<numeroEnderecoTomador>{{ rps.tomador.numero }}</numeroEnderecoTomador> |
||||
|
<paisTomador>1058</paisTomador> |
||||
|
<razaoSocialTomador>{{ rps.tomador.razao_social|normalize|escape }}</razaoSocialTomador> |
||||
|
<telefoneTomador>{{ rps.tomador.telefone }}</telefoneTomador> |
||||
|
<ufTomador>{{ rps.tomador.uf }}</ufTomador> |
||||
|
<valorISSQN>{{rps.valor_issqn }}</valorISSQN> |
||||
|
<valorISSQNSubstituicao>0.0</valorISSQNSubstituicao> |
||||
|
<valorTotalServicos>{{ rps.valor_total }}</valorTotalServicos> |
||||
|
</xmlProcessamentoNfpse> |
||||
@ -0,0 +1,76 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © 2016 Danimar Ribeiro, Trustcode |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
||||
|
|
||||
|
import os |
||||
|
from lxml import etree |
||||
|
from pytrustnfe import HttpClient |
||||
|
from pytrustnfe.xml import render_xml, sanitize_response |
||||
|
|
||||
|
|
||||
|
def _render(certificado, method, **kwargs): |
||||
|
path = os.path.join(os.path.dirname(__file__), 'templates') |
||||
|
xml_send = render_xml(path, '%s.xml' % method, True, **kwargs) |
||||
|
return etree.tostring(xml_send) |
||||
|
|
||||
|
|
||||
|
def _send(certificado, method, **kwargs): |
||||
|
base_url = '' |
||||
|
if kwargs['ambiente'] == 'producao': |
||||
|
base_url = 'https://nfe.etransparencia.com.br/rj.petropolis/webservice/aws_nfe.aspx' # noqa |
||||
|
else: |
||||
|
base_url = 'https://nfehomologacao.etransparencia.com.br/rj.petropolis/webservice/aws_nfe.aspx' # noqa |
||||
|
|
||||
|
xml_send = kwargs["xml"] |
||||
|
path = os.path.join(os.path.dirname(__file__), 'templates') |
||||
|
soap = render_xml(path, 'SoapRequest.xml', False, soap_body=xml_send) |
||||
|
|
||||
|
client = HttpClient(base_url) |
||||
|
response = client.post_soap(soap, 'NFeaction/AWS_NFE.%s' % method) |
||||
|
|
||||
|
response, obj = sanitize_response(response) |
||||
|
return { |
||||
|
'sent_xml': xml_send, |
||||
|
'received_xml': response, |
||||
|
'object': obj |
||||
|
} |
||||
|
|
||||
|
|
||||
|
def xml_processa_rps(certificado, **kwargs): |
||||
|
return _render(certificado, 'PROCESSARPS', **kwargs) |
||||
|
|
||||
|
|
||||
|
def processa_rps(certificado, **kwargs): |
||||
|
if "xml" not in kwargs: |
||||
|
kwargs['xml'] = xml_processa_rps(certificado, **kwargs) |
||||
|
return _send(certificado, 'PROCESSARPS', **kwargs) |
||||
|
|
||||
|
|
||||
|
def xml_consulta_protocolo(certificado, **kwargs): |
||||
|
return _render(certificado, 'CONSULTAPROTOCOLO', **kwargs) |
||||
|
|
||||
|
|
||||
|
def consulta_protocolo(certificado, **kwargs): |
||||
|
if "xml" not in kwargs: |
||||
|
kwargs['xml'] = xml_consulta_protocolo(certificado, **kwargs) |
||||
|
return _send(certificado, 'CONSULTAPROTOCOLO', **kwargs) |
||||
|
|
||||
|
|
||||
|
def xml_consulta_notas_protocolo(certificado, **kwargs): |
||||
|
return _render(certificado, 'CONSULTANOTASPROTOCOLO', **kwargs) |
||||
|
|
||||
|
|
||||
|
def consulta_notas_protocolo(certificado, **kwargs): |
||||
|
if "xml" not in kwargs: |
||||
|
kwargs['xml'] = xml_consulta_notas_protocolo(certificado, **kwargs) |
||||
|
return _send(certificado, 'CONSULTANOTASPROTOCOLO', **kwargs) |
||||
|
|
||||
|
|
||||
|
def xml_cancelar_nfse(certificado, **kwargs): |
||||
|
return _render(certificado, 'CANCELANOTAELETRONICA', **kwargs) |
||||
|
|
||||
|
|
||||
|
def cancelar_nfse(certificado, **kwargs): |
||||
|
if "xml" not in kwargs: |
||||
|
kwargs['xml'] = xml_cancelar_nfse(certificado, **kwargs) |
||||
|
return _send(certificado, 'CANCELANOTAELETRONICA', **kwargs) |
||||
@ -0,0 +1,17 @@ |
|||||
|
<ws_nfe.CANCELANOTAELETRONICA xmlns="NFe"> |
||||
|
<Sdt_cancelanfe> |
||||
|
<Login> |
||||
|
<CodigoUsuario>{{ cancelamento.codigo_usuario }}</CodigoUsuario> |
||||
|
<CodigoContribuinte>{{ cancelamento.codigo_contribuinte }}</CodigoContribuinte> |
||||
|
</Login> |
||||
|
<Nota> |
||||
|
<SerieNota>{{ cancelamento.serie_nota }}</SerieNota> |
||||
|
<NumeroNota>{{ cancelamento.numero_nota }}</NumeroNota> |
||||
|
<SerieRPS>{{ cancelamento.serie_rps }}</SerieRPS> |
||||
|
<NumeroRps>{{ cancelamento.numero_rps }}</NumeroRps> |
||||
|
<ValorNota>{{ cancelamento.valor }}</ValorNota> |
||||
|
<MotivoCancelamento>{{ cancelamento.motivo }}</MotivoCancelamento> |
||||
|
<PodeCancelarGuia>{{ cancelamento.cancelar_guia }}</PodeCancelarGuia> |
||||
|
</Nota> |
||||
|
</Sdt_cancelanfe> |
||||
|
</ws_nfe.CANCELANOTAELETRONICA> |
||||
@ -0,0 +1,9 @@ |
|||||
|
<ws_nfe.CONSULTANOTASPROTOCOLO xmlns="NFe"> |
||||
|
<Sdt_consultanotasprotocoloin> |
||||
|
<Protocolo>{{ consulta.protocolo }}</Protocolo> |
||||
|
<Login> |
||||
|
<CodigoUsuario>{{ consulta.codigo_usuario }}</CodigoUsuario> |
||||
|
<CodigoContribuinte>{{ consulta.codigo_contribuinte }}</CodigoContribuinte> |
||||
|
</Login> |
||||
|
</Sdt_consultanotasprotocoloin> |
||||
|
</ws_nfe.CONSULTANOTASPROTOCOLO> |
||||
@ -0,0 +1,9 @@ |
|||||
|
<ws_nfe.CONSULTAPROTOCOLO xmlns="NFe"> |
||||
|
<Sdt_consultaprotocoloin> |
||||
|
<Protocolo>{{ consulta.protocolo }}</Protocolo> |
||||
|
<Login> |
||||
|
<CodigoUsuario>{{ consulta.codigo_usuario }}</CodigoUsuario> |
||||
|
<CodigoContribuinte>{{ consulta.codigo_contribuinte }}</CodigoContribuinte> |
||||
|
</Login> |
||||
|
</Sdt_consultaprotocoloin> |
||||
|
</ws_nfe.CONSULTAPROTOCOLO> |
||||
@ -0,0 +1,81 @@ |
|||||
|
<ws_nfe.PROCESSARPS xmlns="NFe"> |
||||
|
<Sdt_processarpsin> |
||||
|
<Login> |
||||
|
<CodigoUsuario>{{ nfse.codigo_usuario }}</CodigoUsuario> |
||||
|
<CodigoContribuinte>{{ nfse.codigo_contribuinte }}</CodigoContribuinte> |
||||
|
</Login> |
||||
|
<SDTRPS> |
||||
|
<Ano>{{ nfse.ano }}</Ano> |
||||
|
<Mes>{{ nfse.mes }}</Mes> |
||||
|
<CPFCNPJ>{{ nfse.cnpj_prestador }}</CPFCNPJ> |
||||
|
<DTIni>{{ nfse.data_emissao }}</DTIni> |
||||
|
<DTFin>{{ nfse.data_emissao }}</DTFin> |
||||
|
<TipoTrib>{{ nfse.tipo_tributacao }}</TipoTrib> |
||||
|
<DtAdeSN>{{ nfse.data_adesao_simples }}</DtAdeSN> |
||||
|
<AlqIssSN_IP>{{ nfse.aliquota_simples_isencao|comma }}</AlqIssSN_IP> |
||||
|
<Versao>2.00</Versao> |
||||
|
{% for rps in nfse.lista_rps -%} |
||||
|
<Reg20> |
||||
|
<!-- Optional --> |
||||
|
<Reg20Item> |
||||
|
<TipoNFS>{{ rps.tipo_nfse }}</TipoNFS> |
||||
|
<NumRps>{{ rps.numero }}</NumRps> |
||||
|
<SerRps>{{ rps.serie }}</SerRps> |
||||
|
<DtEmi>{{ rps.data_emissao }}</DtEmi> |
||||
|
<RetFonte>{{ rps.iss_retido }}</RetFonte> |
||||
|
<CodSrv>{{ rps.codigo_servico }}</CodSrv> |
||||
|
<DiscrSrv>{{ rps.descricao}}</DiscrSrv> |
||||
|
<VlNFS>{{ rps.valor_liquido_nfse|comma }}</VlNFS> |
||||
|
<VlDed>{{ rps.valor_deducao|comma }}</VlDed> |
||||
|
<DiscrDed>{{ rps.discriminacao_deducao }}</DiscrDed> |
||||
|
<VlBasCalc>{{ rps.base_calculo|comma }}</VlBasCalc> |
||||
|
<AlqIss>{{ rps.aliquota_issqn|comma }}</AlqIss> |
||||
|
<VlIss>{{ rps.valor_iss|comma }}</VlIss> |
||||
|
<VlIssRet>{{ rps.valor_iss_retido|comma }}</VlIssRet> |
||||
|
<CpfCnpTom>{{ rps.tomador.cnpj_cpf }}</CpfCnpTom> |
||||
|
<RazSocTom>{{ rps.tomador.razao_social }}</RazSocTom> |
||||
|
<TipoLogtom>{{ rps.tomador.tipo_logradouro }}</TipoLogtom> |
||||
|
<LogTom>{{ rps.tomador.logradouro }}</LogTom> |
||||
|
<NumEndTom>{{ rps.tomador.numero }}</NumEndTom> |
||||
|
<ComplEndTom>{{ rps.tomador.complemento }}</ComplEndTom> |
||||
|
<BairroTom>{{ rps.tomador.bairro }}</BairroTom> |
||||
|
<MunTom>{{ rps.tomador.municipio }}</MunTom> |
||||
|
<SiglaUFTom>{{ rps.tomador.uf }}</SiglaUFTom> |
||||
|
<CepTom>{{ rps.tomador.cep }}</CepTom> |
||||
|
<Telefone>{{ rps.tomador.telefone }}</Telefone> |
||||
|
<InscricaoMunicipal>{{ rps.tomador.inscricao_municipal }}</InscricaoMunicipal> |
||||
|
{% if rps.local_prestacao == 'prestador' %} |
||||
|
<TipoLogLocPre>{{ rps.prestador.tipo_logradouro }}</TipoLogLocPre> |
||||
|
<LogLocPre>{{ rps.prestador.logradouro }}</LogLocPre> |
||||
|
<NumEndLocPre>{{ rps.prestador.numero }}</NumEndLocPre> |
||||
|
<ComplEndLocPre>{{ rps.prestador.complemento }}</ComplEndLocPre> |
||||
|
<BairroLocPre>{{ rps.prestador.bairro }}</BairroLocPre> |
||||
|
<MunLocPre>{{ rps.prestador.municipio }}</MunLocPre> |
||||
|
<SiglaUFLocpre>{{ rps.prestador.uf }}</SiglaUFLocpre> |
||||
|
<CepLocPre>{{ rps.prestador.cep }}</CepLocPre> |
||||
|
{% endif %} |
||||
|
<Email1>{{ rps.tomador.email }}</Email1> |
||||
|
{% for imposto in rps.impostos -%} |
||||
|
<Reg30> |
||||
|
<Reg30Item> |
||||
|
<TributoSigla>{{ imposto.sigla }}</TributoSigla> |
||||
|
<TributoAliquota>{{ imposto.aliquota|comma }}</TributoAliquota> |
||||
|
<TributoValor>{{ imposto.valor|comma }}</TributoValor> |
||||
|
</Reg30Item> |
||||
|
</Reg30> |
||||
|
{% endfor %} |
||||
|
</Reg20Item> |
||||
|
</Reg20> |
||||
|
{% endfor %} |
||||
|
<Reg90> |
||||
|
<QtdRegNormal>{{ nfse.lista_rps|length }}</QtdRegNormal> |
||||
|
<ValorNFS>{{ nfse.lista_rps|sum(attribute='valor_liquido_nfse')|comma }}</ValorNFS> |
||||
|
<ValorISS>{{ nfse.lista_rps|sum(attribute='valor_iss')|comma }}</ValorISS> |
||||
|
<ValorDed>{{ nfse.lista_rps|sum(attribute='valor_deducao')|comma }}</ValorDed> |
||||
|
<ValorIssRetTom>{{ nfse.lista_rps|sum(attribute='valor_iss_retido')|comma }}</ValorIssRetTom> |
||||
|
<QtdReg30>{{ nfse.quantidade_impostos }}</QtdReg30> |
||||
|
<ValorTributos>{{ nfse.valor_tributos|comma }}</ValorTributos> |
||||
|
</Reg90> |
||||
|
</SDTRPS> |
||||
|
</Sdt_processarpsin> |
||||
|
</ws_nfe.PROCESSARPS> |
||||
@ -0,0 +1,5 @@ |
|||||
|
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"> |
||||
|
<Body> |
||||
|
{{ soap_body }} |
||||
|
</Body> |
||||
|
</Envelope> |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue