Danimar Ribeiro 9 years ago
parent
commit
76a4abfb52
  1. 26
      pytrustnfe/ChaveNFe.py
  2. 76
      pytrustnfe/nfe/__init__.py
  3. 9
      pytrustnfe/nfe/comunicacao.py
  4. 183
      pytrustnfe/nfe/templates/NfeAutorizacao.xml
  5. 8
      pytrustnfe/nfe/templates/NfeConsultaCadastro.xml
  6. 8
      pytrustnfe/nfe/templates/NfeConsultaDest.xml
  7. 6
      pytrustnfe/nfe/templates/NfeConsultaProtocolo.xml
  8. 6
      pytrustnfe/nfe/templates/NfeDownloadNF.xml
  9. 15
      pytrustnfe/nfe/templates/NfeInutilizacao.xml
  10. 5
      pytrustnfe/nfe/templates/NfeRetAutorizacao.xml
  11. 6
      pytrustnfe/nfe/templates/NfeStatusServico.xml
  12. 20
      pytrustnfe/nfe/templates/RecepcaoEventoCancelamento.xml
  13. 21
      pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml
  14. 31
      pytrustnfe/nfe/templates/RecepcaoEventoEPEC.xml
  15. 18
      pytrustnfe/nfe/templates/RecepcaoEventoManifesto.xml
  16. 6
      pytrustnfe/utils.py
  17. 0
      pytrustnfe/xml/consultar_cadastro.xml

26
pytrustnfe/ChaveNFe.py

@ -1,26 +0,0 @@
# -*- coding: utf-8 -*-
# © 2016 Danimar Ribeiro, Trustcode
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
class ChaveNFe(object):
def __init__(self, **kwargs):
self.cnpj = kwargs.pop('cnpj', '')
self.estado = kwargs.pop('estado', '')
self.emissao = kwargs.pop('emissao', '')
self.modelo = kwargs.pop('modelo', '')
self.serie = kwargs.pop('serie', '')
self.numero = kwargs.pop('numero', '')
self.tipo = kwargs.pop('tipo', '')
self.codigo = kwargs.pop('codigo', '')
def validar(self):
assert self.cnpj != '', 'CNPJ necessário para criar chave NF-e'
assert self.estado != '', 'Estado necessário para criar chave NF-e'
assert self.emissao != '', 'Emissão necessário para criar chave NF-e'
assert self.modelo != '', 'Modelo necessário para criar chave NF-e'
assert self.serie != '', 'Série necessária para criar chave NF-e'
assert self.numero != '', 'Número necessário para criar chave NF-e'
assert self.tipo != '', 'Tipo necessário para criar chave NF-e'
assert self.codigo != '', 'Código necessário para criar chave NF-e'

76
pytrustnfe/nfe/__init__.py

@ -5,10 +5,68 @@
import os
from lxml import etree
from .comunicacao import Comunicacao
from .comunicacao import executar_consulta, Comunicacao
from .assinatura import sign_xml, Assinatura
from pytrustnfe import utils
from pytrustnfe.xml import render_xml
from pytrustnfe.utils import CabecalhoSoap
def _build_header(**kwargs):
estado = kwargs['estado']
return CabecalhoSoap({'estado': estado, 'soap_action': ''})
def _send(certificado, method, **kwargs):
path = os.path.join(os.path.dirname(__file__), 'templates')
xml = render_xml(path, '%s.xml' % method, **kwargs)
pfx_path = certificado.save_pfx()
signer = Assinatura(pfx_path, certificado.password)
xml_signed = signer.assina_xml(xml, '')
cabecalho = _build_header(**kwargs)
return executar_consulta(certificado, cabecalho, xml_signed)
def autorizar_nfe(certificado, **kwargs): # Assinar
_send(certificado, 'NfeAutorizacao', **kwargs)
def retorno_autorizar_nfe(certificado, **kwargs):
_send(certificado, 'NfeRetAutorizacao', **kwargs)
def recepcao_evento_cancelamento(certificado, **kwargs): # Assinar
_send(certificado, 'RecepcaoEventoCancelamento', **kwargs)
def inutilizar_nfe(certificado, **kwargs): # Assinar
_send(certificado, 'NfeInutilizacao', **kwargs)
def consultar_protocolo_nfe(certificado, **kwargs):
_send(certificado, 'NfeConsultaProtocolo', **kwargs)
def nfe_status_servico(certificado, **kwargs):
_send(certificado, 'NfeStatusServico.', **kwargs)
def consulta_cadastro(certificado, **kwargs):
_send(certificado, 'NfeConsultaCadastro.', **kwargs)
def recepcao_evento_carta_correcao(certificado, **kwargs): # Assinar
_send(certificado, 'RecepcaoEventoCarta.', **kwargs)
def recepcao_evento_manifesto(certificado, **kwargs): # Assinar
_send(certificado, 'RecepcaoEventoManifesto', **kwargs)
def recepcao_evento_epec(certificado, **kwargs): # Assinar
_send(certificado, 'RecepcaoEventoEPEC', **kwargs)
def consulta_nfe_destinada(certificado, **kwargs):
_send(certificado, 'NfeConsultaDest', **kwargs)
def download_nfe(certificado, **kwargs):
_send(certificado, 'NfeDownloadNF', **kwargs)
class NFe(Comunicacao):
@ -16,15 +74,17 @@ class NFe(Comunicacao):
def __init__(self, cert, key):
Comunicacao.__init__(self, cert, key)
def consultar_cadastro(self, cadastro, estado):
self.url = 'https://cad.sefazrs.rs.gov.br/ws/cadconsultacadastro/cadconsultacadastro2.asmx'
self.metodo = 'NfeConsultaCadastro'
path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'xml')
xml = render_xml(path, 'consultar_cadastro.xml', **cadastro)
xml_response, obj = self._executar_consulta(xml)
return {
'sent_xml': xml,
'received_xml': xml_response,
@ -32,18 +92,18 @@ class NFe(Comunicacao):
}
def autorizar_nfe(self, nfe, nfe_id):
def autorizar_nfe(self, nfe, nfe_id):
self.url = 'https://nfe-homologacao.sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx'
self.metodo = 'NfeAutorizacao/nfeAutorizacaoLote'
path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'xml')
xml = render_xml(path, 'nfeEnv.xml', **nfe)
xmlElem = etree.fromstring(xml)
xmlElem = etree.fromstring(xml)
xml_signed = sign_xml(xmlElem, self.cert, self.key, '#%s' % nfe_id)
xml_response, obj = self._executar_consulta(xml_signed)
return {
'sent_xml': xml_signed,
'received_xml': xml_response,

9
pytrustnfe/nfe/comunicacao.py

@ -15,6 +15,15 @@ common_namespaces = {'soap': 'http://www.w3.org/2003/05/soap-envelope'}
soap_body_path = './soap:Envelope/soap:Body'
soap_fault_path = './soap:Envelope/soap:Body/soap:Fault'
def executar_consulta(cerficado, cabecalho, xmlEnviar):
cert_path, key_path = self._preparar_temp_pem()
client = HttpClient(self.url, cert_path, key_path)
soap_xml = self._soap_xml(xmlEnviar)
xml_retorno = client.post_xml(self.web_service, soap_xml)
return sanitize_response(xml_retorno)
class Comunicacao(object):
url = ''

183
pytrustnfe/nfe/templates/NfeAutorizacao.xml

@ -0,0 +1,183 @@
<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10">
<idLote>{{ idLote }}</idLote>
<indSinc>{{ indSinc }}</indSinc>
{% for NFe in NFes %}
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe versao="3.10" Id="{{ NFe.infNFe.Id }}">
<ide>
{% with ide = NFe.infNFe.ide %}
<cUF>{{ ide.cUF }}</cUF>
<cNF>{{ ide.cNF }}</cNF>
<natOp>{{ ide.natOp }}</natOp>
<indPag>{{ ide.indPag }}</indPag>
<mod>{{ ide.mod }}</mod>
<serie>{{ ide.serie }}</serie>
<nNF>{{ ide.nNF }}</nNF>
<dhEmi>{{ ide.dhEmi }}</dhEmi>
<dhSaiEnt>{{ ide.dhSaiEnt }}</dhSaiEnt>
<tpNF>{{ ide.tpNF }}</tpNF>
<idDest>{{ ide.idDest }}</idDest>
<cMunFG>{{ ide.cMunFG }}</cMunFG>
<tpImp>{{ ide.tpImp }}</tpImp>
<tpEmis>{{ ide.tpEmis }}</tpEmis>
<cDV>{{ ide.cDV }}</cDV>
<tpAmb>{{ ide.tpAmb }}</tpAmb>
<finNFe>{{ ide.finNFe }}</finNFe>
<indFinal>{{ ide.indFinal }}</indFinal>
<indPres>{{ ide.indPres }}</indPres>
<procEmi>{{ ide.procEmi }}</procEmi>
<verProc>Odoo Brasil 9.0</verProc>
{% endwith %}
</ide>
<emit>
{% with emit = NFe.infNFe.emit %}
{% if emit.tipo == 'person' -%}
<CPF>{{ emit.cnpj_cpf }}</CPF>
{% endif %}
{% if emit.tipo == 'company' -%}
<CNPJ>{{ emit.cnpj_cpf }}</CNPJ>
{% endif %}
<xNome>{{ emit.xNome }}</xNome>
<xFant>{{ emit.xFant }}</xFant>
<enderEmit>
<xLgr>{{ emit.enderEmit.xLgr }}</xLgr>
<nro>{{ emit.enderEmit.nro }}</nro>
<xBairro>{{ emit.enderEmit.xBairro }}</xBairro>
<cMun>{{ emit.enderEmit.cMun }}</cMun>
<xMun>{{ emit.enderEmit.xMun }}</xMun>
<UF>{{ emit.enderEmit.UF }}</UF>
<CEP>{{ emit.enderEmit.CEP }}</CEP>
<cPais>{{ emit.enderEmit.cPais }}</cPais>
<xPais>{{ emit.enderEmit.xPais }}</xPais>
<fone>{{ emit.enderEmit.fone }}</fone>
</enderEmit>
<IE>{{ emit.IE }}</IE>
<CRT>{{ emit.CRT }}</CRT>
{% endwith %}
</emit>
<dest>
{% with dest = NFe.infNFe.dest %}
{% if dest.tipo == 'person' -%}
<CPF>{{ dest.cnpj_cpf }}</CPF>
{% endif %}
{% if dest.tipo == 'company' -%}
<CNPJ>{{ dest.cnpj_cpf }}</CNPJ>
{% endif %}
<xNome>{{ dest.xNome }}</xNome>
<enderDest>
<xLgr>{{ dest.enderDest.xLgr }}</xLgr>
<nro>{{ dest.enderDest.nro }}</nro>
<xBairro>{{ dest.enderDest.xBairro }}</xBairro>
<cMun>{{ dest.enderDest.cMun }}</cMun>
<xMun>{{ dest.enderDest.xMun }}</xMun>
<UF>{{ dest.enderDest.UF }}</UF>
<CEP>{{ dest.enderDest.CEP }}</CEP>
<cPais>{{ dest.enderDest.cPais }}</cPais>
<xPais>{{ dest.enderDest.xPais }}</xPais>
<fone>{{ dest.enderDest.fone }}</fone>
</enderDest>
<indIEDest>{{ dest.indIEDest }}</indIEDest>
{% if dest.IE != '' -%}<IE>{{ dest.IE }}</IE>{% endif %}
{% endwith %}
</dest>
{% for det in NFe.infNFe.detalhes %}
<det nItem="1">
<prod>
{% with prod = det.prod %}
<cProd>{{ prod.cProd }}</cProd>
<cEAN>{{ prod.cEAN }}</cEAN>
<xProd>{{ prod.xProd }}</xProd>
<NCM>{{ prod.NCM }}</NCM>
<CFOP>{{ prod.CFOP }}</CFOP>
<uCom>{{ prod.uCom }}</uCom>
<qCom>{{ prod.qCom }}</qCom>
<vUnCom>{{ prod.vUnCom }}</vUnCom>
<vProd>{{ prod.vProd }}</vProd>
<cEANTrib>{{ prod.cEANTrib }}</cEANTrib>
<uTrib>{{ prod.uTrib }}</uTrib>
<qTrib>{{ prod.qTrib }}</qTrib>
<vUnTrib>{{ prod.vUnTrib }}</vUnTrib>
<indTot>{{ prod.indTot }}</indTot>
{% endwith %}
</prod>
<imposto>
{% with imposto = det.imposto %}
<vTotTrib>{{ imposto.vTotTrib }}</vTotTrib>
<ICMS>
<ICMS00>
<orig>{{ imposto.ICMS.ICMS00.orig }}</orig>
<CST>{{ imposto.ICMS.ICMS00.CST }}</CST>
<modBC>{{ imposto.ICMS.ICMS00.modBC }}</modBC>
<vBC>{{ imposto.ICMS.ICMS00.vBC }}</vBC>
<pICMS>{{ imposto.ICMS.ICMS00.pICMS }}</pICMS>
<vICMS>{{ imposto.ICMS.ICMS00.vICMS }}</vICMS>
</ICMS00>
</ICMS>
<IPI>
<cEnq>{{ imposto.IPI.cEnq }}</cEnq>
<IPITrib>
<CST>{{ imposto.IPI.IPITrib.CST }}</CST>
<vBC>{{ imposto.IPI.IPITrib.vBC }}</vBC>
<pIPI>{{ imposto.IPI.IPITrib.pIPI }}</pIPI>
<vIPI>{{ imposto.IPI.IPITrib.vIPI }}</vIPI>
</IPITrib>
</IPI>
<PIS>
<PISAliq>
<CST>{{ imposto.PIS.PISAliq.CST }}</CST>
<vBC>{{ imposto.PIS.PISAliq.vBC }}</vBC>
<pPIS>{{ imposto.PIS.PISAliq.pPIS }}</pPIS>
<vPIS>{{ imposto.PIS.PISAliq.vPIS }}</vPIS>
</PISAliq>
</PIS>
<COFINS>
<COFINSAliq>
<CST>{{ imposto.COFINS.COFINSAliq.CST }}</CST>
<vBC>{{ imposto.COFINS.COFINSAliq.vBC }}</vBC>
<pCOFINS>{{ imposto.COFINS.COFINSAliq.pCOFINS }}</pCOFINS>
<vCOFINS>{{ imposto.COFINS.COFINSAliq.vCOFINS }}</vCOFINS>
</COFINSAliq>
</COFINS>
{% endwith %}
</imposto>
</det>
{% endfor %}
<total>
{% with total = NFe.infNFe.total %}
<ICMSTot>
<vBC>{{ total.vBC }}</vBC>
<vICMS>{{ total.vICMS }}</vICMS>
<vICMSDeson>{{ total.vICMSDeson }}</vICMSDeson>
<vBCST>{{ total.vBCST }}</vBCST>
<vST>{{ total.vST }}</vST>
<vProd>{{ total.vProd }}</vProd>
<vFrete>{{ total.vFrete }}</vFrete>
<vSeg>{{ total.vSeg }}</vSeg>
<vDesc>{{ total.vDesc }}</vDesc>
<vII>{{ total.vII }}</vII>
<vIPI>{{ total.vIPI }}</vIPI>
<vPIS>{{ total.vPIS }}</vPIS>
<vCOFINS>{{ total.vCOFINS }}</vCOFINS>
<vOutro>{{ total.vOutro }}</vOutro>
<vNF>{{ total.vNF }}</vNF>
<vTotTrib>{{ total.vTotTrib }}</vTotTrib>
</ICMSTot>
{% endwith %}
</total>
<transp>
<modFrete>{{ NFe.infNFe.transp.modFrete }}</modFrete>
</transp>
<cobr>
<dup>
<nDup>339/1</nDup>
<dVenc>2016-06-02</dVenc>
<vDup>8611.76</vDup>
</dup>
</cobr>
<infAdic>
<infCpl>{{ NFe.infNFe.infAdic.infCpl }}</infCpl>
</infAdic>
</infNFe>
</NFe>
{% endfor %}
</enviNFe>

8
pytrustnfe/nfe/templates/NfeConsultaCadastro.xml

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" ?>
<ConsCad xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00">
<infCons>
<xServ>CONS-CAD</xServ>
<UF>{{ obj.estado }}</UF>
<CNPJ>{{ obj.cnpj }}</CNPJ>
</infCons>
</ConsCad>

8
pytrustnfe/nfe/templates/NfeConsultaDest.xml

@ -0,0 +1,8 @@
<consNFeDest xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01">
<tpAmb>{{ obj.ambiente }}</tpAmb>
<xServ>CONSULTAR NFE DEST</xServ>
<CNPJ>{{ obj.cnpj }}</CNPJ>
<indNFe>{{ obj.indicador_nfe }}</indNFe>
<indEmi>{{ obj.indicador_emissor }}</indEmi>
<ultNSU>{{ obj.ultimo_nsu }}</ultNSU>
</consNFeDest>

6
pytrustnfe/nfe/templates/NfeConsultaProtocolo.xml

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<consSitNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.01">
<tpAmb>{{ obj.ambiente }}</tpAmb>
<xServ>CONSULTAR</xServ>
<chNFe>{{ obj.chave_nfe }}</chNFe>
</consSitNFe>

6
pytrustnfe/nfe/templates/NfeDownloadNF.xml

@ -0,0 +1,6 @@
<downloadNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<tpAmb>{{ obj.ambiente }}</tpAmb>
<xServ>DOWNLOAD NFE</xServ>
<CNPJ>{{ obj.cnpj }}</CNPJ>
<chNFe>{{ obj.chave_nfe }}</chNFe>
</downloadNFe>

15
pytrustnfe/nfe/templates/NfeInutilizacao.xml

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<inutNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00">
<infInut Id="{{ obj.id }}">
<tpAmb>{{ obj.ambiente }}</tpAmb>
<xServ>INUTILIZAR</xServ>
<cUF>{{ obj.estado }}</cUF>
<ano>{{ obj.ano }}</ano>
<CNPJ>{{ obj.cnpj }}</CNPJ>
<mod>{{ obj.modelo }}</mod>
<serie>{{ obj.serie }}</serie>
<nNFIni>{{ obj.numero_inicio}}</nNFIni>
<nNFFin>{{ obj.numero_fim }}</nNFFin>
<xJust>{{ obj.justificativa }}</xJust>
</infInut>
<inutNFe>

5
pytrustnfe/nfe/templates/NfeRetAutorizacao.xml

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<consReciNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10">
<tpAmb>{{ obj.ambiente }}</tpAmb>
<nRec>{{ obj.numero_recibo }}</nRec>
</consReciNFe>

6
pytrustnfe/nfe/templates/NfeStatusServico.xml

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<consStatServ xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10">
<tpAmb>{{ obj.ambiente }}</tpAmb>
<cUF>{{ obj.estado }}</cUF>
<xServ>STATUS</xServ>
</consStatServ>

20
pytrustnfe/nfe/templates/RecepcaoEventoCancelamento.xml

@ -0,0 +1,20 @@
<envEvento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<idLote>{{ obj.lote }}</idLote>
<evento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<infEvento Id="{{ obj.id }}">
<cOrgao>{{ obj.orgao }}</cOrgao>
<tpAmb>{{ obj.ambiente }}</tpAmb>
<CNPJ>{{ obj.cnpj }}</CNPJ>
<chNFe>{{ obj.chave_nfe }}</chNFe>
<dhEvento>{{ obj.data_hora_evento }}</dhEvento>
<tpEvento>110111</tpEvento>
<nSeqEvento>{{ obj.numero_evento }}</nSeqEvento>
<verEvento>1.00</verEvento>
<detEvento versao="1.00">
<descEvento>Cancelamento</descEvento>
<nProt>{{ obj.protocolo }}</nProt>
<xJust>{{obj.justificativa }}</xJust>
</detEvento>
</infEvento>
</evento>
</envEvento>

21
pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<envEvento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<idLote>00000001319901</idLote>
<evento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<infEvento Id="ID1101103511051014278500019055111000000013199881790001">
<cOrgao>{{ obj.orgao }}</cOrgao>
<tpAmb>{{ obj.ambiente }}</tpAmb>
<CNPJ>{{ obj.cnpj }}</CNPJ>
<chNFe>{{ obj.chave_nfe }}</chNFe>
<dhEvento>{{} obj.data_hora_evento }</dhEvento>
<tpEvento>110110</tpEvento>
<nSeqEvento>{{ obj.sequencia }}</nSeqEvento>
<verEvento>1.00</verEvento>
<detEvento versao="1.00">
<descEvento>Carta de Correção</descEvento>
<xCorrecao>{{ obj.correcao }}</xCorrecao>
<xCondUso>A Carta de Correção é disciplinada pelo § 1º-A do art. 7º do Convênio S/N, de 15 de dezembro de 1970 e pode ser utilizada para regularização de erro ocorrido na emissão de documento fiscal, desde que o erro não esteja relacionado com: I - as variáveis que determinam o valor do imposto tais como: base de cálculo, alíquota, diferença de preço, quantidade, valor da operação ou da prestação; II - a correção de dados cadastrais que implique mudança do remetente ou do destinatário; III - a data de emissão ou de saída.</xCondUso>
</detEvento>
</infEvento>
</evento>
</envEvento>

31
pytrustnfe/nfe/templates/RecepcaoEventoEPEC.xml

@ -0,0 +1,31 @@
<envEvento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<idLote>00106151340701</idLote>
<evento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<infEvento Id="ID1101403514081014278500019055001001061513407959995201">
<cOrgao>91</cOrgao>
<tpAmb>2</tpAmb>
<CNPJ>10142785000190</CNPJ>
<chNFe>35140810142785000190550010010615134079599952</chNFe>
<dhEvento>2014-08-07T04:52:51-03:00</dhEvento>
<tpEvento>110140</tpEvento>
<nSeqEvento>1</nSeqEvento>
<verEvento>1.00</verEvento>
<detEvento versao="1.00">
<descEvento>EPEC</descEvento>
<cOrgaoAutor>35</cOrgaoAutor>
<tpAutor>1</tpAutor>
<verAplic>1.26</verAplic>
<dhEmi>2014-08-07T00:00:00-03:00</dhEmi>
<tpNF>1</tpNF>
<IE>495171423115</IE>
<dest>
<UF>SP</UF>
<CPF>00000000191</CPF>
<vNF>86.00</vNF>
<vICMS>6.02</vICMS>
<vST>0</vST>
</dest>
</detEvento>
</infEvento>
</evento>
</envEvento>

18
pytrustnfe/nfe/templates/RecepcaoEventoManifesto.xml

@ -0,0 +1,18 @@
<envEvento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<idLote>{{ obj.lote }}</idLote>
<evento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<infEvento Id="{{ obj.id }}">
<cOrgao>{{ obj.orgao }}</cOrgao>
<tpAmb>{{ obj.ambiente }}</tpAmb>
<CNPJ>{{ obj.cnpj }}</CNPJ>
<chNFe>{{ obj.chave_nfe }}</chNFe>
<dhEvento>{{ obj.data_hora_evento }}</dhEvento>
<tpEvento>210200</tpEvento>
<nSeqEvento>{{ obj.sequencia }}</nSeqEvento>
<verEvento>1.00</verEvento>
<detEvento versao="1.00">
<descEvento>Confirmacao da Operacao</descEvento>
</detEvento>
</infEvento>
</evento>
</envEvento>

6
pytrustnfe/utils.py

@ -5,6 +5,12 @@
from datetime import date, datetime
class CabecalhoSoap(object):
def __init__(self, **kwargs):
self.estado = kwargs.pop('estado', '')
self.soap_action = kwargs.pop('soap_action', '')
class ChaveNFe(object):

0
pytrustnfe/xml/consultar_cadastro.xml

Loading…
Cancel
Save