@@ -717,13 +717,25 @@ 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
- _consulta_servico_ao_enviar = True
722
- _consulta_documento_antes_de_enviar = True
722
+
723
+ # Desativado por padrão para evitar 'consumo indevido'
724
+ _consulta_servico_ao_enviar = False
725
+ _consulta_documento_antes_de_enviar = False
726
+
723
727
_maximo_tentativas_consulta_recibo = 5
724
728
725
- def __init__ (self , transmissao , uf , versao = "4.00" , ambiente = "2" , mod = "55" ):
726
- 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 )
727
739
self .versao = str (versao )
728
740
self .ambiente = str (ambiente )
729
741
self .uf = int (uf )
@@ -754,6 +766,7 @@ def status_servico(self):
754
766
)
755
767
756
768
def consulta_documento (self , chave ):
769
+ # NfeConsultaProtocolo
757
770
raiz = retConsSitNFe .TConsSitNFe (
758
771
versao = self .versao ,
759
772
tpAmb = self .ambiente ,
@@ -784,14 +797,11 @@ def envia_documento(self, edoc):
784
797
raiz = retEnviNFe .TEnviNFe (
785
798
versao = self .versao ,
786
799
idLote = datetime .datetime .now ().strftime ("%Y%m%d%H%M%S" ),
787
- indSinc = "0" ,
800
+ indSinc = "1" if self . envio_sincrono else " 0" ,
788
801
)
789
802
raiz .original_tagname_ = "enviNFe"
790
803
xml_envio_string , xml_envio_etree = self ._generateds_to_string_etree (raiz )
791
804
xml_envio_etree .append (etree .fromstring (xml_assinado ))
792
-
793
- # teste_string, teste_etree = self._generateds_to_string_etree(xml_envio_etree)
794
-
795
805
return self ._post (
796
806
xml_envio_etree ,
797
807
# 'https://hom.sefazvirtual.fazenda.gov.br/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl',
@@ -953,15 +963,18 @@ def _verifica_documento_ja_enviado(self, proc_consulta):
953
963
return False
954
964
955
965
def _verifica_resposta_envio_sucesso (self , proc_envio ):
956
- if (
957
- proc_envio .resposta .cStat
958
- == self ._edoc_situacao_arquivo_recebido_com_sucesso
959
- ):
960
- return True
961
- 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
+ ]
962
975
963
976
def _aguarda_tempo_medio (self , proc_envio ):
964
- time .sleep (float (proc_envio .resposta .infRec .tMed ) * 1.3 )
977
+ time .sleep (float (proc_envio .resposta .infRec .tMed ))
965
978
966
979
def _edoc_situacao_em_processamento (self , proc_recibo ):
967
980
if proc_recibo .resposta .cStat == "105" :
@@ -1017,9 +1030,14 @@ def consultar_distribuicao(
1017
1030
retDistDFeInt ,
1018
1031
)
1019
1032
1020
- def monta_processo (self , edoc , proc_envio , proc_recibo ):
1033
+ def monta_processo (self , edoc , proc_envio , proc_recibo = None ):
1021
1034
nfe = proc_envio .envio_raiz .find ("{" + self ._namespace + "}NFe" )
1022
- 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
1023
1041
if len (nfe ) and protocolos :
1024
1042
if not isinstance (protocolos , list ):
1025
1043
protocolos = [protocolos ]
@@ -1032,11 +1050,27 @@ def monta_processo(self, edoc, proc_envio, proc_recibo):
1032
1050
xml_file , nfe_proc = self ._generateds_to_string_etree (nfe_proc )
1033
1051
prot_nfe = nfe_proc .find ("{" + self ._namespace + "}protNFe" )
1034
1052
prot_nfe .addprevious (nfe )
1035
- proc_recibo .processo = nfe_proc
1036
- proc_recibo .processo_xml = self ._generateds_to_string_etree (nfe_proc )[0 ]
1037
- 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
1038
1058
return True
1039
1059
1060
+ def monta_nfe_proc (self , nfe , prot_nfe ):
1061
+ """
1062
+ Constrói e retorna o XML do processo da NF-e,
1063
+ incorporando a NF-e com o seu protocolo de autorização.
1064
+ """
1065
+ nfe_proc = etree .Element (
1066
+ f"{{{ self ._namespace } }}nfeProc" ,
1067
+ versao = self .versao ,
1068
+ nsmap = {None : self ._namespace },
1069
+ )
1070
+ nfe_proc .append (nfe )
1071
+ nfe_proc .append (prot_nfe )
1072
+ return etree .tostring (nfe_proc )
1073
+
1040
1074
def consultar_cadastro (self , uf , cnpj = None , cpf = None , ie = None ):
1041
1075
if not cnpj and not cpf and not ie :
1042
1076
return
0 commit comments