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.
Curso: O que é NF-e e NFC-e?
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.
Curso: O que é Certificado Digital?
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.
Versão OpenSSL:
- 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;
- Adicione ao Library Path do Delphi as pastas ACBr\ACBrNFe e ACBr\ACBrComum;
- 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;
- Na IDE do Delphi, clique em File - Close All;
- Abra o arquivo ACBr_NFe_OpenSSL.dpk, clique em compile, depois clique em Install.
Versão CAPICOM:
- Copie as DLLs da pasta ACBr\ACBrNFe\DLLs\Capicom (capicom.dll, msxml5.dll e msxml5r.dll) para a pasta Windows\System32;
- Vá ao botão Iniciar do Windows - Executar e execute os seguintes comandos: regsvr32 capicom.dll /s e regsvr32 msxml5.dll /s
- Adicione ao Library Path do Delphi as pastas ACBr\ACBrNFe, ACBr\ACBrNFe\win32api e ACBr\ACBrComum;
- 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;
- Na IDE do Delphi, clique em File - Close All;
- 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.
- 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 Ferramentas – Opçõ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 |
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.
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.
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);
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.
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;
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;
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.
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;
É 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;
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;
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;
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;
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;
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;
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;
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
- :
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.