Para utilizar o Componente em seu software, basta instanciá-lo em seu projeto, implementar chamadas para cada um dos métodos e configurá-los de acordo com sua necessidade.
Neste artigo você terá todas as informações para conseguir fazer o download da nova versão do componente e implementar todos os novos métodos para emitir e imprimir uma nota fiscal eletrônica de forma absurdamente simples seguindo os seguintes passos.
Instalar Componente NF-e
Após aprovação do pedido de adesão, em até 24 horas úteis, nossa equipe financeira irá realizar o faturamento e disponibilizar o Componente NF-e para download na . Você pode acessar a com os dados de acesso que você preencheu no formulário de registro.
Com o Componente já disponível, na aba lateral , clique no botão Baixar. Caso o download não inicie, .
Existem dois instaladores disponíveis para download na Central do Cliente: O Setup NFe Full e o Setup NFe Dependencies. O primeiro deve ser instalado no ambiente de desenvolvimento e o segundo no ambiente onde o sistema for ser executado.
No ambiente de desenvolvimento
No ambiente de desenvolvimento, nós devemos instalar a versão Full, pois ela é a biblioteca completa, com todos os métodos e arquivos que o componente possui. Para instalá-la, basta executar o instalador e seguir as instruções na tela.
No ambiente do cliente
No ambiente onde o sistema for ser executado, devemos instalar a versão Dependencies, que é a versão Full reduzida, com apenas as DLLs necessárias para o componente funcionar. Para instalá-la, existem algumas opções: é possível simplesmente , como na versão Full, , ou .
Além das DLLs, é necessário que o componente tenha acesso às pastas de Esquemas e Templates e aos arquivos com o endereço dos servidores. Estas pastas e arquivos são criados no diretório de instalação da versão Full (..TecnoSpeed/NFe/Arquivos). É necessário colocá-los no ambiente do cliente e configurar o diretório delas nas propriedades DiretorioEsquemas, DiretorioTemplates, ArquivoServidoresHom e ArquivoServidoresProd.
Executando o instalador
Esta é a forma padrão de instalação. Basta executar o instalador e seguir as instruções na tela.
Para evitar que o usuário precise realizar alguma interação, é possível incorporar um comando na sua aplicação ou instalador. Existem dois comandos disponíveis: Silent e VerySilent. O comando Silent irá exibir a interface de instalação, mas não permitirá que o usuário interaja com o instalador. Por outro lado, o comando VerySilent não exibirá nenhuma interface ao usuário, a instalação será executada em segundo plano.
prompt> instalador.exe /silent
prompt> Instalador.exe /verysilent
Incluindo os arquivos no próprio instalador
O instalador das dependências apenas adiciona as DLLs onde ele é instalado. Caso não desejar utilizar o instalador no cliente, é possível incorporar as DLLs ao instalador do seu próprio sistema. Basta copiar ou registrar na pasta System32, caso o sistema seja 64 bits, e na pasta SysWOW64 para a versão de 32 bits do Windows.
DLLs que devem ser registradas:
-
NFeX.dll
-
NFeDataSetX.dll
-
msxml6.dll
-
NFeGovX.ocx
-
midas.dll
-
stdvcl40.dll
DLLs que devem ser apenas copiadas:
-
ssleay32.dll
-
libeay32.dll
-
msxml6r.dll
-
spdNfeLibUNICODE.dll (necessário apenas se não utilizar Delphi)
-
spdNfeLib.dll (necessário apenas se não utilizar Delphi)
Instalação Manual
A instalação manual trata-se do usuário instalar o componente NFe através de seu arquivo binário na extensão .dpk (Delphi Package). Caso opte em instalar o componente manualmente siga as instruções abaixo:
-
Atenção! É necessário que seja instalado a versão Dependencies no ambiente de Desenvolvimento e do cliente;
-
Deverá ter em mãos o dpk do componente NFe na versão de Delphi desejada e abri-lo.
-
Incluir no search path do projeto o caminho das BPL´s e DCP´s da GOV, exemplo:
-
Após inserir os search path, deve-se compilar o projeto e o mesmo não poderá ter nenhum erro.
-
Ao compilar o projeto anteriormente, será criado um arquivo BPL e DCP do componente no diretório específico do Delphi, segue
exemplos de diretórios
:
-
C:\Users\Public\Documents\Embarcadero\Studio\17.0\Bpl;
-
C:\Users\Public\Documents\Embarcadero\Studio\17.0\Dcp;
-
Obs. Esse diretório é somente um exemplo, cada versão do Delphi tem seu respectivo diretório. Exemplo:
-
Delphi Seattle - C:\Users\Public\Documents\Embarcadero\Studio\17.0;
-
Delphi XE6 - C:\Users\Public\Documents\Embarcadero\Studio\14.0;
-
Delphi XE3 - C:\Users\Public\Documents\RAD Studio\10.0;
-
Delphi XE - C:\Users\Public\Documents\RAD Studio\8.0;
-
-
-
Será necessário copiar as BPL´s e DCP´s da GOV que são as mesmas colocadas no search path do projeto anteriormente, para o diretório específico do Delphi conforme citado alguns exemplos acima, onde são criados os arquivos BPL e DCP do componente, exemplo:
-
Após realizar esses passos, poderá finalmente instalar o seu componente NFe, conforme a imagem abaixo:
Instanciar o Componente
Após a instalação do componente, é necessário instanciar a classe no projeto para fazer as modificações necessárias em suas propriedades e também utilizar os seus métodos.
Aqui iremos te mostrar passo a passo como instanciar a classe em três das linguagens, Delphi, C# e VB6.
Delphi
No Delphi há duas formas de instanciar o componente. Você pode arrastar os ícones do componente na barra de ferramentas para dentro do seu unit ou fazê-lo de forma manual, adicionando no uses do projeto:
uses
spdNFeValidadorClientAdapter, spdNFeDataSets, spdNFeSCAN,
spdNFeDPEC, spdCLe, spdNFe;
Em seguida é necessário criar as variáveis das classes, como no exemplo a baixo.
type
TForm1 = class(TForm)
spdNFe: TspdNFe;
spdCle: TspdCle;
spdNFeDPEC: TspdNFeDPEC;
spdNFeSCAN: TspdNFeSCAN;
spdNFeDataSets: TspdNFeDataSets;
spdValidadorClientX: TspdValidadorClientX;
Independente da forma com que você trouxe as classes ao projeto, agora você deve criar o objeto e direcioná-lo a uma variável:
NFe := TspdNFe.Create(nil);
NFeCle := TspdCle.Create(nil);
NFeDPEC := TspdNFeDPEC.Create(nil);
NFeScan := TspdNFeSCAN.Create(nil);
NFeDataset := TspdNFeDataSets.Create(nil);
Validador := TspdValidadorClientX.Create(nil);
VB6
Primeiramente, declare o objeto pertencente à classe que faz interação com os servidores da Sefaz
Dim NFe As NFeX.spdNFeX
Dim NFeDataSet As NFeDataSetX.spdNFeDataSetX
Após isso, já na inicialização do Fom, instancie o objeto dentro de uma nova variável.
Set NFe = New NFeX.spdNFeX
Set NFeDataSet = New NFeDataSetX.spdNFeDataSetX
C#
No início do seu projeto, junto com as bibliotecas importadas, adicione as OCX da Tecnospeed
using NFeX;
using NFeDataSetX;
Após isso, instancie o objeto dentro de uma nova variável
spdNFeX spdNFe = new spdNFeX();
spdNFeDataSetX spdNFeDataSets = new spdNFeDataSetX();
Configurar Propriedades
Antes de utilizar os métodos e funções do componente, é necessário configurar as suas propriedades. Elas podem ser configuradas utilizando um arquivo de configuração (.ini) ou através do código fonte.
Cada propriedade indica uma configuração. Por exemplo, a propriedade "Ambiente" determina para qual servidor o Componente irá enviar a nota (o de homologação ou de produção). Estas configurações estão divididas em três tipos: as , as e as
Código Fonte
É possível preencher as propriedades através do código fonte do sistema. Basta informar os valores desejados para cada uma delas. Você encontra uma lista completa de funções e exemplos de preenchimento das propriedades na seção .
Arquivo de configuração
Também é possível preencher as propriedades através de um arquivo de configuração (.ini). Basta informar os valores desejados para cada uma delas e passar o diretório deste arquivo como parâmetro no método LoadConfig. Você encontra uma lista completa de funções e exemplos de preenchimento das propriedades na seção .
Fluxo ideal da emissão da NF-e
Existem duas formas de enviar a nota à SEFAZ: o envio síncrono e o envio assíncrono.
Assíncrona
No envio assíncrono, a SEFAZ retornará um número de recibo a ser consultado e esta consulta retornará a situação da nota. Esta é a forma que recomendamos que seja implementada. Este fluxo será abordado em mais detalhes no artigo .
Síncrona
No envio síncrono, a SEFAZ retornará direto a situação da nota. Nós não recomendamos o uso do envio síncrono, pois a SEFAZ não costuma responder de forma estável, além de este modo de envio não estar disponível em todos os estados - São Paulo, por exemplo, não aceita o envio síncrono.
Gerar arquivo de Integração
Para gerar este arquivo de integração, é necessário preencher alguns campos com os valores corretos. Para informar estes dados, é possível:
-
Gerar o arquivo de integração utilizando o ;
-
(caso o sistema já gere);
-
(caso o sistema já gere).
Utilizando o Componente DataSets ou o arquivo TX2
Para gerar o arquivo de integração utilizando Componente DataSets ou um arquivo TX2, é necessário seguir o . Este dicionário possui todos os campos disponíveis, instruções de como iniciar e concluir um arquivo e como informar os grupos que podem se repetir.
Exemplo de estrutura da geração de nota via Dataset:
DELPHI
spdNFeDataSets.Incluir;
spdNFeDataSets.Campo('versao_A02').Value := '4.00';
spdNFeDataSets.Campo('cUF_B02').value := '41';
spdNFeDataSets.Campo('cNF_B03').value := '555449';
spdNFeDataSets.Campo('natOp_B04').value := 'VENDA DE MERCADORIA ADQ. DE TERCEIRO - PF E PJ NAO CONTRIBUI';
spdNFeDataSets.Campo('mod_B06').value := '55';
spdNFeDataSets.Campo('serie_B07').value := '500';
spdNFeDataSets.Campo('nNF_B08').value := '5548173';
spdNFeDataSets.Campo('dhEMI_B09').value := FormatDateTime('YYYY-MM-DD"T"HH:MM:SS',Now)+'-03:00';
spdNFeDataSets.Campo('dhSaiEnt_B10').value := FormatDateTime('YYYY-MM-DD"T"HH:MM:SS',Now)+'-03:00';
spdNFeDataSets.Campo('tpNF_B11').value := '1';
spdNFeDataSets.Campo('IDDEST_B11A').value := '2';
spdNFeDataSets.Campo('cMunFG_B12').value := '4115200';
spdNFeDataSets.Campo('tpImp_B21').value := '1';
spdNFeDataSets.Campo('tpEmis_B22').value := '1';
spdNFeDataSets.Campo('cDV_B23').value := '0';
spdNFeDataSets.Campo('tpAmb_B24').value := '2';
spdNFeDataSets.Campo('finNFe_B25').value := '1';
spdNFeDataSets.Campo('INDFINAL_B25A').value := '1';
spdNFeDataSets.Campo('INDPRES_B25B').value := '1';
spdNFeDataSets.Campo('procEmi_B26').value := '0';
spdNFeDataSets.Campo('verProc_B27').value := 'VersaoAplicacao';
Exemplo de estrutura da geração de nota via Tx2:
Formato=tx2
INCLUIR
Id_A03=0
versao_A02=4.00
cUF_B02=41
natOp_B04=VENDA MERC.ADQ.REC.TERC
mod_B06=55
serie_B07=325
cNF_B03=1000853
nNF_B08=853
DhEmi_B09=2020-07-14T11:23:00-03:00
DhSaiEnt_B10=2020-07-14T11:23:00-03:00
tpNF_B11=1
idDest_B11a=1
cMunFG_B12=4115200
tpImp_B21=1
tpEmis_B22=1
cDV_B23=4
tpAmb_B24=2
finNFe_B25=1
indFinal_B25a=1
indPres_B25b=1
procEmi_B26=0
verProc_B27=TestesTecno
Mantendo o arquivo REC
Caso o arquivo REC já seja gerado pelo sistema, não é necessário alterar para o TX2 ou o Componente DataSets. Basta converter o arquivo REC em XML e, antes de enviar, realizar a assinatura digital deste arquivo.
Mantendo o arquivo XML
Caso o arquivo XML já seja gerado pelo sistema, não é necessário alterar para o TX2 ou o Componente DataSets. Basta manter o arquivo XML que já é gerado e, antes de enviar, realizar a assinatura digital deste arquivo.
Assinar XML
Para enviar uma nota à SEFAZ, é necessário realizar uma assinatura digital do XML. Esta assinatura é realizada utilizando um .
Obter Certificado Digital
Cada certificado possui uma identificação única, que é o que o componente utilizará para selecionar o certificado correto ao realizar a assinatura. É possível listar todos os certificados digitais utilizando o método ListarCertificados.
Este método retornará uma lista com as identificações dos certificado, tanto do modelo A1 quanto do modelo A3 (que possui um cartão físico), instalados no repositório pessoal do Windows. A identificação é uma string parecida com esta:
//Certificado inválido com proposto de exemplo
CN=TECNOSPEED S A:03234234240, OU=Certificado PJ A1, O=ICP-Brasil, C=BR, S=, L=, E=, SE=12 31 18 15 02 45 F1 3D
Informar Nome do Certificado Digital
Para selecionar o Certificado Digital que será utilizado na assinatura, basta informar o nome do certificado (esta identificação que o método ListarCertificados retornou) na propriedade NomeCertificado.
Para configurar a propriedade, é possível utilizar um arquivo de configuração (.ini) ou configurar através do código fonte. O artigo detalha o funcionamento das propriedades.
Assinar Nota
Para transmitir a NF-e, é necessário que o XML esteja assinado. Para isto, você deve utilizar o seguinte método passando como parâmetro o XML gerado pelo dataSet e obtendo como retorno o XML da NF-e Assinado pronto para ser transmitido a SEFAZ.
XMLAssinado := spdNFe.AssinarNota(XMLDataSet);
Obs: Após a Assinatura, nenhum dado do XML pode ser alterado. Caso necessária alteração, deve ser gerado um novo XML e então assinado novamenete.
Validar o XML da NF-e
Para fazer a validação é possível seguir 3 caminhos diferentes: Utilizar o validador da Tecnospeed, o validador próprio da Sefaz ou utilizar o validador dentro do próprio componente. Eles servem como auditores fiscais e implementá-los é bastante simples.
Para utilizar o validador dentro do componente, você precisa como na classe spdNFe, usar a spdValidadorClientX no form.
Configurar e utilizar o validador também é bastante simples.
Par configurar são usados os seguinte parâmetros:
spdValidadorClientX.Servidor := 'http://validadornfe.tecnospeed.com.br:8181/validadorgui/validar';
spdValidadorClientX.ModoOperacao := moCliente;
spdValidadorClientX.ExibirRegrasValidacao := True
spdValidadorClientX.CodigoProduto := 1;
spdValidadorClientX.Estagio := esProducao;
spdValidadorClientX.TipoResposta := trJSON;
spdValidadorClientX.WidthHtml := 800;
spdValidadorClientX.HeigthHtml := 500;
Obs: Essa configuração, faz com que o componente envie a Nota para ser validada no servidor da TecnoSpeed.
Caso queira configurar para validar localmente na máquina aonde a aplicação está sendo executada, a configuração fica da seguinte maneira:
spdValidadorClientX.ModoOperacao := moLocal;
string pathTempAuditor = ExtractFilePath(ParamStr(0)) + 'Templates\Auditor';
string pathEempAuditor = ExtractFilePath(ParamStr(0)) + 'Esquemas\Auditor';
string pathRempAuditor = ExtractFilePath(ParamStr(0)) + 'Templates\Auditor\Regras';
spdValidadorClientX.DiretorioEsquemas := pathTempAuditor;
spdValidadorClientX.DiretorioTemplates := pathEempAuditor;
spdValidadorClientX.DiretorioRegras := pathRempAuditor;
spdValidadorClientX.AtualizarRegrasAutomaticamente := False;
spdValidadorClientX.ExibirRegrasValidacao := True
spdValidadorClientX.CodigoProduto := 1;
spdValidadorClientX.Estagio := esProducao;
spdValidadorClientX.TipoResposta := trJSON;
spdValidadorClientX.WidthHtml := 800;
spdValidadorClientX.HeigthHtml := 500;
Para fazer a validação é simpes, basta usar o seguinte código:
retValidacao := spdValidadorClientX.ValidarXml(xmlAssinado, '|');
spdValidadorClientX.ShowHtml(retValidacao);
O método de validação, retorna um JSON ou um Texto:
Exemplo de retorno em JSON:
{
"notas": [
{
"ID": "Nota NFe41170108187168000160550500000670861416403141",
"erros": [
"Falha de Esquema: O elemento 'ICMS00' está incompleto. Possíveis elementos esperados: orig, CST, modBC, vBC, pICMS, vICMS'."
],
"validacao": [],
"alertas": []
}
],
"tags": [],
"helper": []
}
Exemplo de retorno em Texto:
|Nota NFe41170108187168000160550500000085021416403141
|Falha de Esquema: O elemento "ICMS00" está incompleto. Possíveis elementos esperados: orig, CST, modBC, vBC, pICMS, vICMS".|
Rejeições
Caso ocorra uma rejeição junto ao servidor da SEFAZ, é necessário corrigi-la antes de enviar novamente a nota. É possível encontrar uma explicação de como resolver a maioria das rejeições na seção da nossa documentação. Caso precise de ajuda, fale com a nossa equipe de suporte.
Enviar uma NF-e
Para enviar uma nota de forma assíncrona, é necessário utilizar o método . No envio assíncrono, a SEFAZ retornará um XML com um número de recibo. É necessário capturar este número de recibo e realizar a consulta utilizando o método .
Para fazer o envio assíncrono, basta utilizar o seguinte método passando como parâmetro o Número do Lote, o XmlAssinado e o valor boleano False, para não enviar o lote compactado.
_XMLRetEnvio := spdNFe.EnviarNF('0001', _XMLAssinado, False);
O retorno do envio, é o XML que confirma a recepção da nota pela SEFAZ ou não.
O XML tem duas informaçãos principais, o cStat e o xMotivo, que são respectivamente, o código da situação do Lote e a mensgem que traduz o código de situação.
A baixo está um exemplo de XML retorno do envio do Paraná:
<retEnviNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<tpAmb>1</tpAmb>
<verAplic>SP_NFE_PL_008i2</verAplic>
<cStat>103</cStat>
<xMotivo>Lote recebido com sucesso</xMotivo>
<cUF>35</cUF>
<dhRecbto>2017-01-23T09:34:07-02:00</dhRecbto>
<infRec>
<nRec>351003873575746</nRec>
<tMed>1</tMed>
</infRec>
</retEnviNFe>
Neste caso, foi retornado o cStat(Código de Status do lote enviado) 103, que significa que o lote foi recebido com sucesso.
Também podem ser retornados outros status, como por exemplo: 105|Lote em processamento; 215|Rejeição: Falha no schema XML entre outros.
A partir do Status da NF-e, o desenvolvedor por automatizar o software para o próximo passo.
Para capturar o cStat e fazer tal validação, disponíbilizamos a função obterNroResultado, como segue:
Para capturar um valor, basta fazer como o exemplo a baixo:
function TfrmDemoNfe.obterNroResultado(const aXML: WideString; atag,
aEndTag: Widestring): string;
var
_Posini, _Posfim : integer;
begin
Result :='';
_Posini:= Pos(aTag,aXML);
_Posfim:= Pos(aEndTag,aXML);
if (_Posini > 0) then
begin
inc(_PosIni, Length(aTag));
Result:=Copy(aXML,_Posini+1,(_PosFim-_PosIni)-1);
end;end;
Cada cStat tem um significado, você pode o compreender pelo seu xMotivo.
Onde esta é utilizada para pegar as tags pai como segue:
_XMLRetEnvio := spdNFe.EnviarNF('0001', _XMLAssinado);
_NroRecibo := obterNroResultado(_XMLRetEnvio, '<nRec','</nRec');//Traz o número do recibo
Esta mesma função obterNroResultado, é utilizada para tratar o retorno e saber, se o software continua o processo e faz a consulta do recibo e/ou da chave da nota para obter o resultado.
Como exemplo, pode-se validar da seguinte maneira:
_cStatRetEnvio := obterNroResultado(mmXML.Text, '<cStat','</cStat');
if (_cStatRetEnvio = '100') or (_cStatRetEnvio = '103') or (_cStatRetEnvio = '104') then
Imprimir uma NF-e
O DANFE pode ser impresso na impressora ou salvo como um arquivo PDF. Em ambos os casos, é necessário informar o conteúdo de um XML de uma nota autorizada na SEFAZ (cStat igual a 100).
Imprimindo uma nota na impressora
Para imprimir uma nota, é necessário utilizar o método
Exportando o DANFE em PDF
Para exportar o DANFE em PDF, é necessário utilizar o método ExportarDanfe. Como parâmetro, é necessário informar o XML autorizado, o caminho para o arquivo de modelo do DANFE (extensão .rtm), e o diretório que o PDF deve ser salvo (caso seja vazio, será mostrada a tela de salvar arquivo do Windows).
Cancelar uma NF-e
A NF-e pode ser cancelada até 24 horas após a autorização. Para cancelar uma nota dela deve estar autorizada na SEFAZ (cStat igual a 100).
Para cancelar uma nota, é necessário utilizar o método . Como parâmetro, é necessário informar a chave desta NF-e, o número de protocolo de registro, uma justificativa de cancelamento, a data e hora de cancelamento, a sequência deste evento, e o fuso horário.
Imprimindo uma nota cancelada
Para imprimir uma nota que foi cancelada, é necessário utilizar o método
Comentários
0 comentário
Artigo fechado para comentários.