Browse Source

[FIX] NT 2014.002 NFeDistribuicaoDFe

pull/41/head
juniortada 8 years ago
parent
commit
668ab25192
  1. 117
      pynfe/processamento/comunicacao.py
  2. 5
      pynfe/utils/webservices.py

117
pynfe/processamento/comunicacao.py

@ -151,48 +151,41 @@ class ComunicacaoSefaz(Comunicacao):
xml = self._construir_xml_soap('NFeConsultaProtocolo4', raiz)
return self._post(url, xml)
def consulta_notas_cnpj(self, cnpj, nsu=0):
"""
Serviço de Consulta da Relação de Documentos Destinados para um determinado CNPJ de
destinatário informado na NF-e.
:param cnpj: CNPJ
:param nsu: NSU
:return:
def consulta_distribuicao(self, cnpj=None, cpf=None, chave=None, nsu=0):
"""
O XML do pedido de distribuição suporta três tipos de consultas que são definidas de acordo com a tag
informada no XML. As tags são distNSU, consNSU e consChNFe.
a) distNSU Distribuição de Conjunto de DF-e a Partir do NSU Informado
b) consNSU Consulta DF-e Vinculado ao NSU Informado
c) consChNFe Consulta de NF-e por Chave de Acesso Informada
:param cnpj: CNPJ do interessado
:param cpf: CPF do interessado
:param chave: Chave da NF-e a ser consultada
:param nsu: Ultimo nsu ou nsu específico para ser consultado.
:return:
"""
# url do serviço
url = self._get_url_an(consulta='DESTINADAS')
# Monta XML do corpo da requisição
raiz = etree.Element('consNFeDest', versao='1.01', xmlns=NAMESPACE_NFE)
# url
url = self._get_url_an(consulta='DISTRIBUICAO')
# Monta XML para envio da requisição
raiz = etree.Element('distDFeInt', versao='1.00', xmlns=NAMESPACE_NFE)
etree.SubElement(raiz, 'tpAmb').text = str(self._ambiente)
etree.SubElement(raiz, 'xServ').text = 'CONSULTAR NFE DEST'
etree.SubElement(raiz, 'CNPJ').text = cnpj
# Indicador de NF-e consultada:
# 0 = Todas as NF-e;
# 1 = Somente as NF-e que ainda não tiveram manifestação do destinatário (Desconhecimento da
# operação, Operação não Realizada ou Confirmação da Operação);
# 2 = Idem anterior, incluindo as NF-e que também não tiveram a Ciência da Operação.
etree.SubElement(raiz, 'indNFe').text = '0'
# Indicador do Emissor da NF-e:
# 0 = Todos os Emitentes / Remetentes;
# 1 = Somente as NF-e emitidas por emissores / remetentes que não tenham o mesmo CNPJ-Base do
# destinatário (para excluir as notas fiscais de transferência entre filiais).
etree.SubElement(raiz, 'indEmi').text = '0'
# Último NSU recebido pela Empresa. Caso seja informado com zero, ou com um NSU muito antigo, a consulta
# retornará unicamente as notas fiscais que tenham sido recepcionadas nos últimos 15 dias.
etree.SubElement(raiz, 'ultNSU').text = str(nsu)
if self.uf:
etree.SubElement(raiz, 'cUFAutor').text = CODIGOS_ESTADOS[self.uf.upper()]
if cnpj:
etree.SubElement(raiz, 'CNPJ').text = cnpj
else:
etree.SubElement(raiz, 'CPF').text = cpf
distNSU = etree.SubElement(raiz, 'distNSU')
etree.SubElement(distNSU, 'ultNSU').text = str(nsu).zfill(15)
# if chave:
# consChNFe = etree.SubElement(raiz, 'consChNFe')
# etree.SubElement(consChNFe, 'chNFe').text = chave
# Monta XML para envio da requisição
xml = self._construir_xml_soap('NfeConsultaDest', raiz)
xml = self._construir_xml_soap('NFeDistribuicaoDFe', raiz)
# print(url)
# print(etree.tostring(xml))
return self._post(url, xml)
def consulta_distribuicao(self, cnpj, nsu=0):
pass
def consulta_cadastro(self, modelo, cnpj):
"""
Consulta de cadastro
@ -389,53 +382,17 @@ class ComunicacaoSefaz(Comunicacao):
raise Exception('Modelo não encontrado! Defina modelo="nfe" ou "nfce"')
return self.url
def _get_url_uf(self, modelo, consulta):
""" Estados que implementam url diferente do padrão nacional"""
# estados que implementam webservice SVRS
svrs = ['AC', 'AL', 'AP', 'DF', 'ES', 'PB', 'RJ', 'RN', 'RO', 'RR', 'SC', 'SE', 'TO', 'PI']
svan = ['MA', 'PA']
# SVRS
if self.uf.upper() in svrs:
if self._ambiente == 1:
ambiente = 'HTTPS'
else:
ambiente = 'HOMOLOGACAO'
if modelo == 'nfe':
# nfe Ex: https://nfe.svrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx
# https://nfe-homologacao.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx
self.url = NFE['SVRS'][ambiente] + NFE['SVRS'][consulta]
elif modelo == 'nfce':
# nfce Ex: https://nfce.svrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx
# https://nfce-homologacao.svrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx
self.url = NFCE['SVRS'][ambiente] + NFCE['SVRS'][consulta]
else:
# TODO implementar outros tipos de notas como NFS-e
pass
# SVAN
else:
if self.uf.upper() in svan:
if self._ambiente == 1:
ambiente = 'HTTPS'
else:
ambiente = 'HOMOLOGACAO'
if modelo == 'nfe':
# nfe Ex: https://nfe.svrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx
# https://nfe-homologacao.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx
self.url = NFE['SVAN'][ambiente] + NFE['SVAN'][consulta]
elif modelo == 'nfce':
# TODO não existe SVAN para nfce
pass
else:
# TODO implementar outros tipos de notas como NFS-e
pass
return self.url
def _construir_xml_soap(self, metodo, dados):
def _construir_xml_soap(self, metodo, dados, cabecalho=False):
"""Mota o XML para o envio via SOAP"""
raiz = etree.Element('{%s}Envelope' % NAMESPACE_SOAP, nsmap={
'xsi': NAMESPACE_XSI, 'xsd': NAMESPACE_XSD,'soap': NAMESPACE_SOAP})
body = etree.SubElement(raiz, '{%s}Body' % NAMESPACE_SOAP)
a = etree.SubElement(body, 'nfeDadosMsg', xmlns=NAMESPACE_METODO+metodo)
## distribuição tem um corpo de xml diferente
if metodo == 'NFeDistribuicaoDFe':
x = etree.SubElement(body, 'nfeDistDFeInteresse', xmlns=NAMESPACE_METODO+metodo)
a = etree.SubElement(x, 'nfeDadosMsg')
else:
a = etree.SubElement(body, 'nfeDadosMsg', xmlns=NAMESPACE_METODO+metodo)
a.append(dados)
return raiz

5
pynfe/utils/webservices.py

@ -280,9 +280,8 @@ NFCE = {
NFE = {
# Alguns serviços são disponibilizados apenas pelo ambiente nacional
'AN': {
'EVENTOS': '.nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx', # versao: 4.00
'DISTRIBUICAO': '1.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx',
'DESTINADAS': '.nfe.fazenda.gov.br/NFeConsultaDest/NFeConsultaDest.asmx', # versao: 2.00/3.10
'EVENTOS': 'nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx', # versao: 4.00
'DISTRIBUICAO': 'nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx',
'HTTPS': 'https://www',
'HOMOLOGACAO': 'https://hom'
},

Loading…
Cancel
Save