166
166
SVC_AN = {
167
167
AMBIENTE_PRODUCAO : {
168
168
"servidor" : "www.svc.fazenda.gov.br" ,
169
+ WS_NFE_INUTILIZACAO : "NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl" ,
169
170
WS_NFE_CONSULTA : "NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl" , # noqa
170
171
WS_NFE_SITUACAO : "NFeStatusServico4/NFeStatusServico4.asmx?wsdl" ,
171
172
WS_NFE_RECEPCAO_EVENTO : "NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl" , # noqa
172
173
WS_NFE_AUTORIZACAO : "NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl" ,
173
174
WS_NFE_RET_AUTORIZACAO : "NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl" , # noqa
174
175
},
175
176
AMBIENTE_HOMOLOGACAO : {
176
- "servidor" : "hom.svc.fazenda.gov.br" ,
177
+ "servidor" : "hom.sefazvirtual.fazenda.gov.br" ,
178
+ WS_NFE_INUTILIZACAO : "NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl" ,
177
179
WS_NFE_CONSULTA : "NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl" , # noqa
178
180
WS_NFE_SITUACAO : "NFeStatusServico4/NFeStatusServico4.asmx?wsdl" ,
179
181
WS_NFE_RECEPCAO_EVENTO : "NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl" , # noqa
644
646
},
645
647
}
646
648
649
+
650
+ # Dicionário `ESTADO_WS` mapeia unidade federativa (UF) para uma tupla contendo
651
+ # o serviço de webservices (WS) normal e o serviço de contingência.
652
+ # Cada chave é uma sigla de UF e cada valor é uma tupla (servico_normal,
653
+ # servico_contingencia). Exceção para a chave `AN` que representa o órgão de
654
+ # Ambiente Nacional e não uma UF.
647
655
ESTADO_WS = {
648
- "AC" : SVRS ,
649
- "AL" : SVRS ,
650
- "AM" : UFAM ,
651
- "AP" : SVRS ,
652
- "BA" : UFBA ,
653
- "CE" : UFCE ,
654
- "DF" : SVRS ,
655
- "ES" : SVRS ,
656
- "GO" : UFGO ,
657
- "MA" : SVAN ,
658
- "MG" : UFMG ,
659
- "MS" : UFMS ,
660
- "MT" : UFMT ,
661
- "PA" : SVRS ,
662
- "PB" : SVRS ,
663
- "PE" : UFPE ,
664
- "PI" : SVRS ,
665
- "PR" : UFPR ,
666
- "RJ" : SVRS ,
667
- "RN" : SVRS ,
668
- "RO" : SVRS ,
669
- "RR" : SVRS ,
670
- "RS" : UFRS ,
671
- "SC" : SVRS ,
672
- "SE" : SVRS ,
673
- "SP" : UFSP ,
674
- "TO" : SVRS ,
675
- "AN" : AN ,
656
+ "AC" : ( SVRS , SVC_AN ) ,
657
+ "AL" : ( SVRS , SVC_AN ) ,
658
+ "AM" : ( UFAM , SVC_RS ) ,
659
+ "AP" : ( SVRS , SVC_AN ) ,
660
+ "BA" : ( UFBA , SVC_RS ) ,
661
+ "CE" : ( UFCE , SVC_AN ) ,
662
+ "DF" : ( SVRS , SVC_AN ) ,
663
+ "ES" : ( SVRS , SVC_AN ) ,
664
+ "GO" : ( UFGO , SVC_RS ) ,
665
+ "MA" : ( SVAN , SVC_RS ) ,
666
+ "MG" : ( UFMG , SVC_AN ) ,
667
+ "MS" : ( UFMS , SVC_RS ) ,
668
+ "MT" : ( UFMT , SVC_RS ) ,
669
+ "PA" : ( SVRS , SVC_AN ) ,
670
+ "PB" : ( SVRS , SVC_AN ) ,
671
+ "PE" : ( UFPE , SVC_RS ) ,
672
+ "PI" : ( SVRS , SVC_RS ) ,
673
+ "PR" : ( UFPR , SVC_RS ) ,
674
+ "RJ" : ( SVRS , SVC_AN ) ,
675
+ "RN" : ( SVRS , SVC_AN ) ,
676
+ "RO" : ( SVRS , SVC_AN ) ,
677
+ "RR" : ( SVRS , SVC_AN ) ,
678
+ "RS" : ( UFRS , SVC_AN ) ,
679
+ "SC" : ( SVRS , SVC_AN ) ,
680
+ "SE" : ( SVRS , SVC_AN ) ,
681
+ "SP" : ( UFSP , SVC_AN ) ,
682
+ "TO" : ( SVRS , SVC_AN ) ,
683
+ "AN" : ( AN , AN ) ,
676
684
}
677
685
678
686
679
- def localizar_url (servico , estado , mod = "55" , ambiente = 2 ):
687
+ def localizar_url (servico , estado , mod = "55" , ambiente = 2 , contingencia = False ):
680
688
sigla = SIGLA_ESTADO [estado ]
681
- ws = ESTADO_WS [sigla ]
689
+
690
+ ws_normal , ws_contingencia = ESTADO_WS [sigla ]
691
+ ws = ws_contingencia if contingencia else ws_normal
682
692
683
693
if servico in (WS_DFE_DISTRIBUICAO , WS_DOWNLOAD_NFE ):
684
694
ws = AN
@@ -734,18 +744,37 @@ def __init__(
734
744
ambiente = "2" ,
735
745
mod = "55" ,
736
746
envio_sincrono = False ,
747
+ contingencia = False ,
737
748
):
738
749
super ().__init__ (transmissao , envio_sincrono )
739
750
self .versao = str (versao )
740
751
self .ambiente = str (ambiente )
741
752
self .uf = int (uf )
742
753
self .mod = str (mod )
754
+ self .contingencia = contingencia
743
755
744
756
def _edoc_situacao_ja_enviado (self , proc_consulta ):
745
757
if proc_consulta .resposta .cStat in ("100" , "110" , "150" , "301" , "302" ):
746
758
return True
747
759
return False
748
760
761
+ def _get_ws_endpoint (self , service ):
762
+ """
763
+ Obtém o endpoint de um webservice específico.
764
+
765
+ Esta função localiza a URL do endpoint para um dado serviço,
766
+ utilizando atributos da instância como a unidade federativa (UF),
767
+ o modelo (mod), o ambiente e a contingência.
768
+ """
769
+ endpoint = localizar_url (
770
+ service ,
771
+ str (self .uf ),
772
+ self .mod ,
773
+ int (self .ambiente ),
774
+ self .contingencia ,
775
+ )
776
+ return endpoint
777
+
749
778
def get_documento_id (self , edoc ):
750
779
return edoc .infNFe .Id [:3 ], edoc .infNFe .Id [3 :]
751
780
@@ -760,7 +789,7 @@ def status_servico(self):
760
789
return self ._post (
761
790
raiz ,
762
791
# 'https://hom.sefazvirtual.fazenda.gov.br/NFeStatusServico4/NFeStatusServico4.asmx?wsdl',
763
- localizar_url ( WS_NFE_SITUACAO , str ( self .uf ), self . mod , int ( self . ambiente ) ),
792
+ self ._get_ws_endpoint ( WS_NFE_SITUACAO ),
764
793
"nfeStatusServicoNF" ,
765
794
retConsStatServ ,
766
795
)
@@ -777,7 +806,7 @@ def consulta_documento(self, chave):
777
806
return self ._post (
778
807
raiz ,
779
808
# 'https://hom.sefazvirtual.fazenda.gov.br/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl',
780
- localizar_url ( WS_NFE_CONSULTA , str ( self .uf ), self . mod , int ( self . ambiente ) ),
809
+ self ._get_ws_endpoint ( WS_NFE_CONSULTA ),
781
810
"nfeConsultaNF" ,
782
811
retConsSitNFe ,
783
812
)
@@ -805,9 +834,7 @@ def envia_documento(self, edoc):
805
834
return self ._post (
806
835
xml_envio_etree ,
807
836
# 'https://hom.sefazvirtual.fazenda.gov.br/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl',
808
- localizar_url (
809
- WS_NFE_AUTORIZACAO , str (self .uf ), self .mod , int (self .ambiente )
810
- ),
837
+ self ._get_ws_endpoint (WS_NFE_AUTORIZACAO ),
811
838
"nfeAutorizacaoLote" ,
812
839
retEnviNFe ,
813
840
)
@@ -822,9 +849,7 @@ def envia_inutilizacao(self, evento):
822
849
823
850
return self ._post (
824
851
xml_envio_etree ,
825
- localizar_url (
826
- WS_NFE_INUTILIZACAO , str (self .uf ), self .mod , int (self .ambiente )
827
- ),
852
+ self ._get_ws_endpoint (WS_NFE_INUTILIZACAO ),
828
853
"nfeInutilizacaoNF" ,
829
854
retInutNFe ,
830
855
)
@@ -844,9 +869,7 @@ def consulta_recibo(self, numero=False, proc_envio=False):
844
869
raiz .original_tagname_ = "consReciNFe"
845
870
return self ._post (
846
871
raiz ,
847
- localizar_url (
848
- WS_NFE_RET_AUTORIZACAO , str (self .uf ), self .mod , int (self .ambiente )
849
- ),
872
+ self ._get_ws_endpoint (WS_NFE_RET_AUTORIZACAO ),
850
873
# 'ws/nferetautorizacao4.asmx'
851
874
"nfeRetAutorizacaoLote" ,
852
875
retConsReciNFe ,
@@ -871,9 +894,7 @@ def enviar_lote_evento(self, lista_eventos, numero_lote=False):
871
894
872
895
return self ._post (
873
896
xml_envio_etree ,
874
- localizar_url (
875
- WS_NFE_RECEPCAO_EVENTO , str (self .uf ), self .mod , int (self .ambiente )
876
- ),
897
+ self ._get_ws_endpoint (WS_NFE_RECEPCAO_EVENTO ),
877
898
"nfeRecepcaoEvento" ,
878
899
retEnvEvento ,
879
900
)
@@ -1023,9 +1044,7 @@ def consultar_distribuicao(
1023
1044
1024
1045
return self ._post (
1025
1046
raiz ,
1026
- localizar_url (
1027
- WS_DFE_DISTRIBUICAO , str (self .uf ), self .mod , int (self .ambiente )
1028
- ),
1047
+ self ._get_ws_endpoint (WS_DFE_DISTRIBUICAO ),
1029
1048
"nfeDistDFeInteresse" ,
1030
1049
retDistDFeInt ,
1031
1050
)
@@ -1091,7 +1110,7 @@ def consultar_cadastro(self, uf, cnpj=None, cpf=None, ie=None):
1091
1110
1092
1111
return self ._post (
1093
1112
raiz ,
1094
- localizar_url ( WS_NFE_CADASTRO , str ( self .uf ), self . mod , int ( self . ambiente ) ),
1113
+ self ._get_ws_endpoint ( WS_NFE_CADASTRO ),
1095
1114
"consultaCadastro" ,
1096
1115
retConsCad ,
1097
1116
)
0 commit comments