diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 62cfd91..e6a5bad 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -314,25 +314,23 @@ UFAM = { UFBA = { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.ba.gov.br', - WS_NFE_AUTORIZACAO: 'webservices/NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: - 'webservices/NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CONSULTA: 'webservices/NfeConsulta/NfeConsulta.asmx', - WS_NFE_SITUACAO: 'webservices/NfeStatusServico/NfeStatusServico.asmx', - WS_NFE_INUTILIZACAO: 'webservices/nfenw/nfeinutilizacao2.asmx', - WS_NFE_CADASTRO: 'webservices/nfenw/CadConsultaCadastro2.asmx', - WS_NFE_RECEPCAO_EVENTO: 'webservices/sre/recepcaoevento.asmx', + WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', + WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', + WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', + WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', + WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'hnfe.sefaz.ba.gov.br', - WS_NFE_AUTORIZACAO: 'webservices/NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: - 'webservices/NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CONSULTA: 'webservices/NfeConsulta/NfeConsulta.asmx', - WS_NFE_SITUACAO: 'webservices/NfeStatusServico/NfeStatusServico.asmx', - WS_NFE_INUTILIZACAO: 'webservices/nfenw/nfeinutilizacao2.asmx', - WS_NFE_CADASTRO: 'webservices/nfenw/CadConsultaCadastro2.asmx', - WS_NFE_RECEPCAO_EVENTO: 'webservices/sre/recepcaoevento.asmx', + WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', + WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', + WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', + WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', + WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', } } @@ -363,23 +361,23 @@ UFCE = { UFGO = { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.go.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'nfe/services/v2/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'nfe/services/v2/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfe/services/v2/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfe/services/v2/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfe/services/v2/NfeConsulta2', - WS_NFE_SITUACAO: 'nfe/services/v2/NfeStatusServico2', - WS_NFE_CADASTRO: 'nfe/services/v2/CadConsultaCadastro2', + WS_NFE_INUTILIZACAO: 'nfe/services/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe/services/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe/services/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe/services/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe/services/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe/services/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe/services/CadConsultaCadastro4?wsdl', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'homolog.sefaz.go.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'nfe/services/v2/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'nfe/services/v2/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfe/services/v2/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfe/services/v2/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfe/services/v2/NfeConsulta2', - WS_NFE_SITUACAO: 'nfe/services/v2/NfeStatusServico2', - WS_NFE_CADASTRO: 'nfe/services/v2/CadConsultaCadastro2', + WS_NFE_INUTILIZACAO: 'nfe/services/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe/services/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe/services/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe/services/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe/services/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe/services/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe/services/CadConsultaCadastro4?wsdl', } } @@ -554,23 +552,23 @@ UFSP = { NFE_MODELO: { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.fazenda.sp.gov.br', - WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx', - WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx', - WS_NFE_CONSULTA: 'ws/nfeconsulta2.asmx', - WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx', - WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.asmx', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao4.asmx?wsdl', + WS_NFE_CONSULTA: 'ws/nfeconsultaprotocolo4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/nfestatusservico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/nferecepcaoevento4.asmx?wsdl', + WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao4.asmx?wsdl', + WS_NFE_CADASTRO: 'ws/cadconsultacadastro4.asmx?wsdl', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'homologacao.nfe.fazenda.sp.gov.br', - WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx', - WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx', - WS_NFE_CONSULTA: 'ws/nfeconsulta2.asmx', - WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx', - WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.asmx', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao4.asmx?wsdl', + WS_NFE_CONSULTA: 'ws/nfeconsultaprotocolo4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/nfestatusservico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/nferecepcaoevento4.asmx?wsdl', + WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao4.asmx?wsdl', + WS_NFE_CADASTRO: 'ws/cadconsultacadastro4.asmx?wsdl', } }, NFCE_MODELO: { diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index fdf8a44..c9ecdff 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -7,14 +7,10 @@ import os import hashlib import binascii from lxml import etree -from .comunicacao import executar_consulta from .assinatura import Assinatura from pytrustnfe.xml import render_xml, sanitize_response -from pytrustnfe.utils import CabecalhoSoap from pytrustnfe.utils import gerar_chave, ChaveNFe from pytrustnfe.Servidores import localizar_url, localizar_qrcode -from pytrustnfe.xml.validate import valida_nfe -from pytrustnfe.exceptions import NFeValidationException from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key # Zeep @@ -23,26 +19,6 @@ from zeep import Client from zeep.transports import Transport -def _build_header(method, **kwargs): - action = { - 'NfeAutorizacao': ('NfeAutorizacao', '3.10', 'NfeAutorizacao/nfeAutorizacaoLote'), - 'NfeRetAutorizacao': ('NfeRetAutorizacao', '3.10', 'NfeRetAutorizacao/nfeRetAutorizacaoLote'), - 'NfeConsultaCadastro': ('CadConsultaCadastro2', '2.00', 'CadConsultaCadastro2/consultaCadastro2'), - 'NfeInutilizacao': ('NfeInutilizacao2', '3.10', 'NfeInutilizacao2/nfeInutilizacaoNF2'), - 'RecepcaoEventoCancelamento': ('RecepcaoEvento', '1.00', 'RecepcaoEvento/nfeRecepcaoEvento'), - 'RecepcaoEventoCarta': ('RecepcaoEvento', '1.00', 'RecepcaoEvento/nfeRecepcaoEvento'), - 'NFeDistribuicaoDFe': ('NFeDistribuicaoDFe/nfeDistDFeInteresse', '1.00', 'NFeDistribuicaoDFe/nfeDistDFeInteresse'), - 'RecepcaoEventoManifesto': ('RecepcaoEvento', '1.00', 'RecepcaoEvento/nfeRecepcaoEvento'), - } - vals = { - 'estado': kwargs['estado'], - 'method': action[method][0], - 'soap_action': action[method][2], - 'versao': action[method][1] - } - return CabecalhoSoap(**vals) - - def _generate_nfe_id(**kwargs): for item in kwargs['NFes']: vals = { @@ -136,18 +112,6 @@ def _render(certificado, method, sign, **kwargs): modelo = xmlElem_send.find(".//{http://www.portalfiscal.inf.br/nfe}mod") modelo = modelo.text if modelo is not None else '55' - if modelo == '65': - pagamento = etree.Element('pag') - tipo_pagamento = etree.Element('tPag') - valor = etree.Element('vPag') - valor_pago = kwargs['NFes'][0]['infNFe']['total']['vNF'] - metodo_pagamento = kwargs['NFes'][0]['infNFe']['pagamento'] - tipo_pagamento.text, valor.text = metodo_pagamento, valor_pago - pagamento.append(tipo_pagamento) - pagamento.append(valor) - transp = xmlElem_send.find( - ".//{http://www.portalfiscal.inf.br/nfe}transp") - transp.addnext(pagamento) if sign: # Caso for autorização temos que adicionar algumas tags tipo @@ -161,19 +125,9 @@ def _render(certificado, method, sign, **kwargs): if method == 'NfeAutorizacao': xml_send = signer.assina_xml( xmlElem_send, kwargs['NFes'][0]['infNFe']['Id']) - if 'validate' in kwargs: - erros = valida_nfe(xml_send) - if erros: - raise NFeValidationException('Erro ao validar NFe', - erros=erros, - sent_xml=xml_send) - elif method == 'RecepcaoEventoCancelamento': + elif method == 'RecepcaoEvento': xml_send = signer.assina_xml( xmlElem_send, kwargs['eventos'][0]['Id']) - - if method == 'RecepcaoEventoCarta': - xml_send = signer.assina_xml( - xmlElem_send, kwargs['Id']) elif method == 'RecepcaoEventoManifesto': xml_send = signer.assina_xml( xmlElem_send, kwargs['manifesto']['identificador']) @@ -188,8 +142,8 @@ def _render(certificado, method, sign, **kwargs): def _send(certificado, method, **kwargs): xml_send = kwargs["xml"] - base_url = localizar_url(method, kwargs['estado'], kwargs['modelo'], - kwargs['ambiente']) + base_url = localizar_url( + method, kwargs['estado'], kwargs['modelo'], kwargs['ambiente']) cert, key = extract_cert_and_key_from_pfx( certificado.pfx, certificado.password) @@ -208,7 +162,6 @@ def _send(certificado, method, **kwargs): with client.options(raw_response=True): response = client.service[first_operation](xml) response, obj = sanitize_response(response.text) - return { 'sent_xml': xml_send, 'received_xml': response, @@ -238,13 +191,13 @@ def retorno_autorizar_nfe(certificado, **kwargs): def xml_recepcao_evento_cancelamento(certificado, **kwargs): # Assinar - return _render(certificado, 'RecepcaoEventoCancelamento', True, **kwargs) + return _render(certificado, 'RecepcaoEvento', True, **kwargs) def recepcao_evento_cancelamento(certificado, **kwargs): # Assinar if "xml" not in kwargs: kwargs['xml'] = xml_recepcao_evento_cancelamento(certificado, **kwargs) - return _send(certificado, 'RecepcaoEventoCancelamento', **kwargs) + return _send(certificado, 'RecepcaoEvento', **kwargs) def xml_inutilizar_nfe(certificado, **kwargs): @@ -258,7 +211,7 @@ def inutilizar_nfe(certificado, **kwargs): def xml_consultar_protocolo_nfe(certificado, **kwargs): - return _render(certificado, 'NfeConsultaProtocolo', True, **kwargs) + return _render(certificado, 'NfeConsultaProtocolo', False, **kwargs) def consultar_protocolo_nfe(certificado, **kwargs): @@ -289,14 +242,14 @@ def consulta_cadastro(certificado, **kwargs): def xml_recepcao_evento_carta_correcao(certificado, **kwargs): # Assinar - return _render(certificado, 'RecepcaoEventoCarta', True, **kwargs) + return _render(certificado, 'RecepcaoEvento', True, **kwargs) def recepcao_evento_carta_correcao(certificado, **kwargs): # Assinar if "xml" not in kwargs: kwargs['xml'] = xml_recepcao_evento_carta_correcao( certificado, **kwargs) - return _send(certificado, 'RecepcaoEventoCarta', **kwargs) + return _send(certificado, 'RecepcaoEvento', **kwargs) def xml_recepcao_evento_manifesto(certificado, **kwargs): # Assinar diff --git a/pytrustnfe/nfe/comunicacao.py b/pytrustnfe/nfe/comunicacao.py deleted file mode 100644 index e3d82ed..0000000 --- a/pytrustnfe/nfe/comunicacao.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2016 Danimar Ribeiro, Trustcode -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - - -from pytrustnfe.client import HttpClient -from pytrustnfe.certificado import save_cert_key, extract_cert_and_key_from_pfx - -from ..xml import sanitize_response - - -def _soap_xml(body, cabecalho): - xml = '' - xml += '' - xml += '' - xml += body - xml += '' - return xml.rstrip('\n') - - -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 = '' + xmlEnviar.rstrip('\n') - xml_enviar = xml - xml_retorno = client.post_soap(xml_enviar, cabecalho, send_raw) - return sanitize_response(xml_retorno.encode()) diff --git a/pytrustnfe/nfe/templates/NfeConsultaProtocolo.xml b/pytrustnfe/nfe/templates/NfeConsultaProtocolo.xml index 0156d9e..588c6d8 100644 --- a/pytrustnfe/nfe/templates/NfeConsultaProtocolo.xml +++ b/pytrustnfe/nfe/templates/NfeConsultaProtocolo.xml @@ -1,6 +1,5 @@ - - + {{ obj.ambiente }} CONSULTAR {{ obj.chave_nfe }} - \ No newline at end of file + diff --git a/pytrustnfe/nfe/templates/RecepcaoEventoCancelamento.xml b/pytrustnfe/nfe/templates/RecepcaoEvento.xml similarity index 82% rename from pytrustnfe/nfe/templates/RecepcaoEventoCancelamento.xml rename to pytrustnfe/nfe/templates/RecepcaoEvento.xml index 35d587e..b49a043 100644 --- a/pytrustnfe/nfe/templates/RecepcaoEventoCancelamento.xml +++ b/pytrustnfe/nfe/templates/RecepcaoEvento.xml @@ -8,13 +8,14 @@ {{ evento.CNPJ }} {{ evento.chNFe }} {{ evento.dhEvento }} - 110111 + {{ evento.tpEvento }} {{ evento.nSeqEvento }} 1.00 - Cancelamento + {{ evento.descEvento }} {{ evento.nProt }} {{ evento.xJust|normalize|escape }} + {{ evento.xCondUso }}. diff --git a/pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml b/pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml deleted file mode 100644 index ced435c..0000000 --- a/pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml +++ /dev/null @@ -1,21 +0,0 @@ - - {{ idLote }} - - - {{ cOrgao }} - {{ tpAmb }} - {{ CNPJ }} - {{ CPF }} - {{ chNFe }} - {{ dhEvento }} - {{ tpEvento }} - {{ nSeqEvento }} - 1.00 - - Carta de Correcao - {{ xCorrecao|normalize|escape }} - A Carta de Correcao e disciplinada pelo paragrafo 1o-A do art. 7o do Convenio S/N, de 15 de dezembro de 1970 e pode ser utilizada para regularizacao de erro ocorrido na emissao de documento fiscal, desde que o erro nao esteja relacionado com: I - as variaveis que determinam o valor do imposto tais como: base de calculo, aliquota, diferenca de preco, quantidade, valor da operacao ou da prestacao; II - a correcao de dados cadastrais que implique mudanca do remetente ou do destinatario; III - a data de emissao ou de saida. - - - - diff --git a/pytrustnfe/nfe/templates/RecepcaoEventoEPEC.xml b/pytrustnfe/nfe/templates/RecepcaoEventoEPEC.xml deleted file mode 100644 index 12a8478..0000000 --- a/pytrustnfe/nfe/templates/RecepcaoEventoEPEC.xml +++ /dev/null @@ -1,31 +0,0 @@ - - 00106151340701 - - - 91 - 2 - 10142785000190 - 35140810142785000190550010010615134079599952 - 2014-08-07T04:52:51-03:00 - 110140 - 1 - 1.00 - - EPEC - 35 - 1 - 1.26 - 2014-08-07T00:00:00-03:00 - 1 - 495171423115 - - SP - 00000000191 - 86.00 - 6.02 - 0 - - - - - \ No newline at end of file diff --git a/pytrustnfe/utils.py b/pytrustnfe/utils.py index b5964ae..540fbb9 100644 --- a/pytrustnfe/utils.py +++ b/pytrustnfe/utils.py @@ -8,15 +8,6 @@ from datetime import date, datetime import lxml.etree as ET -class CabecalhoSoap(object): - - def __init__(self, **kwargs): - self.versao = kwargs.pop('versao', '') - self.estado = kwargs.pop('estado', '') - self.method = kwargs.pop('method', '') - self.soap_action = kwargs.pop('soap_action', '') - - class ChaveNFe(object): def __init__(self, **kwargs): diff --git a/pytrustnfe/xml/__init__.py b/pytrustnfe/xml/__init__.py index 5cf7454..fd870a2 100644 --- a/pytrustnfe/xml/__init__.py +++ b/pytrustnfe/xml/__init__.py @@ -15,18 +15,6 @@ def recursively_empty(e): return all((recursively_empty(c) for c in e.iterchildren())) -def recursively_normalize(vals): - for item in vals: - if type(vals[item]) is str: - vals[item] = vals[item].strip() - elif type(vals[item]) is dict: - recursively_normalize(vals[item]) - elif type(vals[item]) is list: - for a in vals[item]: - recursively_normalize(a) - return vals - - def render_xml(path, template_name, remove_empty, **nfe): nfe = recursively_normalize(nfe) env = Environment( @@ -58,7 +46,8 @@ def render_xml(path, template_name, remove_empty, **nfe): def sanitize_response(response): - tree = etree.fromstring(response) + parser = etree.XMLParser(encoding='utf-8') + tree = etree.fromstring(response.encode('UTF-8'), parser=parser) # Remove namespaces inuteis na resposta for elem in tree.getiterator(): if not hasattr(elem.tag, 'find'): diff --git a/tests/test_comunicacao.py b/tests/test_comunicacao.py deleted file mode 100644 index b47c3a1..0000000 --- a/tests/test_comunicacao.py +++ /dev/null @@ -1,20 +0,0 @@ -# coding=utf-8 -''' -Created on Jun 16, 2015 - -@author: danimar -''' -import unittest -import os.path - - -XML_RETORNO = '103' \ - '42' - - -class test_comunicacao(unittest.TestCase): - - caminho = os.path.dirname(__file__) - - def test_envio_nfe(self): - pass diff --git a/tests/test_servidores.py b/tests/test_servidores.py index 2083f2c..69d4bce 100644 --- a/tests/test_servidores.py +++ b/tests/test_servidores.py @@ -7,22 +7,22 @@ Created on Jun 14, 2015 import unittest from pytrustnfe.Servidores import localizar_url, localizar_qrcode -url_ba = 'https://nfe.sefaz.ba.gov.br/webservices/NfeAutorizacao/NfeAutoriza\ -cao.asmx' +url_ba = 'https://nfe.sefaz.ba.gov.br/webservices/NFeAutorizacao4/NFeAutoriza\ +cao4.asmx?wsdl' -url_sp = 'https://nfe.fazenda.sp.gov.br/ws/nfeautorizacao.asmx' +url_sp = 'https://nfe.fazenda.sp.gov.br/ws/nfeautorizacao4.asmx?wsdl' url_qrcode_homologacao_sp = 'https://homologacao.nfce.fazenda.sp.gov.br/NFCEConsultaPublica/Paginas/ConstultaQRCode.aspx' -url_sc = 'https://nfe.svrs.rs.gov.br/ws/NfeAutorizacao/NfeAutorizacao.asmx' +url_sc = 'https://nfe.svrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao4.asmx' url_rs = 'https://nfe.sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx' url_cad_rs = 'https://cad.sefazrs.rs.gov.br/ws/cadconsultacadastro/cadcon\ sultacadastro2.asmx' -url_cad_sc = 'https://cad.svrs.rs.gov.br/ws/CadConsultaCadastro/CadConsult\ -aCadastro2.asmx' +url_cad_sc = 'https://cad.svrs.rs.gov.br/ws/cadconsultacadastro/cadconsulta\ +cadastro2.asmx' class test_servidores(unittest.TestCase):