No último artigo da série abordamos e exemplificamos os aspectos envolvidos na assinatura de arquivos de Nota Fiscal Eletrônica (NF-e).
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
Seguindo a linha de publicações voltadas às soluções para NF-e, damos
continuidade a esta série, desta vez com foco no processo de transmissão via
WebServices dos arquivos assinados digitalmente, de onde partimos para
demonstrar de forma simples e prática como é possível transmitir, a partir da
sua aplicação, os arquivos XML gerados e assinados. Para realizar o processo de
transmissão utilizamos a assinaturaNFe32dll.dll.
Gerando uma NF-e para testes de
assinatura
Para testar a assinatura digital em uma NF-e de teste, utilizamos o aplicativo
disponibilizado no site
http://www.igara.com.br/produto.php?cod_produto=114. O aplicativo mostrado
da Figura 01 é um demo desenvolvido em Delphi, totalmente funcional que permite
a geração de NF-e a partir de informações digitadas pelo usuário em campos de
texto que seguem o layout específico vigente.
Após abrir o aplicativo, clicamos no botão “Nova NF-e” e depois no botão “Salvar
NF-e”. Por fim selecionamos o diretório onde desejamos salvar o arquivo .XML
gerado. O aplicativo sugere um nome para o arquivo gerado e este nome não deve
ser alterado, pois segue padrão de nomenclatura específico exigido com base no
conteúdo da NF-e em questão.

Figura 01:
Aplicativo em Delphi para geração de NF-e
O arquivo gerado pode ser visualizado no Internet Explorer ou em qualquer outro
browser de internet com suporte a XML, e o resultado é conforme mostrado na
Figura 02.
Neste artigo não entraremos em detalhes sobre o processo de geração da NF-e,
pois este será o tema de outros artigos que virão.

Figura 02: Arquivo .xml
de NF-e visualizado no Internet Explorer
Até o momento, o arquivo gerado não tem valor jurídico, pois ainda não foi
assinado de forma que o emissor possa certificar a validade das informações
fornecidas, bem como não há nada que garanta que este documento não foi alterado
por terceiros sem o conhecimento prévio do emitente.
Para tanto, é preciso assinar este documento. Em edições anteriores demonstramos
como utilizar o aplicativo de assinatura de NF-e disponibilizado para download
gratuito no portal oficial da NF-e em
www.nfe.fazenda.gov.br.
No entanto, neste artigo o objetivo é demonstrar como assinar digitalmente os
arquivos a partir da sua própria aplicação, e para isso utilizaremos a
assinaturaNFe32dll.dll.
WebService
WebService é uma tecnologia utilizada para facilitar a comunicação e integração
de sistemas distintos, tornando-os compatíveis. O que o WebService propõe é uma
integração compreensível, reutilizável e padronizada. Para tanto, utiliza-se,
como base de construção, o padrão XML e, para encapsulamento, o protocolo SOAP (Simple
Object Access Protocol). Seu transporte normalmente é feito via protocolo HTTP.
O WebService possibilita que dois aplicativos, independente de suas linguagens,
utilizem uma padronização para enviar e receber dados de forma transparente.
No projeto em questão, realizamos o envio de arquivos do padrão da NF-e para o
sistema servidor da Secretaria da Fazenda que está preparado para responder ao
receber um arquivo XML de requisição, formatado num padrão específico, detalhado
na documentação disponível no site oficial do Governo.
Transmissão de NFe
com uso da transmissaoNFe32dll.dll
Para demonstrar como é fácil transmitir uma NFe, utilizaremos a
transmissaoNFe32dll.dll e o aplicativo demo que acompanha a, que mesma pode ser
obtido a partir do site
http://www.igara.com.br/produto.php?cod_produto=114.
Após o download, executamos o aplicativo e clicamos no botão “1. Selecione o
arquivo XML a ser transmitido”. Um componente da classe TOpenDialog é utilizado
para apresentar ao usuário uma caixa de seleção de arquivos, onde o mesmo
indicará o arquivo .XML a ser transmitido. O código do evento OnClick do botão é
conforme mostrado a seguir.
|
procedure TForm1.Button12Click(Sender: TObject);
begin
//Diretório inicial será o diretório onde a aplicação está
executando
opendialog1.InitialDir := ExtractFileDir(application.ExeName);
//Abre caixa de seleção de arquivos
if OpenDialog1.Execute then
begin
xml_filename := OpenDialog1.FileName;
//Apresenta XML escolhido em modo browser
WebBrowser1.Navigate(xml_filename);
//Apresenta XML escolhido em modo texto
memo1.Lines.LoadFromFile(xml_filename);
end;
end; |
A Figura 03 apresenta o resultado da
execução de tal procedimento, onde após a seleção do arquivo .XML, o mesmo é
carregado em componentes da classe TMemo e TWebBrowser, conforme mostrado no
lado esquerdo da Figura 03.

Figura 03:
Aplicativo demo de transmissão de NF-e. Seleção da NF-e a ser transmitida.
Uma vez carregado o arquivo desejado, selecione o tipo de transação que será
executada com o servidor. Para cada tipo de transação disponível existe uma
opção no componente da classe TRadioGroup. Os Portais das Secretarias de Fazenda
Estaduais disponibilizam os seguintes serviços:
• Recepção de NF-e;
o Recepção de Lote;
o Consulta Processamento de Lote;
• Cancelamento de NF-e;
• Inutilização de numeração de NF-e;
• Consulta da situação atual da NF-e;
• Consulta do status do serviço.
Os serviços disponibilizados seguem a seguinte sistemática, conforme descrito na
documentação oficial de NF-e:
• Para cada serviço oferecido existe um WebService
específico. O fluxo de comunicação é sempre iniciado pelo aplicativo do
contribuinte através do envio de uma mensagem ao WebService com a solicitação do
serviço desejado.
• O WebService sempre devolve uma mensagem de resposta
confirmando o recebimento da solicitação de serviço ao aplicativo do
contribuinte na mesma conexão.
• A solicitação de serviço poderá ser atendida na mesma
conexão ou ser armazenada em filas de processamento nos serviços mais críticos
para um melhor aproveitamento dos recursos de comunicação e de processamento das
Secretarias de Fazenda Estaduais.
• Os serviços podem ser síncronos ou assíncronos em função da
forma de processamento da solicitação de serviços:
o Serviços síncronos – o
processamento da solicitação de serviço é concluído na mesma conexão, com a
devolução de uma mensagem com o resultado do processamento do serviço
solicitado;
o Serviços assíncronos – o
processamento da solicitação de serviço não é concluído na mesma conexão,
havendo a devolução de uma mensagem de resposta com um recibo que apenas
confirma o recebimento da solicitação de serviço. O aplicativo do contribuinte
deverá realizar uma nova conexão para consultar o resultado do processamento do
serviço solicitado anteriormente.
Após selecionar o serviço desejado, basta selecionar a UF para onde o arquivo
será enviado e clicar no botão “5. Transmitir XML” para dar início ao processo
de transmissão. O código executado no evento OnClick do botão é conforme segue.
O procedimento executa uma chamada a uma das funções de transmissão contidas na
dll, passando como parâmetro do tipo PChar o conteúdo do arquivo .XML carregado
anteriormente. O resultado da chamada da função, contendo o retorno da
transmissão, é atribuído a um segundo componente da classe TMemo.
|
procedure TForm1.Button1Click(Sender: TObject);
var
MyiUF, MyiTipo: Integer;
MysXML: PChar;
begin
try
//Atribue valores das variáveis q serão passadas
como parâmetro durante a transmissão
MyiUF := combobox1.ItemIndex;
MyiTipo := combobox2.ItemIndex;
MysXML := PChar(memo1.Lines.Text);
//Realiza a chamada da função da dll de acordo
com o tipo de transação escolhida
case radiogroup1.ItemIndex of
0: memo2.Lines.Text := fncNfeRecepcao
(MysXML, MyiUF, MyiTipo);
1: memo2.Lines.Text :=
fncCadConsultaCadastro(MysXML, MyiUF, MyiTipo);
2: memo2.Lines.Text :=
fncNfeCancelamento (MysXML, MyiUF, MyiTipo);
3: memo2.Lines.Text := fncNfeConsulta
(MysXML, MyiUF, MyiTipo);
4: memo2.Lines.Text :=
fncNfeInutilizacao (MysXML, MyiUF, MyiTipo);
5: memo2.Lines.Text :=
fncNfeRetRecepcao (MysXML, MyiUF, MyiTipo);
6: memo2.Lines.Text :=
fncNfeStatusServico (MysXML, MyiUF, MyiTipo);
end;
except
showmessage('ATENÇAO: Erro durante a
transmissão');
exit;
end;
MysXML := '';
showmessage('XML transmitido com sucesso. Verifique o retorno
para informações de retorno');
end; |
No momento da execução do código
apresentado, surgirá uma tela para seleção do certificado digital a ser
utilizado no processo de assinatura, conforme mostrado na Figura 04. Importante
ressaltar que nesta tela é possível verificar as informações contidas no
certificado, de forma a diferenciar os certificados entre si, para os casos de
mais um certificado disponível em uma mesma máquina.

Figura 04: Seleção
de certificado a ser utilizado no processo de assinatura.
Após selecionar o certificado desejado, clique no botão “Ok”. Surgirá então a
tela apresentada na Figura 05 a seguir. Neste momento, para finalizar o processo
e efetivamente assinar o documento é preciso fornecer a senha de registro do
certificado digital selecionado. Conforme abordado em artigo anterior, no
momento da aquisição do token, uma senha de acesso deve ser fornecida, sendo
pessoal e intransferível, onde somente através dela é possível se utilizar das
funcionalidades do certificado.

Figura 05:
Confirmação de senha para uso do certificado.
Após preencher a senha e clicar no botão “Ok”, o arquivo .XML selecionado
anteriormente será transmitido e o retorno do WebService para a transmissão do
XML será apresentado conforme demonstrado na Figura 06 a seguir.

Figura 06:
Aplicativo demo de transmissão de NF-e. Retorno da transmissão da NF-e.
Agora basta clicar no botão “7. Salvar XML de Retorno” para que o procedimento
de OnClick do botão execute a chamada a um componente da classe TSaveDialog,
utilizado para apresentar ao usuário uma caixa de seleção de arquivos, onde o
mesmo indicará o local em que arquivo .XML de retorno deve ser salvo. O código
do evento OnClick do botão é conforme mostrado a seguir:
|
procedure TForm1.Button2Click(Sender: TObject);
begin
try
//Diretório inicial será o diretório onde a
aplicação está executando
savedialog1.InitialDir := ExtractFileDir(application.ExeName);
//Concatena nome para arquivo de retorno
SaveDialog1.FileName := 'retorno_' +
combobox1.Text + '_' + ExtractFileName(xml_filename);
//Salva arquivo de retorno
if savedialog1.Execute then
begin
memo2.Lines.SaveToFile(savedialog1.filename);
end;
except
showmessage('ATENÇAO: Erro durante o salvamento
do retorno');
exit;
end;
showmessage('Arquivo de retorno salvo com sucesso');
end; |
Qual o código necessário para chamar
as funções de transmissão da dll e executar esta aplicação? Primeiramente é
preciso fazer a declaração das funções da dll conforme mostrado a seguir
|
var
Form1: TForm1;
nfe_filename: String;
implementation
{$R *.dfm}
//Declaração de Funções disponiveis na dll
Function fncNfeRecepcao(sXML: PChar; iUF: Integer; iTipo: integer): PChar;
StdCall; external 'transmissaoNFe32dll.dll';
Function fncCadConsultaCadastro(sXML: PChar; iUF: Integer; iTipo: integer):
PChar; StdCall; external 'transmissaoNFe32dll.dll';
Function fncNfeCancelamento(sXML: PChar; iUF: Integer; iTipo: integer):
PChar; StdCall; external 'transmissaoNFe32dll.dll';
Function fncNfeConsulta(sXML : PChar; iUF: Integer; iTipo: integer):
PChar; StdCall; external 'transmissaoNFe32dll.dll';
Function fncNfeInutilizacao(sXML: PChar; iUF: Integer; iTipo: integer):
PChar; StdCall; external 'transmissaoNFe32dll.dll';
Function fncNfeRetRecepcao(sXML: PChar; iUF: Integer; iTipo: integer):
PChar; StdCall; external 'transmissaoNFe32dll.dll';
Function fncNfeStatusServico(sXML: PChar; iUF: Integer; iTipo: integer):
PChar; StdCall; external 'transmissaoNFe32dll.dll'; |
Uma vez feita a declaração, é preciso
realizar uma única chamada à função de transmissão do serviço desejado. O
retorno da função conterá a resposta do WebService para o arquivo transmitido.
Para o caso de transmissão de um arquivo de Lote de Nota Fiscal Eletrônica, o
código a seguir demonstra da simplicidade da chamada realizada pelo aplicativo.
|
memo2.Lines.Text := fncNfeRecepcao(MysXML, MyiUF, MyiTipo); |
Note que não foi preciso ter nenhum
conhecimento aprofundado sobre como se dá o processo de transmissão, e dessa
forma abstrai-se completamente a camada relativa às funções necessárias e
tecnologias utilizadas. Com a chamada de uma única função, o arquivo desejado já
está transmitido!
Sobre a transmissaoNFe32dll.dll
A transmissaoNFe32dll.dll é um produto desenvolvido para facilitar e
agilizar o processo de transmissão de arquivos de Nota Fiscal Eletrônica. O
objetivo é disponibilizar uma solução simples e acessível a todos os
desenvolvedores onde, através da chamada de uma única função para cada serviço,
seja possível indicar o conteúdo a ser transmitido, abstraindo a complexidade
desta camada, que envolve conhecimentos aprofundados acerca de funções e
tecnologias de comunicação via WebService.
Sendo assim a dll contém uma função para cada serviço que recebe como parâmetro
uma variável PChar com o conteúdo a ser transmitido e retorna a resposta do
WebService. Mais simples que isso, impossível!
O uso da dll permite ao desenvolvedor abstrair completamente a camada de
transmissão do arquivo magnético, dispensando o estudo e aprofundamento teórico
relativo às ferramentas e funções complexas aplicadas no processo.
O produto é uma solução pioneira no
mercado e dá ao desenvolvedor total flexibilidade para implementar recursos de
Nota Fiscal Eletrônica em suas aplicações, adequando seus sistemas às obrigações
exigidas pelo Fisco.
Maiores informações, bem como o
download do demo de uso do produto e da versão de avaliação 100% funcional da
transmissaoNFe32dll.dll podem ser feitos pelo site
http://www.igara.com.br/produto.php?cod_produto=114
Conclusão
Com este artigo abordamos conceitos gerais sobre transmissão de arquivos de NF-e,
e vimos como é fácil emitir e transmitir tais documentos. 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 realizar de forma simples e prática a transmissão a partir da sua
aplicação, com o uso da transmissaoNFe32dll.dll. De agora em diante, transmitir
uma Nota Fiscal Eletrônica é questão apenas de chamar uma função e indicar o
conteúdo a ser transmitido, simples assim!
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
|