Jump to content
Notícias do ACBr

click.png

click.png

click.png

click.png

click.png

click.png

logo_acbr_paygo.png

TEF ACBr PayGo
Seja um revendedor e ofereça uma solução completa para seu cliente.


Saiba mais

beneficios.png

click.png

click.png

click.png

Tratamento de retorno ao enviar NFC-e


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

Recommended Posts

Boa tarde,

 

Quando envio uma NFC-e e ocorre um erro eu faço o seguinte tratamento no retorno para saber se houve erro de conexão:

if (((Pos('12007 - ', E.Message) > 0) or
          (Pos('12002 - ', E.Message) > 0) or
          (Pos('12029 - ', E.Message) > 0) or
          (Pos('ERRO NAO CATALOGADO', E.Message.ToUpper) > 0) or
          (Pos('SERVICO PARALISADO', E.Message.ToUpper) > 0)) or
          ((ECF.ACBrNFe.WebServices.Enviar.Msg = '') and (ECF.ACBrNFe.WebServices.Enviar.cStat = 0))) then

Mas estou com a seguinte situação: realizo uma venda de um produto de balança com uma quantidade com 4 casas decimais e ao finalizar ocorre o erro de total dos itens diferente do total pago, o problema é que quando executo o FecharCupom do NFC-e e ocorre este erro o "WebServices.Enviar.Msg" vem igual a vazio e o cStat igual a zero e nesta minha rotina este erro acaba sendo reconhecido como erro de conexão, porém ainda não houve tentativa de envio.

Existe algum flag no ACBr para eu conseguir identificar que houve erro na validação de schema, pois nesse caso a nota nem chegou a ser enviada então eu não posso validar o retorno do webservice.

Link to comment
Share on other sites

Antes de enviar coloque estes dois códigos que concerteza resolverá seu problema.

  // validar o schema da NFCe
  try
    ACBrNFe1.NotasFiscais.Validar;
  except
    on E: Exception do
    begin
      raise Exception.Create(
        IfThen(
          ACBrNFe1.NotasFiscais.Items[0].ErroValidacao <> '',
          ACBrNFe1.NotasFiscais.Items[0].ErroValidacao,
          E.Message
        )
      );
    end;
  end;

  // validação das regras de negócio, as validações seguem o manual da NFCe
  ACBrNFe1.NotasFiscais.ValidarRegrasdeNegocios(ErrosRegraNegocio);
  if ErrosRegraNegocio <> '' then
    raise Exception.Create(ErrosRegraNegocio);

Link to comment
Share on other sites

  • 2 weeks later...

Obrigado pela resposta, mas este caso ainda não resolve porque eu trabalho com o componente ACBrECFVirtualNFCe, então não executo a Validação e Assinatura. Mas consegui resolver por aqui e vou deixar uma sugestão de código caso o ACBr se interesse. 

Na unit ACBrNFe, na declaração da classe TACBrNFe adicionei a seguinte variável ao escopo private

FTentouEnviar: Boolean;

Em seguida adicionei a propertie abaixo ao escopo public

property TentouEnviar: Boolean read FTentouEnviar;

Inicializei a propriedade dentro do Create desta classe

FTentouEnviar := False;

E então no método "Enviar(ALote: String; Imprimir: Boolean; Sincrono: Boolean): Boolean;" inicializei a propriedade como False logo após as duas primeiras validações e antes do "NotasFiscais.Assinar;", após o "NotasFiscais.Validar;" alterei o valor da proipriedade para True, ficando o código da seguinte forma:

  if NotasFiscais.Count <= 0 then
    GerarException(ACBrStr('ERRO: Nenhuma NF-e adicionada ao Lote'));

  if NotasFiscais.Count > 50 then
    GerarException(ACBrStr('ERRO: Conjunto de NF-e transmitidas (máximo de 50 NF-e)' +
      ' excedido. Quantidade atual: ' + IntToStr(NotasFiscais.Count)));

  FTentouEnviar := False;

  NotasFiscais.Assinar;
  NotasFiscais.Validar;

  {
    Uma vez que foi Assinado e Validado com sucesso, seta-se o TentouEnviar como True,
    pois daqui em diante qualquer exception disparada será dentro ou após a tentativa de
    envio da NF-e
  }
  FTentouEnviar := True;

  Result := WebServices.Envia(ALote, Sincrono);

Dessa forma, quando ocorre alguma exception dentro desse método, e o TentouEnviar estiver True, eu tenho certeza que as validações e assinaturas das notas ocorreram com sucesso. Se o "ACBrNFe.WebServices.Enviar.cStat" da nota fiscal foi igual a zero e o "ACBrNFe.WebServices.Enviar.Msg" foi igual a vazio, e o método tentou enviar, então ocorreu algum erro na comunicação com o WebService e eu posso presumir com mais segurança que o erro é de conexão e então começar a fazer todo o tratamento necessário pra realizar uma venda em contingência.

Isso se fez necessário porque quando ocorre um erro dentro do "NotasFiscais.Validar" ainda não houve nenhuma tentativa de envio e o "ACBrNFe.WebServices.Enviar.cStat" anda está igual a zero e o "ACBrNFe.WebServices.Enviar.Msg" também ainda está vazio.

 

A classe com as modificações segue em anexo.

ACBrNFe.pas

Link to comment
Share on other sites

  • Consultores

EDIT: Ops... O Daniel deu uma solução enquanto eu escrevia.

Em 25/04/2017 at 10:07, Renan Garcia de Oliveira disse:

Dessa forma, quando ocorre alguma exception dentro desse método, e o TentouEnviar estiver True, eu tenho certeza que as validações e assinaturas das notas ocorreram com sucesso.

Então a inicialização da variável deveria ser logo no início do método, caso contrário, poderia estar lendo algo residual de um envio anterior quando falhar por ter zero ou mais de 50 notas.

 

[]'s

Consultor SAC ACBr

Elton
Ajude o Projeto ACBr crescer - Assine o SAC

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

Em 28/04/2017 at 17:48, EMBarbosa disse:

EDIT: Ops... O Daniel deu uma solução enquanto eu escrevia.

Então a inicialização da variável deveria ser logo no início do método, caso contrário, poderia estar lendo algo residual de um envio anterior quando falhar por ter zero ou mais de 50 notas.

 

Eu não tinha atentando para isso mesmo, fiz a modificação...

 

Em 28/04/2017 at 17:47, Daniel Simoes disse:

Use o evento "QuandoFecharDocumento", e faça as suas validações...

Mas neste caso, dentro do QuandoFecharDocumento eu poderia então executar os comandos abaixo?  

ACBrNFe.NotasFiscais.Validar;
ACBrNFe.NotasFiscais.Assinar;

 

Neste caso realmente ficaria mais fácil fazer a validação e eu não precisaria ficar modificando as classes do ACBr sempre que atualizá-lo.

Link to comment
Share on other sites

  • Fundadores

Acredito que Assinar já é chamado pelo Virtual...

Faça as Validações de sua aplicação, usando as informações do seu banco de dados... Exemplo: CNPJ/CPF válido, todos os produtos tem os dados para calculo de impostos, etc

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.

Link to comment
Share on other sites

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.