From 38874665b9df092697d378f43a67f520101d8c2c Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Fri, 13 Apr 2018 21:21:43 -0300 Subject: [PATCH 01/85] =?UTF-8?q?WIP=20-=20Implementa=C3=A7=C3=A3o=20da=20?= =?UTF-8?q?nota=20de=20BH,=20tentativa=20de=20usar=20o=20zeep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfse/bh/__init__.py | 78 +++++++++++++++++++++++ pytrustnfe/nfse/bh/templates/CancelarNfse.xml | 13 ++++ pytrustnfe/nfse/bh/templates/GerarNfse.xml | 11 ++++ pytrustnfe/nfse/bh/templates/Rps.xml | 91 +++++++++++++++++++++++++++ 4 files changed, 193 insertions(+) create mode 100644 pytrustnfe/nfse/bh/__init__.py create mode 100644 pytrustnfe/nfse/bh/templates/CancelarNfse.xml create mode 100644 pytrustnfe/nfse/bh/templates/GerarNfse.xml create mode 100644 pytrustnfe/nfse/bh/templates/Rps.xml diff --git a/pytrustnfe/nfse/bh/__init__.py b/pytrustnfe/nfse/bh/__init__.py new file mode 100644 index 0000000..4c9fd3f --- /dev/null +++ b/pytrustnfe/nfse/bh/__init__.py @@ -0,0 +1,78 @@ +# © 2018 Danimar Ribeiro, Trustcode +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import os + +from requests import Session +from zeep import Client +from zeep.transports import Transport + +from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key +from pytrustnfe.xml import render_xml, sanitize_response +from pytrustnfe.nfe.assinatura import Assinatura + + +def _render(certificado, method, **kwargs): + path = os.path.join(os.path.dirname(__file__), 'templates') + xml_send = render_xml(path, '%s.xml' % method, True, **kwargs) + + reference = '' + if method == 'GerarNfse': + reference = 'r%s' % kwargs['rps']['numero'] + elif method == 'CancelarNfse': + reference = 'Cancelamento_NF%s' % kwargs['cancelamento']['numero_nfse'] + + signer = Assinatura(certificado.pfx, certificado.password) + xml_send = signer.assina_xml(xml_send, reference) + return xml_send.encode('utf-8') + + +def _send(certificado, method, **kwargs): + base_url = '' + if kwargs['ambiente'] == 'producao': + base_url = 'https://bhissdigital.pbh.gov.br/bhiss-ws/nfse?wsdl' + else: + base_url = 'https://bhisshomologa.pbh.gov.br/bhiss-ws/nfse?wsdl' + + xml_send = kwargs["xml"].decode('utf-8') + xml_cabecalho = '' + + cert, key = extract_cert_and_key_from_pfx( + certificado.pfx, certificado.password) + cert, key = save_cert_key(cert, key) + + session = Session() + session.cert = (cert, key) + session.verify = False + transport = Transport(session=session) + + client = Client(base_url, transport=transport) + + response = client.service[method](xml_cabecalho, xml_send) + + response, obj = sanitize_response(response) + return { + 'sent_xml': str(xml_send), + 'received_xml': str(response), + 'object': obj + } + + +def xml_gerar_nfse(certificado, **kwargs): + return _render(certificado, 'GerarNfse', **kwargs) + + +def gerar_nfse(certificado, **kwargs): + if "xml" not in kwargs: + kwargs['xml'] = xml_gerar_nfse(certificado, **kwargs) + return _send(certificado, 'GerarNfse', **kwargs) + + +def xml_cancelar_nfse(certificado, **kwargs): + return _render(certificado, 'CancelarNfse', **kwargs) + + +def cancelar_nfse(certificado, **kwargs): + if "xml" not in kwargs: + kwargs['xml'] = xml_cancelar_nfse(certificado, **kwargs) + return _send(certificado, 'CancelarNfse', **kwargs) diff --git a/pytrustnfe/nfse/bh/templates/CancelarNfse.xml b/pytrustnfe/nfse/bh/templates/CancelarNfse.xml new file mode 100644 index 0000000..137897e --- /dev/null +++ b/pytrustnfe/nfse/bh/templates/CancelarNfse.xml @@ -0,0 +1,13 @@ + + + + + {{ cancelamento.numero_nfse }} + {{ cancelamento.cnpj_prestador }} + {{ cancelamento.inscricao_municipal }} + {{ cancelamento.cidade }} + + 1 + + + diff --git a/pytrustnfe/nfse/bh/templates/GerarNfse.xml b/pytrustnfe/nfse/bh/templates/GerarNfse.xml new file mode 100644 index 0000000..c6ead33 --- /dev/null +++ b/pytrustnfe/nfse/bh/templates/GerarNfse.xml @@ -0,0 +1,11 @@ + + + {{ nfse.numero_lote }} + {{ nfse.cnpj_prestador }} + {{ nfse.inscricao_municipal }} + 1 + + {% include 'Rps.xml' %} + + + diff --git a/pytrustnfe/nfse/bh/templates/Rps.xml b/pytrustnfe/nfse/bh/templates/Rps.xml new file mode 100644 index 0000000..7b883af --- /dev/null +++ b/pytrustnfe/nfse/bh/templates/Rps.xml @@ -0,0 +1,91 @@ + + + + {{ rps.numero }} + {{ rps.serie }} + {{ rps.tipo_rps }} + + {{ rps.data_emissao }} + {{ rps.natureza_operacao }} + {{ rps.regime_tributacao }} + {{ rps.optante_simples }} + {{ rps.incentivador_cultural }} + {{ rps.status }} + + {{ rps.numero_substituido }} + {{ rps.serie_substituido }} + {{ rps.tipo_substituido }} + + + + {{ rps.valor_servico }} + {{ rps.valor_deducao }} + {{ rps.valor_pis }} + {{ rps.valor_cofins }} + {{ rps.valor_inss }} + {{ rps.valor_ir }} + {{ rps.valor_csll }} + {{ rps.iss_retido }} + {{ rps.valor_iss }} + {{ rps.valor_iss_retido }} + {{ rps.outras_retencoes }} + {{ rps.base_calculo }} + {{ rps.aliquota_issqn }} + {{ rps.valor_liquido_nfse }} + {{ rps.desconto_incondicionado }} + {{ rps.desconto_condicionado }} + + {{ rps.codigo_servico }} + {{ rps.cnae_servico }} + {{ rps.codigo_tributacao_municipio }} + {{ rps.descricao }} + {{ rps.codigo_municipio }} + + + {{ rps.prestador.cnpj }} + {{ rps.prestador.inscricao_municipal }} + + + + + {% if rps.tomador.cnpj_cpf|length == 14 %} + {{ rps.tomador.cnpj_cpf }} + {% endif %} + {% if rps.tomador.cnpj_cpf|length == 11 %} + {{ rps.tomador.cnpj_cpf }} + {% endif %} + + {{ rps.tomador.inscricao_municipal }} + + {{ rps.tomador.razao_social }} + + {{ rps.tomador.logradouro }} + {{ rps.tomador.numero }} + {{ rps.tomador.complemento }} + {{ rps.tomador.bairro }} + {{ rps.tomador.cidade }} + {{ rps.tomador.uf }} + {{ rps.tomador.cep }} + + + {{ rps.tomador.telefone }} + {{ rps.tomador.email }} + + + {% if rps.intermediario is defined -%} + + {{ rps.intermediario.razao_social }} + + {{ rps.intermediario.cnpj }} + + {{ rps.intermediario.inscricao_municipal }} + + {% endif %} + {% if rps.construcao_civil is defined -%} + + {{ rps.construcao_civil.codigo_obra }} + {{ rps.construcao_civil.art }} + + {% endif %} + + From 9a1f406c623d19a112c75c7fe12d0cad54164bda Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Sat, 14 Apr 2018 12:28:18 -0300 Subject: [PATCH 02/85] =?UTF-8?q?Corre=C3=A7=C3=A3o=20no=20envio=20de=20NF?= =?UTF-8?q?e=20para=20o=20estado=20do=20Cear=C3=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/Servidores.py | 8 ++++---- pytrustnfe/client.py | 9 +++++---- pytrustnfe/nfe/__init__.py | 26 ++++++++++++++------------ pytrustnfe/nfe/comunicacao.py | 4 ++-- pytrustnfe/utils.py | 1 + setup.py | 2 +- 6 files changed, 27 insertions(+), 23 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 0b3e28d..8a340fe 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -352,8 +352,8 @@ UFBA = { UFCE = { NFE_AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.ce.gov.br', - WS_NFE_AUTORIZACAO: 'nfe2/services/NfeRecepcao2', - WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetRecepcao2', + WS_NFE_AUTORIZACAO: 'nfe2/services/NfeAutorizacao', + WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetAutorizacao', WS_NFE_INUTILIZACAO: 'nfe2/services/NfeInutilizacao2', WS_NFE_CONSULTA: 'nfe2/services/NfeConsulta2', WS_NFE_SITUACAO: 'nfe2/services/NfeStatusServico2', @@ -363,8 +363,8 @@ UFCE = { }, NFE_AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfeh.sefaz.ce.gov.br', - WS_NFE_AUTORIZACAO: 'nfe2/services/NfeRecepcao2', - WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetRecepcao2', + WS_NFE_AUTORIZACAO: 'nfe2/services/NfeAutorizacao', + WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetAutorizacao', WS_NFE_INUTILIZACAO: 'nfe2/services/NfeInutilizacao2', WS_NFE_CONSULTA: 'nfe2/services/NfeConsulta2', WS_NFE_SITUACAO: 'nfe2/services/NfeStatusServico2', diff --git a/pytrustnfe/client.py b/pytrustnfe/client.py index 03adbd2..e6e67e3 100644 --- a/pytrustnfe/client.py +++ b/pytrustnfe/client.py @@ -45,19 +45,20 @@ class HttpClient(object): def _headers(self, action, send_raw): if send_raw: return { - 'Content-type': 'text/xml; charset=utf-8; action="http://www.portalfiscal.inf.br/nfe/wsdl/%s"' % action, + 'Content-type': 'text/xml; charset=utf-8;', + 'SOAPAction': "http://www.portalfiscal.inf.br/nfe/wsdl/%s" % action, 'Accept': 'application/soap+xml; charset=utf-8', } return { - 'Content-type': 'application/soap+xml; charset=utf-8; action="http://www.portalfiscal.inf.br/nfe/wsdl/%s"' % action, - 'Accept': 'application/soap+xml; charset=utf-8', + 'Content-type': 'application/soap+xml; charset=utf-8;', + 'SOAPAction': 'http://www.portalfiscal.inf.br/nfe/wsdl/%s' % action, } def post_soap(self, xml_soap, cabecalho, send_raw): header = self._headers(cabecalho.soap_action, send_raw) urllib3.disable_warnings(category=InsecureRequestWarning) - res = requests.post(self.url, data=xml_soap, + res = requests.post(self.url, data=xml_soap.encode('utf-8'), cert=(self.cert_path, self.key_path), verify=False, headers=header) return res.text diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index bf87674..c903014 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -19,19 +19,21 @@ from pytrustnfe.exceptions import NFeValidationException def _build_header(method, **kwargs): action = { - 'NfeAutorizacao': ('NfeAutorizacao', '3.10'), - 'NfeRetAutorizacao': ('NfeRetAutorizacao', '3.10'), - 'NfeConsultaCadastro': ('CadConsultaCadastro2', '2.00'), - 'NfeInutilizacao': ('NfeInutilizacao2', '3.10'), - 'RecepcaoEventoCancelamento': ('RecepcaoEvento', '1.00'), - 'RecepcaoEventoCarta': ('RecepcaoEvento', '1.00'), - 'NFeDistribuicaoDFe': ('NFeDistribuicaoDFe/nfeDistDFeInteresse', - '1.00'), - 'RecepcaoEventoManifesto': ('RecepcaoEvento', '1.00'), + '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] } - vals = {'estado': kwargs['estado'], - 'soap_action': action[method][0], - 'versao': action[method][1]} return CabecalhoSoap(**vals) diff --git a/pytrustnfe/nfe/comunicacao.py b/pytrustnfe/nfe/comunicacao.py index df6ba53..34c550e 100644 --- a/pytrustnfe/nfe/comunicacao.py +++ b/pytrustnfe/nfe/comunicacao.py @@ -12,9 +12,9 @@ from ..xml import sanitize_response def _soap_xml(body, cabecalho): xml = '' xml += '' - xml += '' + xml += '' xml += '' + cabecalho.estado + '' + cabecalho.versao + '' - xml += '' + xml += '' xml += body xml += '' return xml.rstrip('\n') diff --git a/pytrustnfe/utils.py b/pytrustnfe/utils.py index c494496..b06fb6e 100644 --- a/pytrustnfe/utils.py +++ b/pytrustnfe/utils.py @@ -13,6 +13,7 @@ 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', '') diff --git a/setup.py b/setup.py index 4f68dcf..8b6eabe 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.9.18" +VERSION = "0.9.19" setup( From 4f423e28f5661e9e0cefcc5b3dc63c063560dd9c Mon Sep 17 00:00:00 2001 From: Johny Chen Jy <31947361+carcaroff@users.noreply.github.com> Date: Mon, 16 Apr 2018 20:29:00 -0300 Subject: [PATCH 03/85] Implementa timezone ao imprimir a danfe --- pytrustnfe/nfe/danfe.py | 94 +++++++++++++++++++++++++++++++++++-------------- requirements.txt | 1 + setup.py | 3 +- 3 files changed, 71 insertions(+), 27 deletions(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 73a0355..3790574 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -20,6 +20,9 @@ from reportlab.lib.styles import ParagraphStyle from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont +import pytz +from datetime import datetime, timedelta + def chunks(cString, nLen): for start in range(0, len(cString), nLen): @@ -36,10 +39,43 @@ def format_cnpj_cpf(value): return cValue -def getdateUTC(cDateUTC): - cDt = cDateUTC[0:10].split('-') +def getdateByTimezone(cDateUTC, timezone=None): + + ''' + Esse método trata a data recebida de acordo com o timezone do + usuário. O seu retorno é dividido em duas partes: + 1) A data em si; + 2) As horas; + :param cDateUTC: string contendo as informações da data + :param timezone: timezone do usuário do sistema + :return: data e hora convertidos para a timezone do usuário + ''' + + # Aqui cortamos a informação do timezone da string (+03:00) + dt = cDateUTC[0:19] + + # Verificamos se a string está completa (data + hora + timezone) + if timezone and len(cDateUTC) == 25: + + # tz irá conter informações da timezone contida em cDateUTC + tz = cDateUTC[19:25] + tz = int(tz.split(':')[0]) + + dt = datetime.strptime(dt, '%Y-%m-%dT%H:%M:%S') + + # dt agora será convertido para o horario em UTC + dt = dt - timedelta(hours=tz) + + # tzinfo passará a apontar para + dt = pytz.utc.localize(dt) + + # valor de dt é convertido para a timezone do usuário + dt = timezone.normalize(dt) + dt = dt.strftime('%Y-%m-%dT%H:%M:%S') + + cDt = dt[0:10].split('-') cDt.reverse() - return '/'.join(cDt), cDateUTC[11:16] + return '/'.join(cDt), dt[11:16] def format_number(cNumber): @@ -74,7 +110,8 @@ def get_image(path, width=1 * cm): class danfe(object): def __init__(self, sizepage=A4, list_xml=None, recibo=True, - orientation='portrait', logo=None, cce_xml=None): + orientation='portrait', logo=None, cce_xml=None, + timezone=None): path = os.path.join(os.path.dirname(__file__), 'fonts') pdfmetrics.registerFont( @@ -114,8 +151,8 @@ class danfe(object): self.Page = 1 # Calculando total linhas usadas para descrições dos itens - # Com bloco fatura, apenas 29 linhas para itens na primeira folha - nNr_Lin_Pg_1 = 34 if oXML_cobr is None else 30 + # Com bloco fatura, apenas 25 linhas para itens na primeira folha + nNr_Lin_Pg_1 = 30 if oXML_cobr is None else 26 # [ rec_ini , rec_fim , lines , limit_lines ] oPaginator = [[0, 0, 0, nNr_Lin_Pg_1]] el_det = oXML.findall(".//{http://www.portalfiscal.inf.br/nfe}det") @@ -154,13 +191,13 @@ class danfe(object): self.NrPages = len(oPaginator) # Calculando nr. páginas if recibo: - self.recibo_entrega(oXML=oXML) + self.recibo_entrega(oXML=oXML, timezone=timezone) - self.ide_emit(oXML=oXML) - self.destinatario(oXML=oXML) + self.ide_emit(oXML=oXML, timezone=timezone) + self.destinatario(oXML=oXML, timezone=timezone) if oXML_cobr is not None: - self.faturas(oXML=oXML_cobr) + self.faturas(oXML=oXML_cobr, timezone=timezone) self.impostos(oXML=oXML) self.transportes(oXML=oXML) @@ -172,7 +209,7 @@ class danfe(object): # Gera o restante das páginas do XML for oPag in oPaginator[1:]: self.newpage() - self.ide_emit(oXML=oXML) + self.ide_emit(oXML=oXML, timezone=timezone) self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPag, list_desc=list_desc, nHeight=77, list_cod_prod=list_cod_prod) @@ -180,11 +217,11 @@ class danfe(object): self.newpage() if cce_xml: for xml in cce_xml: - self._generate_cce(cce_xml=xml, oXML=oXML) + self._generate_cce(cce_xml=xml, oXML=oXML, timezone=timezone) self.newpage() self.canvas.save() - def ide_emit(self, oXML=None): + def ide_emit(self, oXML=None, timezone=None): elem_infNFe = oXML.find( ".//{http://www.portalfiscal.inf.br/nfe}infNFe") elem_protNFe = oXML.find( @@ -262,7 +299,8 @@ class danfe(object): self.stringcenter(self.nLeft + 116.5 + nW_Rect, self.nlin + 19.5, ' '.join(chunks(cChave, 4))) # Chave self.canvas.setFont('NimbusSanL-Regu', 8) - cDt, cHr = getdateUTC(tagtext(oNode=elem_protNFe, cTag='dhRecbto')) + cDt, cHr = getdateByTimezone( + tagtext(oNode=elem_protNFe, cTag='dhRecbto'), timezone) cProtocolo = tagtext(oNode=elem_protNFe, cTag='nProt') cDt = cProtocolo + ' - ' + cDt + ' ' + cHr nW_Rect = (self.width - self.nLeft - self.nRight - 110) / 2 @@ -283,9 +321,9 @@ class danfe(object): # Razão Social emitente P = Paragraph(tagtext(oNode=elem_emit, cTag='xNome'), styleN) - w, h = P.wrap(55 * mm, 50 * mm) + w, h = P.wrap(55 * mm, 40 * mm) P.drawOn(self.canvas, (self.nLeft + 30) * mm, - (self.height - self.nlin - 12) * mm) + (self.height - self.nlin - ((5*h + 12)/12)) * mm) if self.logo: img = get_image(self.logo, width=2 * cm) @@ -332,7 +370,7 @@ class danfe(object): self.nlin += 48 - def destinatario(self, oXML=None): + def destinatario(self, oXML=None, timezone=None): elem_ide = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}ide") elem_dest = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}dest") nMr = self.width - self.nRight @@ -376,9 +414,11 @@ class danfe(object): else: cnpj_cpf = format_cnpj_cpf(tagtext(oNode=elem_dest, cTag='CPF')) self.string(nMr - 69, self.nlin + 7.5, cnpj_cpf) - cDt, cHr = getdateUTC(tagtext(oNode=elem_ide, cTag='dhEmi')) + cDt, cHr = getdateByTimezone(tagtext(oNode=elem_ide, cTag='dhEmi'), + timezone) self.string(nMr - 24, self.nlin + 7.7, cDt + ' ' + cHr) - cDt, cHr = getdateUTC(tagtext(oNode=elem_ide, cTag='dhSaiEnt')) + cDt, cHr = getdateByTimezone( + tagtext(oNode=elem_ide, cTag='dhSaiEnt'), timezone) self.string(nMr - 24, self.nlin + 14.3, cDt + ' ' + cHr) # Dt saída cEnd = tagtext(oNode=elem_dest, cTag='xLgr') + ', ' + tagtext( oNode=elem_dest, cTag='nro') @@ -398,7 +438,7 @@ class danfe(object): self.nlin += 24 # Nr linhas ocupadas pelo bloco - def faturas(self, oXML=None): + def faturas(self, oXML=None, timezone=None): nMr = self.width - self.nRight @@ -431,7 +471,8 @@ class danfe(object): line_iter = iter(oXML[1:10]) # Salta elemt 1 e considera os próximos 9 for oXML_dup in line_iter: - cDt, cHr = getdateUTC(tagtext(oNode=oXML_dup, cTag='dVenc')) + cDt, cHr = getdateByTimezone(tagtext(oNode=oXML_dup, cTag='dVenc'), + timezone) self.string(self.nLeft + nCol + 1, self.nlin + nLin, tagtext(oNode=oXML_dup, cTag='nDup')) self.string(self.nLeft + nCol + 17, self.nlin + nLin, cDt) @@ -759,7 +800,7 @@ obsCont[@xCampo='NomeVendedor']") P.drawOn(self.canvas, (self.nLeft + 1) * mm, altura - h) self.nlin += 36 - def recibo_entrega(self, oXML=None): + def recibo_entrega(self, oXML=None, timezone=None): el_ide = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}ide") el_dest = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}dest") el_total = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}total") @@ -791,7 +832,8 @@ obsCont[@xCampo='NomeVendedor']") self.string(self.width - self.nRight - nW + 2, self.nlin + 14, "SÉRIE %s" % (tagtext(oNode=el_ide, cTag='serie'))) - cDt, cHr = getdateUTC(tagtext(oNode=el_ide, cTag='dhEmi')) + cDt, cHr = getdateByTimezone( + tagtext(oNode=el_ide, cTag='dhEmi'), timezone) cTotal = format_number(tagtext(oNode=el_total, cTag='vNF')) cEnd = tagtext(oNode=el_dest, cTag='xNome') + ' - ' @@ -858,7 +900,7 @@ obsCont[@xCampo='NomeVendedor']") self.oPDF_IO.close() fileObj.write(pdf_out) - def _generate_cce(self, cce_xml=None, oXML=None): + def _generate_cce(self, cce_xml=None, oXML=None, timezone=None): self.canvas.setLineWidth(.2) # labels @@ -897,8 +939,8 @@ obsCont[@xCampo='NomeVendedor']") self.string(82, 24, cnpj) chave_acesso = tagtext(oNode=elem_infNFe, cTag='chNFe') self.string(82, 30, chave_acesso) - data_correcao = getdateUTC(tagtext( - oNode=elem_infNFe, cTag='dhEvento')) + data_correcao = getdateByTimezone(tagtext( + oNode=elem_infNFe, cTag='dhEvento'), timezone) data_correcao = data_correcao[0] + " " + data_correcao[1] self.string(82, 36, data_correcao) cce_id = elem_infNFe.values()[0] diff --git a/requirements.txt b/requirements.txt index abb0836..92f9079 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,3 +14,4 @@ xmlsec >= 1.3.3 reportlab pytest pytest-cov +pytz diff --git a/setup.py b/setup.py index 8b6eabe..623b933 100644 --- a/setup.py +++ b/setup.py @@ -50,7 +50,8 @@ later (LGPLv2+)', 'lxml >= 3.5.0, < 5', 'suds-jurko >= 0.6', 'suds-jurko-requests >= 1.2', - 'reportlab' + 'reportlab', + 'pytz', ], tests_require=[ 'pytest', From 236515b12d7a3627fdfaf290d0a7bce293eaaf38 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 16 Apr 2018 20:42:44 -0300 Subject: [PATCH 04/85] =?UTF-8?q?Ajuste=20ao=20imprimir=20nfe=20cancelada,?= =?UTF-8?q?=20corre=C3=A7=C3=A3o=20de=20encoding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/danfe.py | 3 +-- pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml | 4 ++-- pytrustnfe/utils.py | 4 ++-- setup.py | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 3790574..6561538 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -359,8 +359,7 @@ class danfe(object): self.canvas.restoreState() # Cancelado - if tagtext(oNode=elem_evento, cTag='xEvento') == \ - 'Cancelamento registrado': + if tagtext(oNode=elem_evento, cTag='cStat') == '135': self.canvas.saveState() self.canvas.rotate(45) self.canvas.setFont('NimbusSanL-Bold', 60) diff --git a/pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml b/pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml index 377fb96..ced435c 100644 --- a/pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml +++ b/pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml @@ -12,9 +12,9 @@ {{ nSeqEvento }} 1.00 - Carta de Correção + Carta de Correcao {{ xCorrecao|normalize|escape }} - A Carta de Correção é disciplinada pelo § 1º-A do art. 7º do Convênio S/N, de 15 de dezembro de 1970 e pode ser utilizada para regularização de erro ocorrido na emissão de documento fiscal, desde que o erro não esteja relacionado com: I - as variáveis que determinam o valor do imposto tais como: base de cálculo, alíquota, diferença de preço, quantidade, valor da operação ou da prestação; II - a correção de dados cadastrais que implique mudança do remetente ou do destinatário; III - a data de emissão ou de saída. + 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/utils.py b/pytrustnfe/utils.py index b06fb6e..b5964ae 100644 --- a/pytrustnfe/utils.py +++ b/pytrustnfe/utils.py @@ -93,7 +93,7 @@ def gerar_nfeproc(envio, recibo): nfe = _find_node(docEnvio, "NFe") protocolo = _find_node(docRecibo, "protNFe") if nfe is None or protocolo is None: - return '' + return b'' root.append(nfe) root.append(protocolo) return ET.tostring(root) @@ -105,6 +105,6 @@ def gerar_nfeproc_cancel(nfe_proc, cancelamento): ev_cancelamento = _find_node(docCancel, "retEvento") if ev_cancelamento is None: - return '' + return b'' docEnvio.append(ev_cancelamento) return ET.tostring(docEnvio) diff --git a/setup.py b/setup.py index 623b933..17d5399 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.9.19" +VERSION = "0.9.20" setup( From 3db71b7b9acc2575ae267a7863592951d22e6f07 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 7 May 2018 16:14:14 -0300 Subject: [PATCH 05/85] =?UTF-8?q?Nota=20de=20BH=20utiliza=20duas=20assinat?= =?UTF-8?q?uras=20Corre=C3=A7=C3=B5s=20nos=20templates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfse/bh/__init__.py | 14 ++++++---- pytrustnfe/nfse/bh/assinatura.py | 44 ++++++++++++++++++++++++++++++ pytrustnfe/nfse/bh/templates/GerarNfse.xml | 8 +++--- pytrustnfe/nfse/bh/templates/Rps.xml | 2 +- setup.py | 1 + 5 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 pytrustnfe/nfse/bh/assinatura.py diff --git a/pytrustnfe/nfse/bh/__init__.py b/pytrustnfe/nfse/bh/__init__.py index 4c9fd3f..c5f246b 100644 --- a/pytrustnfe/nfse/bh/__init__.py +++ b/pytrustnfe/nfse/bh/__init__.py @@ -2,14 +2,14 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import os - +from lxml import etree from requests import Session from zeep import Client from zeep.transports import Transport from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key from pytrustnfe.xml import render_xml, sanitize_response -from pytrustnfe.nfe.assinatura import Assinatura +from pytrustnfe.nfse.bh.assinatura import Assinatura def _render(certificado, method, **kwargs): @@ -18,12 +18,14 @@ def _render(certificado, method, **kwargs): reference = '' if method == 'GerarNfse': - reference = 'r%s' % kwargs['rps']['numero'] + reference = 'rps:%s' % kwargs['rps']['numero'] + ref_lote = 'lote%s' % kwargs['rps']['numero_lote'] elif method == 'CancelarNfse': reference = 'Cancelamento_NF%s' % kwargs['cancelamento']['numero_nfse'] signer = Assinatura(certificado.pfx, certificado.password) xml_send = signer.assina_xml(xml_send, reference) + xml_send = signer.assina_xml(etree.fromstring(xml_send), ref_lote) return xml_send.encode('utf-8') @@ -35,7 +37,9 @@ def _send(certificado, method, **kwargs): base_url = 'https://bhisshomologa.pbh.gov.br/bhiss-ws/nfse?wsdl' xml_send = kwargs["xml"].decode('utf-8') - xml_cabecalho = '' + xml_cabecalho = '\ + \ + 1.00' cert, key = extract_cert_and_key_from_pfx( certificado.pfx, certificado.password) @@ -50,7 +54,7 @@ def _send(certificado, method, **kwargs): response = client.service[method](xml_cabecalho, xml_send) - response, obj = sanitize_response(response) + response, obj = sanitize_response(response.encode('utf-8')) return { 'sent_xml': str(xml_send), 'received_xml': str(response), diff --git a/pytrustnfe/nfse/bh/assinatura.py b/pytrustnfe/nfse/bh/assinatura.py new file mode 100644 index 0000000..1831379 --- /dev/null +++ b/pytrustnfe/nfse/bh/assinatura.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# © 2016 Danimar Ribeiro, Trustcode +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import signxml +from lxml import etree +from pytrustnfe.certificado import extract_cert_and_key_from_pfx +from signxml import XMLSigner + + +class Assinatura(object): + + def __init__(self, arquivo, senha): + self.arquivo = arquivo + self.senha = senha + + def assina_xml(self, xml_element, reference): + cert, key = extract_cert_and_key_from_pfx(self.arquivo, self.senha) + + for element in xml_element.iter("*"): + if element.text is not None and not element.text.strip(): + element.text = None + + signer = XMLSigner( + method=signxml.methods.enveloped, signature_algorithm="rsa-sha1", + digest_algorithm='sha1', + c14n_algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315') + + ns = {} + ns[None] = signer.namespaces['ds'] + signer.namespaces = ns + + ref_uri = ('#%s' % reference) if reference else None + signed_root = signer.sign( + xml_element, key=key.encode(), cert=cert.encode(), + reference_uri=ref_uri) + if reference: + element_signed = signed_root.find(".//*[@Id='%s']" % reference) + signature = signed_root.find(".//*[@URI='#%s']" % reference).getparent().getparent() + + if element_signed is not None and signature is not None: + parent = element_signed.getparent() + parent.append(signature) + return etree.tostring(signed_root, encoding=str) diff --git a/pytrustnfe/nfse/bh/templates/GerarNfse.xml b/pytrustnfe/nfse/bh/templates/GerarNfse.xml index c6ead33..6b35d4d 100644 --- a/pytrustnfe/nfse/bh/templates/GerarNfse.xml +++ b/pytrustnfe/nfse/bh/templates/GerarNfse.xml @@ -1,8 +1,8 @@ - - {{ nfse.numero_lote }} - {{ nfse.cnpj_prestador }} - {{ nfse.inscricao_municipal }} + + {{ rps.numero_lote }} + {{ rps.prestador.cnpj }} + {{ rps.prestador.inscricao_municipal }} 1 {% include 'Rps.xml' %} diff --git a/pytrustnfe/nfse/bh/templates/Rps.xml b/pytrustnfe/nfse/bh/templates/Rps.xml index 7b883af..0dfd0cf 100644 --- a/pytrustnfe/nfse/bh/templates/Rps.xml +++ b/pytrustnfe/nfse/bh/templates/Rps.xml @@ -1,5 +1,5 @@ - + {{ rps.numero }} {{ rps.serie }} diff --git a/setup.py b/setup.py index 17d5399..4bf323b 100644 --- a/setup.py +++ b/setup.py @@ -37,6 +37,7 @@ later (LGPLv2+)', 'nfse/imperial/templates/*xml', 'nfse/floripa/templates/*xml', 'nfse/carioca/templates/*xml', + 'nfse/bh/templates/*xml', 'xml/schemas/*xsd', ]}, url='https://github.com/danimaribeiro/PyTrustNFe', From e712bf0d6aa7edc65773e15d99940899247b8b0b Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 8 May 2018 16:48:43 -0300 Subject: [PATCH 06/85] =?UTF-8?q?Corre=C3=A7=C3=A3o=20de=20envio=20Ginfes?= =?UTF-8?q?=20-=20Mudan=C3=A7a=20para=20o=20zeep=20para=20webservice=20SOA?= =?UTF-8?q?P?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfse/ginfes/__init__.py | 35 ++++++++++++++++++++--------------- requirements.txt | 1 + setup.py | 3 ++- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/pytrustnfe/nfse/ginfes/__init__.py b/pytrustnfe/nfse/ginfes/__init__.py index 80e969b..fb27677 100644 --- a/pytrustnfe/nfse/ginfes/__init__.py +++ b/pytrustnfe/nfse/ginfes/__init__.py @@ -3,9 +3,12 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import os -import suds +from requests import Session +from zeep import Client +from zeep.transports import Transport +from requests.packages.urllib3 import disable_warnings + from pytrustnfe.xml import render_xml, sanitize_response -from pytrustnfe.client import get_authenticated_client from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key from pytrustnfe.nfe.assinatura import Assinatura @@ -33,19 +36,21 @@ def _send(certificado, method, **kwargs): cert, key = extract_cert_and_key_from_pfx( certificado.pfx, certificado.password) cert, key = save_cert_key(cert, key) - client = get_authenticated_client(base_url, cert, key) - try: - xml_send = kwargs['xml'] - header = '3' #noqa - response = getattr(client.service, method)(header, xml_send) - except suds.WebFault as e: - return { - 'sent_xml': xml_send, - 'received_xml': e.fault.faultstring, - 'object': None - } - - response, obj = sanitize_response(response) + + header = '3' #noqa + + disable_warnings() + session = Session() + session.cert = (cert, key) + session.verify = False + transport = Transport(session=session) + + client = Client(base_url, transport=transport) + + xml_send = kwargs['xml'] + response = client.service[method](header, xml_send) + + response, obj = sanitize_response(response.encode('utf-8')) return { 'sent_xml': xml_send, 'received_xml': response, diff --git a/requirements.txt b/requirements.txt index 92f9079..63f4786 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,3 +15,4 @@ reportlab pytest pytest-cov pytz +zeep diff --git a/setup.py b/setup.py index 4bf323b..c5686a4 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.9.20" +VERSION = "0.9.21" setup( @@ -53,6 +53,7 @@ later (LGPLv2+)', 'suds-jurko-requests >= 1.2', 'reportlab', 'pytz', + 'zeep', ], tests_require=[ 'pytest', From 1d9f4b0776cf7f0370a89109c43d257160fffe37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Thu, 1 Mar 2018 10:57:08 -0300 Subject: [PATCH 07/85] [WIP] Implementando NFC-e SVRS # Conflicts: # pytrustnfe/Servidores.py --- pytrustnfe/Servidores.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 8a340fe..b38727a 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -97,11 +97,13 @@ def localizar_url(servico, estado, mod='55', ambiente=2): def localizar_qrcode(estado, ambiente=2): sigla = SIGLA_ESTADO[estado] - dominio = ESTADO_WS[sigla]['65'][ambiente]['servidor'] - complemento = ESTADO_WS[sigla]['65'][ambiente][WS_NFCE_QR_CODE] - if 'https://' in complemento: - return complemento - return "https://%s/%s" % (dominio, complemento) + # dominio = ESTADO_WS[sigla][NFCE_MODELO][ambiente]['servidor'] + # complemento = ESTADO_WS[sigla][NFCE_MODELO][ambiente][WS_NFCE_QR_CODE] + ws_qrcode = ESTADO_WS[sigla][NFCE_MODELO][ambiente][WS_NFCE_QR_CODE] + return ws_qrcode + # if 'https://' in ws_qrcode: + # return ws_qrcode + # return "https://%s/" % (ws_qrcode) METODO_WS = { @@ -317,7 +319,7 @@ UFAM = { WS_NFE_INUTILIZACAO: 'nfce-services-nac/services/NfeInutilizacao2', WS_NFE_CONSULTA: 'nfce-services-nac/services/NfeConsulta2', WS_NFE_SITUACAO: 'nfce-services-nac/services/NfeStatusServico2', - WS_NFCE_QR_CODE: 'nfceweb/consultarNFCe.jsp', + WS_NFCE_QR_CODE: 'homnfce.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp', } } } From 4f8b75262685381ca1fcbe3488ad183aeb2bd9aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Fri, 2 Mar 2018 14:47:36 -0300 Subject: [PATCH 08/85] [WIP] NFC-e Corrige servidores. Passa modelo do documento para localizar a url. --- pytrustnfe/Servidores.py | 1 - pytrustnfe/nfe/__init__.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index b38727a..737b81b 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -20,7 +20,6 @@ WS_NFCE_CADASTRO = 'NfeConsultaCadastro' WS_NFCE_RECEPCAO_EVENTO = 'RecepcaoEventoCarta' WS_NFCE_QR_CODE = 'NfeQRCode' WS_NFCE_CONSULTA_DESTINADAS = 'NfeConsultaDest', -WS_NFCE_RET_AUTORIZACAO = 'NFeRetAutorizacao', WS_NFE_CADASTRO = 'NfeConsultaCadastro' diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index c903014..a5da300 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -184,7 +184,7 @@ def _render(certificado, method, sign, **kwargs): def _send(certificado, method, **kwargs): xml_send = kwargs["xml"] - url = localizar_url(method, kwargs['estado'], '55', + url = localizar_url(method, kwargs['estado'], kwargs['modelo'], kwargs['ambiente']) cabecalho = _build_header(method, **kwargs) From cab13549cc15b39cbbd3a74d95f54a71ed059d48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Mon, 5 Mar 2018 17:22:30 -0300 Subject: [PATCH 09/85] =?UTF-8?q?Corre=C3=A7=C3=B5es=20para=20envio=20de?= =?UTF-8?q?=20NFC-e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/__init__.py | 6 ++---- pytrustnfe/nfe/templates/NfeAutorizacao.xml | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index a5da300..ebe3f60 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -89,9 +89,7 @@ def _add_qrCode(xml, **kwargs): valor_total = inf_nfe['total']['vNF'] dest_cpf = 'Inexistente' dest = nfe.find(".//{http://www.portalfiscal.inf.br/nfe}dest") - if dest: - dest_parent = dest.getparent() - dest_parent.remove(dest) + if inf_nfe.get('dest', False): if inf_nfe['dest'].get('CPF', False): dest_cpf = inf_nfe['dest']['CPF'] @@ -99,7 +97,7 @@ def _add_qrCode(xml, **kwargs): cpf = etree.Element('CPF') cpf.text = dest_cpf dest.append(cpf) - dest_parent.append(dest) + icms_total = inf_nfe['total']['vICMS'] dig_val = binascii.hexlify(xml.find( ".//{http://www.w3.org/2000/09/xmldsig#}DigestValue").text.encode()).decode() diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml index b135806..d2d82e4 100644 --- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml +++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml @@ -491,7 +491,6 @@ {% endif %} - {% endif %} {% if imposto.II is defined %} {{ imposto.II.vBC }} @@ -500,6 +499,7 @@ {{ imposto.II.vIOF }} {% endif %} + {% endif %} {% if imposto.PIS.CST in ('01', '02') %} From 5c9908da57286a617ab0fcba2546cb241c89de67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Thu, 8 Mar 2018 11:17:32 -0300 Subject: [PATCH 10/85] Insere servidor de cancelamento de NFC-e. # Conflicts: # pytrustnfe/Servidores.py --- pytrustnfe/Servidores.py | 66 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 20 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 737b81b..a165839 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -138,27 +138,53 @@ METODO_WS = { } SVRS = { - NFE_AMBIENTE_PRODUCAO: { - 'servidor': 'nfe.svrs.rs.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CADASTRO: 'ws/CadConsultaCadastro/CadConsultaCadastro2.asmx', - WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao2.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + NFE_MODELO: { + NFE_AMBIENTE_PRODUCAO: { + 'servidor': 'nfe.svrs.rs.gov.br', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx', + WS_NFE_CADASTRO: 'ws/CadConsultaCadastro/CadConsultaCadastro2.asmx', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao2.asmx', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + }, + NFE_AMBIENTE_HOMOLOGACAO: { + 'servidor': 'nfe-homologacao.svrs.rs.gov.br', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx', + WS_NFE_CADASTRO: 'ws/CadConsultaCadastro/CadConsultaCadastro2.asmx', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao2.asmx', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + } }, - NFE_AMBIENTE_HOMOLOGACAO: { - 'servidor': 'nfe-homologacao.svrs.rs.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CADASTRO: 'ws/CadConsultaCadastro/CadConsultaCadastro2.asmx', - WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao2.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + NFCE_MODELO: { + NFCE_AMBIENTE_PRODUCAO: { + 'servidor': 'nfce.svrs.rs.gov.br', + WS_NFCE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao2.asmx', + WS_NFCE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', + WS_NFCE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFCE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + WS_NFCE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', + WS_NFCE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', + WS_NFCE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx', + }, + NFCE_AMBIENTE_HOMOLOGACAO: { + 'servidor': 'nfce-homologacao.svrs.rs.gov.br', + WS_NFCE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao2.asmx', + WS_NFCE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', + WS_NFCE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFCE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + WS_NFCE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', + WS_NFCE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', + WS_NFCE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx', + } } } From c7bc21de2a051c610264891b09c1679edf549cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Thu, 8 Mar 2018 12:15:19 -0300 Subject: [PATCH 11/85] =?UTF-8?q?Retira=20lixo=20c=C3=B3digo.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/Servidores.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index a165839..9c7090f 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -96,13 +96,8 @@ def localizar_url(servico, estado, mod='55', ambiente=2): def localizar_qrcode(estado, ambiente=2): sigla = SIGLA_ESTADO[estado] - # dominio = ESTADO_WS[sigla][NFCE_MODELO][ambiente]['servidor'] - # complemento = ESTADO_WS[sigla][NFCE_MODELO][ambiente][WS_NFCE_QR_CODE] ws_qrcode = ESTADO_WS[sigla][NFCE_MODELO][ambiente][WS_NFCE_QR_CODE] return ws_qrcode - # if 'https://' in ws_qrcode: - # return ws_qrcode - # return "https://%s/" % (ws_qrcode) METODO_WS = { From 5893a0324bf9212516a37b6cf1f73d175ebc4550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Thu, 8 Mar 2018 16:21:48 -0300 Subject: [PATCH 12/85] =?UTF-8?q?Corre=C3=A7=C3=A3o=20de=20testes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/Servidores.py | 2 +- pytrustnfe/nfe/__init__.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 9c7090f..20d7a37 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -648,7 +648,7 @@ UFSP = { WS_NFCE_SITUACAO: 'ws/nfestatusservico2.asmx', WS_NFCE_CADASTRO: 'ws/cadconsultacadastro2.asmx', WS_NFCE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx', - WS_NFCE_QR_CODE: 'NFCEConsultaPublica/Paginas/ConstultaQRCode.aspx', + WS_NFCE_QR_CODE: 'https://homologacao.nfce.fazenda.sp.gov.br/NFCEConsultaPublica/Paginas/ConstultaQRCode.aspx', } } } diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index ebe3f60..ec1de27 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -267,6 +267,7 @@ def xml_consulta_cadastro(certificado, **kwargs): def consulta_cadastro(certificado, **kwargs): if "xml" not in kwargs: kwargs['xml'] = xml_consulta_cadastro(certificado, **kwargs) + kwargs['modelo'] = '55' return _send(certificado, 'NfeConsultaCadastro', **kwargs) From c0dd5d02dd8b1631aa4dfb61c4fbdc8ba4e2fde7 Mon Sep 17 00:00:00 2001 From: carcaroff Date: Wed, 28 Mar 2018 17:33:08 -0300 Subject: [PATCH 13/85] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20da=20danfe=20pa?= =?UTF-8?q?ra=20NFC-e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/danfce.py | 456 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 456 insertions(+) create mode 100644 pytrustnfe/nfe/danfce.py diff --git a/pytrustnfe/nfe/danfce.py b/pytrustnfe/nfe/danfce.py new file mode 100644 index 0000000..21cd50b --- /dev/null +++ b/pytrustnfe/nfe/danfce.py @@ -0,0 +1,456 @@ +# -*- coding: utf-8 -*- +# © 2017 Johny Chen Jy, Trustcode +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from textwrap import wrap +from io import BytesIO + +from reportlab.lib import utils +from reportlab.pdfgen import canvas +from reportlab.lib.units import cm, mm +from reportlab.graphics.barcode import qr +from reportlab.graphics import renderPDF +from reportlab.graphics.shapes import Drawing +from reportlab.platypus import Table, TableStyle, Paragraph, Image +from reportlab.lib.enums import TA_CENTER +from reportlab.lib.styles import ParagraphStyle + + +def format_cnpj_cpf(value): + if len(value) < 12: # CPF + cValue = '%s.%s.%s-%s' % (value[:-8], value[-8:-5], + value[-5:-2], value[-2:]) + else: + cValue = '%s.%s.%s/%s-%s' % (value[:-12], value[-12:-9], + value[-9:-6], value[-6:-2], value[-2:]) + return cValue + + +def getdateUTC(cDateUTC): + cDt = cDateUTC[0:10].split('-') + cDt.reverse() + return '/'.join(cDt), cDateUTC[11:16] + + +def format_number(cNumber, precision=0, group_sep='.', decimal_sep=','): + if cNumber: + number = float(cNumber) + return ("{:,." + str(precision) + "f}").format(number).\ + replace(",", "X").replace(".", ",").replace("X", ".") + return "" + + +def tagtext(oNode=None, cTag=None): + try: + xpath = ".//{http://www.portalfiscal.inf.br/nfe}%s" % (cTag) + cText = oNode.find(xpath).text + except: + cText = '' + return cText + + +def get_image(path, width=1 * cm): + img = utils.ImageReader(path) + iw, ih = img.getSize() + aspect = ih / float(iw) + return Image(path, width=width, height=(width * aspect)) + + +def format_telefone(numero_telefone): + if len(numero_telefone) == 10: + telefone = '(%s) %s-%s' % (numero_telefone[0:2], + numero_telefone[2:6], + numero_telefone[6:]) + else: + telefone = '(%s) %s-%s' % (numero_telefone[0:2], + numero_telefone[2:7], + numero_telefone[7:]) + return telefone + + +class danfce(object): + + def __init__(self, list_xml, logo=None): + + self.current_font_size = 7 + self.current_font_name = 'NimbusSanL-Regu' + + self.max_height = 840 + self.min_height = 1 + self.min_width = 5 + self.max_width = 200 + self.current_height = 840 + + self.oPDF_IO = BytesIO() + self.canvas = canvas.Canvas(self.oPDF_IO, pagesize=(7.2 * cm, 30 * cm)) + self.canvas.setTitle('DANFCE') + self.canvas.setLineWidth(.5) + self.canvas.setFont(self.current_font_name, self.current_font_size) + + self.list_xml = list_xml + self.logo = logo + + self.nfce_generate() + + def ide_emit(self, oXML=None): + + elem_emit = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}emit") + + # Razão Social emitente + nomeEmpresa = tagtext(oNode=elem_emit, cTag='xFant') + self.drawTitle(nomeEmpresa, 10) + + if self.logo: + img = get_image(self.logo, width=10 * mm) + img.drawOn(self.canvas, 5, 830) + + cEnd = tagtext(oNode=elem_emit, cTag="xNome") + '
' + cEnd += "CNPJ: %s " % (format_cnpj_cpf( + tagtext(oNode=elem_emit, cTag='CNPJ'))) + cEnd += "IE: %s" % (tagtext(oNode=elem_emit, cTag="IE")) + '
' + cEnd += tagtext(oNode=elem_emit, cTag='xLgr') + ', ' + tagtext( + oNode=elem_emit, cTag='nro') + ' - ' + cEnd += tagtext(oNode=elem_emit, cTag='xBairro') + '
' + tagtext( + oNode=elem_emit, cTag='xMun') + ' - ' + cEnd += tagtext(oNode=elem_emit, cTag='UF') + ' - ' + tagtext( + oNode=elem_emit, cTag='CEP') + '
' + cEnd += 'Fone: ' + format_telefone(tagtext( + oNode=elem_emit, cTag='fone')) + + self._drawCenteredParagraph(cEnd) + self.drawLine() + + def danfce_information(self): + self.drawTitle( + "DANFE NFC-e - Documento Auxiliar da Nota Fiscal de", + 7, 'NimbusSanL-Bold') + + self.drawTitle("Consumidor Eletrônica", 7, 'NimbusSanL-Bold') + + self.drawString( + "NFC-e não permite aproveitamento de crédito de ICMS", True) + self.drawLine() + + def produtos(self, oXML=None, el_det=None, oPaginator=None, + list_desc=None, list_cod_prod=None): + + rows = [['Codigo', 'Descricao', 'Qtde', 'Un', 'Vl Unit', 'Vl Total']] + colWidths = (25, 90, 15, 15, 25, 25) + rowHeights = [7] + + for id in range(oPaginator[0], oPaginator[1]): + + item = el_det[id] + el_prod = item.find(".//{http://www.portalfiscal.inf.br/nfe}prod") + + cod = tagtext(oNode=el_prod, cTag='cProd') + descricao = tagtext(oNode=el_prod, cTag='xProd') + Un = tagtext(oNode=el_prod, cTag='uCom') + qtde = format_number(tagtext(oNode=el_prod, cTag='qCom'), + precision=2) + vl_unit = format_number(tagtext(oNode=el_prod, cTag='vUnCom'), + precision=2) + vl_total = format_number( + tagtext(oNode=el_prod, cTag='vProd'), precision=2) + + new_row = [cod, descricao, qtde, Un, vl_unit, vl_total] + + rows.append(new_row) + rowHeights.append(self.current_font_size + 2) + + self._draw_product_table(rows, colWidths, rowHeights) + + def _draw_product_table(self, rows, colWidths, rowHeights): + table = Table(rows, colWidths, tuple(rowHeights)) + table.setStyle(TableStyle([ + ('FONTSIZE', (0, 0), (-1, -1), 7), + ('FONT', (0, 1), (-1, -1), 'NimbusSanL-Regu'), + ('FONT', (0, 0), (-1, 0), 'NimbusSanL-Bold'), + ('ALIGN', (0, 0), (-1, 0), "LEFT"), + ('ALIGN', (1, 0), (-1, 0), "LEFT"), + ('ALIGN', (2, 0), (-1, 0), "CENTER"), + ('ALIGN', (3, 0), (-1, 0), "CENTER"), + ('ALIGN', (0, 1), (-1, -1), "LEFT"), + ('ALIGN', (1, 1), (-1, -1), "LEFT"), + ('ALIGN', (2, 1), (-1, -1), "CENTER"), + ('ALIGN', (3, 1), (-1, -1), "CENTER"), + ])) + + w, h = table.wrapOn(self.canvas, 200, 450) + table.drawOn(self.canvas, 0, self.current_height - (h * 1.2)) + self.current_height -= (h * 1.1) + + def totais(self, oXML=None): + # Impostos + el_total = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}total") + + total_tributo = format_number(tagtext(oNode=el_total, cTag='vTotTrib'), + precision=2) + valor_total = format_number(tagtext(oNode=el_total, cTag='vProd'), + precision=2) + desconto = format_number(tagtext(oNode=el_total, cTag='vDesc'), + precision=2) + valor_a_pagar = format_number(tagtext(oNode=el_total, cTag='vNF'), + precision=2) + el_pag = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}pag") + troco = format_number(tagtext(oNode=el_pag, cTag="vTroco")) + + payment_method_list = {'01': 'Dinheiro', + '02': 'Cheque', + '03': 'Cartão de Crédito', + '04': 'Cartão de Débito', + "05": "Crédito Loja", + '10': 'Vale Alimentação', + '11': 'Vale Refeição', + '12': 'Vale Presente', + '13': 'Vale Combustível', + '14': 'Duplicata Mercantil', + '15': 'Boleto Bancario', + '90': 'Sem Pagamento', + '99': 'Outros'} + quant_produtos = len(oXML.findall( + ".//{http://www.portalfiscal.inf.br/nfe}det")) + + payment_methods = [] + + for pagId, item in enumerate(el_pag): + if 'tPag' not in item.tag: + continue + + payment = [] + method = payment_method_list[item.text] + + payment.append(method) + payment.append(format_number(item.getnext().text, precision=2)) + payment_methods.append(payment) + + values = {'quantidade_itens': quant_produtos, + 'total_tributo': total_tributo, + 'valor_total': valor_total, + 'desconto': desconto, + 'valor_a_pagar': valor_a_pagar, + 'formas_de_pagamento': payment_methods, + 'troco': troco, + } + + self.draw_totals_table(values) + + self.drawLine() + + def draw_totals_table(self, values): + rowHeights = [7, 7, 7, 7, 10] + data = [['QTD.TOTAL DE ITENS', values['quantidade_itens']], + ['VALOR TOTAL R$', values['valor_total']], + ['DESCONTO R$', values['desconto']], + ['VALOR A PAGAR R$', values['valor_a_pagar']], + ['FORMA DE PAGAMENTO', 'VALOR PAGO R$'], + ] + + for item in values['formas_de_pagamento']: + data.append([item[0], item[1]]) + rowHeights.append(7) + data.append(['TROCO', format_number(values['troco'], precision=2)]) + rowHeights.append(7) + + table2 = Table(data, colWidths=(150, 50), rowHeights=tuple(rowHeights)) + table2.setStyle(TableStyle([ + ('FONTSIZE', (0, 0), (-1, -1), 7), + ('FONT', (0, 0), (1, -1), 'NimbusSanL-Regu'), + ('FONT', (0, 4), (1, 4), 'NimbusSanL-Bold'), + ('ALIGN', (1, 0), (1, -1), "RIGHT") + ])) + w, h = table2.wrapOn(self.canvas, 200, 450) + table2.drawOn(self.canvas, 0, self.current_height - (h * 1.1)) + self.current_height -= h + + def inf_authentication(self, oXML=None): + el_infNFe = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}infNFe") + # n nfce, serie e data de solicitacao + el_ide = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}ide") + + el_NFeSupl = oXML.find( + ".//{http://www.portalfiscal.inf.br/nfe}infNFeSupl") + + el_dest = el_infNFe.find(".//{http://www.portalfiscal.inf.br/nfe}dest") + # chave, n protocolo, data autorizacao + el_prot_nfe = oXML.find( + ".//{http://www.portalfiscal.inf.br/nfe}protNFe") + + el_infAdic = oXML.find( + ".//{http://www.portalfiscal.inf.br/nfe}infAdic") + + url_chave = tagtext(oNode=el_NFeSupl, cTag='urlChave') + access_key = tagtext(oNode=el_prot_nfe, cTag="chNFe") + + frase_chave_acesso = 'Consulte pela Chave de Acesso em:
\ +%s
%s' % (url_chave, access_key) + + qrcode = tagtext(oNode=el_NFeSupl, cTag='qrCode') + + cnpj = tagtext(oNode=el_dest, cTag='CNPJ') + cpf = tagtext(oNode=el_dest, cTag='CPF') + if cnpj: + cnpj_cpf = format_cnpj_cpf(cnpj) + cnpj_cpf = "CONSUMIDOR CNPJ: %s" % (cnpj) + elif cpf: + cnpj_cpf = format_cnpj_cpf(cpf) + cnpj_cpf = "CONSUMIDOR CPF: %s" % (cpf) + else: + cnpj_cpf = u"CONSUMIDOR NÃO IDENTIFICADO" + + nNFC = tagtext(oNode=el_ide, cTag="nNF") + serie = tagtext(oNode=el_ide, cTag='serie') + + dataSolicitacao = getdateUTC(tagtext(oNode=el_ide, cTag="dhEmi")) + dataSolicitacao = dataSolicitacao[0] + " " + dataSolicitacao[1] + + numProtocolo = tagtext(oNode=el_prot_nfe, cTag="nProt") + + dataAutorizacao = getdateUTC(tagtext(oNode=el_prot_nfe, + cTag='dhRecbto')) + dataAutorizacao = dataAutorizacao[0] + " " + dataAutorizacao[1] + + text = u"%s
%s
NFC-e nº%s Série %s %s
\ +Protocolo de autorização: %s
Data de autorização %s
\ +" % (frase_chave_acesso, cnpj_cpf, nNFC, serie, dataSolicitacao, + numProtocolo, dataAutorizacao) + + self._drawCenteredParagraph(text) + + self.draw_qr_code(qrcode) + + infAdFisco = tagtext(oNode=el_infAdic, cTag='infAdFisco') + self._drawCenteredParagraph(infAdFisco) + + infCpl = tagtext(oNode=el_infAdic, cTag='infCpl') + self._drawCenteredParagraph(infCpl) + + def _drawCenteredParagraph(self, text): + + style = ParagraphStyle( + name='Normal', + fontName='NimbusSanL-Regu', + fontSize=7, + alignment=TA_CENTER, + leading=7, + ) + + paragraph = Paragraph(text, style=style) + w, h = paragraph.wrapOn(self.canvas, 180, 300) + paragraph.drawOn(self.canvas, 10, self.current_height - h) + self.current_height -= (h*1.1) + + def drawString(self, string, centered=False): + if centered: + self.canvas.drawCentredString( + self.max_width / 2, self.current_height, string) + self.current_height -= self.current_font_size + else: + self.canvas.drawString(self.min_width, self.current_height, string) + self.current_height -= self.current_font_size + + def drawTitle(self, string, size, font='NimbusSanL-Regu'): + self.canvas.setFont(font, size) + self.canvas.drawCentredString( + self.max_width / 2, self.current_height, string) + self.current_height -= self.current_font_size + self.canvas.setFont(self.current_font_name, self.current_font_size) + + def drawLine(self): + self.canvas.line(self.min_width, self.current_height, + self.max_width, self.current_height) + self.current_height -= self.current_font_size + + def draw_qr_code(self, string): + qr_code = qr.QrCodeWidget(string) + drawing = Drawing(23 * mm, 23 * mm) + drawing.add(qr_code) + renderPDF.draw(drawing, self.canvas, 20 * mm, self.current_height - 85) + self.current_height -= 85 + + def newpage(self): + self.current_height = self.max_height + self.Page += 1 + self.canvas.showPage() + + def nfce_generate(self): + for oXML in self.list_xml: + oXML_cobr = oXML.find( + ".//{http://www.portalfiscal.inf.br/nfe}cobr") + + self.NrPages = 1 + self.Page = 1 + + # Calculando total linhas usadas para descrições dos itens + # Com bloco fatura, apenas 29 linhas para itens na primeira folha + nNr_Lin_Pg_1 = 34 if oXML_cobr is None else 30 + # [ rec_ini , rec_fim , lines , limit_lines ] + oPaginator = [[0, 0, 0, nNr_Lin_Pg_1]] + el_det = oXML.findall(".//{http://www.portalfiscal.inf.br/nfe}det") + if el_det is not None: + list_desc = [] + list_cod_prod = [] + nPg = 0 + for nId, item in enumerate(el_det): + el_prod = item.find( + ".//{http://www.portalfiscal.inf.br/nfe}prod") + infAdProd = item.find( + ".//{http://www.portalfiscal.inf.br/nfe}infAdProd") + + list_ = wrap(tagtext(oNode=el_prod, cTag='xProd'), 56) + if infAdProd is not None: + list_.extend(wrap(infAdProd.text, 56)) + list_desc.append(list_) + + list_cProd = wrap(tagtext(oNode=el_prod, cTag='cProd'), 14) + list_cod_prod.append(list_cProd) + + # Nr linhas necessárias p/ descrição item + nLin_Itens = len(list_) + + if (oPaginator[nPg][2] + nLin_Itens) >= oPaginator[nPg][3]: + oPaginator.append([0, 0, 0, 77]) + nPg += 1 + oPaginator[nPg][0] = nId + oPaginator[nPg][1] = nId + 1 + oPaginator[nPg][2] = nLin_Itens + else: + # adiciona-se 1 pelo funcionamento de xrange + oPaginator[nPg][1] = nId + 1 + oPaginator[nPg][2] += nLin_Itens + + self.NrPages = len(oPaginator) # Calculando nr. páginas + + self.ide_emit(oXML=oXML) + # self.destinatario(oXML=oXML) + self.danfce_information() + + self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPaginator[0], + list_desc=list_desc, list_cod_prod=list_cod_prod) + + self.drawLine() + + self.totais(oXML=oXML) + + self.inf_authentication(oXML=oXML) + + # Gera o restante das páginas do XML + for oPag in oPaginator[1:]: + if oPag: + self.newpage() + self.ide_emit(oXML=oXML) + # self.destinatario(oXML=oXML) + self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPag, + list_desc=list_desc, + list_cod_prod=list_cod_prod) + self.totais(oXML=oXML) + self.inf_authentication(oXML=oXML) + + self.newpage() + + self.canvas.save() + + def writeto_pdf(self, fileObj): + pdf_out = self.oPDF_IO.getvalue() + self.oPDF_IO.close() + fileObj.write(pdf_out) From 4f25b76ec86b570d4a363b6a1c1888bd00ece3f4 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Wed, 28 Mar 2018 21:02:26 -0300 Subject: [PATCH 14/85] Ajuste na url do qrcode amazonas --- pytrustnfe/Servidores.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 20d7a37..beef15f 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -339,7 +339,7 @@ UFAM = { WS_NFE_INUTILIZACAO: 'nfce-services-nac/services/NfeInutilizacao2', WS_NFE_CONSULTA: 'nfce-services-nac/services/NfeConsulta2', WS_NFE_SITUACAO: 'nfce-services-nac/services/NfeStatusServico2', - WS_NFCE_QR_CODE: 'homnfce.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp', + WS_NFCE_QR_CODE: 'https://homnfce.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp', } } } From b474ec99136650e3abaf50e22535ee984447ce90 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Thu, 29 Mar 2018 22:09:23 -0300 Subject: [PATCH 15/85] =?UTF-8?q?Pequenos=20ajustes=20na=20impress=C3=A3o?= =?UTF-8?q?=20do=20danfce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/Servidores.py | 2 +- pytrustnfe/nfe/danfce.py | 24 ++++++++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index beef15f..0ddc8d4 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -339,7 +339,7 @@ UFAM = { WS_NFE_INUTILIZACAO: 'nfce-services-nac/services/NfeInutilizacao2', WS_NFE_CONSULTA: 'nfce-services-nac/services/NfeConsulta2', WS_NFE_SITUACAO: 'nfce-services-nac/services/NfeStatusServico2', - WS_NFCE_QR_CODE: 'https://homnfce.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp', + WS_NFCE_QR_CODE: 'http://homnfce.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp', } } } diff --git a/pytrustnfe/nfe/danfce.py b/pytrustnfe/nfe/danfce.py index 21cd50b..e245ada 100644 --- a/pytrustnfe/nfe/danfce.py +++ b/pytrustnfe/nfe/danfce.py @@ -2,6 +2,7 @@ # © 2017 Johny Chen Jy, Trustcode # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import re from textwrap import wrap from io import BytesIO @@ -56,15 +57,16 @@ def get_image(path, width=1 * cm): return Image(path, width=width, height=(width * aspect)) -def format_telefone(numero_telefone): - if len(numero_telefone) == 10: - telefone = '(%s) %s-%s' % (numero_telefone[0:2], - numero_telefone[2:6], - numero_telefone[6:]) - else: - telefone = '(%s) %s-%s' % (numero_telefone[0:2], - numero_telefone[2:7], - numero_telefone[7:]) +def format_telefone(telefone): + telefone = re.sub('[^0-9]', '', telefone) + if len(telefone) == 10: + telefone = '(%s) %s-%s' % (telefone[0:2], + telefone[2:6], + telefone[6:]) + elif len(telefone) == 11: + telefone = '(%s) %s-%s' % (telefone[0:2], + telefone[2:7], + telefone[7:]) return telefone @@ -134,7 +136,7 @@ class danfce(object): def produtos(self, oXML=None, el_det=None, oPaginator=None, list_desc=None, list_cod_prod=None): - rows = [['Codigo', 'Descricao', 'Qtde', 'Un', 'Vl Unit', 'Vl Total']] + rows = [['Cód', 'Descrição', 'Qtde', 'Un', 'Unit.', 'Total']] colWidths = (25, 90, 15, 15, 25, 25) rowHeights = [7] @@ -145,7 +147,9 @@ class danfce(object): cod = tagtext(oNode=el_prod, cTag='cProd') descricao = tagtext(oNode=el_prod, cTag='xProd') + descricao = (descricao[:20] + '..') if len(descricao) > 20 else descricao Un = tagtext(oNode=el_prod, cTag='uCom') + Un = (Un[:2]) if len(Un) > 2 else Un qtde = format_number(tagtext(oNode=el_prod, cTag='qCom'), precision=2) vl_unit = format_number(tagtext(oNode=el_prod, cTag='vUnCom'), From 8f4cf56a29c0b60f3bd441467a3e2ffa3b0f6071 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 14 May 2018 15:36:55 -0300 Subject: [PATCH 16/85] =?UTF-8?q?Adi=C3=A7=C3=A3o=20das=20tags=20do=20ve?= =?UTF-8?q?=C3=ADculo=20de=20transporte=20no=20danfe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/danfe.py | 8 ++++++++ setup.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 6561538..5b578bc 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -584,6 +584,8 @@ obsCont[@xCampo='NomeVendedor']") def transportes(self, oXML=None): el_transp = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}transp") + veic_transp = oXML.find( + ".//{http://www.portalfiscal.inf.br/nfe}veicTransp") nMr = self.width - self.nRight self.canvas.setFont('NimbusSanL-Bold', 7) @@ -627,6 +629,12 @@ obsCont[@xCampo='NomeVendedor']") tagtext(oNode=el_transp, cTag='xNome')[:40]) self.string(self.nLeft + 71, self.nlin + 7.7, self.oFrete[tagtext(oNode=el_transp, cTag='modFrete')]) + self.string(self.nLeft + 99, self.nlin + 7.7, + tagtext(oNode=el_transp, cTag='RNTC')) + self.string(self.nLeft + 116, self.nlin + 7.7, + tagtext(oNode=el_transp, cTag='placa')) + self.string(self.nLeft + 142, self.nlin + 7.7, + tagtext(oNode=veic_transp, cTag='UF')) self.string(nMr - 39, self.nlin + 7.7, format_cnpj_cpf(tagtext(oNode=el_transp, cTag='CNPJ'))) self.string(self.nLeft + 1, self.nlin + 14.2, diff --git a/setup.py b/setup.py index c5686a4..ddf92cc 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.9.21" +VERSION = "0.9.22" setup( From 44bcedc33ba025eae1ffcb0d4b54a0d8c200e79a Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 14 May 2018 19:44:43 -0300 Subject: [PATCH 17/85] =?UTF-8?q?Realiza=20a=20convers=C3=A3o=20do=20retor?= =?UTF-8?q?no=20corretamente=20com=20decode=20-=20BH?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfse/bh/__init__.py | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pytrustnfe/nfse/bh/__init__.py b/pytrustnfe/nfse/bh/__init__.py index c5f246b..f96f89c 100644 --- a/pytrustnfe/nfse/bh/__init__.py +++ b/pytrustnfe/nfse/bh/__init__.py @@ -56,8 +56,8 @@ def _send(certificado, method, **kwargs): response, obj = sanitize_response(response.encode('utf-8')) return { - 'sent_xml': str(xml_send), - 'received_xml': str(response), + 'sent_xml': xml_send, + 'received_xml': response.decode('utf-8'), 'object': obj } diff --git a/setup.py b/setup.py index ddf92cc..a9a30f7 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.9.22" +VERSION = "0.9.23" setup( From 966ba5f795ebaac6a13c601bead7248233a645fe Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 21 May 2018 13:11:57 -0300 Subject: [PATCH 18/85] [FIX] XML NFSe maringa and percent difal --- pytrustnfe/nfe/templates/NfeAutorizacao.xml | 2 +- pytrustnfe/nfse/mga/__init__.py | 82 +++++++++++++++++++++++ pytrustnfe/nfse/mga/assinatura.py | 44 +++++++++++++ pytrustnfe/nfse/mga/templates/CancelarNfse.xml | 13 ++++ pytrustnfe/nfse/mga/templates/GerarNfse.xml | 11 ++++ pytrustnfe/nfse/mga/templates/Rps.xml | 91 ++++++++++++++++++++++++++ setup.py | 3 +- 7 files changed, 244 insertions(+), 2 deletions(-) create mode 100644 pytrustnfe/nfse/mga/__init__.py create mode 100644 pytrustnfe/nfse/mga/assinatura.py create mode 100644 pytrustnfe/nfse/mga/templates/CancelarNfse.xml create mode 100644 pytrustnfe/nfse/mga/templates/GerarNfse.xml create mode 100644 pytrustnfe/nfse/mga/templates/Rps.xml diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml index d2d82e4..f7c6395 100644 --- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml +++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml @@ -608,7 +608,7 @@ {{ imposto.ICMSUFDest.vBCUFDest }} {{ imposto.ICMSUFDest.pFCPUFDest }} - {{ imposto.ICMSUFDest.pICMSInter }} + {{ imposto.ICMSUFDest.pICMSUFDest }} {{ imposto.ICMSUFDest.pICMSInter }} {{ imposto.ICMSUFDest.pICMSInterPart }} {{ imposto.ICMSUFDest.vFCPUFDest }} diff --git a/pytrustnfe/nfse/mga/__init__.py b/pytrustnfe/nfse/mga/__init__.py new file mode 100644 index 0000000..a3d207f --- /dev/null +++ b/pytrustnfe/nfse/mga/__init__.py @@ -0,0 +1,82 @@ +# © 2018 Danimar Ribeiro, Trustcode +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import os +from lxml import etree +from requests import Session +from zeep import Client +from zeep.transports import Transport + +from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key +from pytrustnfe.xml import render_xml, sanitize_response +from pytrustnfe.nfse.mga.assinatura import Assinatura + + +def _render(certificado, method, **kwargs): + path = os.path.join(os.path.dirname(__file__), 'templates') + xml_send = render_xml(path, '%s.xml' % method, True, **kwargs) + + reference = '' + if method == 'GerarNfse': + reference = 'rps:%s' % kwargs['rps']['numero'] + ref_lote = 'lote%s' % kwargs['rps']['numero_lote'] + elif method == 'CancelarNfse': + reference = 'Cancelamento_NF%s' % kwargs['cancelamento']['numero_nfse'] + + signer = Assinatura(certificado.pfx, certificado.password) + xml_send = signer.assina_xml(xml_send, reference) + xml_send = signer.assina_xml(etree.fromstring(xml_send), ref_lote) + return xml_send.encode('utf-8') + + +def _send(certificado, method, **kwargs): + base_url = '' + if kwargs['ambiente'] == 'producao': + base_url = 'https://isse.maringa.gov.br/ws/?wsdl' + else: + base_url = 'https://isseteste.maringa.gov.br/ws/?wsdl' + + xml_send = kwargs["xml"].decode('utf-8') + xml_cabecalho = '\ + \ + 1.00' + + cert, key = extract_cert_and_key_from_pfx( + certificado.pfx, certificado.password) + cert, key = save_cert_key(cert, key) + + session = Session() + session.cert = (cert, key) + session.verify = False + transport = Transport(session=session) + + client = Client(base_url, transport=transport) + + response = client.service[method](xml_cabecalho, xml_send) + + response, obj = sanitize_response(response.encode('utf-8')) + return { + 'sent_xml': str(xml_send), + 'received_xml': str(response), + 'object': obj + } + + +def xml_gerar_nfse(certificado, **kwargs): + return _render(certificado, 'GerarNfse', **kwargs) + + +def gerar_nfse(certificado, **kwargs): + if "xml" not in kwargs: + kwargs['xml'] = xml_gerar_nfse(certificado, **kwargs) + return _send(certificado, 'GerarNfse', **kwargs) + + +def xml_cancelar_nfse(certificado, **kwargs): + return _render(certificado, 'CancelarNfse', **kwargs) + + +def cancelar_nfse(certificado, **kwargs): + if "xml" not in kwargs: + kwargs['xml'] = xml_cancelar_nfse(certificado, **kwargs) + return _send(certificado, 'CancelarNfse', **kwargs) diff --git a/pytrustnfe/nfse/mga/assinatura.py b/pytrustnfe/nfse/mga/assinatura.py new file mode 100644 index 0000000..1831379 --- /dev/null +++ b/pytrustnfe/nfse/mga/assinatura.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# © 2016 Danimar Ribeiro, Trustcode +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import signxml +from lxml import etree +from pytrustnfe.certificado import extract_cert_and_key_from_pfx +from signxml import XMLSigner + + +class Assinatura(object): + + def __init__(self, arquivo, senha): + self.arquivo = arquivo + self.senha = senha + + def assina_xml(self, xml_element, reference): + cert, key = extract_cert_and_key_from_pfx(self.arquivo, self.senha) + + for element in xml_element.iter("*"): + if element.text is not None and not element.text.strip(): + element.text = None + + signer = XMLSigner( + method=signxml.methods.enveloped, signature_algorithm="rsa-sha1", + digest_algorithm='sha1', + c14n_algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315') + + ns = {} + ns[None] = signer.namespaces['ds'] + signer.namespaces = ns + + ref_uri = ('#%s' % reference) if reference else None + signed_root = signer.sign( + xml_element, key=key.encode(), cert=cert.encode(), + reference_uri=ref_uri) + if reference: + element_signed = signed_root.find(".//*[@Id='%s']" % reference) + signature = signed_root.find(".//*[@URI='#%s']" % reference).getparent().getparent() + + if element_signed is not None and signature is not None: + parent = element_signed.getparent() + parent.append(signature) + return etree.tostring(signed_root, encoding=str) diff --git a/pytrustnfe/nfse/mga/templates/CancelarNfse.xml b/pytrustnfe/nfse/mga/templates/CancelarNfse.xml new file mode 100644 index 0000000..137897e --- /dev/null +++ b/pytrustnfe/nfse/mga/templates/CancelarNfse.xml @@ -0,0 +1,13 @@ + + + + + {{ cancelamento.numero_nfse }} + {{ cancelamento.cnpj_prestador }} + {{ cancelamento.inscricao_municipal }} + {{ cancelamento.cidade }} + + 1 + + + diff --git a/pytrustnfe/nfse/mga/templates/GerarNfse.xml b/pytrustnfe/nfse/mga/templates/GerarNfse.xml new file mode 100644 index 0000000..6b35d4d --- /dev/null +++ b/pytrustnfe/nfse/mga/templates/GerarNfse.xml @@ -0,0 +1,11 @@ + + + {{ rps.numero_lote }} + {{ rps.prestador.cnpj }} + {{ rps.prestador.inscricao_municipal }} + 1 + + {% include 'Rps.xml' %} + + + diff --git a/pytrustnfe/nfse/mga/templates/Rps.xml b/pytrustnfe/nfse/mga/templates/Rps.xml new file mode 100644 index 0000000..0dfd0cf --- /dev/null +++ b/pytrustnfe/nfse/mga/templates/Rps.xml @@ -0,0 +1,91 @@ + + + + {{ rps.numero }} + {{ rps.serie }} + {{ rps.tipo_rps }} + + {{ rps.data_emissao }} + {{ rps.natureza_operacao }} + {{ rps.regime_tributacao }} + {{ rps.optante_simples }} + {{ rps.incentivador_cultural }} + {{ rps.status }} + + {{ rps.numero_substituido }} + {{ rps.serie_substituido }} + {{ rps.tipo_substituido }} + + + + {{ rps.valor_servico }} + {{ rps.valor_deducao }} + {{ rps.valor_pis }} + {{ rps.valor_cofins }} + {{ rps.valor_inss }} + {{ rps.valor_ir }} + {{ rps.valor_csll }} + {{ rps.iss_retido }} + {{ rps.valor_iss }} + {{ rps.valor_iss_retido }} + {{ rps.outras_retencoes }} + {{ rps.base_calculo }} + {{ rps.aliquota_issqn }} + {{ rps.valor_liquido_nfse }} + {{ rps.desconto_incondicionado }} + {{ rps.desconto_condicionado }} + + {{ rps.codigo_servico }} + {{ rps.cnae_servico }} + {{ rps.codigo_tributacao_municipio }} + {{ rps.descricao }} + {{ rps.codigo_municipio }} + + + {{ rps.prestador.cnpj }} + {{ rps.prestador.inscricao_municipal }} + + + + + {% if rps.tomador.cnpj_cpf|length == 14 %} + {{ rps.tomador.cnpj_cpf }} + {% endif %} + {% if rps.tomador.cnpj_cpf|length == 11 %} + {{ rps.tomador.cnpj_cpf }} + {% endif %} + + {{ rps.tomador.inscricao_municipal }} + + {{ rps.tomador.razao_social }} + + {{ rps.tomador.logradouro }} + {{ rps.tomador.numero }} + {{ rps.tomador.complemento }} + {{ rps.tomador.bairro }} + {{ rps.tomador.cidade }} + {{ rps.tomador.uf }} + {{ rps.tomador.cep }} + + + {{ rps.tomador.telefone }} + {{ rps.tomador.email }} + + + {% if rps.intermediario is defined -%} + + {{ rps.intermediario.razao_social }} + + {{ rps.intermediario.cnpj }} + + {{ rps.intermediario.inscricao_municipal }} + + {% endif %} + {% if rps.construcao_civil is defined -%} + + {{ rps.construcao_civil.codigo_obra }} + {{ rps.construcao_civil.art }} + + {% endif %} + + diff --git a/setup.py b/setup.py index a9a30f7..9337653 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.9.23" +VERSION = "0.9.24" setup( @@ -38,6 +38,7 @@ later (LGPLv2+)', 'nfse/floripa/templates/*xml', 'nfse/carioca/templates/*xml', 'nfse/bh/templates/*xml', + 'nfse/mga/templates/*xml', 'xml/schemas/*xsd', ]}, url='https://github.com/danimaribeiro/PyTrustNFe', From cbf17ee87d98c17803a175c7bb14a60ccc2698b2 Mon Sep 17 00:00:00 2001 From: "Carlos R. Silveira" Date: Thu, 7 Jun 2018 16:35:08 -0300 Subject: [PATCH 19/85] Adicionado campos novos da Nfe 4.0 --- pytrustnfe/nfe/templates/NfeAutorizacao.xml | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml index f7c6395..80402cf 100644 --- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml +++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml @@ -1,15 +1,14 @@ - + {{ idLote }} {{ indSinc }} {% for NFe in NFes %} - + {% with ide = NFe.infNFe.ide %} {{ ide.cUF }} {{ ide.cNF }} {{ ide.natOp }} - {{ ide.indPag }} {{ ide.mod }} {{ ide.serie }} {{ ide.nNF }} @@ -614,6 +613,16 @@ {{ imposto.ICMSUFDest.vFCPUFDest }} {{ imposto.ICMSUFDest.vICMSUFDest }} {{ imposto.ICMSUFDest.vICMSUFRemet }} + {{ imposto.ICMSUFDest.vBCFCP }} + {{ imposto.ICMSUFDest.pFCP }} + {{ imposto.ICMSUFDest.pFCP }} + {{ imposto.ICMSUFDest.vBCFCPST }} + {{ imposto.ICMSUFDest.pFCPST }} + {{ imposto.ICMSUFDest.vFCPST }} + {{ imposto.ICMSUFDest.pFCPSTRet }} + {{ imposto.ICMSUFDest.vFCPSTRet }} + {{ imposto.ICMSUFDest.pST }} + {{ imposto.ICMSUFDest.vBCFCPUFDest }} {% endif %} {% endwith %} @@ -647,8 +656,12 @@ {{ total.vDesc }} {{ total.vII }} {{ total.vIPI }} + {{ total.vIPIDevol }} {{ total.vPIS }} {{ total.vCOFINS }} + {{ total.vFCP }} + {{ total.vFCPST }} + {{ total.vFCPSTRet }} {{ total.vOutro }} {{ total.vNF }} {{ total.vTotTrib }} From 3180759fd92ccbe3aa4f5f186dd6e838ede1e69e Mon Sep 17 00:00:00 2001 From: "Carlos R. Silveira" Date: Sat, 9 Jun 2018 15:26:33 -0300 Subject: [PATCH 20/85] =?UTF-8?q?Ajustando=20conforme=20valida=C3=A7=C3=A3?= =?UTF-8?q?o.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/templates/NfeAutorizacao.xml | 42 ++++++++++++++++------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml index 80402cf..89f6eac 100644 --- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml +++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml @@ -360,12 +360,18 @@ {{ imposto.ICMS.pRedBC }} {{ imposto.ICMS.pICMS }} {{ imposto.ICMS.vICMS }} + {{ imposto.ICMS.vBCFCP }} + {{ imposto.ICMS.pFCP }} + {{ imposto.ICMS.pFCP }} {{ imposto.ICMS.modBCST }} {{ imposto.ICMS.pMVAST }} {{ imposto.ICMS.pRedBCST }} {{ imposto.ICMS.vBCST }} {{ imposto.ICMS.pICMSST }} {{ imposto.ICMS.vICMSST }} + {{ imposto.ICMS.vBCFCPST }} + {{ imposto.ICMS.pFCPST }} + {{ imposto.ICMS.vFCPST }} {{ imposto.ICMS.vICMSDeson }} {{ imposto.ICMS.motDesICMS }} @@ -379,14 +385,21 @@ {{ imposto.ICMSPart.pRedBC }} {{ imposto.ICMSPart.pICMS }} {{ imposto.ICMSPart.vICMS }} + {{ imposto.ICMS.vBCST }} {{ imposto.ICMSPart.modBCST }} {{ imposto.ICMSPart.pMVAST }} {{ imposto.ICMSPart.pRedBCST }} - {{ imposto.ICMSPart.vBCST }} - {{ imposto.ICMSPart.pICMSST }} - {{ imposto.ICMSPart.vICMSST }} {{ imposto.ICMSPart.pBCOp }} {{ imposto.ICMSPart.UFST }} + {{ imposto.ICMSPart.pFCP }} + {{ imposto.ICMSPart.pFCP }} + {{ imposto.ICMSPart.vBCFCP }} + {{ imposto.ICMSPart.vBCFCPST }} + {{ imposto.ICMSPart.pFCPST }} + {{ imposto.ICMSPart.vFCPST }} + {{ imposto.ICMSPart.pFCPSTRet }} + {{ imposto.ICMSPart.vFCPSTRet }} + {{ imposto.ICMSPart.pST }} {% endif %} {% if imposto.ICMSST is defined -%} @@ -613,15 +626,6 @@ {{ imposto.ICMSUFDest.vFCPUFDest }} {{ imposto.ICMSUFDest.vICMSUFDest }} {{ imposto.ICMSUFDest.vICMSUFRemet }} - {{ imposto.ICMSUFDest.vBCFCP }} - {{ imposto.ICMSUFDest.pFCP }} - {{ imposto.ICMSUFDest.pFCP }} - {{ imposto.ICMSUFDest.vBCFCPST }} - {{ imposto.ICMSUFDest.pFCPST }} - {{ imposto.ICMSUFDest.vFCPST }} - {{ imposto.ICMSUFDest.pFCPSTRet }} - {{ imposto.ICMSUFDest.vFCPSTRet }} - {{ imposto.ICMSUFDest.pST }} {{ imposto.ICMSUFDest.vBCFCPUFDest }} {% endif %} @@ -648,8 +652,11 @@ {{ total.vFCPUFDest }} {{ total.vICMSUFDest }} {{ total.vICMSUFRemet }} + {{ total.vFCP }} {{ total.vBCST }} {{ total.vST }} + {{ total.vFCPST }} + {{ total.vFCPSTRet }} {{ total.vProd }} {{ total.vFrete }} {{ total.vSeg }} @@ -659,9 +666,6 @@ {{ total.vIPIDevol }} {{ total.vPIS }} {{ total.vCOFINS }} - {{ total.vFCP }} - {{ total.vFCPST }} - {{ total.vFCPSTRet }} {{ total.vOutro }} {{ total.vNF }} {{ total.vTotTrib }} @@ -762,8 +766,8 @@ {% endif %} {% endif %} - {% if NFe.infNFe.pag is defined %} - {% for pag in NFe.infNFe.pag %} + {{ pag.tPag }} {{ pag.vPag }} @@ -775,8 +779,8 @@ {% endif %} - {% endfor %} - {% endif %} + {{ NFe.infNFe.infAdic.infAdFisco|normalize|escape }} {{ NFe.infNFe.infAdic.infCpl|normalize|escape }} From f4bcbb071c93936716e8970eff60f49999f0e783 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Thu, 14 Jun 2018 23:34:59 -0300 Subject: [PATCH 21/85] =?UTF-8?q?[WIP]=20Finaliza=C3=A7=C3=A3o=20do=20layo?= =?UTF-8?q?ut=20do=20xml,=20usando=20zeep=20para=20fazer=20chamada=20SOAP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/Servidores.py | 353 +- pytrustnfe/nfe/__init__.py | 49 +- pytrustnfe/nfe/comunicacao.py | 4 +- pytrustnfe/nfe/templates/NfeAutorizacao.xml | 102 +- pytrustnfe/nfe/templates/NfeInutilizacao.xml | 2 +- pytrustnfe/nfe/templates/NfeRetAutorizacao.xml | 2 +- pytrustnfe/nfe/templates/NfeStatusServico.xml | 4 +- pytrustnfe/xml/schemas/enviNFe_v4.00.xsd | 9 + pytrustnfe/xml/schemas/leiauteNFe_v4.00.xsd | 6427 ++++++++++++++++++++++++ pytrustnfe/xml/schemas/nfe_v4.00.xsd | 9 + pytrustnfe/xml/schemas/tiposBasico_v4.00.xsd | 589 +++ pytrustnfe/xml/validate.py | 2 +- 12 files changed, 7279 insertions(+), 273 deletions(-) create mode 100755 pytrustnfe/xml/schemas/enviNFe_v4.00.xsd create mode 100755 pytrustnfe/xml/schemas/leiauteNFe_v4.00.xsd create mode 100755 pytrustnfe/xml/schemas/nfe_v4.00.xsd create mode 100755 pytrustnfe/xml/schemas/tiposBasico_v4.00.xsd diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 0ddc8d4..62cfd91 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -2,40 +2,29 @@ # © 2016 Danimar Ribeiro # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -WS_NFE_AUTORIZACAO = 'NfeAutorizacao' -WS_NFE_RET_AUTORIZACAO = 'NfeRetAutorizacao' -WS_NFE_CANCELAMENTO = 'RecepcaoEventoCancelamento' +# Consultas básicas da NF-e WS_NFE_INUTILIZACAO = 'NfeInutilizacao' WS_NFE_CONSULTA = 'NfeConsultaProtocolo' WS_NFE_SITUACAO = 'NfeStatusServico' -WS_NFE_CADASTRO = 'NfeConsultaCadastro' - -WS_NFCE_AUTORIZACAO = 'NfeAutorizacao' -WS_NFCE_RET_AUTORIZACAO = 'NfeRetAutorizacao' -WS_NFCE_CANCELAMENTO = 'RecepcaoEventoCancelamento' -WS_NFCE_INUTILIZACAO = 'NfeInutilizacao' -WS_NFCE_CONSULTA = 'NfeConsultaProtocolo' -WS_NFCE_SITUACAO = 'NfeStatusServico' -WS_NFCE_CADASTRO = 'NfeConsultaCadastro' -WS_NFCE_RECEPCAO_EVENTO = 'RecepcaoEventoCarta' -WS_NFCE_QR_CODE = 'NfeQRCode' -WS_NFCE_CONSULTA_DESTINADAS = 'NfeConsultaDest', - +WS_NFE_RECEPCAO_EVENTO = 'RecepcaoEvento' +WS_NFE_AUTORIZACAO = 'NfeAutorizacao' +WS_NFE_RET_AUTORIZACAO = 'NfeRetAutorizacao' +# Alguns estados possuem essa consulta não todos WS_NFE_CADASTRO = 'NfeConsultaCadastro' -WS_DPEC_RECEPCAO = 'RecepcaoEventoEPEC' -WS_DPEC_CONSULTA = 8 -WS_NFE_RECEPCAO_EVENTO = 'RecepcaoEventoCarta' -WS_NFE_RECEPCAO_EVENTO_MANIFESTO = 'RecepcaoEventoManifesto' + +# Ambiente nacional +WS_NFCE_QR_CODE = 'NfeQRCode' +WS_NFCE_CONSULTA_DESTINADAS = 'NfeConsultaDest' WS_DFE_DISTRIBUICAO = 'NFeDistribuicaoDFe' WS_DOWNLOAD_NFE = 'nfeDistDFeInteresse' -NFE_AMBIENTE_PRODUCAO = 1 -NFE_AMBIENTE_HOMOLOGACAO = 2 -NFCE_AMBIENTE_PRODUCAO = 1 -NFCE_AMBIENTE_HOMOLOGACAO = 2 +# Códigos do ambiente de homologação e produção +AMBIENTE_PRODUCAO = 1 +AMBIENTE_HOMOLOGACAO = 2 +# Modelos dos documentos eletrônicos NFE_MODELO = '55' NFCE_MODELO = '65' @@ -74,8 +63,7 @@ def localizar_url(servico, estado, mod='55', ambiente=2): sigla = SIGLA_ESTADO[estado] ws = ESTADO_WS[sigla] - if servico in (WS_DFE_DISTRIBUICAO, WS_DOWNLOAD_NFE, - WS_NFE_RECEPCAO_EVENTO_MANIFESTO): + if servico in (WS_DFE_DISTRIBUICAO, WS_DOWNLOAD_NFE): ws = AN if mod in ws: @@ -119,7 +107,6 @@ METODO_WS = { }, WS_NFE_SITUACAO: { 'webservice': 'NfeStatusServico2', - 'metodo': 'nfeStatusServicoNF2', }, WS_NFE_CADASTRO: { @@ -134,57 +121,54 @@ METODO_WS = { SVRS = { NFE_MODELO: { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.svrs.rs.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CADASTRO: 'ws/CadConsultaCadastro/CadConsultaCadastro2.asmx', - WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao2.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx', # noqa + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', # noqa }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfe-homologacao.svrs.rs.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CADASTRO: 'ws/CadConsultaCadastro/CadConsultaCadastro2.asmx', - WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao2.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx', # noqa + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', # noqa } }, NFCE_MODELO: { - NFCE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfce.svrs.rs.gov.br', - WS_NFCE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao2.asmx', - WS_NFCE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFCE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFCE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', - WS_NFCE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', - WS_NFCE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - WS_NFCE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx', # noqa WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx', }, - NFCE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfce-homologacao.svrs.rs.gov.br', - WS_NFCE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao2.asmx', - WS_NFCE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFCE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFCE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', - WS_NFCE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', - WS_NFCE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - WS_NFCE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx', # noqa WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx', } } } +# TODO Daqui pra frente tem que revisar SVAN = { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'www.sefazvirtual.fazenda.gov.br', WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', @@ -193,7 +177,7 @@ SVAN = { WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'hom.sefazvirtual.fazenda.gov.br', WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', @@ -205,7 +189,7 @@ SVAN = { } SCAN = { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'www.scan.fazenda.gov.br', WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', @@ -214,7 +198,7 @@ SCAN = { WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx' }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'hom.nfe.fazenda.gov.br', WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', @@ -226,7 +210,7 @@ SCAN = { } SVC_AN = { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'www.svc.fazenda.gov.br', WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', @@ -234,7 +218,7 @@ SVC_AN = { WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx' }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'hom.nfe.fazenda.gov.br', WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', @@ -245,7 +229,7 @@ SVC_AN = { } SVC_RS = { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefazvirtual.rs.gov.br', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx', @@ -253,7 +237,7 @@ SVC_RS = { WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'homologacao.nfe.sefazvirtual.rs.gov.br', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx', @@ -263,42 +247,28 @@ SVC_RS = { } } -DPEC = { - NFE_AMBIENTE_PRODUCAO: { - 'servidor': 'www.nfe.fazenda.gov.br', - WS_DPEC_CONSULTA: 'SCERecepcaoRFB/SCERecepcaoRFB.asmx', - WS_DPEC_RECEPCAO: 'SCEConsultaRFB/SCEConsultaRFB.asmx' - }, - NFE_AMBIENTE_HOMOLOGACAO: { - 'servidor': 'hom.nfe.fazenda.gov.br', - WS_DPEC_CONSULTA: 'SCERecepcaoRFB/SCERecepcaoRFB.asmx', - WS_DPEC_RECEPCAO: 'SCEConsultaRFB/SCEConsultaRFB.asmx' - } -} - AN = { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'www1.nfe.fazenda.gov.br', WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx', WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx', - WS_NFE_RECEPCAO_EVENTO_MANIFESTO: 'RecepcaoEvento/RecepcaoEvento.asmx', + WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'hom.nfe.fazenda.gov.br', WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx', WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx', - WS_NFE_RECEPCAO_EVENTO_MANIFESTO: 'RecepcaoEvento/RecepcaoEvento.asmx', + WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', }, } UFAM = { NFE_MODELO: { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.am.gov.br', WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento', - WS_NFE_CANCELAMENTO: 'services2/services/RecepcaoEvento', WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao', WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao', WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao2', @@ -306,10 +276,9 @@ UFAM = { WS_NFE_SITUACAO: 'services2/services/NfeStatusServico2', WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'homnfe.sefaz.am.gov.br', WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento', - WS_NFE_CANCELAMENTO: 'services2/services/RecepcaoEvento', WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao', WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao', WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao2', @@ -319,10 +288,9 @@ UFAM = { } }, NFCE_MODELO: { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.am.gov.br', WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento', - WS_NFE_CANCELAMENTO: 'services2/services/RecepcaoEvento', WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao', WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao', WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao2', @@ -330,10 +298,9 @@ UFAM = { WS_NFE_SITUACAO: 'services2/services/NfeStatusServico2', WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'homnfce.sefaz.am.gov.br', WS_NFE_RECEPCAO_EVENTO: 'nfce-services-nac/services/RecepcaoEvento', - WS_NFE_CANCELAMENTO: 'nfce-services-nac/services/RecepcaoEvento', WS_NFE_AUTORIZACAO: 'nfce-services-nac/services/NfeAutorizacao', WS_NFE_RET_AUTORIZACAO: 'nfce-services-nac/services/NfeRetAutorizacao', WS_NFE_INUTILIZACAO: 'nfce-services-nac/services/NfeInutilizacao2', @@ -345,7 +312,7 @@ UFAM = { } UFBA = { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.ba.gov.br', WS_NFE_AUTORIZACAO: 'webservices/NfeAutorizacao/NfeAutorizacao.asmx', WS_NFE_RET_AUTORIZACAO: @@ -355,9 +322,8 @@ UFBA = { WS_NFE_INUTILIZACAO: 'webservices/nfenw/nfeinutilizacao2.asmx', WS_NFE_CADASTRO: 'webservices/nfenw/CadConsultaCadastro2.asmx', WS_NFE_RECEPCAO_EVENTO: 'webservices/sre/recepcaoevento.asmx', - WS_NFE_CANCELAMENTO: 'webservices/sre/recepcaoevento.asmx', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'hnfe.sefaz.ba.gov.br', WS_NFE_AUTORIZACAO: 'webservices/NfeAutorizacao/NfeAutorizacao.asmx', WS_NFE_RET_AUTORIZACAO: @@ -367,12 +333,11 @@ UFBA = { WS_NFE_INUTILIZACAO: 'webservices/nfenw/nfeinutilizacao2.asmx', WS_NFE_CADASTRO: 'webservices/nfenw/CadConsultaCadastro2.asmx', WS_NFE_RECEPCAO_EVENTO: 'webservices/sre/recepcaoevento.asmx', - WS_NFE_CANCELAMENTO: 'webservices/sre/recepcaoevento.asmx', } } UFCE = { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.ce.gov.br', WS_NFE_AUTORIZACAO: 'nfe2/services/NfeAutorizacao', WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetAutorizacao', @@ -381,9 +346,8 @@ UFCE = { WS_NFE_SITUACAO: 'nfe2/services/NfeStatusServico2', WS_NFE_CADASTRO: 'nfe2/services/CadConsultaCadastro2', WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/RecepcaoEvento', - WS_NFE_CANCELAMENTO: 'nfe2/services/RecepcaoEvento', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfeh.sefaz.ce.gov.br', WS_NFE_AUTORIZACAO: 'nfe2/services/NfeAutorizacao', WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetAutorizacao', @@ -392,13 +356,12 @@ UFCE = { WS_NFE_SITUACAO: 'nfe2/services/NfeStatusServico2', WS_NFE_CADASTRO: 'nfe2/services/CadConsultaCadastro2', WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/RecepcaoEvento', - WS_NFE_CANCELAMENTO: 'nfe2/services/RecepcaoEvento', } } UFGO = { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.go.gov.br', WS_NFE_RECEPCAO_EVENTO: 'nfe/services/v2/RecepcaoEvento', WS_NFE_AUTORIZACAO: 'nfe/services/v2/NfeAutorizacao', @@ -407,9 +370,8 @@ UFGO = { WS_NFE_CONSULTA: 'nfe/services/v2/NfeConsulta2', WS_NFE_SITUACAO: 'nfe/services/v2/NfeStatusServico2', WS_NFE_CADASTRO: 'nfe/services/v2/CadConsultaCadastro2', - WS_NFE_CANCELAMENTO: 'nfe/services/v2/RecepcaoEvento', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'homolog.sefaz.go.gov.br', WS_NFE_RECEPCAO_EVENTO: 'nfe/services/v2/RecepcaoEvento', WS_NFE_AUTORIZACAO: 'nfe/services/v2/NfeAutorizacao', @@ -418,13 +380,12 @@ UFGO = { WS_NFE_CONSULTA: 'nfe/services/v2/NfeConsulta2', WS_NFE_SITUACAO: 'nfe/services/v2/NfeStatusServico2', WS_NFE_CADASTRO: 'nfe/services/v2/CadConsultaCadastro2', - WS_NFE_CANCELAMENTO: 'nfe/services/v2/RecepcaoEvento', } } UFMT = { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.mt.gov.br', WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao', WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao', @@ -433,9 +394,8 @@ UFMT = { WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico2', WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro2', WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento', - WS_NFE_CANCELAMENTO: 'nfews/v2/services/RecepcaoEvento', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'homologacao.sefaz.mt.gov.br', WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao', WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao', @@ -444,12 +404,11 @@ UFMT = { WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico2', WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro2', WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento', - WS_NFE_CANCELAMENTO: 'nfews/v2/services/RecepcaoEvento', } } UFMS = { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.fazenda.ms.gov.br', WS_NFE_RECEPCAO_EVENTO: 'producao/services2/RecepcaoEvento', WS_NFE_AUTORIZACAO: 'producao/services2/NfeAutorizacao', @@ -458,9 +417,8 @@ UFMS = { WS_NFE_INUTILIZACAO: 'producao/services2/NfeInutilizacao2', WS_NFE_CONSULTA: 'producao/services2/NfeConsulta2', WS_NFE_SITUACAO: 'producao/services2/NfeStatusServico2', - WS_NFE_CANCELAMENTO: 'producao/services2/RecepcaoEvento', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'homologacao.nfe.ms.gov.br', WS_NFE_RECEPCAO_EVENTO: 'homologacao/services2/RecepcaoEvento', WS_NFE_AUTORIZACAO: 'homologacao/services2/NfeAutorizacao', @@ -469,37 +427,35 @@ UFMS = { WS_NFE_INUTILIZACAO: 'homologacao/services2/NfeInutilizacao2', WS_NFE_CONSULTA: 'homologacao/services2/NfeConsulta2', WS_NFE_SITUACAO: 'homologacao/services2/NfeStatusServico2', - WS_NFE_CANCELAMENTO: 'homologacao/services2/RecepcaoEvento', } } UFMG = { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.fazenda.mg.gov.br', - WS_NFE_AUTORIZACAO: 'nfe2/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfe2/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfe2/services/NfeConsulta2', - WS_NFE_SITUACAO: 'nfe2/services/NfeStatus2', - WS_NFE_CADASTRO: 'nfe2/services/cadconsultacadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/RecepcaoEvento', - WS_NFE_CANCELAMENTO: 'nfe2/services/RecepcaoEvento', + WS_NFE_INUTILIZACAO: 'nfe2/services/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe2/services/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe2/services/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe2/services/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe2/services/cadconsultacadastro2?wsdl', + }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'hnfe.fazenda.mg.gov.br', - WS_NFE_AUTORIZACAO: 'nfe2/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfe2/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfe2/services/NfeConsulta2', - WS_NFE_SITUACAO: 'nfe2/services/NfeStatus2', - WS_NFE_CADASTRO: 'nfe2/services/cadconsultacadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/RecepcaoEvento', - WS_NFE_CANCELAMENTO: 'nfe2/services/RecepcaoEvento', + WS_NFE_INUTILIZACAO: 'nfe2/services/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe2/services/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe2/services/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe2/services/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe2/services/cadconsultacadastro2?wsdl', } } UFPR = { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.fazenda.pr.gov.br', WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao3', WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao3', @@ -508,9 +464,8 @@ UFPR = { WS_NFE_SITUACAO: 'nfe/NFeStatusServico3', WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro2', WS_NFE_RECEPCAO_EVENTO: 'nfe-evento/NFeRecepcaoEvento', - WS_NFE_CANCELAMENTO: 'nfe-evento/NFeRecepcaoEvento', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'homologacao.nfe.fazenda.pr.gov.br', WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao3', WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao3', @@ -519,15 +474,13 @@ UFPR = { WS_NFE_SITUACAO: 'nfe/NFeStatusServico3', WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro2', WS_NFE_RECEPCAO_EVENTO: 'nfe-evento/NFeRecepcaoEvento', - WS_NFE_CANCELAMENTO: 'nfe-evento/NFeRecepcaoEvento', } } UFPE = { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.pe.gov.br', WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/RecepcaoEvento', - WS_NFE_CANCELAMENTO: 'nfe-service/services/RecepcaoEvento', WS_NFE_AUTORIZACAO: 'nfe-service/services/NfeAutorizacao', WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NfeRetAutorizacao', WS_NFE_INUTILIZACAO: 'nfe-service/services/NfeInutilizacao2', @@ -535,10 +488,9 @@ UFPE = { WS_NFE_SITUACAO: 'nfe-service/services/NfeStatusServico2', WS_NFE_CADASTRO: 'nfe-service/services/CadConsultaCadastro2', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfehomolog.sefaz.pe.gov.br', WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/RecepcaoEvento', - WS_NFE_CANCELAMENTO: 'nfe-service/services/RecepcaoEvento', WS_NFE_AUTORIZACAO: 'nfe-service/services/NfeAutorizacao', WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NfeRetAutorizacao', WS_NFE_INUTILIZACAO: 'nfe-service/services/NfeInutilizacao2', @@ -551,7 +503,7 @@ UFPE = { UFRS = { NFE_MODELO: { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefazrs.rs.gov.br', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', @@ -560,9 +512,8 @@ UFRS = { WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', - WS_NFE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfe-homologacao.sefazrs.rs.gov.br', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', @@ -571,32 +522,29 @@ UFRS = { WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', - WS_NFE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', } }, NFCE_MODELO: { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfce.sefazrs.rs.gov.br', - WS_NFCE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFCE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', - WS_NFCE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - WS_NFCE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', - WS_NFCE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', - WS_NFCE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFCE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', - WS_NFCE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', + WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', WS_NFCE_QR_CODE: 'https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfce-homologacao.sefazrs.rs.gov.br', - WS_NFCE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFCE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', - WS_NFCE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - WS_NFCE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', - WS_NFCE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', - WS_NFCE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFCE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', - WS_NFCE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', + WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', WS_NFCE_QR_CODE: 'https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx' } } @@ -604,7 +552,7 @@ UFRS = { UFSP = { NFE_MODELO: { - NFE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfe.fazenda.sp.gov.br', WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx', WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx', @@ -613,9 +561,8 @@ UFSP = { WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx', WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.asmx', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx', - WS_NFE_CANCELAMENTO: 'ws/recepcaoevento.asmx', }, - NFE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'homologacao.nfe.fazenda.sp.gov.br', WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx', WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx', @@ -624,30 +571,29 @@ UFSP = { WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx', WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.asmx', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx', - WS_NFE_CANCELAMENTO: 'ws/recepcaoevento.asmx', } }, NFCE_MODELO: { - NFCE_AMBIENTE_PRODUCAO: { + AMBIENTE_PRODUCAO: { 'servidor': 'nfce.fazenda.sp.gov.br', - WS_NFCE_AUTORIZACAO: 'ws/nfeautorizacao.asmx', - WS_NFCE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx', - WS_NFCE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx', - WS_NFCE_CONSULTA: 'ws/nfeconsulta2.asmx', - WS_NFCE_SITUACAO: 'ws/nfestatusservico2.asmx', - WS_NFCE_CADASTRO: 'ws/cadconsultacadastro2.asmx', - WS_NFCE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx', + 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_NFCE_QR_CODE: '', }, - NFCE_AMBIENTE_HOMOLOGACAO: { + AMBIENTE_HOMOLOGACAO: { 'servidor': 'homologacao.nfce.fazenda.sp.gov.br', - WS_NFCE_AUTORIZACAO: 'ws/nfeautorizacao.asmx', - WS_NFCE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx', - WS_NFCE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx', - WS_NFCE_CONSULTA: 'ws/nfeconsulta2.asmx', - WS_NFCE_SITUACAO: 'ws/nfestatusservico2.asmx', - WS_NFCE_CADASTRO: 'ws/cadconsultacadastro2.asmx', - WS_NFCE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx', + 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_NFCE_QR_CODE: 'https://homologacao.nfce.fazenda.sp.gov.br/NFCEConsultaPublica/Paginas/ConstultaQRCode.aspx', } } @@ -683,46 +629,3 @@ ESTADO_WS = { 'SP': UFSP, 'TO': SVRS, } - - -# -# Informação obtida em -# http://www.nfe.fazenda.gov.br/portal/webServices.aspx -# Última verificação: 15/08/2014 16:22 -# -# Autorizadores em contingência: -# - UF que utilizam a SVC-AN - Sefaz Virtual de Contingência Ambiente Nacional: -# AC, AL, AP, DF, ES, MG, PB, RJ, RN, RO, RR, RS, SC, SE, SP, TO -# - UF que utilizam a SVC-RS - Sefaz Virtual de Contingência Rio Grande do Sul: -# AM, BA, CE, GO, MA, MS, MT, PA, PE, PI, PR -# - -ESTADO_WS_CONTINGENCIA = { - 'AC': SVC_AN, - 'AL': SVC_AN, - 'AM': SVC_RS, - 'AP': SVC_AN, - 'BA': SVC_RS, - 'CE': SVC_RS, - 'DF': SVC_AN, - 'ES': SVC_AN, - 'GO': SVC_RS, - 'MA': SVC_RS, - 'MG': SVC_AN, - 'MS': SVC_RS, - 'MT': SVC_RS, - 'PA': SVC_RS, - 'PB': SVC_AN, - 'PE': SVC_RS, - 'PI': SVC_RS, - 'PR': SVC_RS, - 'RJ': SVC_AN, - 'RN': SVC_AN, - 'RO': SVC_AN, - 'RR': SVC_AN, - 'RS': SVC_AN, - 'SC': SVC_AN, - 'SE': SVC_AN, - 'SP': SVC_AN, - 'TO': SVC_AN, -} diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index ec1de27..fdf8a44 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -9,12 +9,18 @@ import binascii from lxml import etree from .comunicacao import executar_consulta from .assinatura import Assinatura -from pytrustnfe.xml import render_xml +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 +from requests import Session +from zeep import Client +from zeep.transports import Transport def _build_header(method, **kwargs): @@ -182,21 +188,32 @@ def _render(certificado, method, sign, **kwargs): def _send(certificado, method, **kwargs): xml_send = kwargs["xml"] - url = localizar_url(method, kwargs['estado'], kwargs['modelo'], - kwargs['ambiente']) - cabecalho = _build_header(method, **kwargs) - - 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.decode(), - 'object': obj - } + base_url = localizar_url(method, kwargs['estado'], kwargs['modelo'], + kwargs['ambiente']) + + cert, key = extract_cert_and_key_from_pfx( + certificado.pfx, certificado.password) + cert, key = save_cert_key(cert, key) + + session = Session() + session.cert = (cert, key) + session.verify = False + transport = Transport(session=session) + + xml = etree.fromstring(xml_send) + client = Client(base_url, transport=transport) + + port = next(iter(client.wsdl.port_types)) + first_operation = next(iter(client.wsdl.port_types[port].operations)) + 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, + 'object': obj.Body.nfeResultMsg + } def xml_autorizar_nfe(certificado, **kwargs): diff --git a/pytrustnfe/nfe/comunicacao.py b/pytrustnfe/nfe/comunicacao.py index 34c550e..e3d82ed 100644 --- a/pytrustnfe/nfe/comunicacao.py +++ b/pytrustnfe/nfe/comunicacao.py @@ -11,9 +11,7 @@ from ..xml import sanitize_response def _soap_xml(body, cabecalho): xml = '' - xml += '' - xml += '' - xml += '' + cabecalho.estado + '' + cabecalho.versao + '' + xml += '' xml += '' xml += body xml += '' diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml index 89f6eac..bf1cc8b 100644 --- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml +++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml @@ -181,6 +181,9 @@ {{ prod.NCM }} {{ prod.NVE }} {{ prod.CEST }} + {{ prod.indEscala }} + {{ prod.CNPJFab }} + {{ prod.cBenef }} {{ prod.EXTIPI }} {{ prod.CFOP }} {{ prod.uCom }} @@ -243,6 +246,21 @@ {{ prod.xPed }} {{ prod.nItemPed }} {{ prod.nFCI }} + {% for rastro in prod.rastro %} + + {{ rastro.nLote }} + {{ rastro.qLote }} + {{ rastro.dFab }} + {{ rastro.dVal }} + {{ rastro.cAgreg }} + + {% endfor %} + {% for med in prod.med %} + + {{ med.cProdANVISA }} + {{ med.vPMC }} + + {% endfor %} {% endwith %} @@ -257,6 +275,8 @@ {{ imposto.ICMS.vBC }} {{ imposto.ICMS.pICMS }} {{ imposto.ICMS.vICMS }} + {{ imposto.ICMS.pFCP }} + {{ imposto.ICMS.vFCP }} {% endif %} {% if imposto.ICMS.CST == '10' -%} @@ -267,12 +287,18 @@ {{ imposto.ICMS.vBC }} {{ imposto.ICMS.pICMS }} {{ imposto.ICMS.vICMS }} + {{ imposto.ICMS.vBCFCP }} + {{ imposto.ICMS.pFCP }} + {{ imposto.ICMS.vFCP }} {{ imposto.ICMS.modBCST }} {{ imposto.ICMS.pMVAST }} {{ imposto.ICMS.pRedBCST }} {{ imposto.ICMS.vBCST }} {{ imposto.ICMS.pICMSST }} {{ imposto.ICMS.vICMSST }} + {{ imposto.ICMS.vBCFCPST }} + {{ imposto.ICMS.pFCPST }} + {{ imposto.ICMS.vFCPST }} {% endif %} {% if imposto.ICMS.CST == '20' -%} @@ -284,6 +310,9 @@ {{ imposto.ICMS.vBC }} {{ imposto.ICMS.pICMS }} {{ imposto.ICMS.vICMS }} + {{ imposto.ICMS.vBCFCP }} + {{ imposto.ICMS.pFCP }} + {{ imposto.ICMS.vFCP }} {{ imposto.ICMS.vICMSDeson }} {{ imposto.ICMS.motDesICMS }} @@ -298,6 +327,9 @@ {{ imposto.ICMS.vBCST }} {{ imposto.ICMS.pICMSST }} {{ imposto.ICMS.vICMSST }} + {{ imposto.ICMS.vBCFCPST }} + {{ imposto.ICMS.pFCPST }} + {{ imposto.ICMS.vFCPST }} {{ imposto.ICMS.vICMSDeson }} {{ imposto.ICMS.motDesICMS }} @@ -322,6 +354,9 @@ {{ imposto.ICMS.pDif }} {{ imposto.ICMS.vICMSDif }} {{ imposto.ICMS.vICMS }} + {{ imposto.ICMS.vBCFCP }} + {{ imposto.ICMS.pFCP }} + {{ imposto.ICMS.vFCP }} {% endif %} {% if imposto.ICMS.CST == '60' -%} @@ -329,7 +364,11 @@ {{ imposto.ICMS.orig }} {{ imposto.ICMS.CST }} {{ imposto.ICMS.vBCSTRet }} + {{ imposto.ICMS.pST }} {{ imposto.ICMS.vICMSSTRet }} + {{ imposto.ICMS.vBCFCPSTRet }} + {{ imposto.ICMS.pFCPSTRet }} + {{ imposto.ICMS.vFCPSTRet }} {% endif %} {% if imposto.ICMS.CST == '70' -%} @@ -341,12 +380,18 @@ {{ imposto.ICMS.vBC }} {{ imposto.ICMS.pICMS }} {{ imposto.ICMS.vICMS }} + {{ imposto.ICMS.vBCFCP }} + {{ imposto.ICMS.pFCP }} + {{ imposto.ICMS.vFCP }} {{ imposto.ICMS.modBCST }} {{ imposto.ICMS.pMVAST }} {{ imposto.ICMS.pRedBCST }} {{ imposto.ICMS.vBCST }} {{ imposto.ICMS.pICMSST }} {{ imposto.ICMS.vICMSST }} + {{ imposto.ICMS.vBCFCPST }} + {{ imposto.ICMS.pFCPST }} + {{ imposto.ICMS.vFCPST }} {{ imposto.ICMS.vICMSDeson }} {{ imposto.ICMS.motDesICMS }} @@ -362,7 +407,7 @@ {{ imposto.ICMS.vICMS }} {{ imposto.ICMS.vBCFCP }} {{ imposto.ICMS.pFCP }} - {{ imposto.ICMS.pFCP }} + {{ imposto.ICMS.pFCP }} {{ imposto.ICMS.modBCST }} {{ imposto.ICMS.pMVAST }} {{ imposto.ICMS.pRedBCST }} @@ -391,15 +436,6 @@ {{ imposto.ICMSPart.pRedBCST }} {{ imposto.ICMSPart.pBCOp }} {{ imposto.ICMSPart.UFST }} - {{ imposto.ICMSPart.pFCP }} - {{ imposto.ICMSPart.pFCP }} - {{ imposto.ICMSPart.vBCFCP }} - {{ imposto.ICMSPart.vBCFCPST }} - {{ imposto.ICMSPart.pFCPST }} - {{ imposto.ICMSPart.vFCPST }} - {{ imposto.ICMSPart.pFCPSTRet }} - {{ imposto.ICMSPart.vFCPSTRet }} - {{ imposto.ICMSPart.pST }} {% endif %} {% if imposto.ICMSST is defined -%} @@ -436,6 +472,9 @@ {{ imposto.ICMS.vBCST }} {{ imposto.ICMS.pICMSST }} {{ imposto.ICMS.vICMSST }} + {{ imposto.ICMS.vBCFCPST }} + {{ imposto.ICMS.pFCPST }} + {{ imposto.ICMS.vFCPST }} {{ imposto.ICMS.pCredSN }} {{ imposto.ICMS.vCredICMSSN }} @@ -450,6 +489,9 @@ {{ imposto.ICMS.vBCST }} {{ imposto.ICMS.pICMSST }} {{ imposto.ICMS.vICMSST }} + {{ imposto.ICMS.vBCFCPST }} + {{ imposto.ICMS.pFCPST }} + {{ imposto.ICMS.vFCPST }} {% endif %} {% if imposto.ICMS.CST == '500' -%} @@ -457,7 +499,11 @@ {{ imposto.ICMS.orig }} {{ imposto.ICMS.CST }} {{ imposto.ICMS.vBCSTRet }} + {{ imposto.ICMS.pST }} {{ imposto.ICMS.vICMSSTRet }} + {{ imposto.ICMS.vBCFCPSTRet }} + {{ imposto.ICMS.pFCPSTRet }} + {{ imposto.ICMS.pFCPSTRet }} {% endif %} {% if imposto.ICMS.CST == '900' -%} @@ -475,6 +521,9 @@ {{ imposto.ICMS.vBCST }} {{ imposto.ICMS.pICMSST }} {{ imposto.ICMS.vICMSST }} + {{ imposto.ICMS.vBCFCPST }} + {{ imposto.ICMS.pFCPST }} + {{ imposto.ICMS.vFCPST }} {{ imposto.ICMS.pCredSN }} {{ imposto.ICMS.vCredICMSSN }} @@ -619,6 +668,7 @@ {% if imposto.ICMSUFDest is defined %} {{ imposto.ICMSUFDest.vBCUFDest }} + {{ imposto.ICMSUFDest.vBCFCPUFDest }} {{ imposto.ICMSUFDest.pFCPUFDest }} {{ imposto.ICMSUFDest.pICMSUFDest }} {{ imposto.ICMSUFDest.pICMSInter }} @@ -626,7 +676,6 @@ {{ imposto.ICMSUFDest.vFCPUFDest }} {{ imposto.ICMSUFDest.vICMSUFDest }} {{ imposto.ICMSUFDest.vICMSUFRemet }} - {{ imposto.ICMSUFDest.vBCFCPUFDest }} {% endif %} {% endwith %} @@ -766,21 +815,26 @@ {% endif %} {% endif %} - + {% if NFe.infNFe.pag is defined %} - {{ pag.tPag }} - {{ pag.vPag }} - {% if pag.card is defined %} - - {{ pag.card.CNPJ }} - {{ pag.card.tBand }} - {{ pag.card.cAut }} - - {% endif %} + {% for pag in NFe.infNFe.pag %} + + {{ pag.indPag }} + {{ pag.tPag }} + {{ pag.vPag }} + {% if pag.card is defined %} + + {{ pag.card.tpIntegra }} + {{ pag.card.CNPJ }} + {{ pag.card.tBand }} + {{ pag.card.cAut }} + + {% endif %} + {{ pag.vTroco }} + + {% endfor %} - + {% endif %} {{ NFe.infNFe.infAdic.infAdFisco|normalize|escape }} {{ NFe.infNFe.infAdic.infCpl|normalize|escape }} diff --git a/pytrustnfe/nfe/templates/NfeInutilizacao.xml b/pytrustnfe/nfe/templates/NfeInutilizacao.xml index d495f82..d8a7739 100644 --- a/pytrustnfe/nfe/templates/NfeInutilizacao.xml +++ b/pytrustnfe/nfe/templates/NfeInutilizacao.xml @@ -1,4 +1,4 @@ - + {{ obj.ambiente }} INUTILIZAR diff --git a/pytrustnfe/nfe/templates/NfeRetAutorizacao.xml b/pytrustnfe/nfe/templates/NfeRetAutorizacao.xml index 7eb4729..c2f07f1 100644 --- a/pytrustnfe/nfe/templates/NfeRetAutorizacao.xml +++ b/pytrustnfe/nfe/templates/NfeRetAutorizacao.xml @@ -1,4 +1,4 @@ - + {{ obj.ambiente }} {{ obj.numero_recibo }} diff --git a/pytrustnfe/nfe/templates/NfeStatusServico.xml b/pytrustnfe/nfe/templates/NfeStatusServico.xml index 1d41a30..ae84f20 100644 --- a/pytrustnfe/nfe/templates/NfeStatusServico.xml +++ b/pytrustnfe/nfe/templates/NfeStatusServico.xml @@ -1,6 +1,6 @@ - + {{ obj.ambiente }} {{ obj.estado }} STATUS - \ No newline at end of file + diff --git a/pytrustnfe/xml/schemas/enviNFe_v4.00.xsd b/pytrustnfe/xml/schemas/enviNFe_v4.00.xsd new file mode 100755 index 0000000..05ee5dc --- /dev/null +++ b/pytrustnfe/xml/schemas/enviNFe_v4.00.xsd @@ -0,0 +1,9 @@ + + + + + + Schema XML de validação do Pedido de Concessão de Autorização da Nota Fiscal Eletrônica + + + diff --git a/pytrustnfe/xml/schemas/leiauteNFe_v4.00.xsd b/pytrustnfe/xml/schemas/leiauteNFe_v4.00.xsd new file mode 100755 index 0000000..f389699 --- /dev/null +++ b/pytrustnfe/xml/schemas/leiauteNFe_v4.00.xsd @@ -0,0 +1,6427 @@ + + + + + + + + + + + + + + + Tipo Nota Fiscal Eletrônica + + + + + Informações da Nota Fiscal eletrônica + + + + + + identificação da NF-e + + + + + + Código da UF do emitente do Documento Fiscal. Utilizar a Tabela do IBGE. + + + + + Código numérico que compõe a Chave de Acesso. Número aleatório gerado pelo emitente para cada NF-e. + + + + + + + + + + + Descrição da Natureza da Operação + + + + + + + + + + + Código do modelo do Documento Fiscal. 55 = NF-e; 65 = NFC-e. + + + + + Série do Documento Fiscal +série normal 0-889 +Avulsa Fisco 890-899 +SCAN 900-999 + + + + + Número do Documento Fiscal + + + + + Data e Hora de emissão do Documento Fiscal (AAAA-MM-DDThh:mm:ssTZD) ex.: 2012-09-01T13:00:00-03:00 + + + + + Data e Hora da saída ou de entrada da mercadoria / produto (AAAA-MM-DDTHH:mm:ssTZD) + + + + + Tipo do Documento Fiscal (0 - entrada; 1 - saída) + + + + + + + + + + + + Identificador de Local de destino da operação (1-Interna;2-Interestadual;3-Exterior) + + + + + + + + + + + + + Código do Município de Ocorrência do Fato Gerador (utilizar a tabela do IBGE) + + + + + Formato de impressão do DANFE (0-sem DANFE;1-DANFe Retrato; 2-DANFe Paisagem;3-DANFe Simplificado; + 4-DANFe NFC-e;5-DANFe NFC-e em mensagem eletrônica) + + + + + + + + + + + + + + + + Forma de emissão da NF-e +1 - Normal; +2 - Contingência FS +3 - Contingência SCAN +4 - Contingência DPEC +5 - Contingência FSDA +6 - Contingência SVC - AN +7 - Contingência SVC - RS +9 - Contingência off-line NFC-e + + + + + + + + + + + + + + + + + + Digito Verificador da Chave de Acesso da NF-e + + + + + + + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Finalidade da emissão da NF-e: +1 - NFe normal +2 - NFe complementar +3 - NFe de ajuste +4 - Devolução/Retorno + + + + + Indica operação com consumidor final (0-Não;1-Consumidor Final) + + + + + + + + + + + + Indicador de presença do comprador no estabelecimento comercial no momento da oepração + (0-Não se aplica (ex.: Nota Fiscal complementar ou de ajuste;1-Operação presencial;2-Não presencial, internet;3-Não presencial, teleatendimento;4-NFC-e entrega em domicílio;5-Operação presencial, fora do estabelecimento;9-Não presencial, outros) + + + + + + + + + + + + + + + + + Processo de emissão utilizado com a seguinte codificação: +0 - emissão de NF-e com aplicativo do contribuinte; +1 - emissão de NF-e avulsa pelo Fisco; +2 - emissão de NF-e avulsa, pelo contribuinte com seu certificado digital, através do site +do Fisco; +3- emissão de NF-e pelo contribuinte com aplicativo fornecido pelo Fisco. + + + + + versão do aplicativo utilizado no processo de +emissão + + + + + + + + + + + Informar apenas +para tpEmis diferente de 1 + + + + Informar a data e hora de entrada em contingência contingência no formato (AAAA-MM-DDThh:mm:ssTZD) ex.: 2012-09-01T13:00:00-03:00. + + + + + Informar a Justificativa da entrada + + + + + + + + + + + + Grupo de infromações da NF referenciada + + + + + + Chave de acesso das NF-e referenciadas. Chave de acesso compostas por Código da UF (tabela do IBGE) + AAMM da emissão + CNPJ do Emitente + modelo, série e número da NF-e Referenciada + Código Numérico + DV. + + + + + Dados da NF modelo 1/1A referenciada ou NF modelo 2 referenciada + + + + + + Código da UF do emitente do Documento Fiscal. Utilizar a Tabela do IBGE. + + + + + AAMM da emissão + + + + + + + + + + + CNPJ do emitente do documento fiscal referenciado + + + + + Código do modelo do Documento Fiscal. Utilizar 01 para NF modelo 1/1A e 02 para NF modelo 02 + + + + + + + + + + + + Série do Documento Fiscal, informar zero se inexistente + + + + + Número do Documento Fiscal + + + + + + + + Grupo com as informações NF de produtor referenciada + + + + + + Código da UF do emitente do Documento FiscalUtilizar a Tabela do IBGE (Anexo IV - Tabela de UF, Município e País) + + + + + AAMM da emissão da NF de produtor + + + + + + + + + + + + CNPJ do emitente da NF de produtor + + + + + CPF do emitente da NF de produtor + + + + + + IE do emitente da NF de Produtor + + + + + Código do modelo do Documento Fiscal - utilizar 04 para NF de produtor ou 01 para NF Avulsa + + + + + + + + + + + + Série do Documento Fiscal, informar zero se inexistentesérie + + + + + Número do Documento Fiscal - 1 – 999999999 + + + + + + + + Utilizar esta TAG para referenciar um CT-e emitido anteriormente, vinculada a NF-e atual + + + + + Grupo do Cupom Fiscal vinculado à NF-e + + + + + + Código do modelo do Documento Fiscal +Preencher com "2B", quando se tratar de Cupom Fiscal emitido por máquina registradora (não ECF), com "2C", quando se tratar de Cupom Fiscal PDV, ou "2D", quando se tratar de Cupom Fiscal (emitido por ECF) + + + + + + + + + + + + + Informar o número de ordem seqüencial do ECF que emitiu o Cupom Fiscal vinculado à NF-e + + + + + + + + + + + Informar o Número do Contador de Ordem de Operação - COO vinculado à NF-e + + + + + + + + + + + + + + + + + + + + Identificação do emitente + + + + + + + Número do CNPJ do emitente + + + + + Número do CPF do emitente + + + + + + Razão Social ou Nome do emitente + + + + + + + + + + + Nome fantasia + + + + + + + + + + + Endereço do emitente + + + + + Inscrição Estadual do Emitente + + + + + Inscricao Estadual do Substituto Tributário + + + + + Grupo de informações de interesse da Prefeitura + + + + Inscrição Municipal + + + + + + + + + + + CNAE Fiscal + + + + + + + + + + + + Código de Regime Tributário. +Este campo será obrigatoriamente preenchido com: +1 – Simples Nacional; +2 – Simples Nacional – excesso de sublimite de receita bruta; +3 – Regime Normal. + + + + + + + + + + + + + + + + Emissão de avulsa, informar os dados do Fisco emitente + + + + + + CNPJ do Órgão emissor + + + + + Órgão emitente + + + + + + + + + + + Matrícula do agente + + + + + + + + + + + Nome do agente + + + + + + + + + + + Telefone + + + + + + + + + + + Sigla da Unidade da Federação + + + + + Número do Documento de Arrecadação de Receita + + + + + + + + + + + Data de emissão do DAR (AAAA-MM-DD) + + + + + Valor Total constante no DAR + + + + + Repartição Fiscal emitente + + + + + + + + + + + Data de pagamento do DAR (AAAA-MM-DD) + + + + + + + + Identificação do Destinatário + + + + + + + Número do CNPJ + + + + + Número do CPF + + + + + Identificador do destinatário, em caso de comprador estrangeiro + + + + + + + + + + + + Razão Social ou nome do destinatário + + + + + + + + + + + Dados do endereço + + + + + Indicador da IE do destinatário: +1 – Contribuinte ICMSpagamento à vista; +2 – Contribuinte isento de inscrição; +9 – Não Contribuinte + + + + + + + + + + + + + Inscrição Estadual (obrigatório nas operações com contribuintes do ICMS) + + + + + Inscrição na SUFRAMA (Obrigatório nas operações com as áreas com benefícios de incentivos fiscais sob controle da SUFRAMA) PL_005d - 11/08/09 - alterado para aceitar 8 ou 9 dígitos + + + + + + + + + + + Inscrição Municipal do tomador do serviço + + + + + + + + + + + Informar o e-mail do destinatário. O campo pode ser utilizado para informar o e-mail +de recepção da NF-e indicada pelo destinatário + + + + + + + + + + + + + + + Identificação do Local de Retirada (informar apenas quando for diferente do endereço do remetente) + + + + + Identificação do Local de Entrega (informar apenas quando for diferente do endereço do destinatário) + + + + + Pessoas autorizadas para o download do XML da NF-e + + + + + + CNPJ Autorizado + + + + + CPF Autorizado + + + + + + + + Dados dos detalhes da NF-e + + + + + + Dados dos produtos e serviços da NF-e + + + + + + Código do produto ou serviço. Preencher com CFOP caso se trate de itens não relacionados com mercadorias/produto e que o contribuinte não possua codificação própria +Formato ”CFOP9999”. + + + + + + + + + + + GTIN (Global Trade Item Number) do produto, antigo código EAN ou código de barras + + + + + + + + + + + Descrição do produto ou serviço + + + + + + + + + + + Código NCM (8 posições), será permitida a informação do gênero (posição do capítulo do NCM) quando a operação não for de comércio exterior (importação/exportação) ou o produto não seja tributado pelo IPI. Em caso de item de serviço ou item que não tenham produto (Ex. transferência de crédito, crédito do ativo imobilizado, etc.), informar o código 00 (zeros) (v2.0) + + + + + + + + + + + Nomenclatura de Valor aduaneio e Estatístico + + + + + + + + + + + + Codigo especificador da Substuicao Tributaria - CEST, que identifica a mercadoria sujeita aos regimes de substituicao tributária e de antecipação do recolhimento do imposto + + + + + + + + + + + + + + + + + + + CNPJ do Fabricante da Mercadoria, obrigatório para produto em escala NÃO relevante. + + + + + + + + + + + + + Código EX TIPI (3 posições) + + + + + + + + + + + Cfop + + + + + + + + + + + Unidade comercial + + + + + + + + + + + Quantidade Comercial do produto, alterado para aceitar de 0 a 4 casas decimais e 11 inteiros. + + + + + Valor unitário de comercialização - alterado para aceitar 0 a 10 casas decimais e 11 inteiros + + + + + Valor bruto do produto ou serviço. + + + + + GTIN (Global Trade Item Number) da unidade tributável, antigo código EAN ou código de barras + + + + + + + + + + + Unidade Tributável + + + + + + + + + + + Quantidade Tributável - alterado para aceitar de 0 a 4 casas decimais e 11 inteiros + + + + + Valor unitário de tributação - - alterado para aceitar 0 a 10 casas decimais e 11 inteiros + + + + + Valor Total do Frete + + + + + Valor Total do Seguro + + + + + Valor do Desconto + + + + + Outras despesas acessórias + + + + + Este campo deverá ser preenchido com: + 0 – o valor do item (vProd) não compõe o valor total da NF-e (vProd) + 1 – o valor do item (vProd) compõe o valor total da NF-e (vProd) + + + + + + + + + + + + Delcaração de Importação +(NT 2011/004) + + + + + + Numero do Documento de Importação DI/DSI/DA/DRI-E (DI/DSI/DA/DRI-E) (NT2011/004) + + + + + + + + + + + Data de registro da DI/DSI/DA (AAAA-MM-DD) + + + + + Local do desembaraço aduaneiro + + + + + + + + + + + UF onde ocorreu o desembaraço aduaneiro + + + + + Data do desembaraço aduaneiro (AAAA-MM-DD) + + + + + Via de transporte internacional informada na DI + 1-Maritima;2-Fluvial;3-Lacustre;4-Aerea;5-Postal;6-Ferroviaria;7-Rodoviaria;8-Conduto;9-Meios Proprios;10-Entrada/Saida Ficta. + + + + + + + + + + + + + + + + + + + + + + Valor Adicional ao frete para renovação de marinha mercante + + + + + Forma de Importação quanto a intermediação + 1-por conta propria;2-por conta e ordem;3-encomenda + + + + + + + + + + + + + CNPJ do adquirente ou do encomendante + + + + + Sigla da UF do adquirente ou do encomendante + + + + + Código do exportador (usado nos sistemas internos de informação do emitente da NF-e) + + + + + + + + + + + Adições (NT 2011/004) + + + + + + Número da Adição + + + + + + + + + + + Número seqüencial do item dentro da Adição + + + + + + + + + + + Código do fabricante estrangeiro (usado nos sistemas internos de informação do emitente da NF-e) + + + + + + + + + + + Valor do desconto do item da DI – adição + + + + + Número do ato concessório de Drawback + + + + + + + + + + + + + + + + + Detalhe da exportação + + + + + + Número do ato concessório de Drawback + + + + + + + + + + + Exportação indireta + + + + + + Registro de exportação + + + + + + + + + + + Chave de acesso da NF-e recebida para exportação + + + + + Quantidade do item efetivamente exportado + + + + + + + + + + + pedido de compra - Informação de interesse do emissor para controle do B2B. + + + + + + + + + + + Número do Item do Pedido de Compra - Identificação do número do item do pedido de Compra + + + + + + + + + + + Número de controle da FCI - Ficha de Conteúdo de Importação. + + + + + + + + Número do lote do produto. + + + + + + + + + + + Quantidade de produto no lote. + + + + + Data de fabricação/produção. Formato "AAAA-MM-DD". + + + + + Data de validade. Informar o último dia do mês caso a validade não especifique o dia. Formato "AAAA-MM-DD". + + + + + + + + + + + + + + + + Informações específicas de produtos e serviços + + + + Veículos novos + + + + + + Tipo da Operação (1 - Venda concessionária; 2 - Faturamento direto; 3 - Venda direta; 0 - Outros) + + + + + + + + + + + + + + Chassi do veículo - VIN (código-identificação-veículo) + + + + + + + + + + + + Cor do veículo (código de cada montadora) + + + + + + + + + + + Descrição da cor + + + + + + + + + + + Potência máxima do motor do veículo em cavalo vapor (CV). (potência-veículo) + + + + + + + + + + + Capacidade voluntária do motor expressa em centímetros cúbicos (CC). (cilindradas) + + + + + + + + + + + Peso líquido + + + + + + + + + + + Peso bruto + + + + + + + + + + + Serial (série) + + + + + + + + + + + Tipo de combustível-Tabela RENAVAM: 01-Álcool; 02-Gasolina; 03-Diesel; 16-Álcool/Gas.; 17-Gas./Álcool/GNV; 18-Gasolina/Elétrico + + + + + + + + + + + Número do motor + + + + + + + + + + + CMT-Capacidade Máxima de Tração - em Toneladas 4 casas decimais + + + + + + + + + + + Distância entre eixos + + + + + + + + + + + Ano Modelo de Fabricação + + + + + + + + + + + Ano de Fabricação + + + + + + + + + + + Tipo de pintura + + + + + + + + + + Tipo de veículo (utilizar tabela RENAVAM) + + + + + + + + + + + Espécie de veículo (utilizar tabela RENAVAM) + + + + + + + + + + + Informa-se o veículo tem VIN (chassi) remarcado. +R-Remarcado +N-NormalVIN + + + + + + + + + + + + Condição do veículo (1 - acabado; 2 - inacabado; 3 - semi-acabado) + + + + + + + + + + + + + Código Marca Modelo (utilizar tabela RENAVAM) + + + + + + + + + + + Código da Cor Segundo as regras de pré-cadastro do DENATRAN: 01-AMARELO;02-AZUL;03-BEGE;04-BRANCA;05-CINZA;06-DOURADA;07-GRENA +08-LARANJA;09-MARROM;10-PRATA;11-PRETA;12-ROSA;13-ROXA;14-VERDE;15-VERMELHA;16-FANTASIA + + + + + + + + + + + + + Quantidade máxima de permitida de passageiros sentados, inclusive motorista. + + + + + + + + + + + + + Restrição +0 - Não há; +1 - Alienação Fiduciária; +2 - Arrendamento Mercantil; +3 - Reserva de Domínio; +4 - Penhor de Veículos; +9 - outras. + + + + + + + + + + + + + + + + + + + grupo do detalhamento de Medicamentos e de matérias-primas farmacêuticas + + + + + + Código de Produto da ANVISA. Utilizar o número do registro do produto da Câmara de Regulação do Mercado de Medicamento – CMED. + + + + + + + + + + Preço Máximo ao Consumidor. + + + + + + + + Armamentos + + + + + + Indicador do tipo de arma de fogo (0 - Uso permitido; 1 - Uso restrito) + + + + + + + + + + + + Número de série da arma + + + + + + + + + + + Número de série do cano + + + + + + + + + + + Descrição completa da arma, compreendendo: calibre, marca, capacidade, tipo de funcionamento, comprimento e demais elementos que permitam a sua perfeita identificação. + + + + + + + + + + + + + + Informar apenas para operações com combustíveis líquidos + + + + + + Código de produto da ANP. codificação de produtos do SIMP (http://www.anp.gov.br) + + + + + + + + + + + Descrição do Produto conforme ANP. Utilizar a descrição de produtos do Sistema de Informações de Movimentação de Produtos - SIMP (http://www.anp.gov.br/simp/). + + + + + + + + + + + Percentual do GLP derivado do petróleo no produto GLP (cProdANP=210203001). Informar em número decimal o percentual do GLP derivado de petróleo no produto GLP. Valores 0 a 100. + + + + + Percentual de gás natural nacional - GLGNn para o produto GLP (cProdANP=210203001). Informar em número decimal o percentual do Gás Natural Nacional - GLGNn para o produto GLP. Valores de 0 a 100. + + + + + Percentual de gás natural importado GLGNi para o produto GLP (cProdANP=210203001). Informar em número deciaml o percentual do Gás Natural Importado - GLGNi para o produto GLP. Valores de 0 a 100. + + + + + Valor de partida (cProdANP=210203001). Deve ser informado neste campo o valor por quilograma sem ICMS. + + + + + Código de autorização / registro do CODIF. Informar apenas quando a UF utilizar o CODIF (Sistema de Controle do Diferimento do Imposto nas Operações com AEAC - Álcool Etílico Anidro Combustível). + + + + + + + + + + + Quantidade de combustível +faturada à temperatura ambiente. +Informar quando a quantidade +faturada informada no campo +qCom (I10) tiver sido ajustada para +uma temperatura diferente da +ambiente. + + + + + Sigla da UF de Consumo + + + + + CIDE Combustíveis + + + + + + BC do CIDE ( Quantidade comercializada) + + + + + Alíquota do CIDE (em reais) + + + + + Valor do CIDE + + + + + + + + Informações do grupo de "encerrante" + + + + + + Numero de identificação do Bico utilizado no abastecimento + + + + + + + + + + + Numero de identificação da bomba ao qual o bico está interligado + + + + + + + + + + + Numero de identificação do tanque ao qual o bico está interligado + + + + + + + + + + + Valor do Encerrante no ínicio do abastecimento + + + + + Valor do Encerrante no final do abastecimento + + + + + + + + + + + Número do RECOPI + + + + + + + + + + + + + + + + Tributos incidentes nos produtos ou serviços da NF-e + + + + + + Valor estimado total de impostos federais, estaduais e municipais + + + + + + + Dados do ICMS Normal e ST + + + + + + Tributação pelo ICMS +00 - Tributada integralmente + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno + + + + + Tributção pelo ICMS +00 - Tributada integralmente + + + + + + + + + + + Modalidade de determinação da BC do ICMS: +0 - Margem Valor Agregado (%); +1 - Pauta (valor); +2 - Preço Tabelado Máximo (valor); +3 - Valor da Operação. + + + + + + + + + + + + + + Valor da BC do ICMS + + + + + Alíquota do ICMS + + + + + Valor do ICMS + + + + + + Percentual de ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + Valor do ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + + + + + Tributação pelo ICMS +10 - Tributada e com cobrança do ICMS por substituição tributária + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno + + + + + 10 - Tributada e com cobrança do ICMS por substituição tributária + + + + + + + + + + + Modalidade de determinação da BC do ICMS: +0 - Margem Valor Agregado (%); +1 - Pauta (valor); +2 - Preço Tabelado Máximo (valor); +3 - Valor da Operação. + + + + + + + + + + + + + + Valor da BC do ICMS + + + + + Alíquota do ICMS + + + + + Valor do ICMS + + + + + + Valor da Base de cálculo do FCP. + + + + + Percentual de ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + Valor do ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + + Modalidade de determinação da BC do ICMS ST: +0 – Preço tabelado ou máximo sugerido; +1 - Lista Negativa (valor); +2 - Lista Positiva (valor); +3 - Lista Neutra (valor); +4 - Margem Valor Agregado (%); +5 - Pauta (valor); + + + + + + + + + + + + + + + + Percentual da Margem de Valor Adicionado ICMS ST + + + + + Percentual de redução da BC ICMS ST + + + + + Valor da BC do ICMS ST + + + + + Alíquota do ICMS ST + + + + + Valor do ICMS ST + + + + + + Valor da Base de cálculo do FCP retido por substituicao tributaria. + + + + + Percentual de FCP retido por substituição tributária. + + + + + Valor do FCP retido por substituição tributária. + + + + + + + + + Tributção pelo ICMS +20 - Com redução de base de cálculo + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno + + + + + Tributção pelo ICMS +20 - Com redução de base de cálculo + + + + + + + + + + + Modalidade de determinação da BC do ICMS: +0 - Margem Valor Agregado (%); +1 - Pauta (valor); +2 - Preço Tabelado Máximo (valor); +3 - Valor da Operação. + + + + + + + + + + + + + + Percentual de redução da BC + + + + + Valor da BC do ICMS + + + + + Alíquota do ICMS + + + + + Valor do ICMS + + + + + + Valor da Base de cálculo do FCP. + + + + + Percentual de ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + Valor do ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + + Grupo desoneração + + + + Valor do ICMS de desoneração + + + + + Motivo da desoneração do ICMS:3-Uso na agropecuária;9-Outros;12-Fomento agropecuário + + + + + + + + + + + + + + + + + Tributação pelo ICMS +30 - Isenta ou não tributada e com cobrança do ICMS por substituição tributária + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno + + + + + Tributção pelo ICMS +30 - Isenta ou não tributada e com cobrança do ICMS por substituição tributária + + + + + + + + + + + Modalidade de determinação da BC do ICMS ST: +0 – Preço tabelado ou máximo sugerido; +1 - Lista Negativa (valor); +2 - Lista Positiva (valor); +3 - Lista Neutra (valor); +4 - Margem Valor Agregado (%); +5 - Pauta (valor). + + + + + + + + + + + + + + + + Percentual da Margem de Valor Adicionado ICMS ST + + + + + Percentual de redução da BC ICMS ST + + + + + Valor da BC do ICMS ST + + + + + Alíquota do ICMS ST + + + + + Valor do ICMS ST + + + + + + Valor da Base de cálculo do FCP. + + + + + Percentual de FCP retido por substituição tributária. + + + + + Valor do FCP retido por substituição tributária. + + + + + + Grupo desoneração + + + + Valor do ICMS de desoneração + + + + + Motivo da desoneração do ICMS:6-Utilitários Motocicleta AÁrea Livre;7-SUFRAMA;9-Outros + + + + + + + + + + + + + + + + + Tributação pelo ICMS +40 - Isenta +41 - Não tributada +50 - Suspensão + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno + + + + + Tributação pelo ICMS +40 - Isenta +41 - Não tributada +50 - Suspensão +51 - Diferimento + + + + + + + + + + + + + + O valor do ICMS será informado apenas nas operações com veículos beneficiados com a desoneração condicional do ICMS. + + + + + Este campo será preenchido quando o campo anterior estiver preenchido. +Informar o motivo da desoneração: +1 – Táxi; +3 – Produtor Agropecuário; +4 – Frotista/Locadora; +5 – Diplomático/Consular; +6 – Utilitários e Motocicletas da Amazônia Ocidental e Áreas de Livre Comércio (Resolução 714/88 e 790/94 – CONTRAN e suas alterações); +7 – SUFRAMA; +8 - Venda a órgão Público; +9 – Outros +10- Deficiente Condutor +11- Deficiente não condutor +16 - Olimpíadas Rio 2016 +90 - Solicitado pelo Fisco + + + + + + + + + + + + + + + + + + + + + + + + + + + Tributção pelo ICMS +51 - Diferimento +A exigência do preenchimento das informações do ICMS diferido fica à critério de cada UF. + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno + + + + + Tributção pelo ICMS +20 - Com redução de base de cálculo + + + + + + + + + + + Modalidade de determinação da BC do ICMS: +0 - Margem Valor Agregado (%); +1 - Pauta (valor); +2 - Preço Tabelado Máximo (valor); +3 - Valor da Operação. + + + + + + + + + + + + + + Percentual de redução da BC + + + + + Valor da BC do ICMS + + + + + Alíquota do imposto + + + + + Valor do ICMS da Operação + + + + + Percentual do diferemento + + + + + Valor do ICMS da diferido + + + + + Valor do ICMS + + + + + + Valor da Base de cálculo do FCP. + + + + + Percentual de ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + Valor do ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + + + + + Tributação pelo ICMS +60 - ICMS cobrado anteriormente por substituição tributária + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno + + + + + Tributação pelo ICMS +60 - ICMS cobrado anteriormente por substituição tributária + + + + + + + + + + + NT2010/004 + + + + Valor da BC do ICMS ST retido anteriormente + + + + + Aliquota suportada pelo consumidor final. + + + + + Valor do ICMS ST retido anteriormente + + + + + + + Valor da Base de cálculo do FCP retido anteriormente por ST. + + + + + Percentual de FCP retido anteriormente por substituição tributária. + + + + + Valor do FCP retido por substituição tributária. + + + + + + + + + Tributação pelo ICMS +70 - Com redução de base de cálculo e cobrança do ICMS por substituição tributária + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno + + + + + Tributção pelo ICMS +70 - Com redução de base de cálculo e cobrança do ICMS por substituição tributária + + + + + + + + + + + Modalidade de determinação da BC do ICMS: +0 - Margem Valor Agregado (%); +1 - Pauta (valor); +2 - Preço Tabelado Máximo (valor); +3 - Valor da Operação. + + + + + + + + + + + + + + Percentual de redução da BC + + + + + Valor da BC do ICMS + + + + + Alíquota do ICMS + + + + + Valor do ICMS + + + + + + Valor da Base de cálculo do FCP. + + + + + Percentual de ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + Valor do ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + + Modalidade de determinação da BC do ICMS ST: +0 – Preço tabelado ou máximo sugerido; +1 - Lista Negativa (valor); +2 - Lista Positiva (valor); +3 - Lista Neutra (valor); +4 - Margem Valor Agregado (%); +5 - Pauta (valor). + + + + + + + + + + + + + + + + Percentual da Margem de Valor Adicionado ICMS ST + + + + + Percentual de redução da BC ICMS ST + + + + + Valor da BC do ICMS ST + + + + + Alíquota do ICMS ST + + + + + Valor do ICMS ST + + + + + + Valor da Base de cálculo do FCP retido por substituição tributária. + + + + + Percentual de FCP retido por substituição tributária. + + + + + Valor do FCP retido por substituição tributária. + + + + + + Grupo desoneração + + + + Valor do ICMS de desoneração + + + + + Motivo da desoneração do ICMS:3-Uso na agropecuária;9-Outros;12-Fomento agropecuário + + + + + + + + + + + + + + + + + Tributação pelo ICMS +90 - Outras + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno + + + + + Tributção pelo ICMS +90 - Outras + + + + + + + + + + + + Modalidade de determinação da BC do ICMS: +0 - Margem Valor Agregado (%); +1 - Pauta (valor); +2 - Preço Tabelado Máximo (valor); +3 - Valor da Operação. + + + + + + + + + + + + + + Valor da BC do ICMS + + + + + Percentual de redução da BC + + + + + Alíquota do ICMS + + + + + Valor do ICMS + + + + + + Valor da Base de cálculo do FCP. + + + + + Percentual de ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + Valor do ICMS relativo ao Fundo de Combate à Pobreza (FCP). + + + + + + + + Modalidade de determinação da BC do ICMS ST: +0 – Preço tabelado ou máximo sugerido; +1 - Lista Negativa (valor); +2 - Lista Positiva (valor); +3 - Lista Neutra (valor); +4 - Margem Valor Agregado (%); +5 - Pauta (valor). + + + + + + + + + + + + + + + + Percentual da Margem de Valor Adicionado ICMS ST + + + + + Percentual de redução da BC ICMS ST + + + + + Valor da BC do ICMS ST + + + + + Alíquota do ICMS ST + + + + + Valor do ICMS ST + + + + + + Valor da Base de cálculo do FCP. + + + + + Percentual de FCP retido por substituição tributária. + + + + + Valor do FCP retido por substituição tributária. + + + + + + + Grupo desoneração + + + + Valor do ICMS de desoneração + + + + + Motivo da desoneração do ICMS:3-Uso na agropecuária;9-Outros;12-Fomento agropecuário + + + + + + + + + + + + + + + + + Partilha do ICMS entre a UF de origem e UF de destino ou a UF definida na legislação +Operação interestadual para consumidor final com partilha do ICMS devido na operação entre a UF de origem e a UF do destinatário ou ou a UF definida na legislação. (Ex. UF da concessionária de entrega do veículos) + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno + + + + + Tributação pelo ICMS +10 - Tributada e com cobrança do ICMS por substituição tributária; +90 – Outros. + + + + + + + + + + + + Modalidade de determinação da BC do ICMS: +0 - Margem Valor Agregado (%); +1 - Pauta (valor); +2 - Preço Tabelado Máximo (valor); +3 - Valor da Operação. + + + + + + + + + + + + + + Valor da BC do ICMS + + + + + Percentual de redução da BC + + + + + Alíquota do ICMS + + + + + Valor do ICMS + + + + + Modalidade de determinação da BC do ICMS ST: +0 – Preço tabelado ou máximo sugerido; +1 - Lista Negativa (valor); +2 - Lista Positiva (valor); +3 - Lista Neutra (valor); +4 - Margem Valor Agregado (%); +5 - Pauta (valor). + + + + + + + + + + + + + + + + Percentual da Margem de Valor Adicionado ICMS ST + + + + + Percentual de redução da BC ICMS ST + + + + + Valor da BC do ICMS ST + + + + + Alíquota do ICMS ST + + + + + Valor do ICMS ST + + + + + Percentual para determinação do valor da Base de Cálculo da operação própria. + + + + + Sigla da UF para qual é devido o ICMS ST da operação. + + + + + + + + Grupo de informação do ICMSST devido para a UF de destino, nas operações interestaduais de produtos que tiveram retenção antecipada de ICMS por ST na UF do remetente. Repasse via Substituto Tributário. + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno + + + + + Tributção pelo ICMS +41-Não Tributado. +60-Cobrado anteriormente por substituição tributária. + + + + + + + + + + + + Informar o valor da BC do ICMS ST retido na UF remetente + + + + + Informar o valor do ICMS ST retido na UF remetente (iv2.0)) + + + + + Informar o valor da BC do ICMS ST da UF destino + + + + + Informar o valor da BC do ICMS ST da UF destino (v2.0) + + + + + + + + Tributação do ICMS pelo SIMPLES NACIONAL e CSOSN=101 (v.2.0) + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno +(v2.0) + + + + + 101- Tributada pelo Simples Nacional com permissão de crédito. (v.2.0) + + + + + + + + + + + Alíquota aplicável de cálculo do crédito (Simples Nacional). (v2.0) + + + + + Valor crédito do ICMS que pode ser aproveitado nos termos do art. 23 da LC 123 (Simples Nacional) (v2.0) + + + + + + + + Tributação do ICMS pelo SIMPLES NACIONAL e CSOSN=102, 103, 300 ou 400 (v.2.0)) + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno +(v2.0) + + + + + 102- Tributada pelo Simples Nacional sem permissão de crédito. +103 – Isenção do ICMS no Simples Nacional para faixa de receita bruta. +300 – Imune. +400 – Não tributda pelo Simples Nacional (v.2.0) (v.2.0) + + + + + + + + + + + + + + + + + Tributação do ICMS pelo SIMPLES NACIONAL e CSOSN=201 (v.2.0) + + + + + + Origem da mercadoria: +0 – Nacional; +1 – Estrangeira – Importação direta; +2 – Estrangeira – Adquirida no mercado interno. (v2.0) + + + + + 201- Tributada pelo Simples Nacional com permissão de crédito e com cobrança do ICMS por Substituição Tributária (v.2.0) + + + + + + + + + + + Modalidade de determinação da BC do ICMS ST: +0 – Preço tabelado ou máximo sugerido; +1 - Lista Negativa (valor); +2 - Lista Positiva (valor); +3 - Lista Neutra (valor); +4 - Margem Valor Agregado (%); +5 - Pauta (valor). (v2.0) + + + + + + + + + + + + + + + + Percentual da Margem de Valor Adicionado ICMS ST (v2.0) + + + + + Percentual de redução da BC ICMS ST (v2.0) + + + + + Valor da BC do ICMS ST (v2.0) + + + + + Alíquota do ICMS ST (v2.0) + + + + + Valor do ICMS ST (v2.0) + + + + + + Valor da Base de cálculo do FCP. + + + + + Percentual de FCP retido por substituição tributária. + + + + + Valor do FCP retido por substituição tributária. + + + + + + Alíquota aplicável de cálculo do crédito (Simples Nacional). (v2.0) + + + + + Valor crédito do ICMS que pode ser aproveitado nos termos do art. 23 da LC 123 (Simples Nacional) (v2.0) + + + + + + + + Tributação do ICMS pelo SIMPLES NACIONAL e CSOSN=202 ou 203 (v.2.0) + + + + + + Origem da mercadoria: +0 – Nacional; +1 – Estrangeira – Importação direta; +2 – Estrangeira – Adquirida no mercado interno. (v2.0) + + + + + 202- Tributada pelo Simples Nacional sem permissão de crédito e com cobrança do ICMS por Substituição Tributária; +203- Isenção do ICMS nos Simples Nacional para faixa de receita bruta e com cobrança do ICMS por Substituição Tributária (v.2.0) + + + + + + + + + + + + Modalidade de determinação da BC do ICMS ST: +0 – Preço tabelado ou máximo sugerido; +1 - Lista Negativa (valor); +2 - Lista Positiva (valor); +3 - Lista Neutra (valor); +4 - Margem Valor Agregado (%); +5 - Pauta (valor). (v2.0) + + + + + + + + + + + + + + + + Percentual da Margem de Valor Adicionado ICMS ST (v2.0) + + + + + Percentual de redução da BC ICMS ST (v2.0) + + + + + Valor da BC do ICMS ST (v2.0) + + + + + Alíquota do ICMS ST (v2.0) + + + + + Valor do ICMS ST (v2.0) + + + + + + Valor da Base de cálculo do FCP. + + + + + Percentual de FCP retido por substituição tributária. + + + + + Valor do FCP retido por substituição tributária. + + + + + + + + + Tributação do ICMS pelo SIMPLES NACIONAL,CRT=1 – Simples Nacional e CSOSN=500 (v.2.0) + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno + + + + + 500 – ICMS cobrado anterirmente por substituição tributária (substituído) ou por antecipação +(v.2.0) + + + + + + + + + + + + Valor da BC do ICMS ST retido anteriormente (v2.0) + + + + + Aliquota suportada pelo consumidor final. + + + + + Valor do ICMS ST retido anteriormente (v2.0) + + + + + + + Valor da Base de cálculo do FCP retido anteriormente. + + + + + Percentual de FCP retido anteriormente por substituição tributária. + + + + + Valor do FCP retido por substituição tributária. + + + + + + + + + Tributação do ICMS pelo SIMPLES NACIONAL, CRT=1 – Simples Nacional e CSOSN=900 (v2.0) + + + + + + origem da mercadoria: 0 - Nacional +1 - Estrangeira - Importação direta +2 - Estrangeira - Adquirida no mercado interno + + + + + Tributação pelo ICMS 900 - Outros(v2.0) + + + + + + + + + + + + Modalidade de determinação da BC do ICMS: +0 - Margem Valor Agregado (%); +1 - Pauta (valor); +2 - Preço Tabelado Máximo (valor); +3 - Valor da Operação. + + + + + + + + + + + + + + Valor da BC do ICMS + + + + + Percentual de redução da BC + + + + + Alíquota do ICMS + + + + + Valor do ICMS + + + + + + + Modalidade de determinação da BC do ICMS ST: +0 – Preço tabelado ou máximo sugerido; +1 - Lista Negativa (valor); +2 - Lista Positiva (valor); +3 - Lista Neutra (valor); +4 - Margem Valor Agregado (%); +5 - Pauta (valor). + + + + + + + + + + + + + + + + Percentual da Margem de Valor Adicionado ICMS ST + + + + + Percentual de redução da BC ICMS ST + + + + + Valor da BC do ICMS ST + + + + + Alíquota do ICMS ST + + + + + Valor do ICMS ST + + + + + + Valor da Base de cálculo do FCP. + + + + + Percentual de FCP retido por substituição tributária. + + + + + Valor do FCP retido por substituição tributária. + + + + + + + + Alíquota aplicável de cálculo do crédito (Simples Nacional). (v2.0) + + + + + Valor crédito do ICMS que pode ser aproveitado nos termos do art. 23 da LC 123 (Simples Nacional) (v2.0) + + + + + + + + + + + + + Dados do Imposto de Importação + + + + + + Base da BC do Imposto de Importação + + + + + Valor das despesas aduaneiras + + + + + Valor do Imposto de Importação + + + + + Valor do Imposto sobre Operações Financeiras + + + + + + + + + + + ISSQN + + + + + + Valor da BC do ISSQN + + + + + Alíquota do ISSQN + + + + + Valor da do ISSQN + + + + + Informar o município de ocorrência do fato gerador do ISSQN. Utilizar a Tabela do IBGE (Anexo VII - Tabela de UF, Município e País). “Atenção, não vincular com os campos B12, C10 ou E10” v2.0 + + + + + Informar o Item da lista de serviços da LC 116/03 em que se classifica o serviço. + + + + + Valor dedução para redução da base de cálculo + + + + + Valor outras retenções + + + + + Valor desconto incondicionado + + + + + Valor desconto condicionado + + + + + Valor Retenção ISS + + + + + Exibilidade do ISS:1-Exigível;2-Não incidente;3-Isenção;4-Exportação;5-Imunidade;6-Exig.Susp. Judicial;7-Exig.Susp. ADM + + + + + + + + + + + + + + + + + Código do serviço prestado dentro do município + + + + + + + + + + + + Código do Município de Incidência do Imposto + + + + + Código de Pais + + + + + + + + + + + Número do Processo administrativo ou judicial de suspenção do processo + + + + + + + + + + + + Indicador de Incentivo Fiscal. 1=Sim; 2=Não + + + + + + + + + + + + + + + + + Dados do PIS + + + + + + Código de Situação Tributária do PIS. + 01 – Operação Tributável - Base de Cálculo = Valor da Operação Alíquota Normal (Cumulativo/Não Cumulativo); +02 - Operação Tributável - Base de Calculo = Valor da Operação (Alíquota Diferenciada); + + + + + + Código de Situação Tributária do PIS. + 01 – Operação Tributável - Base de Cálculo = Valor da Operação Alíquota Normal (Cumulativo/Não Cumulativo); +02 - Operação Tributável - Base de Calculo = Valor da Operação (Alíquota Diferenciada); + + + + + + + + + + + + Valor da BC do PIS + + + + + Alíquota do PIS (em percentual) + + + + + Valor do PIS + + + + + + + + Código de Situação Tributária do PIS. +03 - Operação Tributável - Base de Calculo = Quantidade Vendida x Alíquota por Unidade de Produto; + + + + + + Código de Situação Tributária do PIS. +03 - Operação Tributável - Base de Calculo = Quantidade Vendida x Alíquota por Unidade de Produto; + + + + + + + + + + + Quantidade Vendida (NT2011/004) + + + + + Alíquota do PIS (em reais) (NT2011/004) + + + + + Valor do PIS + + + + + + + + Código de Situação Tributária do PIS. +04 - Operação Tributável - Tributação Monofásica - (Alíquota Zero); +06 - Operação Tributável - Alíquota Zero; +07 - Operação Isenta da contribuição; +08 - Operação Sem Incidência da contribuição; +09 - Operação com suspensão da contribuição; + + + + + + Código de Situação Tributária do PIS. +04 - Operação Tributável - Tributação Monofásica - (Alíquota Zero); +05 - Operação Tributável (ST); +06 - Operação Tributável - Alíquota Zero; +07 - Operação Isenta da contribuição; +08 - Operação Sem Incidência da contribuição; +09 - Operação com suspensão da contribuição; + + + + + + + + + + + + + + + + + + + Código de Situação Tributária do PIS. +99 - Outras Operações. + + + + + + Código de Situação Tributária do PIS. +99 - Outras Operações. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Valor da BC do PIS + + + + + Alíquota do PIS (em percentual) + + + + + + + Quantidade Vendida (NT2011/004) + + + + + Alíquota do PIS (em reais) (NT2011/004) + + + + + + + Valor do PIS + + + + + + + + + + + Dados do PIS Substituição Tributária + + + + + + + + Valor da BC do PIS ST + + + + + Alíquota do PIS ST (em percentual) + + + + + + + Quantidade Vendida + + + + + Alíquota do PIS ST (em reais) + + + + + + + Valor do PIS ST + + + + + + + + Dados do COFINS + + + + + + Código de Situação Tributária do COFINS. + 01 – Operação Tributável - Base de Cálculo = Valor da Operação Alíquota Normal (Cumulativo/Não Cumulativo); +02 - Operação Tributável - Base de Calculo = Valor da Operação (Alíquota Diferenciada); + + + + + + Código de Situação Tributária do COFINS. + 01 – Operação Tributável - Base de Cálculo = Valor da Operação Alíquota Normal (Cumulativo/Não Cumulativo); +02 - Operação Tributável - Base de Calculo = Valor da Operação (Alíquota Diferenciada); + + + + + + + + + + + + Valor da BC do COFINS + + + + + Alíquota do COFINS (em percentual) + + + + + Valor do COFINS + + + + + + + + Código de Situação Tributária do COFINS. +03 - Operação Tributável - Base de Calculo = Quantidade Vendida x Alíquota por Unidade de Produto; + + + + + + Código de Situação Tributária do COFINS. +03 - Operação Tributável - Base de Calculo = Quantidade Vendida x Alíquota por Unidade de Produto; + + + + + + + + + + Quantidade Vendida (NT2011/004) + + + + + Alíquota do COFINS (em reais) (NT2011/004) + + + + + Valor do COFINS + + + + + + + + Código de Situação Tributária do COFINS: +04 - Operação Tributável - Tributação Monofásica - (Alíquota Zero); +06 - Operação Tributável - Alíquota Zero; +07 - Operação Isenta da contribuição; +08 - Operação Sem Incidência da contribuição; +09 - Operação com suspensão da contribuição; + + + + + + Código de Situação Tributária do COFINS: +04 - Operação Tributável - Tributação Monofásica - (Alíquota Zero); +05 - Operação Tributável (ST); +06 - Operação Tributável - Alíquota Zero; +07 - Operação Isenta da contribuição; +08 - Operação Sem Incidência da contribuição; +09 - Operação com suspensão da contribuição; + + + + + + + + + + + + + + + + + + + Código de Situação Tributária do COFINS: +49 - Outras Operações de Saída +50 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Tributada no Mercado Interno +51 - Operação com Direito a Crédito – Vinculada Exclusivamente a Receita Não Tributada no Mercado Interno +52 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita de Exportação +53 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno +54 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas no Mercado Interno e de Exportação +55 - Operação com Direito a Crédito - Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação +56 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação +60 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Tributada no Mercado Interno +61 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Não-Tributada no Mercado Interno +62 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita de Exportação +63 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno +64 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas no Mercado Interno e de Exportação +65 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação +66 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação +67 - Crédito Presumido - Outras Operações +70 - Operação de Aquisição sem Direito a Crédito +71 - Operação de Aquisição com Isenção +72 - Operação de Aquisição com Suspensão +73 - Operação de Aquisição a Alíquota Zero +74 - Operação de Aquisição sem Incidência da Contribuição +75 - Operação de Aquisição por Substituição Tributária +98 - Outras Operações de Entrada +99 - Outras Operações. + + + + + + Código de Situação Tributária do COFINS: +49 - Outras Operações de Saída +50 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Tributada no Mercado Interno +51 - Operação com Direito a Crédito – Vinculada Exclusivamente a Receita Não Tributada no Mercado Interno +52 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita de Exportação +53 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno +54 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas no Mercado Interno e de Exportação +55 - Operação com Direito a Crédito - Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação +56 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação +60 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Tributada no Mercado Interno +61 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Não-Tributada no Mercado Interno +62 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita de Exportação +63 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno +64 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas no Mercado Interno e de Exportação +65 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação +66 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação +67 - Crédito Presumido - Outras Operações +70 - Operação de Aquisição sem Direito a Crédito +71 - Operação de Aquisição com Isenção +72 - Operação de Aquisição com Suspensão +73 - Operação de Aquisição a Alíquota Zero +74 - Operação de Aquisição sem Incidência da Contribuição +75 - Operação de Aquisição por Substituição Tributária +98 - Outras Operações de Entrada +99 - Outras Operações. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Valor da BC do COFINS + + + + + Alíquota do COFINS (em percentual) + + + + + + + Quantidade Vendida (NT2011/004) + + + + + Alíquota do COFINS (em reais) (NT2011/004) + + + + + + + Valor do COFINS + + + + + + + + + + + Dados do COFINS da +Substituição Tributaria; + + + + + + + + Valor da BC do COFINS ST + + + + + Alíquota do COFINS ST(em percentual) + + + + + + + Quantidade Vendida + + + + + Alíquota do COFINS ST(em reais) + + + + + + + Valor do COFINS ST + + + + + + + + Grupo a ser informado nas vendas interestarduais para consumidor final, não contribuinte de ICMS + + + + + + Valor da Base de Cálculo do ICMS na UF do destinatário. + + + + + Valor da Base de Cálculo do FCP na UF do destinatário. + + + + + Percentual adicional inserido na alíquota interna da UF de destino, relativo ao Fundo de Combate à Pobreza (FCP) naquela UF. + + + + + Alíquota adotada nas operações internas na UF do destinatário para o produto / mercadoria. + + + + + Alíquota interestadual das UF envolvidas: - 4% alíquota interestadual para produtos importados; - 7% para os Estados de origem do Sul e Sudeste (exceto ES), destinado para os Estados do Norte e Nordeste ou ES; - 12% para os demais casos. + + + + + + + + + + + + + Percentual de partilha para a UF do destinatário: - 40% em 2016; - 60% em 2017; - 80% em 2018; - 100% a partir de 2019. + + + + + Valor do ICMS relativo ao Fundo de Combate à Pobreza (FCP) da UF de destino. + + + + + Valor do ICMS de partilha para a UF do destinatário. + + + + + Valor do ICMS de partilha para a UF do remetente. Nota: A partir de 2019, este valor será zero. + + + + + + + + + + + + + + Percentual de mercadoria devolvida + + + + + Informação de IPI devolvido + + + + + + Valor do IPI devolvido + + + + + + + + + + + Informações adicionais do produto (norma referenciada, informações complementares, etc) + + + + + + + + + + + + Número do item do NF + + + + + + + + + + + + + Dados dos totais da NF-e + + + + + + Totais referentes ao ICMS + + + + + + BC do ICMS + + + + + Valor Total do ICMS + + + + + Valor Total do ICMS desonerado + + + + + Valor total do ICMS relativo ao Fundo de Combate à Pobreza (FCP) para a UF de destino. + + + + + Valor total do ICMS de partilha para a UF do destinatário + + + + + Valor total do ICMS de partilha para a UF do remetente + + + + + Valor Total do FCP (Fundo de Combate à Pobreza). + + + + + BC do ICMS ST + + + + + Valor Total do ICMS ST + + + + + Valor Total do FCP (Fundo de Combate à Pobreza) retido por substituição tributária. + + + + + Valor Total do FCP (Fundo de Combate à Pobreza) retido anteriormente por substituição tributária. + + + + + Valor Total dos produtos e serviços + + + + + Valor Total do Frete + + + + + Valor Total do Seguro + + + + + Valor Total do Desconto + + + + + Valor Total do II + + + + + Valor Total do IPI + + + + + Valor Total do IPI devolvido. Deve ser informado quando preenchido o Grupo Tributos Devolvidos na emissão de nota finNFe=4 (devolução) nas operações com não contribuintes do IPI. Corresponde ao total da soma dos campos id: UA04. + + + + + Valor do PIS + + + + + Valor do COFINS + + + + + Outras Despesas acessórias + + + + + Valor Total da NF-e + + + + + Valor estimado total de impostos federais, estaduais e municipais + + + + + + + + Totais referentes ao ISSQN + + + + + + Valor Total dos Serviços sob não-incidência ou não tributados pelo ICMS + + + + + Base de Cálculo do ISS + + + + + Valor Total do ISS + + + + + Valor do PIS sobre serviços + + + + + Valor do COFINS sobre serviços + + + + + Data da prestação do serviço (AAAA-MM-DD) + + + + + Valor dedução para redução da base de cálculo + + + + + Valor outras retenções + + + + + Valor desconto incondicionado + + + + + Valor desconto condicionado + + + + + Valor Total Retenção ISS + + + + + Código do regime especial de tributação + + + + + + + + + + + + + + + + + + + Retenção de Tributos Federais + + + + + + Valor Retido de PIS + + + + + Valor Retido de COFINS + + + + + Valor Retido de CSLL + + + + + Base de Cálculo do IRRF + + + + + Valor Retido de IRRF + + + + + Base de Cálculo da Retenção da Previdêncica Social + + + + + Valor da Retenção da Previdêncica Social + + + + + + + + + + + Dados dos transportes da NF-e + + + + + + Modalidade do frete +0- Contratação do Frete por conta do Remetente (CIF); +1- Contratação do Frete por conta do destinatário/remetente (FOB); +2- Contratação do Frete por conta de terceiros; +3- Transporte próprio por conta do remetente; +4- Transporte próprio por conta do destinatário; +9- Sem Ocorrência de transporte. + + + + + + + + + + + + + + + + Dados do transportador + + + + + + + CNPJ do transportador + + + + + CPF do transportador + + + + + + Razão Social ou nome do transportador + + + + + + + + + + + Inscrição Estadual (v2.0) + + + + + Endereço completo + + + + + + + + + + + Nome do munícipio + + + + + + + + + + + Sigla da UF + + + + + + + + Dados da retenção ICMS do Transporte + + + + + + Valor do Serviço + + + + + BC da Retenção do ICMS + + + + + Alíquota da Retenção + + + + + Valor do ICMS Retido + + + + + Código Fiscal de Operações e Prestações + + + + + + + + + + + Código do Município de Ocorrência do Fato Gerador (utilizar a tabela do IBGE) + + + + + + + + + + Dados do veículo + + + + + Dados do reboque/Dolly (v2.0) + + + + + + Identificação do vagão (v2.0) + + + + + + + + + + + Identificação da balsa (v2.0) + + + + + + + + + + + + Dados dos volumes + + + + + + Quantidade de volumes transportados + + + + + + + + + + + Espécie dos volumes transportados + + + + + + + + + + + Marca dos volumes transportados + + + + + + + + + + + Numeração dos volumes transportados + + + + + + + + + + + Peso líquido (em kg) + + + + + Peso bruto (em kg) + + + + + + + + Número dos Lacres + + + + + + + + + + + + + + + + + + + + Dados da cobrança da NF-e + + + + + + Dados da fatura + + + + + + Número da fatura + + + + + + + + + + + Valor original da fatura + + + + + Valor do desconto da fatura + + + + + Valor líquido da fatura + + + + + + + + Dados das duplicatas NT 2011/004 + + + + + + Número da duplicata + + + + + + + + + + + Data de vencimento da duplicata (AAAA-MM-DD) + + + + + Valor da duplicata + + + + + + + + + + + Dados de Pagamento. Obrigatório apenas para (NFC-e) NT 2012/004 + + + + + + Grupo de detalhamento da forma de pagamento. + + + + + + Indicador da Forma de Pagamento:0-Pagamento à Vista;1-Pagamento à Prazo; + + + + + + + + + + + + Forma de Pagamento:01-Dinheiro;02-Cheque;03-Cartão de Crédito;04-Cartão de Débito;05-Crédito Loja;10-Vale Alimentação;11-Vale Refeição;12-Vale Presente;13-Vale Combustível;14 - Duplicata Mercantil;15 - Boleto Bancario;90 - Sem Pagamento;99 - Outros + + + + + + + + + + + + + + + + + + + + + + + Valor do Pagamento. Esta tag poderá ser omitida quando a tag tPag=90 (Sem Pagamento), caso contrário deverá ser preenchida. + + + + + Grupo de Cartões + + + + + + Tipo de Integração do processo de pagamento com o sistema de automação da empresa/ + 1=Pagamento integrado com o sistema de automação da empresa Ex. equipamento TEF , Comercio Eletronico + 2=Pagamento não integrado com o sistema de automação da empresa Ex: equipamento POS + + + + + + + + + + + + CNPJ da credenciadora de cartão de crédito/débito + + + + + Bandeira da operadora de cartão de crédito/débito:01–Visa; 02–Mastercard; 03–American Express; 04–Sorocred;05-Diners Club;06-Elo;07-Hipercard;08-Aura;09-Cabal;99–Outros + + + + + + + + + + + + + + + + + + + + Número de autorização da operação cartão de crédito/débito + + + + + + + + + + + + + + + + + Valor do Troco. + + + + + + + + Informações adicionais da NF-e + + + + + + Informações adicionais de interesse do Fisco (v2.0) + + + + + + + + + + + Informações complementares de interesse do Contribuinte + + + + + + + + + + + Campo de uso livre do contribuinte +informar o nome do campo no atributo xCampo +e o conteúdo do campo no xTexto + + + + + + + + + + + + + + + + + + + + + + + + + Campo de uso exclusivo do Fisco +informar o nome do campo no atributo xCampo +e o conteúdo do campo no xTexto + + + + + + + + + + + + + + + + + + + + + + + + + Grupo de informações do processo referenciado + + + + + + Indentificador do processo ou ato +concessório + + + + + + + + + + + Origem do processo, informar com: +0 - SEFAZ; +1 - Justiça Federal; +2 - Justiça Estadual; +3 - Secex/RFB; +9 - Outros + + + + + + + + + + + + + + + + + + + + + Informações de exportação + + + + + + Sigla da UF de Embarque ou de transposição de fronteira + + + + + Local de Embarque ou de transposição de fronteira + + + + + + + + + + + Descrição do local de despacho + + + + + + + + + + + + + + Informações de compras (Nota de Empenho, Pedido e Contrato) + + + + + + Informação da Nota de Empenho de compras públicas (NT2011/004) + + + + + + + + + + + Informação do pedido + + + + + + + + + + + Informação do contrato + + + + + + + + + + + + + + Informações de registro aquisições de cana + + + + + + Identificação da safra + + + + + + + + + + + Mês e Ano de Referência, formato: MM/AAAA + + + + + + + + + + + Fornecimentos diários + + + + + + Quantidade em quilogramas - peso líquido + + + + + + Número do dia + + + + + + + + + + + + + + + + + Total do mês + + + + + Total Anterior + + + + + Total Geral + + + + + Deduções - Taxas e Contribuições + + + + + + Descrição da Dedução + + + + + + + + + + + valor da dedução + + + + + + + + Valor dos fornecimentos + + + + + Valor Total das Deduções + + + + + Valor Líquido dos fornecimentos + + + + + + + + + Versão do leiaute (v4.00) + + + + + PL_005d - 11/08/09 - validação do Id + + + + + + + + + + + + + + + + Informações suplementares Nota Fiscal + + + + + + Texto com o QR-Code impresso no DANFE NFC-e + + + + + + + + + + + + + Informar a URL da "Consulta por chave de acesso da NFC-e". A mesma URL que deve estar informada no DANFE NFC-e para consulta por chave de acesso. + + + + + + + + + + + + + + + + + Tipo Protocolo de status resultado do processamento da NF-e + + + + + Dados do protocolo de status + + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que processou a NF-e + + + + + Chaves de acesso da NF-e, compostas por: UF do emitente, AAMM da emissão da NFe, CNPJ do emitente, modelo, série e número da NF-e e código numérico+DV. + + + + + Data e hora de processamento, no formato AAAA-MM-DDTHH:MM:SSTZD. Deve ser preenchida com data e hora da gravação no Banco em caso de Confirmação. Em caso de Rejeição, com data e hora do recebimento do Lote de NF-e enviado. + + + + + Número do Protocolo de Status da NF-e. 1 posição (1 – Secretaria de Fazenda Estadual 2 – Receita Federal); 2 - códiga da UF - 2 posições ano; 10 seqüencial no ano. + + + + + Digest Value da NF-e processada. Utilizado para conferir a integridade da NF-e original. + + + + + Código do status da mensagem enviada. + + + + + Descrição literal do status do serviço solicitado. + + + + + + + + + + + + + Tipo Pedido de Concessão de Autorização da Nota Fiscal Eletrônica + + + + + + Indicador de processamento síncrono. 0=NÃO; 1=SIM=Síncrono + + + + + + + + + + + + + + + + Tipo Retorno do Pedido de Autorização da Nota Fiscal Eletrônica + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que recebeu o Lote. + + + + + Código do status da mensagem enviada. + + + + + Descrição literal do status do serviço solicitado. + + + + + código da UF de atendimento + + + + + Data e hora do recebimento, no formato AAAA-MM-DDTHH:MM:SSTZD + + + + + + Dados do Recibo do Lote + + + + + + Número do Recibo + + + + + Tempo médio de resposta do serviço (em segundos) dos últimos 5 minutos + + + + + + + + Protocolo de status resultado do processamento sincrono da NFC-e + + + + + + + + + Tipo Pedido de Consulta do Recido do Lote de Notas Fiscais Eletrônicas + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Número do Recibo + + + + + + + + Tipo Retorno do Pedido de Consulta do Recido do Lote de Notas Fiscais Eletrônicas + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que processou a NF-e + + + + + Número do Recibo Consultado + + + + + Código do status da mensagem enviada. + + + + + Descrição literal do status do serviço solicitado. + + + + + código da UF de atendimento + + + + + Data e hora de processamento, no formato AAAA-MM-DDTHH:MM:SSTZD. Em caso de Rejeição, com data e hora do recebimento do Lote de NF-e enviado. + + + + + + Código da Mensagem (v2.0) +alterado para tamanho variavel 1-4. (NT2011/004) + + + + + + + + + + + Mensagem da SEFAZ para o emissor. (v2.0) + + + + + + + + + + + + Protocolo de status resultado do processamento da NF-e + + + + + + + + Tipo da NF-e processada + + + + + + + + + + Tipo Dados do Endereço // 24/10/08 - tamanho mínimo + + + + + Logradouro + + + + + + + + + + + Número + + + + + + + + + + + Complemento + + + + + + + + + + + Bairro + + + + + + + + + + + Código do município (utilizar a tabela do IBGE), informar 9999999 para operações com o exterior. + + + + + Nome do município, informar EXTERIOR para operações com o exterior. + + + + + + + + + + + Sigla da UF, informar EX para operações com o exterior. + + + + + CEP + + + + + + + + + + + Código de Pais + + + + + + + + + + + Nome do país + + + + + + + + + + + Telefone, preencher com Código DDD + número do telefone , nas operações com exterior é permtido informar o código do país + código da localidade + número do telefone + + + + + + + + + + + + + Tipo Dados do Endereço do Emitente // 24/10/08 - desmembrado / tamanho mínimo + + + + + Logradouro + + + + + + + + + + + Número + + + + + + + + + + + Complemento + + + + + + + + + + + Bairro + + + + + + + + + + + Código do município + + + + + Nome do município + + + + + + + + + + + Sigla da UF + + + + + CEP - NT 2011/004 + + + + + + + + + + + Código do país + + + + + + + + + + Nome do país + + + + + + + + + + + Preencher com Código DDD + número do telefone (v.2.0) + + + + + + + + + + + + + Tipo Dados do Local de Retirada ou Entrega // 24/10/08 - tamanho mínimo // v2.0 + + + + + + CNPJ + + + + + CPF (v2.0) + + + + + + Logradouro + + + + + + + + + + + Número + + + + + + + + + + + Complemento + + + + + + + + + + + Bairro + + + + + + + + + + + Código do município (utilizar a tabela do IBGE) + + + + + Nome do município + + + + + + + + + + + Sigla da UF + + + + + + + Tipo Dados do Veículo + + + + + Placa do veículo (NT2011/004) + + + + + + + + + + + Sigla da UF + + + + + Registro Nacional de Transportador de Carga (ANTT) + + + + + + + + + + + + + Tipo Origem da mercadoria CST ICMS origem da mercadoria: 0-Nacional exceto as indicadas nos códigos 3, 4, 5 e 8; +1-Estrangeira - Importação direta; 2-Estrangeira - Adquirida no mercado interno; 3-Nacional, conteudo superior 40% e inferior ou igual a 70%; 4-Nacional, processos produtivos básicos; 5-Nacional, conteudo inferior 40%; 6-Estrangeira - Importação direta, com similar nacional, lista CAMEX; 7-Estrangeira - mercado interno, sem simular,lista CAMEX;8-Nacional, Conteúdo de Importação superior a 70%. + + + + + + + + + + + + + + + + + Tipo Finalidade da NF-e (1=Normal; 2=Complementar; 3=Ajuste; 4=Devolução/Retorno) + + + + + + + + + + + + Tipo processo de emissão da NF-e + + + + + + + + + + + + Tipo Código da Lista de Serviços LC 116/2003 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo Identificação de Lote + + + + + + + + + Tipo Versão da NF-e - 4.00 + + + + + + + + + Identificador único (Globally Unique Identifier) + + + + + + + + + Tipo: Dados do IPI + + + + + CNPJ do produtor da mercadoria, quando diferente do emitente. Somente para os casos de exportação direta ou indireta. + + + + + Código do selo de controle do IPI + + + + + + + + + + + Quantidade de selo de controle do IPI + + + + + + + + + + + Código de Enquadramento Legal do IPI (tabela a ser criada pela RFB) + + + + + + + + + + + + + + + Código da Situação Tributária do IPI: +00-Entrada com recuperação de crédito +49 - Outras entradas +50-Saída tributada +99-Outras saídas + + + + + + + + + + + + + + + + Valor da BC do IPI + + + + + Alíquota do IPI + + + + + + + Quantidade total na unidade padrão para tributação + + + + + Valor por Unidade Tributável. Informar o valor do imposto Pauta por unidade de medida. + + + + + + + Valor do IPI + + + + + + + + + + + Código da Situação Tributária do IPI: +01-Entrada tributada com alíquota zero +02-Entrada isenta +03-Entrada não-tributada +04-Entrada imune +05-Entrada com suspensão +51-Saída tributada com alíquota zero +52-Saída isenta +53-Saída não-tributada +54-Saída imune +55-Saída com suspensão + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pytrustnfe/xml/schemas/nfe_v4.00.xsd b/pytrustnfe/xml/schemas/nfe_v4.00.xsd new file mode 100755 index 0000000..4fe917a --- /dev/null +++ b/pytrustnfe/xml/schemas/nfe_v4.00.xsd @@ -0,0 +1,9 @@ + + + + + + Nota Fiscal Eletrônica + + + diff --git a/pytrustnfe/xml/schemas/tiposBasico_v4.00.xsd b/pytrustnfe/xml/schemas/tiposBasico_v4.00.xsd new file mode 100755 index 0000000..dc7aaf5 --- /dev/null +++ b/pytrustnfe/xml/schemas/tiposBasico_v4.00.xsd @@ -0,0 +1,589 @@ + + + + + + Tipo Código da UF da tabela do IBGE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo Código do Município da tabela do IBGE + + + + + + + + + Tipo Chave da Nota Fiscal Eletrônica + + + + + + + + + + Tipo Número do Protocolo de Status + + + + + + + + + + Tipo Número do Recibo do envio de lote de NF-e + + + + + + + + + + Tipo Código da Mensagem enviada + + + + + + + + + + Tipo Número do CNPJ + + + + + + + + + + Tipo Número do CNPJ tmanho varíavel (3-14) + + + + + + + + + + Tipo Número do CNPJ Opcional + + + + + + + + + + Tipo Número do CPF + + + + + + + + + + Tipo Número do CPF de tamanho variável (3-11) + + + + + + + + + + Tipo Decimal com até 1 dígitos inteiros, podendo ter de 1 até 4 decimais + + + + + + + + + Tipo Decimal com até 2 dígitos inteiros, podendo ter de 1 até 4 decimais + + + + + + + + + Tipo Decimal com até 3 dígitos inteiros, podendo ter de 2 até 4 decimais + + + + + + + + + Tipo Decimal com até 3 dígitos inteiros e 2 até 4 decimais. Utilizados em TAGs opcionais, não aceita valor zero. + + + + + + + + + Tipo Decimal com 3 inteiros (no máximo 100), com 2 decimais + + + + + + + + + Tipo Decimal com 3 inteiros (no máximo 100), com 4 decimais + + + + + + + + + Tipo Decimal com 3 inteiros (no máximo 100), com até 4 decimais + + + + + + + + + Tipo Decimal com 8 inteiros, podendo ter de 1 até 3 decimais + + + + + + + + + Tipo Decimal com 11 inteiros, podendo ter 4 decimais + + + + + + + + + Tipo Decimal com 11 inteiros, podendo ter de 1 até 4 decimais + + + + + + + + + Tipo Decimal com 11 inteiros, podendo ter 4 decimais (utilizado em tags opcionais) + + + + + + + + + Tipo Decimal com 11 inteiros, podendo ter de 1 até 10 decimais + + + + + + + + + Tipo Decimal com 12 inteiros, podendo ter 3 decimais + + + + + + + + + Tipo Decimal com 12 inteiros e 4 decimais + + + + + + + + + Tipo Decimal com 12 inteiros de 1 até 4 decimais + + + + + + + + + Tipo Decimal com 12 inteiros com 1 até 4 decimais + + + + + + + + + Tipo Decimal com 12 inteiros, 1 a 4 decimais + + + + + + + + + Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais + + + + + + + + + Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais, utilizado em tags opcionais + + + + + + + + + Tipo Inscrição Estadual do Destinatário // alterado para aceitar vazio ou ISENTO - maio/2010 v2.0 + + + + + + + + + + Tipo Inscrição Estadual do Destinatário // alterado para aceitar vazio ou ISENTO - maio/2010 v2.0 + + + + + + + + + + Tipo Inscrição Estadual do ST // acrescentado EM 24/10/08 + + + + + + + + + + Tipo Inscrição Estadual do Emitente // alterado EM 24/10/08 para aceitar ISENTO + + + + + + + + + + Tipo Modelo Documento Fiscal + + + + + + + + + + Tipo Número do Documento Fiscal + + + + + + + + + Tipo Série do Documento Fiscal + + + + + + + + + Tipo Sigla da UF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo Sigla da UF de emissor // acrescentado em 24/10/08 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo Ambiente + + + + + + + + + + Tipo Versão do Aplicativo + + + + + + + + + Tipo Motivo + + + + + + + + + Tipo Justificativa + + + + + + + + + Tipo Serviço solicitado + + + + + + Tipo ano + + + + + + + + + Tipo temp médio em segundos + + + + + + + + + Tipo string genérico + + + + + + + + + Tipo data AAAA-MM-DD + + + + + + + + + Tipo hora HH:MM:SS // tipo acrescentado na v2.0 + + + + + + + + + Data e Hora, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm) + + + + + + + + + + + + + + + Tipo Código de orgão (UF da tabela do IBGE + 90 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pytrustnfe/xml/validate.py b/pytrustnfe/xml/validate.py index 3306b57..3f672ba 100644 --- a/pytrustnfe/xml/validate.py +++ b/pytrustnfe/xml/validate.py @@ -7,7 +7,7 @@ import os from lxml import etree PATH = os.path.dirname(os.path.abspath(__file__)) -SCHEMA = os.path.join(PATH, 'schemas/enviNFe_v3.10.xsd') +SCHEMA = os.path.join(PATH, 'schemas/enviNFe_v4.00.xsd') def valida_nfe(xml_nfe): From 5cbdd146f524695ba0cc636f9617830233975719 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Wed, 20 Jun 2018 19:46:34 -0300 Subject: [PATCH 22/85] [WIP] Cleanup of useless code, using zeep for NFe soap, adjust xml files --- pytrustnfe/Servidores.py | 86 +++++++++++----------- pytrustnfe/nfe/__init__.py | 63 ++-------------- pytrustnfe/nfe/comunicacao.py | 32 -------- pytrustnfe/nfe/templates/NfeConsultaProtocolo.xml | 5 +- pytrustnfe/nfe/templates/RecepcaoEvento.xml | 23 ++++++ .../nfe/templates/RecepcaoEventoCancelamento.xml | 22 ------ pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml | 21 ------ pytrustnfe/nfe/templates/RecepcaoEventoEPEC.xml | 31 -------- pytrustnfe/utils.py | 9 --- pytrustnfe/xml/__init__.py | 15 +--- tests/test_comunicacao.py | 20 ----- tests/test_servidores.py | 12 +-- 12 files changed, 83 insertions(+), 256 deletions(-) delete mode 100644 pytrustnfe/nfe/comunicacao.py create mode 100644 pytrustnfe/nfe/templates/RecepcaoEvento.xml delete mode 100644 pytrustnfe/nfe/templates/RecepcaoEventoCancelamento.xml delete mode 100644 pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml delete mode 100644 pytrustnfe/nfe/templates/RecepcaoEventoEPEC.xml delete mode 100644 tests/test_comunicacao.py 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/RecepcaoEvento.xml b/pytrustnfe/nfe/templates/RecepcaoEvento.xml new file mode 100644 index 0000000..b49a043 --- /dev/null +++ b/pytrustnfe/nfe/templates/RecepcaoEvento.xml @@ -0,0 +1,23 @@ + + {{ idLote }} + {% for evento in eventos %} + + + {{ evento.cOrgao }} + {{ evento.tpAmb }} + {{ evento.CNPJ }} + {{ evento.chNFe }} + {{ evento.dhEvento }} + {{ evento.tpEvento }} + {{ evento.nSeqEvento }} + 1.00 + + {{ evento.descEvento }} + {{ evento.nProt }} + {{ evento.xJust|normalize|escape }} + {{ evento.xCondUso }}. + + + + {% endfor %} + diff --git a/pytrustnfe/nfe/templates/RecepcaoEventoCancelamento.xml b/pytrustnfe/nfe/templates/RecepcaoEventoCancelamento.xml deleted file mode 100644 index 35d587e..0000000 --- a/pytrustnfe/nfe/templates/RecepcaoEventoCancelamento.xml +++ /dev/null @@ -1,22 +0,0 @@ - - {{ idLote }} - {% for evento in eventos %} - - - {{ evento.cOrgao }} - {{ evento.tpAmb }} - {{ evento.CNPJ }} - {{ evento.chNFe }} - {{ evento.dhEvento }} - 110111 - {{ evento.nSeqEvento }} - 1.00 - - Cancelamento - {{ evento.nProt }} - {{ evento.xJust|normalize|escape }} - - - - {% endfor %} - 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): From 4572b99fcbdbc7b0c8678267eedf58b74a2015a3 Mon Sep 17 00:00:00 2001 From: carcaroff Date: Thu, 14 Jun 2018 17:05:10 -0300 Subject: [PATCH 23/85] [WIP]NFS-e Maringa --- pytrustnfe/nfse/mga/__init__.py | 13 ++---- pytrustnfe/nfse/mga/assinatura.py | 19 ++++----- pytrustnfe/nfse/mga/templates/CancelarNfse.xml | 6 ++- pytrustnfe/nfse/mga/templates/GerarNfse.xml | 10 +---- pytrustnfe/nfse/mga/templates/Rps.xml | 56 +++++++++++--------------- setup.py | 2 +- 6 files changed, 42 insertions(+), 64 deletions(-) diff --git a/pytrustnfe/nfse/mga/__init__.py b/pytrustnfe/nfse/mga/__init__.py index a3d207f..ee0cbbc 100644 --- a/pytrustnfe/nfse/mga/__init__.py +++ b/pytrustnfe/nfse/mga/__init__.py @@ -2,7 +2,6 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import os -from lxml import etree from requests import Session from zeep import Client from zeep.transports import Transport @@ -19,27 +18,22 @@ def _render(certificado, method, **kwargs): reference = '' if method == 'GerarNfse': reference = 'rps:%s' % kwargs['rps']['numero'] - ref_lote = 'lote%s' % kwargs['rps']['numero_lote'] elif method == 'CancelarNfse': reference = 'Cancelamento_NF%s' % kwargs['cancelamento']['numero_nfse'] signer = Assinatura(certificado.pfx, certificado.password) xml_send = signer.assina_xml(xml_send, reference) - xml_send = signer.assina_xml(etree.fromstring(xml_send), ref_lote) return xml_send.encode('utf-8') def _send(certificado, method, **kwargs): base_url = '' if kwargs['ambiente'] == 'producao': - base_url = 'https://isse.maringa.gov.br/ws/?wsdl' + base_url = 'https://isse.maringa.pr.gov.br/ws/?wsdl' else: - base_url = 'https://isseteste.maringa.gov.br/ws/?wsdl' + base_url = 'https://isseteste.maringa.pr.gov.br/ws/?wsdl' xml_send = kwargs["xml"].decode('utf-8') - xml_cabecalho = '\ - \ - 1.00' cert, key = extract_cert_and_key_from_pfx( certificado.pfx, certificado.password) @@ -51,8 +45,7 @@ def _send(certificado, method, **kwargs): transport = Transport(session=session) client = Client(base_url, transport=transport) - - response = client.service[method](xml_cabecalho, xml_send) + response = client.service[method](xml_send) response, obj = sanitize_response(response.encode('utf-8')) return { diff --git a/pytrustnfe/nfse/mga/assinatura.py b/pytrustnfe/nfse/mga/assinatura.py index 1831379..3b302fe 100644 --- a/pytrustnfe/nfse/mga/assinatura.py +++ b/pytrustnfe/nfse/mga/assinatura.py @@ -22,23 +22,24 @@ class Assinatura(object): element.text = None signer = XMLSigner( - method=signxml.methods.enveloped, signature_algorithm="rsa-sha1", - digest_algorithm='sha1', - c14n_algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315') + method=signxml.methods.enveloped, signature_algorithm=u"rsa-sha1", + digest_algorithm=u'sha1', + c14n_algorithm=u'http://www.w3.org/TR/2001/REC-xml-c14n-20010315') ns = {} ns[None] = signer.namespaces['ds'] signer.namespaces = ns + element_to_be_signed = xml_element.getchildren()[0].getchildren()[0] - ref_uri = ('#%s' % reference) if reference else None signed_root = signer.sign( - xml_element, key=key.encode(), cert=cert.encode(), - reference_uri=ref_uri) + element_to_be_signed, key=key.encode(), cert=cert.encode()) if reference: element_signed = signed_root.find(".//*[@Id='%s']" % reference) - signature = signed_root.find(".//*[@URI='#%s']" % reference).getparent().getparent() + + signature = signed_root.find( + ".//{http://www.w3.org/2000/09/xmldsig#}Signature") if element_signed is not None and signature is not None: - parent = element_signed.getparent() + parent = xml_element.getchildren()[0] parent.append(signature) - return etree.tostring(signed_root, encoding=str) + return etree.tostring(xml_element, encoding=str) diff --git a/pytrustnfe/nfse/mga/templates/CancelarNfse.xml b/pytrustnfe/nfse/mga/templates/CancelarNfse.xml index 137897e..6c95398 100644 --- a/pytrustnfe/nfse/mga/templates/CancelarNfse.xml +++ b/pytrustnfe/nfse/mga/templates/CancelarNfse.xml @@ -1,9 +1,11 @@ - + {{ cancelamento.numero_nfse }} - {{ cancelamento.cnpj_prestador }} + + {{ cancelamento.cnpj_prestador }} + {{ cancelamento.inscricao_municipal }} {{ cancelamento.cidade }} diff --git a/pytrustnfe/nfse/mga/templates/GerarNfse.xml b/pytrustnfe/nfse/mga/templates/GerarNfse.xml index 6b35d4d..ae702fd 100644 --- a/pytrustnfe/nfse/mga/templates/GerarNfse.xml +++ b/pytrustnfe/nfse/mga/templates/GerarNfse.xml @@ -1,11 +1,3 @@ - - {{ rps.numero_lote }} - {{ rps.prestador.cnpj }} - {{ rps.prestador.inscricao_municipal }} - 1 - - {% include 'Rps.xml' %} - - + {% include 'Rps.xml' %} diff --git a/pytrustnfe/nfse/mga/templates/Rps.xml b/pytrustnfe/nfse/mga/templates/Rps.xml index 0dfd0cf..489db01 100644 --- a/pytrustnfe/nfse/mga/templates/Rps.xml +++ b/pytrustnfe/nfse/mga/templates/Rps.xml @@ -1,21 +1,15 @@ - - - {{ rps.numero }} - {{ rps.serie }} - {{ rps.tipo_rps }} - - {{ rps.data_emissao }} - {{ rps.natureza_operacao }} - {{ rps.regime_tributacao }} - {{ rps.optante_simples }} - {{ rps.incentivador_cultural }} - {{ rps.status }} - - {{ rps.numero_substituido }} - {{ rps.serie_substituido }} - {{ rps.tipo_substituido }} - + + + + {{ rps.numero }} + {{ rps.serie }} + {{ rps.tipo_rps }} + + {{ rps.data_emissao }} + {{ rps.status }} + + {{ rps.data_emissao }} {{ rps.valor_servico }} @@ -25,24 +19,25 @@ {{ rps.valor_inss }} {{ rps.valor_ir }} {{ rps.valor_csll }} - {{ rps.iss_retido }} - {{ rps.valor_iss }} - {{ rps.valor_iss_retido }} {{ rps.outras_retencoes }} - {{ rps.base_calculo }} + {{ rps.valor_iss }} {{ rps.aliquota_issqn }} - {{ rps.valor_liquido_nfse }} {{ rps.desconto_incondicionado }} {{ rps.desconto_condicionado }} + {{ rps.iss_retido }} {{ rps.codigo_servico }} {{ rps.cnae_servico }} {{ rps.codigo_tributacao_municipio }} {{ rps.descricao }} {{ rps.codigo_municipio }} + {{ rps.codigo_pais }} + {{ rps.exigibilidade_iss}} - {{ rps.prestador.cnpj }} + + {{ rps.prestador.cnpj }} + {{ rps.prestador.inscricao_municipal }} @@ -65,6 +60,7 @@ {{ rps.tomador.bairro }} {{ rps.tomador.cidade }} {{ rps.tomador.uf }} + {{ rps.tomador.codigo_pais }} {{ rps.tomador.cep }} @@ -72,20 +68,14 @@ {{ rps.tomador.email }} - {% if rps.intermediario is defined -%} - - {{ rps.intermediario.razao_social }} - - {{ rps.intermediario.cnpj }} - - {{ rps.intermediario.inscricao_municipal }} - - {% endif %} {% if rps.construcao_civil is defined -%} {{ rps.construcao_civil.codigo_obra }} {{ rps.construcao_civil.art }} {% endif %} - + {{ rps.regime_tributacao }} + {{ rps.optante_simples }} + {{ rps.incentivador_cultural }} + diff --git a/setup.py b/setup.py index 9337653..10eb464 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.9.24" +VERSION = "0.9.25" setup( From 70816097e9959996e996246b4a929015076f524a Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Wed, 27 Jun 2018 17:35:35 -0300 Subject: [PATCH 24/85] [IMP] Implementing NFe 4.0 - Cleaning up code and improve readability --- pytrustnfe/Servidores.py | 16 ++++---- pytrustnfe/client.py | 31 --------------- pytrustnfe/nfe/__init__.py | 45 +++++++++++++++------- pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml | 30 ++++++--------- pytrustnfe/nfe/templates/RecepcaoEvento.xml | 2 +- .../nfe/templates/RecepcaoEventoManifesto.xml | 2 +- 6 files changed, 52 insertions(+), 74 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index e6a5bad..2328f14 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -56,6 +56,7 @@ SIGLA_ESTADO = { '28': 'SE', '35': 'SP', '17': 'TO', + '91': 'AN' } @@ -250,17 +251,15 @@ SVC_RS = { AN = { AMBIENTE_PRODUCAO: { 'servidor': 'www1.nfe.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx', - WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', + WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl', + WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'hom.nfe.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx', - WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', + WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl', + WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?Wsdl', }, } @@ -626,4 +625,5 @@ ESTADO_WS = { 'SE': SVRS, 'SP': UFSP, 'TO': SVRS, + 'AN': AN, } diff --git a/pytrustnfe/client.py b/pytrustnfe/client.py index e6e67e3..7ed1c5a 100644 --- a/pytrustnfe/client.py +++ b/pytrustnfe/client.py @@ -2,11 +2,9 @@ # © 2016 Danimar Ribeiro, Trustcode # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -import urllib3 import requests import suds.client import suds_requests -from requests.packages.urllib3.exceptions import InsecureRequestWarning def get_authenticated_client(base_url, cert, key): @@ -33,32 +31,3 @@ def get_client(base_url): cache=cache, transport=suds_requests.RequestsTransport(session) ) - - -class HttpClient(object): - - def __init__(self, url, cert_path, key_path): - self.url = url - self.cert_path = cert_path - self.key_path = key_path - - def _headers(self, action, send_raw): - if send_raw: - return { - 'Content-type': 'text/xml; charset=utf-8;', - 'SOAPAction': "http://www.portalfiscal.inf.br/nfe/wsdl/%s" % action, - 'Accept': 'application/soap+xml; charset=utf-8', - } - - return { - 'Content-type': 'application/soap+xml; charset=utf-8;', - 'SOAPAction': 'http://www.portalfiscal.inf.br/nfe/wsdl/%s' % action, - } - - def post_soap(self, xml_soap, cabecalho, send_raw): - header = self._headers(cabecalho.soap_action, send_raw) - urllib3.disable_warnings(category=InsecureRequestWarning) - res = requests.post(self.url, data=xml_soap.encode('utf-8'), - cert=(self.cert_path, self.key_path), - verify=False, headers=header) - return res.text diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index c9ecdff..c067c83 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -165,7 +165,7 @@ def _send(certificado, method, **kwargs): return { 'sent_xml': xml_send, 'received_xml': response, - 'object': obj.Body.nfeResultMsg + 'object': obj.Body.getchildren()[0] } @@ -253,23 +253,13 @@ def recepcao_evento_carta_correcao(certificado, **kwargs): # Assinar def xml_recepcao_evento_manifesto(certificado, **kwargs): # Assinar - return _render(certificado, 'RecepcaoEventoManifesto', True, **kwargs) + return _render(certificado, 'RecepcaoEvento', True, **kwargs) def recepcao_evento_manifesto(certificado, **kwargs): # Assinar if "xml" not in kwargs: kwargs['xml'] = xml_recepcao_evento_manifesto(certificado, **kwargs) - return _send(certificado, 'RecepcaoEventoManifesto', **kwargs) - - -def xml_recepcao_evento_epec(certificado, **kwargs): # Assinar - return _render(certificado, 'RecepcaoEventoEPEC', True, **kwargs) - - -def recepcao_evento_epec(certificado, **kwargs): # Assinar - if "xml" not in kwargs: - kwargs['xml'] = xml_recepcao_evento_epec(certificado, **kwargs) - return _send(certificado, 'RecepcaoEventoEPEC', **kwargs) + return _send(certificado, 'RecepcaoEvento', **kwargs) def xml_consulta_distribuicao_nfe(certificado, **kwargs): # Assinar @@ -279,7 +269,34 @@ def xml_consulta_distribuicao_nfe(certificado, **kwargs): # Assinar def consulta_distribuicao_nfe(certificado, **kwargs): if "xml" not in kwargs: kwargs['xml'] = xml_consulta_distribuicao_nfe(certificado, **kwargs) - return _send(certificado, 'NFeDistribuicaoDFe', **kwargs) + xml_send = kwargs["xml"] + base_url = localizar_url( + 'NFeDistribuicaoDFe', kwargs['estado'], kwargs['modelo'], + kwargs['ambiente']) + + cert, key = extract_cert_and_key_from_pfx( + certificado.pfx, certificado.password) + cert, key = save_cert_key(cert, key) + + session = Session() + session.cert = (cert, key) + session.verify = False + transport = Transport(session=session) + + xml = etree.fromstring(xml_send) + xml_um = etree.fromstring('AN1.00') + client = Client(base_url, transport=transport) + + port = next(iter(client.wsdl.port_types)) + first_operation = next(iter(client.wsdl.port_types[port].operations)) + with client.options(raw_response=True): + response = client.service[first_operation](nfeDadosMsg=xml, _soapheaders=[xml_um]) + response, obj = sanitize_response(response.text) + return { + 'sent_xml': xml_send, + 'received_xml': response, + 'object': obj.Body.nfeDistDFeInteresseResponse.nfeDistDFeInteresseResult + } def xml_download_nfe(certificado, **kwargs): # Assinar diff --git a/pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml b/pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml index 9e4d774..cd3fc38 100644 --- a/pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml +++ b/pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml @@ -1,19 +1,11 @@ - - - - - - {{ ambiente }} - {{ estado }} - {{ cnpj_cpf }} - - {{ ultimo_nsu }} - - - {{ chave_nfe }} - - - - - - + + {{ ambiente }} + {{ estado }} + {{ cnpj_cpf }} + + {{ ultimo_nsu }} + + + {{ chave_nfe }} + + diff --git a/pytrustnfe/nfe/templates/RecepcaoEvento.xml b/pytrustnfe/nfe/templates/RecepcaoEvento.xml index b49a043..58a3a67 100644 --- a/pytrustnfe/nfe/templates/RecepcaoEvento.xml +++ b/pytrustnfe/nfe/templates/RecepcaoEvento.xml @@ -15,7 +15,7 @@ {{ evento.descEvento }} {{ evento.nProt }} {{ evento.xJust|normalize|escape }} - {{ evento.xCondUso }}. + {{ evento.xCondUso }} diff --git a/pytrustnfe/nfe/templates/RecepcaoEventoManifesto.xml b/pytrustnfe/nfe/templates/RecepcaoEventoManifesto.xml index 0d77fa3..d592678 100644 --- a/pytrustnfe/nfe/templates/RecepcaoEventoManifesto.xml +++ b/pytrustnfe/nfe/templates/RecepcaoEventoManifesto.xml @@ -1,7 +1,7 @@ {{ lote }} - + 91 {{ ambiente }} {{ manifesto.cnpj_empresa }} From f0f38237f2e5598e2dfd8534cb0e96d894e05b31 Mon Sep 17 00:00:00 2001 From: guilherme Date: Fri, 6 Jul 2018 13:33:52 -0300 Subject: [PATCH 25/85] corrected issues in layout of danfe --- pytrustnfe/nfe/danfe.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 5b578bc..63decf9 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -323,7 +323,7 @@ class danfe(object): P = Paragraph(tagtext(oNode=elem_emit, cTag='xNome'), styleN) w, h = P.wrap(55 * mm, 40 * mm) P.drawOn(self.canvas, (self.nLeft + 30) * mm, - (self.height - self.nlin - ((5*h + 12)/12)) * mm) + (self.height - self.nlin - ((4.3*h + 12)/12)) * mm) if self.logo: img = get_image(self.logo, width=2 * cm) @@ -347,7 +347,7 @@ class danfe(object): P = Paragraph(cEnd, styleN) w, h = P.wrap(55 * mm, 30 * mm) P.drawOn(self.canvas, (self.nLeft + 30) * mm, - (self.height - self.nlin - 31) * mm) + (self.height - self.nlin - 33) * mm) # Homologação if tagtext(oNode=elem_ide, cTag='tpAmb') == '2': From 9817897d30e56c7d0d02035c9c022bb70afb7dbe Mon Sep 17 00:00:00 2001 From: guilherme Date: Fri, 6 Jul 2018 14:25:47 -0300 Subject: [PATCH 26/85] update library version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 10eb464..f548242 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.9.25" +VERSION = "0.9.26" setup( From c95cba8ae7716891200244d2adf4440de8896255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Thu, 26 Jul 2018 18:52:50 +0000 Subject: [PATCH 27/85] =?UTF-8?q?Corrige=20webservice=20de=20recep=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20eventos=20do=20Paran=C3=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/Servidores.py | 8 ++++---- setup.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 0ddc8d4..abf7c45 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -507,8 +507,8 @@ UFPR = { WS_NFE_CONSULTA: 'nfe/NFeConsulta3', WS_NFE_SITUACAO: 'nfe/NFeStatusServico3', WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfe-evento/NFeRecepcaoEvento', - WS_NFE_CANCELAMENTO: 'nfe-evento/NFeRecepcaoEvento', + WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento', + WS_NFE_CANCELAMENTO: 'nfe/NFeRecepcaoEvento', }, NFE_AMBIENTE_HOMOLOGACAO: { 'servidor': 'homologacao.nfe.fazenda.pr.gov.br', @@ -518,8 +518,8 @@ UFPR = { WS_NFE_CONSULTA: 'nfe/NFeConsulta3', WS_NFE_SITUACAO: 'nfe/NFeStatusServico3', WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfe-evento/NFeRecepcaoEvento', - WS_NFE_CANCELAMENTO: 'nfe-evento/NFeRecepcaoEvento', + WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento', + WS_NFE_CANCELAMENTO: 'nfe/NFeRecepcaoEvento', } } diff --git a/setup.py b/setup.py index f548242..86cfddc 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.9.26" +VERSION = "0.9.27" setup( From 06764a249c1cdb03f081b50165f632eab8386286 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 30 Jul 2018 19:57:21 -0300 Subject: [PATCH 28/85] [IMP] Fix unit tests and fix some urls --- pytrustnfe/Servidores.py | 52 +++++++++++++++++----------------- pytrustnfe/nfse/paulistana/__init__.py | 4 +-- tests/test_consulta_cadastro.py | 19 ------------- tests/test_servidores.py | 4 +-- tests/test_utils.py | 8 +----- 5 files changed, 31 insertions(+), 56 deletions(-) delete mode 100644 tests/test_consulta_cadastro.py diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index b454a43..ea570f1 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -124,44 +124,44 @@ SVRS = { NFE_MODELO: { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.svrs.rs.gov.br', - WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx', # noqa - WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', # noqa + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', # noqa + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx?wsdl', # noqa }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfe-homologacao.svrs.rs.gov.br', - WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx', # noqa - WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', # noqa + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', # noqa + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx?wsdl', # noqa } }, NFCE_MODELO: { AMBIENTE_PRODUCAO: { 'servidor': 'nfce.svrs.rs.gov.br', - WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx', # noqa + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfce-homologacao.svrs.rs.gov.br', - WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx', # noqa + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx', } } diff --git a/pytrustnfe/nfse/paulistana/__init__.py b/pytrustnfe/nfse/paulistana/__init__.py index 44019b8..ed0611b 100644 --- a/pytrustnfe/nfse/paulistana/__init__.py +++ b/pytrustnfe/nfse/paulistana/__init__.py @@ -54,10 +54,10 @@ def _send(certificado, method, **kwargs): 'object': None } - response, obj = sanitize_response(response.encode('utf-8')) + response, obj = sanitize_response(response) return { 'sent_xml': xml_send, - 'received_xml': response.decode(), + 'received_xml': response, 'object': obj } diff --git a/tests/test_consulta_cadastro.py b/tests/test_consulta_cadastro.py deleted file mode 100644 index a284b56..0000000 --- a/tests/test_consulta_cadastro.py +++ /dev/null @@ -1,19 +0,0 @@ -# coding=utf-8 - -import mock -import os.path -import unittest -from pytrustnfe.certificado import Certificado -from pytrustnfe.nfe import consulta_cadastro - - -class test_consulta_cadastro(unittest.TestCase): - - caminho = os.path.dirname(__file__) - - def test_conta_de_cadastro(self): - pfx_source = open(os.path.join(self.caminho, 'teste.pfx'), 'rb').read() - pfx = Certificado(pfx_source, '123456') - - obj = {'cnpj': '12345678901234', 'estado': '42'} - consulta_cadastro(pfx, obj=obj, ambiente=1, estado='42') diff --git a/tests/test_servidores.py b/tests/test_servidores.py index 69d4bce..3a492df 100644 --- a/tests/test_servidores.py +++ b/tests/test_servidores.py @@ -14,7 +14,7 @@ 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/NFeAutorizacao4.asmx' +url_sc = 'https://nfe.svrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl' url_rs = 'https://nfe.sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx' @@ -22,7 +22,7 @@ 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/cadconsulta\ -cadastro2.asmx' +cadastro2.asmx?wsdl' class test_servidores(unittest.TestCase): diff --git a/tests/test_utils.py b/tests/test_utils.py index 247327d..dce9ff0 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -8,7 +8,7 @@ import unittest import datetime from pytrustnfe.utils import date_tostring, datetime_tostring, \ gerar_chave -from pytrustnfe.utils import ChaveNFe, CabecalhoSoap +from pytrustnfe.utils import ChaveNFe class test_utils(unittest.TestCase): @@ -18,12 +18,6 @@ class test_utils(unittest.TestCase): 'tipo': 0, 'codigo': '26730161' } - def test_cabecalho_soap(self): - head = CabecalhoSoap(versao=1, estado='SC', soap_action='Autorizacao') - self.assertEqual(head.versao, 1) - self.assertEqual(head.estado, 'SC') - self.assertEqual(head.soap_action, 'Autorizacao') - def test_date_tostring(self): hoje = datetime.date.today() data = date_tostring(hoje) From f63ad7abbfeb29be431278168a4578f19dab255d Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 30 Jul 2018 21:08:12 -0300 Subject: [PATCH 29/85] [FIX] Corrige o build para o deploy --- .travis.yml | 2 -- setup.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 73a0c70..4e404cd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,5 @@ language: python python: -- "3.4" -- "3.5" - "3.6" virtual_env: system_site_packages: true diff --git a/setup.py b/setup.py index 86cfddc..1b9f1da 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.9.27" +VERSION = "0.9.28" setup( From bcbaf1474d060fa2d5c38a885c0d360aab80967c Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 31 Jul 2018 11:16:29 -0300 Subject: [PATCH 30/85] [IMP] Atualizado schema da NFe --- pytrustnfe/nfe/templates/RecepcaoEvento.xml | 1 + pytrustnfe/xml/schemas/enviNFe_v3.10.xsd | 9 - pytrustnfe/xml/schemas/leiauteNFe_v3.10.xsd | 6060 -------------------------- pytrustnfe/xml/schemas/leiauteNFe_v4.00.xsd | 73 +- pytrustnfe/xml/schemas/nfe_v3.10.xsd | 9 - pytrustnfe/xml/schemas/tiposBasico_v3.10.xsd | 571 --- setup.py | 2 +- 7 files changed, 65 insertions(+), 6660 deletions(-) delete mode 100755 pytrustnfe/xml/schemas/enviNFe_v3.10.xsd delete mode 100755 pytrustnfe/xml/schemas/leiauteNFe_v3.10.xsd delete mode 100755 pytrustnfe/xml/schemas/nfe_v3.10.xsd delete mode 100755 pytrustnfe/xml/schemas/tiposBasico_v3.10.xsd diff --git a/pytrustnfe/nfe/templates/RecepcaoEvento.xml b/pytrustnfe/nfe/templates/RecepcaoEvento.xml index 58a3a67..be0f9ef 100644 --- a/pytrustnfe/nfe/templates/RecepcaoEvento.xml +++ b/pytrustnfe/nfe/templates/RecepcaoEvento.xml @@ -15,6 +15,7 @@ {{ evento.descEvento }} {{ evento.nProt }} {{ evento.xJust|normalize|escape }} + {{ evento.xCorrecao|normalize|escape }} {{ evento.xCondUso }} diff --git a/pytrustnfe/xml/schemas/enviNFe_v3.10.xsd b/pytrustnfe/xml/schemas/enviNFe_v3.10.xsd deleted file mode 100755 index 85bf09a..0000000 --- a/pytrustnfe/xml/schemas/enviNFe_v3.10.xsd +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - Schema XML de validação do Pedido de Concessão de Autorização da Nota Fiscal Eletrônica - - - \ No newline at end of file diff --git a/pytrustnfe/xml/schemas/leiauteNFe_v3.10.xsd b/pytrustnfe/xml/schemas/leiauteNFe_v3.10.xsd deleted file mode 100755 index fdd83f3..0000000 --- a/pytrustnfe/xml/schemas/leiauteNFe_v3.10.xsd +++ /dev/null @@ -1,6060 +0,0 @@ - - - - - - - - - - - Tipo Nota Fiscal Eletrônica - - - - - Informações da Nota Fiscal eletrônica - - - - - - identificação da NF-e - - - - - - Código da UF do emitente do Documento Fiscal. Utilizar a Tabela do IBGE. - - - - - Código numérico que compõe a Chave de Acesso. Número aleatório gerado pelo emitente para cada NF-e. - - - - - - - - - - - Descrição da Natureza da Operação - - - - - - - - - - - Indicador da forma de pagamento: -0 – pagamento à vista; -1 – pagamento à prazo; -2 – outros. - - - - - - - - - - - - - Código do modelo do Documento Fiscal. 55 = NF-e; 65 = NFC-e. - - - - - Série do Documento Fiscal -série normal 0-889 -Avulsa Fisco 890-899 -SCAN 900-999 - - - - - Número do Documento Fiscal - - - - - Data e Hora de emissão do Documento Fiscal (AAAA-MM-DDThh:mm:ssTZD) ex.: 2012-09-01T13:00:00-03:00 - - - - - Data e Hora da saída ou de entrada da mercadoria / produto (AAAA-MM-DDTHH:mm:ssTZD) - - - - - Tipo do Documento Fiscal (0 - entrada; 1 - saída) - - - - - - - - - - - - Identificador de Local de destino da operação (1-Interna;2-Interestadual;3-Exterior) - - - - - - - - - - - - - Código do Município de Ocorrência do Fato Gerador (utilizar a tabela do IBGE) - - - - - Formato de impressão do DANFE (0-sem DANFE;1-DANFe Retrato; 2-DANFe Paisagem;3-DANFe Simplificado; - 4-DANFe NFC-e;5-DANFe NFC-e em mensagem eletrônica) - - - - - - - - - - - - - - - - - Forma de emissão da NF-e -1 - Normal; -2 - Contingência FS -3 - Contingência SCAN -4 - Contingência DPEC -5 - Contingência FSDA -6 - Contingência SVC - AN -7 - Contingência SVC - RS -9 - Contingência off-line NFC-e - - - - - - - - - - - - - - - - - - Digito Verificador da Chave de Acesso da NF-e - - - - - - - - - - - Identificação do Ambiente: -1 - Produção -2 - Homologação - - - - - Finalidade da emissão da NF-e: -1 - NFe normal -2 - NFe complementar -3 - NFe de ajuste -4 - Devolução/Retorno - - - - - Indica operação com consumidor final (0-Não;1-Consumidor Final) - - - - - - - - - - - - Indicador de presença do comprador no estabelecimento comercial no momento da oepração - (0-Não se aplica (ex.: Nota Fiscal complementar ou de ajuste;1-Operação presencial;2-Não presencial, internet;3-Não presencial, teleatendimento;4-NFC-e entrega em domicílio;9-Não presencial, outros) - - - - - - - - - - - - - - - - Processo de emissão utilizado com a seguinte codificação: -0 - emissão de NF-e com aplicativo do contribuinte; -1 - emissão de NF-e avulsa pelo Fisco; -2 - emissão de NF-e avulsa, pelo contribuinte com seu certificado digital, através do site -do Fisco; -3- emissão de NF-e pelo contribuinte com aplicativo fornecido pelo Fisco. - - - - - versão do aplicativo utilizado no processo de -emissão - - - - - - - - - - - Informar apenas -para tpEmis diferente de 1 - - - - Informar a data e hora de entrada em contingência contingência no formato (AAAA-MM-DDThh:mm:ssTZD) ex.: 2012-09-01T13:00:00-03:00. - - - - - Informar a Justificativa da entrada - - - - - - - - - - - - Grupo de infromações da NF referenciada - - - - - - Chave de acesso das NF-e referenciadas. Chave de acesso compostas por Código da UF (tabela do IBGE) + AAMM da emissão + CNPJ do Emitente + modelo, série e número da NF-e Referenciada + Código Numérico + DV. - - - - - Dados da NF modelo 1/1A referenciada - - - - - - Código da UF do emitente do Documento Fiscal. Utilizar a Tabela do IBGE. - - - - - AAMM da emissão - - - - - - - - - - - CNPJ do emitente do documento fiscal referenciado - - - - - Código do modelo do Documento Fiscal. Utilizar 01 para NF modelo 1/1A - - - - - - - - - - - Série do Documento Fiscal, informar zero se inexistente - - - - - Número do Documento Fiscal - - - - - - - - Grupo com as informações NF de produtor referenciada - - - - - - Código da UF do emitente do Documento FiscalUtilizar a Tabela do IBGE (Anexo IV - Tabela de UF, Município e País) - - - - - AAMM da emissão da NF de produtor - - - - - - - - - - - - CNPJ do emitente da NF de produtor - - - - - CPF do emitente da NF de produtor - - - - - - IE do emitente da NF de Produtor - - - - - Código do modelo do Documento Fiscal - utilizar 04 para NF de produtor ou 01 para NF Avulsa - - - - - - - - - - - - Série do Documento Fiscal, informar zero se inexistentesérie - - - - - Número do Documento Fiscal - 1 – 999999999 - - - - - - - - Utilizar esta TAG para referenciar um CT-e emitido anteriormente, vinculada a NF-e atual - - - - - Grupo do Cupom Fiscal vinculado à NF-e - - - - - - Código do modelo do Documento Fiscal -Preencher com "2B", quando se tratar de Cupom Fiscal emitido por máquina registradora (não ECF), com "2C", quando se tratar de Cupom Fiscal PDV, ou "2D", quando se tratar de Cupom Fiscal (emitido por ECF) - - - - - - - - - - - - - Informar o número de ordem seqüencial do ECF que emitiu o Cupom Fiscal vinculado à NF-e - - - - - - - - - - - Informar o Número do Contador de Ordem de Operação - COO vinculado à NF-e - - - - - - - - - - - - - - - - - - - - Identificação do emitente - - - - - - - Número do CNPJ do emitente - - - - - Número do CPF do emitente - - - - - - Razão Social ou Nome do emitente - - - - - - - - - - - Nome fantasia - - - - - - - - - - - Endereço do emitente - - - - - Inscrição Estadual do Emitente - - - - - Inscricao Estadual do Substituto Tributário - - - - - Grupo de informações de interesse da Prefeitura - - - - Inscrição Municipal - - - - - - - - - - - CNAE Fiscal - - - - - - - - - - - - Código de Regime Tributário. -Este campo será obrigatoriamente preenchido com: -1 – Simples Nacional; -2 – Simples Nacional – excesso de sublimite de receita bruta; -3 – Regime Normal. - - - - - - - - - - - - - - - - - Emissão de avulsa, informar os dados do Fisco emitente - - - - - - CNPJ do Órgão emissor - - - - - Órgão emitente - - - - - - - - - - - Matrícula do agente - - - - - - - - - - - Nome do agente - - - - - - - - - - - Telefone - - - - - - - - - - - Sigla da Unidade da Federação - - - - - Número do Documento de Arrecadação de Receita - - - - - - - - - - - Data de emissão do DAR (AAAA-MM-DD) - - - - - Valor Total constante no DAR - - - - - Repartição Fiscal emitente - - - - - - - - - - - Data de pagamento do DAR (AAAA-MM-DD) - - - - - - - - Identificação do Destinatário - - - - - - - Número do CNPJ - - - - - Número do CPF - - - - - Identificador do destinatário, em caso de comprador estrangeiro - - - - - - - - - - - - Razão Social ou nome do destinatário - - - - - - - - - - - Dados do endereço - - - - - Indicador da IE do destinatário: -1 – Contribuinte ICMSpagamento à vista; -2 – Contribuinte isento de inscrição; -9 – Não Contribuinte - - - - - - - - - - - - - Inscrição Estadual (obrigatório nas operações com contribuintes do ICMS) - - - - - Inscrição na SUFRAMA (Obrigatório nas operações com as áreas com benefícios de incentivos fiscais sob controle da SUFRAMA) PL_005d - 11/08/09 - alterado para aceitar 8 ou 9 dígitos - - - - - - - - - - - Inscrição Municipal do tomador do serviço - - - - - - - - - - - Informar o e-mail do destinatário. O campo pode ser utilizado para informar o e-mail -de recepção da NF-e indicada pelo destinatário - - - - - - - - - - - - - - - Identificação do Local de Retirada (informar apenas quando for diferente do endereço do remetente) - - - - - Identificação do Local de Entrega (informar apenas quando for diferente do endereço do destinatário) - - - - - Pessoas autorizadas para o download do XML da NF-e - - - - - - CNPJ Autorizado - - - - - CPF Autorizado - - - - - - - - Dados dos detalhes da NF-e - - - - - - Dados dos produtos e serviços da NF-e - - - - - - Código do produto ou serviço. Preencher com CFOP caso se trate de itens não relacionados com mercadorias/produto e que o contribuinte não possua codificação própria -Formato ”CFOP9999”. - - - - - - - - - - - GTIN (Global Trade Item Number) do produto, antigo código EAN ou código de barras - - - - - - - - - - - Descrição do produto ou serviço - - - - - - - - - - - Código NCM (8 posições), será permitida a informação do gênero (posição do capítulo do NCM) quando a operação não for de comércio exterior (importação/exportação) ou o produto não seja tributado pelo IPI. Em caso de item de serviço ou item que não tenham produto (Ex. transferência de crédito, crédito do ativo imobilizado, etc.), informar o código 00 (zeros) (v2.0) - - - - - - - - - - - Nomenclatura de Valor aduaneio e Estatístico - - - - - - - - - - - Codigo especificador da Substuicao Tributaria - CEST, que identifica a mercadoria sujeita aos regimes de substituicao tributária e de antecipação do recolhimento do imposto - - - - - - - - - - - - Código EX TIPI (3 posições) - - - - - - - - - - - Cfop - - - - - - - - - - - Unidade comercial - - - - - - - - - - - Quantidade Comercial do produto, alterado para aceitar de 0 a 4 casas decimais e 11 inteiros. - - - - - Valor unitário de comercialização - alterado para aceitar 0 a 10 casas decimais e 11 inteiros - - - - - Valor bruto do produto ou serviço. - - - - - GTIN (Global Trade Item Number) da unidade tributável, antigo código EAN ou código de barras - - - - - - - - - - - Unidade Tributável - - - - - - - - - - - Quantidade Tributável - alterado para aceitar de 0 a 4 casas decimais e 11 inteiros - - - - - Valor unitário de tributação - - alterado para aceitar 0 a 10 casas decimais e 11 inteiros - - - - - Valor Total do Frete - - - - - Valor Total do Seguro - - - - - Valor do Desconto - - - - - Outras despesas acessórias - - - - - Este campo deverá ser preenchido com: - 0 – o valor do item (vProd) não compõe o valor total da NF-e (vProd) - 1 – o valor do item (vProd) compõe o valor total da NF-e (vProd) - - - - - - - - - - - - - Delcaração de Importação -(NT 2011/004) - - - - - - Numero do Documento de Importação DI/DSI/DA/DRI-E (DI/DSI/DA/DRI-E) (NT2011/004) - - - - - - - - - - - Data de registro da DI/DSI/DA (AAAA-MM-DD) - - - - - Local do desembaraço aduaneiro - - - - - - - - - - - UF onde ocorreu o desembaraço aduaneiro - - - - - Data do desembaraço aduaneiro (AAAA-MM-DD) - - - - - Via de transporte internacional informada na DI - 1-Maritima;2-Fluvial;3-Lacustre;4-Aerea;5-Postal;6-Ferroviaria;7-Rodoviaria;8-Conduto;9-Meios Proprios;10-Entrada/Saida Ficta. - - - - - - - - - - - - - - - - - - - - - - Valor Adicional ao frete para renovação de marinha mercante - - - - - Forma de Importação quanto a intermediação - 1-por conta propria;2-por conta e ordem;3-encomenda - - - - - - - - - - - - - CNPJ do adquirente ou do encomendante - - - - - Sigla da UF do adquirente ou do encomendante - - - - - Código do exportador (usado nos sistemas internos de informação do emitente da NF-e) - - - - - - - - - - - Adições (NT 2011/004) - - - - - - Número da Adição - - - - - - - - - - - Número seqüencial do item dentro da Adição - - - - - - - - - - - Código do fabricante estrangeiro (usado nos sistemas internos de informação do emitente da NF-e) - - - - - - - - - - - Valor do desconto do item da DI – adição - - - - - Número do ato concessório de Drawback - - - - - - - - - - - - - - - - - Detalhe da exportação - - - - - - Número do ato concessório de Drawback - - - - - - - - - - - Exportação indireta - - - - - - Registro de exportação - - - - - - - - - - - Chave de acesso da NF-e recebida para exportação - - - - - Quantidade do item efetivamente exportado - - - - - - - - - - - pedido de compra - Informação de interesse do emissor para controle do B2B. - - - - - - - - - - - Número do Item do Pedido de Compra - Identificação do número do item do pedido de Compra - - - - - - - - - - - Número de controle da FCI - Ficha de Conteúdo de Importação. - - - - - Informações específicas de produtos e serviços - - - - Veículos novos - - - - - - Tipo da Operação (1 - Venda concessionária; 2 - Faturamento direto; 3 - Venda direta; 0 - Outros) - - - - - - - - - - - - - - Chassi do veículo - VIN (código-identificação-veículo) - - - - - - - - - - - - Cor do veículo (código de cada montadora) - - - - - - - - - - - Descrição da cor - - - - - - - - - - - Potência máxima do motor do veículo em cavalo vapor (CV). (potência-veículo) - - - - - - - - - - - Capacidade voluntária do motor expressa em centímetros cúbicos (CC). (cilindradas) - - - - - - - - - - - Peso líquido - - - - - - - - - - - Peso bruto - - - - - - - - - - - Serial (série) - - - - - - - - - - - Tipo de combustível-Tabela RENAVAM: 01-Álcool; 02-Gasolina; 03-Diesel; 16-Álcool/Gas.; 17-Gas./Álcool/GNV; 18-Gasolina/Elétrico - - - - - - - - - - - Número do motor - - - - - - - - - - - CMT-Capacidade Máxima de Tração - em Toneladas 4 casas decimais - - - - - - - - - - - Distância entre eixos - - - - - - - - - - - Ano Modelo de Fabricação - - - - - - - - - - - Ano de Fabricação - - - - - - - - - - - Tipo de pintura - - - - - - - - - - Tipo de veículo (utilizar tabela RENAVAM) - - - - - - - - - - - Espécie de veículo (utilizar tabela RENAVAM) - - - - - - - - - - - Informa-se o veículo tem VIN (chassi) remarcado. -R-Remarcado -N-NormalVIN - - - - - - - - - - - - Condição do veículo (1 - acabado; 2 - inacabado; 3 - semi-acabado) - - - - - - - - - - - - - Código Marca Modelo (utilizar tabela RENAVAM) - - - - - - - - - - - Código da Cor Segundo as regras de pré-cadastro do DENATRAN: 01-AMARELO;02-AZUL;03-BEGE;04-BRANCA;05-CINZA;06-DOURADA;07-GRENA -08-LARANJA;09-MARROM;10-PRATA;11-PRETA;12-ROSA;13-ROXA;14-VERDE;15-VERMELHA;16-FANTASIA - - - - - - - - - - - - - Quantidade máxima de permitida de passageiros sentados, inclusive motorista. - - - - - - - - - - - - - Restrição -0 - Não há; -1 - Alienação Fiduciária; -2 - Arrendamento Mercantil; -3 - Reserva de Domínio; -4 - Penhor de Veículos; -9 - outras. - - - - - - - - - - - - - - - - - - - grupo do detalhamento de Medicamentos e de matérias-primas farmacêuticas - - - - - - Número do lote do medicamento - - - - - - - - - - - Quantidade de produtos no lote - - - - - Data de Fabricação do medicamento (AAAA-MM-DD) - - - - - Data de validade do medicamento (AAAA-MM-DD) - - - - - Preço Máximo ao Consumidor - - - - - - - - Armamentos - - - - - - Indicador do tipo de arma de fogo (0 - Uso permitido; 1 - Uso restrito) - - - - - - - - - - - - Número de série da arma - - - - - - - - - - - Número de série do cano - - - - - - - - - - - Descrição completa da arma, compreendendo: calibre, marca, capacidade, tipo de funcionamento, comprimento e demais elementos que permitam a sua perfeita identificação. - - - - - - - - - - - - - - Informar apenas para operações com combustíveis líquidos - - - - - - Código de produto da ANP. codificação de produtos do SIMP (http://www.anp.gov.br) - - - - - - - - - - - Percentual de gas natural para o produto GLP - - - - - Código de autorização / registro do CODIF. Informar apenas quando a UF utilizar o CODIF (Sistema de Controle do Diferimento do Imposto nas Operações com AEAC - Álcool Etílico Anidro Combustível). - - - - - - - - - - - Quantidade de combustível -faturada à temperatura ambiente. -Informar quando a quantidade -faturada informada no campo -qCom (I10) tiver sido ajustada para -uma temperatura diferente da -ambiente. - - - - - Sigla da UF de Consumo - - - - - CIDE Combustíveis - - - - - - BC do CIDE ( Quantidade comercializada) - - - - - Alíquota do CIDE (em reais) - - - - - Valor do CIDE - - - - - - - - Informações do grupo de "encerrante" - - - - - - Numero de identificação do Bico utilizado no abastecimento - - - - - - - - - - - Numero de identificação da bomba ao qual o bico está interligado - - - - - - - - - - - Numero de identificação do tanque ao qual o bico está interligado - - - - - - - - - - - Valor do Encerrante no ínicio do abastecimento - - - - - Valor do Encerrante no final do abastecimento - - - - - - - - - - - Número do RECOPI - - - - - - - - - - - - - - - - Tributos incidentes nos produtos ou serviços da NF-e - - - - - - Valor estimado total de impostos federais, estaduais e municipais - - - - - - - Dados do ICMS Normal e ST - - - - - - Tributação pelo ICMS -00 - Tributada integralmente - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno - - - - - - Tributção pelo ICMS -00 - Tributada integralmente - - - - - - - - - - - - Modalidade de determinação da BC do ICMS: -0 - Margem Valor Agregado (%); -1 - Pauta (valor); -2 - Preço Tabelado Máximo (valor); -3 - Valor da Operação. - - - - - - - - - - - - - - Valor da BC do ICMS - - - - - Alíquota do ICMS - - - - - Valor do ICMS - - - - - - - - Tributação pelo ICMS -10 - Tributada e com cobrança do ICMS por substituição tributária - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno - - - - - - 10 - Tributada e com cobrança do ICMS por substituição tributária - - - - - - - - - - - Modalidade de determinação da BC do ICMS: -0 - Margem Valor Agregado (%); -1 - Pauta (valor); -2 - Preço Tabelado Máximo (valor); -3 - Valor da Operação. - - - - - - - - - - - - - - Valor da BC do ICMS - - - - - Alíquota do ICMS - - - - - Valor do ICMS - - - - - Modalidade de determinação da BC do ICMS ST: -0 – Preço tabelado ou máximo sugerido; -1 - Lista Negativa (valor); -2 - Lista Positiva (valor); -3 - Lista Neutra (valor); -4 - Margem Valor Agregado (%); -5 - Pauta (valor); - - - - - - - - - - - - - - - - Percentual da Margem de Valor Adicionado ICMS ST - - - - - Percentual de redução da BC ICMS ST - - - - - Valor da BC do ICMS ST - - - - - Alíquota do ICMS ST - - - - - Valor do ICMS ST - - - - - - - - Tributção pelo ICMS -20 - Com redução de base de cálculo - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno - - - - - - Tributção pelo ICMS -20 - Com redução de base de cálculo - - - - - - - - - - - Modalidade de determinação da BC do ICMS: -0 - Margem Valor Agregado (%); -1 - Pauta (valor); -2 - Preço Tabelado Máximo (valor); -3 - Valor da Operação. - - - - - - - - - - - - - - Percentual de redução da BC - - - - - Valor da BC do ICMS - - - - - Alíquota do ICMS - - - - - Valor do ICMS - - - - - Grupo desoneração - - - - Valor do ICMS de desoneração - - - - - Motivo da desoneração do ICMS:3-Uso na agropecuária;9-Outros;12-Fomento agropecuário - - - - - - - - - - - - - - - - - Tributação pelo ICMS -30 - Isenta ou não tributada e com cobrança do ICMS por substituição tributária - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno - - - - - - Tributção pelo ICMS -30 - Isenta ou não tributada e com cobrança do ICMS por substituição tributária - - - - - - - - - - - Modalidade de determinação da BC do ICMS ST: -0 – Preço tabelado ou máximo sugerido; -1 - Lista Negativa (valor); -2 - Lista Positiva (valor); -3 - Lista Neutra (valor); -4 - Margem Valor Agregado (%); -5 - Pauta (valor). - - - - - - - - - - - - - - - - Percentual da Margem de Valor Adicionado ICMS ST - - - - - Percentual de redução da BC ICMS ST - - - - - Valor da BC do ICMS ST - - - - - Alíquota do ICMS ST - - - - - Valor do ICMS ST - - - - - Grupo desoneração - - - - Valor do ICMS de desoneração - - - - - Motivo da desoneração do ICMS:6-Utilitários Motocicleta AÁrea Livre;7-SUFRAMA;9-Outros - - - - - - - - - - - - - - - - - Tributação pelo ICMS -40 - Isenta -41 - Não tributada -50 - Suspensão - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno - - - - - - Tributação pelo ICMS -40 - Isenta -41 - Não tributada -50 - Suspensão -51 - Diferimento - - - - - - - - - - - - - - O valor do ICMS será informado apenas nas operações com veículos beneficiados com a desoneração condicional do ICMS. - - - - - Este campo será preenchido quando o campo anterior estiver preenchido. -Informar o motivo da desoneração: -1 – Táxi; -3 – Produtor Agropecuário; -4 – Frotista/Locadora; -5 – Diplomático/Consular; -6 – Utilitários e Motocicletas da Amazônia Ocidental e Áreas de Livre Comércio (Resolução 714/88 e 790/94 – CONTRAN e suas alterações); -7 – SUFRAMA; -8 - Venda a órgão Público; -9 – Outros -10- Deficiente Condutor -11- Deficiente não condutor -16 - Olimpíadas Rio 2016 - - - - - - - - - - - - - - - - - - - - - - - - - - Tributção pelo ICMS -51 - Diferimento -A exigência do preenchimento das informações do ICMS diferido fica à critério de cada UF. - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno - - - - - - Tributção pelo ICMS -20 - Com redução de base de cálculo - - - - - - - - - - - Modalidade de determinação da BC do ICMS: -0 - Margem Valor Agregado (%); -1 - Pauta (valor); -2 - Preço Tabelado Máximo (valor); -3 - Valor da Operação. - - - - - - - - - - - - - - Percentual de redução da BC - - - - - Valor da BC do ICMS - - - - - Alíquota do ICMS - - - - - Valor do ICMS da Operação - - - - - Percentual do diferemento - - - - - Valor do ICMS da diferido - - - - - Valor do ICMS - - - - - - - - Tributação pelo ICMS -60 - ICMS cobrado anteriormente por substituição tributária - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno - - - - - - Tributação pelo ICMS -60 - ICMS cobrado anteriormente por substituição tributária - - - - - - - - - - - NT2010/004 - - - - Valor da BC do ICMS ST retido anteriormente - - - - - Valor do ICMS ST retido anteriormente - - - - - - - - - Tributação pelo ICMS -70 - Com redução de base de cálculo e cobrança do ICMS por substituição tributária - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno - - - - - - Tributção pelo ICMS -70 - Com redução de base de cálculo e cobrança do ICMS por substituição tributária - - - - - - - - - - - Modalidade de determinação da BC do ICMS: -0 - Margem Valor Agregado (%); -1 - Pauta (valor); -2 - Preço Tabelado Máximo (valor); -3 - Valor da Operação. - - - - - - - - - - - - - - Percentual de redução da BC - - - - - Valor da BC do ICMS - - - - - Alíquota do ICMS - - - - - Valor do ICMS - - - - - Modalidade de determinação da BC do ICMS ST: -0 – Preço tabelado ou máximo sugerido; -1 - Lista Negativa (valor); -2 - Lista Positiva (valor); -3 - Lista Neutra (valor); -4 - Margem Valor Agregado (%); -5 - Pauta (valor). - - - - - - - - - - - - - - - - Percentual da Margem de Valor Adicionado ICMS ST - - - - - Percentual de redução da BC ICMS ST - - - - - Valor da BC do ICMS ST - - - - - Alíquota do ICMS ST - - - - - Valor do ICMS ST - - - - - Grupo desoneração - - - - Valor do ICMS de desoneração - - - - - Motivo da desoneração do ICMS:3-Uso na agropecuária;9-Outros;12-Fomento agropecuário - - - - - - - - - - - - - - - - - Tributação pelo ICMS -90 - Outras - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno - - - - - - Tributção pelo ICMS -90 - Outras - - - - - - - - - - - - Modalidade de determinação da BC do ICMS: -0 - Margem Valor Agregado (%); -1 - Pauta (valor); -2 - Preço Tabelado Máximo (valor); -3 - Valor da Operação. - - - - - - - - - - - - - - Valor da BC do ICMS - - - - - Percentual de redução da BC - - - - - Alíquota do ICMS - - - - - Valor do ICMS - - - - - - - Modalidade de determinação da BC do ICMS ST: -0 – Preço tabelado ou máximo sugerido; -1 - Lista Negativa (valor); -2 - Lista Positiva (valor); -3 - Lista Neutra (valor); -4 - Margem Valor Agregado (%); -5 - Pauta (valor). - - - - - - - - - - - - - - - - Percentual da Margem de Valor Adicionado ICMS ST - - - - - Percentual de redução da BC ICMS ST - - - - - Valor da BC do ICMS ST - - - - - Alíquota do ICMS ST - - - - - Valor do ICMS ST - - - - - - Grupo desoneração - - - - Valor do ICMS de desoneração - - - - - Motivo da desoneração do ICMS:3-Uso na agropecuária;9-Outros;12-Fomento agropecuário - - - - - - - - - - - - - - - - - Partilha do ICMS entre a UF de origem e UF de destino ou a UF definida na legislação -Operação interestadual para consumidor final com partilha do ICMS devido na operação entre a UF de origem e a UF do destinatário ou ou a UF definida na legislação. (Ex. UF da concessionária de entrega do veículos) - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno - - - - - - Tributação pelo ICMS -10 - Tributada e com cobrança do ICMS por substituição tributária; -90 – Outros. - - - - - - - - - - - - Modalidade de determinação da BC do ICMS: -0 - Margem Valor Agregado (%); -1 - Pauta (valor); -2 - Preço Tabelado Máximo (valor); -3 - Valor da Operação. - - - - - - - - - - - - - - Valor da BC do ICMS - - - - - Percentual de redução da BC - - - - - Alíquota do ICMS - - - - - Valor do ICMS - - - - - Modalidade de determinação da BC do ICMS ST: -0 – Preço tabelado ou máximo sugerido; -1 - Lista Negativa (valor); -2 - Lista Positiva (valor); -3 - Lista Neutra (valor); -4 - Margem Valor Agregado (%); -5 - Pauta (valor). - - - - - - - - - - - - - - - - Percentual da Margem de Valor Adicionado ICMS ST - - - - - Percentual de redução da BC ICMS ST - - - - - Valor da BC do ICMS ST - - - - - Alíquota do ICMS ST - - - - - Valor do ICMS ST - - - - - Percentual para determinação do valor da Base de Cálculo da operação própria. - - - - - Sigla da UF para qual é devido o ICMS ST da operação. - - - - - - - - Grupo de informação do ICMSST devido para a UF de destino, nas operações interestaduais de produtos que tiveram retenção antecipada de ICMS por ST na UF do remetente. Repasse via Substituto Tributário. - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno - - - - - - Tributção pelo ICMS -41-Não Tributado - - - - - - - - - - - Informar o valor da BC do ICMS ST retido na UF remetente - - - - - Informar o valor do ICMS ST retido na UF remetente (iv2.0)) - - - - - Informar o valor da BC do ICMS ST da UF destino - - - - - Informar o valor da BC do ICMS ST da UF destino (v2.0) - - - - - - - - Tributação do ICMS pelo SIMPLES NACIONAL e CSOSN=101 (v.2.0) - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno -(v2.0) - - - - - 101- Tributada pelo Simples Nacional com permissão de crédito. (v.2.0) - - - - - - - - - - - Alíquota aplicável de cálculo do crédito (Simples Nacional). (v2.0) - - - - - Valor crédito do ICMS que pode ser aproveitado nos termos do art. 23 da LC 123 (Simples Nacional) (v2.0) - - - - - - - - Tributação do ICMS pelo SIMPLES NACIONAL e CSOSN=102, 103, 300 ou 400 (v.2.0)) - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno -(v2.0) - - - - - 102- Tributada pelo Simples Nacional sem permissão de crédito. -103 – Isenção do ICMS no Simples Nacional para faixa de receita bruta. -300 – Imune. -400 – Não tributda pelo Simples Nacional (v.2.0) (v.2.0) - - - - - - - - - - - - - - - - - Tributação do ICMS pelo SIMPLES NACIONAL e CSOSN=201 (v.2.0) - - - - - - Origem da mercadoria: -0 – Nacional; -1 – Estrangeira – Importação direta; -2 – Estrangeira – Adquirida no mercado interno. (v2.0) - - - - - 201- Tributada pelo Simples Nacional com permissão de crédito e com cobrança do ICMS por Substituição Tributária (v.2.0) - - - - - - - - - - - Modalidade de determinação da BC do ICMS ST: -0 – Preço tabelado ou máximo sugerido; -1 - Lista Negativa (valor); -2 - Lista Positiva (valor); -3 - Lista Neutra (valor); -4 - Margem Valor Agregado (%); -5 - Pauta (valor). (v2.0) - - - - - - - - - - - - - - - - Percentual da Margem de Valor Adicionado ICMS ST (v2.0) - - - - - Percentual de redução da BC ICMS ST (v2.0) - - - - - Valor da BC do ICMS ST (v2.0) - - - - - Alíquota do ICMS ST (v2.0) - - - - - Valor do ICMS ST (v2.0) - - - - - Alíquota aplicável de cálculo do crédito (Simples Nacional). (v2.0) - - - - - Valor crédito do ICMS que pode ser aproveitado nos termos do art. 23 da LC 123 (Simples Nacional) (v2.0) - - - - - - - - Tributação do ICMS pelo SIMPLES NACIONAL e CSOSN=202 ou 203 (v.2.0) - - - - - - Origem da mercadoria: -0 – Nacional; -1 – Estrangeira – Importação direta; -2 – Estrangeira – Adquirida no mercado interno. (v2.0) - - - - - 202- Tributada pelo Simples Nacional sem permissão de crédito e com cobrança do ICMS por Substituição Tributária; -203- Isenção do ICMS nos Simples Nacional para faixa de receita bruta e com cobrança do ICMS por Substituição Tributária (v.2.0) - - - - - - - - - - - - Modalidade de determinação da BC do ICMS ST: -0 – Preço tabelado ou máximo sugerido; -1 - Lista Negativa (valor); -2 - Lista Positiva (valor); -3 - Lista Neutra (valor); -4 - Margem Valor Agregado (%); -5 - Pauta (valor). (v2.0) - - - - - - - - - - - - - - - - Percentual da Margem de Valor Adicionado ICMS ST (v2.0) - - - - - Percentual de redução da BC ICMS ST (v2.0) - - - - - Valor da BC do ICMS ST (v2.0) - - - - - Alíquota do ICMS ST (v2.0) - - - - - Valor do ICMS ST (v2.0) - - - - - - - - Tributação do ICMS pelo SIMPLES NACIONAL,CRT=1 – Simples Nacional e CSOSN=500 (v.2.0) - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno - - - - - - 500 – ICMS cobrado anterirmente por substituição tributária (substituído) ou por antecipação -(v.2.0) - - - - - - - - - - - - - - - Valor da BC do ICMS ST retido anteriormente (v2.0) - - - - - Valor do ICMS ST retido anteriormente (v2.0) - - - - - - - - - Tributação do ICMS pelo SIMPLES NACIONAL, CRT=1 – Simples Nacional e CSOSN=900 (v2.0) - - - - - - origem da mercadoria: 0 - Nacional -1 - Estrangeira - Importação direta -2 - Estrangeira - Adquirida no mercado interno - - - - - - Tributação pelo ICMS 900 - Outros(v2.0) - - - - - - - - - - - - Modalidade de determinação da BC do ICMS: -0 - Margem Valor Agregado (%); -1 - Pauta (valor); -2 - Preço Tabelado Máximo (valor); -3 - Valor da Operação. - - - - - - - - - - - - - - Valor da BC do ICMS - - - - - Percentual de redução da BC - - - - - Alíquota do ICMS - - - - - Valor do ICMS - - - - - - - Modalidade de determinação da BC do ICMS ST: -0 – Preço tabelado ou máximo sugerido; -1 - Lista Negativa (valor); -2 - Lista Positiva (valor); -3 - Lista Neutra (valor); -4 - Margem Valor Agregado (%); -5 - Pauta (valor). - - - - - - - - - - - - - - - - Percentual da Margem de Valor Adicionado ICMS ST - - - - - Percentual de redução da BC ICMS ST - - - - - Valor da BC do ICMS ST - - - - - Alíquota do ICMS ST - - - - - Valor do ICMS ST - - - - - - - Alíquota aplicável de cálculo do crédito (Simples Nacional). (v2.0) - - - - - Valor crédito do ICMS que pode ser aproveitado nos termos do art. 23 da LC 123 (Simples Nacional) (v2.0) - - - - - - - - - - - - - Dados do Imposto de Importação - - - - - - Base da BC do Imposto de Importação - - - - - Valor das despesas aduaneiras - - - - - Valor do Imposto de Importação - - - - - Valor do Imposto sobre Operações Financeiras - - - - - - - - - - - ISSQN - - - - - - Valor da BC do ISSQN - - - - - Alíquota do ISSQN - - - - - Valor da do ISSQN - - - - - Informar o município de ocorrência do fato gerador do ISSQN. Utilizar a Tabela do IBGE (Anexo VII - Tabela de UF, Município e País). “Atenção, não vincular com os campos B12, C10 ou E10” v2.0 - - - - - Informar o Item da lista de serviços da LC 116/03 em que se classifica o serviço. - - - - - Valor dedução para redução da base de cálculo - - - - - Valor outras retenções - - - - - Valor desconto incondicionado - - - - - Valor desconto condicionado - - - - - Valor Retenção ISS - - - - - Exibilidade do ISS:1-Exigível;2-Não incidente;3-Isenção;4-Exportação;5-Imunidade;6-Exig.Susp. Judicial;7-Exig.Susp. ADM - - - - - - - - - - - - - - - - - Código do serviço prestado dentro do município - - - - - - - - - - - - Código do Município de Incidência do Imposto - - - - - Código de Pais - - - - - - - - - - - Número do Processo administrativo ou judicial de suspenção do processo - - - - - - - - - - - - Indicador de Incentivo Fiscal. 1=Sim; 2=Não - - - - - - - - - - - - - - - - - Dados do PIS - - - - - - Código de Situação Tributária do PIS. - 01 – Operação Tributável - Base de Cálculo = Valor da Operação Alíquota Normal (Cumulativo/Não Cumulativo); -02 - Operação Tributável - Base de Calculo = Valor da Operação (Alíquota Diferenciada); - - - - - - Código de Situação Tributária do PIS. - 01 – Operação Tributável - Base de Cálculo = Valor da Operação Alíquota Normal (Cumulativo/Não Cumulativo); -02 - Operação Tributável - Base de Calculo = Valor da Operação (Alíquota Diferenciada); - - - - - - - - - - - - Valor da BC do PIS - - - - - Alíquota do PIS (em percentual) - - - - - Valor do PIS - - - - - - - - Código de Situação Tributária do PIS. -03 - Operação Tributável - Base de Calculo = Quantidade Vendida x Alíquota por Unidade de Produto; - - - - - - Código de Situação Tributária do PIS. -03 - Operação Tributável - Base de Calculo = Quantidade Vendida x Alíquota por Unidade de Produto; - - - - - - - - - - - Quantidade Vendida (NT2011/004) - - - - - Alíquota do PIS (em reais) (NT2011/004) - - - - - Valor do PIS - - - - - - - - Código de Situação Tributária do PIS. -04 - Operação Tributável - Tributação Monofásica - (Alíquota Zero); -06 - Operação Tributável - Alíquota Zero; -07 - Operação Isenta da contribuição; -08 - Operação Sem Incidência da contribuição; -09 - Operação com suspensão da contribuição; - - - - - - Código de Situação Tributária do PIS. -04 - Operação Tributável - Tributação Monofásica - (Alíquota Zero); -05 - Operação Tributável (ST); -06 - Operação Tributável - Alíquota Zero; -07 - Operação Isenta da contribuição; -08 - Operação Sem Incidência da contribuição; -09 - Operação com suspensão da contribuição; - - - - - - - - - - - - - - - - - - - Código de Situação Tributária do PIS. -99 - Outras Operações. - - - - - - Código de Situação Tributária do PIS. -99 - Outras Operações. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Valor da BC do PIS - - - - - Alíquota do PIS (em percentual) - - - - - - - Quantidade Vendida (NT2011/004) - - - - - Alíquota do PIS (em reais) (NT2011/004) - - - - - - - Valor do PIS - - - - - - - - - - - Dados do PIS Substituição Tributária - - - - - - - - Valor da BC do PIS ST - - - - - Alíquota do PIS ST (em percentual) - - - - - - - Quantidade Vendida - - - - - Alíquota do PIS ST (em reais) - - - - - - - Valor do PIS ST - - - - - - - - Dados do COFINS - - - - - - Código de Situação Tributária do COFINS. - 01 – Operação Tributável - Base de Cálculo = Valor da Operação Alíquota Normal (Cumulativo/Não Cumulativo); -02 - Operação Tributável - Base de Calculo = Valor da Operação (Alíquota Diferenciada); - - - - - - Código de Situação Tributária do COFINS. - 01 – Operação Tributável - Base de Cálculo = Valor da Operação Alíquota Normal (Cumulativo/Não Cumulativo); -02 - Operação Tributável - Base de Calculo = Valor da Operação (Alíquota Diferenciada); - - - - - - - - - - - - Valor da BC do COFINS - - - - - Alíquota do COFINS (em percentual) - - - - - Valor do COFINS - - - - - - - - Código de Situação Tributária do COFINS. -03 - Operação Tributável - Base de Calculo = Quantidade Vendida x Alíquota por Unidade de Produto; - - - - - - Código de Situação Tributária do COFINS. -03 - Operação Tributável - Base de Calculo = Quantidade Vendida x Alíquota por Unidade de Produto; - - - - - - - - - - Quantidade Vendida (NT2011/004) - - - - - Alíquota do COFINS (em reais) (NT2011/004) - - - - - Valor do COFINS - - - - - - - - Código de Situação Tributária do COFINS: -04 - Operação Tributável - Tributação Monofásica - (Alíquota Zero); -06 - Operação Tributável - Alíquota Zero; -07 - Operação Isenta da contribuição; -08 - Operação Sem Incidência da contribuição; -09 - Operação com suspensão da contribuição; - - - - - - Código de Situação Tributária do COFINS: -04 - Operação Tributável - Tributação Monofásica - (Alíquota Zero); -05 - Operação Tributável (ST); -06 - Operação Tributável - Alíquota Zero; -07 - Operação Isenta da contribuição; -08 - Operação Sem Incidência da contribuição; -09 - Operação com suspensão da contribuição; - - - - - - - - - - - - - - - - - - - Código de Situação Tributária do COFINS: -49 - Outras Operações de Saída -50 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Tributada no Mercado Interno -51 - Operação com Direito a Crédito – Vinculada Exclusivamente a Receita Não Tributada no Mercado Interno -52 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita de Exportação -53 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno -54 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas no Mercado Interno e de Exportação -55 - Operação com Direito a Crédito - Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação -56 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação -60 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Tributada no Mercado Interno -61 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Não-Tributada no Mercado Interno -62 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita de Exportação -63 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno -64 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas no Mercado Interno e de Exportação -65 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação -66 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação -67 - Crédito Presumido - Outras Operações -70 - Operação de Aquisição sem Direito a Crédito -71 - Operação de Aquisição com Isenção -72 - Operação de Aquisição com Suspensão -73 - Operação de Aquisição a Alíquota Zero -74 - Operação de Aquisição sem Incidência da Contribuição -75 - Operação de Aquisição por Substituição Tributária -98 - Outras Operações de Entrada -99 - Outras Operações. - - - - - - Código de Situação Tributária do COFINS: -49 - Outras Operações de Saída -50 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Tributada no Mercado Interno -51 - Operação com Direito a Crédito – Vinculada Exclusivamente a Receita Não Tributada no Mercado Interno -52 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita de Exportação -53 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno -54 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas no Mercado Interno e de Exportação -55 - Operação com Direito a Crédito - Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação -56 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação -60 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Tributada no Mercado Interno -61 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Não-Tributada no Mercado Interno -62 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita de Exportação -63 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno -64 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas no Mercado Interno e de Exportação -65 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação -66 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação -67 - Crédito Presumido - Outras Operações -70 - Operação de Aquisição sem Direito a Crédito -71 - Operação de Aquisição com Isenção -72 - Operação de Aquisição com Suspensão -73 - Operação de Aquisição a Alíquota Zero -74 - Operação de Aquisição sem Incidência da Contribuição -75 - Operação de Aquisição por Substituição Tributária -98 - Outras Operações de Entrada -99 - Outras Operações. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Valor da BC do COFINS - - - - - Alíquota do COFINS (em percentual) - - - - - - - Quantidade Vendida (NT2011/004) - - - - - Alíquota do COFINS (em reais) (NT2011/004) - - - - - - - Valor do COFINS - - - - - - - - - - - Dados do COFINS da -Substituição Tributaria; - - - - - - - - Valor da BC do COFINS ST - - - - - Alíquota do COFINS ST(em percentual) - - - - - - - Quantidade Vendida - - - - - Alíquota do COFINS ST(em reais) - - - - - - - Valor do COFINS ST - - - - - - - - Grupo a ser informado nas vendas interestarduais para consumidor final, não contribuinte de ICMS - - - - - - Valor da Base de Cálculo do ICMS na UF do destinatário. - - - - - Percentual adicional inserido na alíquota interna da UF de destino, relativo ao Fundo de Combate à Pobreza (FCP) naquela UF. - - - - - Alíquota adotada nas operações internas na UF do destinatário para o produto / mercadoria. - - - - - Alíquota interestadual das UF envolvidas: - 4% alíquota interestadual para produtos importados; - 7% para os Estados de origem do Sul e Sudeste (exceto ES), destinado para os Estados do Norte e Nordeste ou ES; - 12% para os demais casos. - - - - - - - - - - - - - Percentual de partilha para a UF do destinatário: - 40% em 2016; - 60% em 2017; - 80% em 2018; - 100% a partir de 2019. - - - - - Valor do ICMS relativo ao Fundo de Combate à Pobreza (FCP) da UF de destino. - - - - - Valor do ICMS de partilha para a UF do destinatário. - - - - - Valor do ICMS de partilha para a UF do remetente. Nota: A partir de 2019, este valor será zero. - - - - - - - - - - - - - - Percentual de mercadoria devolvida - - - - - Informação de IPI devolvido - - - - - - Valor do IPI devolvido - - - - - - - - - - - Informações adicionais do produto (norma referenciada, informações complementares, etc) - - - - - - - - - - - - Número do item do NF - - - - - - - - - - - - - Dados dos totais da NF-e - - - - - - Totais referentes ao ICMS - - - - - - BC do ICMS - - - - - Valor Total do ICMS - - - - - Valor Total do ICMS desonerado - - - - - Valor total do ICMS relativo ao Fundo de Combate à Pobreza (FCP) para a UF de destino. - - - - - Valor total do ICMS de partilha para a UF do destinatário - - - - - Valor total do ICMS de partilha para a UF do remetente - - - - - BC do ICMS ST - - - - - Valor Total do ICMS ST - - - - - Valor Total dos produtos e serviços - - - - - Valor Total do Frete - - - - - Valor Total do Seguro - - - - - Valor Total do Desconto - - - - - Valor Total do II - - - - - Valor Total do IPI - - - - - Valor do PIS - - - - - Valor do COFINS - - - - - Outras Despesas acessórias - - - - - Valor Total da NF-e - - - - - Valor estimado total de impostos federais, estaduais e municipais - - - - - - - - Totais referentes ao ISSQN - - - - - - Valor Total dos Serviços sob não-incidência ou não tributados pelo ICMS - - - - - Base de Cálculo do ISS - - - - - Valor Total do ISS - - - - - Valor do PIS sobre serviços - - - - - Valor do COFINS sobre serviços - - - - - Data da prestação do serviço (AAAA-MM-DD) - - - - - Valor dedução para redução da base de cálculo - - - - - Valor outras retenções - - - - - Valor desconto incondicionado - - - - - Valor desconto condicionado - - - - - Valor Total Retenção ISS - - - - - Código do regime especial de tributação - - - - - - - - - - - - - - - - - - - Retenção de Tributos Federais - - - - - - Valor Retido de PIS - - - - - Valor Retido de COFINS - - - - - Valor Retido de CSLL - - - - - Base de Cálculo do IRRF - - - - - Valor Retido de IRRF - - - - - Base de Cálculo da Retenção da Previdêncica Social - - - - - Valor da Retenção da Previdêncica Social - - - - - - - - - - - Dados dos transportes da NF-e - - - - - - Modalidade do frete -0- Por conta do emitente; -1- Por conta do destinatário/remetente; -2- Por conta de terceiros; -9- Sem frete (v2.0) - - - - - - - - - - - - - - Dados do transportador - - - - - - - CNPJ do transportador - - - - - CPF do transportador - - - - - - Razão Social ou nome do transportador - - - - - - - - - - - Inscrição Estadual (v2.0) - - - - - Endereço completo - - - - - - - - - - - Nome do munícipio - - - - - - - - - - - Sigla da UF - - - - - - - - Dados da retenção ICMS do Transporte - - - - - - Valor do Serviço - - - - - BC da Retenção do ICMS - - - - - Alíquota da Retenção - - - - - Valor do ICMS Retido - - - - - Código Fiscal de Operações e Prestações - - - - - - - - - - - Código do Município de Ocorrência do Fato Gerador (utilizar a tabela do IBGE) - - - - - - - - - - Dados do veículo - - - - - Dados do reboque/Dolly (v2.0) - - - - - - Identificação do vagão (v2.0) - - - - - - - - - - - Identificação da balsa (v2.0) - - - - - - - - - - - - Dados dos volumes - - - - - - Quantidade de volumes transportados - - - - - - - - - - - Espécie dos volumes transportados - - - - - - - - - - - Marca dos volumes transportados - - - - - - - - - - - Numeração dos volumes transportados - - - - - - - - - - - Peso líquido (em kg) - - - - - Peso bruto (em kg) - - - - - - - - Número dos Lacres - - - - - - - - - - - - - - - - - - - - Dados da cobrança da NF-e - - - - - - Dados da fatura - - - - - - Número da fatura - - - - - - - - - - - Valor original da fatura - - - - - Valor do desconto da fatura - - - - - Valor líquido da fatura - - - - - - - - Dados das duplicatas NT 2011/004 - - - - - - Número da duplicata - - - - - - - - - - - Data de vencimento da duplicata (AAAA-MM-DD) - - - - - Valor da duplicata - - - - - - - - - - - Dados de Pagamento. Obrigatório apenas para (NFC-e) NT 2012/004 - - - - - - Forma de Pagamento:01-Dinheiro;02-Cheque;03-Cartão de Crédito;04-Cartão de Débito;05-Crédito Loja;10-Vale Alimentação;11-Vale Refeição;12-Vale Presente;13-Vale Combustível;99 - Outros - - - - - - - - - - - - - - - - - - - - Valor do Pagamento - - - - - Grupo de Cartões - - - - - - Tipo de Integração do processo de pagamento com o sistema de automação da empresa/ - 1=Pagamento integrado com o sistema de automação da empresa Ex. equipamento TEF , Comercio Eletronico - 2=Pagamento não integrado com o sistema de automação da empresa Ex: equipamento POS - - - - - - - - - - - - - CNPJ da credenciadora de cartão de crédito/débito - - - - - Bandeira da operadora de cartão de crédito/débito:01–Visa; 02–Mastercard; 03–American Express; 04–Sorocred; 99–Outros - - - - - - - - - - - - - - - Número de autorização da operação cartão de crédito/débito - - - - - - - - - - - - - - - - - Informações adicionais da NF-e - - - - - - Informações adicionais de interesse do Fisco (v2.0) - - - - - - - - - - - Informações complementares de interesse do Contribuinte - - - - - - - - - - - Campo de uso livre do contribuinte -informar o nome do campo no atributo xCampo -e o conteúdo do campo no xTexto - - - - - - - - - - - - - - - - - - - - - - - - - Campo de uso exclusivo do Fisco -informar o nome do campo no atributo xCampo -e o conteúdo do campo no xTexto - - - - - - - - - - - - - - - - - - - - - - - - - Grupo de informações do processo referenciado - - - - - - Indentificador do processo ou ato -concessório - - - - - - - - - - - Origem do processo, informar com: -0 - SEFAZ; -1 - Justiça Federal; -2 - Justiça Estadual; -3 - Secex/RFB; -9 - Outros - - - - - - - - - - - - - - - - - - - - - Informações de exportação - - - - - - Sigla da UF de Embarque ou de transposição de fronteira - - - - - Local de Embarque ou de transposição de fronteira - - - - - - - - - - - Descrição do local de despacho - - - - - - - - - - - - - - Informações de compras (Nota de Empenho, Pedido e Contrato) - - - - - - Informação da Nota de Empenho de compras públicas (NT2011/004) - - - - - - - - - - - Informação do pedido - - - - - - - - - - - Informação do contrato - - - - - - - - - - - - - - Informações de registro aquisições de cana - - - - - - Identificação da safra - - - - - - - - - - - Mês e Ano de Referência, formato: MM/AAAA - - - - - - - - - - - Fornecimentos diários - - - - - - Quantidade em quilogramas - peso líquido - - - - - - Número do dia - - - - - - - - - - - - - - - - - Total do mês - - - - - Total Anterior - - - - - Total Geral - - - - - Deduções - Taxas e Contribuições - - - - - - Descrição da Dedução - - - - - - - - - - - valor da dedução - - - - - - - - Valor dos fornecimentos - - - - - Valor Total das Deduções - - - - - Valor Líquido dos fornecimentos - - - - - - - - - Versão do leiaute (v2.0) - - - - - PL_005d - 11/08/09 - validação do Id - - - - - - - - - - - - - - - - Informações suplementares Nota Fiscal - - - - - - Texto com o QR-Code impresso no DANFE NFC-e - - - - - - - - - - - - - - - - - - - Tipo Protocolo de status resultado do processamento da NF-e - - - - - Dados do protocolo de status - - - - - - Identificação do Ambiente: -1 - Produção -2 - Homologação - - - - - Versão do Aplicativo que processou a NF-e - - - - - Chaves de acesso da NF-e, compostas por: UF do emitente, AAMM da emissão da NFe, CNPJ do emitente, modelo, série e número da NF-e e código numérico+DV. - - - - - Data e hora de processamento, no formato AAAA-MM-DDTHH:MM:SSTZD. Deve ser preenchida com data e hora da gravação no Banco em caso de Confirmação. Em caso de Rejeição, com data e hora do recebimento do Lote de NF-e enviado. - - - - - Número do Protocolo de Status da NF-e. 1 posição (1 – Secretaria de Fazenda Estadual 2 – Receita Federal); 2 - códiga da UF - 2 posições ano; 10 seqüencial no ano. - - - - - Digest Value da NF-e processada. Utilizado para conferir a integridade da NF-e original. - - - - - Código do status da mensagem enviada. - - - - - Descrição literal do status do serviço solicitado. - - - - - - - - - - - - - Tipo Pedido de Concessão de Autorização da Nota Fiscal Eletrônica - - - - - - Indicador de processamento síncrono. 0=NÃO; 1=SIM=Síncrono - - - - - - - - - - - - - - - - Tipo Retorno do Pedido de Autorização da Nota Fiscal Eletrônica - - - - - Identificação do Ambiente: -1 - Produção -2 - Homologação - - - - - Versão do Aplicativo que recebeu o Lote. - - - - - Código do status da mensagem enviada. - - - - - Descrição literal do status do serviço solicitado. - - - - - código da UF de atendimento - - - - - Data e hora do recebimento, no formato AAAA-MM-DDTHH:MM:SSTZD - - - - - - Dados do Recibo do Lote - - - - - - Número do Recibo - - - - - Tempo médio de resposta do serviço (em segundos) dos últimos 5 minutos - - - - - - - - Protocolo de status resultado do processamento sincrono da NFC-e - - - - - - - - - Tipo Pedido de Consulta do Recido do Lote de Notas Fiscais Eletrônicas - - - - - Identificação do Ambiente: -1 - Produção -2 - Homologação - - - - - Número do Recibo - - - - - - - - Tipo Retorno do Pedido de Consulta do Recido do Lote de Notas Fiscais Eletrônicas - - - - - Identificação do Ambiente: -1 - Produção -2 - Homologação - - - - - Versão do Aplicativo que processou a NF-e - - - - - Número do Recibo Consultado - - - - - Código do status da mensagem enviada. - - - - - Descrição literal do status do serviço solicitado. - - - - - código da UF de atendimento - - - - - Data e hora de processamento, no formato AAAA-MM-DDTHH:MM:SSTZD. Em caso de Rejeição, com data e hora do recebimento do Lote de NF-e enviado. - - - - - - - Código da Mensagem (v2.0) -alterado para tamanho variavel 1-4. (NT2011/004) - - - - - - - - - - - Mensagem da SEFAZ para o emissor. (v2.0) - - - - - - - - - - - - Protocolo de status resultado do processamento da NF-e - - - - - - - - Tipo da NF-e processada - - - - - - - - - - Tipo Dados do Endereço // 24/10/08 - tamanho mínimo - - - - - Logradouro - - - - - - - - - - - Número - - - - - - - - - - - Complemento - - - - - - - - - - - Bairro - - - - - - - - - - - Código do município (utilizar a tabela do IBGE), informar 9999999 para operações com o exterior. - - - - - Nome do município, informar EXTERIOR para operações com o exterior. - - - - - - - - - - - Sigla da UF, informar EX para operações com o exterior. - - - - - CEP - - - - - - - - - - - Código de Pais - - - - - - - - - - - Nome do país - - - - - - - - - - - Telefone, preencher com Código DDD + número do telefone , nas operações com exterior é permtido informar o código do país + código da localidade + número do telefone - - - - - - - - - - - - - Tipo Dados do Endereço do Emitente // 24/10/08 - desmembrado / tamanho mínimo - - - - - Logradouro - - - - - - - - - - - Número - - - - - - - - - - - Complemento - - - - - - - - - - - Bairro - - - - - - - - - - - Código do município - - - - - Nome do município - - - - - - - - - - - Sigla da UF - - - - - CEP - NT 2011/004 - - - - - - - - - - - Código do país - - - - - - - - - - Nome do país - - - - - - - - - - - Preencher com Código DDD + número do telefone (v.2.0) - - - - - - - - - - - - - Tipo Dados do Local de Retirada ou Entrega // 24/10/08 - tamanho mínimo // v2.0 - - - - - - CNPJ - - - - - CPF (v2.0) - - - - - - Logradouro - - - - - - - - - - - Número - - - - - - - - - - - Complemento - - - - - - - - - - - Bairro - - - - - - - - - - - Código do município (utilizar a tabela do IBGE) - - - - - Nome do município - - - - - - - - - - - Sigla da UF - - - - - - - Tipo Dados do Veículo - - - - - Placa do veículo (NT2011/004) - - - - - - - - - - - Sigla da UF - - - - - Registro Nacional de Transportador de Carga (ANTT) - - - - - - - - - - - - - Tipo Origem da mercadoria CST ICMS origem da mercadoria: 0-Nacional exceto as indicadas nos códigos 3, 4, 5 e 8; -1-Estrangeira - Importação direta; 2-Estrangeira - Adquirida no mercado interno; 3-Nacional, conteudo superior 40% e inferior ou igual a 70%; 4-Nacional, processos produtivos básicos; 5-Nacional, conteudo inferior 40%; 6-Estrangeira - Importação direta, com similar nacional, lista CAMEX; 7-Estrangeira - mercado interno, sem simular,lista CAMEX;8-Nacional, Conteúdo de Importação superior a 70%. - - - - - - - - - - - - - - - - - Tipo Finalidade da NF-e (1=Normal; 2=Complementar; 3=Ajuste; 4=Devolução/Retorno) - - - - - - - - - - - - Tipo processo de emissão da NF-e - - - - - - - - - - - - Tipo Código da Lista de Serviços LC 116/2003 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Identificação de Lote - - - - - - - - - Tipo Versão da NF-e - 3.10 - - - - - - - - - Identificador único (Globally Unique Identifier) - - - - - - - - - Tipo: Dados do IPI - - - - - Classe de Enquadramento do IPI para Cigarros e Bebidas - - - - - - - - - - - CNPJ do produtor da mercadoria, quando diferente do emitente. Somente para os casos de exportação direta ou indireta. - - - - - Código do selo de controle do IPI - - - - - - - - - - - Quantidade de selo de controle do IPI - - - - - - - - - - - Código de Enquadramento Legal do IPI (tabela a ser criada pela RFB) - - - - - - - - - - - - - - - Código da Situação Tributária do IPI: -00-Entrada com recuperação de crédito -49 - Outras entradas -50-Saída tributada -99-Outras saídas - - - - - - - - - - - - - - - - Valor da BC do IPI - - - - - Alíquota do IPI - - - - - - - Quantidade total na unidade padrão para tributação - - - - - Valor por Unidade Tributável. Informar o valor do imposto Pauta por unidade de medida. - - - - - - - Valor do IPI - - - - - - - - - - - Código da Situação Tributária do IPI: -01-Entrada tributada com alíquota zero -02-Entrada isenta -03-Entrada não-tributada -04-Entrada imune -05-Entrada com suspensão -51-Saída tributada com alíquota zero -52-Saída isenta -53-Saída não-tributada -54-Saída imune -55-Saída com suspensão - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pytrustnfe/xml/schemas/leiauteNFe_v4.00.xsd b/pytrustnfe/xml/schemas/leiauteNFe_v4.00.xsd index f389699..8cde564 100755 --- a/pytrustnfe/xml/schemas/leiauteNFe_v4.00.xsd +++ b/pytrustnfe/xml/schemas/leiauteNFe_v4.00.xsd @@ -6,6 +6,9 @@ + + + @@ -871,8 +874,8 @@ Formato ”CFOP9999”. - - + + @@ -1583,7 +1586,8 @@ N-NormalVIN - Código de Produto da ANVISA. Utilizar o número do registro do produto da Câmara de Regulação do Mercado de Medicamento – CMED. + Utilizar o número do registro ANVISA +Obs.: Para medicamento isento de registro na ANVISA, utilizar o número da decisão que o isenta, como por exemplo o número da Resolução da Diretoria Colegiada da ANVISA (RDC). @@ -2500,7 +2504,7 @@ A exigência do preenchimento das informações do ICMS diferido fica à critér Aliquota suportada pelo consumidor final. - + Valor do ICMS ST retido anteriormente @@ -2523,6 +2527,30 @@ A exigência do preenchimento das informações do ICMS diferido fica à critér + + + + + + Percentual de redução da base de cálculo efetiva. + + + + + Valor da base de cálculo efetiva. + + + + + Alíquota do ICMS efetiva. + + + + + Valor do ICMS efetivo. + + + @@ -3375,7 +3403,32 @@ Operação interestadual para consumidor final com partilha do ICMS devido na o - + + + + + + Percentual de redução da base de cálculo efetiva. + + + + + Valor da base de cálculo efetiva. + + + + + Alíquota do ICMS efetiva. + + + + + Valor do ICMS efetivo. + + + + + @@ -4862,17 +4915,17 @@ Substituição Tributaria; - + Valor original da fatura - + Valor do desconto da fatura - + Valor líquido da fatura @@ -5391,7 +5444,7 @@ concessório - + @@ -5993,7 +6046,7 @@ alterado para tamanho variavel 1-4. (NT2011/004) - + diff --git a/pytrustnfe/xml/schemas/nfe_v3.10.xsd b/pytrustnfe/xml/schemas/nfe_v3.10.xsd deleted file mode 100755 index 9e435ee..0000000 --- a/pytrustnfe/xml/schemas/nfe_v3.10.xsd +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - Nota Fiscal Eletrônica - - - \ No newline at end of file diff --git a/pytrustnfe/xml/schemas/tiposBasico_v3.10.xsd b/pytrustnfe/xml/schemas/tiposBasico_v3.10.xsd deleted file mode 100755 index 1dfe7d0..0000000 --- a/pytrustnfe/xml/schemas/tiposBasico_v3.10.xsd +++ /dev/null @@ -1,571 +0,0 @@ - - - - - - Tipo Código da UF da tabela do IBGE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Código do Município da tabela do IBGE - - - - - - - - - Tipo Chave da Nota Fiscal Eletrônica - - - - - - - - - - Tipo Número do Protocolo de Status - - - - - - - - - - Tipo Número do Recibo do envio de lote de NF-e - - - - - - - - - - Tipo Código da Mensagem enviada - - - - - - - - - - Tipo Número do CNPJ - - - - - - - - - - Tipo Número do CNPJ tmanho varíavel (3-14) - - - - - - - - - - Tipo Número do CNPJ Opcional - - - - - - - - - - Tipo Número do CPF - - - - - - - - - - Tipo Número do CPF de tamanho variável (3-11) - - - - - - - - - - Tipo Decimal com até 2 dígitos inteiros, podendo ter de 1 até 4 decimais - - - - - - - - - Tipo Decimal com até 3 dígitos inteiros, podendo ter de 2 até 4 decimais - - - - - - - - - Tipo Decimal com até 3 dígitos inteiros e 2 até 4 decimais. Utilizados em TAGs opcionais, não aceita valor zero. - - - - - - - - - Tipo Decimal com 3 inteiros (no máximo 100), com 2 decimais - - - - - - - - - Tipo Decimal com 3 inteiros (no máximo 100), com até 4 decimais - - - - - - - - - Tipo Decimal com 8 inteiros, podendo ter de 1 até 3 decimais - - - - - - - - - Tipo Decimal com 11 inteiros, podendo ter 4 decimais - - - - - - - - - Tipo Decimal com 11 inteiros, podendo ter de 1 até 4 decimais - - - - - - - - - Tipo Decimal com 11 inteiros, podendo ter 4 decimais (utilizado em tags opcionais) - - - - - - - - - Tipo Decimal com 11 inteiros, podendo ter de 1 até 10 decimais - - - - - - - - - Tipo Decimal com 12 inteiros, podendo ter 3 decimais - - - - - - - - - Tipo Decimal com 12 inteiros e 4 decimais - - - - - - - - - Tipo Decimal com 12 inteiros de 1 até 4 decimais - - - - - - - - - Tipo Decimal com 12 inteiros com 1 até 4 decimais - - - - - - - - - Tipo Decimal com 12 inteiros, 1 a 4 decimais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais - - - - - - - - - Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais, utilizado em tags opcionais - - - - - - - - - Tipo Inscrição Estadual do Destinatário // alterado para aceitar vazio ou ISENTO - maio/2010 v2.0 - - - - - - - - - - Tipo Inscrição Estadual do Destinatário // alterado para aceitar vazio ou ISENTO - maio/2010 v2.0 - - - - - - - - - - Tipo Inscrição Estadual do ST // acrescentado EM 24/10/08 - - - - - - - - - - Tipo Inscrição Estadual do Emitente // alterado EM 24/10/08 para aceitar ISENTO - - - - - - - - - - Tipo Modelo Documento Fiscal - - - - - - - - - - Tipo Número do Documento Fiscal - - - - - - - - - Tipo Série do Documento Fiscal - - - - - - - - - Tipo Sigla da UF - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Sigla da UF de emissor // acrescentado em 24/10/08 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tipo Ambiente - - - - - - - - - - Tipo Versão do Aplicativo - - - - - - - - - Tipo Motivo - - - - - - - - - Tipo Justificativa - - - - - - - - - Tipo Serviço solicitado - - - - - - Tipo ano - - - - - - - - - Tipo temp médio em segundos - - - - - - - - - Tipo string genérico - - - - - - - - - Tipo data AAAA-MM-DD - - - - - - - - - Tipo hora HH:MM:SS // tipo acrescentado na v2.0 - - - - - - - - - Data e Hora, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm) - - - - - - - - - - - - - - - Tipo Código de orgão (UF da tabela do IBGE + 90 RFB) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/setup.py b/setup.py index 1b9f1da..1ee3af2 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.9.28" +VERSION = "0.9.29" setup( From 4691c28623f06bc285e4ea14cbef8f6590cf1350 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 31 Jul 2018 14:47:14 -0300 Subject: [PATCH 31/85] [IMP] Novo release da pytrusnfe3 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 1ee3af2..0d55083 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.9.29" +VERSION = "0.10.0" setup( From c9f71c9ea1a0acbbc521560672dc5c7296928c8f Mon Sep 17 00:00:00 2001 From: Johny Chen Jy <31947361+carcaroff@users.noreply.github.com> Date: Wed, 1 Aug 2018 18:07:40 -0300 Subject: [PATCH 32/85] New zeep version uses settings instead of options --- pytrustnfe/nfe/__init__.py | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index c067c83..3284169 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -159,7 +159,7 @@ def _send(certificado, method, **kwargs): port = next(iter(client.wsdl.port_types)) first_operation = next(iter(client.wsdl.port_types[port].operations)) - with client.options(raw_response=True): + with client.settings(raw_response=True): response = client.service[first_operation](xml) response, obj = sanitize_response(response.text) return { @@ -289,7 +289,7 @@ def consulta_distribuicao_nfe(certificado, **kwargs): port = next(iter(client.wsdl.port_types)) first_operation = next(iter(client.wsdl.port_types[port].operations)) - with client.options(raw_response=True): + with client.settings(raw_response=True): response = client.service[first_operation](nfeDadosMsg=xml, _soapheaders=[xml_um]) response, obj = sanitize_response(response.text) return { diff --git a/setup.py b/setup.py index 0d55083..cd5ab66 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.10.0" +VERSION = "0.10.1" setup( From bb5509c781975e57a82694939f13a0e4ec3c4947 Mon Sep 17 00:00:00 2001 From: Carlos Alberto Cipriano Korovsky Date: Thu, 2 Aug 2018 15:05:58 +0000 Subject: [PATCH 33/85] =?UTF-8?q?Corre=C3=A7=C3=A3o=20do=20n=C3=BAmero=20d?= =?UTF-8?q?e=20vers=C3=A3o=20da=20tag=20nfeProc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrigido: número de versão da tag nfeProc de 3.10 para 4.00. A versão incorreta gerava erro de validação da nota fiscal enviada aos clientes, conforme testes realizados no site "https://www.sefaz.rs.gov.br/nfe/NFE-VAL.aspx" Alterado: número de versão do pytrustnfe da versão 0.10.1 para 0.10.2 --- pytrustnfe/utils.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pytrustnfe/utils.py b/pytrustnfe/utils.py index 540fbb9..1c369d2 100644 --- a/pytrustnfe/utils.py +++ b/pytrustnfe/utils.py @@ -76,7 +76,7 @@ def _find_node(xml, node): def gerar_nfeproc(envio, recibo): NSMAP = {None: 'http://www.portalfiscal.inf.br/nfe'} - root = ET.Element("nfeProc", versao="3.10", nsmap=NSMAP) + root = ET.Element("nfeProc", versao="4.00", nsmap=NSMAP) parser = ET.XMLParser(encoding='utf-8') docEnvio = ET.fromstring(envio.encode('utf-8'), parser=parser) docRecibo = ET.fromstring(recibo.encode('utf-8'), parser=parser) diff --git a/setup.py b/setup.py index cd5ab66..3a582b5 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.10.1" +VERSION = "0.10.2" setup( From 79abb1798c8df9d024fa5ed412754f45ff488e74 Mon Sep 17 00:00:00 2001 From: Alyson Brito Date: Fri, 3 Aug 2018 09:49:13 -0300 Subject: [PATCH 34/85] Atualizada as urls dos servidores sefaz ce --- pytrustnfe/Servidores.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index ea570f1..931b5e1 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -336,23 +336,23 @@ UFBA = { UFCE = { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.ce.gov.br', - WS_NFE_AUTORIZACAO: 'nfe2/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfe2/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfe2/services/NfeConsulta2', - WS_NFE_SITUACAO: 'nfe2/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'nfe2/services/CadConsultaCadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/RecepcaoEvento', + WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4', + WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4', + WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4', + WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4', + WS_NFE_SITUACAO: 'nfe4/services/nfe4/services/NFeStatusServico4', + WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4', + WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfeh.sefaz.ce.gov.br', - WS_NFE_AUTORIZACAO: 'nfe2/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfe2/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfe2/services/NfeConsulta2', - WS_NFE_SITUACAO: 'nfe2/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'nfe2/services/CadConsultaCadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/RecepcaoEvento', + WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4', + WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4', + WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4', + WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4', + WS_NFE_SITUACAO: 'nfe4/services/nfe4/services/NFeStatusServico4', + WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4', + WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4', } } From 92c1191d8f8d9200692480e32348e399ea7c6a5f Mon Sep 17 00:00:00 2001 From: Alyson Brito Date: Fri, 3 Aug 2018 11:37:01 -0300 Subject: [PATCH 35/85] Revisado as urls da sefaz --- pytrustnfe/Servidores.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 931b5e1..a64b0b7 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -336,23 +336,23 @@ UFBA = { UFCE = { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.ce.gov.br', - WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4', - WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4', - WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4', - WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4', - WS_NFE_SITUACAO: 'nfe4/services/nfe4/services/NFeStatusServico4', - WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4', - WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4', + WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4?WSDL', + WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4?WSDL', + WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4?WSDL', + WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4?WSDL', + WS_NFE_SITUACAO: 'nfe4/services/NFeStatusServico4?WSDL', + WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4?WSDL', + WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4?WSDL', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfeh.sefaz.ce.gov.br', - WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4', - WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4', - WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4', - WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4', - WS_NFE_SITUACAO: 'nfe4/services/nfe4/services/NFeStatusServico4', - WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4', - WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4', + WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4?WSDL', + WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4?WSDL', + WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4?WSDL', + WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4?WSDL', + WS_NFE_SITUACAO: 'nfe4/services/NFeStatusServico4?WSDL', + WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4?WSDL', + WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4?WSDL', } } From 37506bd3ca8e64d3f1a154005e5a441169eef8d6 Mon Sep 17 00:00:00 2001 From: Alyson Brito Date: Fri, 3 Aug 2018 14:42:01 -0300 Subject: [PATCH 36/85] Incrementa a versao da biblioteca --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3a582b5..f094685 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.10.2" +VERSION = "0.10.3" setup( From 8c132a3bbb76c9bdcd600eb795dc2040e47ed8a7 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 6 Aug 2018 15:52:02 -0300 Subject: [PATCH 37/85] =?UTF-8?q?[FIX]=20Certifica=20que=20vamos=20usar=20?= =?UTF-8?q?a=20opera=C3=A7=C3=A3o=20correta=20ao=20enviar=20a=20NFE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/__init__.py | 28 ++-------------------------- setup.py | 2 +- 2 files changed, 3 insertions(+), 27 deletions(-) diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index 3284169..0f80937 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -38,26 +38,6 @@ def _generate_nfe_id(**kwargs): item['infNFe']['ide']['cDV'] = chave_nfe[len(chave_nfe) - 1:] -def _add_required_node(elemTree): - ns = elemTree.nsmap - if None in ns: - ns['ns'] = ns[None] - ns.pop(None) - - prods = elemTree.findall('ns:NFe/ns:infNFe/ns:det/ns:prod', namespaces=ns) - for prod in prods: - element = prod.find('ns:cEAN', namespaces=ns) - if element is None: - cEan = etree.Element('cEAN') - prod.insert(1, cEan) - element = prod.find('ns:cEANTrib', namespaces=ns) - if element is None: - cEANTrib = etree.Element('cEANTrib') - vProd = prod.find('ns:vProd', namespaces=ns) - prod.insert(prod.index(vProd) + 1, cEANTrib) - return elemTree - - def _add_qrCode(xml, **kwargs): xml = etree.fromstring(xml) inf_nfe = kwargs['NFes'][0]['infNFe'] @@ -114,11 +94,6 @@ def _render(certificado, method, sign, **kwargs): modelo = modelo.text if modelo is not None else '55' if sign: - # Caso for autorização temos que adicionar algumas tags tipo - # cEan, cEANTrib porque o governo sempre complica e não segue padrão - if method == 'NfeAutorizacao': - xmlElem_send = _add_required_node(xmlElem_send) - signer = Assinatura(certificado.pfx, certificado.password) if method == 'NfeInutilizacao': xml_send = signer.assina_xml(xmlElem_send, kwargs['obj']['id']) @@ -158,7 +133,8 @@ def _send(certificado, method, **kwargs): client = Client(base_url, transport=transport) port = next(iter(client.wsdl.port_types)) - first_operation = next(iter(client.wsdl.port_types[port].operations)) + first_operation = [x for x in iter( + client.wsdl.port_types[port].operations) if "Zip" not in x][0] with client.settings(raw_response=True): response = client.service[first_operation](xml) response, obj = sanitize_response(response.text) diff --git a/setup.py b/setup.py index f094685..a15e6cf 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.10.3" +VERSION = "0.10.4" setup( From 2e9d83568e3676f0298a6a7c425c61e6d2cbc45c Mon Sep 17 00:00:00 2001 From: Johny Chen Jy <31947361+carcaroff@users.noreply.github.com> Date: Tue, 7 Aug 2018 15:51:28 -0300 Subject: [PATCH 38/85] [FIX] Ajusta o danfe nos campos de frete e transportadora. --- pytrustnfe/nfe/danfe.py | 55 +++++++++++++++++++++++++++---------------------- setup.py | 2 +- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 63decf9..9cc0917 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -128,10 +128,13 @@ class danfe(object): self.nBottom = 8 self.nlin = self.nTop self.logo = logo - self.oFrete = {'0': '0 - Emitente', - '1': '1 - Destinatário', - '2': '2 - Terceiros', - '9': '9 - Sem Frete'} + self.oFrete = { + '0': '0 - Contratação por conta do Remetente (CIF)', + '1': '1 - Contratação por conta do Destinatário (FOB)', + '2': '2 - Contratação por conta de Terceiros', + '3': '3 - Transporte Próprio por conta do Remetente', + '4': '4 - Transporte Próprio por conta do Destinatário', + '9': '9 - Sem Ocorrência de Transporte'} self.oPDF_IO = BytesIO() if orientation == 'landscape': @@ -596,25 +599,26 @@ obsCont[@xCampo='NomeVendedor']") self.width - self.nLeft - self.nRight, 20) self.hline(self.nLeft, self.nlin + 8.6, self.width - self.nLeft) self.hline(self.nLeft, self.nlin + 15.2, self.width - self.nLeft) - self.vline(nMr - 40, self.nlin + 2, 13.2) - self.vline(nMr - 49, self.nlin + 2, 20) - self.vline(nMr - 92, self.nlin + 2, 6.6) - self.vline(nMr - 120, self.nlin + 2, 6.6) - self.vline(nMr - 75, self.nlin + 2, 6.6) + self.vline(nMr - 26, self.nlin + 2, 13.2) + self.vline(nMr - 33, self.nlin + 2, 13.2) + self.vline(nMr - 67, self.nlin + 2, 6.6) + self.vline(nMr - 123, self.nlin + 2, 6.6) + self.vline(nMr - 53, self.nlin + 2, 6.6) self.vline(nMr - 26, self.nlin + 15.2, 6.6) + self.vline(nMr - 49, self.nlin + 15.2, 6.6) self.vline(nMr - 102, self.nlin + 8.6, 6.6) self.vline(nMr - 85, self.nlin + 15.2, 6.6) self.vline(nMr - 121, self.nlin + 15.2, 6.6) self.vline(nMr - 160, self.nlin + 15.2, 6.6) # Labels/Fields - self.string(nMr - 39, self.nlin + 3.8, 'CNPJ/CPF') - self.string(nMr - 74, self.nlin + 3.8, 'PLACA DO VEÍCULO') - self.string(nMr - 91, self.nlin + 3.8, 'CÓDIGO ANTT') - self.string(nMr - 119, self.nlin + 3.8, 'FRETE POR CONTA') + self.string(nMr - 25, self.nlin + 3.8, 'CNPJ/CPF') + self.string(nMr - 52, self.nlin + 3.8, 'PLACA DO VEÍCULO') + self.string(nMr - 66, self.nlin + 3.8, 'CÓDIGO ANTT') + self.string(nMr - 122, self.nlin + 3.8, 'FRETE POR CONTA') self.string(self.nLeft + 1, self.nlin + 3.8, 'RAZÃO SOCIAL') - self.string(nMr - 48, self.nlin + 3.8, 'UF') - self.string(nMr - 39, self.nlin + 10.3, 'INSCRIÇÃO ESTADUAL') - self.string(nMr - 48, self.nlin + 10.3, 'UF') + self.string(nMr - 32, self.nlin + 3.8, 'UF') + self.string(nMr - 25, self.nlin + 10.3, 'INSCRIÇÃO ESTADUAL') + self.string(nMr - 32, self.nlin + 10.3, 'UF') self.string(nMr - 101, self.nlin + 10.3, 'MUNICÍPIO') self.string(self.nLeft + 1, self.nlin + 10.3, 'ENDEREÇO') self.string(nMr - 48, self.nlin + 17, 'PESO BRUTO') @@ -624,26 +628,27 @@ obsCont[@xCampo='NomeVendedor']") self.string(nMr - 159, self.nlin + 17, 'ESPÉCIE') self.string(self.nLeft + 1, self.nlin + 17, 'QUANTIDADE') # Conteúdo campos - self.canvas.setFont('NimbusSanL-Regu', 8) + self.canvas.setFont('NimbusSanL-Regu', 7) self.string(self.nLeft + 1, self.nlin + 7.7, - tagtext(oNode=el_transp, cTag='xNome')[:40]) - self.string(self.nLeft + 71, self.nlin + 7.7, + tagtext(oNode=el_transp, cTag='xNome')[:42]) + self.string(self.nLeft + 68, self.nlin + 7.7, self.oFrete[tagtext(oNode=el_transp, cTag='modFrete')]) - self.string(self.nLeft + 99, self.nlin + 7.7, + self.string(self.nLeft + 122, self.nlin + 7.7, tagtext(oNode=el_transp, cTag='RNTC')) - self.string(self.nLeft + 116, self.nlin + 7.7, + self.string(self.nLeft + 136, self.nlin + 7.7, tagtext(oNode=el_transp, cTag='placa')) - self.string(self.nLeft + 142, self.nlin + 7.7, + self.string(self.nLeft + 157, self.nlin + 7.7, tagtext(oNode=veic_transp, cTag='UF')) - self.string(nMr - 39, self.nlin + 7.7, + self.string(nMr - 25, self.nlin + 7.7, format_cnpj_cpf(tagtext(oNode=el_transp, cTag='CNPJ'))) + self.canvas.setFont('NimbusSanL-Regu', 8) self.string(self.nLeft + 1, self.nlin + 14.2, tagtext(oNode=el_transp, cTag='xEnder')[:45]) self.string(self.nLeft + 89, self.nlin + 14.2, tagtext(oNode=el_transp, cTag='xMun')) - self.string(nMr - 48, self.nlin + 14.2, + self.string(nMr - 32, self.nlin + 14.2, tagtext(oNode=el_transp, cTag='UF')) - self.string(nMr - 39, self.nlin + 14.2, + self.string(nMr - 25, self.nlin + 14.2, tagtext(oNode=el_transp, cTag='IE')) self.string(self.nLeft + 1, self.nlin + 21.2, tagtext(oNode=el_transp, cTag='qVol')) diff --git a/setup.py b/setup.py index a15e6cf..94b03ef 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.10.4" +VERSION = "0.10.5" setup( From de06defe5fd3304b343307b528261beeafcd1948 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 7 Aug 2018 20:01:46 -0300 Subject: [PATCH 39/85] =?UTF-8?q?[FIX]=20Realiza=20umas=20convers=C3=B5es?= =?UTF-8?q?=20de=20texto=20para=20evitar=20erros=20no=20Odoo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfse/floripa/__init__.py | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pytrustnfe/nfse/floripa/__init__.py b/pytrustnfe/nfse/floripa/__init__.py index a8282d3..817c430 100644 --- a/pytrustnfe/nfse/floripa/__init__.py +++ b/pytrustnfe/nfse/floripa/__init__.py @@ -74,10 +74,10 @@ def _send(certificado, method, **kwargs): "Authorization": "Bearer %s" % kwargs['access_token']} r = requests.post(url, headers=headers, data=xml_send) - response, obj = sanitize_response(r.text.strip().encode('utf-8')) + response, obj = sanitize_response(r.text.strip()) return { 'sent_xml': xml_send, - 'received_xml': response, + 'received_xml': response.encode('utf-8'), 'object': obj, 'status_code': r.status_code, } diff --git a/setup.py b/setup.py index 94b03ef..2bea4bc 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.10.5" +VERSION = "0.10.6" setup( From 17770982cc8648dc4437e1b845dfc98fb7614fea Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Wed, 8 Aug 2018 19:03:55 -0300 Subject: [PATCH 40/85] [IMP] Migrando restante das urls da nfe 4.0 --- .gitignore | 1 + pytrustnfe/Servidores.py | 336 ++++++++++++++++++++++------------------------- setup.py | 2 +- tests/test_servidores.py | 5 +- 4 files changed, 161 insertions(+), 183 deletions(-) diff --git a/.gitignore b/.gitignore index eff572b..ec09e70 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ dist/ docs/_build .vscode/tags .cache +.pytest_cache diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index a64b0b7..9e1ec27 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -167,84 +167,62 @@ SVRS = { } } -# TODO Daqui pra frente tem que revisar SVAN = { AMBIENTE_PRODUCAO: { 'servidor': 'www.sefazvirtual.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx', - WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx', + WS_NFE_INUTILIZACAO: 'NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', + WS_NFE_CONSULTA: 'NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'NFeStatusServico4/NFeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'hom.sefazvirtual.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx', - WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx', - } -} - -SCAN = { - AMBIENTE_PRODUCAO: { - 'servidor': 'www.scan.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx', - WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx' - }, - AMBIENTE_HOMOLOGACAO: { - 'servidor': 'hom.nfe.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx', - WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx' + WS_NFE_INUTILIZACAO: 'NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', + WS_NFE_CONSULTA: 'NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'NFeStatusServico4/NFeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa } } SVC_AN = { AMBIENTE_PRODUCAO: { 'servidor': 'www.svc.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx' + WS_NFE_CONSULTA: 'NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'NFeStatusServico4/NFeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa }, AMBIENTE_HOMOLOGACAO: { - 'servidor': 'hom.nfe.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx' + 'servidor': 'hom.svc.fazenda.gov.br', + WS_NFE_CONSULTA: 'NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'NFeStatusServico4/NFeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa } } SVC_RS = { AMBIENTE_PRODUCAO: { - 'servidor': 'nfe.sefazvirtual.rs.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + 'servidor': 'nfe.svrs.rs.gov.br', + WS_NFE_RECEPCAO_EVENTO: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', + WS_NFE_CONSULTA: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', }, AMBIENTE_HOMOLOGACAO: { - 'servidor': 'homologacao.nfe.sefazvirtual.rs.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + 'servidor': 'nfe-homologacao.svrs.rs.gov.br', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa } } @@ -253,13 +231,13 @@ AN = { 'servidor': 'www1.nfe.fazenda.gov.br', WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl', WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl', - WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'hom.nfe.fazenda.gov.br', WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl', WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl', - WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?Wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?Wsdl', # noqa }, } @@ -267,23 +245,23 @@ UFAM = { NFE_MODELO: { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.am.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'services2/services/NfeConsulta2', - WS_NFE_SITUACAO: 'services2/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2', + WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'services2/services/NfeConsulta4?wsdl', + WS_NFE_SITUACAO: 'services2/services/NfeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao4?wsdl', # noqa + WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2?wsdl', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'homnfe.sefaz.am.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'services2/services/NfeConsulta2', - WS_NFE_SITUACAO: 'services2/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2', + WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'services2/services/NfeConsulta4?wsdl', + WS_NFE_SITUACAO: 'services2/services/NfeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao4?wsdl', # noqa + WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2?wsdl', } }, NFCE_MODELO: { @@ -313,46 +291,46 @@ UFAM = { UFBA = { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.ba.gov.br', - 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', + WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', # noqa + WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', # noqa + WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', # noqa + WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', # noqa }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'hnfe.sefaz.ba.gov.br', - 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', + WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', # noqa + WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', # noqa + WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', # noqa + WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', # noqa } } UFCE = { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.ce.gov.br', - WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4?WSDL', - WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4?WSDL', - WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4?WSDL', - WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4?WSDL', - WS_NFE_SITUACAO: 'nfe4/services/NFeStatusServico4?WSDL', - WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4?WSDL', - WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4?WSDL', + WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe4/services/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4?wsdl', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfeh.sefaz.ce.gov.br', - WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4?WSDL', - WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4?WSDL', - WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4?WSDL', - WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4?WSDL', - WS_NFE_SITUACAO: 'nfe4/services/NFeStatusServico4?WSDL', - WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4?WSDL', - WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4?WSDL', + WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe4/services/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4?wsdl', } } @@ -384,46 +362,46 @@ UFGO = { UFMT = { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.mt.gov.br', - WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta2', - WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento', + WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta4?wsdl', + WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro4?wsdl', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'homologacao.sefaz.mt.gov.br', - WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta2', - WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento', + WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta4?wsdl', + WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/CadConsultaCadastro4?wsdl', + WS_NFE_AUTORIZACAO: 'nfews/v2/services/RecepcaoEvento4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro4?wsdl', } } UFMS = { AMBIENTE_PRODUCAO: { - 'servidor': 'nfe.fazenda.ms.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'producao/services2/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'producao/services2/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'producao/services2/NfeRetAutorizacao', - WS_NFE_CADASTRO: 'producao/services2/CadConsultaCadastro2', - WS_NFE_INUTILIZACAO: 'producao/services2/NfeInutilizacao2', - WS_NFE_CONSULTA: 'producao/services2/NfeConsulta2', - WS_NFE_SITUACAO: 'producao/services2/NfeStatusServico2', + 'servidor': 'nfe.sefaz.ms.gov.br', + WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'ws/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'ws/CadConsultaCadastro4?wsdl', }, AMBIENTE_HOMOLOGACAO: { - 'servidor': 'homologacao.nfe.ms.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'homologacao/services2/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'homologacao/services2/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'homologacao/services2/NfeRetAutorizacao', - WS_NFE_CADASTRO: 'homologacao/services2/CadConsultaCadastro2', - WS_NFE_INUTILIZACAO: 'homologacao/services2/NfeInutilizacao2', - WS_NFE_CONSULTA: 'homologacao/services2/NfeConsulta2', - WS_NFE_SITUACAO: 'homologacao/services2/NfeStatusServico2', + 'servidor': 'hom.nfe.sefaz.ms.gov.br', + WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'ws/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'ws/CadConsultaCadastro4?wsdl', } } @@ -453,47 +431,47 @@ UFMG = { UFPR = { AMBIENTE_PRODUCAO: { - 'servidor': 'nfe.fazenda.pr.gov.br', - WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao3', - WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao3', - WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao3', - WS_NFE_CONSULTA: 'nfe/NFeConsulta3', - WS_NFE_SITUACAO: 'nfe/NFeStatusServico3', - WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento', + 'servidor': 'nfe.sefa.pr.gov.br', + WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao4?wsdl ', + WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro4?wsdl', }, AMBIENTE_HOMOLOGACAO: { - 'servidor': 'homologacao.nfe.fazenda.pr.gov.br', - WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao3', - WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao3', - WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao3', - WS_NFE_CONSULTA: 'nfe/NFeConsulta3', - WS_NFE_SITUACAO: 'nfe/NFeStatusServico3', - WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento', + 'servidor': 'homologacao.nfe.sefa.pr.gov.br', + WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro4?wsdl', } } UFPE = { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.pe.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'nfe-service/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfe-service/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfe-service/services/NfeConsulta2', - WS_NFE_SITUACAO: 'nfe-service/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'nfe-service/services/CadConsultaCadastro2', + WS_NFE_INUTILIZACAO: 'nfe-service/services/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe-service/services/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe-service/services/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe-service/services/NFeAutorizacao4?Wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe-service/services/CadConsultaCadastro2?wsdl', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfehomolog.sefaz.pe.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'nfe-service/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfe-service/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfe-service/services/NfeConsulta2', - WS_NFE_SITUACAO: 'nfe-service/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'nfe-service/services/CadConsultaCadastro2', + WS_NFE_INUTILIZACAO: 'nfe-service/services/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe-service/services/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe-service/services/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe-service/services/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe-service/services/CadConsultaCadastro2?wsdl', } } @@ -502,23 +480,23 @@ UFRS = { NFE_MODELO: { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefazrs.rs.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', - WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', # noqa + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl', # noqa }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfe-homologacao.sefazrs.rs.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', - WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', # noqa + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', #noqa + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl', # noqa } }, NFCE_MODELO: { @@ -526,8 +504,8 @@ UFRS = { 'servidor': 'nfce.sefazrs.rs.gov.br', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', # noqa + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', # noqa WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', @@ -537,8 +515,8 @@ UFRS = { 'servidor': 'nfce-homologacao.sefazrs.rs.gov.br', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', # noqa + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', # noqa WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', diff --git a/setup.py b/setup.py index 2bea4bc..9f9c851 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.10.6" +VERSION = "1.0.0" setup( diff --git a/tests/test_servidores.py b/tests/test_servidores.py index 3a492df..a072f97 100644 --- a/tests/test_servidores.py +++ b/tests/test_servidores.py @@ -16,10 +16,9 @@ url_qrcode_homologacao_sp = 'https://homologacao.nfce.fazenda.sp.gov.br/NFCECons url_sc = 'https://nfe.svrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl' -url_rs = 'https://nfe.sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx' +url_rs = 'https://nfe.sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl' -url_cad_rs = 'https://cad.sefazrs.rs.gov.br/ws/cadconsultacadastro/cadcon\ -sultacadastro2.asmx' +url_cad_rs = 'https://cad.sefazrs.rs.gov.br/ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl' url_cad_sc = 'https://cad.svrs.rs.gov.br/ws/cadconsultacadastro/cadconsulta\ cadastro2.asmx?wsdl' From eea7fd74f430220bf1f36cb34579e7dd69b19718 Mon Sep 17 00:00:00 2001 From: carcaroff Date: Thu, 9 Aug 2018 20:10:54 -0300 Subject: [PATCH 41/85] nfse_mga minor changes in singnature, removed encode for byte type response and id on cancel template is now correct --- pytrustnfe/nfse/mga/__init__.py | 2 +- pytrustnfe/nfse/mga/assinatura.py | 2 +- pytrustnfe/nfse/mga/templates/CancelarNfse.xml | 4 ++-- setup.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pytrustnfe/nfse/mga/__init__.py b/pytrustnfe/nfse/mga/__init__.py index ee0cbbc..486b009 100644 --- a/pytrustnfe/nfse/mga/__init__.py +++ b/pytrustnfe/nfse/mga/__init__.py @@ -47,7 +47,7 @@ def _send(certificado, method, **kwargs): client = Client(base_url, transport=transport) response = client.service[method](xml_send) - response, obj = sanitize_response(response.encode('utf-8')) + response, obj = sanitize_response(response) return { 'sent_xml': str(xml_send), 'received_xml': str(response), diff --git a/pytrustnfe/nfse/mga/assinatura.py b/pytrustnfe/nfse/mga/assinatura.py index 3b302fe..aaa48fd 100644 --- a/pytrustnfe/nfse/mga/assinatura.py +++ b/pytrustnfe/nfse/mga/assinatura.py @@ -34,7 +34,7 @@ class Assinatura(object): signed_root = signer.sign( element_to_be_signed, key=key.encode(), cert=cert.encode()) if reference: - element_signed = signed_root.find(".//*[@Id='%s']" % reference) + element_signed = xml_element.find(".//*[@Id='%s']" % reference) signature = signed_root.find( ".//{http://www.w3.org/2000/09/xmldsig#}Signature") diff --git a/pytrustnfe/nfse/mga/templates/CancelarNfse.xml b/pytrustnfe/nfse/mga/templates/CancelarNfse.xml index 6c95398..46cdd74 100644 --- a/pytrustnfe/nfse/mga/templates/CancelarNfse.xml +++ b/pytrustnfe/nfse/mga/templates/CancelarNfse.xml @@ -1,6 +1,6 @@ - + - + {{ cancelamento.numero_nfse }} diff --git a/setup.py b/setup.py index 9f9c851..5cebe76 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.0" +VERSION = "1.0.1" setup( From 59457090e9d587de79975337a6f2f9ea544e1142 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 20 Aug 2018 11:03:10 -0300 Subject: [PATCH 42/85] =?UTF-8?q?[FIX]=20Ajusta=20os=20namespaces=20para?= =?UTF-8?q?=20envio=20de=20NFe=20no=20estado=20do=20PR=20A=20biblioteca=20?= =?UTF-8?q?ZEEP=20remove=20namespaces=20duplicadas.=20O=20estado=20do=20PR?= =?UTF-8?q?=20exige=20a=20mesma=20namespace=20em=20duas=20tags,=20devemos?= =?UTF-8?q?=20adicionar=20a=20mesma=20na=20tag=20NFe=20antes=20do=20envio?= =?UTF-8?q?=20ao=20sefaz=20Paran=C3=A1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/__init__.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index 0f80937..72786b7 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -135,6 +135,11 @@ def _send(certificado, method, **kwargs): port = next(iter(client.wsdl.port_types)) first_operation = [x for x in iter( client.wsdl.port_types[port].operations) if "Zip" not in x][0] + + namespaceNFe = xml.find(".//{http://www.portalfiscal.inf.br/nfe}NFe") + if namespaceNFe is not None: + namespaceNFe.set('xmlns', 'http://www.portalfiscal.inf.br/nfe') + with client.settings(raw_response=True): response = client.service[first_operation](xml) response, obj = sanitize_response(response.text) From 0a1539ce1a3c422c0226c83e9ee3be407903f05f Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 20 Aug 2018 11:05:18 -0300 Subject: [PATCH 43/85] [FIX] Corrige urls do MT --- pytrustnfe/Servidores.py | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 9e1ec27..2d4763a 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -375,8 +375,8 @@ UFMT = { WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao4?wsdl', WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta4?wsdl', WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico4?wsdl', - WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/CadConsultaCadastro4?wsdl', - WS_NFE_AUTORIZACAO: 'nfews/v2/services/RecepcaoEvento4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao4?wsdl', WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao4?wsdl', WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro4?wsdl', } diff --git a/setup.py b/setup.py index 5cebe76..ad9a6a1 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.1" +VERSION = "1.0.2" setup( From aafb2cf92a6ffc61c67acc655dd116a9afaf8776 Mon Sep 17 00:00:00 2001 From: Johny Chen Jy Date: Mon, 27 Aug 2018 14:56:58 -0300 Subject: [PATCH 44/85] DSF - xml decode and url fix (#171) * [WIP]NFS-e DSF * [WIP]NFS-e url * Update setup.py --- pytrustnfe/nfse/dsf/__init__.py | 14 +++++++------- pytrustnfe/nfse/dsf/templates/enviar.xml | 24 ++++++++---------------- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/pytrustnfe/nfse/dsf/__init__.py b/pytrustnfe/nfse/dsf/__init__.py index df4ce4a..ecca317 100644 --- a/pytrustnfe/nfse/dsf/__init__.py +++ b/pytrustnfe/nfse/dsf/__init__.py @@ -20,8 +20,7 @@ def _render(certificado, method, **kwargs): if type(xml_send) != str: xml_send = etree.tostring(xml_send) - - return xml_send + return xml_send.decode() def _get_url(**kwargs): @@ -33,17 +32,18 @@ def _get_url(**kwargs): urls = { # Belém - PA - '2715': 'http://www.issdigitalbel.com.br/WsNFe2/LoteRps.jws', + '2715': 'http://www.issdigitalbel.com.br/WsNFe2/LoteRps.jws?wsdl', # Sorocaba - SP - '7145': 'http://issdigital.sorocaba.sp.gov.br/WsNFe2/LoteRps.jws', + '7145': 'http://issdigital.sorocaba.sp.gov.br/WsNFe2/LoteRps.jws?wsdl', # Teresina - PI - '1219': 'http://www.issdigitalthe.com.br/WsNFe2/LoteRps.jws', + '1219': 'http://www.issdigitalthe.com.br/WsNFe2/LoteRps.jws?wsdl', # Campinas - SP '6291': 'http://issdigital.campinas.sp.gov.br/WsNFe2/LoteRps.jws?wsdl', # Uberlandia - MG - '5403': 'http://udigital.uberlandia.mg.gov.br/WsNFe2/LoteRps.jws', + '5403': 'http://udigital.uberlandia.mg.gov.br/WsNFe2/LoteRps.jws?wsdl', # São Luis - MA - '0921': 'https://stm.semfaz.saoluis.ma.gov.br/WsNFe2/LoteRps?wsdl', + '0921': + 'http://sistemas.semfaz.saoluis.ma.gov.br/WsNFe2/LoteRps.jws?wsdl', # Campo Grande - MS '2729': 'http://issdigital.pmcg.ms.gov.br/WsNFe2/LoteRps.jws?wsdl', } diff --git a/pytrustnfe/nfse/dsf/templates/enviar.xml b/pytrustnfe/nfse/dsf/templates/enviar.xml index 7e4b178..8ced990 100644 --- a/pytrustnfe/nfse/dsf/templates/enviar.xml +++ b/pytrustnfe/nfse/dsf/templates/enviar.xml @@ -18,14 +18,12 @@ {% for rps in nfse.lista_rps -%} {{ rps.assinatura }} - {{ rps.prestador.inscricao_municipal }} - + {{ rps.prestador.inscricao_municipal }} {{ rps.prestador.razao_social }} RPS {{ rps.serie }} {{ rps.numero }} - {{ rps.data_emissao|format_datetime }} - + {{ rps.data_emissao|format_datetime }} {{ rps.situacao }} 0 @@ -34,27 +32,21 @@ {{ rps.serie_prestacao }} {{ rps.tomador.inscricao_municipal }} {{ rps.tomador.cpf_cnpj }} - {{ rps.tomador.razao_social }} - - {{ rps.tomador.tipo_logradouro }} - + {{ rps.tomador.razao_social }} + {{ rps.tomador.tipo_logradouro }} {{ rps.tomador.logradouro }} - {{ rps.tomador.numero }} - + {{ rps.tomador.numero }} {{ rps.tomador.tipo_bairro }} {{ rps.tomador.bairro }} {{ rps.tomador.cidade }} - {{ rps.tomador.cidade_descricao }} - + {{ rps.tomador.cidade_descricao }} {{ rps.tomador.cep }} {{ rps.tomador.email }} {{ rps.codigo_atividade }} {{ rps.aliquota_atividade }} {{ rps.tipo_recolhimento }} - {{ rps.municipio_prestacao }} - - {{ rps.municipio_descricao_prestacao }} - + {{ rps.municipio_prestacao }} + {{ rps.municipio_prestacao_descricao }} {{ rps.operacao }} {{ rps.tributacao }} {{ rps.valor_pis }} From 260a7e5add3133e8c48159b08e282807dd29d8a2 Mon Sep 17 00:00:00 2001 From: Johny Chen Jy Date: Wed, 29 Aug 2018 15:35:34 -0300 Subject: [PATCH 45/85] [11.0][IMP]different method to compute lines per page (#172) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adicionando mais espaço para as linhas de produtos --- pytrustnfe/nfe/danfe.py | 58 +++++++++++++++++++++++-------------------------- setup.py | 2 +- 2 files changed, 28 insertions(+), 32 deletions(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 9cc0917..96b6b0d 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -6,6 +6,7 @@ import os from io import BytesIO from textwrap import wrap +import math from reportlab.lib import utils from reportlab.pdfgen import canvas @@ -40,7 +41,6 @@ def format_cnpj_cpf(value): def getdateByTimezone(cDateUTC, timezone=None): - ''' Esse método trata a data recebida de acordo com o timezone do usuário. O seu retorno é dividido em duas partes: @@ -153,16 +153,15 @@ class danfe(object): self.NrPages = 1 self.Page = 1 - # Calculando total linhas usadas para descrições dos itens - # Com bloco fatura, apenas 25 linhas para itens na primeira folha - nNr_Lin_Pg_1 = 30 if oXML_cobr is None else 26 - # [ rec_ini , rec_fim , lines , limit_lines ] - oPaginator = [[0, 0, 0, nNr_Lin_Pg_1]] el_det = oXML.findall(".//{http://www.portalfiscal.inf.br/nfe}det") + + # Declaring variable to prevent future errors + nId = 0 + if el_det is not None: list_desc = [] list_cod_prod = [] - nPg = 0 + for nId, item in enumerate(el_det): el_prod = item.find( ".//{http://www.portalfiscal.inf.br/nfe}prod") @@ -177,21 +176,9 @@ class danfe(object): list_cProd = wrap(tagtext(oNode=el_prod, cTag='cProd'), 14) list_cod_prod.append(list_cProd) - # Nr linhas necessárias p/ descrição item - nLin_Itens = len(list_) - - if (oPaginator[nPg][2] + nLin_Itens) >= oPaginator[nPg][3]: - oPaginator.append([0, 0, 0, 77]) - nPg += 1 - oPaginator[nPg][0] = nId - oPaginator[nPg][1] = nId + 1 - oPaginator[nPg][2] = nLin_Itens - else: - # adiciona-se 1 pelo funcionamento de xrange - oPaginator[nPg][1] = nId + 1 - oPaginator[nPg][2] += nLin_Itens - - self.NrPages = len(oPaginator) # Calculando nr. páginas + # Calculando nr. aprox. de páginas + if nId > 25: + self.NrPages += math.ceil((nId - 25) / 70) if recibo: self.recibo_entrega(oXML=oXML, timezone=timezone) @@ -204,18 +191,21 @@ class danfe(object): self.impostos(oXML=oXML) self.transportes(oXML=oXML) - self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPaginator[0], - list_desc=list_desc, list_cod_prod=list_cod_prod) + index = self.produtos( + oXML=oXML, el_det=el_det, max_index=nId, + list_desc=list_desc, list_cod_prod=list_cod_prod) self.adicionais(oXML=oXML) # Gera o restante das páginas do XML - for oPag in oPaginator[1:]: + while index < nId: self.newpage() self.ide_emit(oXML=oXML, timezone=timezone) - self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPag, - list_desc=list_desc, nHeight=77, - list_cod_prod=list_cod_prod) + index = self.produtos( + oXML=oXML, el_det=el_det, index=index, + max_index=nId, + list_desc=list_desc, nHeight=77, + list_cod_prod=list_cod_prod) self.newpage() if cce_xml: @@ -326,7 +316,7 @@ class danfe(object): P = Paragraph(tagtext(oNode=elem_emit, cTag='xNome'), styleN) w, h = P.wrap(55 * mm, 40 * mm) P.drawOn(self.canvas, (self.nLeft + 30) * mm, - (self.height - self.nlin - ((4.3*h + 12)/12)) * mm) + (self.height - self.nlin - ((4.3 * h + 12) / 12)) * mm) if self.logo: img = get_image(self.logo, width=2 * cm) @@ -667,7 +657,7 @@ obsCont[@xCampo='NomeVendedor']") self.nlin += 23 - def produtos(self, oXML=None, el_det=None, oPaginator=None, + def produtos(self, oXML=None, el_det=None, index=0, max_index=0, list_desc=None, list_cod_prod=None, nHeight=29): nMr = self.width - self.nRight @@ -721,7 +711,11 @@ obsCont[@xCampo='NomeVendedor']") self.canvas.setFont('NimbusSanL-Regu', 5) nLin = self.nlin + 10.5 - for id in range(oPaginator[0], oPaginator[1]): + for id in range(index, max_index + 1): + + if nLin > 242: + break + item = el_det[id] el_prod = item.find(".//{http://www.portalfiscal.inf.br/nfe}prod") el_imp = item.find( @@ -781,6 +775,7 @@ obsCont[@xCampo='NomeVendedor']") self.canvas.setStrokeColor(black) self.nlin += nH + 3 + return id def adicionais(self, oXML=None): el_infAdic = oXML.find( @@ -989,3 +984,4 @@ obsCont[@xCampo='NomeVendedor']") paragraph = Paragraph(ptext, style=style) w, h = paragraph.wrapOn(self.canvas, x, y) return w, h, paragraph + diff --git a/setup.py b/setup.py index ad9a6a1..97e5aa1 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.2" +VERSION = "1.0.3" setup( From 13a59b61b6756c62dae513aedc40df28d952a046 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 3 Sep 2018 13:28:34 -0300 Subject: [PATCH 46/85] [FIX] Compare the operation name in lower case --- pytrustnfe/nfe/__init__.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index 72786b7..9a0d068 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -134,7 +134,7 @@ def _send(certificado, method, **kwargs): port = next(iter(client.wsdl.port_types)) first_operation = [x for x in iter( - client.wsdl.port_types[port].operations) if "Zip" not in x][0] + client.wsdl.port_types[port].operations) if "zip" not in x.lower()][0] namespaceNFe = xml.find(".//{http://www.portalfiscal.inf.br/nfe}NFe") if namespaceNFe is not None: diff --git a/setup.py b/setup.py index 97e5aa1..e0c8dde 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.3" +VERSION = "1.0.4" setup( From 95e3e5710c91cb1730353e2ce541886bf4acdcf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Mon, 10 Sep 2018 21:22:58 +0000 Subject: [PATCH 47/85] =?UTF-8?q?Corrige=20webservice=20de=20retorno=20de?= =?UTF-8?q?=20autoriza=C3=A7=C3=A3o=20do=20Paran=C3=A1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + pytrustnfe/Servidores.py | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index ec09e70..f956822 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ docs/_build .vscode/tags .cache .pytest_cache +.vscode/ diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 2d4763a..d2c2286 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -437,7 +437,7 @@ UFPR = { WS_NFE_SITUACAO: 'nfe/NFeStatusServico4?wsdl', WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento4?wsdl', WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao4?wsdl', - WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao4?wsdl ', + WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao4?wsdl', WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro4?wsdl', }, AMBIENTE_HOMOLOGACAO: { diff --git a/setup.py b/setup.py index e0c8dde..8cceb82 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.4" +VERSION = "1.0.5" setup( From 3c5e8cd24c4d07c8983e908be88ad202b98ae280 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 18 Sep 2018 16:20:06 -0300 Subject: [PATCH 48/85] [FIX] Try to fix strange with spaces in some eletronic documents --- pytrustnfe/xml/__init__.py | 7 +++---- setup.py | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pytrustnfe/xml/__init__.py b/pytrustnfe/xml/__init__.py index fd870a2..853050a 100644 --- a/pytrustnfe/xml/__init__.py +++ b/pytrustnfe/xml/__init__.py @@ -19,7 +19,6 @@ def render_xml(path, template_name, remove_empty, **nfe): nfe = recursively_normalize(nfe) env = Environment( loader=FileSystemLoader(path), extensions=['jinja2.ext.with_']) - env.filters["normalize"] = filters.strip_line_feed env.filters["normalize_str"] = filters.normalize_str env.filters["format_percent"] = filters.format_percent @@ -32,6 +31,9 @@ def render_xml(path, template_name, remove_empty, **nfe): parser = etree.XMLParser(remove_blank_text=True, remove_comments=True, strip_cdata=False) root = etree.fromstring(xml, parser=parser) + for element in root.iter("*"): # remove espaços em branco + if element.text is not None and not element.text.strip(): + element.text = None if remove_empty: context = etree.iterwalk(root) for dummy, elem in context: @@ -39,9 +41,6 @@ def render_xml(path, template_name, remove_empty, **nfe): if recursively_empty(elem): parent.remove(elem) return root - for element in root.iter("*"): # remove espaços em branco - if element.text is not None and not element.text.strip(): - element.text = None return etree.tostring(root, encoding=str) diff --git a/setup.py b/setup.py index 8cceb82..49a7a00 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.5" +VERSION = "1.0.6" setup( From 43289e84c1d6e6473768d8af4fb847d14698efc9 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 18 Sep 2018 18:56:37 -0300 Subject: [PATCH 49/85] =?UTF-8?q?[FIX]=20Percentuais=20de=20tributa=C3=A7?= =?UTF-8?q?=C3=A3o=20para=20nota=20paulistana?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfse/paulistana/templates/EnvioLoteRPS.xml | 2 ++ pytrustnfe/nfse/paulistana/templates/EnvioRPS.xml | 2 ++ setup.py | 2 +- tests/XMLs/paulistana_signature.xml | 10 +++++----- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/pytrustnfe/nfse/paulistana/templates/EnvioLoteRPS.xml b/pytrustnfe/nfse/paulistana/templates/EnvioLoteRPS.xml index 8e9f34d..23eb9e7 100644 --- a/pytrustnfe/nfse/paulistana/templates/EnvioLoteRPS.xml +++ b/pytrustnfe/nfse/paulistana/templates/EnvioLoteRPS.xml @@ -55,6 +55,8 @@ {{ rps.tomador.cep }} {{ rps.descricao|normalize|escape }} + {{ rps.valor_carga_tributaria }} + {{ rps.fonte_carga_tributaria }} {% endfor %} diff --git a/pytrustnfe/nfse/paulistana/templates/EnvioRPS.xml b/pytrustnfe/nfse/paulistana/templates/EnvioRPS.xml index d828534..ae35893 100644 --- a/pytrustnfe/nfse/paulistana/templates/EnvioRPS.xml +++ b/pytrustnfe/nfse/paulistana/templates/EnvioRPS.xml @@ -46,6 +46,8 @@ {{ rps.tomador.cep }} {{ rps.descricao }} + {{ rps.valor_carga_tributaria }} + {{ rps.fonte_carga_tributaria }} {% endfor %}
diff --git a/setup.py b/setup.py index 49a7a00..457526a 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.6" +VERSION = "1.0.7" setup( diff --git a/tests/XMLs/paulistana_signature.xml b/tests/XMLs/paulistana_signature.xml index c4f8cbc..70d26dc 100644 --- a/tests/XMLs/paulistana_signature.xml +++ b/tests/XMLs/paulistana_signature.xml @@ -1,4 +1,4 @@ -12345678901234false2016-08-292016-08-291E4fpHYkQa7Naxn6IKGb7NwwZu5tPk/KXJ9hCwtZgq0xvKS450aQqqBL+7Iv46lTgqrSMu7+gLrl+LC1qs/8aT2mbHE8uaVFSbzwZ+sF/BkcT6nsFHLMswEiTAEs95Jb7hN1cC91xqQGRH4buw0TzxHKmhuLJ22WwtG/scxyKtjM=12345611RPS2016-08-29NT0.000.000.000.000.00074985.00false123456Trustcode1Vinicius de Moraes, 4242CorregoFloripaSC88037240Venda de servico +12345678901234false2016-08-292016-08-291E4fpHYkQa7Naxn6IKGb7NwwZu5tPk/KXJ9hCwtZgq0xvKS450aQqqBL+7Iv46lTgqrSMu7+gLrl+LC1qs/8aT2mbHE8uaVFSbzwZ+sF/BkcT6nsFHLMswEiTAEs95Jb7hN1cC91xqQGRH4buw0TzxHKmhuLJ22WwtG/scxyKtjM=12345611RPS2016-08-29NT0.000.000.000.000.00074985.00false123456Trustcode1Vinicius de Moraes, 4242CorregoFloripaSC88037240Venda de servico @@ -8,12 +8,12 @@ -ePJnD6hyDvlJo08PFX8h2TXk0ZM= +IAh8GGlbp/Tnqma+2RZ7UrGZhTc= -GbaQaTEtxuKdRRaadginWPFH5K65ywqEikkwChWO3xX5Kglq8RPm4+LjnpJmuTcE -9I2BVon3GJFh+c/6RKzJPose6FXog2xnCpTOgwA/rks/gKsUAaRlXCPsLcKMKaOj -3eH21RHEyrxBAbdpEUdlEgQWaWzmGq009EiQ544sD6c= +gjkMTCq0uuaX8tkRBlLjgybn8a2O4Axl6HHq1MN8nnEMliERcziU3pa3r1jbghlE +EUyIO8bTZ0V7c05pQvHQgVUHcSo6vHld4ZQNk7JfMfmpez4uxrUeuSrSqSLCwT9W +NmTY9EJ16GyrQNELw+SkYuEFOvqZTU3qjDZkLddQ8bc= MIICMTCCAZqgAwIBAgIQfYOsIEVuAJ1FwwcTrY0t1DANBgkqhkiG9w0BAQUFADBX From 21994c73e8be6cdd69991892cddd68a0f517748b Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 24 Sep 2018 19:31:51 -0300 Subject: [PATCH 50/85] =?UTF-8?q?[FIX]=20Removendo=20previamente=20os=20es?= =?UTF-8?q?pa=C3=A7os=20resolve=20o=20problema?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/xml/__init__.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pytrustnfe/xml/__init__.py b/pytrustnfe/xml/__init__.py index 853050a..6f60020 100644 --- a/pytrustnfe/xml/__init__.py +++ b/pytrustnfe/xml/__init__.py @@ -27,7 +27,7 @@ def render_xml(path, template_name, remove_empty, **nfe): env.filters["comma"] = filters.format_with_comma template = env.get_template(template_name) - xml = template.render(**nfe) + xml = template.render(**nfe).replace('\n', '') parser = etree.XMLParser(remove_blank_text=True, remove_comments=True, strip_cdata=False) root = etree.fromstring(xml, parser=parser) diff --git a/setup.py b/setup.py index 457526a..cf26c27 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.7" +VERSION = "1.0.8" setup( From 7f5fe48999e5e7944a4d8c4dec3c8c9b6ca34f0b Mon Sep 17 00:00:00 2001 From: carcaroff Date: Tue, 25 Sep 2018 15:43:43 -0300 Subject: [PATCH 51/85] thousandseparator added to monetary fields --- pytrustnfe/nfe/danfe.py | 6 ++++-- setup.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 96b6b0d..99059b6 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -80,6 +80,8 @@ def getdateByTimezone(cDateUTC, timezone=None): def format_number(cNumber): if cNumber: + # Vírgula para a separação de milhar e 2f para 2 casas decimais + value = "{:,.2f}".format(float(cNumber)) return cNumber.replace(",", "X").replace(".", ",").replace("X", ".") return "" @@ -746,8 +748,8 @@ obsCont[@xCampo='NomeVendedor']") tagtext(oNode=el_prod, cTag='qCom'))) self.stringRight(nMr - 64.5, nLin, format_number( tagtext(oNode=el_prod, cTag='vUnCom'))) - self.stringRight(nMr - 50.5, nLin, - tagtext(oNode=el_prod, cTag='vProd')) + self.stringRight(nMr - 50.5, nLin, format_number( + tagtext(oNode=el_prod, cTag='vProd'))) self.stringRight(nMr - 38.5, nLin, format_number(vBC)) self.stringRight(nMr - 26.5, nLin, format_number(vICMS)) self.stringRight(nMr - 7.5, nLin, format_number(pICMS)) diff --git a/setup.py b/setup.py index cf26c27..66cbfae 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.8" +VERSION = "1.0.9" setup( From 0c12982197181058ea870a4aaa3cde9d294a8b30 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 2 Oct 2018 10:58:46 -0300 Subject: [PATCH 52/85] [FIX] Assign the correct variable when addin thousand separator --- pytrustnfe/nfe/danfe.py | 5 ++--- setup.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 99059b6..00c500e 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -80,8 +80,8 @@ def getdateByTimezone(cDateUTC, timezone=None): def format_number(cNumber): if cNumber: - # Vírgula para a separação de milhar e 2f para 2 casas decimais - value = "{:,.2f}".format(float(cNumber)) + # Vírgula para a separação de milhar e 2f para 2 casas decimais + cNumber = "{:,.2f}".format(float(cNumber)) return cNumber.replace(",", "X").replace(".", ",").replace("X", ".") return "" @@ -986,4 +986,3 @@ obsCont[@xCampo='NomeVendedor']") paragraph = Paragraph(ptext, style=style) w, h = paragraph.wrapOn(self.canvas, x, y) return w, h, paragraph - diff --git a/setup.py b/setup.py index 66cbfae..e22686c 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.9" +VERSION = "1.0.10" setup( From 4f3da1a0751a313d4e7e10721adbea13f5820fb6 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 2 Oct 2018 17:16:40 -0300 Subject: [PATCH 53/85] [IMP] Fixing the fields for service invoices and danfe --- pytrustnfe/nfe/danfe.py | 51 +++++++++++-- pytrustnfe/nfe/templates/NfeAutorizacao.xml | 106 ++++++++++++++-------------- setup.py | 2 +- 3 files changed, 102 insertions(+), 57 deletions(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 00c500e..12c30a7 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -197,7 +197,8 @@ class danfe(object): oXML=oXML, el_det=el_det, max_index=nId, list_desc=list_desc, list_cod_prod=list_cod_prod) - self.adicionais(oXML=oXML) + tamanho_ocupado = self.calculo_issqn(oXML=oXML) + self.adicionais(oXML=oXML, tamanho_diminuir=tamanho_ocupado) # Gera o restante das páginas do XML while index < nId: @@ -779,7 +780,49 @@ obsCont[@xCampo='NomeVendedor']") self.nlin += nH + 3 return id - def adicionais(self, oXML=None): + def calculo_issqn(self, oXML=None): + elem_emit = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}emit") + el_total = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}total") + issqn_total = el_total.find( + ".//{http://www.portalfiscal.inf.br/nfe}ISSQNtot") + if not issqn_total: + return 0 + + self.nlin += 1 + nMr = self.width - self.nRight + self.canvas.setFont('NimbusSanL-Bold', 7) + self.string(self.nLeft + 1, self.nlin + 1, 'CÁLCULO DO ISSQN') + self.rect(self.nLeft, self.nlin + 2, + self.width - self.nLeft - self.nRight, 5.5) + self.vline(nMr - 47.5, self.nlin + 2, 5.5) + self.vline(nMr - 95, self.nlin + 2, 5.5) + self.vline(nMr - 142.5, self.nlin + 2, 5.5) + self.vline(nMr - 190, self.nlin + 2, 5.5) + # Labels + self.canvas.setFont('NimbusSanL-Regu', 5) + self.string(self.nLeft + 1, self.nlin + 3.8, 'INSCRIÇÃO MUNICIPAL') + self.string(nMr - 141.5, self.nlin + 3.8, 'VALOR TOTAL DOS SERVIÇOS') + self.string(nMr - 94, self.nlin + 3.8, 'BASE DE CÁLCULO DO ISSQN') + self.string(nMr - 46.5, self.nlin + 3.8, 'VALOR DO ISSQN') + # Conteúdo campos + self.canvas.setFont('NimbusSanL-Regu', 8) + self.string( + self.nLeft + 1, self.nlin + 6.7, + tagtext(oNode=elem_emit, cTag='IM')) + self.stringRight( + self.nLeft + 94, self.nlin + 6.7, + format_number(tagtext(oNode=issqn_total, cTag='vServ'))) + self.stringRight( + self.nLeft + 141.5, self.nlin + 6.7, + format_number(tagtext(oNode=issqn_total, cTag='vBC'))) + self.stringRight( + self.nLeft + 189, self.nlin + 6.7, + format_number(tagtext(oNode=issqn_total, cTag='vISS'))) + + self.nlin += 8 # Nr linhas ocupadas pelo bloco + return 8 + + def adicionais(self, oXML=None, tamanho_diminuir=0): el_infAdic = oXML.find( ".//{http://www.portalfiscal.inf.br/nfe}infAdic") @@ -791,8 +834,8 @@ obsCont[@xCampo='NomeVendedor']") 'INFORMAÇÕES COMPLEMENTARES') self.string((self.width / 2) + 1, self.nlin + 4, 'RESERVADO AO FISCO') self.rect(self.nLeft, self.nlin + 2, - self.width - self.nLeft - self.nRight, 42) - self.vline(self.width / 2, self.nlin + 2, 42) + self.width - self.nLeft - self.nRight, 42 - tamanho_diminuir) + self.vline(self.width / 2, self.nlin + 2, 42 - tamanho_diminuir) # Conteúdo campos styles = getSampleStyleSheet() styleN = styles['Normal'] diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml index bf1cc8b..1a616a0 100644 --- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml +++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml @@ -266,6 +266,7 @@ {% with imposto = det.imposto %} {{ imposto.vTotTrib }} + {% if imposto.ICMS is defined %} {% if imposto.ICMS.CST == '00' -%} @@ -529,37 +530,58 @@ {% endif %} - {% if NFe.infNFe.ide.mod != '65' %} - - {{ imposto.IPI.clEnq }} - {{ imposto.IPI.CNPJProd }} - {{ imposto.IPI.cSelo }} - {{ imposto.IPI.qSelo }} - {{ imposto.IPI.cEnq }} - {% if imposto.IPI.CST in ('00', '49', '50', '99') %} - - {{ imposto.IPI.CST }} - {{ imposto.IPI.vBC }} - {{ imposto.IPI.pIPI }} - {{ imposto.IPI.qUnid }} - {{ imposto.IPI.vUnid }} - {{ imposto.IPI.vIPI }} - - {% endif %} - {% if imposto.IPI.CST in ('01', '02', '03', '04', '51', '52', '53', '54', '55') %} - - {{ imposto.IPI.CST }} - - {% endif %} - - {% if imposto.II is defined %} - - {{ imposto.II.vBC }} - {{ imposto.II.vDespAdu }} - {{ imposto.II.vII }} - {{ imposto.II.vIOF }} - {% endif %} + {% if NFe.infNFe.ide.mod != '65' and imposto.IPI is defined %} + + {{ imposto.IPI.clEnq }} + {{ imposto.IPI.CNPJProd }} + {{ imposto.IPI.cSelo }} + {{ imposto.IPI.qSelo }} + {{ imposto.IPI.cEnq }} + {% if imposto.IPI.CST in ('00', '49', '50', '99') %} + + {{ imposto.IPI.CST }} + {{ imposto.IPI.vBC }} + {{ imposto.IPI.pIPI }} + {{ imposto.IPI.qUnid }} + {{ imposto.IPI.vUnid }} + {{ imposto.IPI.vIPI }} + + {% endif %} + {% if imposto.IPI.CST in ('01', '02', '03', '04', '51', '52', '53', '54', '55') %} + + {{ imposto.IPI.CST }} + + {% endif %} + + {% if imposto.II is defined %} + + {{ imposto.II.vBC }} + {{ imposto.II.vDespAdu }} + {{ imposto.II.vII }} + {{ imposto.II.vIOF }} + + {% endif %} + {% endif %} + {% if imposto.ISSQN is defined %} + + {{ imposto.ISSQN.vBC }} + {{ imposto.ISSQN.vAliq }} + {{ imposto.ISSQN.vISSQN }} + {{ imposto.ISSQN.cMunFG }} + {{ imposto.ISSQN.cListServ }} + {{ imposto.ISSQN.vDeducao }} + {{ imposto.ISSQN.vOutro }} + {{ imposto.ISSQN.vDescIncond }} + {{ imposto.ISSQN.vDescCond }} + {{ imposto.ISSQN.vDeducao }} + {{ imposto.ISSQN.indISS }} + {{ imposto.ISSQN.cServico }} + {{ imposto.ISSQN.cMun }} + {{ imposto.ISSQN.cPais }} + {{ imposto.ISSQN.nProcesso }} + {{ imposto.ISSQN.indIncentivo }} + {% endif %} {% if imposto.PIS.CST in ('01', '02') %} @@ -637,33 +659,13 @@ {% endif %} {% if imposto.COFINSST is defined %} - + {{ imposto.COFINSST.vBC }} {{ imposto.COFINSST.pCOFINS }} {{ imposto.COFINSST.qBCProd }} {{ imposto.COFINSST.vAliqProd }} {{ imposto.COFINSST.vCOFINS }} - - {% endif %} - {% if imposto.ISSQN is defined %} - - {{ imposto.ISSQN.vBC }} - {{ imposto.ISSQN.vAliq }} - {{ imposto.ISSQN.vISSQN }} - {{ imposto.ISSQN.cMunFG }} - {{ imposto.ISSQN.cListServ }} - {{ imposto.ISSQN.vDeducao }} - {{ imposto.ISSQN.vOutro }} - {{ imposto.ISSQN.vDescIncond }} - {{ imposto.ISSQN.vDescCond }} - {{ imposto.ISSQN.vDeducao }} - {{ imposto.ISSQN.indISS }} - {{ imposto.ISSQN.cServico }} - {{ imposto.ISSQN.cMun }} - {{ imposto.ISSQN.cPais }} - {{ imposto.ISSQN.nProcesso }} - {{ imposto.ISSQN.vDeducao }} - + {% endif %} {% if imposto.ICMSUFDest is defined %} diff --git a/setup.py b/setup.py index e22686c..d596afb 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.10" +VERSION = "1.0.11" setup( From a252d865236ff6a19b00af219341f7c769091173 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Wed, 3 Oct 2018 17:37:42 -0300 Subject: [PATCH 54/85] [FIX] Removing useless code for NFCe, adjusting xml template for NFCe --- pytrustnfe/nfe/__init__.py | 59 +-------- pytrustnfe/nfe/templates/NfeAutorizacao.xml | 4 + setup.py | 2 +- tests/test_add_qr_code.py | 34 ----- tests/xml_com_qrcode.xml | 189 --------------------------- tests/xml_sem_qrcode.xml | 190 ---------------------------- 6 files changed, 9 insertions(+), 469 deletions(-) delete mode 100644 tests/test_add_qr_code.py delete mode 100644 tests/xml_com_qrcode.xml delete mode 100644 tests/xml_sem_qrcode.xml diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index 9a0d068..0718821 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -4,13 +4,11 @@ import os -import hashlib -import binascii from lxml import etree from .assinatura import Assinatura from pytrustnfe.xml import render_xml, sanitize_response from pytrustnfe.utils import gerar_chave, ChaveNFe -from pytrustnfe.Servidores import localizar_url, localizar_qrcode +from pytrustnfe.Servidores import localizar_url from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key # Zeep @@ -38,54 +36,6 @@ def _generate_nfe_id(**kwargs): item['infNFe']['ide']['cDV'] = chave_nfe[len(chave_nfe) - 1:] -def _add_qrCode(xml, **kwargs): - xml = etree.fromstring(xml) - inf_nfe = kwargs['NFes'][0]['infNFe'] - nfe = xml.find(".//{http://www.portalfiscal.inf.br/nfe}NFe") - infnfesupl = etree.Element('infNFeSupl') - qrcode = etree.Element('qrCode') - chave_nfe = inf_nfe['Id'][3:] - dh_emissao = binascii.hexlify(inf_nfe['ide']['dhEmi'].encode()).decode() - versao = '100' - ambiente = kwargs['ambiente'] - valor_total = inf_nfe['total']['vNF'] - dest_cpf = 'Inexistente' - dest = nfe.find(".//{http://www.portalfiscal.inf.br/nfe}dest") - - if inf_nfe.get('dest', False): - if inf_nfe['dest'].get('CPF', False): - dest_cpf = inf_nfe['dest']['CPF'] - dest = etree.Element('dest') - cpf = etree.Element('CPF') - cpf.text = dest_cpf - dest.append(cpf) - - icms_total = inf_nfe['total']['vICMS'] - dig_val = binascii.hexlify(xml.find( - ".//{http://www.w3.org/2000/09/xmldsig#}DigestValue").text.encode()).decode() - cid_token = kwargs['NFes'][0]['infNFe']['codigo_seguranca']['cid_token'] - csc = kwargs['NFes'][0]['infNFe']['codigo_seguranca']['csc'] - - c_hash_QR_code = "chNFe={0}&nVersao={1}&tpAmb={2}&cDest={3}&dhEmi={4}&vNF\ -={5}&vICMS={6}&digVal={7}&cIdToken={8}{9}".\ - format(chave_nfe, versao, ambiente, dest_cpf, dh_emissao, - valor_total, icms_total, dig_val, cid_token, csc) - c_hash_QR_code = hashlib.sha1(c_hash_QR_code.encode()).hexdigest() - - QR_code_url = "?chNFe={0}&nVersao={1}&tpAmb={2}&{3}dhEmi={4}&vNF={5}&vICMS\ -={6}&digVal={7}&cIdToken={8}&cHashQRCode={9}".\ - format(chave_nfe, versao, ambiente, - 'cDest={}&'.format(dest_cpf) if dest_cpf != 'Inexistente' - else '', dh_emissao, valor_total, icms_total, dig_val, - cid_token, c_hash_QR_code) - qr_code_server = localizar_qrcode(kwargs['estado'], ambiente) - qrcode_text = qr_code_server + QR_code_url - qrcode.text = etree.CDATA(qrcode_text) - infnfesupl.append(qrcode) - nfe.insert(1, infnfesupl) - return etree.tostring(xml, encoding=str) - - def _render(certificado, method, sign, **kwargs): path = os.path.join(os.path.dirname(__file__), 'templates') xmlElem_send = render_xml(path, '%s.xml' % method, True, **kwargs) @@ -107,9 +57,6 @@ def _render(certificado, method, sign, **kwargs): xml_send = signer.assina_xml( xmlElem_send, kwargs['manifesto']['identificador']) - if modelo == '65': - xml_send = _add_qrCode(xml_send, **kwargs) - else: xml_send = etree.tostring(xmlElem_send, encoding=str) return xml_send @@ -129,7 +76,9 @@ def _send(certificado, method, **kwargs): session.verify = False transport = Transport(session=session) - xml = etree.fromstring(xml_send) + parser = etree.XMLParser(strip_cdata=False) + xml = etree.fromstring(xml_send, parser=parser) + client = Client(base_url, transport=transport) port = next(iter(client.wsdl.port_types)) diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml index 1a616a0..e7d21d6 100644 --- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml +++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml @@ -872,6 +872,10 @@ {% endif %} + + {{ NFe.infNFe.qrCode }} + {{ NFe.infNFe.urlChave }} + {% endfor %} diff --git a/setup.py b/setup.py index d596afb..cf468c1 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.11" +VERSION = "1.0.12" setup( diff --git a/tests/test_add_qr_code.py b/tests/test_add_qr_code.py deleted file mode 100644 index 77a24f4..0000000 --- a/tests/test_add_qr_code.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8-*- -# © 2016 Alessandro Fernandes Martini -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -import unittest -# from lxml import etree -from pytrustnfe.nfe import _add_qrCode - - -class TestAddQRCode(unittest.TestCase): - def setUp(self): - self.xml_sem_qrcode = open('tests/xml_sem_qrcode.xml', 'r') - self.xml_com_qrcode = open('tests/xml_com_qrcode.xml', 'r') - dhEmi = '2016-11-09T16:03:25-00:00' - chave_nfe = 'NFe35161121332917000163650010000000011448875034' - ambiente = 2 - valor_total = '324.00' - icms_total = '61.56' - cid_token = '000001' - csc = '123456789' - estado = '35' - total = {'vNF': valor_total, 'vICMS': icms_total} - infnfe = {'ide': {'dhEmi': dhEmi}, 'Id': chave_nfe, 'total': total, - 'codigo_seguranca': {'cid_token': cid_token, 'csc': csc}} - infnfe = {'infNFe': infnfe} - self.kwargs = {} - self.kwargs['ambiente'] = ambiente - self.kwargs['estado'] = estado - self.kwargs['NFes'] = [infnfe] - - def test_add_qrCode(self): - xml_init = self.xml_sem_qrcode.read() - xml_end = _add_qrCode(xml_init, **self.kwargs) - self.assertEqual(xml_end, self.xml_com_qrcode.read()) diff --git a/tests/xml_com_qrcode.xml b/tests/xml_com_qrcode.xml deleted file mode 100644 index 22cf1ef..0000000 --- a/tests/xml_com_qrcode.xml +++ /dev/null @@ -1,189 +0,0 @@ - - 103 - 1 - - - - 35 - 44887503 - Venda POS - 0 - 65 - 1 - 1 - 2016-11-09T16:03:58-00:00 - 1 - 1 - 3550308 - 4 - 1 - 4 - 2 - 1 - 1 - 1 - 0 - Odoo Brasil 10 - - - 21332917000163 - LEL AMBIENTAL LTDA - EPP - Zell Ambiental - - Rua Padre João - 444 - Penha de França - 3550308 - São Paulo - SP - 03637000 - 1058 - Brasil - 3425323750 - - 244694180116 - 3 - - - - MISC - - NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL - 28431000 - 2806300 - 5101 - Unit(s - 18.0 - 18.00 - 324.00 - - Unit(s - 18.0 - 18.00 - 1 - - - 0.00 - - - 0 - 00 - 3 - 324.00 - 19.00 - 61.56 - - - - - 01 - 324.00 - 0.00 - 2.11 - - - - - 01 - 324.00 - 0.00 - 9.72 - - - - - - - 324.00 - 61.56 - 0.00 - 0.00 - 0.00 - 324.00 - 0.00 - 0.00 - 0.00 - 0.00 - 0.00 - 2.11 - 9.72 - 0.00 - 324.00 - 0.00 - - - - 9 - - - 01 - 324.00 - - - - - - - - - - - - - ffJZ+04jmHN3uLx08huykyBs2r4= - - - u42y8bBqNM336yc7r0+5YWiePmCerKu3cFcp2J+lmQzIK6snba7txyeBtwVos8jQxrYLsnfWtKb5P6FxmhDeqAB41o2aoSIcnxc0yxdFn2ZDTquwU+AurH6E4hGclz8D/5qapv2+g3y+VpXMZFNNCqZSm2vJpvXBmPEY/7oO2cPB13N7WDhDRmI9H4kRDsPuxeeJetr2Bf1ThGJ0EUA4DXC7My0kl/Bw0rYwoPDhoqhxinr9Wocw1UyQ1vprLF0JVHXOtSq39Uqfqmj5QUDwUvvh4YL9bFZ8lvZZ0CZDmILaFGvr1XH3CwJ2Ws3RLlb12Arj5OT4vS8ZKhJtr/dpfA== - - - MIIIPzCCBiegAwIBAgIQYdesnYUNG8VPne0qhTeKOzANBgkqhkiG9w0BAQsFADB4 -MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE2MDQGA1UECxMtU2Vj -cmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRwwGgYD -VQQDExNBQyBDZXJ0aXNpZ24gUkZCIEc0MB4XDTE2MDUxMDAwMDAwMFoXDTE3MDUw -OTIzNTk1OVowgekxCzAJBgNVBAYTAkJSMRMwEQYDVQQKFApJQ1AtQnJhc2lsMQsw -CQYDVQQIEwJTUDESMBAGA1UEBxQJU2FvIFBhdWxvMTYwNAYDVQQLFC1TZWNyZXRh -cmlhIGRhIFJlY2VpdGEgRmVkZXJhbCBkbyBCcmFzaWwgLSBSRkIxFjAUBgNVBAsU -DVJGQiBlLUNOUEogQTExJDAiBgNVBAsUG0F1dGVudGljYWRvIHBvciBBUiBTdW5z -aGluZTEuMCwGA1UEAxMlTEVaIEFNQklFTlRBTCBMVERBIEVQUDoyMTMzMjkxNzAw -MDE2MzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANEG6j0uXIvvHlMz -0IGzuY/vuFQncIoSE+cBUk0uq6J3dtmGAg4oaVWCHUfHbX9s2Ag1jIG+PFAo2dlt -sbLSEji74XhD+IpM/9aHm3ke8kb05ay+bYRuUjTNSwUbslT1+amAmIu7m1yPBi6u -v3+/Lj2I0g7VeBBAjv/TiBG0VRCURXvKrwWrv2Lpybo/yDnENGtRqQHihqeYFKin -nDzBsMbv4ripbi3XiAgcy/bF6NFgVMqxrNnGvSiSUhDRkmceVFIysRXUMke02Qo1 -Q5Ik1j1goUIHP44QOruXCMiT0yOK8u0qNAXR0yzSaWcBR2aJCeWgFg7sNbB50Qcx -c+2GKUECAwEAAaOCA1EwggNNMIG2BgNVHREEga4wgaugPQYFYEwBAwSgNAQyMTYw -NjE5ODYzNDEzNzgyODg2NTAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMzczU1NQU1Cg -IgYFYEwBAwKgGQQXTEVPTkFSRE8gREUgTElNQSBTQU5UT1OgGQYFYEwBAwOgEAQO -MjEzMzI5MTcwMDAxNjOgFwYFYEwBAwegDgQMMDAwMDAwMDAwMDAwgRJ3YWduZXJA -emVsbC5jb20uYnIwCQYDVR0TBAIwADAfBgNVHSMEGDAWgBQukerWbeWyWYLcOIUp -djQWVjzQPjAOBgNVHQ8BAf8EBAMCBeAwfwYDVR0gBHgwdjB0BgZgTAECAQwwajBo -BggrBgEFBQcCARZcaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNvbS5ici9y -ZXBvc2l0b3Jpby9kcGMvQUNfQ2VydGlzaWduX1JGQi9EUENfQUNfQ2VydGlzaWdu -X1JGQi5wZGYwggEWBgNVHR8EggENMIIBCTBXoFWgU4ZRaHR0cDovL2ljcC1icmFz -aWwuY2VydGlzaWduLmNvbS5ici9yZXBvc2l0b3Jpby9sY3IvQUNDZXJ0aXNpZ25S -RkJHNC9MYXRlc3RDUkwuY3JsMFagVKBShlBodHRwOi8vaWNwLWJyYXNpbC5vdXRy -YWxjci5jb20uYnIvcmVwb3NpdG9yaW8vbGNyL0FDQ2VydGlzaWduUkZCRzQvTGF0 -ZXN0Q1JMLmNybDBWoFSgUoZQaHR0cDovL3JlcG9zaXRvcmlvLmljcGJyYXNpbC5n -b3YuYnIvbGNyL0NlcnRpc2lnbi9BQ0NlcnRpc2lnblJGQkc0L0xhdGVzdENSTC5j -cmwwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMIGbBggrBgEFBQcBAQSB -jjCBizBfBggrBgEFBQcwAoZTaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNv -bS5ici9yZXBvc2l0b3Jpby9jZXJ0aWZpY2Fkb3MvQUNfQ2VydGlzaWduX1JGQl9H -NC5wN2MwKAYIKwYBBQUHMAGGHGh0dHA6Ly9vY3NwLmNlcnRpc2lnbi5jb20uYnIw -DQYJKoZIhvcNAQELBQADggIBAFIUBrNIyC4kBap/7hCW63tQhA/WNnWDNYpKM5wN -zwApVV2bqFMJURzO/7AUrHu7uZS1p/Ubo+w2dFjmnmj5DniQkY85Sd6HNa1fukJY -PK13wcUMVHMjeevIAcxnYraNdN4BIz1Svl6A8leGFgIEuDUll7Td+R7+aA8N5JYQ -dFFIe2VxvJNbWP/WA49oI8U2wkoPTfOZtfrgKf2msHm3FnTfnmyOPhIf8L31iFt6 -MbKuFjOGIaWu+Z/gRDqj/EbFcEMUrDbeIYqz2724ZGBOJrkjHO7DBqXXoN9pzCTO -RB5+gILMEnMS7zFsCuLOtLVohxgYUzg8p4Fy3nsHEzb/7IDVOnKLfjh/c5GSTvOa -JT6qznYV2yav7NyuUSNUv+5bCIBNk45+qrQ8DwpsLBsFa+RLfCwvYVK95ad/xVgJ -QosPJuzW3t0fU/FWbc00sZWV6lgBPyWhdF8EodaRIWC+EOC2wJbODyw+vdX8pUxT -TUJKV2iAP8206gR2h07o2CZgXckJGJQ5MnBUbS78AaITXZ5JlPaS7ZdU9zWY3kD+ -j5YERs0+UweijKi5eHZioGRZRDZ2uksh1wrgeLFLWuiSNaPFYVVrQ/ZGo+E5uVNl -8FuoR6P9TZjx1/A4XjqLQ9yPoPWgIWe14Vh/76dVcgz3ElWMbmPCDoc/wX+FoHX1 -Fbux - - - - - - \ No newline at end of file diff --git a/tests/xml_sem_qrcode.xml b/tests/xml_sem_qrcode.xml deleted file mode 100644 index 3352a22..0000000 --- a/tests/xml_sem_qrcode.xml +++ /dev/null @@ -1,190 +0,0 @@ - - - 103 - 1 - - - - 35 - 44887503 - Venda POS - 0 - 65 - 1 - 1 - 2016-11-09T16:03:58-00:00 - 1 - 1 - 3550308 - 4 - 1 - 4 - 2 - 1 - 1 - 1 - 0 - Odoo Brasil 10 - - - 21332917000163 - LEL AMBIENTAL LTDA - EPP - Zell Ambiental - - Rua Padre João - 444 - Penha de França - 3550308 - São Paulo - SP - 03637000 - 1058 - Brasil - 3425323750 - - 244694180116 - 3 - - - - MISC - - NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL - 28431000 - 2806300 - 5101 - Unit(s - 18.0 - 18.00 - 324.00 - - Unit(s - 18.0 - 18.00 - 1 - - - 0.00 - - - 0 - 00 - 3 - 324.00 - 19.00 - 61.56 - - - - - 01 - 324.00 - 0.00 - 2.11 - - - - - 01 - 324.00 - 0.00 - 9.72 - - - - - - - 324.00 - 61.56 - 0.00 - 0.00 - 0.00 - 324.00 - 0.00 - 0.00 - 0.00 - 0.00 - 0.00 - 2.11 - 9.72 - 0.00 - 324.00 - 0.00 - - - - 9 - - - 01 - 324.00 - - - - - - - - - - - - - ffJZ+04jmHN3uLx08huykyBs2r4= - - - u42y8bBqNM336yc7r0+5YWiePmCerKu3cFcp2J+lmQzIK6snba7txyeBtwVos8jQxrYLsnfWtKb5P6FxmhDeqAB41o2aoSIcnxc0yxdFn2ZDTquwU+AurH6E4hGclz8D/5qapv2+g3y+VpXMZFNNCqZSm2vJpvXBmPEY/7oO2cPB13N7WDhDRmI9H4kRDsPuxeeJetr2Bf1ThGJ0EUA4DXC7My0kl/Bw0rYwoPDhoqhxinr9Wocw1UyQ1vprLF0JVHXOtSq39Uqfqmj5QUDwUvvh4YL9bFZ8lvZZ0CZDmILaFGvr1XH3CwJ2Ws3RLlb12Arj5OT4vS8ZKhJtr/dpfA== - - - MIIIPzCCBiegAwIBAgIQYdesnYUNG8VPne0qhTeKOzANBgkqhkiG9w0BAQsFADB4 -MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE2MDQGA1UECxMtU2Vj -cmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRwwGgYD -VQQDExNBQyBDZXJ0aXNpZ24gUkZCIEc0MB4XDTE2MDUxMDAwMDAwMFoXDTE3MDUw -OTIzNTk1OVowgekxCzAJBgNVBAYTAkJSMRMwEQYDVQQKFApJQ1AtQnJhc2lsMQsw -CQYDVQQIEwJTUDESMBAGA1UEBxQJU2FvIFBhdWxvMTYwNAYDVQQLFC1TZWNyZXRh -cmlhIGRhIFJlY2VpdGEgRmVkZXJhbCBkbyBCcmFzaWwgLSBSRkIxFjAUBgNVBAsU -DVJGQiBlLUNOUEogQTExJDAiBgNVBAsUG0F1dGVudGljYWRvIHBvciBBUiBTdW5z -aGluZTEuMCwGA1UEAxMlTEVaIEFNQklFTlRBTCBMVERBIEVQUDoyMTMzMjkxNzAw -MDE2MzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANEG6j0uXIvvHlMz -0IGzuY/vuFQncIoSE+cBUk0uq6J3dtmGAg4oaVWCHUfHbX9s2Ag1jIG+PFAo2dlt -sbLSEji74XhD+IpM/9aHm3ke8kb05ay+bYRuUjTNSwUbslT1+amAmIu7m1yPBi6u -v3+/Lj2I0g7VeBBAjv/TiBG0VRCURXvKrwWrv2Lpybo/yDnENGtRqQHihqeYFKin -nDzBsMbv4ripbi3XiAgcy/bF6NFgVMqxrNnGvSiSUhDRkmceVFIysRXUMke02Qo1 -Q5Ik1j1goUIHP44QOruXCMiT0yOK8u0qNAXR0yzSaWcBR2aJCeWgFg7sNbB50Qcx -c+2GKUECAwEAAaOCA1EwggNNMIG2BgNVHREEga4wgaugPQYFYEwBAwSgNAQyMTYw -NjE5ODYzNDEzNzgyODg2NTAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMzczU1NQU1Cg -IgYFYEwBAwKgGQQXTEVPTkFSRE8gREUgTElNQSBTQU5UT1OgGQYFYEwBAwOgEAQO -MjEzMzI5MTcwMDAxNjOgFwYFYEwBAwegDgQMMDAwMDAwMDAwMDAwgRJ3YWduZXJA -emVsbC5jb20uYnIwCQYDVR0TBAIwADAfBgNVHSMEGDAWgBQukerWbeWyWYLcOIUp -djQWVjzQPjAOBgNVHQ8BAf8EBAMCBeAwfwYDVR0gBHgwdjB0BgZgTAECAQwwajBo -BggrBgEFBQcCARZcaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNvbS5ici9y -ZXBvc2l0b3Jpby9kcGMvQUNfQ2VydGlzaWduX1JGQi9EUENfQUNfQ2VydGlzaWdu -X1JGQi5wZGYwggEWBgNVHR8EggENMIIBCTBXoFWgU4ZRaHR0cDovL2ljcC1icmFz -aWwuY2VydGlzaWduLmNvbS5ici9yZXBvc2l0b3Jpby9sY3IvQUNDZXJ0aXNpZ25S -RkJHNC9MYXRlc3RDUkwuY3JsMFagVKBShlBodHRwOi8vaWNwLWJyYXNpbC5vdXRy -YWxjci5jb20uYnIvcmVwb3NpdG9yaW8vbGNyL0FDQ2VydGlzaWduUkZCRzQvTGF0 -ZXN0Q1JMLmNybDBWoFSgUoZQaHR0cDovL3JlcG9zaXRvcmlvLmljcGJyYXNpbC5n -b3YuYnIvbGNyL0NlcnRpc2lnbi9BQ0NlcnRpc2lnblJGQkc0L0xhdGVzdENSTC5j -cmwwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMIGbBggrBgEFBQcBAQSB -jjCBizBfBggrBgEFBQcwAoZTaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNv -bS5ici9yZXBvc2l0b3Jpby9jZXJ0aWZpY2Fkb3MvQUNfQ2VydGlzaWduX1JGQl9H -NC5wN2MwKAYIKwYBBQUHMAGGHGh0dHA6Ly9vY3NwLmNlcnRpc2lnbi5jb20uYnIw -DQYJKoZIhvcNAQELBQADggIBAFIUBrNIyC4kBap/7hCW63tQhA/WNnWDNYpKM5wN -zwApVV2bqFMJURzO/7AUrHu7uZS1p/Ubo+w2dFjmnmj5DniQkY85Sd6HNa1fukJY -PK13wcUMVHMjeevIAcxnYraNdN4BIz1Svl6A8leGFgIEuDUll7Td+R7+aA8N5JYQ -dFFIe2VxvJNbWP/WA49oI8U2wkoPTfOZtfrgKf2msHm3FnTfnmyOPhIf8L31iFt6 -MbKuFjOGIaWu+Z/gRDqj/EbFcEMUrDbeIYqz2724ZGBOJrkjHO7DBqXXoN9pzCTO -RB5+gILMEnMS7zFsCuLOtLVohxgYUzg8p4Fy3nsHEzb/7IDVOnKLfjh/c5GSTvOa -JT6qznYV2yav7NyuUSNUv+5bCIBNk45+qrQ8DwpsLBsFa+RLfCwvYVK95ad/xVgJ -QosPJuzW3t0fU/FWbc00sZWV6lgBPyWhdF8EodaRIWC+EOC2wJbODyw+vdX8pUxT -TUJKV2iAP8206gR2h07o2CZgXckJGJQ5MnBUbS78AaITXZ5JlPaS7ZdU9zWY3kD+ -j5YERs0+UweijKi5eHZioGRZRDZ2uksh1wrgeLFLWuiSNaPFYVVrQ/ZGo+E5uVNl -8FuoR6P9TZjx1/A4XjqLQ9yPoPWgIWe14Vh/76dVcgz3ElWMbmPCDoc/wX+FoHX1 -Fbux - - - - - - From 790543d36ac578a63b0febab389bd66ee749fdaf Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Wed, 3 Oct 2018 19:15:38 -0300 Subject: [PATCH 55/85] [FIX] Ajustando as urls de consulta da danfce --- pytrustnfe/Servidores.py | 4 ++-- pytrustnfe/nfe/danfce.py | 46 +++++++++++++++++++++++----------------------- setup.py | 2 +- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index d2c2286..5f02d3a 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -152,7 +152,7 @@ SVRS = { WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa - WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx', + WS_NFCE_QR_CODE: 'http://www.fazenda.df.gov.br/nfce/qrcode', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfce-homologacao.svrs.rs.gov.br', @@ -162,7 +162,7 @@ SVRS = { WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa - WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx', + WS_NFCE_QR_CODE: 'http://www.fazenda.df.gov.br/nfce/qrcode', } } } diff --git a/pytrustnfe/nfe/danfce.py b/pytrustnfe/nfe/danfce.py index e245ada..393eaab 100644 --- a/pytrustnfe/nfe/danfce.py +++ b/pytrustnfe/nfe/danfce.py @@ -72,7 +72,7 @@ def format_telefone(telefone): class danfce(object): - def __init__(self, list_xml, logo=None): + def __init__(self, list_xml, logo=None, timezone=None): self.current_font_size = 7 self.current_font_name = 'NimbusSanL-Regu' @@ -188,14 +188,14 @@ class danfce(object): # Impostos el_total = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}total") - total_tributo = format_number(tagtext(oNode=el_total, cTag='vTotTrib'), - precision=2) - valor_total = format_number(tagtext(oNode=el_total, cTag='vProd'), - precision=2) - desconto = format_number(tagtext(oNode=el_total, cTag='vDesc'), - precision=2) - valor_a_pagar = format_number(tagtext(oNode=el_total, cTag='vNF'), - precision=2) + total_tributo = format_number( + tagtext(oNode=el_total, cTag='vTotTrib'), precision=2) + valor_total = format_number( + tagtext(oNode=el_total, cTag='vProd'), precision=2) + desconto = format_number( + tagtext(oNode=el_total, cTag='vDesc'), precision=2) + valor_a_pagar = format_number( + tagtext(oNode=el_total, cTag='vNF'), precision=2) el_pag = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}pag") troco = format_number(tagtext(oNode=el_pag, cTag="vTroco")) @@ -216,26 +216,26 @@ class danfce(object): ".//{http://www.portalfiscal.inf.br/nfe}det")) payment_methods = [] - for pagId, item in enumerate(el_pag): - if 'tPag' not in item.tag: - continue - payment = [] - method = payment_method_list[item.text] + tipo_pagamento = tagtext(oNode=item, cTag="tPag") + val = format_number(tagtext(oNode=item, cTag="vPag"), precision=2) + + method = payment_method_list[tipo_pagamento] payment.append(method) - payment.append(format_number(item.getnext().text, precision=2)) + payment.append(val) payment_methods.append(payment) - values = {'quantidade_itens': quant_produtos, - 'total_tributo': total_tributo, - 'valor_total': valor_total, - 'desconto': desconto, - 'valor_a_pagar': valor_a_pagar, - 'formas_de_pagamento': payment_methods, - 'troco': troco, - } + values = { + 'quantidade_itens': quant_produtos, + 'total_tributo': total_tributo, + 'valor_total': valor_total, + 'desconto': desconto, + 'valor_a_pagar': valor_a_pagar, + 'formas_de_pagamento': payment_methods, + 'troco': troco, + } self.draw_totals_table(values) diff --git a/setup.py b/setup.py index cf468c1..32316ac 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.12" +VERSION = "1.0.13" setup( From dbe2ab2ec5c1a986216bfe4dc088ef9aa07103e3 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Thu, 4 Oct 2018 16:11:23 -0300 Subject: [PATCH 56/85] [FIX] Ajusta a consulta de download de xml --- pytrustnfe/Servidores.py | 2 ++ pytrustnfe/nfe/__init__.py | 12 ++++++++---- setup.py | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 5f02d3a..5225c45 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -79,6 +79,8 @@ def localizar_url(servico, estado, mod='55', ambiente=2): if sigla in ('AC', 'RN', 'PB', 'SC', 'RJ') and \ servico == WS_NFE_CADASTRO: dominio = 'cad.svrs.rs.gov.br' + if sigla == 'AN' and servico == WS_NFE_RECEPCAO_EVENTO: + dominio = 'www.nfe.fazenda.gov.br' return "https://%s/%s" % (dominio, complemento) diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index 0718821..e4f406a 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -196,9 +196,7 @@ def xml_consulta_distribuicao_nfe(certificado, **kwargs): # Assinar return _render(certificado, 'NFeDistribuicaoDFe', False, **kwargs) -def consulta_distribuicao_nfe(certificado, **kwargs): - if "xml" not in kwargs: - kwargs['xml'] = xml_consulta_distribuicao_nfe(certificado, **kwargs) +def _send_v310(certificado, **kwargs): xml_send = kwargs["xml"] base_url = localizar_url( 'NFeDistribuicaoDFe', kwargs['estado'], kwargs['modelo'], @@ -229,6 +227,12 @@ def consulta_distribuicao_nfe(certificado, **kwargs): } +def consulta_distribuicao_nfe(certificado, **kwargs): + if "xml" not in kwargs: + kwargs['xml'] = xml_consulta_distribuicao_nfe(certificado, **kwargs) + return _send_v310(certificado, **kwargs) + + def xml_download_nfe(certificado, **kwargs): # Assinar return _render(certificado, 'NFeDistribuicaoDFe', False, **kwargs) @@ -236,4 +240,4 @@ def xml_download_nfe(certificado, **kwargs): # Assinar def download_nfe(certificado, **kwargs): if "xml" not in kwargs: kwargs['xml'] = xml_download_nfe(certificado, **kwargs) - return _send(certificado, 'NFeDistribuicaoDFe', **kwargs) + return _send_v310(certificado, **kwargs) diff --git a/setup.py b/setup.py index 32316ac..a0ecfd0 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.13" +VERSION = "1.0.14" setup( From 0ce7c3045f2da0198061b34b4574e1b9a99e4e6a Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Fri, 5 Oct 2018 00:05:04 -0300 Subject: [PATCH 57/85] =?UTF-8?q?[FIX]=20Voltando=20as=20urls=20antigas,?= =?UTF-8?q?=20a=20principio=20DF=20n=C3=A3o=20atualizaram=20ainda?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/Servidores.py | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 5225c45..5bf4e4e 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -154,7 +154,7 @@ SVRS = { WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa - WS_NFCE_QR_CODE: 'http://www.fazenda.df.gov.br/nfce/qrcode', + WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx?', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfce-homologacao.svrs.rs.gov.br', @@ -164,7 +164,7 @@ SVRS = { WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa - WS_NFCE_QR_CODE: 'http://www.fazenda.df.gov.br/nfce/qrcode', + WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx?', } } } diff --git a/setup.py b/setup.py index a0ecfd0..ed1a6d5 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.14" +VERSION = "1.0.15" setup( From b81f3ddbc6e240bc6d6d4e94e23e4bc5178e4116 Mon Sep 17 00:00:00 2001 From: marinaGD <36993009+marinaGD@users.noreply.github.com> Date: Tue, 9 Oct 2018 09:48:30 -0300 Subject: [PATCH 58/85] [FIX] first page overwriting (#188) * change number of lines in first page * increments version --- pytrustnfe/nfe/danfe.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 12c30a7..157bc45 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -716,7 +716,7 @@ obsCont[@xCampo='NomeVendedor']") for id in range(index, max_index + 1): - if nLin > 242: + if nLin > 237: break item = el_det[id] diff --git a/setup.py b/setup.py index ed1a6d5..3953ade 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.15" +VERSION = "1.0.16" setup( From 36142aaf584af5368b1dc3899a5c8c9ed1a56ad6 Mon Sep 17 00:00:00 2001 From: marinaGD Date: Thu, 11 Oct 2018 13:55:17 -0300 Subject: [PATCH 59/85] add troco and valor pago with the added values --- pytrustnfe/nfe/danfce.py | 11 ++++++----- pytrustnfe/nfe/templates/NfeAutorizacao.xml | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pytrustnfe/nfe/danfce.py b/pytrustnfe/nfe/danfce.py index 393eaab..7773798 100644 --- a/pytrustnfe/nfe/danfce.py +++ b/pytrustnfe/nfe/danfce.py @@ -197,7 +197,7 @@ class danfce(object): valor_a_pagar = format_number( tagtext(oNode=el_total, cTag='vNF'), precision=2) el_pag = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}pag") - troco = format_number(tagtext(oNode=el_pag, cTag="vTroco")) + troco = tagtext(oNode=el_pag, cTag="vTroco") payment_method_list = {'01': 'Dinheiro', '02': 'Cheque', @@ -221,7 +221,7 @@ class danfce(object): tipo_pagamento = tagtext(oNode=item, cTag="tPag") val = format_number(tagtext(oNode=item, cTag="vPag"), precision=2) - method = payment_method_list[tipo_pagamento] + method = payment_method_list.get(tipo_pagamento) payment.append(method) payment.append(val) @@ -242,13 +242,14 @@ class danfce(object): self.drawLine() def draw_totals_table(self, values): - rowHeights = [7, 7, 7, 7, 10] - data = [['QTD.TOTAL DE ITENS', values['quantidade_itens']], + rowHeights = [7, 7, 7, 7, 7] + data = [ + ['QTD.TOTAL DE ITENS', values['quantidade_itens']], ['VALOR TOTAL R$', values['valor_total']], ['DESCONTO R$', values['desconto']], ['VALOR A PAGAR R$', values['valor_a_pagar']], ['FORMA DE PAGAMENTO', 'VALOR PAGO R$'], - ] + ] for item in values['formas_de_pagamento']: data.append([item[0], item[1]]) diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml index e7d21d6..b91c5e8 100644 --- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml +++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml @@ -832,8 +832,8 @@ {{ pag.card.cAut }} {% endif %} - {{ pag.vTroco }} + {{ pag.vTroco }} {% endfor %} {% endif %} From d4c3a8a0a7efb5df095e9f9d5be88b48f54e6002 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Thu, 11 Oct 2018 16:21:45 -0300 Subject: [PATCH 60/85] [VER] New version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3953ade..155db62 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.16" +VERSION = "1.0.17" setup( From ff75a6c77a0b75ecb169c7b4ad65186c16bc9a94 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 15 Oct 2018 22:48:04 -0300 Subject: [PATCH 61/85] =?UTF-8?q?[FIX]=20Calcula=20previamente=20o=20taman?= =?UTF-8?q?ho=20do=20proximo=20item=20se=20ultrapassar=20o=20tamanho=20dis?= =?UTF-8?q?pon=C3=ADvel=20finaliza=20e=20continua=20na=20pr=C3=B3xima=20it?= =?UTF-8?q?era=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/danfe.py | 16 +++++++++++----- setup.py | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 157bc45..41ed827 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -193,6 +193,7 @@ class danfe(object): self.impostos(oXML=oXML) self.transportes(oXML=oXML) + index = self.produtos( oXML=oXML, el_det=el_det, max_index=nId, list_desc=list_desc, list_cod_prod=list_cod_prod) @@ -667,6 +668,9 @@ obsCont[@xCampo='NomeVendedor']") nStep = 2.5 # Passo entre linhas nH = 7.5 + (nHeight * nStep) # cabeçalho 7.5 self.nlin += 1 + # nH é o altura da linha vertical, utilizar como referência + # somar a ele a altura atual que é nlin + maxHeight = self.nlin + nH self.canvas.setFont('NimbusSanL-Bold', 7) self.string(self.nLeft + 1, self.nlin + 1, 'DADOS DO PRODUTO/SERVIÇO') @@ -712,11 +716,13 @@ obsCont[@xCampo='NomeVendedor']") # Conteúdo campos self.canvas.setFont('NimbusSanL-Regu', 5) - nLin = self.nlin + 10.5 + nLin = self.nlin + 10.0 for id in range(index, max_index + 1): - if nLin > 237: + line_height = max(len(list_cod_prod[id]), len(list_desc[id])) + line_height *= nStep + if nLin + line_height > maxHeight: break item = el_det[id] @@ -832,10 +838,10 @@ obsCont[@xCampo='NomeVendedor']") self.canvas.setFont('NimbusSanL-Regu', 5) self.string(self.nLeft + 1, self.nlin + 4, 'INFORMAÇÕES COMPLEMENTARES') - self.string((self.width / 2) + 1, self.nlin + 4, 'RESERVADO AO FISCO') + self.string(((self.width / 3) * 2) + 1, self.nlin + 4, 'RESERVADO AO FISCO') self.rect(self.nLeft, self.nlin + 2, self.width - self.nLeft - self.nRight, 42 - tamanho_diminuir) - self.vline(self.width / 2, self.nlin + 2, 42 - tamanho_diminuir) + self.vline((self.width / 3) * 2, self.nlin + 2, 42 - tamanho_diminuir) # Conteúdo campos styles = getSampleStyleSheet() styleN = styles['Normal'] @@ -847,7 +853,7 @@ obsCont[@xCampo='NomeVendedor']") if fisco: observacoes = fisco + ' ' + observacoes P = Paragraph(observacoes, styles['Normal']) - w, h = P.wrap(92 * mm, 32 * mm) + w, h = P.wrap(128 * mm, 32 * mm) altura = (self.height - self.nlin - 5) * mm P.drawOn(self.canvas, (self.nLeft + 1) * mm, altura - h) self.nlin += 36 diff --git a/setup.py b/setup.py index 155db62..2943dee 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.17" +VERSION = "1.0.18" setup( From e233abfb04db64bf37a517f13dd83e74188a1b44 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Wed, 17 Oct 2018 21:09:19 -0300 Subject: [PATCH 62/85] [FIX] Corrige envio de NFS-e Ginfes --- pytrustnfe/nfse/ginfes/__init__.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pytrustnfe/nfse/ginfes/__init__.py b/pytrustnfe/nfse/ginfes/__init__.py index fb27677..c5dfe76 100644 --- a/pytrustnfe/nfse/ginfes/__init__.py +++ b/pytrustnfe/nfse/ginfes/__init__.py @@ -50,7 +50,7 @@ def _send(certificado, method, **kwargs): xml_send = kwargs['xml'] response = client.service[method](header, xml_send) - response, obj = sanitize_response(response.encode('utf-8')) + response, obj = sanitize_response(response) return { 'sent_xml': xml_send, 'received_xml': response, diff --git a/setup.py b/setup.py index 2943dee..adf8b71 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.18" +VERSION = "1.0.19" setup( From a25dd8a9d3fafd5bba916cbd9daf2cd71ee07598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Mon, 29 Oct 2018 17:03:55 +0000 Subject: [PATCH 63/85] =?UTF-8?q?Webservices=20NFC-e=20Paran=C3=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Incluí webservices da NFC-e do Paraná. --- pytrustnfe/Servidores.py | 62 ++++++++++++++++++++++++++++++++++-------------- setup.py | 2 +- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 5bf4e4e..14cdb37 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -432,25 +432,51 @@ UFMG = { } UFPR = { - AMBIENTE_PRODUCAO: { - 'servidor': 'nfe.sefa.pr.gov.br', - WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao4?wsdl', - WS_NFE_CONSULTA: 'nfe/NFeConsultaProtocolo4?wsdl', - WS_NFE_SITUACAO: 'nfe/NFeStatusServico4?wsdl', - WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento4?wsdl', - WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao4?wsdl', - WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao4?wsdl', - WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro4?wsdl', + NFE_MODELO: { + AMBIENTE_PRODUCAO: { + 'servidor': 'nfe.sefa.pr.gov.br', + WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro4?wsdl', + }, + AMBIENTE_HOMOLOGACAO: { + 'servidor': 'homologacao.nfe.sefa.pr.gov.br', + WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro4?wsdl', + }, }, - AMBIENTE_HOMOLOGACAO: { - 'servidor': 'homologacao.nfe.sefa.pr.gov.br', - WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao4?wsdl', - WS_NFE_CONSULTA: 'nfe/NFeConsultaProtocolo4?wsdl', - WS_NFE_SITUACAO: 'nfe/NFeStatusServico4?wsdl', - WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento4?wsdl', - WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao4?wsdl', - WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao4?wsdl', - WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro4?wsdl', + NFCE_MODELO: { + AMBIENTE_PRODUCAO: { + 'servidor': 'nfce.sefa.pr.gov.br', + WS_NFE_RECEPCAO_EVENTO: 'nfce/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfce/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfce/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfce/CadConsultaCadastro4?wsdl', + WS_NFE_INUTILIZACAO: 'nfce/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfce/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfce/NFeStatusServico4?wsdl', + WS_NFCE_QR_CODE: 'www.fazenda.pr.gov.br/nfce/qrcode?', + }, + AMBIENTE_HOMOLOGACAO: { + 'servidor': 'homologacao.nfce.sefa.pr.gov.br', + WS_NFE_RECEPCAO_EVENTO: 'nfce/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfce/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfce/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfce/CadConsultaCadastro4?wsdl', + WS_NFE_INUTILIZACAO: 'nfce/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfce/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfce/NFeStatusServico4?wsdl', + WS_NFCE_QR_CODE: 'www.fazenda.pr.gov.br/nfce/qrcode?' + } } } diff --git a/setup.py b/setup.py index adf8b71..a56e340 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.19" +VERSION = "1.0.20" setup( From 8b54bfa081e62afeae2a651648b109b44832085d Mon Sep 17 00:00:00 2001 From: marinaGD <36993009+marinaGD@users.noreply.github.com> Date: Thu, 8 Nov 2018 11:26:54 -0200 Subject: [PATCH 64/85] =?UTF-8?q?[IMP]=20Habilita=20enviar=20apenas=20o=20?= =?UTF-8?q?CPF=20no=20destinat=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/templates/NfeAutorizacao.xml | 2 ++ setup.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml index b91c5e8..15e6dbb 100644 --- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml +++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml @@ -116,6 +116,7 @@ {% endif %} {% endif %} {{ dest.xNome|normalize|escape }} + {% if dest.enderDest is defined %} {{ dest.enderDest.xLgr|normalize|escape }} {{ dest.enderDest.nro }} @@ -129,6 +130,7 @@ {{ dest.enderDest.xPais }} {{ dest.enderDest.fone }} + {% endif %} {{ dest.indIEDest }} {% if dest.IE != '' -%}{{ dest.IE }}{% endif %} {{ dest.ISUF }} diff --git a/setup.py b/setup.py index a56e340..8bb9ce5 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.20" +VERSION = "1.0.21" setup( From b645b8ba78a45f54d9edd3b41ddb42d0535c2b00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Thu, 8 Nov 2018 11:42:25 -0200 Subject: [PATCH 65/85] Inclui Webservices para NFC-e do Mato Grosso do Sul. (#195) --- pytrustnfe/Servidores.py | 62 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 14cdb37..8883f05 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -385,25 +385,51 @@ UFMT = { } UFMS = { - AMBIENTE_PRODUCAO: { - 'servidor': 'nfe.sefaz.ms.gov.br', - WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4?wsdl', - WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4?wsdl', - WS_NFE_SITUACAO: 'ws/NFeStatusServico4?wsdl', - WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4?wsdl', - WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4?wsdl', - WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4?wsdl', - WS_NFE_CADASTRO: 'ws/CadConsultaCadastro4?wsdl', + NFE_MODELO: { + AMBIENTE_PRODUCAO: { + 'servidor': 'nfe.sefaz.ms.gov.br', + WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'ws/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'ws/CadConsultaCadastro4?wsdl', + }, + AMBIENTE_HOMOLOGACAO: { + 'servidor': 'hom.nfe.sefaz.ms.gov.br', + WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'ws/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'ws/CadConsultaCadastro4?wsdl', + } }, - AMBIENTE_HOMOLOGACAO: { - 'servidor': 'hom.nfe.sefaz.ms.gov.br', - WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4?wsdl', - WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4?wsdl', - WS_NFE_SITUACAO: 'ws/NFeStatusServico4?wsdl', - WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4?wsdl', - WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4?wsdl', - WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4?wsdl', - WS_NFE_CADASTRO: 'ws/CadConsultaCadastro4?wsdl', + NFCE_MODELO: { + AMBIENTE_PRODUCAO: { + 'servidor': 'nfce.sefaz.ms.gov.br', + WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4', + WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4', + WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4', + WS_NFE_CADASTRO: 'CadConsultaCadastro4', + WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4', + WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4', + WS_NFE_SITUACAO: 'ws/NFeStatusServico4', + WS_NFCE_QR_CODE: 'www.dfe.ms.gov.br/nfce/qrcode?', + }, + AMBIENTE_HOMOLOGACAO: { + 'servidor': 'hom.nfce.sefaz.ms.gov.br', + WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4', + WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4', + WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4', + WS_NFE_CADASTRO: 'ws/CadConsultaCadastro4', + WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4', + WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4', + WS_NFE_SITUACAO: 'ws/NFeStatusServico4', + WS_NFCE_QR_CODE: 'www.dfe.ms.gov.br/nfce/qrcode?' + } } } From c7c380ce36b42e25450149a534c8b957ae381379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Thu, 8 Nov 2018 11:45:41 -0200 Subject: [PATCH 66/85] Webservices NFC-e Mato Grosso. (#194) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Inclui webservices para emissão de NFC-e no Mato Grosso. --- pytrustnfe/Servidores.py | 60 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 8883f05..1551d4f 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -362,25 +362,49 @@ UFGO = { UFMT = { - AMBIENTE_PRODUCAO: { - 'servidor': 'nfe.sefaz.mt.gov.br', - WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao4?wsdl', - WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta4?wsdl', - WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico4?wsdl', - WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento4?wsdl', - WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao4?wsdl', - WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao4?wsdl', - WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro4?wsdl', + NFE_MODELO: { + AMBIENTE_PRODUCAO: { + 'servidor': 'nfe.sefaz.mt.gov.br', + WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta4?wsdl', + WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro4?wsdl', + }, + AMBIENTE_HOMOLOGACAO: { + 'servidor': 'homologacao.sefaz.mt.gov.br', + WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta4?wsdl', + WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro4?wsdl', + } }, - AMBIENTE_HOMOLOGACAO: { - 'servidor': 'homologacao.sefaz.mt.gov.br', - WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao4?wsdl', - WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta4?wsdl', - WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico4?wsdl', - WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento4?wsdl', - WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao4?wsdl', - WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao4?wsdl', - WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro4?wsdl', + NFCE_MODELO: { + AMBIENTE_PRODUCAO: { + 'servidor': 'nfce.sefaz.mt.gov.br', + WS_NFE_RECEPCAO_EVENTO: 'nfcews/services/RecepcaoEvento4', + WS_NFE_AUTORIZACAO: 'nfcews/services/NfeAutorizacao4', + WS_NFE_RET_AUTORIZACAO: 'nfcews/services/NfeRetAutorizacao4', + WS_NFE_INUTILIZACAO: 'nfcews/services/NfeInutilizacao4', + WS_NFE_CONSULTA: 'nfcews/services/NfeConsulta4', + WS_NFE_SITUACAO: 'nfcews/services/NfeStatusServico4', + WS_NFCE_QR_CODE: 'http://www.sefaz.mt.gov.br/nfce/consultanfce', + }, + AMBIENTE_HOMOLOGACAO: { + 'servidor': 'homologacao.sefaz.mt.gov.br', + WS_NFE_RECEPCAO_EVENTO: 'nfcews/services/RecepcaoEvento4', + WS_NFE_AUTORIZACAO: 'nfcews/services/NfeAutorizacao4', + WS_NFE_RET_AUTORIZACAO: 'nfcews/services/NfeRetAutorizacao4', + WS_NFE_INUTILIZACAO: 'nfcews/services/NfeInutilizacao4', + WS_NFE_CONSULTA: 'nfcews/services/NfeConsulta4', + WS_NFE_SITUACAO: 'nfcews/services/NfeStatusServico4', + WS_NFCE_QR_CODE: 'http://www.sefaz.mt.gov.br/nfce/consultanfce', + } } } From ee047ef0cd51e0131fa6a4ff1dc08bd4f83c8793 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Wed, 14 Nov 2018 17:14:37 -0200 Subject: [PATCH 67/85] [FIX] Corrige o encoding do retorno da nfse --- pytrustnfe/nfse/bh/__init__.py | 4 ++-- pytrustnfe/nfse/floripa/__init__.py | 1 - setup.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pytrustnfe/nfse/bh/__init__.py b/pytrustnfe/nfse/bh/__init__.py index f96f89c..2115625 100644 --- a/pytrustnfe/nfse/bh/__init__.py +++ b/pytrustnfe/nfse/bh/__init__.py @@ -54,10 +54,10 @@ def _send(certificado, method, **kwargs): response = client.service[method](xml_cabecalho, xml_send) - response, obj = sanitize_response(response.encode('utf-8')) + response, obj = sanitize_response(response) return { 'sent_xml': xml_send, - 'received_xml': response.decode('utf-8'), + 'received_xml': response, 'object': obj } diff --git a/pytrustnfe/nfse/floripa/__init__.py b/pytrustnfe/nfse/floripa/__init__.py index 817c430..4229c17 100644 --- a/pytrustnfe/nfse/floripa/__init__.py +++ b/pytrustnfe/nfse/floripa/__init__.py @@ -112,7 +112,6 @@ def consultar_nota(certificado, **kwargs): headers = {"Accept": "application/json", "Authorization": "Bearer %s" % kwargs['access_token']} r = requests.get(url, headers=headers) - print(r.status_code) if r.status_code == 200: return r.text else: diff --git a/setup.py b/setup.py index 8bb9ce5..dc49cfd 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.21" +VERSION = "1.0.22" setup( From f01405affaf763f154ae0a09d08b340b7f65532a Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Wed, 21 Nov 2018 00:28:11 -0200 Subject: [PATCH 68/85] =?UTF-8?q?[FIX]=20Sempre=20mostra=20o=20valor=20zer?= =?UTF-8?q?ado=20de=20IPI=20e=20aliquota=20caso=20n=C3=A3o=20existir?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/danfe.py | 6 ++---- setup.py | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 41ed827..509c384 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -761,10 +761,8 @@ obsCont[@xCampo='NomeVendedor']") self.stringRight(nMr - 26.5, nLin, format_number(vICMS)) self.stringRight(nMr - 7.5, nLin, format_number(pICMS)) - if vIPI: - self.stringRight(nMr - 14.5, nLin, format_number(vIPI)) - if pIPI: - self.stringRight(nMr - 0.5, nLin, format_number(pIPI)) + self.stringRight(nMr - 14.5, nLin, format_number(vIPI or '0.00')) + self.stringRight(nMr - 0.5, nLin, format_number(pIPI or '0.00')) # Código Item line_cod = nLin diff --git a/setup.py b/setup.py index dc49cfd..767a8f8 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.22" +VERSION = "1.0.23" setup( From 2723aece89b57a3a33c037107c6e14790b9dad0b Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 26 Nov 2018 19:33:16 -0200 Subject: [PATCH 69/85] [ADD] Adiciona urls do qrcode para NFCe --- pytrustnfe/urls.py | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 2 +- 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 pytrustnfe/urls.py diff --git a/pytrustnfe/urls.py b/pytrustnfe/urls.py new file mode 100644 index 0000000..2e858a7 --- /dev/null +++ b/pytrustnfe/urls.py @@ -0,0 +1,87 @@ +AC = '12' +AL = '27' +AM = '13' +AP = '16' +BA = '29' +CE = '23' +DF = '53' +ES = '32' +GO = '52' +MA = '21' +MG = '31' +MS = '50' +MT = '51' +PA = '15' +PB = '25' +PE = '26' +PI = '22' +PR = '41' +RJ = '33' +RN = '24' +RO = '11' +RR = '14' +RS = '43' +SC = '42' +SE = '28' +SP = '35' +TO = '17' + +PRODUCAO = '1' +HOMOLOGACAO = '2' + +URLS = { + PRODUCAO: { + AC: 'http://www.sefaznet.ac.gov.br/nfce/qrcode?', + AL: 'http://nfce.sefaz.al.gov.br/QRCode/consultarNFCe.jsp?', + AM: 'http://sistemas.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp?', + AP: 'https://www.sefaz.ap.gov.br/nfce/nfcep.php?', + BA: 'http://nfe.sefaz.ba.gov.br/servicos/nfce/qrcode.aspx?', + DF: 'http://www.fazenda.df.gov.br/nfce/qrcode?', + GO: 'http://nfe.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe?', + MA: 'http://nfce.sefaz.ma.gov.br/portal/consultarNFCe.jsp?', + MS: 'http://www.dfe.ms.gov.br/nfce/qrcode?', + MT: 'http://www.sefaz.mt.gov.br/nfce/consultanfce?', + PA: 'https://appnfc.sefa.pa.gov.br/portal/view/consultas/nfce/nfceForm.seam?', # noqa + PB: 'http://www.receita.pb.gov.br/nfce?', + PE: 'http://nfce.sefaz.pe.gov.br/nfce/consulta?', + PI: 'http://www.sefaz.pi.gov.br/nfce/qrcode?', + PR: 'http://www.fazenda.pr.gov.br/nfce/qrcode?', + RJ: 'http://www4.fazenda.rj.gov.br/consultaNFCe/QRCode?', + RN: 'http://nfce.set.rn.gov.br/consultarNFCe.aspx?', + RO: 'http://www.nfce.sefin.ro.gov.br/consultanfce/consulta.jsp?', + RR: 'https://www.sefaz.rr.gov.br/nfce/servlet/qrcode?', + RS: 'https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx?', + SE: 'http://www.nfce.se.gov.br/nfce/qrcode?', + SP: 'https://www.nfce.fazenda.sp.gov.br/qrcode?', + TO: 'http://www.sefaz.to.gov.br/nfce/qrcode?', + }, + HOMOLOGACAO: { + AC: 'http://www.hml.sefaznet.ac.gov.br/nfce/qrcode?', + AL: 'http://nfce.sefaz.al.gov.br/QRCode/consultarNFCe.jsp?', + AM: 'http://homnfce.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp?', + AP: 'https://www.sefaz.ap.gov.br/nfcehml/nfce.php?', + BA: 'http://nfe.sefaz.ba.gov.br/servicos/nfce/qrcode.aspx?', + DF: 'http://www.fazenda.df.gov.br/nfce/qrcode?', + GO: 'http://homolog.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe?', + MA: 'http://homologacao.sefaz.ma.gov.br/portal/consultarNFCe.jsp?', + MS: 'http://www.dfe.ms.gov.br/nfce/qrcode?', + MT: 'http://homologacao.sefaz.mt.gov.br/nfce/consultanfce?', + PA: 'https://appnfc.sefa.pa.gov.br/portal-homologacao/view/consultas/nfce/nfceForm.seam?', # noqa + PB: 'http://www.receita.pb.gov.br/nfcehom?', + PE: 'http://nfcehomolog.sefaz.pe.gov.br/nfce/consulta?', + PI: 'http://www.sefaz.pi.gov.br/nfce/qrcode?', + PR: 'http://www.fazenda.pr.gov.br/nfce/qrcode?', + RJ: 'http://www4.fazenda.rj.gov.br/consultaNFCe/QRCode?', + RN: 'http://hom.nfce.set.rn.gov.br/consultarNFCe.aspx?', + RO: 'http://200.174.88.103:8080/nfce/servlet/qrcode?', + RR: 'https://www.sefaz.rr.gov.br/nfce/servlet/qrcode?', + RS: 'https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx?', + SE: 'http://www.hom.nfe.se.gov.br/nfce/qrcode?', + SP: 'https://www.homologacao.nfce.fazenda.sp.gov.br/qrcode?', + TO: 'http://homologacao.sefaz.to.gov.br/nfce/qrcode?', + } +} + + +def url_qrcode(estado, ambiente): + return URLS[ambiente][estado] diff --git a/setup.py b/setup.py index 767a8f8..deaa0aa 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.23" +VERSION = "1.0.24" setup( From a81c869a565bb85d0202990126506159d0e2281d Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Fri, 30 Nov 2018 10:38:33 -0200 Subject: [PATCH 70/85] [FIX] Fix https warnings --- pytrustnfe/nfe/__init__.py | 4 ++++ setup.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index e4f406a..ac5aad6 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -4,12 +4,15 @@ import os +import requests from lxml import etree from .assinatura import Assinatura from pytrustnfe.xml import render_xml, sanitize_response from pytrustnfe.utils import gerar_chave, ChaveNFe from pytrustnfe.Servidores import localizar_url from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key +from requests.packages.urllib3.exceptions import InsecureRequestWarning + # Zeep from requests import Session @@ -89,6 +92,7 @@ def _send(certificado, method, **kwargs): if namespaceNFe is not None: namespaceNFe.set('xmlns', 'http://www.portalfiscal.inf.br/nfe') + requests.packages.urllib3.disable_warnings(InsecureRequestWarning) with client.settings(raw_response=True): response = client.service[first_operation](xml) response, obj = sanitize_response(response.text) diff --git a/setup.py b/setup.py index deaa0aa..71f2633 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.24" +VERSION = "1.0.25" setup( From 8c2de797aa419c0673f1aa3fce3e0b26f288303b Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 4 Dec 2018 17:17:30 -0200 Subject: [PATCH 71/85] * [FIX] Ajuste na URL do parana --- pytrustnfe/urls.py | 4 ++-- setup.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pytrustnfe/urls.py b/pytrustnfe/urls.py index 2e858a7..97b44f8 100644 --- a/pytrustnfe/urls.py +++ b/pytrustnfe/urls.py @@ -45,7 +45,7 @@ URLS = { PB: 'http://www.receita.pb.gov.br/nfce?', PE: 'http://nfce.sefaz.pe.gov.br/nfce/consulta?', PI: 'http://www.sefaz.pi.gov.br/nfce/qrcode?', - PR: 'http://www.fazenda.pr.gov.br/nfce/qrcode?', + PR: 'http://www.fazenda.pr.gov.br/nfce/consulta?', RJ: 'http://www4.fazenda.rj.gov.br/consultaNFCe/QRCode?', RN: 'http://nfce.set.rn.gov.br/consultarNFCe.aspx?', RO: 'http://www.nfce.sefin.ro.gov.br/consultanfce/consulta.jsp?', @@ -70,7 +70,7 @@ URLS = { PB: 'http://www.receita.pb.gov.br/nfcehom?', PE: 'http://nfcehomolog.sefaz.pe.gov.br/nfce/consulta?', PI: 'http://www.sefaz.pi.gov.br/nfce/qrcode?', - PR: 'http://www.fazenda.pr.gov.br/nfce/qrcode?', + PR: 'http://www.fazenda.pr.gov.br/nfce/consulta?', RJ: 'http://www4.fazenda.rj.gov.br/consultaNFCe/QRCode?', RN: 'http://hom.nfce.set.rn.gov.br/consultarNFCe.aspx?', RO: 'http://200.174.88.103:8080/nfce/servlet/qrcode?', diff --git a/setup.py b/setup.py index 71f2633..83d20ce 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.25" +VERSION = "1.0.26" setup( @@ -12,7 +12,7 @@ setup( author_email='danimaribeiro@gmail.com', keywords=['nfe', 'mdf-e'], classifiers=[ - 'Development Status :: 4 - Beta', + 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', 'Intended Audience :: Developers', 'License :: OSI Approved :: GNU Lesser General Public License v2 or \ From 8de6521e8d854b9e22b73ba183e04a1c0d1ae91f Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Wed, 5 Dec 2018 02:13:35 -0200 Subject: [PATCH 72/85] =?UTF-8?q?[FIX]=20Adicionando=20complemento=20de=20?= =?UTF-8?q?endere=C3=A7o=20na=20danfe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/danfe.py | 7 +++++-- setup.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 509c384..f2735cb 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -329,6 +329,7 @@ class danfe(object): cEnd = tagtext(oNode=elem_emit, cTag='xLgr') + ', ' + tagtext( oNode=elem_emit, cTag='nro') + ' - ' + cEnd += tagtext(oNode=elem_emit, cTag='xCpl') + ' - ' cEnd += tagtext(oNode=elem_emit, cTag='xBairro') + '
' + tagtext( oNode=elem_emit, cTag='xMun') + ' - ' cEnd += 'Fone: ' + tagtext(oNode=elem_emit, cTag='fone') + '
' @@ -416,8 +417,9 @@ class danfe(object): cDt, cHr = getdateByTimezone( tagtext(oNode=elem_ide, cTag='dhSaiEnt'), timezone) self.string(nMr - 24, self.nlin + 14.3, cDt + ' ' + cHr) # Dt saída - cEnd = tagtext(oNode=elem_dest, cTag='xLgr') + ', ' + tagtext( - oNode=elem_dest, cTag='nro') + cEnd = '%s, %s %s' % (tagtext(oNode=elem_dest, cTag='xLgr'), + tagtext(oNode=elem_dest, cTag='nro'), + tagtext(oNode=elem_dest, cTag='xCpl')) self.string(self.nLeft + 1, self.nlin + 14.3, cEnd) self.string(nMr - 98, self.nlin + 14.3, tagtext(oNode=elem_dest, cTag='xBairro')) @@ -895,6 +897,7 @@ obsCont[@xCampo='NomeVendedor']") cEnd = tagtext(oNode=el_dest, cTag='xNome') + ' - ' cEnd += tagtext(oNode=el_dest, cTag='xLgr') + ', ' + tagtext( oNode=el_dest, cTag='nro') + ', ' + cEnd += tagtext(oNode=el_dest, cTag='xCpl') + ' ' cEnd += tagtext(oNode=el_dest, cTag='xBairro') + ', ' + tagtext( oNode=el_dest, cTag='xMun') + ' - ' cEnd += tagtext(oNode=el_dest, cTag='UF') diff --git a/setup.py b/setup.py index 83d20ce..72e449b 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.26" +VERSION = "1.0.27" setup( From 59d4cf94b4b479d49ae56706daf09761ff20c38a Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Thu, 6 Dec 2018 12:30:52 -0200 Subject: [PATCH 73/85] [FIX] Ajuste de cancelamento NFSe BH --- pytrustnfe/nfse/bh/__init__.py | 6 ++++-- pytrustnfe/nfse/bh/templates/CancelarNfse.xml | 4 ++-- setup.py | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/pytrustnfe/nfse/bh/__init__.py b/pytrustnfe/nfse/bh/__init__.py index 2115625..2172d4a 100644 --- a/pytrustnfe/nfse/bh/__init__.py +++ b/pytrustnfe/nfse/bh/__init__.py @@ -17,15 +17,17 @@ def _render(certificado, method, **kwargs): xml_send = render_xml(path, '%s.xml' % method, True, **kwargs) reference = '' + ref_lote = '' if method == 'GerarNfse': reference = 'rps:%s' % kwargs['rps']['numero'] ref_lote = 'lote%s' % kwargs['rps']['numero_lote'] elif method == 'CancelarNfse': - reference = 'Cancelamento_NF%s' % kwargs['cancelamento']['numero_nfse'] + reference = 'pedidoCancelamento_%s' % kwargs['cancelamento']['numero_nfse'] signer = Assinatura(certificado.pfx, certificado.password) xml_send = signer.assina_xml(xml_send, reference) - xml_send = signer.assina_xml(etree.fromstring(xml_send), ref_lote) + if ref_lote: + xml_send = signer.assina_xml(etree.fromstring(xml_send), ref_lote) return xml_send.encode('utf-8') diff --git a/pytrustnfe/nfse/bh/templates/CancelarNfse.xml b/pytrustnfe/nfse/bh/templates/CancelarNfse.xml index 137897e..764ab18 100644 --- a/pytrustnfe/nfse/bh/templates/CancelarNfse.xml +++ b/pytrustnfe/nfse/bh/templates/CancelarNfse.xml @@ -1,4 +1,4 @@ - + @@ -7,7 +7,7 @@ {{ cancelamento.inscricao_municipal }} {{ cancelamento.cidade }} - 1 + 2 diff --git a/setup.py b/setup.py index 72e449b..a18369c 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.27" +VERSION = "1.0.28" setup( From c74893b6584674785113c9a5922247d6ae3c293a Mon Sep 17 00:00:00 2001 From: marinaGD <36993009+marinaGD@users.noreply.github.com> Date: Wed, 19 Dec 2018 20:07:24 -0200 Subject: [PATCH 74/85] =?UTF-8?q?[FIX]=20Inutiliza=C3=A7=C3=A3o=20NFe=20CE?= =?UTF-8?q?=20=20-=20Add=20a=20patch=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/__init__.py | 31 ++++++++++++++++++++++--------- pytrustnfe/nfe/patch.py | 30 ++++++++++++++++++++++++++++++ setup.py | 2 +- 3 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 pytrustnfe/nfe/patch.py diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index ac5aad6..0083b3c 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -6,6 +6,7 @@ import os import requests from lxml import etree +from .patch import nfeInutilizacaoCE, has_patch from .assinatura import Assinatura from pytrustnfe.xml import render_xml, sanitize_response from pytrustnfe.utils import gerar_chave, ChaveNFe @@ -65,11 +66,7 @@ def _render(certificado, method, sign, **kwargs): return xml_send -def _send(certificado, method, **kwargs): - xml_send = kwargs["xml"] - base_url = localizar_url( - method, kwargs['estado'], kwargs['modelo'], kwargs['ambiente']) - +def _get_session(certificado): cert, key = extract_cert_and_key_from_pfx( certificado.pfx, certificado.password) cert, key = save_cert_key(cert, key) @@ -77,16 +74,32 @@ def _send(certificado, method, **kwargs): session = Session() session.cert = (cert, key) session.verify = False - transport = Transport(session=session) + return session - parser = etree.XMLParser(strip_cdata=False) - xml = etree.fromstring(xml_send, parser=parser) +def _get_client(base_url, transport): client = Client(base_url, transport=transport) - port = next(iter(client.wsdl.port_types)) first_operation = [x for x in iter( client.wsdl.port_types[port].operations) if "zip" not in x.lower()][0] + return first_operation, client + + +def _send(certificado, method, **kwargs): + xml_send = kwargs["xml"] + base_url = localizar_url( + method, kwargs['estado'], kwargs['modelo'], kwargs['ambiente']) + session = _get_session(certificado) + if has_patch: + return nfeInutilizacaoCE(session, xml_send) + transport = Transport(session=session) + first_op, client = _get_client(base_url, transport) + return _send_zeep(first_op, client, xml_send) + + +def _send_zeep(first_operation, client, xml_send): + parser = etree.XMLParser(strip_cdata=False) + xml = etree.fromstring(xml_send, parser=parser) namespaceNFe = xml.find(".//{http://www.portalfiscal.inf.br/nfe}NFe") if namespaceNFe is not None: diff --git a/pytrustnfe/nfe/patch.py b/pytrustnfe/nfe/patch.py new file mode 100644 index 0000000..8cb063f --- /dev/null +++ b/pytrustnfe/nfe/patch.py @@ -0,0 +1,30 @@ +from ..Servidores import SIGLA_ESTADO +from pytrustnfe.xml import sanitize_response + +methods = [ + 'nfeInutilizacaoCE'] + + +def has_patch(cod_estado, metodo): + uf = SIGLA_ESTADO[cod_estado] + method = metodo+uf + return method in methods + + +def nfeInutilizacaoCE(session, xml_send): + soap = '\ +' + xml_send + '' + headers = { + 'SOAPAction': "", + 'Content-Type': 'application/soap+xml; charset="utf-8"' + } + response = session.post( + 'https://nfeh.sefaz.ce.gov.br/nfe4/services/NFeInutilizacao4', + data=soap, headers=headers) + response, obj = sanitize_response(response.text) + return { + 'sent_xml': xml_send, + 'received_xml': response, + 'object': obj.Body.getchildren()[0] + } diff --git a/setup.py b/setup.py index a18369c..1b5c59d 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.28" +VERSION = "1.0.29" setup( From b0a9e5370e9f9a7e847db0a80ff60285c6e5a332 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Wed, 19 Dec 2018 20:46:27 -0200 Subject: [PATCH 75/85] [FIX] Fix patch method for inutilizacao - wrong merge --- pytrustnfe/nfe/__init__.py | 7 ++++--- pytrustnfe/nfe/patch.py | 22 +++++++++++++--------- setup.py | 2 +- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index 0083b3c..f1bfc52 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -6,7 +6,7 @@ import os import requests from lxml import etree -from .patch import nfeInutilizacaoCE, has_patch +from .patch import has_patch from .assinatura import Assinatura from pytrustnfe.xml import render_xml, sanitize_response from pytrustnfe.utils import gerar_chave, ChaveNFe @@ -90,8 +90,9 @@ def _send(certificado, method, **kwargs): base_url = localizar_url( method, kwargs['estado'], kwargs['modelo'], kwargs['ambiente']) session = _get_session(certificado) - if has_patch: - return nfeInutilizacaoCE(session, xml_send) + patch = has_patch(kwargs['estado'], method) + if patch: + return patch(session, xml_send) transport = Transport(session=session) first_op, client = _get_client(base_url, transport) return _send_zeep(first_op, client, xml_send) diff --git a/pytrustnfe/nfe/patch.py b/pytrustnfe/nfe/patch.py index 8cb063f..6ca85ef 100644 --- a/pytrustnfe/nfe/patch.py +++ b/pytrustnfe/nfe/patch.py @@ -1,15 +1,6 @@ from ..Servidores import SIGLA_ESTADO from pytrustnfe.xml import sanitize_response -methods = [ - 'nfeInutilizacaoCE'] - - -def has_patch(cod_estado, metodo): - uf = SIGLA_ESTADO[cod_estado] - method = metodo+uf - return method in methods - def nfeInutilizacaoCE(session, xml_send): soap = '\ @@ -28,3 +19,16 @@ def nfeInutilizacaoCE(session, xml_send): 'received_xml': response, 'object': obj.Body.getchildren()[0] } + + +methods = { + 'NfeInutilizacaoCE': nfeInutilizacaoCE +} + + +def has_patch(cod_estado, metodo): + uf = SIGLA_ESTADO[cod_estado] + method = metodo+uf + if method in methods: + return methods[method] + return None diff --git a/setup.py b/setup.py index 1b5c59d..3c07021 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.29" +VERSION = "1.0.30" setup( From 9c4f76446b0999473ae877e66b08ee219f755391 Mon Sep 17 00:00:00 2001 From: Ednaldo Batista Barreto Date: Fri, 11 Jan 2019 10:51:14 -0300 Subject: [PATCH 76/85] urlChave e Webservices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Foi adicionado uma função para retorno da urlChave do NFC-e que é diferente da url do QRCode; Foi corrigido os webservices da sefaz BA que estava as antigas; --- pytrustnfe/Servidores.py | 60 ++++++++++++++++++++++++++++++------------- pytrustnfe/urls.py | 67 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 107 insertions(+), 20 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 1551d4f..273d28b 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -291,25 +291,49 @@ UFAM = { } UFBA = { - AMBIENTE_PRODUCAO: { - 'servidor': 'nfe.sefaz.ba.gov.br', - WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', # noqa - WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa - WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', # noqa - WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa - WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', # noqa - WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa - WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', # noqa + NFE_MODELO: { + AMBIENTE_PRODUCAO: { + 'servidor': 'nfe.sefaz.ba.gov.br', + WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', # noqa + WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', # noqa + WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', # noqa + WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', # noqa + }, + AMBIENTE_HOMOLOGACAO: { + 'servidor': 'hnfe.sefaz.ba.gov.br', + WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', # noqa + WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', # noqa + WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', # noqa + WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', # noqa + } }, - AMBIENTE_HOMOLOGACAO: { - 'servidor': 'hnfe.sefaz.ba.gov.br', - WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', # noqa - WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa - WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', # noqa - WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa - WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', # noqa - WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa - WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', # noqa + NFCE_MODELO: { + AMBIENTE_PRODUCAO: { + 'servidor': 'nfce.svrs.rs.gov.br', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx?', + }, + AMBIENTE_HOMOLOGACAO: { + 'servidor': 'nfce-homologacao.svrs.rs.gov.br', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx?', + } } } diff --git a/pytrustnfe/urls.py b/pytrustnfe/urls.py index 97b44f8..1a6b773 100644 --- a/pytrustnfe/urls.py +++ b/pytrustnfe/urls.py @@ -35,7 +35,7 @@ URLS = { AL: 'http://nfce.sefaz.al.gov.br/QRCode/consultarNFCe.jsp?', AM: 'http://sistemas.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp?', AP: 'https://www.sefaz.ap.gov.br/nfce/nfcep.php?', - BA: 'http://nfe.sefaz.ba.gov.br/servicos/nfce/qrcode.aspx?', + BA: 'http://nfe.sefaz.ba.gov.br/servicos/nfce/modulos/geral/NFCEC_consulta_chave_acesso.aspx?p=', DF: 'http://www.fazenda.df.gov.br/nfce/qrcode?', GO: 'http://nfe.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe?', MA: 'http://nfce.sefaz.ma.gov.br/portal/consultarNFCe.jsp?', @@ -60,7 +60,7 @@ URLS = { AL: 'http://nfce.sefaz.al.gov.br/QRCode/consultarNFCe.jsp?', AM: 'http://homnfce.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp?', AP: 'https://www.sefaz.ap.gov.br/nfcehml/nfce.php?', - BA: 'http://nfe.sefaz.ba.gov.br/servicos/nfce/qrcode.aspx?', + BA: 'http://hnfe.sefaz.ba.gov.br/servicos/nfce/qrcode.aspx?', DF: 'http://www.fazenda.df.gov.br/nfce/qrcode?', GO: 'http://homolog.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe?', MA: 'http://homologacao.sefaz.ma.gov.br/portal/consultarNFCe.jsp?', @@ -82,6 +82,69 @@ URLS = { } } +URLS_EXIBICAO = { + PRODUCAO: { + AC: 'www.sefaznet.ac.gov.br/nfce/consulta', + AL: 'www.sefaz.al.gov.br/nfce/consulta', + AM: 'www.sefaz.am.gov.br/nfce/consulta', + AP: 'www.sefaz.ap.gov.br/nfce/consulta', + BA: 'http://www.sefaz.ba.gov.br/nfce/consulta', + CE: 'www.sefaz.ce.gov.br/nfce/consulta', + DF: 'www.fazenda.df.gov.br/nfce/consulta', + ES: 'www.sefaz.es.gov.br/nfce/consulta', + GO: 'www.sefaz.go.gov.br/nfce/consulta', + MA: 'www.sefaz.ma.gov.br/nfce/consulta', + MS: 'www.dfe.ms.gov.br/nfce/consulta', + MT: 'www.sefaz.mt.gov.br/nfce/consulta', + MG: 'www.fazenda.mg.gov.br/nfce/consulta', + PA: 'www.sefa.pa.gov.br/nfce/consulta', + PB: 'www.receita.pb.gov.br/nfce/consulta', + PE: 'nfce.sefaz.pe.gov.br/nfce/consulta', + PI: 'www.sefaz.pi.gov.br/nfce/consulta', + PR: 'www.fazenda.pr.gov.br/nfce/consulta', + RJ: 'www.fazenda.rj.gov.br/nfce/consulta', + RN: 'www.set.rn.gov.br/nfce/consulta', + RO: 'www.sefin.ro.gov.br/nfce/consulta', + RR: 'www.sefaz.rr.gov.br/nfce/consulta', + RS: 'www.sefaz.rs.gov.br/nfce/consulta', + SE: 'http://www.nfce.se.gov.br/nfce/consulta', + SP: 'https://www.nfce.fazenda.sp.gov.br/consulta', + TO: 'www.sefaz.to.gov.br/nfce/consulta', + }, + HOMOLOGACAO: { + AC: 'www.sefaznet.ac.gov.br/nfce/consulta', + AL: 'www.sefaz.al.gov.br/nfce/consulta', + AM: 'www.sefaz.am.gov.br/nfce/consulta', + AP: 'www.sefaz.ap.gov.br/nfce/consulta', + BA: 'http://hinternet.sefaz.ba.gov.br/nfce/consulta', + CE: 'www.sefaz.ce.gov.br/nfce/consulta', + DF: 'www.fazenda.df.gov.br/nfce/consulta', + ES: 'www.sefaz.es.gov.br/nfce/consulta', + GO: 'www.sefaz.go.gov.br/nfce/consulta', + MA: 'www.sefaz.ma.gov.br/nfce/consulta', + MS: 'www.dfe.ms.gov.br/nfce/consulta', + MT: 'www.sefaz.mt.gov.br/nfce/consulta', + MG: 'www.fazenda.mg.gov.br/nfce/consulta', + PA: 'www.sefa.pa.gov.br/nfce/consulta', + PB: 'www.receita.pb.gov.br/nfcehom', + PE: 'nfce.sefaz.pe.gov.br/nfce/consulta', + PI: 'www.sefaz.pi.gov.br/nfce/consulta', + PR: 'www.fazenda.pr.gov.br/nfce/consulta', + RJ: 'www.fazenda.rj.gov.br/nfce/consulta', + RN: 'www.set.rn.gov.br/nfce/consulta', + RO: 'www.sefin.ro.gov.br/nfce/consulta', + RR: 'www.sefaz.rr.gov.br/nfce/consulta', + RS: 'www.sefaz.rs.gov.br/nfce/consulta', + SE: 'http://www.hom.nfe.se.gov.br/nfce/consulta', + SP: 'https://www.homologacao.nfce.fazenda.sp.gov.br/consulta', + TO: 'www.sefaz.to.gov.br/nfce/consulta', + } +} + def url_qrcode(estado, ambiente): return URLS[ambiente][estado] + + +def url_qrcode_exibicao(estado, ambiente): + return URLS_EXIBICAO[ambiente][estado] From 628c3a20bf9785ae470271cd8c138675e18b67a4 Mon Sep 17 00:00:00 2001 From: Ednaldo Batista Barreto Date: Fri, 11 Jan 2019 14:41:07 -0300 Subject: [PATCH 77/85] =?UTF-8?q?Corre=C3=A7=C3=A3o=20do=20p=3D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Retirada do p= --- pytrustnfe/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytrustnfe/urls.py b/pytrustnfe/urls.py index 1a6b773..cefd2d8 100644 --- a/pytrustnfe/urls.py +++ b/pytrustnfe/urls.py @@ -35,7 +35,7 @@ URLS = { AL: 'http://nfce.sefaz.al.gov.br/QRCode/consultarNFCe.jsp?', AM: 'http://sistemas.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp?', AP: 'https://www.sefaz.ap.gov.br/nfce/nfcep.php?', - BA: 'http://nfe.sefaz.ba.gov.br/servicos/nfce/modulos/geral/NFCEC_consulta_chave_acesso.aspx?p=', + BA: 'http://nfe.sefaz.ba.gov.br/servicos/nfce/modulos/geral/NFCEC_consulta_chave_acesso.aspx?', DF: 'http://www.fazenda.df.gov.br/nfce/qrcode?', GO: 'http://nfe.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe?', MA: 'http://nfce.sefaz.ma.gov.br/portal/consultarNFCe.jsp?', From 197f36b9ed216db1bf00f7dbd076843564932642 Mon Sep 17 00:00:00 2001 From: Ednaldo Batista Barreto Date: Fri, 11 Jan 2019 14:54:13 -0300 Subject: [PATCH 78/85] =?UTF-8?q?Erro=20na=20url=20de=20produ=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Correção na url de produção, falha boba --- pytrustnfe/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytrustnfe/urls.py b/pytrustnfe/urls.py index cefd2d8..a7823e4 100644 --- a/pytrustnfe/urls.py +++ b/pytrustnfe/urls.py @@ -35,7 +35,7 @@ URLS = { AL: 'http://nfce.sefaz.al.gov.br/QRCode/consultarNFCe.jsp?', AM: 'http://sistemas.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp?', AP: 'https://www.sefaz.ap.gov.br/nfce/nfcep.php?', - BA: 'http://nfe.sefaz.ba.gov.br/servicos/nfce/modulos/geral/NFCEC_consulta_chave_acesso.aspx?', + BA: 'http://nfe.sefaz.ba.gov.br/servicos/nfce/qrcode.aspx?', DF: 'http://www.fazenda.df.gov.br/nfce/qrcode?', GO: 'http://nfe.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe?', MA: 'http://nfce.sefaz.ma.gov.br/portal/consultarNFCe.jsp?', From bf03d54107a53ab7aad98cda99238c128f7e2396 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 14 Jan 2019 20:41:59 -0200 Subject: [PATCH 79/85] [VERSION] Increment pytest version to fix build --- requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 63f4786..3682b61 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ pyOpenSSL >= 16.0.0, < 18 certifi >= 2015.11.20.1 xmlsec >= 1.3.3 reportlab -pytest +pytest>=4.1.1 pytest-cov pytz zeep diff --git a/setup.py b/setup.py index 3c07021..2101389 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.30" +VERSION = "1.0.31" setup( From 945dd77beae8818ab7382b90426a5de159113287 Mon Sep 17 00:00:00 2001 From: marinaGD <36993009+marinaGD@users.noreply.github.com> Date: Tue, 15 Jan 2019 11:43:16 -0200 Subject: [PATCH 80/85] [FIX] nfeInutilizacaoCE url (#211) * fix CE url in patch * flake8 * verifiy environment before choose URI --- pytrustnfe/nfe/__init__.py | 2 +- pytrustnfe/nfe/patch.py | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index f1bfc52..8395f24 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -92,7 +92,7 @@ def _send(certificado, method, **kwargs): session = _get_session(certificado) patch = has_patch(kwargs['estado'], method) if patch: - return patch(session, xml_send) + return patch(session, xml_send, kwargs['ambiente']) transport = Transport(session=session) first_op, client = _get_client(base_url, transport) return _send_zeep(first_op, client, xml_send) diff --git a/pytrustnfe/nfe/patch.py b/pytrustnfe/nfe/patch.py index 6ca85ef..a354b21 100644 --- a/pytrustnfe/nfe/patch.py +++ b/pytrustnfe/nfe/patch.py @@ -2,7 +2,7 @@ from ..Servidores import SIGLA_ESTADO from pytrustnfe.xml import sanitize_response -def nfeInutilizacaoCE(session, xml_send): +def nfeInutilizacaoCE(session, xml_send, ambiente): soap = '\ ' + xml_send + '' @@ -10,9 +10,14 @@ def nfeInutilizacaoCE(session, xml_send): 'SOAPAction': "", 'Content-Type': 'application/soap+xml; charset="utf-8"' } - response = session.post( - 'https://nfeh.sefaz.ce.gov.br/nfe4/services/NFeInutilizacao4', - data=soap, headers=headers) + if ambiente == 1: + response = session.post( + 'https://nfe.sefaz.ce.gov.br/nfe4/services/NFeInutilizacao4', + data=soap, headers=headers) + else: + response = session.post( + 'https://nfeh.sefaz.ce.gov.br/nfe4/services/NFeInutilizacao4', + data=soap, headers=headers) response, obj = sanitize_response(response.text) return { 'sent_xml': xml_send, From 452af1ecb3a5fccf10593f097ca4248d41d6a471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Thu, 7 Feb 2019 15:19:37 +0000 Subject: [PATCH 81/85] =?UTF-8?q?Corrige=20url=20de=20consulta=20NFC-e=20P?= =?UTF-8?q?aran=C3=A1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/urls.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pytrustnfe/urls.py b/pytrustnfe/urls.py index a7823e4..25e65c1 100644 --- a/pytrustnfe/urls.py +++ b/pytrustnfe/urls.py @@ -101,7 +101,7 @@ URLS_EXIBICAO = { PB: 'www.receita.pb.gov.br/nfce/consulta', PE: 'nfce.sefaz.pe.gov.br/nfce/consulta', PI: 'www.sefaz.pi.gov.br/nfce/consulta', - PR: 'www.fazenda.pr.gov.br/nfce/consulta', + PR: 'http://www.fazenda.pr.gov.br/nfce/consulta', RJ: 'www.fazenda.rj.gov.br/nfce/consulta', RN: 'www.set.rn.gov.br/nfce/consulta', RO: 'www.sefin.ro.gov.br/nfce/consulta', @@ -129,7 +129,7 @@ URLS_EXIBICAO = { PB: 'www.receita.pb.gov.br/nfcehom', PE: 'nfce.sefaz.pe.gov.br/nfce/consulta', PI: 'www.sefaz.pi.gov.br/nfce/consulta', - PR: 'www.fazenda.pr.gov.br/nfce/consulta', + PR: 'http://www.fazenda.pr.gov.br/nfce/consulta', RJ: 'www.fazenda.rj.gov.br/nfce/consulta', RN: 'www.set.rn.gov.br/nfce/consulta', RO: 'www.sefin.ro.gov.br/nfce/consulta', From c16a31469e856771e81cc3f74a418c2235f0ab01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Luna?= Date: Fri, 8 Feb 2019 15:21:11 -0200 Subject: [PATCH 82/85] =?UTF-8?q?Incrementa=20vers=C3=A3o.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 2101389..c3f9bfb 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.31" +VERSION = "1.0.32" setup( From ba9e05538eb5906eed8e68f46552d6b173da1324 Mon Sep 17 00:00:00 2001 From: yk2kus Date: Wed, 13 Mar 2019 11:52:15 +0000 Subject: [PATCH 83/85] Fix 'bytes' object has no attribute 'encode' --- pytrustnfe/nfse/imperial/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pytrustnfe/nfse/imperial/__init__.py b/pytrustnfe/nfse/imperial/__init__.py index c21b085..5795629 100644 --- a/pytrustnfe/nfse/imperial/__init__.py +++ b/pytrustnfe/nfse/imperial/__init__.py @@ -25,10 +25,10 @@ def _send(certificado, method, **kwargs): soap = render_xml(path, 'SoapRequest.xml', False, soap_body=xml_send.decode()) client = HttpClient(base_url) response = client.post_soap(soap, 'NFeaction/AWS_NFE.%s' % method) - response, obj = sanitize_response(response.encode('utf-8')) + response, obj = sanitize_response(response) return { 'sent_xml': xml_send.decode(), - 'received_xml': response.decode(), + 'received_xml': response, 'object': obj } @@ -71,3 +71,4 @@ def cancelar_nfse(certificado, **kwargs): if "xml" not in kwargs: kwargs['xml'] = xml_cancelar_nfse(certificado, **kwargs) return _send(certificado, 'CANCELANOTAELETRONICA', **kwargs) + From b5bcf0cd8823c79e5d55fe9bd723f747402b90dd Mon Sep 17 00:00:00 2001 From: marinaGD Date: Wed, 13 Mar 2019 16:23:34 -0300 Subject: [PATCH 84/85] [FIX] Last item missed when doesnt fit in current page --- pytrustnfe/nfe/danfe.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index f2735cb..6bdaf1a 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -202,7 +202,7 @@ class danfe(object): self.adicionais(oXML=oXML, tamanho_diminuir=tamanho_ocupado) # Gera o restante das páginas do XML - while index < nId: + while index <= nId: self.newpage() self.ide_emit(oXML=oXML, timezone=timezone) index = self.produtos( @@ -784,6 +784,8 @@ obsCont[@xCampo='NomeVendedor']") self.canvas.setStrokeColor(black) self.nlin += nH + 3 + if (index == max_index): + id += 1 return id def calculo_issqn(self, oXML=None): From 051f3b8f122cbc67b05f410c5008e81e0ee8174d Mon Sep 17 00:00:00 2001 From: marinaGD Date: Wed, 13 Mar 2019 16:25:48 -0300 Subject: [PATCH 85/85] [VERSION] Increments version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c3f9bfb..c5ef24a 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.32" +VERSION = "1.0.33" setup(