From 6653f26c02c7fc9d2b89b29dc83981acdb104215 Mon Sep 17 00:00:00 2001 From: Junior Tada Date: Mon, 14 Aug 2017 13:12:20 -0300 Subject: [PATCH] =?UTF-8?q?In=C3=ADcio=20desenvolvimento=20NF-e=204.00?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pynfe/__init__.py | 2 +- pynfe/processamento/comunicacao.py | 79 +++--------- pynfe/processamento/serializacao.py | 237 ------------------------------------ pynfe/utils/flags.py | 2 +- pynfe/utils/webservices.py | 111 +++++++++-------- 5 files changed, 81 insertions(+), 350 deletions(-) diff --git a/pynfe/__init__.py b/pynfe/__init__.py index 7d3cab9..3e48912 100644 --- a/pynfe/__init__.py +++ b/pynfe/__init__.py @@ -1,5 +1,5 @@ def get_version(): - return '0.2' + return '0.4' __version__ = get_version() __author__ = 'Marinho Brandao, Junior Tada, Leonardo Tada' diff --git a/pynfe/processamento/comunicacao.py b/pynfe/processamento/comunicacao.py index 241880a..b8b738c 100644 --- a/pynfe/processamento/comunicacao.py +++ b/pynfe/processamento/comunicacao.py @@ -41,7 +41,7 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(raiz, 'indSinc').text = str(indSinc) # 0 para assincrono, 1 para sincrono raiz.append(nota_fiscal) # Monta XML para envio da requisição - xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(metodo='NfeAutorizacao'), metodo='NfeAutorizacao', dados=raiz) + xml = self._construir_xml_soap('NFeAutorizacao4', raiz) # Faz request no Servidor da Sefaz retorno = self._post(url, xml) @@ -96,8 +96,7 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(raiz, 'tpAmb').text = str(self._ambiente) etree.SubElement(raiz, 'nRec').text = numero # Monta XML para envio da requisição - xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(metodo='NfeRetAutorizacao'), metodo='NfeRetAutorizacao', dados=raiz) - + xml = self._construir_xml_soap('NFeRetAutorizacao4', raiz) return self._post(url, xml) def consulta_nota(self, modelo, chave): @@ -112,8 +111,7 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(raiz, 'xServ').text = 'CONSULTAR' etree.SubElement(raiz, 'chNFe').text = chave # Monta XML para envio da requisição - xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(metodo='NfeConsulta2'), metodo='NfeConsulta2', dados=raiz) - + xml = self._construir_xml_soap('NFeConsultaProtocolo4', raiz) return self._post(url, xml) def consulta_notas_cnpj(self, cnpj, nsu=0): @@ -140,7 +138,7 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(raiz, 'ultNSU').text = str(nsu) # Monta XML para envio da requisição - xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(metodo='NfeConsultaDest'), metodo='NfeConsultaDest', dados=raiz) + xml = self._construir_xml_soap('NfeConsultaDest', raiz) return self._post(url, xml) @@ -167,7 +165,7 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(info, 'CNPJ').text = cnpj #etree.SubElement(info, 'CPF').text = cpf # Monta XML para envio da requisição - xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(metodo='CadConsultaCadastro2'), metodo='CadConsultaCadastro2', dados=raiz) + xml = self._construir_xml_soap('CadConsultaCadastro4', raiz) # Chama método que efetua a requisição POST no servidor SOAP return self._post(url, xml) @@ -186,24 +184,19 @@ class ComunicacaoSefaz(Comunicacao): raiz = etree.Element('envEvento', versao='1.00', xmlns=NAMESPACE_NFE) etree.SubElement(raiz, 'idLote').text = str(idlote) # numero autoincremental gerado pelo sistema raiz.append(evento) - xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(metodo='RecepcaoEvento'), metodo='RecepcaoEvento', dados=raiz) + xml = self._construir_xml_soap('NFeRecepcaoEvento4', raiz) return self._post(url, xml) def status_servico(self, modelo): """ Verifica status do servidor da receita. """ - """ modelo é a string com tipo de serviço que deseja consultar - Ex: nfe ou nfce - """ - url = self._get_url(modelo=modelo, consulta='STATUS') - + """ modelo é a string com tipo de serviço que deseja consultar Ex: nfe ou nfce """ + url = self._get_url(modelo, 'STATUS') # Monta XML do corpo da requisição raiz = etree.Element('consStatServ', versao=VERSAO_PADRAO, xmlns=NAMESPACE_NFE) etree.SubElement(raiz, 'tpAmb').text = str(self._ambiente) etree.SubElement(raiz, 'cUF').text = CODIGOS_ESTADOS[self.uf.upper()] etree.SubElement(raiz, 'xServ').text = 'STATUS' - # Monta XML para envio da requisição - xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(metodo='NfeStatusServico2'), metodo='NfeStatusServico2', dados=raiz) - # Chama método que efetua a requisição POST no servidor SOAP + xml = self._construir_xml_soap('NFeStatusServico4', raiz) return self._post(url, xml) def download(self, cnpj, chave): @@ -222,7 +215,7 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(raiz, 'chNFe').text = str(chave) # Monta XML para envio da requisição - xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(metodo='NfeDownloadNF'), metodo='NfeDownloadNF', dados=raiz) + xml = self._construir_xml_soap('NfeDownloadNF', raiz) return self._post(url, xml) @@ -266,7 +259,7 @@ class ComunicacaoSefaz(Comunicacao): xml = a1.assinar(raiz) # Monta XML para envio da requisição - xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(metodo='NfeInutilizacao2'), metodo='NfeInutilizacao2', dados=xml) + xml = self._construir_xml_soap('NFeInutilizacao4', xml) # Faz request no Servidor da Sefaz e retorna resposta return self._post(url, xml) @@ -381,33 +374,19 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(raiz, 'cUF').text = CODIGOS_ESTADOS[self.uf.upper()] return raiz - def _construir_xml_soap(self, cabecalho, metodo, dados): + def _construir_xml_soap(self, metodo, dados): """Mota o XML para o envio via SOAP""" - - raiz = etree.Element('{%s}Envelope'%NAMESPACE_SOAP, nsmap={'soap12': NAMESPACE_SOAP}) - c= etree.SubElement(raiz, '{%s}Header'%NAMESPACE_SOAP) - c.append(cabecalho) + 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) a.append(dados) return raiz - def _construir_xml_status_pr(self, cabecalho, metodo, dados): - u"""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}) - c = etree.SubElement(raiz, '{%s}Header' % NAMESPACE_SOAP) - c.append(cabecalho) - body = etree.SubElement(raiz, '{%s}Body' % NAMESPACE_SOAP) - a = etree.SubElement(body, 'nfeDadosMsg', xmlns=NAMESPACE_METODO+metodo) - a.append(dados) - return raiz - def _post_header(self): - u"""Retorna um dicionário com os atributos para o cabeçalho da requisição HTTP""" + """Retorna um dicionário com os atributos para o cabeçalho da requisição HTTP""" return { - u'content-type': u'application/soap+xml; charset=utf-8;', - u'Accept': u'application/soap+xml; charset=utf-8;', + 'content-type': 'application/soap+xml; charset=utf-8;', + 'Accept': 'application/soap+xml; charset=utf-8;', } def _post(self, url, xml): @@ -422,19 +401,11 @@ class ComunicacaoSefaz(Comunicacao): lambda x:x.group(0).replace('<','<').replace('>','>').replace('amp;',''), etree.tostring(xml, encoding='unicode').replace('\n','')) xml = xml_declaration + xml - - # adapter para substituir ssl por tls - # s = requests.Session() - # s.mount(url, AdapterTLSV1()) - # print(xml) - # # print(self._post_header()) - # # Faz o request com o servidor - # result = s.post(url, xml, headers=self._post_header(), cert=chave_cert, verify=False, timeout=120) - # result.encoding = 'utf-8' - # return result + # debug dev 4.00 + print(xml) print(url) # Faz o request com o servidor - result = requests.post(url, xml, headers=self._post_header(), cert=chave_cert, verify=False, timeout=120) + result = requests.post(url, xml, headers=self._post_header(), cert=chave_cert, verify=False) result.encoding = 'utf-8' return result except requests.exceptions.RequestException as e: @@ -665,15 +636,3 @@ class ComunicacaoNfse(Comunicacao): raise Exception('Método não implementado no autorizador.') except Exception as e: raise e - -""" Adapter para conexão tls """ -from requests.adapters import HTTPAdapter -from requests.packages.urllib3.poolmanager import PoolManager -import ssl - -class AdapterTLSV1(HTTPAdapter): - def init_poolmanager(self, connections, maxsize, block=False): - self.poolmanager = PoolManager(num_pools=connections, - maxsize=maxsize, - block=block, - ssl_version=ssl.PROTOCOL_TLSv1_2) \ No newline at end of file diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 38c5e70..4862980 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -747,240 +747,3 @@ class SerializacaoNfse(object): return SerializacaoBetha().cancelar(nfse) else: raise Exception('Autorizador não suportado para cancelamento!') - - -class SerializacaoPipes(Serializacao): - """Serialização utilizada pela SEFAZ-SP para a importação de notas.""" - - def exportar(self, destino, **kwargs): - pass - - def _serializar_emitente(self, emitente, retorna_string=True): - - cod_municipio, municipio = obter_municipio_e_codigo( - dict(codigo=emitente.endereco_cod_municipio, - municipio=emitente.endereco_municipio), - emitente.endereco_uf - ) - - serial_emitente_list = [ - '\nC', - emitente.razao_social, - emitente.nome_fantasia, - emitente.inscricao_estadual, - emitente.inscricao_estadual_subst_tributaria, - emitente.inscricao_municipal, - emitente.cnae_fiscal, - emitente.codigo_de_regime_tributario, - '\nC02', - emitente.cnpj, - '\nC05', - emitente.endereco_logradouro, - emitente.endereco_numero, - emitente.endereco_complemento, - emitente.endereco_bairro, - cod_municipio, - municipio, - obter_uf_por_codigo(emitente.endereco_uf), - emitente.endereco_cep.replace('-',''), - emitente.endereco_pais, - obter_pais_por_codigo(emitente.endereco_pais), - emitente.endereco_telefone, - ] - - if retorna_string: - return '|'.join(map(str,serial_emitente_list)) - return serial_emitente_list - - def _serializar_cliente(self, cliente, retorna_string=True): - - cod_municipio, municipio = obter_municipio_e_codigo( - dict(codigo=cliente.endereco_cod_municipio, - municipio=cliente.endereco_municipio), - cliente.endereco_uf - ) - - serial_data = [ - '\nE', - cliente.razao_social, - '2', # indIEDest - cliente.inscricao_estadual, - cliente.inscricao_suframa, - '', # IM - cliente.email, - '\nE02' if cliente.tipo_documento == 'CNPJ' else '\nE03', - cliente.numero_documento, - '\nE05', - cliente.endereco_logradouro, - cliente.endereco_numero, - cliente.endereco_complemento, - cliente.endereco_bairro, - cod_municipio, - municipio, - obter_uf_por_codigo(cliente.endereco_uf), - cliente.endereco_cep.replace('-',''), - cliente.endereco_pais, - obter_pais_por_codigo(cliente.endereco_pais), - cliente.endereco_telefone - ] - - if retorna_string: - return '|'.join(map(str,serial_data)) - return serial_data - - def _serializar_produto_servico(self, produto_servico, retorna_string=True): - serial_data = [ - '\nI', - produto_servico.codigo, - produto_servico.ean, - produto_servico.descricao, - produto_servico.ncm, - produto_servico.ex_tipi, - produto_servico.cfop, - produto_servico.unidade_comercial, - formatar_decimal(produto_servico.quantidade_comercial), - formatar_decimal(produto_servico.valor_unitario_comercial), - formatar_decimal(produto_servico.valor_total_bruto), - produto_servico.ean_tributavel, - produto_servico.unidade_tributavel, - formatar_decimal(produto_servico.quantidade_tributavel), - formatar_decimal(produto_servico.valor_unitario_tributavel), - formatar_decimal(produto_servico.total_frete) if produto_servico.total_frete else '', - formatar_decimal(produto_servico.total_seguro) if produto_servico.total_seguro else '', - formatar_decimal(produto_servico.desconto) if produto_servico.desconto else '', - formatar_decimal(produto_servico.outras_despesas_acessorias) if produto_servico.outras_despesas_acessorias else '', - produto_servico.compoe_valor_total, - produto_servico.numero_pedido, - produto_servico.numero_do_item, - '', # nFCI - '\nM', #IMPOSTOS - '\nN', #ICMS - '\nN06', - produto_servico.icms_origem, - produto_servico.icms_modalidade_determinacao_bc, - produto_servico.icms_valor if produto_servico.icms_valor else '', - produto_servico.icms_motivo_desoneracao if produto_servico.icms_valor else '', - '\nQ', #PIS - '\nQ02', - produto_servico.pis_tipo_calculo, - formatar_decimal(produto_servico.pis_valor_base_calculo), - formatar_decimal(produto_servico.pis_aliquota_percentual), - formatar_decimal(produto_servico.pis_valor), - '\nS', #COFINS - '\nS02', - produto_servico.cofins_situacao_tributaria, - formatar_decimal(produto_servico.cofins_valor_base_calculo), - formatar_decimal(produto_servico.cofins_aliquota_percentual), - formatar_decimal(produto_servico.cofins_valor) - ] - - if retorna_string: - return '|'.join(map(str, serial_data)) - return serial_data - - def _serializar_nota_fiscal(self, nota_fiscal, retorna_string=True): - - cod_municipio, municipio = obter_municipio_e_codigo( - dict(codigo='', - municipio=nota_fiscal.municipio), - nota_fiscal.uf - ) - - if nota_fiscal.emitente.endereco_uf == nota_fiscal.cliente.endereco_uf: - id_dest = '1' - else: - id_dest = '2' - - tz = time.strftime("%z") - tz = "{}:{}".format(tz[:-2], tz[-2:]) - - serial_data = [ - 'A', - '3.10', - nota_fiscal.identificador_unico, - '\nB', - CODIGOS_ESTADOS.get(nota_fiscal.uf, nota_fiscal.uf), - nota_fiscal.codigo_numerico_aleatorio, - nota_fiscal.natureza_operacao, - nota_fiscal.forma_pagamento, - nota_fiscal.modelo, - nota_fiscal.serie, - nota_fiscal.numero_nf, - nota_fiscal.data_emissao.strftime('%Y-%m-%dT%H:%M:%S') + tz, - nota_fiscal.data_saida_entrada.strftime('%Y-%m-%dT%H:%M:%S') + tz, - nota_fiscal.tipo_documento, - id_dest, # idDest - cod_municipio, - nota_fiscal.tipo_impressao_danfe, - nota_fiscal.forma_emissao, - nota_fiscal.dv_codigo_numerico_aleatorio, - self._ambiente, - nota_fiscal.finalidade_emissao, - nota_fiscal.cliente_final, # indFinal - nota_fiscal.indicador_presencial, # indPres - nota_fiscal.processo_emissao, - '%s %s' % (self._nome_aplicacao, - nota_fiscal.versao_processo_emissao), - '', # dhCont - Data e Hora da entrada em contingência - '', # xJust - Justificativa da entrada em contingência - ] - - serial_data += self._serializar_emitente(nota_fiscal.emitente, - retorna_string=False) - serial_data += self._serializar_cliente(nota_fiscal.cliente, - retorna_string=False) - - # Produtos e serviços - produtos_servicos = enumerate(nota_fiscal.produtos_e_servicos, start=1) - for num, produto_servico in produtos_servicos: - num_produto = [ - '\nH', - num, # Número do produto na lista - '' - '' # End Pipe - ] - serial_data += num_produto - serial_data += self._serializar_produto_servico(produto_servico, - retorna_string=False) - - serial_data += [ - '\nW', #Valores totais NFe, - '\nW02', - formatar_decimal(nota_fiscal.totais_icms_base_calculo), - formatar_decimal(nota_fiscal.totais_icms_total), - '', # ICMSDeson - formatar_decimal(nota_fiscal.totais_icms_st_base_calculo), - formatar_decimal(nota_fiscal.totais_icms_st_total), - formatar_decimal(nota_fiscal.totais_icms_total_produtos_e_servicos), - formatar_decimal(nota_fiscal.totais_icms_total_frete), - formatar_decimal(nota_fiscal.totais_icms_total_seguro), - formatar_decimal(nota_fiscal.totais_icms_total_desconto), - formatar_decimal(nota_fiscal.totais_icms_total_ii), - formatar_decimal(nota_fiscal.totais_icms_total_ipi), - formatar_decimal(nota_fiscal.totais_icms_pis), - formatar_decimal(nota_fiscal.totais_icms_cofins), - formatar_decimal(nota_fiscal.totais_icms_outras_despesas_acessorias), - formatar_decimal(nota_fiscal.totais_icms_total_nota), - '', # vTotTrib - '\nX', - nota_fiscal.transporte_modalidade_frete, - '\nZ', - nota_fiscal.informacoes_adicionais_interesse_fisco, - nota_fiscal.informacoes_complementares_interesse_contribuinte, - '' # End Pipe - ] - - if retorna_string: - try: - return '|'.join(map(remover_acentos, serial_data)) - except TypeError as err: - enum_args = '\n'.join( - map( - lambda x: str(x[0]) + ' ' + str(x[1]), - enumerate(serial_data) - ) - ) - message = err.message + '\n' + enum_args - raise TypeError(message) - - return serial_data diff --git a/pynfe/utils/flags.py b/pynfe/utils/flags.py index ae99de7..7c1db9e 100644 --- a/pynfe/utils/flags.py +++ b/pynfe/utils/flags.py @@ -10,7 +10,7 @@ NAMESPACE_METODO = 'http://www.portalfiscal.inf.br/nfe/wsdl/' NAMESPACE_SOAP_NFSE = 'http://schemas.xmlsoap.org/soap/envelope/' NAMESPACE_BETHA = 'http://www.betha.com.br/e-nota-contribuinte-ws' -VERSAO_PADRAO = '3.10' +VERSAO_PADRAO = '4.00' VERSAO_QRCODE = '100' diff --git a/pynfe/utils/webservices.py b/pynfe/utils/webservices.py index 7d05fbe..399c35f 100644 --- a/pynfe/utils/webservices.py +++ b/pynfe/utils/webservices.py @@ -162,6 +162,13 @@ NFCE = { 'EVENTOS': '', 'QR': '' }, + # Os Web Services de homologação da NFC-e 4.00 são: + # https://homologacao.nfce.fazenda.sp.gov.br/ws/NFeAutorizacao4.asmx + # https://homologacao.nfce.fazenda.sp.gov.br/ws/NFeStatusServico4.asmx + # https://homologacao.nfce.fazenda.sp.gov.br/ws/NFeConsultaProtocolo4.asmx + # https://homologacao.nfce.fazenda.sp.gov.br/ws/NFeRetAutorizacao4.asmx + # https://homologacao.nfce.fazenda.sp.gov.br/ws/NFeRecepcaoEvento4.asmx + # https://homologacao.nfce.fazenda.sp.gov.br/ws/NFeInutilizacao4.asmx 'SP': { 'STATUS': 'nfce.fazenda.sp.gov.br/ws/nfestatusservico2.asmx', 'AUTORIZACAO': 'nfce.fazenda.sp.gov.br/ws/nfeautorizacao.asmx', @@ -245,10 +252,12 @@ NFCE = { } # Nfe +# homologação => http://hom.nfe.fazenda.gov.br/PORTAL/WebServices.aspx +# produção => https://www.nfe.fazenda.gov.br/portal/webServices.aspx NFE = { # Alguns serviços são disponibilizados apenas pelo ambiente nacional 'AN': { - 'EVENTOS': 'nfe.fazenda.gov.br/RecepcaoEvento/RecepcaoEvento.asmx', # versao: 1.00 + 'EVENTOS': 'nfe.fazenda.gov.br/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx', # versao: 4.00 'DISTRIBUICAO': 'nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx', 'DOWNLOAD': 'nfe.fazenda.gov.br/NfeDownloadNF/NfeDownloadNF.asmx', # versao: 2.00/3.10 'DESTINADAS': 'nfe.fazenda.gov.br/NFeConsultaDest/NFeConsultaDest.asmx', # versao: 2.00/3.10 @@ -270,12 +279,12 @@ NFE = { 'CADASTRO': 'https://sistemas.sefaz.ma.gov.br/wscadastro/CadConsultaCadastro2?wsdl' }, 'CE': { - 'STATUS': 'sefaz.ce.gov.br/nfe2/services/NfeStatusServico2?wsdl', - 'AUTORIZACAO': 'sefaz.ce.gov.br/nfe2/services/NfeAutorizacao?wsdl', - 'RECIBO': 'sefaz.ce.gov.br/nfe2/services/NfeRetAutorizacao?wsdl', - 'CHAVE': 'sefaz.ce.gov.br/nfe2/services/NfeConsulta2?wsdl', - 'INUTILIZACAO': 'sefaz.ce.gov.br/nfe2/services/NfeInutilizacao2?wsdl', - 'EVENTOS': 'sefaz.ce.gov.br/nfe2/services/RecepcaoEvento?wsdl', + 'STATUS': 'sefaz.ce.gov.br/nfe4/services/NFeStatusServico4?WSDL', + 'AUTORIZACAO': 'sefaz.ce.gov.br/nfe4/services/NFeAutorizacao4?WSDL', + 'RECIBO': 'sefaz.ce.gov.br/nfe4/services/NFeRetAutorizacao4?WSDL', + 'CHAVE': 'sefaz.ce.gov.br/nfe4/services/NFeConsultaProtocolo4?WSDL', + 'INUTILIZACAO': 'sefaz.ce.gov.br/nfe4/services/NFeInutilizacao4?WSDL', + 'EVENTOS': 'sefaz.ce.gov.br/nfe4/services/NFeRecepcaoEvento4?WSDL', 'CADASTRO': 'sefaz.ce.gov.br/nfe2/services/CadConsultaCadastro2?wsdl', 'DOWNLOAD': 'sefaz.ce.gov.br/nfe2/services/NfeDownloadNF?wsdl', 'HTTPS': 'https://nfe.', @@ -304,46 +313,46 @@ NFE = { 'HOMOLOGACAO': 'https://h' }, 'MG': { - 'STATUS': 'nfe.fazenda.mg.gov.br/nfe2/services/NfeStatus2', - 'AUTORIZACAO': 'nfe.fazenda.mg.gov.br/nfe2/services/NfeAutorizacao', - 'RECIBO': 'nfe.fazenda.mg.gov.br/nfe2/services/NfeRetAutorizacao', - 'CHAVE': 'nfe.fazenda.mg.gov.br/nfe2/services/NfeConsulta2', - 'INUTILIZACAO': 'nfe.fazenda.mg.gov.br/nfe2/services/NfeInutilizacao2', + 'STATUS': 'nfe.fazenda.mg.gov.br/nfe2/services/NFeStatusServico4', + 'AUTORIZACAO': 'nfe.fazenda.mg.gov.br/nfe2/services/NFeAutorizacao4', + 'RECIBO': 'nfe.fazenda.mg.gov.br/nfe2/services/NFeRetAutorizacao4', + 'CHAVE': 'nfe.fazenda.mg.gov.br/nfe2/services/NFeConsulta4', + 'INUTILIZACAO': 'nfe.fazenda.mg.gov.br/nfe2/services/NFeInutilizacao4', 'EVENTOS': 'nfe.fazenda.mg.gov.br/nfe2/services/RecepcaoEvento', 'CADASTRO': 'nfe.fazenda.mg.gov.br/nfe2/services/cadconsultacadastro2', 'HTTPS': 'https://', 'HOMOLOGACAO': 'https://h' }, 'SP': { - 'STATUS': 'nfe.fazenda.sp.gov.br/ws/nfestatusservico2.asmx', - 'AUTORIZACAO': 'nfe.fazenda.sp.gov.br/ws/nfeautorizacao.asmx', - 'RECIBO': 'nfe.fazenda.sp.gov.br/ws/nferetautorizacao.asmx', - 'CHAVE': 'nfe.fazenda.sp.gov.br/ws/nfeconsulta2.asmx', - 'INUTILIZACAO': 'nfe.fazenda.sp.gov.br/ws/nfeinutilizacao2.asmx', - 'EVENTOS': 'nfe.fazenda.sp.gov.br/ws/recepcaoevento.asmx', - 'CADASTRO': 'nfe.fazenda.sp.gov.br/ws/cadconsultacadastro2.asmx', + 'STATUS': 'nfe.fazenda.sp.gov.br/ws/NFeStatusServico4.asmx', + 'AUTORIZACAO': 'nfe.fazenda.sp.gov.br/ws/nfeautorizacao4.asmx', + 'RECIBO': 'nfe.fazenda.sp.gov.br/ws/nferetautorizacao4.asmx', + 'CHAVE': 'nfe.fazenda.sp.gov.br/ws/nfeconsulta4.asmx', + 'INUTILIZACAO': 'nfe.fazenda.sp.gov.br/ws/nfeinutilizacao4.asmx', + 'EVENTOS': 'nfe.fazenda.sp.gov.br/ws/nferecepcaoevento4.asmx', + 'CADASTRO': 'nfe.fazenda.sp.gov.br/ws/cadconsultacadastro4.asmx', 'HTTPS': 'https://', 'HOMOLOGACAO': 'https://homologacao.' }, 'PR': { - 'STATUS': 'nfe.fazenda.pr.gov.br/nfe/NFeStatusServico3', # CONSULTA STATUS DO SERVICO - 'AUTORIZACAO': 'nfe.fazenda.pr.gov.br/nfe/NFeAutorizacao3', # AUTORIZACAO - 'RECIBO': 'nfe.fazenda.pr.gov.br/nfe/NFeRetAutorizacao3', # CONSULTA RECIBO - 'CHAVE': 'nfe.fazenda.pr.gov.br/nfe/NFeConsulta3', # CONSULTA CHAVE DE ACESSO - 'INUTILIZACAO': 'nfe.fazenda.pr.gov.br/nfe/NFeInutilizacao3', # INUTILIZAÇAO - 'EVENTOS': 'nfe.fazenda.pr.gov.br/nfe/NFeRecepcaoEvento', # REGISTRO DE EVENTOS - 'CADASTRO': 'nfe.fazenda.pr.gov.br/nfe/CadConsultaCadastro2', # CONSULTA CADASTRO + 'STATUS': 'nfe.sefa.pr.gov.br/nfe/NFeStatusServico4', # CONSULTA STATUS DO SERVICO + 'AUTORIZACAO': 'nfe.sefa.pr.gov.br/nfe/NFeAutorizacao4', # AUTORIZACAO + 'RECIBO': 'nfe.sefa.pr.gov.br/nfe/NFeRetAutorizacao4', # CONSULTA RECIBO + 'CHAVE': 'nfe.sefa.pr.gov.br/nfe/NFeConsultaProtocolo4', # CONSULTA CHAVE DE ACESSO + 'INUTILIZACAO': 'nfe.sefa.pr.gov.br/nfe/NFeInutilizacao4', # INUTILIZAÇAO + 'EVENTOS': 'nfe.sefa.pr.gov.br/nfe/NFeRecepcaoEvento4', # REGISTRO DE EVENTOS + 'CADASTRO': 'nfe.sefa.pr.gov.br/nfe/CadConsultaCadastro4', # CONSULTA CADASTRO 'HTTPS': 'https://', 'HOMOLOGACAO': 'https://homologacao.' }, # https://www.sefaz.rs.gov.br/site/MontaDuvidas.aspx?al=l_rel_end_ws_nfe 'RS': { - 'STATUS': 'sefazrs.rs.gov.br/ws/NfeStatusServico/NfeStatusServico2.asmx', - 'AUTORIZACAO': 'sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx', - 'RECIBO': 'sefazrs.rs.gov.br/ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - 'CHAVE': 'sefazrs.rs.gov.br/ws/NfeConsulta/NfeConsulta2.asmx', - 'INUTILIZACAO': 'sefazrs.rs.gov.br/ws/nfeinutilizacao/nfeinutilizacao2.asmx', - 'EVENTOS': 'sefazrs.rs.gov.br/ws/recepcaoevento/recepcaoevento.asmx', + 'STATUS': 'sefazrs.rs.gov.br/ws/NfeStatusServico/NfeStatusServico4.asmx', + 'AUTORIZACAO': 'sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao4.asmx', + 'RECIBO': 'sefazrs.rs.gov.br/ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx', + 'CHAVE': 'sefazrs.rs.gov.br/ws/NfeConsulta/NfeConsulta4.asmx', + 'INUTILIZACAO': 'sefazrs.rs.gov.br/ws/nfeinutilizacao/nfeinutilizacao4.asmx', + 'EVENTOS': 'sefazrs.rs.gov.br/ws/recepcaoevento/recepcaoevento4.asmx', 'CADASTRO': 'https://cad.sefazrs.rs.gov.br/ws/cadconsultacadastro/cadconsultacadastro2.asmx', 'DOWNLOAD': 'sefazrs.rs.gov.br/ws/nfeDownloadNF/nfeDownloadNF.asmx', 'DESTINADAS': 'sefazrs.rs.gov.br/ws/nfeConsultaDest/nfeConsultaDest.asmx', @@ -351,12 +360,12 @@ NFE = { 'HOMOLOGACAO': 'https://nfe-homologacao.' }, 'MS': { - 'STATUS': 'nfe.fazenda.ms.gov.br/producao/services2/NfeStatusServico2', - 'AUTORIZACAO': 'nfe.fazenda.ms.gov.br/producao/services2/NfeAutorizacao', - 'RECIBO': 'nfe.fazenda.ms.gov.br/producao/services2/NfeRetAutorizacao', - 'CHAVE': 'nfe.fazenda.ms.gov.br/producao/services2/NfeConsulta2', - 'INUTILIZACAO': 'nfe.fazenda.ms.gov.br/producao/services2/NfeInutilizacao2', - 'EVENTOS': 'nfe.fazenda.ms.gov.br/producao/services2/RecepcaoEvento', + 'STATUS': 'nfe.ms.gov.br/ws/NFeStatusServico4', + 'AUTORIZACAO': 'nfe.ms.gov.br/ws/NFeAutorizacao4', + 'RECIBO': 'nfe.ms.gov.br/ws/NFeRetAutorizacao4', + 'CHAVE': 'nfe.ms.gov.br/ws/NFeConsultaProtocolo4', + 'INUTILIZACAO': 'nfe.ms.gov.br/ws/NFeInutilizacao4', + 'EVENTOS': 'nfe.ms.gov.br/ws/NFeRecepcaoEvento4', 'CADASTRO': 'nfe.fazenda.ms.gov.br/producao/services2/CadConsultaCadastro2', 'HTTPS': 'https://', 'HOMOLOGACAO': 'https://homologacao.' @@ -373,13 +382,13 @@ NFE = { 'HOMOLOGACAO': 'https://homologacao.' }, 'GO': { - 'STATUS': 'sefaz.go.gov.br/nfe/services/v2/NfeStatusServico2?wsdl', - 'AUTORIZACAO': 'sefaz.go.gov.br/nfe/services/v2/NfeAutorizacao?wsdl', - 'RECIBO': 'sefaz.go.gov.br/nfe/services/v2/NfeRetAutorizacao?wsdl', - 'CHAVE': 'sefaz.go.gov.br/nfe/services/v2/NfeConsulta2?wsdl', - 'INUTILIZACAO': 'sefaz.go.gov.br/nfe/services/v2/NfeInutilizacao2?wsdl', - 'EVENTOS': 'sefaz.go.gov.br/nfe/services/v2/RecepcaoEvento?wsdl', - 'CADASTRO': 'sefaz.go.gov.br/nfe/services/v2/CadConsultaCadastro2?wsdl', + 'STATUS': 'sefaz.go.gov.br/nfe/services/NFeStatusServico4?wsdl', + 'AUTORIZACAO': 'sefaz.go.gov.br/nfe/services/NFeAutorizacao4?wsdl', + 'RECIBO': 'sefaz.go.gov.br/nfe/services/NFeRetAutorizacao4?wsdl', + 'CHAVE': 'sefaz.go.gov.br/nfe/services/NFeConsultaProtocolo4?wsdl', + 'INUTILIZACAO': 'sefaz.go.gov.br/nfe/services/NFeInutilizacao4?wsdl', + 'EVENTOS': 'sefaz.go.gov.br/nfe/services/NFeRecepcaoEvento4?wsdl', + 'CADASTRO': 'sefaz.go.gov.br/nfe/services/CadConsultaCadastro4?wsdl', 'HTTPS': 'https://nfe.', 'HOMOLOGACAO': 'https://homolog.' }, @@ -395,12 +404,12 @@ NFE = { 'HOMOLOGACAO': 'https://hom.' }, 'SVRS': { - 'STATUS': 'svrs.rs.gov.br/ws/NfeStatusServico/NfeStatusServico2.asmx', - 'AUTORIZACAO': 'svrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx', - 'RECIBO': 'svrs.rs.gov.br/ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - 'CHAVE': 'svrs.rs.gov.br/ws/NfeConsulta/NfeConsulta2.asmx', - 'INUTILIZACAO': 'svrs.rs.gov.br/ws/nfeinutilizacao/nfeinutilizacao2.asmx', - 'EVENTOS': 'svrs.rs.gov.br/ws/recepcaoevento/recepcaoevento.asmx', + 'STATUS': 'svrs.rs.gov.br/ws/NfeStatusServico/NfeStatusServico4.asmx', + 'AUTORIZACAO': 'svrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao4.asmx', + 'RECIBO': 'svrs.rs.gov.br/ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx', + 'CHAVE': 'svrs.rs.gov.br/ws/NfeConsulta/NfeConsulta4.asmx', + 'INUTILIZACAO': 'svrs.rs.gov.br/ws/nfeinutilizacao/nfeinutilizacao4.asmx', + 'EVENTOS': 'svrs.rs.gov.br/ws/recepcaoevento/recepcaoevento4.asmx', 'CADASTRO': 'https://cad.svrs.rs.gov.br/ws/cadconsultacadastro/cadconsultacadastro2.asmx', 'HTTPS': 'https://nfe.', 'HOMOLOGACAO': 'https://nfe-homologacao.'