@@ -717,6 +717,7 @@ def localizar_url(servico, estado, mod="55", ambiente=2):
717
717
class NFe (DocumentoEletronico ):
718
718
_namespace = "http://www.portalfiscal.inf.br/nfe"
719
719
_edoc_situacao_arquivo_recebido_com_sucesso = "103"
720
+ _edoc_situacao_arquivo_processado_com_sucesso = "104"
720
721
_edoc_situacao_servico_em_operacao = "107"
721
722
722
723
# Desativado por padrão para evitar 'consumo indevido'
@@ -725,8 +726,16 @@ class NFe(DocumentoEletronico):
725
726
726
727
_maximo_tentativas_consulta_recibo = 5
727
728
728
- def __init__ (self , transmissao , uf , versao = "4.00" , ambiente = "2" , mod = "55" ):
729
- super ().__init__ (transmissao )
729
+ def __init__ (
730
+ self ,
731
+ transmissao ,
732
+ uf ,
733
+ versao = "4.00" ,
734
+ ambiente = "2" ,
735
+ mod = "55" ,
736
+ envio_sincrono = False ,
737
+ ):
738
+ super ().__init__ (transmissao , envio_sincrono )
730
739
self .versao = str (versao )
731
740
self .ambiente = str (ambiente )
732
741
self .uf = int (uf )
@@ -757,6 +766,7 @@ def status_servico(self):
757
766
)
758
767
759
768
def consulta_documento (self , chave ):
769
+ # NfeConsultaProtocolo
760
770
raiz = retConsSitNFe .TConsSitNFe (
761
771
versao = self .versao ,
762
772
tpAmb = self .ambiente ,
@@ -787,14 +797,11 @@ def envia_documento(self, edoc):
787
797
raiz = retEnviNFe .TEnviNFe (
788
798
versao = self .versao ,
789
799
idLote = datetime .datetime .now ().strftime ("%Y%m%d%H%M%S" ),
790
- indSinc = "0" ,
800
+ indSinc = "1" if self . envio_sincrono else " 0" ,
791
801
)
792
802
raiz .original_tagname_ = "enviNFe"
793
803
xml_envio_string , xml_envio_etree = self ._generateds_to_string_etree (raiz )
794
804
xml_envio_etree .append (etree .fromstring (xml_assinado ))
795
-
796
- # teste_string, teste_etree = self._generateds_to_string_etree(xml_envio_etree)
797
-
798
805
return self ._post (
799
806
xml_envio_etree ,
800
807
# 'https://hom.sefazvirtual.fazenda.gov.br/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl',
@@ -956,15 +963,18 @@ def _verifica_documento_ja_enviado(self, proc_consulta):
956
963
return False
957
964
958
965
def _verifica_resposta_envio_sucesso (self , proc_envio ):
959
- if (
960
- proc_envio .resposta .cStat
961
- == self ._edoc_situacao_arquivo_recebido_com_sucesso
962
- ):
963
- return True
964
- return False
966
+ """
967
+ Verifica se a resposta do envio indica sucesso:
968
+ - cStat "103" = "Lote recebido com sucesso" (assíncrono)
969
+ - cStat "104" = "Lote processado com sucesso" (síncrono)
970
+ """
971
+ return proc_envio .resposta .cStat in [
972
+ self ._edoc_situacao_arquivo_recebido_com_sucesso ,
973
+ self ._edoc_situacao_arquivo_processado_com_sucesso ,
974
+ ]
965
975
966
976
def _aguarda_tempo_medio (self , proc_envio ):
967
- time .sleep (float (proc_envio .resposta .infRec .tMed ) * 1.3 )
977
+ time .sleep (float (proc_envio .resposta .infRec .tMed ))
968
978
969
979
def _edoc_situacao_em_processamento (self , proc_recibo ):
970
980
if proc_recibo .resposta .cStat == "105" :
@@ -1020,9 +1030,14 @@ def consultar_distribuicao(
1020
1030
retDistDFeInt ,
1021
1031
)
1022
1032
1023
- def monta_processo (self , edoc , proc_envio , proc_recibo ):
1033
+ def monta_processo (self , edoc , proc_envio , proc_recibo = None ):
1024
1034
nfe = proc_envio .envio_raiz .find ("{" + self ._namespace + "}NFe" )
1025
- protocolos = proc_recibo .resposta .protNFe
1035
+ if proc_recibo :
1036
+ protocolos = proc_recibo .resposta .protNFe
1037
+ else :
1038
+ # A falta do recibo indica envio no modo síncrono
1039
+ # o protocolo é recuperado diretamente da resposta do envio.
1040
+ protocolos = proc_envio .resposta .protNFe
1026
1041
if len (nfe ) and protocolos :
1027
1042
if not isinstance (protocolos , list ):
1028
1043
protocolos = [protocolos ]
@@ -1035,9 +1050,11 @@ def monta_processo(self, edoc, proc_envio, proc_recibo):
1035
1050
xml_file , nfe_proc = self ._generateds_to_string_etree (nfe_proc )
1036
1051
prot_nfe = nfe_proc .find ("{" + self ._namespace + "}protNFe" )
1037
1052
prot_nfe .addprevious (nfe )
1038
- proc_recibo .processo = nfe_proc
1039
- proc_recibo .processo_xml = self ._generateds_to_string_etree (nfe_proc )[0 ]
1040
- proc_recibo .protocolo = protocolo
1053
+
1054
+ proc = proc_recibo if proc_recibo else proc_envio
1055
+ proc .processo = nfe_proc
1056
+ proc .processo_xml = self ._generateds_to_string_etree (nfe_proc )[0 ]
1057
+ proc .protocolo = protocolo
1041
1058
return True
1042
1059
1043
1060
def monta_nfe_proc (self , nfe , prot_nfe ):
0 commit comments