Skip to content

Commit

Permalink
Merge pull request #77 from Engenere/nfe-ws-contingencia
Browse files Browse the repository at this point in the history
Habilita uso dos Autorizadores de Contingência para NF-e
  • Loading branch information
antoniospneto authored May 15, 2024
2 parents e62df76 + a17a38d commit 97cafc5
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 55 deletions.
2 changes: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 2.8.0
current_version = 2.9.0
commit = True
tag = True

Expand Down
5 changes: 5 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,8 @@ Changelog
~~~~~~~~~~~~~~~~~~

- Nota Paulistana

2.9.0 (2024-05-15)
~~~~~~~~~~~~~~~~~~

- Suporte para emissão de NF-e utilizando as Sefaz autorizadoras de contingência.
4 changes: 2 additions & 2 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ Overview
:alt: PyPI Package latest release
:target: https://pypi.org/project/erpbrasil.edoc

.. |commits-since| image:: https://img.shields.io/github/commits-since/erpbrasil/erpbrasil.edoc/v2.8.0.svg
.. |commits-since| image:: https://img.shields.io/github/commits-since/erpbrasil/erpbrasil.edoc/v2.9.0.svg
:alt: Commits since latest release
:target: https://github.com/erpbrasil/erpbrasil.edoc/compare/v2.8.0...master
:target: https://github.com/erpbrasil/erpbrasil.edoc/compare/v2.9.0...master

.. |wheel| image:: https://img.shields.io/pypi/wheel/erpbrasil.edoc.svg
:alt: PyPI Wheel
Expand Down
2 changes: 1 addition & 1 deletion docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
year = "2019"
author = "Luis Felipe Mileo"
copyright = f"{year}, {author}"
version = release = "2.8.0"
version = release = "2.9.0"

pygments_style = "trac"
templates_path = ["."]
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def read(*names, **kwargs):

setup(
name="erpbrasil.edoc",
version="2.8.0",
version="2.9.0",
license="MIT",
description=(
"Emissão de documentos fiscais e outras obrigações"
Expand Down
2 changes: 1 addition & 1 deletion src/erpbrasil/edoc/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from pkgutil import extend_path

__path__ = extend_path(__path__, __name__)
__version__ = "2.8.0"
__version__ = "2.9.0"

import abc

Expand Down
117 changes: 68 additions & 49 deletions src/erpbrasil/edoc/nfe.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,14 +166,16 @@
SVC_AN = {
AMBIENTE_PRODUCAO: {
"servidor": "www.svc.fazenda.gov.br",
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.svc.fazenda.gov.br",
"servidor": "hom.sefazvirtual.fazenda.gov.br",
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
Expand Down Expand Up @@ -644,41 +646,49 @@
},
}


# Dicionário `ESTADO_WS` mapeia unidade federativa (UF) para uma tupla contendo
# o serviço de webservices (WS) normal e o serviço de contingência.
# Cada chave é uma sigla de UF e cada valor é uma tupla (servico_normal,
# servico_contingencia). Exceção para a chave `AN` que representa o órgão de
# Ambiente Nacional e não uma UF.
ESTADO_WS = {
"AC": SVRS,
"AL": SVRS,
"AM": UFAM,
"AP": SVRS,
"BA": UFBA,
"CE": UFCE,
"DF": SVRS,
"ES": SVRS,
"GO": UFGO,
"MA": SVAN,
"MG": UFMG,
"MS": UFMS,
"MT": UFMT,
"PA": SVRS,
"PB": SVRS,
"PE": UFPE,
"PI": SVRS,
"PR": UFPR,
"RJ": SVRS,
"RN": SVRS,
"RO": SVRS,
"RR": SVRS,
"RS": UFRS,
"SC": SVRS,
"SE": SVRS,
"SP": UFSP,
"TO": SVRS,
"AN": AN,
"AC": (SVRS, SVC_AN),
"AL": (SVRS, SVC_AN),
"AM": (UFAM, SVC_RS),
"AP": (SVRS, SVC_AN),
"BA": (UFBA, SVC_RS),
"CE": (UFCE, SVC_AN),
"DF": (SVRS, SVC_AN),
"ES": (SVRS, SVC_AN),
"GO": (UFGO, SVC_RS),
"MA": (SVAN, SVC_RS),
"MG": (UFMG, SVC_AN),
"MS": (UFMS, SVC_RS),
"MT": (UFMT, SVC_RS),
"PA": (SVRS, SVC_AN),
"PB": (SVRS, SVC_AN),
"PE": (UFPE, SVC_RS),
"PI": (SVRS, SVC_RS),
"PR": (UFPR, SVC_RS),
"RJ": (SVRS, SVC_AN),
"RN": (SVRS, SVC_AN),
"RO": (SVRS, SVC_AN),
"RR": (SVRS, SVC_AN),
"RS": (UFRS, SVC_AN),
"SC": (SVRS, SVC_AN),
"SE": (SVRS, SVC_AN),
"SP": (UFSP, SVC_AN),
"TO": (SVRS, SVC_AN),
"AN": (AN, AN),
}


def localizar_url(servico, estado, mod="55", ambiente=2):
def localizar_url(servico, estado, mod="55", ambiente=2, contingencia=False):
sigla = SIGLA_ESTADO[estado]
ws = ESTADO_WS[sigla]

ws_normal, ws_contingencia = ESTADO_WS[sigla]
ws = ws_contingencia if contingencia else ws_normal

if servico in (WS_DFE_DISTRIBUICAO, WS_DOWNLOAD_NFE):
ws = AN
Expand Down Expand Up @@ -734,18 +744,37 @@ def __init__(
ambiente="2",
mod="55",
envio_sincrono=False,
contingencia=False,
):
super().__init__(transmissao, envio_sincrono)
self.versao = str(versao)
self.ambiente = str(ambiente)
self.uf = int(uf)
self.mod = str(mod)
self.contingencia = contingencia

def _edoc_situacao_ja_enviado(self, proc_consulta):
if proc_consulta.resposta.cStat in ("100", "110", "150", "301", "302"):
return True
return False

def _get_ws_endpoint(self, service):
"""
Obtém o endpoint de um webservice específico.
Esta função localiza a URL do endpoint para um dado serviço,
utilizando atributos da instância como a unidade federativa (UF),
o modelo (mod), o ambiente e a contingência.
"""
endpoint = localizar_url(
service,
str(self.uf),
self.mod,
int(self.ambiente),
self.contingencia,
)
return endpoint

def get_documento_id(self, edoc):
return edoc.infNFe.Id[:3], edoc.infNFe.Id[3:]

Expand All @@ -760,7 +789,7 @@ def status_servico(self):
return self._post(
raiz,
# 'https://hom.sefazvirtual.fazenda.gov.br/NFeStatusServico4/NFeStatusServico4.asmx?wsdl',
localizar_url(WS_NFE_SITUACAO, str(self.uf), self.mod, int(self.ambiente)),
self._get_ws_endpoint(WS_NFE_SITUACAO),
"nfeStatusServicoNF",
retConsStatServ,
)
Expand All @@ -777,7 +806,7 @@ def consulta_documento(self, chave):
return self._post(
raiz,
# 'https://hom.sefazvirtual.fazenda.gov.br/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl',
localizar_url(WS_NFE_CONSULTA, str(self.uf), self.mod, int(self.ambiente)),
self._get_ws_endpoint(WS_NFE_CONSULTA),
"nfeConsultaNF",
retConsSitNFe,
)
Expand Down Expand Up @@ -805,9 +834,7 @@ def envia_documento(self, edoc):
return self._post(
xml_envio_etree,
# 'https://hom.sefazvirtual.fazenda.gov.br/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl',
localizar_url(
WS_NFE_AUTORIZACAO, str(self.uf), self.mod, int(self.ambiente)
),
self._get_ws_endpoint(WS_NFE_AUTORIZACAO),
"nfeAutorizacaoLote",
retEnviNFe,
)
Expand All @@ -822,9 +849,7 @@ def envia_inutilizacao(self, evento):

return self._post(
xml_envio_etree,
localizar_url(
WS_NFE_INUTILIZACAO, str(self.uf), self.mod, int(self.ambiente)
),
self._get_ws_endpoint(WS_NFE_INUTILIZACAO),
"nfeInutilizacaoNF",
retInutNFe,
)
Expand All @@ -844,9 +869,7 @@ def consulta_recibo(self, numero=False, proc_envio=False):
raiz.original_tagname_ = "consReciNFe"
return self._post(
raiz,
localizar_url(
WS_NFE_RET_AUTORIZACAO, str(self.uf), self.mod, int(self.ambiente)
),
self._get_ws_endpoint(WS_NFE_RET_AUTORIZACAO),
# 'ws/nferetautorizacao4.asmx'
"nfeRetAutorizacaoLote",
retConsReciNFe,
Expand All @@ -871,9 +894,7 @@ def enviar_lote_evento(self, lista_eventos, numero_lote=False):

return self._post(
xml_envio_etree,
localizar_url(
WS_NFE_RECEPCAO_EVENTO, str(self.uf), self.mod, int(self.ambiente)
),
self._get_ws_endpoint(WS_NFE_RECEPCAO_EVENTO),
"nfeRecepcaoEvento",
retEnvEvento,
)
Expand Down Expand Up @@ -1023,9 +1044,7 @@ def consultar_distribuicao(

return self._post(
raiz,
localizar_url(
WS_DFE_DISTRIBUICAO, str(self.uf), self.mod, int(self.ambiente)
),
self._get_ws_endpoint(WS_DFE_DISTRIBUICAO),
"nfeDistDFeInteresse",
retDistDFeInt,
)
Expand Down Expand Up @@ -1091,7 +1110,7 @@ def consultar_cadastro(self, uf, cnpj=None, cpf=None, ie=None):

return self._post(
raiz,
localizar_url(WS_NFE_CADASTRO, str(self.uf), self.mod, int(self.ambiente)),
self._get_ws_endpoint(WS_NFE_CADASTRO),
"consultaCadastro",
retConsCad,
)

0 comments on commit 97cafc5

Please sign in to comment.