Ir para conteúdo
  • Cadastre-se

dev botao

GerarChaveAcesso e a validação do código numérico da NFe/NFCe


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

Recommended Posts

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.

 

 

 

 

Link para o comentário
Compartilhar em outros sites

Pessoalmente sou contra, desde da NFe 2 senão to errado é falado para não fazer isso so não era validado, a SEFAZ cansou de falar e começou a validar.

Se abrir brecha o usuário nunca vai mudar o código ai quando a validação for para o ambiente de produção vai ter esta mesma choração então é melhor deixar do jeito que esta, pois isso é trocar seis por meia duzia.

 

Link para o comentário
Compartilhar em outros sites

4 minutos atrás, Rafael Dias disse:

Pessoalmente sou contra, desde da NFe 2 senão to errado é falado para não fazer isso so não era validado, a SEFAZ cansou de falar e começou a validar.

Se abrir brecha o usuário nunca vai mudar o código ai quando a validação for para o ambiente de produção vai ter esta mesma choração então é melhor deixar do jeito que esta, pois isso é trocar seis por meia duzia.

Rafael, eu concordo com você que a parametrização demasiada pode ocasionar defasagem no código. Porém, eu acredito que como tudo, este ponto pode demandar uma flexibilidade, pois é uma alteração tecnicamente simples, porém pode ocasionar transtornos para os desenvolvedores com seus clientes.

Acredito que neste caso cabe uma tratativa. 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Fundadores

Apenas para deixar registrado.... Após amplo debate na Equipe do ACBr, e seguindo a sugestão do @Rafael Dias, essa verificação foi migrada para as "Regras de Negócios"...

Ou seja, o ACBr apenas irá fazer a crítica, se o usuário chamar o método de verificação de Regras de Negócios...

  • Curtir 1
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 para o comentário
Compartilhar em outros sites

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

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.