free web tracker

Como enviar uma carta de correção utilizando o ACBrNFe

Segue um exemplo de utilização da carta de correção eletrônica utilizando o ACBrNFe, a carta de correção é disciplinada pela Nota Técnica 2011.003 e alguns pontos devem ser observados, segue texto:

A Carta de Correção é disciplinada pelo § 1º-A do art. 7º do Convênio S/N, de 15 de dezembro de 1970 e pode ser utilizada para regularização de erro ocorrido na emissão de documento fiscal, desde que o erro não esteja relacionado com:
I – as variáveis que determinam o valor do imposto tais como: base de cálculo, alíquota, diferença de preço, quantidade, valor da operação ou da prestação;
II – a correção de dados cadastrais que implique mudança do remetente ou do destinatário; III – a data de emissão ou de saída.

É importante saber que a última carta de correção enviada substitui as anteriores, portanto a última deve sempre conter todas as correções, mesmo as já enviadas.

O número sequencial da Carta de Correção (nSeqEvento) deve ser controlado pelo aplicativo e deve sempre incrementar a cada envio.


  // Adicione a unit pcnConversao ao uses.

  // numero do lote de envio
  NumeroLote := StrToInt(FormatDateTime('yymmddhhmm', NOW));

  // preenchimento dos dados da carta de correção
  ACBrNFe.EventoNFe.Evento.Clear;
  ACBrNFe.EventoNFe.idLote := NumeroLote;

  with ACBrNFe.EventoNFe.Evento.Add do
  begin
    infEvento.chNFe      := ChaveNFe;
    infEvento.CNPJ       := CnpjEmitente;
    infEvento.dhEvento   := Now;
    infEvento.tpEvento   := teCCe;
    infEvento.nSeqEvento := <Numero Sequencial>; 
    infEvento.detEvento.xCorrecao := <Texto da Carta de Correção>;
  end;

  // envio da carta de correção
  if ACBrNFe.EnviarEventoNFe(NumeroLote) then
  begin
    with ACBrNFe.WebServices.EnvEvento do
    begin
      if not(EventoRetorno.retEvento.Items[0].RetInfEvento.cStat in [135, 136]) then
      begin
        raise EDatabaseError.CreateFmt(
          'Ocorreu o seguinte erro ao enviar a carta de correção:'  + sLineBreak +
          'Código:%d' + sLineBreak +
          'Motivo: %s', [
            EventoRetorno.retEvento.Items[0].RetInfEvento.cStat,
            EventoRetorno.retEvento.Items[0].RetInfEvento.xMotivo
        ]);
      end;

      // retornos 
      DataHoraEvento  := EventoRetorno.retEvento.Items[0].RetInfEvento.dhRegEvento;
      NumeroProtocolo := EventoRetorno.retEvento.Items[0].RetInfEvento.nProt;
      XMLCCe          := EventoRetorno.retEvento.Items[0].RetInfEvento.XML;
      CodigoStatus    := EventoRetorno.retEvento.Items[0].RetInfEvento.cStat;
      MotivoStatus    := EventoRetorno.retEvento.Items[0].RetInfEvento.xMotivo;
    end;
  end
  else
  begin
    with ACBrNFe.WebServices.EnvEvento do
    begin
      raise Exception.Create(
        'Ocorreram erros ao enviar a Carta de Correção:' + sLineBreak +
        'Lote: '     + IntToStr(EventoRetorno.idLote) + sLineBreak +
        'Ambiente: ' + TpAmbToStr(EventoRetorno.tpAmb) + sLineBreak +
        'Orgao: '    + IntToStr(EventoRetorno.cOrgao) + sLineBreak +
        sLineBreak +
        'Status: '   + IntToStr(EventoRetorno.cStat) + sLineBreak +
        'Motivo: '   + EventoRetorno.xMotivo
      );
    end;
  end;

5 Comments

  1. Jorge Petroski Reply to Jorge

    O sequencial da Carta de Correção deve ser um sequencial para cada nota fiscal, ou um sequencial para todas cartas .

  2. Murilo F. Lemos Reply to Murilo

    Consegui gerar a carta de correção com esse exemplo, coloquei o caminho no PathCCe porém não foi salvo nenhum XML nesse diretório e em nenhum outro local. Tenho que fazer algo a mais para isso acontecer?
    Preciso do XML para poder imprimir os dados.

    • EventoRetorno.retEvento.Items[0].RetInfEvento.XML;

      Utilize essa propriedade para ler o XML de retorno e gravar no seu Banco de Dados, mas os arquivos são sempre salvos a não ser que você não tenha marcado para salvar (ACBrNFe.Arquivos.Salvar)

Dê-nos sua opinião, seu comentário ajuda o site a crescer e melhora a qualidade dos artigos.