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á 1359 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.