O que é Nota Fiscal Eletrônica(NF-e)?

O Projeto Nota Fiscal Eletrônica (NF-e), foi criado a partir de reuniões entre os administradores tributários federais, estaduais, do Distrito Federal e dos municípios de capitais. A primeira reunião foi realizada em julho de 2004, onde o objetivo era encontrar soluções conjuntas para uma maior integração administrativa, padronização e melhor qualidade das informações, maior eficácia na fiscalização, entre outros. No final de agosto de 2005, foi assinado o Protocolo ENAT 03/2005 visando à implantação da Nota Fiscal Eletrônica, ficando sobre responsabilidade do ENCAT (Encontro Nacional dos Coordenadores e Administradores Tributários Estaduais) o desenvolvimento do projeto.

A Nota Fiscal Eletrônica é um arquivo digital que contém as informações fiscais sobre a operação comercial, que é assinada digitalmente e transmitida para a Secretaria da Fazenda a qual o contribuinte emitente da NF-e está ligado. Resumindo, a NF-e é um documento digital, emitido e armazenado digitalmente, com o objetivo de documentar uma operação comercial para fins fiscais.

Apesar da NF-e ser um documento que existe apenas digitalmente, o arquivo deve ser guardado pelo prazo decadencial previsto na legislação, que atualmente é de 5 anos, para apresentação ao fisco quando solicitado.

Fácil, Rápido e Open-Source

Em meados de 2008, um assunto muito discutido em todas as empresas é a implantação da Nota Fiscal Eletrônica (NF-e). A partir de abril de 2008, o governo vem obrigando alguns setores a emitirem apenas NF-e. Em abril foram obrigados fabricantes de cigarros, distribuidores de cigarros, produtores, formuladores e importadores de combustíveis líquidos, distribuidores de combustíveis líquidos, transportadores e revendedores retalhistas – TRR; em Setembro de 2008 mais 9 setores passaram a ser obrigados a emitir NF-e; em abril de 2009 mais 25 setores entraram na lista e para setembro de 2009 estão previstos a entrada de mais 54 setores. Por este motivo, se sua empresa vai ser obrigada a emitir NF-e a partir de setembro está na hora de começar a adaptar seu sistema para atender as exigências fiscais, e mesmos os setores que não vão ser obrigados a partir de setembro, o governo espera que se interessem voluntariamente a ser emissor de NF-e.

Certificados Digitais

Um Certificado digital é um arquivo que contém informações da sua empresa como CNPJ, Razão Social, email, informações sobre quem emitiu sua chave pública, número de série do certificado, a validade do certificado e a assinatura da Autoridade Certificadora.

Para NF-e existem dois tipos de certificados disponíveis: e-CNPJ e e-NFe. Com o e-CNPJ além de permitir a assinatura e transmissão dos arquivos da NF-e, também é possível acessar alguns serviços da Secretaria da Receita Federal (SRF), como IRPF - Declarações Entregues, Situação Fiscal do Contribuinte, Cópia de Declaração, Comprovante de Arrecadação, Retificação de Documento de Arrecadação - Redarf Net, Entrega de Declarações com Aposição de Assinatura Digital: Dirf 2005, Simples 2005 e DCTF Mensal, Procuração Eletrônica, Siscomex entre outros. Com o e-NFe apenas é possível utilizá-lo na assinatura e transmissão dos arquivos da NF-e.

Então, qual tipo escolher? O e-CNPJ que geralmente é mais barato e permite acesso a mais serviços ou o e-NFe?

O e-NFe foi desenvolvido para permitir exclusivamente a emissão e gerenciamento da NF-e, enquanto o e-CNPJ permite o acesso a diversos serviços, ou seja, quem tiver acesso ao e-CNPJ terá acesso a serviços que deveriam ser executados apenas pelo representante legal da empresa. Chegamos à conclusão que por questões de segurança deve ser usado o certificado do tipo e-NFe, a não ser que quem emite a NF-e seja também o representante legal da empresa.

Tipo de Certificado: A1 ou A3?

Ao adquirir um certificado digital para a NF-e, a primeira pergunta a ser feita é o tipo de certificado: A1 ou A3?

O certificado do tipo A1 é gerado em um arquivo no micro que foi solicitado e tem validade de um ano. Geralmente, o custo inicial é menor, pois não é necessário nenhum hardware específico para usar o certificado. A principal vantagem do tipo A1 é a possibilidade de criar cópias do certificado, permitindo que seja instalado em mais de um micro. Esta vantagem, pode se tornar uma falha de segurança, caso a cópia seja gerada com uma senha simples, por isso, ao exportar um certificado do tipo A1 escolha uma senha difícil de ser descoberta.

O certificado do tipo A3 é gerado em token ou em um cartão inteligente e tem validade de 3 anos. No caso da versão gerada em cartão inteligente é necessária a compra de uma leitora para utilização do certificado. Por ser gerado em um hardware o A3 é considerado mais seguro, pois não permite a realização de cópias. Por não permitir esta cópia só é possível utilizá-lo quando estiver fisicamente ligado ao computador. Além disso, cada vez que o certificado for conectado ou o micro reiniciado será necessário digitar a senha do certificado. Atenção: caso a senha seja digitada repetidas vezes de forma incorreta o conteúdo do cartão ou token é apagado, inutilizando o certificado.

Recomendo o uso de certificados do tipo A1, ao menos no início do desenvolvimento, pois assim, você poderá ficar com uma cópia do certificado em sua máquina de desenvolvimento para realização de testes, enquanto a outra cópia pode ser usada em produção.

Histórico do componente ACBrNFe

ACBrNFe é um componente pertencente ao Projeto ACBr. O Projeto ACBr é um pacote de componentes open-source, que auxiliam no desenvolvimento de aplicativos comerciais. O objetivo inicial do Projeto ACBr foi criar uma paleta de componentes, com versões VCL e CLX, compatíveis com Delphi, Kylix e Lazarus, que permitem o acesso direto a equipamentos para automação comercial sem a necessidade de DLL’s dos fabricantes. O ACBrNFe foi criado a partir da doação de um componente que já era usado em produção, mas que usava soluções proprietárias para assinatura do XML. A partir desta doação, foram desenvolvidas duas versões do componente, uma usando as DLL’s capicom, msxml5 e msxml5r, sendo todas da Microsoft. A segunda versão usa o projeto LibXML e OpenSLL, ambos os projetos Open-Source.

Como obter o componente?

Para obter o componente ACBrNFe, primeiramente baixe o TortoiseSVN. Após instalar o TortoiseSVN siga os passos abaixo:

  • Crie um diretório para baixar o ACBr;
  • Visite o site e faça o download;
  • Clique com o botão direito sobre o diretório recém-criado e escolha a opção SVN Obter Módulo;

Instalando o componente

Primeiramente, escolha qual versão do componente irá instalar ACBr_NFe_CAPICOM e ACBr_NFe_OpenSSL. As principais diferenças entre as versões são:

  • ACBr_NFe_CAPICOM: Usa as DLLs da Microsoft 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 Open Source: Synapse+OpenSSL (conexão segura) e LibXml2 + XmlSEC (Assinatura e validação do XML) – É compatível com Lazarus, Kylix e com Linux. Funciona apenas com certificados do tipo A1.
  • Se você pretende desenvolver apenas para Windows e não pretende usar o Lazarus, dê preferência à versão CAPICOM.
  • 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;
    3. Na IDE do Delphi clique em Tools - Enviroment Options selecione a guia Library, clique no botão elíptico (...) de Library Path, clique no botão elíptico (...) a 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 ACBr\ACBrComum. Clique em OK para finalizar;
    4. Na IDE do Delphi, clique em File - Close All;
    5. Abra o arquivo ACBr_NFe_OpenSSL.dpk, clique em compile, depois clique em Install.

    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 seguintes comandos: regsvr32 capicom.dll /s e regsvr32 msxml5.dll /s
    3. Adicione ao Library Path do Delphi as pastas ACBr\ACBrNFe, ACBr\ACBrNFe\win32api e ACBr\ACBrComum;
    4. Na IDE do Delphi clique em 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 ACBr\ACBrNFe\win32api e ACBr\ACBrComum. Clique em OK para finalizar;
    5. Na IDE do Delphi, clique em File - Close All;
    6. Abra o arquivo ACBr_NFe_CAPICOM.dpk, clique em compile e depois em Install.

    Conhecendo as propriedades do componente

    Agora que já baixamos e instalamos o componente, vamos conhecer as principais funções do componente. Para testar as funcionalidades do componente é necessário ter um certificado válido disponível.

    Primeiro vamos conhecer as propriedades do componente, mostradas na Figura 1.

    Propriedades do componente
    Figura 1. Propriedades do componente
    • NumeroSerie: Número de Série do Certificado Digital. Para descobrir o número de série do certificado, abra o Internet Explorer, clique no menu FerramentasOpções da Internet. Na janela que irá se abrir, clique na aba Conteúdo e no botão Certificados. Dê um duplo clique no certificado, clique na aba Detalhes e selecione o campo Número de Série. Copie o valor deste campo para o bloco de notas, retire os espaços e mude todas as letras para maiúscula. Exemplo: ?5a c4 aa 85 39 b3 fc 85 = 5AC4AA8539B3FC85 – este valor deverá ser colocado na propriedade NumeroSerie. Na versão OpenSSL não existe esta propriedade. Para substituí-la, existem duas propriedades com o nome de Certificado, que deverá ser informado o caminho do arquivo .pfx e a propriedade Senha, que é a senha utilizada para proteger o arquivo .pfx;
    • DANFE: Propriedade para configurar a forma de impressão do DANFE, podendo ser Retrato ou Paisagem;
    • FormaEmissao: Forma de emissão do XML, podendo ser Normal on-line, Contingência SCAN ou Contingência off-line. Atualmente o componente está apto apenas para a forma Normal on-line, mas em breve serão disponibilizadas as outras formas;
    • LogoMarca: Caminho para o arquivo com a Logo Marca que será impressa no DANFE. O arquivo deverá ser no formato BMP;
    • PathSalvar: Caso a propriedade Salvar esteja com o valor True, os arquivos gerados e recebidos pelo componente serão salvos na pasta indicada nesta propriedade;
    • Salvar: Propriedade booleana que indica ao componente se os arquivos gerados e recebidos deverão ser salvos;
    • Ambiente: Ambiente que os arquivos serão enviados, podendo ser Teste, que indica o ambiente de homologação, e Producao, que indica o ambiente de produção;
    • UF: Estado ao que o emissor da NF-e está ligado;
    • Visualizar­: Propriedade booleana que indica se o componente deverá exibir uma mensagem com as respostas recebidas do WebService. Útil no desenvolvimento para debugar sua aplicação;

    Iniciando uma aplicação de teste

    Agora que já conhecemos todas as propriedades do componente, vamos iniciar uma aplicação para entender as funcionalidades do componente. Abra a IDE do Delphi e inicie uma nova aplicação, clique no formulário que será criado e modifique as propriedades Name para frmACBrNFe e Caption para Teste das funcionalidades do ACBrNFe, adicione ao form um componente ACBrNFe que está disponível na aba ACBr.

    Clique no componente ACBrNFe1 e modifique as propriedades NumeroSerie colocando o número de série do certificado e UF para o estado que você deseja testar, verifique se a propriedade Ambiente está com o valor Teste, adicione um componente Memo e altere a propriedade Name para memoResposta, clique no botão elíptico da propriedade Lines e apague todo o conteúdo da janela que será aberta. Por último, adicione sete componentes do tipo TButton, modifique as propriedades Name e Caption conforme mostra a Tabela 1.

    Name Caption
    btnStatus Status Serviço
    btnCriarEnviar Criar e Enviar NF-e
    btnConsultar Consultar NF-e
    btnCancelar Cancelar NF-e
    btnInutilizar Inutilizar Numeração
    btnValidar Validar XML
    btnImprimir Imprimir NF-e
    Tabela 1. Propriedades dos botões

    Adicione à cláusula uses do seu formulário a unit ACBrNFeTypes para que possamos usar alguns tipos específicos do componente na criação de uma NF-e. Ao terminar as alterações, ajuste seu Form para ficar com a aparência semelhante à Figura 2.

    Formulário principal
    Figura 2. Formulário principal

    Salve o projeto em uma pasta de sua preferência e copie as pastas Schemas e Report que se encontram dentro da pasta ACBrNFe\Demo para dentro da pasta do seu projeto. Estas pastas deverão ser distribuídas junto com sua aplicação, pois contém o DANFE e os arquivos XSD fornecidos pelo projeto NF-e usados para validar seu arquivo antes de enviá-lo ao WebService.

    Um arquivo contendo as definições na linguagem XML Schema é chamado de XSD (XML Schema Definition), este descreve a estrutura de um documento. XML Schema é uma linguagem baseada no formato XML para definição de regras de validação ("esquemas") em documentos no formato XML. Foi a primeira linguagem de esquema para XML a obter o status de recomendação por parte do W3C.

    Consultar status do Serviço da NF-e

    Após os ajustes iniciais vamos começar a testar as funcionalidades do componente. Selecione o botão btnStatus e no evento OnClick adicione o código mostrado na Listagem 1.

    
    ACBrNFe1.WebServices.StatusServico.Executar;
    memoResposta.Lines.Text := ACBrNFe1.WebServices.StatusServico.RetWS;
    ShowMessage(ACBrNFe1.WebServices.StatusServico.Msg);
    
    Listagem 1. Status do Serviço

    Como podemos ver na Listagem 1 o componente memoResposta será usado apenas para mostrar o XML de retorno do WebService, a Linha 3 mostrará o resultado da consulta. Ao executar o programa e clicar no botão Status Serviço obteremos o resultado mostrado na Figura 3.

    Resultado ao clicar no botão Status Serviço
    Figura 3. Resultado ao clicar no botão Status Serviço

    Criar e Enviar uma NF-e

    Para criar uma NF-e e enviá-la, selecione o botão btnCriarEnviar e no evento OnClick adicione o código mostrado na Listagem 2;.

    
      ACBrNFe1.NotasFiscais.Clear;
    
      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                        := '000000000000';
         Emitente.Nome.RazaoSocial          := 'RAZAO SOCIAL LTDA EPP';
         Emitente.Nome.Fantasia             := 'NOME FANTASIA';
         Emitente.Endereco.Fone             := '1532599600';
         Emitente.Endereco.CEP              := '18270000';
         Emitente.Endereco.Logradouro       := 'Rua Onze de Agosto';
         Emitente.Endereco.Numero           := '1000';
         Emitente.Endereco.Complemento      := '';
         Emitente.Endereco.Bairro           := 'Centro';
         Emitente.Endereco.Cidade.Codigo    := 3554003;
         Emitente.Endereco.Cidade.Descricao := 'Tatuí';
         Emitente.Endereco.UF               := 'SP';
    
         Destinatario.CNPJCPF                   := '00000000000000';
         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     := 'CEBOLA DESIDRATADA';
        Quantidade    := 100;
        Unidade       := 'KG';
        ValorTotal    := 1000;
        ValorUnitario := 10;
        
      with Tributos do
      begin
        with ICMS do
        begin
          CST := '00';
          ICMS00.Aliquota  := 18;
          ICMS00.Valor     := 180;
          ICMS00.ValorBase := 1000;
        end;
    
      with IPI do
      begin
        CST := '50';
        FSituacaoTributaria := '50';
        ClasseEnquadramento := '0';
        CodigoSeloIPI       := '0';
        QuantidadeSelos     := 1;
        CodigoEnquadramento := '0';
        ValorUnidade        := 5;
        CNPJProdutor        := '00000000000000';;
        ValorBase           := 1000;
        Aliquota            := 5;
        Valor               := 50;
    
        end;
      end;
    end;
    
      with DadosProdutos.Add do
      begin
        CFOP          := 5101;
        Codigo        := '68';
        Descricao     := 'ALHO';
        Quantidade    := 100;
        Unidade       := 'KG';
        ValorTotal    := 1000;
        ValorUnitario := 10;
    
      with Tributos do
      begin
        with ICMS do
          begin
            CST              := '00';
            ICMS00.Aliquota  := 18;
            ICMS00.Valor     := 180;
            ICMS00.ValorBase := 1000;
          end;
        end;
      end;
    
      with DadosProdutos.Add do
      begin
      CFOP          := 5101;
      Codigo        := '69';
      Descricao     := 'SAL';
      Quantidade    := 100;
      Unidade       := 'KG';
      ValorTotal    := 1000;
      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     := 3000;
      ValoresTotais.ValorICMS    := 540;
      ValoresTotais.ValorNota    := 3000;
      ValoresTotais.ValorProduto := 3000;
    end;
    
      ACBrNFe1.Enviar(1);
      memoResposta.Lines.Text := ACBrNFe1.WebServices.Retorno.RetWS;
    
    Listagem 2. Criar e Enviar uma NF-e

    A Listagem 2 mostra como criar uma NF-e e enviá-la. A Linha 01 limpa as notas que possam estar na memória do componente. A Linha 03 adiciona uma nota para ser enviada, no caso de envio de notas em lote, o comando usado na Linha 03 poderá ser chamada diversas vezes, lembrando que o limite para envio é de 50 notas ou 500Kb. Os demais campos pelo próprio nome podemos identificar seu uso, apenas o campo Identificacao.Codigo que é utilizado na Linha 6 merece uma observação.

    Veja o que é falado sobre este campo no Manual de Integração: 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 da NF-e. Então este código não deve ser igual o número da NF-e para evitar que outras pessoas além de quem criou e quem recebeu a NF-e consultem seu conteúdo no site da NF-e.

    O comando utilizado na Linha 125 irá gerar, assinar, validar, transmitir, consultar se foi autorizado o uso da NF-e e em seguida imprimir o DANFE das NF-es autorizadas. O parâmetro 1 usado na Linha 125 se refere ao número do lote, que é um número seqüencial auto-incremental, de controle correspondente ao identificador único do lote enviado. A responsabilidade de gerar e controlar esse número é exclusiva do contribuinte.

    Opcionalmente, você pode executar estes comandos separadamente, trocando o comando da Linha 125 pelos comandos mostrados na Listagem 3. Declare no início desta função uma variável de nome i e tipo integer.

    
      ACBrNFe1.NotasFiscais.GerarNFe;
      ACBrNFe1.NotasFiscais.Assinar;
      ACBrNFe1.NotasFiscais.Valida;
    
      ACBrNFe1.WebServices.Envia(ALote);
    
      for i:= 0 to ACBrNFe1.NotasFiscais.Count-1 do
        begin
          if ACBrNFe1.NotasFiscais.Items[i].XML.Confirmada then
            ACBrNFe1.NotasFiscais.Items[i].XML.Imprimir;
      end;
    
    
    Listagem 3. Enviar NF-e com comandos separados

    Além de salvar o XML da NF-e, lembre-se de salvar ao menos a chave da NF-e, pois com ela que iremos executar as opções de consulta e cancelamento. Para obter a chave da NF-e acesse a propriedade ACBrNFe1.NotasFiscais.Items[i].XML.NFeChave onde i se refere ao número da NF-e dentro do lote enviado.

    O serviço de recepção de NF-e é do tipo assíncrono, ou seja, a resposta não é imediata. Ao enviar um lote de NF-e, o WebService retorna um número de recibo informando que o Lote foi recebido com sucesso. Com este número é possível consultar o Status do Lote que pode retornar que ainda está em processamento ou o status da nota dizendo se foi ou não autorizada o uso ou se existe algum erro na mesma. O componente ACBrNFe, internamente ao enviar o lote já executa a consulta ao status do lote fazendo com que o serviço de envio pareça ser síncrono.

    Consultar Status de uma NF-e

    Após enviar uma NF-e, podemos consultar o status de uma NF-e de dois modos pelo ACBrNFe. Do primeiro modo, podemos usar apenas a chave da NF-e, que é gerada no envio da nota, ou carregar o arquivo XML da NF-e que foi enviada. Para o primeiro modo selecione o botão btnConsultar e no evento OnClick adicione o código mostrado na Listagem 4.

    
      var
        ChaveNFe : String;
      begin
        if not(InputQuery('Consultar NF-e', 'Chave da NF-e', ChaveNFe)) then
        exit;
    
      ACBrNFe1.WebServices.Consulta.NFeChave := ChaveNFe;
      ACBrNFe1.WebServices.Consulta.Executar;
      memoResposta.Lines.Text := ACBrNFe1.WebServices.Consulta.RetWS;
      end;
    
    Listagem 4. Consultar NF-e com a chave de acesso

    É muito simples entendermos o código. Basta observar que estamos invocando um InputQuery para solicitar a Chave NF-e e em seguida passamos a informação ao Web Services e imprimimos o resultado em um Memo.

    Para o segundo modo, adicione um componente OpenDialog da aba Dialogs e no evento OnClick do botão btnConsultar adicione o código mostrado na Listagem 5. Nesse caso estamos solicitando um arquivo XML para fazer a consulta. O resultado também é jogado no Memo.

    
      OpenDialog1.Title := 'Selecione a NFE';
      OpenDialog1.DefaultExt := '*-nfe.XML';
      OpenDialog1.Filter := 'Arquivos NFE (*-nfe.XML)|*-nfe.XML|Arquivos XML
        (*.XML)|*.XML|Todos os Arquivos (*.*)|*.*';
      OpenDialog1.InitialDir := ACBrNFe1.Configuracoes.Geral.PathSalvar;
      if OpenDialog1.Execute then
      begin
        ACBrNFe1.NotasFiscais.Clear;
        ACBrNFe1.NotasFiscais.Add.XML.LoadFromFile(OpenDialog1.FileName);
        ACBrNFe1.Consultar;
        memoResposta.Lines.Text := ACBrNFe1.WebServices.Consulta.RetWS;
      end;
    
    Listagem 5. Consultar NF-e carregando o arquivo XML

    Cancelar uma NF-e

    Caso exista algum erro na NF-e ou por algum motivo o cliente desista da compra e a mercadoria ainda não tenha saído da empresa é possível cancelar a NF-e. Atualmente é possível efetuar o cancelamento de uma NF-e até 7 dias após a autorização do seu uso. Para cancelar uma NF-e é preciso a chave de acesso da NF-e e o número do Protocolo de Autorização.

    Caso você não tenha gravado o número do Protocolo de Autorização é possível obtê-lo utilizando o método mostrado na Listagem 4 e acessar a propriedade ACBrNFe1.WebServices.Consulta.Protocolo. Para testar a funcionalidade de cancelamento do componente também temos duas opções. Podemos informar a chave de acesso da NF-e, o número do protocolo de autorização e a justificativa para cancelamento ou carregar o arquivo de uma NF-e e o componente irá consultar a NF-e para obter o número do protocolo para efetuar o cancelamento ou. Veremos o primeiro modo na Listagem 6 e o segundo na Listagem 7. Atenção, o campo justificativa deve conter no mínimo 15 caracteres e não pode conter acentos ou caracteres especiais.

    
      var
        ChaveNFe, Protocolo, Justificativa : String;
      begin
        if not(InputQuery('Cancelar NF-e', 'Chave da NF-e', ChaveNFe)) then
          exit;
        if not(InputQuery('Cancelar NF-e', 'Número do Protocolo', Protocolo)) then
          exit;
        if not(InputQuery('Cancelar NF-e', 'Justificativa', Justificativa)) then
          exit;
    
        ACBrNFe1.WebServices.Cancelamento.NFeChave      := ChaveNFe;
        ACBrNFe1.WebServices.Cancelamento.Protocolo     := Protocolo;
        ACBrNFe1.WebServices.Cancelamento.Justificativa := Justificativa;
        ACBrNFe1.WebServices.Cancelamento.Executar;
        memoResposta.Lines.Text := ACBrNFe1.WebServices. Cancelamento.RetWS;
    
      end;
    
    Listagem 6. Cancelar NF-e com chave de acesso e protocolo de autorização
    
      var
        Justificativa : String;
      begin
        OpenDialog1.Title         := 'Selecione a NFE';
        OpenDialog1.DefaultExt    := '*-nfe.XML';
        OpenDialog1.Filter        := 'Arquivos NFE (*-nfe.XML)|*
           -nfe.XML|Arquivos XML (*.XML)|*.XML|Todos os Arquivos (*.*)|*.*';
        OpenDialog1.InitialDir := ACBrNFe1.Configuracoes.Geral.PathSalvar;
        if OpenDialog1.Execute then
        begin
          ACBrNFe1.NotasFiscais.Clear;
          ACBrNFe1.NotasFiscais.Add.XML.LoadFromFile(OpenDialog1.FileName);
          if not(InputQuery('Cancelar NF-e', 'Justificativa', Justificativa)) then
            exit;
          ACBrNFe1.Cancelamento(Justificativa);
          memoResposta.Lines.Text := ACBrNFe1.WebServices.Cancelamento.RetWS;
          end;
        end;
    
    Listagem 7. Cancelar NF-e carregando o arquivo XML

    O cancelamento de NF-e é aceito quando o CStat de retorno está com o valor 101. A função de cancelamento retorna True quando o cancelamento é homologado em caso contrário é criado um exception mostrando a mensagem retornada pelo WebService.

    Inutilizar Numeração

    O serviço de inutilização de numeração deve ser usado quando a sequência numérica da NF-e for quebrada. Por exemplo: se a última nota emitida foi a de número 112 e por algum motivo a próxima nota foi a de número 120, deverá ser inutilizada a numeração de 113 até 119. Para inutilizar uma faixa de numeração, selecione o botão btnInutilizar e no evento OnClick adicione o código mostrado na Listagem 8.

    O que fazemos em toda a sequência é solicitar ao usuário alguns dados básicos para a inutilização das notas. Pedimos: CNPJ do Emitente, Ano, Modelo, Serie, Número Inicial, Número Final e Justificativa. Por fim enviamos as informações ao Web Services e executamos usando o método Inutiliza. E claro atualizamos o nosso memo com a resposta.

    
      var
        CNPJ, Modelo, Serie, Ano, NumeroInicial, NumeroFinal, Justificativa : String;
      begin
        if not(InputQuery('Inutilizar Numeração', 'CNPJ do Emitente',CNPJ)) then
          exit;
        if not(InputQuery('Inutilizar Numeração', 'Ano',    Ano)) then
          exit;
        if not(InputQuery('Inutilizar Numeração', 'Modelo', Modelo)) then
          exit;
        if not(InputQuery('Inutilizar Numeração', 'Serie',  Serie)) then
          exit;
        if not(InputQuery('Inutilizar Numeração', 'Número Inicial', NumeroInicial)) then
          exit;
        if not(InputQuery('Inutilizar Numeração', 'Número Final', NumeroFinal)) then
          exit;
        if not(InputQuery('Inutilizar Numeração', 'Justificativa', Justificativa)) then
          exit;
    
        ACBrNFe1.WebServices.Inutiliza(CNPJ, Justificativa, StrToInt(Ano),
          StrToInt(Modelo), StrToInt(Serie), StrToInt(NumeroInicial),
          StrToInt(NumeroFinal));
        memoResposta.Lines.Text :=  UTF8Encode(ACBrNFe1.WebServices.Inutilizacao.RetWS);
      end;
    
    Listagem 8. Inutilizar faixa de numeração da NF-e

    Assim como no cancelamento, a justificativa deve conter no mínimo 15 caracteres, não pode conter acentos e caracteres especiais. O único modelo disponível atualmente é 55 e o ano deve ser informado apenas com 2 caracteres. Caso esteja cancelando apenas um número, informe no número inicial e número final o mesmo valor.

    Validar NF-e

    A validação feita pelo componente é realizada com base nos arquivos de Schemas fornecido pelo governo. Mesmo um arquivo sendo validado pelo componente, ao enviá-lo para o WebService em alguns casos é retornado a mensagem de Falha no Schema XML, este erro geralmente é causado por preenchimento incorreto de algum campo, pois a validação feita pelo componente apenas verifica se o conteúdo do arquivo está de acordo com o tipo de campo, por exemplo, o componente verifica se o campo numérico esta preenchido apenas com números, se está dentro do tamanho mínimo e máximo aceito pelo campo e se contém todos os campos exigidos.

    Ao enviar para o WebService outras validações são feitas e com esta mensagem genérica de erro fica difícil descobrir o que está errado. Caso receba esta mensagem, verifique se os valores monetários estão corretos, se a CFOP que está utilizando realmente existe e alguns campos dependem de tabelas divulgadas pelo governo, então verifique se o campo está preenchido de acordo com estas tabelas.

    Para validar uma NF-e, também temos dois métodos. Após gerar uma NF-e pelo componente usando os comandos mostrados na Listagem 2, é possível usar o método ACBrNFe1.NotasFiscais.Valida ou carregando um arquivo XML. Para testar esta funcionalidade, selecione o botão btnValidar e no evento OnClick adicione o código mostrado na Listagem 9. Perceba que não há segredos, apenas limpamos as Notas Fiscais e carregamos um arquivo XML assim que o usuário o seleciona na caixa de diálogo. Em seguida Assinamos e Validamos usando os métodos correspondetes.

    
      OpenDialog1.Title      := 'Selecione a NFE';
      OpenDialog1.DefaultExt := '*-nfe.XML';
      OpenDialog1.Filter     := 'Arquivos NFE (*-nfe.XML)|*-nfe.XML|Arquivos XML
        (*.XML)|*.XML|Todos os Arquivos (*.*)|*.*';
      OpenDialog1.InitialDir := ACBrNFe1.Configuracoes.Geral.PathSalvar;
      if OpenDialog1.Execute then
      begin
        ACBrNFe1.NotasFiscais.Clear;
        ACBrNFe1.NotasFiscais.Add.XML.LoadFromFile(OpenDialog1.FileName);
        ACBrNFe1.NotasFiscais.Assinar;
        ACBrNFe1.NotasFiscais.Valida;
        ShowMessage('Nota Fiscal Eletrônica Valida');
      end;
    
    Listagem 9. Validar um NF-e carregando um arquivo XML

    A procedure ACBrNFe1.NotasFiscais.Valida irá gerar um exception quando encontrar algum erro, caso contrário nenhuma mensagem será exibida.

    Imprimir DANFE

    Ao enviar uma NF-e com a função ACBrNFe1.Enviar, por padrão o componente já imprime automaticamente, mas podemos usar os comandos separadamente ou passar para a função Enviar além do número do lote um segundo parâmetro Imprimir informando False para que a impressão não seja feita automaticamente. Caso o DANFE não seja impresso no momento do envio, ou seja preciso imprimir outra cópia iremos utilizar o botão btnImprimir. Selecione o botão btnImprimir e no evento OnClick adicione o código mostrado na Listagem 10.

    
      OpenDialog1.Title := 'Selecione a NFE';
      OpenDialog1.DefaultExt := '*-nfe.XML';
      OpenDialog1.Filter := 'Arquivos NFE (*-nfe.XML)|*-nfe.XML|Arquivos XML
        (*.XML)|*.XML|Todos os Arquivos (*.*)|*.*';
      OpenDialog1.InitialDir := ACBrNFe1.Configuracoes.Geral.PathSalvar;
      if OpenDialog1.Execute then
      begin
        ACBrNFe1.NotasFiscais.Clear;
        ACBrNFe1.NotasFiscais.Add.XML.LoadFromFile(OpenDialog1.FileName);
        ACBrNFe1.NotasFiscais.Imprimir;
      end;
    
    Listagem 10. Impressão do DANFE

    Simples, apenas chamamos o método Imprimir(). Além da impressão em papel o ACBrNFe oferece a opção de gerar o DANFE em PDF para que possa ser enviado por e-mail para o destinatário. Para gerar o DANFE em PDF, adicione um Button abaixo do botão btnImprimir e mude as propriedades Name para btnGerarPDF e Caption para Gerar PDF NF-e, no evento OnClick deste componente adicione o código mostrado na Listagem 11. Outra vez muito simples, pois existe um método específico para geração do PDF, o método: ImprimirPDF().

    
      OpenDialog1.Title      := 'Selecione a NFE';
      OpenDialog1.DefaultExt := '*-nfe.XML';
      OpenDialog1.Filter     := 'Arquivos NFE (*-nfe.XML)|*-nfe.XML|Arquivos XML
        (*.XML)|*.XML|Todos os Arquivos (*.*)|*.*';
      OpenDialog1.InitialDir := ACBrNFe1.Configuracoes.Geral.PathSalvar;
      if OpenDialog1.Execute then
      begin
        ACBrNFe1.NotasFiscais.Clear;
        ACBrNFe1.NotasFiscais.Add.XML.LoadFromFile(OpenDialog1.FileName);
        ACBrNFe1.NotasFiscais.ImprimirPDF;
        ShowMessage('Arquivo criado
          em:'+ExtractFileDir(application.ExeName)+'\'+
          ACBrNFe1.NotasFiscais.Items[0].XML.NFe.InfNFe.Id+'.pdf')
      end;
    
    Listagem 11. Gerar DANFE em PDF

    O arquivo será criado na pasta do programa com o nome NFe seguido da chave de acesso da NF-e.

    Conclusão

    Como podemos ver a adaptação do sistema para emissão de NF-e com o uso do ACBrNFe tornar-se uma tarefa relativamente simples. As maiores dúvidas na implementação da NF-e em seu sistema será com o preenchimento de alguns campos, para diminuir essas dúvidas, leia com atenção o Manual de Integração disponibilizado no portal da NF-e e mantenha contato com um contador, assim, o processo se tornará um pouco mais fácil.

    Como principal desenvolvedor do componente ACBrNFe, recebo alguns emails perguntando se o componente é estável ou se alguém já usa em produção, posso dizer que o componente é estável, alguns clientes da empresa que trabalho já utilizam em produção e diversos usuários de diversos estados já utilizam o componente com sucesso. E por se tratar de um projeto com código aberto, caso você encontre algum problema, você pode corrigir e enviar sua colaboração para que o projeto se torne cada vez melhor.

    Para mais informações sobre o Projeto ACBr conheça o site do projeto. Caso tenha alguma sugestão para melhora dos componentes do ACBr ou a correção de algum bug utilize o Fórum.


    Revista Clube Delphi Edição 108

    • Revista Clube Delphi Edição 108:
      Confira nessa edição da ClubeDelphi: Nota fiscal eletrônica - conheça o componente ACBrNFe e desenvolva facilmente a NF-e.

    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.