Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

  • Membros Pro
Postado

Prezados, boa tarde!

Estamos realizando a implementação da NFS-e para Cidade de Montes Claros - MG que utiliza o Provedor PRONIM (Versao=2.02), utilizando o componente ACBrNFSeX, entretanto, temos enfrentado dificuldades no tratamento das exceções quando existe erro no retorno.
Hoje quando tentamos realizar transmissão de uma NFS-e e ela por algum motivo tem inconsistência é retornado a seguinte mensagem:
image.png.206f96b1f74100e4c039173d0cd3836a.png

Entretanto, a mensagem em acima não trás o real motivo pelo qual o RPS em questão foi "rejeitado".

Conforme XML de nome 28582-lista-nfse-sinc.xml anexo, o motivo da rejeição foi outro e não o de Código E4 que foi apresentado acima.

Deste modo, para tentarmos contornar a situação e apresentar corretamente o erro, fizemos uma alteração dentro da unit: ACBrNFSeXProviderABRASFv2.pas, de forma que a exceção passe a ser levantada, de modo que a propriedade ACBrNFSe1.WebService.Emite.Sucesso retorne false, nos casos de erro.

A sugestão de ajuste que realizamos foi levando em consideração o tratamento similar que é realizado dentro da unit; ACBrNFSeXProviderABRASFv1 na procedure TratarRetornoEmitir.

Após o ajuste em questão, nossa aplicação passou retornar corretamente o erro do RPS:

image.thumb.png.7503823456b1c53350917a7134ecc03f.png

 

Assim sendo, enviamos anexo a alteração realizada para que seja apreciada.

 

 

 

28582-lista-nfse-sinc.xml ACBrNFSeXProviderABRASFv2.pas

  • Consultores
  • Solution
Postado

Bom dia @SupraMAIS,

Vamos lá:

1. A primeira imagem se refere a execução do método ConsultarNFSePorRPS, logo se você informar um numero de RPS que não foi aceito por conter informações erradas o erro E4 esta correto.

2. A segunda imagem se refere a execução do método Emitir, que traz o erro E39 e por conta desse erro o RPS enviado não foi aceito e que se executar o método ConsultarNFSePorRPS vai retornar o erro E4.

Quanto a sua alteração, será que realmente se faz necessário?

Você acrescentou a linha abaixo logo após a execução da procedure: ProcessarMensagemErros.

      //Acrescentado
      Response.Sucesso := (Response.Erros.Count = 0);

Mas no final do Try temos:

      Response.Sucesso := (Response.Erros.Count = 0);
    except

E na posição que essa linha esta, ao meu ver contempla tanto o ProcessarMensagemErros que esta logo no inicio quanto o que esta dentro do IF cujas linhas são executadas se o modo de envio for Lote Síncrono ou Unitário.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

  • Membros Pro
Postado

@Italo Giurizzato Junior, boa tarde!

Analisamos a situação acima e identificamos que a principio o trecho em questão é executado somente quando não corre nenhum erro, exemplo Cod202, que é tratado em um bloco que contem um exit, fazendo com que este trecho não seja executado em virtude do exit:

      if Response.ModoEnvio in [meLoteSincrono, meUnitario] then
      begin
        // Retorno do EnviarLoteRpsSincrono e GerarNfse
        ANode := ANode.Childrens.FindAnyNs('ListaNfse');

        if not Assigned(ANode) then
        begin
          AErro := Response.Erros.New;
          AErro.Codigo := Cod202;
          AErro.Descricao := ACBrStr(Desc202);
          Exit;
        end;

Deste modo, sugeriríamos que este comando seja movido para dentro do finally:

      end;

    except
      on E:Exception do
      begin
        AErro := Response.Erros.New;
        AErro.Codigo := Cod999;
        AErro.Descricao := ACBrStr(Desc999 + E.Message);
      end;
    end;
  finally
    Response.Sucesso := (Response.Erros.Count = 0);
    FreeAndNil(Document);
  end;
end;

Caso tenham alguma sugestão de como contornar a situação fiquem a vontade nos repassar.

Obrigado.

ACBrNFSeXProviderABRASFv2 (1).pas

  • Consultores
Postado

Bom dia @SupraMAIS,

Tenho uma segunda proposta para essa questão.

Na unit ACBrNFSeXPrividerBase, procedure Emite fazer essas duas alterações:

procedure TACBrNFSeXProvider.Emite;
var
  AService: TACBrNFSeXWebservice;
  AErro: TNFSeEventoCollectionItem;
begin
  EmiteResponse.Sucesso := False;  <=== incluir esta linha
  EmiteResponse.Erros.Clear;
  EmiteResponse.Alertas.Clear;
  EmiteResponse.Resumos.Clear;

  TACBrNFSeX(FAOwner).SetStatus(stNFSeRecepcao);
  (...)
  TACBrNFSeX(FAOwner).SetStatus(stNFSeAguardaProcesso);
  TratarRetornoEmitir(EmiteResponse);
  TACBrNFSeX(FAOwner).SetStatus(stNFSeIdle);
  EmiteResponse.Sucesso := (EmiteResponse.Erros.Count = 0);  <=== incluir esta linha
end;

Logo no inicio da procedure defino que o valor da propriedade Sucesso é False, porque essa procedure chama o PrepararEmitir, AssinarEmitir e ValidarSchema que podem resultar em erros.

No final da procedure é executado o TratarRetornoEmitir que também pode resultar em erros, ai mudo o valor de Sucesso com base no contador de erros.

Desta forma, acredito eu que podemos eliminar a linha ( Response.Sucesso := (Response.Erros.Count = 0); ) do TratarRetornoEmitir que se encontra na unit ACBrNFSeXProviderABRASFv2.

O que você acha?

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

  • Consultores
Postado

Boa tarde @SupraMAIS,

Já vou incluir na minha lista de tarefas para fazer essa adequação para os demais métodos e não somente no Emitir.

Assim que finalizado iremos enviar para o SVN.

Aviso aqui quando isso ocorrer. 

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

  • Este tópico foi criado há 150 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.