From 668ab2519289546a872e3536b244c83dbaca6ca9 Mon Sep 17 00:00:00 2001 From: juniortada Date: Mon, 18 Jun 2018 14:56:12 -0300 Subject: [PATCH] [FIX] NT 2014.002 NFeDistribuicaoDFe --- pynfe/processamento/comunicacao.py | 117 ++++++++++++------------------------- pynfe/utils/webservices.py | 5 +- 2 files changed, 39 insertions(+), 83 deletions(-) diff --git a/pynfe/processamento/comunicacao.py b/pynfe/processamento/comunicacao.py index e140f80..b8fd259 100644 --- a/pynfe/processamento/comunicacao.py +++ b/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 diff --git a/pynfe/utils/webservices.py b/pynfe/utils/webservices.py index c3f5edb..52b278e 100644 --- a/pynfe/utils/webservices.py +++ b/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' },