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