Segue código fonte da função que escrevi em Delphi para gerar a chave de acesso da NF-e. Já atualizada conforme última versão definida na “Nota Técnica 2007/008”; repare que no Manual de Integração de 2008 a as instruções para gerar a chave de acesso estão desatualizadas, ou seja, por incrível que pareça a Nota divulgada em 2007 é mais recente que a informação do manual divulgado em 2008 e por ai vai….; mas, vamos ao que interessa.

Para construir a chave de acesso usamos as quatro funções listadas a seguir: MontaChaveAcessoNFe (função que recebe os parâmetros da nota e devolve a chave de acesso da NF-e), LimpaCNPJ (função complementar que retira os “traços”, “pontos” e “barra” do CNPJ, se houver), StrZero (que preenche com zeros à esquerda os campos numéricos) e por último a função que faz o calculo do digito verificador da chave (Modulo11).

//MontaChaveAcesso
// (codigo alterado em 19/11/08 para compor a chave no formato da versão 1.10 do laioute)
//-------------------
//Parametros:
//codUF - codigo da Unidade e Federação do Município de acordo tabela IBGE.
//dtEmissaso - data de emissão da nota fiscal
//CNPJ - codigo CNPJ do emitente
//Modelo - Modelo da Nota Fiscal NF-e (55)
//Serie - codigo de serie da NFe
//NumeroNF - Número da Nota Fiscal
//Result = Chave de acesso
//
Function MontaChaveAcessoNFe_v110( codUF: integer; dtEmissao: TDateTime; CNPJ:string;
Modelo, Serie, NumeroNF: integer): string;
var emissao:string[10];
chave:string;
CodigoNumerico: Integer;
begin
emissao := formatdatetime('DD/MM/YY', dtEmissao);
 
// Essa parte do código gera o Código Numérico (Aleatório)
//para que funcione inclua a unit "Math" na cláusule Uses.
Randomize;
CodigoNumerico := Random(99999999);
 
chave := IntToStr(codUF)+copy( emissao, 7,2)+copy(emissao,4,2)+
LimpaCNPJ(CNPJ)+StrZero(Modelo,2,0)+StrZero(Serie,3,0)+
StrZero(NumeroNF,9,0)+StrZero(CodigoNumerico,9,0);
 
Result := chave + Modulo11(chave);
 
end;
 
// LimpaCNPJ (retira máscaras do CNPJ)
//------------------------------------
Function LimpaCNPJ( cnpj: string): string;
begin
Result := StringReplace(StringReplace(StringReplace( cnpj,
'.','',[rfReplaceAll]),
'-','',[rfReplaceAll]),
'/','',[rfReplaceAll]);
end;
 
// StrZero (Preenche com zeros à esquerda)
// ------------------------------------------------------
Function StrZero(Num : Real; Zeros, Deci: Integer): string;
var tam,z : integer;
res,zer : string;
begin
str(Num:Zeros:Deci, res);
res := Alltrim(res);
tam := length(res);
zer := '';
for z := 1 to (Zeros-tam) do
zer := zer + '0';
result := zer+res
end;
 
// Alltrim --------------------------
Function Alltrim(Text: string) : string;
begin
  while Pos(' ', Text) > 0 do
     Delete( Text, pos(' ', text), 1);
     Result := Text;
End;

Com isso menos uma etapa para ser cumprida.

Até a próxima!

Tags: , ,