Componente OpenSource para Nota Fiscal Eletrônica

O componente ACBrNFe é um projeto para gerar, validar, transmitir, receber as respostas dos WebServices da Receita e imprimir o DANFe. Este componente faz parte do Projeto ACBr e também é gratuito.

O componente possui duas versões - ACBr_NFe_CAPICOM e ACBr_NFe_OpenSSL. As principais diferenças entre as versões são:

  • ACBr_NFe_CAPICOM: Usa as DLLs da Microsfot CAPICOM (conexão segura) e MSXML (Assinatura e validação do XML) - Apenas funciona no Delphi e Windows. Funciona com certificados do tipo A1 e A3.
  • ACBr_NFe_OpenSSL: Usa Projetos OpenSource: Synapse+OpenSSL (conexão segura) e LibXml2 + XmlSEC (Assinatura e validação do XML) - Atualmente compatível com Delphi, mas será compatível com Lazarus, Kylix e com Linux. Funciona apenas com certificados do tipo A1.

Obtendo o Componente

O melhor aplicativo a ser usado é o TortoiseSVN, pois ele se integra com o Windows Explorer.

Para sempre ter a última versão do componente, será necessário baixar o componente via SVN.

  • Baixe o TortoiseSVN:
  • Depois de Instalado, crie um diretório para o baixar o ACBr.
  • Usando o Windows Explorer, clique com o botao direto sobre o diretorio e escolha: SVN Checkout.
  • Em URL of repository digite: https://acbr.svn.sourceforge.net/svnroot/acbr/trunk
  • Basta clicar em OK e o Tortoise irá criar a Estrutura de diretótorios do ACBr atualizado exatamente como utilizado pelos desenvolvedores.
  • Nas próximas vezes, basta clicar com o Botao direito no diretorio e usar: SVN Atualizar.

Nesse caso somente os fontes modificados ou novos serão baixados.

Se você já utilizava algum componente do ACBr, veja neste link as mudanças na estrutura das pastas do ACBr

Instalando o Componente

Versão OpenSSL

  1. Copie a DLL ACBr\ACBrNFe\DLLs\iconv.dll e as DLLs da pasta ACBr\ACBrNFe\DLLs\OpenSSL\ (libeay32.dll, libxml2.dll, libxmlsec.dll, libxmlsec-openssl.dll, libxslt.dll, ssleay32.dll e zlib1.dll) para a pasta Windows\System32.
  2. Adicione ao Library Path do Delphi as pastas ACBr\ACBrNFe e ACBr\ACBrComum Na IDE do Delphi acione "Tools, Enviroment Options" selecione a guia "Library", clique no botão elíptico de "Library Path", clique no botão elíptico à frente da caixa de texto, localize a pasta ACBr\Source\ACBrNFe no diretório de instalação da Biblioteca, clique em "OK", e em "Add". Repita o mesmo processo com a pasta ACBr\ACBrComum.
  3. Clique em "OK" para finalizar.
  4. Caso tenha o pacote ACBr_CLX ou ACBr_VCL já instalado no Delphi, verifique se na pasta ACBr\Source\Pascal existe alguma unit da synapse (blcksock.*, syn*.* ), e caso encontre apague estas units. Abra o pacote do ACBr (ACBr_CLX.dpk ou ACBr_VCL.dpk) e na IDE do Delphi clique em "Project, Build ACBr", Volte ao pacote e clique em compile.
  5. Na IDE do Delphi, clique em "File - Close All"
  6. Abra o arquivo ACBr_NFe_OpenSSL.dpk, clique em compile e ao ser solicitado para adicionar o pacote vACBr_CLX ou ACBr_VCL
  7. clique em Cancel. Clique em Install e ao ser solicitado para adicionar o pacote ACBr_CLX ou ACBr_VCL clique em Cancel

Versão CAPICOM

  1. Copie as DLLs da pasta ACBr\ACBrNFe\DLLs\Capicom (capicom.dll, msxml5.dll e msxml5r.dll) para a pasta Windows\System32.
  2. Vá ao botão Iniciar do Windows - Executar e execute os seguinte comandos: regsvr32 capicom.dll/s e regsvr32 msxml5.dll/s.
  3. Adicione ao Library Path do Delphi a pasta ACBr\ACBrNFe, ACBr\ACBrNFe\win32api e caso utilize o pacote ACBr_CLX ou ACBr_VCL adicione também a pasta ACBr\ACBrComum.
  4. Na IDE do Delphi acione "Tools, Enviroment Options" selecione a guia "Library", clique no botão elíptico de "Library Path", clique no botão elíptico à frente da caixa de texto, localize a pasta ACBr\ACBrNFe no diretório de instalação da Biblioteca, clique em "OK", e em "Add". Repita o mesmo processo com a pasta caso utilize o ACBr_CLX ou ACBr_VCL ACBr\ACBrComum.
  5. Click em "OK" para finalizar.
  6. Caso tenha o pacote ACBr_CLX ou ACBr_VCL já instalado no Delphi, verifique se na pasta ACBr\Source\Pascal existe alguma unit da synapse (blcksock.*, syn*.* ), e caso encontre apague estas units. Abra o pacote do ACBr (ACBr_CLX.dpk ou ACBr_VCL.dpk) e na IDE do Delphi clique em "Project, Build ACBr", Volte ao pacote e clique em compile.
  7. Na IDE do Delphi, clique em "File - Close All"
  8. Abra o arquivo ACBr_NFe_CAPICOM.dpk, clique em compile e depois em Install

Diferença entre a versão CAPICOM e OpenSSL

A principal diferença entre as duas versões, é que a versão CAPICOM permite o uso de certificados do tipo A1 e A3, enquanto a versão OpenSLL permite apenas o uso de certificados A1. Saiba mais.

Com a versão CAPICOM, o certificado precisará estar instalado no Windows. No componente precisaremos configurar o número de série do certificado. Para descobrir o número de série do certificado usado na versão CAPICOM, abra o Internet Explorer, vá ao menu Ferramentas, Opções da Internet, clique na aba Conteúdo, Certificados, clique duas vezes sobre o certificado, clique na aba Detalhes e encontre o campo Número de Série (Thumbprint). Copie o valor para o bloco de notas, e tire todos os espaços e deixe todas as letras em maiúsculo. Este valor deverá ser informado na propriedade NumeroSerie do componente.

Com a versão OpenSSL, será usado um arquivo PFX como certificado. Quando o certificado é adquirido, em alguns casos ele é instalado no Windows e em outros é recebido um arquivo PFX. Caso o certificado tenha sido instalado no Windows, siga as instruções a seguir: Abra o Internet Explorer, vá ao menu Ferramentas, Opções da Internet, clique na aba Conteúdo, Certificados, escolha o certificado desejado – clique em exportar, avançar, selecione a opção "Sim, exportar a chave particular", clique em avançar até ser solicitada uma senha para o arquivo e defina uma senha.

Esta senha será usada para instalar em o certificado em outras máquinas e também no componente. Clique em avançar até a conclusão da exportação. O path deste arquivo PFX deverá ser informado na propriedade Certificado do componente, e a senha usada para criara o arquivo, na propriedade Senha. No versão OpenSSL, também deverá ser informado as configurações do proxy da rede, caso exista. Na versão Capicom, as configurações do proxy são puxadas do Internet Explorer.

Usando o componente ACBrNFe

Baixe o demo do componente e veja as principais funções do componente. Agora, irei detalhar as principais funções do ACBrNFe.

Após instalar o componente vamos conhecer os principais comandos do ACBrNFe.

Consultar Status do Serviço

Para consultar o Status do Serviço dos WebServices da Receita, use o comando abaixo:

ACBrNFe1.WebServices.StatusServico.Executar; - Este comando, retorna True quando o serviço está em operação. Após este comando, é possível acessar a propriedade ACBrNFe1.WebServices.StatusServico.Msg para ver a mensagem de retorno do WebService.

Exemplo de uso:

  ACBrNFe1.WebServices.StatusServico.Executar;
  ShowMessage(ACBrNFe1.WebServices.StatusServico.Msg)

Criar uma Nota Fiscal Eletrônica

Para criar uma Nota Fiscal Eletrônica, utilize o comando ACBrNFe1.NotasFiscais.Add e preencha todas as informações referente a NFe.

Exemplo de Uso:

ACBrNFe1.NotasFiscais.Clear; // Limpas as Notas Fiscais que possam estar na memória do componente
  with ACBrNFe1.NotasFiscais.Add do
  begin
    Identificacao.NaturezaOperacao  := 'VENDA PRODUCAO DO ESTAB.';
    Identificacao.Codigo            := 1;
    Identificacao.Numero          := 1;
    Identificacao.Serie              := 1;
    Identificacao.DataEmissao  := Date;
    Identificacao.DataSaida       := Date;
    Identificacao.Tipo                := tSaida;
    Identificacao.FormaPagamento   := pgAVista;
 
    Emitente.CNPJ                      := '00000000000000';
    Emitente.IE                          := '123456789012';
    Emitente.Nome.RazaoSocial  := 'Razao Social Emitente';
    Emitente.Nome.Fantasia       := 'Nome Fantasia Emitente';
    Emitente.Endereco.Fone       := '(15) 3259XXXX';
    Emitente.Endereco.CEP         := '18270000';
    Emitente.Endereco.Logradouro      := 'Rua Onze de Agosto';
    Emitente.Endereco.Numero           := '3202';
    Emitente.Endereco.Complemento  := '';
    Emitente.Endereco.Bairro              := 'Centro';
    Emitente.Endereco.Cidade.Codigo   := 3554003;
    Emitente.Endereco.Cidade.Descricao := 'Tatui';
    Emitente.Endereco.UF                  := 'SP';
 
    Destinatario.CNPJCPF                   := '00000000000137';
    Destinatario.Endereco.CEP           := '18270410';
    Destinatario.Endereco.Logradouro      := 'Praça Anita Costa';
    Destinatario.Endereco.Numero           := '0034';
    Destinatario.Endereco.Complemento  := '';
    Destinatario.Endereco.Bairro              := 'Centro';
    Destinatario.Endereco.Cidade.Codigo  := 3554003;
    Destinatario.Endereco.Cidade.Descricao := 'Tatuí';
    Destinatario.Endereco.UF               := 'SP';
    Destinatario.Endereco.Fone            := '1532599600';
    Destinatario.IE                              := '000000000000';
    Destinatario.NomeRazao                := 'D.J. COM. E LOCAÇÃO DE SOFTWARES LTDA - ME';
 
    with DadosProdutos.Add do
    begin
      CFOP          := 5101;
      Codigo        := '67';
      Descricao     := 'ALHO 400 G';
      Quantidade    := 100;
      Unidade       := 'KG';
      ValorTotal    := 100;
      ValorUnitario := 10;
      with Tributos do
      begin
        with ICMS do
        begin
          CST := '00';
          ICMS00.Aliquota  := 18;
          ICMS00.Valor     := 180;
          ICMS00.ValorBase := 1000;
        end;
      end;
    end;
 
    ValoresTotais.BaseICMS     := 1000;
    ValoresTotais.ValorICMS    := 180;
    ValoresTotais.ValorNota    := 1000;
    ValoresTotais.ValorProduto := 1000;
  end;

Com o exemplo acima, criamos uma nota Fiscal em Memória, é possível adicionar várias notas usando o comando ACBrNFe1.NotasFiscais.Add várias vezes, para que depois possamos gerar um lote de envio.

Se você já possui o XML gerado, e não deseja adicionar as notas usando as propriedades do componente, é possível carregar um XML, para isso use o seguinte comando:

  ACBrNFe1.NotasFiscais.Add.XML.LoadFromFile(cPathArquivo);

Com o comando LoadFromFile, o arquivo será adicionado a memória do componente ACBrNFe, e será possível transmitir essa NFe.

Veremos abaixo como Salvar o XML ou Enviar a NFe.

Salvar o XML da NFe

Após incluirmos uma NFe usando o exemplo acima, podemos salvar o XML que será enviado para a Receita.

Exemplo:

ACBrNFe1.NotasFiscais.GerarNFe;
ACBrNFe1.NotasFiscais.Items[0].XML.SaveToFile(ExtractFileDir(application.ExeName)+ACBrNFe1.NotasFiscais.Items[0].XML.NFeChave+'-NFe.xml');

Com o comando acima, iremos salvar a primeira Nota Fiscal na pasta do programa, com o nome que começará pela chave da NFe e terminará com NFe.xml. Caso tenha adicionado mais de uma nota fiscal, repita o comando ACBrNFe1.NotasFiscais.Items[0].XML.SaveToFile mudando o número do item (Items[0], Items[1], Items[2], etc.)

Enviar uma ou mais NFe

Para enviar uma NFe, temos dois métodos disponíveis. O método ACBrNFe1.Enviar(NumLote); irá gerar o(s) XML da(s) NFe(s), assiná-la(s), validá-la(s), enviá-la(s) e por fim imprimí-la(s) (se forem autorizadas) de forma automática.

Caso não queira que o DANFe seja impresso automaticamente, use a sequência de comandos abaixo:

ACBrNFe1.NotasFiscais.GerarNFe;
ACBrNFe1.NotasFiscais.Assinar;
ACBrNFe1.NotasFiscais.Valida;
ACBrNFe1.WebServices.Envia(NumLote);

Depois para imprimir use o comando ACBrNFe1.NotasFiscais.Items[i].XML.Imprimir;.

Consultar uma NFe

Para consultar uma NFe, é possível consultar baseado na Chave da NFe ou carregando o XML da NFe já autorizada.

Exemplo usando a chave da NFe:

ACBrNFe1.WebServices.Consulta.NFeChave := self.NotasFiscais.Items[0].XML.NFeChave;
ACBrNFe1.WebServices.Consulta.Executar;

Exemplo carregando um XML:

ACBrNFe1.NotasFiscais.Clear;
ACBrNFe1.NotasFiscais.Add.XML.LoadFromFile(cPathArquivo);
ACBrNFe1.Consultar;

Cancelar uma NFe

Para cancelar uma NFe, e necessário informar a Chave da NFe, número do protocolo de autorização e uma justificativa para o cancelamento. O cancelamento também é possível ser realizado carregando um XML de uma NFe ou informando os campos citados acima.

Exemplo usando a Chave e Protocolo da NFe:

ACBrNFe1.WebServices.Cancelamento.NFeChave      := chNFe;
ACBrNFe1.WebServices.Cancelamento.Protocolo     := Protocolo;
ACBrNFe1.WebServices.Cancelamento.Justificativa := AJustificativa;

Exemplo carregando um XML

ACBrNFe1.NotasFiscais.Clear;
ACBrNFe1.NotasFiscais.Add.XML.LoadFromFile(cPathArquivo);
if not(InputQuery('WebServices Cancelamento', 'Justificativa', vAux)) then
   exit;
ACBrNFe1.Cancelamento(vAux);

Imprimir uma NFe baseado no XML

Para imprimir uma NFe baseado num XML, basta usar os comandos abaixo:

ACBrNFe1.NotasFiscais.Clear;
ACBrNFe1.NotasFiscais.Add.XML.LoadFromFile(cPathArquivo);
ACBrNFe1.NotasFiscais.Imprimir;

Validar uma NF-e

Para validar o XML de uma NFe use os comandos abaixo:

ACBrNFe1.NotasFiscais.Clear;
ACBrNFe1.NotasFiscais.Add.XML.LoadFromFile(cPathArquivo);
ACBrNFe1.NotasFiscais.Valida;

Caso exista algum erro no arquivo, será criada uma exception mostrando a mensagem de erro.

Inutilizar uma faixa de numeração

Para inutilizar uma faixa de numeração da NFe, use o comando abaixo:

ACBrNFe1.WebServices.Inutiliza(CNPJ. Justificativa, Ano, Modelo, Serie, NumeroInicial, NumeroFinal);

Saiu na DevMedia!

  • Quais os passos para emitir a NF-e?:
    A nota fiscal eletrônica consiste de um arquivo XML, o qual é preenchido com os dados de uma movimentação de mercadoria ou serviço, assinado digitalmente e enviado para a SEFAZ do estado no qual o contribuinte reside.

Saiba mais sobre Automação Comercial ;)

  • Guia Completa de Automação Comercial:
    Nesse guia veremos como a automação comercial agiliza os processos nas empresas, aumentando a sua competitividade no mercado. Se você quer aumentar a eficiência de processos manuais.