Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 14 de Janeiro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
100 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  DANFE para NF-e - Abordagem prática com Rave Reports
Publicado por ActiveDelphi : Segunda, Junho 30, 2008 - 10:44 GMT-3 (4794 leituras)
Comentários 15 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Victory Fernandes 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



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: CNasciment (can-celsoalves@hotmail.com) : Jan 06, 2009 - 06:37
(Informações sobre o membro | Enviar uma mensagem)
Esse e todos os demais artigos do Victory
são excelentes. Parabéns Victory pelo seu grande
conhecimento e muito obrigado por toda ajuda que nos ofereçe.


por: NTS (ntsinfo@uol.com.br) : Mar 21, 2009 - 04:29
(Informações sobre o membro | Enviar uma mensagem) http://www.ntsinfo.com.br
Os artigos do Vitor são muito bons, mas o que ele faz é pegar as informaçães dos manuais e transcreveer para o site, em termo de ajuda de código não se aprende nada, pois o que ele quer na verdade é estar vendendo seus componentes, que por sinal são bem caros, que se encontram em seu site. Acho bem justo pois dá trabalho, mas ele deveria ajudar mais pelo seu potencial.


por: Barbosaf (fernandobs20@hotmail.com) : Abr 21, 2009 - 04:01
(Informações sobre o membro | Enviar uma mensagem) http://http://
"Propaganda enganosa", esse artigo só tem a finalidade de vender os componentes do autor. Até ai tudo bem, mas deveria deixar bem claro antes de tudo para não fazer as pessoas perderem tempo. Pois quem está lendo este artigo, esta querendo fazer a solução não comprar uma pronta.


por: ageromin (alexandre.geromin@gmail.com) : Ago 13, 2009 - 11:08
(Informações sobre o membro | Enviar uma mensagem)
Também estou com os colegas que postaram, achei demais mesmo uma pessoa querer compartilhar uma solução que muitos precisam. Mas como 99,9% das pessoas é mais uma jogada pra marketing e venda.


por: reginacn (reginacn@gmail.com) : Out 21, 2009 - 02:16
(Informações sobre o membro | Enviar uma mensagem)
Olá!
Estou iniciando o aprendizado com Rave e estou desenhando o layout do Danfe. Gostaria de saber como vcs resolveram o problema do Danfe poder ser gerado em mais de uma página. Especificamente quando os dados do campo "Informações Complementares" for grande o suficiente que não cabe na área reservada para o mesmo e por isso, uma nova página deve ser gerada.

att,
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados