Ir para conteúdo
  • Cadastre-se

dev botao

Qual a condição ideal para entrar em contingência offline?


Ver Solução Respondido por Juliomar Marchetti,
  • Este tópico foi criado há 1441 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

Prezades,

Verificando outras postagens cheguei em um tópico que sugeria entrar em contingência offline (NFCe) caso ocorresse alguma exceção e a seguinte condição abaixo fosse atendida:

      // Se for para entrar em contingência...
      if (ACBrNFe1.WebServices.Retorno.cStat = 0) then

Entretanto, quando ocorreu a exceção abaixo cStat ficou com valor ZERO.

raised exception class EACBrNFeException with message 'Falha na validação dos dados da nota: 3140
TAG:<pag><detPag><card> ID:YA04a/tpIntegra(Tipo de Integração para pagamento) - Nenhum valor informado.

1840 - Element '{http://www.portalfiscal.inf.br/nfe}tpIntegra': [facet 'enumeration'] The value '' is not an element of the set {'1', '2'}.'.

 

Neste caso, qual a forma correta de checar se o sistema deve entrar em contingência offline em se tratando de NFCe?


OBS: Vale ressaltar que gerei o erro acima propositadamente.

Saudações,

Rafael

  • Fundadores
Postado

você verificou os vídeo desse post ?

 

Geralmente para mudar para Off-line, você deve verificar se houve um erro de transmissão...  Observe que no componente existe o evento, OnTransmitError

  • Curtir 2
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Membros Pro
Postado

Olá,

Cheguei a assistir todo o vídeo, fiz a configuração do evento, mas não passa por ele quando o erro acima é disparado. Olhando rapidamente no código, não vi tratamento para o evento FOnTransmitError neste momento. O erro é disparado no método abaixo:

procedure NotaFiscal.Validar;
var
  Erro, AXML: String;
  NotaEhValida, ok: Boolean;
  ALayout: TLayOut;
  VerServ: Real;
  Modelo: TpcnModeloDF;
  cUF: Integer;
begin
  AXML := FXMLAssinado;
  if AXML = '' then
    AXML := XMLOriginal;

  with TACBrNFe(TNotasFiscais(Collection).ACBrNFe) do
  begin
    VerServ := FNFe.infNFe.Versao;
    Modelo  := StrToModeloDF(ok, IntToStr(FNFe.Ide.modelo));
    cUF     := FNFe.Ide.cUF;

    if EhAutorizacao( DblToVersaoDF(ok, VerServ), Modelo, cUF) then
      ALayout := LayNfeAutorizacao
    else
      ALayout := LayNfeRecepcao;

    // Extraindo apenas os dados da NFe (sem nfeProc)
    AXML := ObterDFeXML(AXML, 'NFe', ACBRNFE_NAMESPACE);

    if EstaVazio(AXML) then
    begin
      Erro := ACBrStr('NFe não encontrada no XML');
      NotaEhValida := False;
    end
    else
      NotaEhValida := SSL.Validar(AXML, GerarNomeArqSchema(ALayout, VerServ), Erro);

    if not NotaEhValida then
    begin
      FErroValidacao := ACBrStr('Falha na validação dos dados da nota: ') +
        IntToStr(NFe.Ide.nNF) + sLineBreak + FAlertas;
      FErroValidacaoCompleto := FErroValidacao + sLineBreak + Erro;

      raise EACBrNFeException.CreateDef(
        IfThen(Configuracoes.Geral.ExibirErroSchema, ErroValidacaoCompleto,
        ErroValidacao));
    end;
  end;
end;

Ou seja, ainda não foi realizada a transmissão da nota. Eu deveria tratar a variável FErroValidacao? 

Saudações,

Rafael Glauber

  • Membros Pro
Postado
Agora, Juliomar Marchetti disse:

Então se está disparando ai é outra coisa enão é questão dela ser emitida Offline.

Exatamente. Sei que não deve entrar em contingência, pois é um erro de validação do schema. Minha questão é justamente essa: Quais seriam as checagens a serem feitas para entrar em contingência?

Minha dúvida é quais outros tipos de erros podem acabar sendo encobertos e o sistema entrar em contingência. De qualquer forma vou tentar algo como: se não passar pelo evento de erro de transmissão (e cStat = 0), então o tipo de erro não permite entrar em contingência offline.

Saudações,

Rafael

  • Membros Pro
Postado

Acredito que não fui claro, mas a questão é que foi um erro "forçado" de schema, logo, nem passou pelos eventos de transmit e transmitError. De qualquer forma, agradeço a atenção. Acredito que já sei como diferenciar esses erros "antes" e "depois" da tentativa de envio.

Obrigado,

Rafael

  • Moderadores
  • Solution
Postado
      if ACBrNFe1.Enviar(NumeroLote, False, True) then
      begin
        StatusNFCe := ACBrNFe1.WebServices.Enviar.cStat;
        MsgMotivo  := ACBrNFe1.WebServices.Enviar.xMotivo;

        if StatusNFCe = 204 then
        begin
          ACBrNFe1.Consultar;
          StatusNFCe := ACBrNFe1.WebServices.Consulta.cStat;
          MsgMotivo  := ACBrNFe1.WebServices.Consulta.xMotivo;
        end;
.....

    except
      on E: Exception do
      begin
        StrMsg := E.Message;

        // erros de conexão enviar em modo off-line
        if (pos('12007', E.Message) > 0) or                       // erro de conexão
           (pos('12002', E.Message) > 0) or                       // timeout
           (pos('12029', E.Message) > 0) or                       // limite de tempo de conexão
           (pos('12157', E.Message) > 0) or                       // erro no suporte a canais seguros
           (pos('TIMED OUT', E.Message.ToUpper) > 0) or           // timeout
           (pos('ERRO NAO CATALOGADO', E.Message.ToUpper) > 0) or // erros de tratamento do webservice
           (pos('SERVICO PARALISADO', E.Message.ToUpper) > 0)     // Servico Paralisado Momentaneamente
        then
    except
      on E: Exception do
      begin
        StrMsg := E.Message;

        // erros de conexão enviar em modo off-line
        if (pos('12007', E.Message) > 0) or                       // erro de conexão
           (pos('12002', E.Message) > 0) or                       // timeout
           (pos('12029', E.Message) > 0) or                       // limite de tempo de conexão
           (pos('12157', E.Message) > 0) or                       // erro no suporte a canais seguros
           (pos('TIMED OUT', E.Message.ToUpper) > 0) or           // timeout
           (pos('ERRO NAO CATALOGADO', E.Message.ToUpper) > 0) or // erros de tratamento do webservice
           (pos('SERVICO PARALISADO', E.Message.ToUpper) > 0)     // Servico Paralisado Momentaneamente
        then
        begin
          ///nota offline;
        end
        else
        // consultar a NFC-e em caso de duplicidade, alguns ws retornam como erro
        // também consultar se o erro for em branco
        if (Pos('DUPLICIDADE', E.Message.ToUpper) > 0) or (E.Message.Trim.IsEmpty) then
        begin
          ACBrNFe1.Consultar;
          StatusNFCe := ACBrNFe1.WebServices.Consulta.cStat;
          MsgMotivo  := ACBrNFe1.WebServices.Consulta.xMotivo;

 

Tem várias formas de tratar . isso dai é uma e existe N outras

  • Curtir 2
  • Obrigado 1
Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

×
×
  • 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.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...