Skip to content

Commit

Permalink
Implementação método de distribuição de documentos fiscais
Browse files Browse the repository at this point in the history
  • Loading branch information
danimaribeiro committed Jun 9, 2017
1 parent 3ea90c8 commit 0a6eda2
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 50 deletions.
31 changes: 3 additions & 28 deletions pytrustnfe/Servidores.py
Expand Up @@ -21,17 +21,14 @@
WS_NFCE_QR_CODE = 'NfeQRCode'
WS_NFCE_RET_AUTORIZACAO = 'NFeRetAutorizacao',
WS_NFCE_CONSULTA_DESTINADAS = 'NfeConsultaDest',
WS_NFCE_DOWNLOAD = 'NfeDownloadNF',


WS_NFE_CADASTRO = 'NfeConsultaCadastro'
WS_DPEC_RECEPCAO = 'RecepcaoEventoEPEC'
WS_DPEC_CONSULTA = 8

WS_NFE_RECEPCAO_EVENTO = 'RecepcaoEventoCarta'
WS_NFE_DOWNLOAD = 'NfeDownloadNF'
WS_NFE_CONSULTA_DESTINADAS = 'NfeConsultaDest'
WS_DFE_DISTRIBUICAO = 12
WS_DFE_DISTRIBUICAO = 'NFeDistribuicaoDFe'

NFE_AMBIENTE_PRODUCAO = 1
NFE_AMBIENTE_HOMOLOGACAO = 2
Expand Down Expand Up @@ -76,7 +73,7 @@ def localizar_url(servico, estado, mod='55', ambiente=2):
sigla = SIGLA_ESTADO[estado]
ws = ESTADO_WS[sigla]

if servico in (WS_NFE_CONSULTA_DESTINADAS, WS_NFE_DOWNLOAD):
if servico in (WS_DFE_DISTRIBUICAO):
ws = AN

if mod in ws:
Expand Down Expand Up @@ -133,14 +130,6 @@ def localizar_qrcode(estado, ambiente=2):
'webservice': 'RecepcaoEvento',
'metodo': 'nfeRecepcaoEvento',
},
WS_NFE_DOWNLOAD: {
'webservice': 'NfeDownloadNF',
'metodo': 'nfeDownloadNF',
},
WS_NFE_CONSULTA_DESTINADAS: {
'webservice': 'NfeConsultaDest',
'metodo': 'nfeConsultaNFDest',
},
WS_DFE_DISTRIBUICAO: {
'webservice': 'NFeDistribuicaoDFe',
'metodo': 'nfeDistDFeInteresse'
Expand Down Expand Up @@ -181,7 +170,6 @@ def localizar_qrcode(estado, ambiente=2):
WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx',
WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx',
WS_NFE_DOWNLOAD: 'NfeDownloadNF/NfeDownloadNF.asmx',
},
NFE_AMBIENTE_HOMOLOGACAO: {
'servidor': 'hom.sefazvirtual.fazenda.gov.br',
Expand All @@ -191,7 +179,6 @@ def localizar_qrcode(estado, ambiente=2):
WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx',
WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx',
WS_NFE_DOWNLOAD: 'NfeDownloadNF/NfeDownloadNF.asmx',
}
}

Expand Down Expand Up @@ -269,17 +256,13 @@ def localizar_qrcode(estado, ambiente=2):

AN = {
NFE_AMBIENTE_PRODUCAO: {
'servidor': 'www.nfe.fazenda.gov.br',
'servidor': 'www1.nfe.fazenda.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_NFE_CONSULTA_DESTINADAS: 'NFeConsultaDest/NFeConsultaDest.asmx',
WS_NFE_DOWNLOAD: 'NfeDownloadNF/NfeDownloadNF.asmx',
WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx',
},
NFE_AMBIENTE_HOMOLOGACAO: {
'servidor': 'hom.nfe.fazenda.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_NFE_CONSULTA_DESTINADAS: 'NFeConsultaDest/NFeConsultaDest.asmx',
WS_NFE_DOWNLOAD: 'NfeDownloadNF/NfeDownloadNF.asmx',
WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx',
},
}
Expand Down Expand Up @@ -522,8 +505,6 @@ def localizar_qrcode(estado, ambiente=2):
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx',
WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx',
WS_NFE_CONSULTA_DESTINADAS: 'ws/nfeConsultaDest/nfeConsultaDest.asmx',
WS_NFE_DOWNLOAD: 'ws/nfeDownloadNF/nfeDownloadNF.asmx',
WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx',
WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx',
Expand All @@ -535,8 +516,6 @@ def localizar_qrcode(estado, ambiente=2):
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx',
WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx',
WS_NFE_CONSULTA_DESTINADAS: 'ws/nfeConsultaDest/nfeConsultaDest.asmx',
WS_NFE_DOWNLOAD: 'ws/nfeDownloadNF/nfeDownloadNF.asmx',
WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx',
WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx',
Expand All @@ -550,8 +529,6 @@ def localizar_qrcode(estado, ambiente=2):
WS_NFCE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx',
WS_NFCE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx',
WS_NFCE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx',
WS_NFCE_CONSULTA_DESTINADAS: 'ws/nfeConsultaDest/nfeConsultaDest.asmx',
WS_NFCE_DOWNLOAD: 'ws/nfeDownloadNF/nfeDownloadNF.asmx',
WS_NFCE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx',
WS_NFCE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx',
WS_NFCE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx',
Expand All @@ -564,8 +541,6 @@ def localizar_qrcode(estado, ambiente=2):
WS_NFCE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx',
WS_NFCE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx',
WS_NFCE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx',
WS_NFCE_CONSULTA_DESTINADAS: 'ws/nfeConsultaDest/nfeConsultaDest.asmx',
WS_NFCE_DOWNLOAD: 'ws/nfeDownloadNF/nfeDownloadNF.asmx',
WS_NFCE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx',
WS_NFCE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx',
WS_NFCE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx',
Expand Down
4 changes: 2 additions & 2 deletions pytrustnfe/client.py
Expand Up @@ -42,8 +42,8 @@ def __init__(self, url, cert_path, key_path):

def _headers(self, action):
return {
u'Content-type': u'application/soap+xml; charset=utf-8; action="http://www.portalfiscal.inf.br/nfe/wsdl/%s"' % action,
u'Accept': u'application/soap+xml; charset=utf-8'
u'Content-type': u'text/xml; charset=utf-8; action="http://www.portalfiscal.inf.br/nfe/wsdl/%s"' % action,
u'Accept': u'application/soap+xml; charset=utf-8',
}

def post_soap(self, xml_soap, cabecalho):
Expand Down
19 changes: 10 additions & 9 deletions pytrustnfe/nfe/__init__.py
Expand Up @@ -24,8 +24,8 @@ def _build_header(method, **kwargs):
'NfeInutilizacao': ('NfeInutilizacao2', '3.10'),
'RecepcaoEventoCancelamento': ('RecepcaoEvento', '1.00'),
'RecepcaoEventoCarta': ('RecepcaoEvento', '1.00'),
'NfeConsultaDest': ('NfeConsultaDest', '3.10'),
'NfeDownloadNF': ('NfeDownloadNF', '3.10'),
'NFeDistribuicaoDFe': ('NFeDistribuicaoDFe/nfeDistDFeInteresse',
'1.00'),
}
vals = {'estado': kwargs['estado'],
'soap_action': action[method][0],
Expand Down Expand Up @@ -177,7 +177,12 @@ def _send(certificado, method, sign, **kwargs):
kwargs['ambiente'])
cabecalho = _build_header(method, **kwargs)

response, obj = executar_consulta(certificado, url, cabecalho, xml_send)
send_raw = False
if method == 'NFeDistribuicaoDFe':
send_raw = True

response, obj = executar_consulta(certificado, url, cabecalho, xml_send,
send_raw=send_raw)
return {
'sent_xml': xml_send,
'received_xml': response,
Expand Down Expand Up @@ -226,9 +231,5 @@ def recepcao_evento_epec(certificado, **kwargs): # Assinar
return _send(certificado, 'RecepcaoEventoEPEC', True, **kwargs)


def consulta_nfe_destinada(certificado, **kwargs):
return _send(certificado, 'NfeConsultaDest', False, **kwargs)


def download_nfe(certificado, **kwargs):
return _send(certificado, 'NfeDownloadNF', False, **kwargs)
def consulta_distribuicao_nfe(certificado, **kwargs):
return _send(certificado, 'NFeDistribuicaoDFe', False, **kwargs)
7 changes: 5 additions & 2 deletions pytrustnfe/nfe/comunicacao.py
Expand Up @@ -12,20 +12,23 @@
def _soap_xml(body, cabecalho):
xml = '<?xml version="1.0" encoding="utf-8"?>'
xml += '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"><soap:Header>'
xml += '<nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/'+ cabecalho.soap_action + '">'
xml += '<nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/' + cabecalho.soap_action + '">'
xml += '<cUF>' + cabecalho.estado + '</cUF><versaoDados>' + cabecalho.versao + '</versaoDados></nfeCabecMsg></soap:Header><soap:Body>'
xml += '<nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/' + cabecalho.soap_action + '">'
xml += body
xml += '</nfeDadosMsg></soap:Body></soap:Envelope>'
return xml.rstrip('\n')


def executar_consulta(certificado, url, cabecalho, xmlEnviar):
def executar_consulta(certificado, url, cabecalho, xmlEnviar, send_raw=False):
cert, key = extract_cert_and_key_from_pfx(
certificado.pfx, certificado.password)
cert_path, key_path = save_cert_key(cert, key)
client = HttpClient(url, cert_path, key_path)

xml_enviar = _soap_xml(xmlEnviar, cabecalho)
if send_raw:
xml = '<?xml version="1.0" encoding="utf-8"?>' + xmlEnviar.rstrip('\n')
xml_enviar = xml
xml_retorno = client.post_soap(xml_enviar, cabecalho)
return sanitize_response(xml_retorno)
16 changes: 16 additions & 0 deletions pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml
@@ -0,0 +1,16 @@
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<nfeDistDFeInteresse xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NFeDistribuicaoDFe">
<nfeDadosMsg>
<distDFeInt xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<tpAmb>{{ ambiente }}</tpAmb>
<cUFAutor>{{ estado }}</cUFAutor>
<CNPJ>{{ consulta.cnpj_cpf }}</CNPJ>
<distNSU>
<ultNSU>{{ consulta.ultimo_nsu }}</ultNSU>
</distNSU>
</distDFeInt>
</nfeDadosMsg>
</nfeDistDFeInteresse>
</Body>
</Envelope>
18 changes: 9 additions & 9 deletions pytrustnfe/nfe/templates/RecepcaoEventoManifesto.xml
@@ -1,18 +1,18 @@
<envEvento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<idLote>{{ obj.lote }}</idLote>
<idLote>{{ 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>
<infEvento Id="{{ manifesto.identificador }}">
<cOrgao>{{ manifesto.estado }}</cOrgao>
<tpAmb>{{ ambiente }}</tpAmb>
<CNPJ>{{ manifesto.cnpj_empresa }}</CNPJ>
<chNFe>{{ manifesto.chave_nfe }}</chNFe>
<dhEvento>{{ manifesto.data_hora_evento }}</dhEvento>
<tpEvento>210200</tpEvento>
<nSeqEvento>{{ obj.sequencia }}</nSeqEvento>
<nSeqEvento>{{ manifesto.numero_sequencial }}</nSeqEvento>
<verEvento>1.00</verEvento>
<detEvento versao="1.00">
<descEvento>Confirmacao da Operacao</descEvento>
</detEvento>
</infEvento>
</evento>
</envEvento>
</envEvento>

0 comments on commit 0a6eda2

Please sign in to comment.