Instalando o Componente NF-e
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 executar o instalador, como na versão Full, executar o instalador em modo silencioso, ou incluir as DLLs no seu próprio instalador.
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.
Executando o instalador em modo silencioso
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.
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
- spdGovX2.ocx
- midas.dll
- stdvcl40.dll
- spdValidadorClientX.ocx (necessário apenas para utilizar o Validador)
- spdNotaSeguraX.ocx (necessário apenas para utilizar o Nota Segura)
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)
- Configurando as 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 propriedades gerais do componente, as propriedades de e-mail e as propriedades de impressão (DANFE).
Configurando através do 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 Propriedades do componente.
Configurando com um 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 Propriedades do componente.
- 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.
Enviando a nota de forma 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 Enviando uma nota.
Enviando a nota de forma 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.
- Como gerar o Arquivo de Integração
O DataSet do componente NF-e, é uma facilidade que o desenvolvedor recebe.
Antes de compreender o DataSet, é necessário que se compreenda a NF-e, para isso, preparamos um vídeo especíalmente para você.
Para configurar o DataSet da NF-e, são apenas duas propriedades, a versão de Schema e o Dicionário XML.
spdNFeDataSets.VersaoEsquema := pl_008i2;
spdNFeDataSets.XMLDicionario := spdNFe.DiretorioTemplates + 'Conversor\NFeDataSets.xml';
O único momento que é necessário mudar o Dicionário XML, será quando houver uma nota, onde há operação com o exterior. (Campo idDest_B11a = 3)
Será necessário setar o arquivo NFeDataSets_Exportacao.xml
Caso queira, disponíbilizamos mais dois vídeos que pode lhe auxiliar muito na compreenção e na implementação.
Assinando o XML da NF-e
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 novamnete.
Validando o XML da NF-e
A TecnoSpeed, disponibiliza um validador, que funciona como um auditor fiscal. Implementar este auditor para validar a nota, também é bastante simples.
Para utilizar este recurso, você precisa como na classe spdNFe, usar a spdValidadorClientX no form.
Configurar e utilizar o validdor 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);
A validação irá retornar uma imagem como a seguinte.
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".|
Transmitindo a NF-e para a SEFAZ
Com o componente NF-e, torena-se muito simples fazer o envio da NF-e para a SEFAZ.
Para fazer o envio, 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.
Veja aqui a Lista dos cStat | 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
Comentários
0 comentário
Por favor, entre para comentar.