Boa tarde a todos.
De acordo com a NT 2019.001, será implementada a validação do campo cNF: cNF não pode ser igual a nNF (id: B08).
Foi implementado no componente o método ValidarCodigoDFe dentro da geração da chave de acesso na unit ACBrDFeUtil, tudo muito bem explicado aqui:
Ví relatos de algumas pessoas passando por dificuldade com este ponto, pois atualizam seus fontes e geraram uma versão de seus produtos já com a nova validação. Entretanto, como somente o ambiente de homologação está realizando esta validação, as chaves geradas de forma "errada" estão caindo na validação, visto que ainda podem não ter sido reimplementadas.
Sendo assim, segue uma dica que realizei para contornar sem impactar em uma nova atualização:
function GerarChaveAcesso(AUF: Integer; ADataEmissao: TDateTime; const ACNPJ:String;
ASerie, ANumero, AtpEmi, ACodigo: Integer; AModelo: Integer = 55;
const AValidarCodigoNumerico: Boolean = False): String;
var
vUF, vDataEmissao, vSerie, vNumero, vCodigo, vModelo, vCNPJ, vtpEmi: String;
begin
if AValidarCodigoNumerico then
begin
if ACodigo > 0 then
if not ValidarCodigoDFe(ACodigo, ANumero) then
raise EACBrDFeException.Create('Código Numérico inválido, Chave não Gerada');
if ACodigo <= -2 then
raise EACBrDFeException.Create('Código Numérico inválido, Chave não Gerada');
end;
if ACodigo = -1 then
ACodigo := 0;
if ACodigo = 0 then
ACodigo := GerarCodigoDFe(ANumero);
vUF := Poem_Zeros(AUF, 2);
vDataEmissao := FormatDateTime('YYMM', ADataEmissao);
vCNPJ := PadLeft(OnlyNumber(ACNPJ), 14, '0');
vModelo := Poem_Zeros(AModelo, 2);
vSerie := Poem_Zeros(ASerie, 3);
vNumero := Poem_Zeros(ANumero, 9);
vtpEmi := Poem_Zeros(AtpEmi, 1);
vCodigo := Poem_Zeros(ACodigo, 8);
Result := vUF + vDataEmissao + vCNPJ + vModelo + vSerie + vNumero + vtpEmi + vCodigo;
Result := Result + Modulo11(Result);
end;
Criamos um parâmetro com valor default para validar a chave somente quando necessário, na chamada pode ficar assim:
GerarChaveAcesso(CUF, DATAEMISSAO, DOCUMENTO, SERIE, NRONF, TIPOEMISSAO, CNF, MODELO, AMBIENTE = taHomologacao);
Enfim, saliento que entendo a grande importância desta implementação sem a validação do ambiente, é somente uma dica para quem está meio perdido com essa alteração e quer manter uma retrocompatibilidade com fontes atualizados.