Ir para conteúdo
  • Cadastre-se

dev botao

Lote em PRocessamento - Como estão tratando


ronnei
  • Este tópico foi criado há 4879 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Olá Amigos do fórum, gostaria de saber como vocês estão tratando o lote em processamento, ou seja o XML é enviado mas não conseguimos obter resposta logo em seguida do processamento do mesmo? Na Nfe 1.0 eu estava fazendo o envio assim:

FcomponentesNfe.ACBrNFe.NotasFiscais.Assinar;

FcomponentesNfe.ACBrNFe.NotasFiscais.Valida;

With FcomponentesNfe.ACBrNFe.WebServices do

Begin

       if not(StatusServico.Executar)

       then raise Exception.Create(StatusServico.Msg);


       if not(Enviar.Executar)

       then raise Exception.Create(Enviar.Msg);

End;


With FcomponentesNfe.ACBrNFe.WebServices do

Begin

     Precibo:=Enviar.Recibo;

     Retorno.Recibo := Enviar.Recibo;

      if not(Retorno.Executar)

      then raise Exception.Create(Retorno.Msg);

End;


Ou seja, primeiro enviava, depois consultava a situacao do lote, porque se desse lote em processamento na consulta eu marcava no BD que estava em processamento e depois tinha a opcao de consultar de novo.

Percebi que não da pra usar o mesmo codigo pois ele da erro de schema, quando eu uso

FcomponentesNfe.ACBrNFe.Enviar(Plote);

Funciona de boa, mas se no caso ele enviar e não conseguir pegar o retorno, como vocês estão tratando?

Agradeço a ajuda!!

-----------------------------------------------------------

Até a Vitória sempre!

Atenciosamente

Ronnei Peterson

Invictos Tecnologia - www.invictos.com.br

Link para o comentário
Compartilhar em outros sites

Amigo, eu modifiquei a AcbrNfeWebServices.pas.

eu grava o protocolo de envio no banco de dados, depoi eu pego este protocolo e passa ele no Alote

ficando o comando abaixo

if copy(ALote,1,2) = '9-' then begin

Self.Retorno.Recibo := copy(ALote,3,100);

if not(Self.Retorno.Executar) then

begin

TACBrNFe( FACBrNFe ).SetStatus( stNFeErro );

if Assigned(TACBrNFe( FACBrNFe ).OnGerarLog) then

TACBrNFe( FACBrNFe ).OnGerarLog(Self.Retorno.Msg);

GravaErroEnviarNfe ( Self.Retorno.Recibo ); // Grava retorno de erro

raise Exception.Create(Self.Retorno.Msg);

end;

Result := true;

end

else begin

if not(Self.StatusServico.Executar) then

begin

TACBrNFe( FACBrNFe ).SetStatus( stNFeErro );

if Assigned(TACBrNFe( FACBrNFe ).OnGerarLog) then

TACBrNFe( FACBrNFe ).OnGerarLog(Self.StatusServico.Msg);

MessageDlg('O Serviço deve estar fora do ar, favor verificar com a SEFAZ do seu estado !',mtWarning,[mbok],0);

Exit;

end;

Self.Enviar.FLote := ALote;

if not(Self.Enviar.Executar) then

begin

TACBrNFe( FACBrNFe ).SetStatus( stNFeErro );

if Assigned(TACBrNFe( FACBrNFe ).OnGerarLog) then

TACBrNFe( FACBrNFe ).OnGerarLog(Self.Enviar.Msg);

GravaErroEnviarNfe ( Self.Retorno.Recibo );

raise Exception.Create(Self.Enviar.Msg);

end;

if Self.Enviar.Recibo <> '' then

GravaReciboDbase(Self.Enviar.Recibo); // Grava o protocolo de envio.

TACBrNFe( FACBrNFe ).NotasFiscais.Items[0].SaveToFile( ExtractFilePath(Application.ExeName) +'\XML\'+ TACBrNFe( FACBrNFe ).NotasFiscais.Items[0].NFe.infNFe.ID+'-nfe.xml' , True);

Self.Retorno.Recibo := Self.Enviar.Recibo;

if not(Self.Retorno.Executar) then

begin

TACBrNFe( FACBrNFe ).SetStatus( stNFeErro );

if Assigned(TACBrNFe( FACBrNFe ).OnGerarLog) then

TACBrNFe( FACBrNFe ).OnGerarLog(Self.Retorno.Msg);

GravaErroEnviarNfe ( Self.Retorno.Recibo );

raise Exception.Create(Self.Retorno.Msg);

end;

Result := true;

end;

Quando o sistema grava o protocolo de envio e não recebe o protocolo de autorização eu chamo a função da seguinte maneira.

Begin

rec := '9-'+protocolo;

Acbr.NotasFiscais.Clear;

Acbr.NotasFiscais.LoadFromFile( ExtractFilePath(Application.ExeName)+'\XML\NFe'+TrazNumero(chave)+'-nfe.xml');

Acbr.Enviar(rec,false);

if SSGNFe.NotasFiscais.Items[0].Confirmada then begin

GravarRetorno( Acbr.Configuracoes.Arquivos.PathNFe, TrazNumero(Acbr.NotasFiscais.Items[0].NFe.infNFe.ID),Acbr.WebServices.Retorno.Protocolo, codnota);

end;

Link para o comentário
Compartilhar em outros sites

Ok Jhonatan, obrigado pela dica, mas acredito que é possivel tratar de outra forma tmbm, estava fazendo uns testes, vou trabalhar direto no comando enviar(plote) usando um try except, na excessao verifico se o stat=105 ou se a mensagem é Lote em Processamento, se for, guardo no BD o status da nota como 3 - Enviada esperando processamento, aí o operador se encarrega de checar um tempo depois se foi autorizado. Será que essa lógica está correta?

-----------------------------------------------------------

Até a Vitória sempre!

Atenciosamente

Ronnei Peterson

Invictos Tecnologia - www.invictos.com.br

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
try


                  FcomponentesNfe.ACBrNFe.NotasFiscais.Assinar;

                  FcomponentesNfe.ACBrNFe.NotasFiscais.Valida;

               Except

                     on e:exception do

                     Begin

                          MensagemErro('Erro na tentativa de Assinar e validar'+#13+E.message);

                          exit;

                     End;

               End;



               if  (FComponentesNfe.ACBrNFe.Configuracoes.Geral.FormaEmissao<>teFSDA)//se nao estiver em contingencia

               Then Begin


                        Try


                           With FcomponentesNfe.ACBrNFe.WebServices do

                           Begin

                                {

                                Solicitado pela Receita que fosse retirado este tipo de consulta antes de enviar

                                um lote

                                if not(StatusServico.Executar)

                                then raise Exception.Create(StatusServico.Msg);

                                }


                                FcomponentesNfe.ACBrNFe.Enviar(strtoint(PObjnotaFiscal.Get_CODIGONFE));

                                Precibo:=Enviar.Recibo;

                                PObjnotaFiscal.Submit_reciboenvio(Precibo);


                                {

                                if not(Envia(strtoint(PObjnotaFiscal.Get_CODIGONFE)))

                                then raise Exception.Create(Enviar.Msg);

                                }

                           End;


                        Except

                              on e:Exception do

                              Begin

                                    if (

                                       (FcomponentesNfe.ACBrNFe.WebServices.Retorno.cStat=105) or

                                       (PForcaProcessamento) or

                                       (pos('LOTE EM PROCESSAMENTO',uppercase(e.message))>0)

                                       )

                                   Then Begin

                                             //O Stat 105 é lote em processamento

                                             //Li no forum que teve casos de lote em processamento

                                             //com status 0 por isso verifiquei a frase lote em processamento


                                             Precibo:=FcomponentesNfe.ACBrNFe.WebServices.Enviar.Recibo;

                                             MensagemErro('O Lote foi enviado mas continua em processamento, tente novamente mais tarde apenas confirmar esta NF');


                                             //Marcando que esta Nfe esta em Processamento

                                             PObjnotaFiscal.status:=dsedit;

                                             PObjnotaFiscal.Submit_SITUACAO('3');//3-enviada processando

                                             PObjnotaFiscal.Submit_Arquivo(FComponentesNfe.LocalArquivosNfe+StringReplace(FcomponentesNfe.ACBrNFe.NotasFiscais.Items[0].NFe.infNFe.ID,'Nfe','',[rfIgnoreCase])+'-nfe.xml');

                                             PObjnotaFiscal.Submit_reciboenvio(Precibo);


                                             if (PObjnotaFiscal.Salvar(true)=False)

                                             Then Begin

                                                      MensagemErro('Não foi possível alterar o status  para "PROCESSANDO"  e o Recibo na nota ID '+pnfe+' cancele a Nfe manualmente');

                                                      exit;

                                             End;


                                             //sai daqui

                                             exit;


                                   End

                                   else Begin

                                              mensagemerro('Erro na tentativa de enviar a NFE'+#13+E.message);

                                              exit;

                                   End;

                              End;

                        End;

-----------------------------------------------------------

Até a Vitória sempre!

Atenciosamente

Ronnei Peterson

Invictos Tecnologia - www.invictos.com.br

Link para o comentário
Compartilhar em outros sites

André eu resolvi conforme o código que eu postei a pedido do amigo, antes eu usava

if not(StatusServico.Executar)

then raise Exception.Create(StatusServico.Msg);

if not(Enviar.Executar)

then raise Exception.Create(Enviar.Msg);

Agora

FcomponentesNfe.ACBrNFe.NotasFiscais.Assinar;

FcomponentesNfe.ACBrNFe.NotasFiscais.Valida;

Try

FcomponentesNfe.ACBrNFe.Enviar(strtoint(PObjnotaFiscal.Get_CODIGONFE));

Precibo:=Enviar.Recibo;

Except

//aqui trato o cstat ou a mensagem de lote em processamento

End;

-----------------------------------------------------------

Até a Vitória sempre!

Atenciosamente

Ronnei Peterson

Invictos Tecnologia - www.invictos.com.br

Link para o comentário
Compartilhar em outros sites

Olá Ronnei,

porque vc usa

FcomponentesNfe.ACBrNFe.NotasFiscais.Assinar;

FcomponentesNfe.ACBrNFe.NotasFiscais.Valida;

usando FcomponentesNfe.ACBrNFe.Enviar(strtoint(PObjnotaFiscal.Get_CODIGONFE));

o componente ja assina e valida. isso pode ser assim ?

Obrigado.

Obs:delculpe-me mais ainda estou patinando

Sds,

Ivomar

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 4879 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.