Ir para conteúdo
  • Cadastre-se

dev botao

Recommended Posts

Postado

Boa tarde,

 

Estamos desenvolvendo uma rotina para registrar o evento de desacordo na CTe. 

Temos 2 versões desse método, um que é feito a leitura do XML, esse está 100%.

E outra que seria apenas informado a chave da CTe, justificativa e UF.

Porem percebemos que ele retorna a mensagem de "UF não pode ser vazia.". Debugando o código, percebi que a chCTe esta sumindo no meio do caminho.

Em dado momento ele tenta obter a UF, com essa função 

function ExtrairUFChaveAcesso(const AChave: string): Integer;
begin
  Result := StrToIntDef(Copy(OnlyNumber(AChave),1,2), 0);
end;

Como a chave chegou ali em branco ele acaba não conseguindo obter a UF.

Código da minha função:

procedure PrestacaoServicoDesacordoCTe(xObs, UFTomador, CNPJTomador, Chave : string);
var
  iLote: Integer;
  obCteSefaz : TCteSefaz;
begin
  obCteSefaz := TCteSefaz.Create;
  with obCTeSefaz do
  begin
    ACBrCTe.Conhecimentos.Clear;

    ACBrCTe.EventoCTe.Evento.Clear;

    with ACBrCTe.EventoCTe.Evento.Add do
    begin
      infEvento.nSeqEvento := 1;
      // Devemos informar a UF do Emitente do CT-e
      InfEvento.cOrgao     := UFtoCUF(UFTomador);
      infEvento.chCTe      := Chave;
      infEvento.CNPJ       := RemoverCaracteresEspeciais(CNPJTomador);
      infEvento.dhEvento   := now;
      infEvento.tpEvento   := tePrestDesacordo;
      infEvento.detEvento.xOBS  := xObs;
    end;

    iLote := 1; // Numero do Lote do Evento

    ACBrCTe.EnviarEvento(iLote);
    ACBrCTe.Free;
  end;
  obCTeSefaz.Free;
end;

 Tem mais um print em anexo, nele podemos ver que o xml gerado não tem a chave, e podemos ver que na lista de watchList, a variável com chave está devidamente preenchida. Que no caso seria essa: 43250634046620000183570000000000241025021119-cte.xml apenas com os números. 

 

Em outros tópicos (já fechados) sobre esse assunto, é dito que não há necessidade de carregar o XML para emitir esse tipo de evento. 

erroCTEsemXML.png

  • Solution
Postado

A principio não estou usado o TACBrXMLDocument.

 

consegui resolver criando em separado e evento e adicionado ele posteriormente.

procedure PrestacaoServicoDesacordoCTe(xObs, UFTomador, CNPJTomador, Chave : string);
var
  iLote: Integer;
  obCteSefaz : TCteSefaz;
  novoEvento : TInfEvento ;
begin

  novoEvento := TInfEvento.Create;
  novoEvento.cOrgao     := UFtoCUF(UFTomador);
  novoEvento.chCTe      := Chave;
  novoEvento.CNPJ       := RemoverCaracteresEspeciais(CNPJTomador);
  novoEvento.dhEvento   := now;
  novoEvento.tpEvento   := tePrestDesacordo;
  novoEvento.detEvento.xOBS  := xObs;


  obCteSefaz := TCteSefaz.Create;
  with obCTeSefaz do
  begin
    ACBrCTe.Conhecimentos.Clear;
    ACBrCTe.EventoCTe.Evento.Clear;
    ACBrCTe.EventoCTe.Evento.New.InfEvento := novoEvento;
    iLote := 1; // Numero do Lote do Evento
    ACBrCTe.EnviarEvento(iLote);
    ACBrCTe.Free;
  end;
  obCTeSefaz.Free;

end;

Parece que o ADD faz algum tipo de validação e acabava por "eliminar" o conteúdo. Ou não esta sendo passado ao adicionar... Não achei isso no código, apenas especulação. 

 

De qualquer forma, fica essa solução temporária, parece gambiarra mas funcionou. 

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.