Browse Source

[WIP] Implementa NFS-e Campinas

pull/82/head
Fábio Luna 8 years ago
committed by Danimar Ribeiro
parent
commit
c2e2d1ed46
  1. 80
      pytrustnfe/nfse/campinas/__init__.py
  2. 30
      pytrustnfe/nfse/campinas/templates/ConsultaSeqRps.xsd
  3. 10
      pytrustnfe/nfse/campinas/templates/ConsultarLote.xml
  4. 46
      pytrustnfe/nfse/campinas/templates/ConsultarLote.xsd
  5. 18
      pytrustnfe/nfse/campinas/templates/cancelar.xml
  6. 55
      pytrustnfe/nfse/campinas/templates/cancelar.xsd
  7. 11
      pytrustnfe/nfse/campinas/templates/consulta_notas.xml
  8. 88
      pytrustnfe/nfse/campinas/templates/consulta_notas.xsd
  9. 19
      pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xml
  10. 55
      pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xsd
  11. 108
      pytrustnfe/nfse/campinas/templates/enviar.xml
  12. 149
      pytrustnfe/nfse/campinas/templates/enviar.xsd
  13. 12
      pytrustnfe/nfse/campinas/templates/soap_header.xml

80
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)

30
pytrustnfe/nfse/campinas/templates/ConsultaSeqRps.xsd

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:tipos="http://localhost:8080/WsNFe2/tp"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ns1="http://localhost:8080/WsNFe2/lote"
targetNamespace="http://localhost:8080/WsNFe2/lote">
<xs:import namespace="http://localhost:8080/WsNFe2/tp"
schemaLocation="Tipos.xsd" />
<xs:element name="ConsultaSeqRps">
<xs:complexType>
<xs:sequence>
<xs:element name="Cabecalho">
<xs:complexType>
<xs:sequence>
<xs:element name="CodCid" type="tipos:tpCodCidade" minOccurs="1" maxOccurs="1"/>
<xs:element name="IMPrestador" type="tipos:tpInscricaoMunicipal" minOccurs="1" maxOccurs="1"/>
<xs:element name="CPFCNPJRemetente" type="tipos:tpCPFCNPJ" minOccurs="1" maxOccurs="1"/>
<xs:element name="SeriePrestacao" type="tipos:tpSeriePrestacao" minOccurs="0" maxOccurs="1"/>
<xs:element name="Versao" type="tipos:tpVersao" fixed="1" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

10
pytrustnfe/nfse/campinas/templates/ConsultarLote.xml

@ -0,0 +1,10 @@
<ns1:ReqConsultaLote 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/ReqConsultaLote.xsd">
<Cabecalho>
<CodCidade>{{ consulta.cidade }}</CodCidade>
<CPFCNPJRemetente>{{ consulta.cpf_cnpj }}</CPFCNPJRemetente>
<Versao>1</Versao>
<NumeroLote>{{ consulta.lote }}</NumeroLote>
</Cabecalho>
</ns1:ReqConsultaLote>

46
pytrustnfe/nfse/campinas/templates/ConsultarLote.xsd

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema
xmlns:tipos="http://localhost:8080/WsNFe2/tp"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ns1="http://localhost:8080/WsNFe2/lote" targetNamespace="http://localhost:8080/WsNFe2/lote">
<xs:import namespace="http://localhost:8080/WsNFe2/tp" schemaLocation="Tipos.xsd"/>
<xs:element name="ReqConsultaLote">
<xs:annotation>
<xs:documentation>Schema utilizado para REQUISIçÂO de Consulta de Lote de RPS.</xs:documentation>
<xs:documentation>Este Schema XML é utilizado pelos Prestadores de serviços para consultarem Lote de RPS emitidos por eles.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Cabecalho">
<xs:annotation>
<xs:documentation>Cabeçalho do pedido.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="CodCidade" type="tipos:tpCodCidade" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe o Codigo da Cidade.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="CPFCNPJRemetente" type="tipos:tpCPFCNPJ" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe o CPF/CNPJ do Remetente autorizado a transmitir a mensagem XML.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Versao" type="tipos:tpVersao" fixed="1" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe a Versão do Schema XML utilizado.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="NumeroLote" type="tipos:tpNumero" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe o Número do Lote a ser consultado.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

18
pytrustnfe/nfse/campinas/templates/cancelar.xml

@ -0,0 +1,18 @@
<ns1:ReqCancelamentoNFSe 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/ReqCancelamentoNFSe.xsd">
<Cabecalho>
<CodCidade>{{ cancelamento.cidade }}</CodCidade>
<CPFCNPJRemetente>{{ cancelamento.cpf_cnpj }}</CPFCNPJRemetente>
<transacao>true</transacao>
<Versao>1</Versao>
</Cabecalho>
<Lote Id="lote:1ABCDZ">
<Nota Id="nota:{{ cancelamento.nota_id }}">
<InscricaoMunicipalPrestador>{{ cancelamento.inscricao_municipal }}</InscricaoMunicipalPrestador>
<NumeroNota>{{ cancelamento.nota_id }}</NumeroNota>
<CodigoVerificacao>{{ cancelamento.assinatura }}</CodigoVerificacao>
<MotivoCancelamento>{{ cancelamento.motivo }}</MotivoCancelamento>
</Nota>
</Lote>
</ns1:ReqCancelamentoNFSe>

55
pytrustnfe/nfse/campinas/templates/cancelar.xsd

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- edited with XMLSpy v2008 sp1 (http://www.altova.com) by Marcel (DSF) -->
<xs:schema xmlns:tipos="http://localhost:8080/WsNFe2/tp"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:ns1="http://localhost:8080/WsNFe2/lote" targetNamespace="http://localhost:8080/WsNFe2/lote">
<xs:import namespace="http://localhost:8080/WsNFe2/tp"
schemaLocation="Tipos.xsd" />
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
schemaLocation="xmldsig-core-schema_v1.01.xsd" />
<xs:element name="ReqCancelamentoNFSe">
<xs:annotation>
<xs:documentation>Schema utilizado para Cancelamento de NFSe.</xs:documentation>
<xs:documentation>Este Schema XML é utilizado pelos Prestadores de serviços cancelarem NFSe emitidas por eles.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Cabecalho">
<xs:annotation>
<xs:documentation>Cabeçalho do pedido.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="CodCidade" type="tipos:tpCodCidade" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe o Codigo da Cidade.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="CPFCNPJRemetente" type="tipos:tpCPFCNPJ" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe o CPF/CNPJ do Remetente autorizado a transmitir a mensagem XML.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="transacao" type="xs:boolean" default="true" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>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.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Versao" type="tipos:tpVersao" fixed="1" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe a Versão do Schema XML utilizado.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Lote" type="tipos:tpLoteCancelamentoNFSe">
<xs:annotation>
<xs:documentation>Detalhe do pedido de cancelamento de NFSe. Cada detalhe deverá conter a Chave de uma NFSe e sua respectiva assinatura de cancelamento.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element ref="ds:Signature" minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

11
pytrustnfe/nfse/campinas/templates/consulta_notas.xml

@ -0,0 +1,11 @@
<ns1:ReqConsultaNotas 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/ReqConsultaNotas.xsd">
<Cabecalho Id="Consulta:notas">
<CodCidade>{{ consulta.cidade }}</CodCidade>
<CPFCNPJRemetente>{{ consulta.cpf_cnpj }}</CPFCNPJRemetente>
<InscricaoMunicipalPrestador>{{ consulta.inscricao_municipal }}</InscricaoMunicipalPrestador>
<dtInicio>{{ consulta.data_inicio }}</dtInicio>
<dtFim>{{ consulta.data_final }}</dtFim>
<NotaInicial>{{ consulta.nota_inicial }}</NotaInicial>
<Versao>1</Versao>
</Cabecalho>
</ns1:ReqConsultaNotas>

88
pytrustnfe/nfse/campinas/templates/consulta_notas.xsd

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tipos="http://localhost:8080/WsNFe2/tp"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:ns1="http://localhost:8080/WsNFe2/lote" targetNamespace="http://localhost:8080/WsNFe2/lote">
<xs:import namespace="http://localhost:8080/WsNFe2/tp"
schemaLocation="Tipos.xsd" />
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
schemaLocation="xmldsig-core-schema_v1.01.xsd" />
<xs:element name="ReqConsultaNotas">
<xs:annotation>
<xs:documentation>Schema utilizado para REQUISIÇAO de consultas
de notas que foram enviadas por lote de RPS.</xs:documentation>
<xs:documentation>Este Schema XML é utilizado pelos prestadores
de serviços para consultas de notas que foram enviadas por lote de
RPS.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Cabecalho">
<xs:annotation>
<xs:documentation>Cabeçalho do pedido.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="CodCidade" type="tipos:tpCodCidade"
minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe o Codigo da Cidade.
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="CPFCNPJRemetente" type="tipos:tpCPFCNPJ"
minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe o CPF/CNPJ do Remetente
autorizado a transmitir a mensagem XML.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="InscricaoMunicipalPrestador" type="tipos:tpInscricaoMunicipal"
minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe a Inscrição Municipal do
Prestador</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="dtInicio" type="xs:date" minOccurs="1"
maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe a data de início do período
transmitido (AAAA-MM-DD).</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="dtFim" type="xs:date" minOccurs="1"
maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe a data final do período
transmitido (AAAA-MM-DD).</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="NotaInicial" type="tipos:tpNumero"
minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:documentation>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.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Versao" type="tipos:tpVersao"
minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe a Versão.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute name="Id" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element ref="ds:Signature" minOccurs="0"
maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

19
pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xml

@ -0,0 +1,19 @@
<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>{{ consulta.cidade }}</CodCidade>
<CPFCNPJRemetente>{{ consulta.cpf_cnpj }}</CPFCNPJRemetente>
<transacao>true</transacao>
<Versao>1</Versao>
</Cabecalho>
<Lote Id="lote:{{ consulta.lote }}">
<RPSConsulta>
<RPS Id="rps:{{ consulta.rps_id }}">
<InscricaoMunicipalPrestador>{{ consulta.inscricao_municipal }}</InscricaoMunicipalPrestador>
<NumeroRPS>{{ consulta.rps_id }}</NumeroRPS>
<SeriePrestacao>{{ consulta.serie_prestacao }}</SeriePrestacao>
</RPS>
</RPSConsulta>
</Lote>
</ns1:ReqConsultaNFSeRPS>

55
pytrustnfe/nfse/campinas/templates/consultarNFSeRps.xsd

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- edited with XMLSpy v2008 sp1 (http://www.altova.com) by Marcel (DSF) -->
<xs:schema xmlns:tipos="http://localhost:8080/WsNFe2/tp"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:ns1="http://localhost:8080/WsNFe2/lote" targetNamespace="http://localhost:8080/WsNFe2/lote">
<xs:import namespace="http://localhost:8080/WsNFe2/tp"
schemaLocation="Tipos.xsd" />
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
schemaLocation="xmldsig-core-schema_v1.01.xsd" />
<xs:element name="ReqConsultaNFSeRPS">
<xs:annotation>
<xs:documentation>Schema utilizado para Consulta de NFSe.</xs:documentation>
<xs:documentation>Este Schema XML é utilizado pelos Prestadores de serviços consultarem NFSe emitidas por eles.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Cabecalho">
<xs:annotation>
<xs:documentation>Cabeçalho do pedido.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="CodCidade" type="tipos:tpCodCidade" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe o Codigo da Cidade.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="CPFCNPJRemetente" type="tipos:tpCPFCNPJ" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe o CPF/CNPJ do Remetente autorizado a transmitir a mensagem XML.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="transacao" type="xs:boolean" default="true" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe se as NF-e a serem consultadas farão parte de uma mesma transação. Informe sempre True.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Versao" type="tipos:tpVersao" fixed="1" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe a Versão do Schema XML utilizado.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Lote" type="tipos:tpLoteConsultaNFSe" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Detalhe do pedido de consulta de NFSe. Cada detalhe deverá conter a Chave de uma NFSe e sua respectiva assinatura de consulta.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element ref="ds:Signature" minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

108
pytrustnfe/nfse/campinas/templates/enviar.xml

@ -0,0 +1,108 @@
<ns1:ReqEnvioLoteRPS 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/ReqEnvioLoteRPS.xsd">
<Cabecalho>
<CodCidade>{{ nfse.cidade }}</CodCidade>
<CPFCNPJRemetente>{{ nfse.cpf_cnpj }}</CPFCNPJRemetente>
<RazaoSocialRemetente>{{ nfse.remetente }}</RazaoSocialRemetente>
<transacao>{{ nfse.transacao }}</transacao>
<dtInicio>{{ nfse.data_inicio|format_date }}</dtInicio>
<dtFim>{{ nfse.data_fim|format_date }}</dtFim>
<QtdRPS>{{ nfse.total_rps }}</QtdRPS>
<ValorTotalServicos>{{ nfse.total_servicos }}</ValorTotalServicos>
<ValorTotalDeducoes>{{ nfse.total_deducoes }}</ValorTotalDeducoes>
<Versao>1</Versao>
<MetodoEnvio>WS</MetodoEnvio>
</Cabecalho>
<Lote Id="{{ nfse.lote_id }}">
{% for rps in nfse.lista_rps -%}
<RPS Id="{{ rps.numero }}">
<Assinatura>{{ rps.assinatura }}</Assinatura>
<InscricaoMunicipalPrestador>{{ rps.prestador.inscricao_municipal }}
</InscricaoMunicipalPrestador>
<RazaoSocialPrestador>{{ rps.prestador.razao_social }}</RazaoSocialPrestador>
<TipoRPS>RPS</TipoRPS>
<SerieRPS>{{ rps.serie }}</SerieRPS>
<NumeroRPS>{{ rps.numero }}</NumeroRPS>
<DataEmissaoRPS>{{ rps.data_emissao|format_datetime }}
</DataEmissaoRPS>
<SituacaoRPS>{{ rps.situacao }}</SituacaoRPS>
<SerieRPSSubstituido></SerieRPSSubstituido>
<NumeroRPSSubstituido>0</NumeroRPSSubstituido>
<NumeroNFSeSubstituida>0</NumeroNFSeSubstituida>
<DataEmissaoNFSeSubstituida>1900-01-01</DataEmissaoNFSeSubstituida>
<SeriePrestacao>{{ rps.serie_prestacao }}</SeriePrestacao>
<InscricaoMunicipalTomador>{{ rps.tomador.inscricao_municipal }}</InscricaoMunicipalTomador>
<CPFCNPJTomador>{{ rps.tomador.cpf_cnpj }}</CPFCNPJTomador>
<RazaoSocialTomador>{{ rps.tomador.razao_social }}
</RazaoSocialTomador>
<TipoLogradouroTomador>{{ rps.tomador.tipo_logradouro }}
</TipoLogradouroTomador>
<LogradouroTomador>{{ rps.tomador.logradouro }}</LogradouroTomador>
<NumeroEnderecoTomador>{{ rps.tomador.numero }}
</NumeroEnderecoTomador>
<TipoBairroTomador>{{ rps.tomador.tipo_bairro }}</TipoBairroTomador>
<BairroTomador>{{ rps.tomador.bairro }}</BairroTomador>
<CidadeTomador>{{ rps.tomador.cidade }}</CidadeTomador>
<CidadeTomadorDescricao>{{ rps.tomador.cidade_descricao }}
</CidadeTomadorDescricao>
<CEPTomador>{{ rps.tomador.cep }}</CEPTomador>
<EmailTomador>{{ rps.tomador.email }}</EmailTomador>
<CodigoAtividade>{{ rps.codigo_atividade }}</CodigoAtividade>
<AliquotaAtividade>{{ rps.aliquota_atividade }}</AliquotaAtividade>
<TipoRecolhimento>{{ rps.tipo_recolhimento }}</TipoRecolhimento>
<MunicipioPrestacao>{{ rps.municipio_prestacao }}
</MunicipioPrestacao>
<MunicipioPrestacaoDescricao>{{ rps.municipio_descricao_prestacao }}
</MunicipioPrestacaoDescricao>
<Operacao>{{ rps.operacao }}</Operacao>
<Tributacao>{{ rps.tributacao }}</Tributacao>
<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>
<AliquotaPIS>{{ rps.aliquota_pis }}</AliquotaPIS>
<AliquotaCOFINS>{{ rps.aliquota_cofins }}</AliquotaCOFINS>
<AliquotaINSS>{{ rps.aliquota_inss }}</AliquotaINSS>
<AliquotaIR>{{ rps.aliquota_ir }}</AliquotaIR>
<AliquotaCSLL>{{ rps.aliquota_csll }}</AliquotaCSLL>
<DescricaoRPS>{{ rps.descricao }}</DescricaoRPS>
<DDDPrestador>{{ rps.prestador.ddd }}</DDDPrestador>
<TelefonePrestador>{{ rps.prestador.telefone }}</TelefonePrestador>
<DDDTomador>{{ rps.tomador.ddd }}</DDDTomador>
<TelefoneTomador>{{ rps.tomador.telefone }}</TelefoneTomador>
<MotCancelamento>{{ rps.motivo_cancelamento }}</MotCancelamento>
{% if rps.deducoes|count > 0 %}
<Deducoes>
{% for deducao in rps.deducoes -%}
<Deducao>
<DeducaoPor>{{ deducao.por }}</DeducaoPor>
<TipoDeducao>{{ deducao.tipo }}</TipoDeducao>
<CPFCNPJReferencia>{{ deducao.cnpj_referencia }}</CPFCNPJReferencia>
<NumeroNFReferencia>{{ deducao.nf_referencia }}</NumeroNFReferencia>
<ValorTotalReferencia>{{ deducao.valor_referencia }}</ValorTotalReferencia>
<PercentualDeduzir>{{ deducao.percentual_deduzir }}</PercentualDeduzir>
<ValorDeduzir>{{ deducao.valor_deduzir }}</ValorDeduzir>
</Deducao>
{% endfor %}
</Deducoes>
{% endif %}
{% if rps.deducoes|count == 0 %}
<Deducoes />
{% endif %}
<Itens>
{% for item in rps.itens -%}
<Item>
<DiscriminacaoServico>{{ item.descricao }}</DiscriminacaoServico>
<Quantidade>{{ item.quantidade }}</Quantidade>
<ValorUnitario>{{ item.valor_unitario }}</ValorUnitario>
<ValorTotal>{{ item.valor_total }}</ValorTotal>
<Tributavel>S</Tributavel>
</Item>
{% endfor %}
</Itens>
</RPS>
{% endfor %}
</Lote>
</ns1:ReqEnvioLoteRPS>

149
pytrustnfe/nfse/campinas/templates/enviar.xsd

@ -0,0 +1,149 @@
<xs:schema xmlns:tipos="http://localhost:8080/WsNFe2/tp"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:ns1="http://localhost:8080/WsNFe2/lote" targetNamespace="http://localhost:8080/WsNFe2/lote">
<xs:import namespace="http://localhost:8080/WsNFe2/tp"
schemaLocation="Tipos.xsd" />
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
schemaLocation="xmldsig-core-schema_v1.01.xsd" />
<xs:element name="ReqEnvioLoteRPS">
<xs:annotation>
<xs:documentation>Schema utilizado para envio de lote de RPS.</xs:documentation>
<xs:documentation>Este Schema XML é utilizado pelos prestadores
de serviços para substituição em lote de RPS por NFS-e.
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Cabecalho">
<xs:annotation>
<xs:documentation>Cabeçalho do Lote.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="CodCidade" type="tipos:tpCodCidade" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe o Codigo da Cidade no Padrão SIAFI.
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="CPFCNPJRemetente" type="tipos:tpCPFCNPJ" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>
CNPJ do contribuinte ou CPF do Responsável Legal autorizado a entregar o lote.
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="RazaoSocialRemetente" type="tipos:tpRazaoSocial" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>
Informe o Nome do Contribuinte ou do Responsável Legal
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="transacao" type="xs:boolean"
default="true" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>
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.
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="dtInicio" type="xs:date" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>
Informe a data de início do
período
transmitido
(AAAA-MM-DD).
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="dtFim" type="xs:date" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>
Informe a data final do período
transmitido
(AAAA-MM-DD).
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="QtdRPS" type="tipos:tpQtdRpsLote" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>
Informe o total de RPS contidos
na mensagem
XML. OBS: O xml não pode ultrapassar o tamanho maximo de 500kb.
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ValorTotalServicos" type="tipos:tpValor" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>
Informe o valor total dos
serviços prestados
dos RPS
contidos na mensagem XML.
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ValorTotalDeducoes" type="tipos:tpValor" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>
Informe o valor total das
deduções dos RPS
contidos na
mensagem XML.
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Versao" type="tipos:tpVersao" fixed="1" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>
Informe a Versão do Schema XML
utilizado.
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="MetodoEnvio" type="tipos:tpMetodoEnvio"
minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe o Método de Envio</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="VersaoComponente" type="tipos:tpVersaoComponente"
minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:documentation>Versão da DLL de envio de lote. Não é necessário informar esse campo caso não utilize a DLL.
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Lote" type="tipos:tpLote" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>Informe os RPS a serem substituidos por
NF-e.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element ref="ds:Signature" minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

12
pytrustnfe/nfse/campinas/templates/soap_header.xml

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:dsf="http://dsfnet.com.br">
<soapenv:Body>
<dsf:enviar soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<mensagemXml xsi:type="xsd:string"><![CDATA[
{% block content %}{% endblock %}
]]></mensagemXml>
</dsf:enviar>
</soapenv:Body>
</soapenv:Envelope>
Loading…
Cancel
Save