Seguindo a linha de publicações voltadas às soluções para Nota Fiscal Eletrônica (NF-e) damos continuidade a esta série, desta vez apresentando informações sobre o Documento Auxiliar de Nota Fiscal Eletrônica - DANFE. Para gerar e imprimir o DANFE no Delphi utilizamos os recursos do Rave Reports.
A NF-e é um documento emitido e armazenado eletronicamente, com validade
jurídica garantida por processo de assinatura digital. O principal objetivo da
implantação desta nova modalidade é o acompanhamento em tempo real das operações
comercias pelo Fisco e a substituição do modelo atual de emissão de documentos
fiscais em papel, de forma a simplificar uma série de obrigações do
contribuinte. Maiores informações podem ser obtidas através do portal nacional
em
www.nfe.fazenda.gov.br
Sobre o DANFE
Conforme as informações contidas no documento Manual de Integração disponível
para download no portal oficial da NFe (
http://www.nfe.fazenda.gov.br/portal/integracao.aspx ), o DANFE constitui
uma representação gráfica simplificada da NF-e, que impresso em papel comum,
geralmente em única via, contém informações da mesma.
A legislação referente à emissão e preenchimento da nota fiscal modelo 1/1A
também se aplica ao preenchimento do DANFE, cujas principais informações são a
chave de acesso e o código de barras linear, que facilitam e agilizam a consulta
da nota na Internet e a respectiva confirmação das informações do DANFE, pelos
contribuintes destinatários e demais pessoal interessadas.
O DANFE não é uma nota fiscal, nem a substitui, servindo apenas como instrumento
auxiliar para consulta da NF-e na Internet.
Em caso de problemas técnicos por parte do contribuinte ou da SEFAZ de destino
onde não seja possível enviar a NF-e, faz-se necessário operar em contingência.
Quando operando em contingência, devem ser geradas duas vias do DANFE, além do
arquivo da NF-e. Uma ficará em mãos da empresa emissora e outra deverá
acompanhar o produto. Ambas as vias devem ser impressas em formulários de
segurança.
Os arquivos da NF-e gerados e não enviados durante o período de contingência
devem ser re-enviados ao término do período.
O formulário de segurança é um papel com dispositivos de segurança que garantam
a autenticidade do documento. O formulário possui estampa fiscal, com recursos
de segurança impressos e localizados na área reservada ao Fisco, e terá, no
mínimo, as seguintes características:
1. Papel de segurança com filigrana produzida pelo
processo mould made;
2. Fibras coloridas e luminescentes;
3. Papel não fluorescente;
4. Micro cápsulas de reagente químico;
5. Micro poros que aumentem a aderência do toner ao papel;
6. Numeração seqüencial de 000.000.001 a 999.999.999,
reiniciada a numeração quando atingido esse limite e seriação de "AA" a "ZZ".
Ainda conforme o Manual de Integração, o DANFE pode ser impresso conforme
dois layouts disponíveis nos Anexos II e III do mesmo documento, em formato
Retrato ou Paisagem, conforme mostrado na Figura 01 e Figura 02 a seguir.

Figura 01: DANFE Retrato, Anexo II do Manual de Integração.

Figura 02: DANFE Paisagem, Anexo III do Manual de Integração.
Gerando o DANFE a partir do Rave Reports
De forma a agilizar o processo de adequação do seu software à legislação e
layouts padrão da NF-e, desenvolvemos os modelos Retrato e Paisagem de DANFE
utilizando o Rave Reports, cujo demo está disponível para download no site
http://www.igara.com.br/produto.php?cod_produto=114 . A incorporação da
implementação aqui proposta ao seu aplicativo reduz significativamente o tempo
de adequação do seu software à legislação de NF-e, pois com a estrutura dos
DANFEs prontas restam apenas alguns ajustes para que eles se encaixem
perfeitamente à sua aplicação.
Após abrir o aplicativo, escolhemos o modelo de DANFE desejado, retrato ou
paisagem, e clicamos no botão “Imprimir DANFE” conforme mostrado na Figura 03.

Figura 03: Aplicativo em Delphi para geração de DANFE
A implementação do DANFE no Delphi foi feita utilizando um componente da classe
TRvProject em conjunto com os arquivos DANFE_Retrato.rav e DANFE_Paisagem.rav
que contém a estrutura do relatório a ser gerado e podem ser editados conforme
mostrado nas Figura 04 e 05.

Figura 04: Estrutura do DANFE Retrato no Rave Report

Figura 05: Estrutura do DANFE Paisagem no Rave Report
Vale lembrar que a utilização da ferramenta Rave Reports não é
obrigatória, ficando essa escolha a cargo do desenvolvedor. A preferência pelo
Rave Reports se deu, pois o mesmo acompanha a instalação padrão do Delphi bem
como possui componentes que facilitam a geração do código de barras Code-128C.
O código de barras a ser impresso no DANFE é o Code-128C. O referido código de
barras deverá representar apenas a chave única de acesso do arquivo da NFe, com
44 posições. Para a impressão do mesmo será considerada a estrutura mostrada na
Figura 06:

Figura 06: Estrutura do Código de barras
• Margem Clara: Espaço claro, que não contém nenhuma marca legível por
máquina,existente à esquerda e à direita do código para evitar interferência na
decodificação da simbologia. A margem clara também é chamada de "área livre",
"zona de silêncio" ou "margem de silêncio".
• Start C: Inicia a codificação dos dados Code-128C de acordo com o conjunto de
caracteres. O Start C não representa nenhum caractere.
• Chave de acesso da NF-e: Representa o conjunto de 44 caracteres da chave de
acesso da NF-e.
• DV: Dígito verificador da simbologia. O dígito verificador da simbologia é
diferente do dígito verificador da chave de acesso. O dígito verificador da
simbologia é baseado em um cálculo do módulo 103 considerando a soma ponderada
dos valores de cada um dos dígitos na mensagem que está sendo codificada,
incluindo o valor do caractere de início (start).
• Stop: Caractere de parada que indica o final do código ao leitor óptico.
O código de barras deverá ser impresso com resolução mínima de 300 dpi, devendo
ser observada a área reservada no DANFE de 3x9 cm. No intuito de propiciar
melhor área de leitura, a altura da barra não poderá ser inferior a 1,5 cm e nem
superior a 2,5 cm. Na Figura 07 é possível ver o resultado final da impressão em
impressora do tipo Laser ou Jato de Tinta do DANFE em formato paisagem e na
Figura 08 o detalhe da altura do código de barras.

Figura 07: DANFE paisagem impresso

Figura 08: Altura do código de barras dentro do padrão
Uma vez criada a estrutura do DANFE na ferramenta de relatório escolhida,
devemos passar os valores dos campos para o relatório. A passagem de valores no
Rave Reports é feita através de parâmetros que são atribuídos aos componentes de
dados da classe TDataText. A passagem dos parâmetros para o DANFE é mostrada no
código abaixo.
procedure TForm1.Button4Click(Sender:
TObject); //procedimento de impressao
Begin
if radiogroup1.ItemIndex = 1 then //Opção de DANFE Paisagem
begin
RvProject1.Close;
RvProject1.ProjectFile := ExtractFileDir(Application.ExeName)
+ '\DANFE_Paisagem.rav';
RvProject1.SetParam('chave_acesso', ValueListEditor8.Values['Id']);
RvProject1.SetParam('CNPJ_IDE', ValueListEditor23.Values['CNPJ']);
RvProject1.SetParam('IE_IDE', ValueListEditor6.Values['IE']);
RvProject1.SetParam('IEST_IDE', ValueListEditor6.Values['IEST']);
RvProject1.SetParam('xNome_Emit', ValueListEditor6.Values['xNome']);
(...)
End
Else //Opção de DANFE Retrato
Begin
RvProject1.Close;
RvProject1.ProjectFile := ExtractFileDir(Application.ExeName)
+ '\DANFE_Retrato.rav';
RvProject1.SetParam('chave_acesso', ValueListEditor8.Values['Id']);
RvProject1.SetParam('CNPJ_IDE', ValueListEditor23.Values['CNPJ']);
RvProject1.SetParam('IE_IDE', ValueListEditor6.Values['IE']);
RvProject1.SetParam('IEST_IDE', ValueListEditor6.Values['IEST']);
RvProject1.SetParam('xNome_Emit', ValueListEditor6.Values['xNome']);
(...)
End;
End; |
O símbolo de “(...)” representa o restante do código que foi suprimido por
ser muito extenso e não diferir muito do que já foi mostrado. No exemplo acima,
mostramos a passagem de parâmetros com strings fixas, porém na sua aplicação
esses valores podem ser substituídos por resultados provenientes do seu banco de
dados, ou qualquer outra fonte de dados que possuir.
Gerando a Chave de Acesso
Conforme informado anteriormente o conteúdo do código de barras é a chave
única de acesso do arquivo da NFe com 44 posições. Até a versão 1.10 do layout
da NF-e, a chave de acesso segue o seguinte padrão:

Figura 09: Formato da chave de acesso até a versão 1.l0 do
layout da NFe
• cUF - Código da UF do emitente do Documento Fiscal
• AAMM - Ano e Mês de emissão da NF-e
• CNPJ - CNPJ do emitente
• mod - Modelo do Documento Fiscal
• serie - Série do Documento Fiscal
• nNF - Número do Documento Fiscal
• cNF - Código Numérico que compõe a Chave de Acesso
• cDV - Dígito Verificador da Chave de Acesso
A partir da versão 1.11 do layout da NF-e, o campo tpEmis (forma de emissão da
NFe) passou a compor a chave de acesso da seguinte forma:

Figura 10: Formato da chave de acesso até a versão 1.l0 do
layout da NFe
O tamanho do campo cNF - código numérico da NF-e foi reduzido para oito posições
para não alterar o tamanho da chave de acesso da NF-e de 44 posições, que passa
a ser composta pelos seguintes campos que se encontram dispersos na NF-e :
• cUF - Código da UF do emitente. Utilizar a Tabela do IBGE de código de
unidades da federação (Anexo VII - Tabela de UF, Município e País).
• AAMM - Ano e Mês de emissão da NF-e
• CNPJ - CNPJ do emitente
• mod - Modelo do Documento Fiscal
• serie - Série do Documento Fiscal. Informar zero se inexistente.
• nNF - Número do Documento Fiscal de 1 a 999999999
• tpEmis – forma de emissão da NF-e
o 1 – Normal - emissão normal com transmissão on-line da NF-e para a SEFAZ de
origem.
o 2 – Contingência off-line – emissão em contingência, com impressão do DANFE em
formulário de segurança e posterior transmissão da NF-e para a SEFAZ de origem
quando sanados os problemas técnicos que motivaram a adoção da contingência.
o 3 – Contingência SCAN – emissão em contingência no Sistema de Contingência do
Ambiente Nacional – SCAN.
• cNF - Código Numérico que compõe a chave de acesso. Número aleatório gerado
pelo emitente para cada NF-e para evitar acessos indevidos.
• cDV - Dígito Verificador da Chave de Acesso
O dígito verificador ou DV da chave de acesso da NF-e é baseado em um cálculo do
módulo 11. O módulo 11 de um número é calculado multiplicando-se cada algarismo
pela seqüência de multiplicadores 2,3,4,5,6,7,8,9,2,3,4 (...) posicionados da
direita para a esquerda.
A somatória dos resultados das ponderações dos algarismos é dividida por 11 e o
DV será a diferença entre o divisor (11) e o resto da divisão:
DV = 11 - (resto da divisão)
Quando o resto da divisão for 0 (zero) ou 1 (um), o DV deverá ser igual a 0
(zero). Para demonstrar a operação anterior considere o exemplo de cálculo de
dígito verificador para a chave de acesso a seguir:

Figura 11: Exemplo de cálculo de dígito verificador da chave
de acesso da NFe
• Somatória das ponderações = 644
• Dividindo a somatória das ponderações por 11 teremos, 644 /11 = 58 restando 6.
• Como o dígito verificador DV = 11 - (resto da divisão), portando 11 - 6 = 5
• Neste caso o DV da chave de acesso da NF-e é igual a "5", valor este que
deverá compor a chave de acesso totalizando a uma seqüência de 44 caracteres.
Com base nas informações fornecidas é possível implementar funções que, de posse
dos parâmetros necessários, gerem a chave de acesso com seu respectivo dígito
verificador. Um exemplo funcional destas funções pode ser visto no aplicativo da
Figura 11. As funções apresentadas a seguir fazem parte do aplicativo demo de
geração de arquivos XML de NFe disponível para download no site
http://www.igara.com.br/produto.php?cod_produto=114

Figura 11: Exemplo de cálculo de chave de acesso e dígito
verificador da NFe
A função Calcula_DV_NFe recebe como parâmetro a String da chave de acesso, e
independente de versão, retorna o dígito verificador calculado conforme cálculo
do módulo 11, demonstrado anteriormente.
//Consultar item "CÁLCULO DO
DÍGITO VERIFICADOR DA CHAVE DE ACESSO DA NF-e" do Manual de Integração
Function Calcula_DV_NFe(chave_acesso: String): String;
var
pesos: array of integer;
x, peso, sum_ponderacao, dv: integer;
begin
setlength(pesos, length(chave_acesso));
peso := 1;
//compõe array com pesos
for x := length(chave_acesso) - 1 downto 0 do
begin
if peso = 9 then
peso := 1;
peso := peso + 1;
pesos[x] := peso;
end;
//faz somatório das ponderações
for x := 1 to length(chave_acesso) do
begin
sum_ponderacao := strtoint(chave_acesso[x]) * pesos[x];
end;
//calcula DV
dv := 11 - (sum_ponderacao mod 11);
//testa resultado e retorna DV
if (dv = 0) or (dv = 1) then
result := '0'
else
result := inttostr(dv);
end; |
A função Calcula_Chave_de_Acesso_NFe recebe como parâmetros a versão de layout,
conforme a qual dever ser gerada a chave de acesso, e os seus respectivos
parâmetros necessários, bem como um parâmetro indicando se o retorno da função
deverá ou não conter o dígito verificador incluso. Caso o parâmetro incluir_dv
seja passado como True, é feita a chamada à função Calcula_DV_NFe.
//Consultar item "5.4 Chave de
Acesso da NF-e" do documento Manual_de_Integracao
Function TForm1.Calcula_Chave_de_Acesso_NFe(versao: String; cUF: String;
DEmi:TDateTime; CNPJ: String; mod: String; serie: String; nNF: String;
tpEmis: String; cNF: String; incluir_dv: boolean): String;
begin
result := '';
if versao = '1.10' then
begin
result := cUF + //Código da UF do emitente do Documento
Fiscal
FormatDateTime('YYMM', DEmi) + //Ano/Mês emissão
CNPJ + //CNPJ do emitente
mod + //Modelo do Documento Fiscal
serie + //Série do Documento Fiscal
nNF + //Número do Documento Fiscal
cNF; //Código Numérico que compõe a Chave de Acesso
end
else if versao = '1.11' then
begin
result := cUF + //Código da UF do emitente do Documento
Fiscal
FormatDateTime('YYMM', DEmi) + //Ano/Mês emissão
CNPJ + //CNPJ do emitente
mod + //Modelo do Documento Fiscal
serie + //Série do Documento Fiscal
nNF + //Número do Documento Fiscal
tpEmis + //Forma de emissão da NF-e
cNF; //Código Numérico que compõe a Chave de Acesso
end
else
begin
result := 'erro na chave de acesso';
exit;
end;
if incluir_dv then
result := result + Calcula_DV_NFe [result]; //Calcula DV da
Chave de Acesso
end; |
Conclusão
Com este artigo abordamos conceitos gerais sobre o Documento Auxiliar de
Nota Fiscal Eletrônica - DANFE, como criá-los no Delphi com o apoio do Rave
Reports, passar parâmetros para o mesmo, gerar ser código de barras, calcular a
chave de acesso e o dígito verificador da mesma.
A NF-e já é uma realidade, e muito em breve todos serão obrigados a adotar este
novo formato. Mesmo as empresas não obrigadas, estão interessadas em ter seus
sistemas atualizados para trabalhar nesta nova modalidade de emissão de
documentos fiscais.
Demos continuidade à nossa série de artigos sobre NFe, e desta vez, demonstramos
como construir o DANFE de forma simples e prática.
Alexandre Magno é estudante de Engenharia Mecatrônica da UNIFACS –
Universidade Salvador e desenvolvedor da TKS Software - Soluções de Automação e
Softwares Dedicados. Pode ser contatado em
alexandremlcosta@hotmail.com
Fellipe Capolupo é estudante de Engenharia Elétrica da UNIFACS –
Universidade Salvador e desenvolvedor da TKS Software - Soluções de Automação e
Softwares Dedicados. Pode ser contatado em
capolupofellipe@yahoo.com.br
Victory Fernandes é Professor do Departamento de Engenharia da UNIFACS,
Engenheiro Mestrando em Redes de Computadores, e desenvolvedor sócio da TKS
Software - Soluções de Automação e Softwares Dedicados. Pode ser contatado em
victory@igara.com.br , ou através dos
sites www.igara.com.br
–
www.igara.com.br/victory
|