Como emitir NF-e em Delphi com o componente TecnoSpeed

Introdução

Independente da versão do Delphi utilizado, é simples realizar a integração com o componente Tecnospeed. Pensando em auxiliar o Desenvolvedor, criamos este tutorial para auxiliar a implementação em seu software.

Instalando Componente

Para realizar a instalação do componente NF-e, basta fazer o download do mesmo em sua área de cliente e seguir os passos do vídeo abaixo que explica e mostra o processo de instalação.


Caso não seja cliente da TecnoSpeed ainda, você pode baixar a versão trial do componente clicando Aqui.


Referenciando e Instanciando o Componente

Após fazer a instalação do componente, é necessário configurar o cenário do seu Delphi, para o componente funcionar corretamente, a baixo segue um pequeno tutorial de como configurar o Delphi.


Configurando o spdNFe por arquivo ini

O arquivo ini, é o arquivo que contém a maioria das configurações das propriedades do componente. Estas configurações pode ser feitas via código também, conforme o próximo item.

Exemplo de Arquivo INI

									
[NFE]
UF=PR
CNPJ=08187168000160
NomeCertificado=CN=TECNOSPEED TECNOLOGIA DE INFORMACAO LTDA:08187168000160, OU=AR CERTIFICADOS PONTO COM, O=ICP-Brasil, C=BR, S=PR, L=MARINGA, E=
DiretorioEsquemas=Esquemas\
DiretorioTemplates=Templates\
ArquivoServidoresProd=nfeServidoresProd.ini
ArquivoServidoreshom=nfeServidoreshom.ini
DiretorioLog=Log\
TipoCertificado=FILE
VersaoManual=5.0a
ConexaoSegura=1
Proxy=
Senha=
Usuario=
TimeOut=60000
Repositorio=CURRENT_USER_STORE
Ambiente=1
ValidarEsquema=0
MaxSizeLoteEnvio=500
DiretorioXmlDestinatario=XmlDestinatario\
AnexarDanfePDF=1
IgnoreInvalidCertificates=1
DiretorioLogErro=LogErro\
DiretorioTemporario=C:\Documents and Settings\All Users\Dados de aplicativos\
ModoOperacao=NORMAL
SalvarLogsEmDisco=1
CaracteresRemoverAcentos=áéíóúàèìòùâêîôûäëïöüãõñçÁÉÍÓÚÀÈÌÒÙÂÊÎÔÛÄËÏÖÜÃÕÑǺª&@
DiretorioDownloads=Downloads\
PinCode=

[MAIL]
Servidor=smtp.gmail.com
EmailRemetente=testedanfe@gmail.com
EmailDestinatario=testedanfe@gmail.com
Assunto=Danfe NF-e
Mensagem=Este é o danfe emitido pelo componente da TeconSpeed.
Usuario=testedanfe@gmail.com
Senha=123teste
Autenticacao=1
Porta=587
TimeOut=30000
CCo=
CC=
ConteudoHtml=0

[DANFE]
LogotipoEmitente=
FraseContingencia=Danfe em contingência - Impresso em decorrência de problemas técnicos
FraseHomologacao=SEM VALOR FISCAL
ModeloRetrato=Templates\vm50a\Danfe\retrato.rtm
ModeloPaisagem=Templates\Vm50a\Danfe\paisagem.rtm
QtdeCopias=1
ModeloDanfeSimplificado=
LineDelimiter=|
ImprimirVolume=0
ImprimirDuplicata=1
ImprimirUnidadeTributada=1
DanfeSimplificado=0
ModeloRTMCCe=
									
								

Segue o método que se usa para carregar as configurações do INI no componente NF-e :

									
spdNFe.LoadConfig(ExtractFilePath(ParamStr(0) + 'nfeconfig.ini'));
									
								

Pode ser passado como parâmetro o caminho do arquivo ini, se passar vazio o componete procura um nfeConfig.ini na raiz do exe.

Configurando o spdNFe por fonte

Uma outra abordagem, ao invés de usar as configurações via arquivo, é usar via código.

As configurações são setadas diretamente no componente conforme as propriedades a baixo.

								
spdNFe.NomeCertificado := 'CN=TECNOSPEED TECNOLOGIA DE INFORMACAO LTDA:08187168000160, OU=AR CERTIFICADOS PONTO COM, O=ICP-Brasil, C=BR, S=PR, L=MARINGA, E=';


spdNFe.UF                       := 'PR';
spdNFe.CNPJ                     := '99999999999999';
//Propriedade que depende existenca da uses spdNFeType nas uses do projeto
spdNFe.Ambiente                 := spdNFeType.akHomologacao	  
//spdNFe.Ambiente := spdNFeType.akProducao;	  
spdNFe.NomeCertificado.Text     := 'NomeCertificado=CN=TECNOSPEED TECNOLOGIA DE INFORMACAO LTDA:08187168000160, OU=AR CERTIFICADOS PONTO COM, O=ICP-Brasil, C=BR, S=PR, L=MARINGA, E=';
spdNFe.ArquivoServidoresHom     := ExtractFilePath(ParamStr(0)) + 'nfeServidoresHom.ini';
spdNFe.ArquivoServidoresProd    := ExtractFilePath(ParamStr(0)) + 'nfeServidoresProd.ini';
spdNFe.DiretorioEsquemas        := ExtractFilePath(ParamStr(0)) + 'Esquemas\';
spdNFe.DiretorioTemplates       := ExtractFilePath(ParamStr(0)) + 'Templates\';
spdNFe.DiretorioLog             := ExtractFilePath(ParamStr(0)) + 'Log\';
spdNFe.DiretorioXmlDestinatario := ExtractFilePath(ParamStr(0)) + 'XMLDestinatario\';
edtCaminhoExportacao.Text       := ExtractFilePath(ParamStr(0)) + 'DanfPDF\';
spdNFe.TipoCertificado          := spdNFeType.ckFile;
spdNFe.VersaoManual             := vm50a;
spdNFe.DiretorioTemporario      := 'C:\Documents and Settings\All Users\Dados de aplicativos\';
spdNFe.ModoOperacao             := moNormal;      
spdNFe.ConexaoSegura            := true;
spdNFe.Timeout                  := 60000;

{ Atente-se, as propriedades spdNFe.NomeCertificado e spdNFe.CaminhoCertificado são concorrentes, ou seja, se usar uma, a outra não deve ser usada.}
{ Pode ser passado o caminho do certificado ao invés do nome do certificado, o componente se encarrega da configuração.}

spdNFe.CaminhoCertificado       := '';
spdNFe.SenhaCertificado         := '';

								
							

Para a função spdNFe.ListarCertificados basta passar um combobox para ela como parâmetro, que ela listará os nomes dos certificados.

								
spdNFe.ListarCertificados(cbbNomeCertificado.Items);
								
							
Configurando e Gerando o XML por DataSet

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

Para facilitar, disponíbilizamos um DataSet completo para você a baixo.

													
spdNFeDataSets.VersaoEsquema := pl_008i2;
spdNFeDataSets.XMLDicionario := spdNFe.DiretorioTemplates + 'Conversor\NFeDataSets.xml';

spdNFeDataSets.Incluir;
//Grupo do Cabeçalho da NFe
spdNFeDataSets.Campo('versao_A02').Value    := '3.10';
spdNFeDataSets.Campo('id_A03').Value        := '';
spdNFeDataSets.Campo('cUF_B02').Value       := '41';
spdNFeDataSets.Campo('cNF_B03').Value       := '41640314';
spdNFeDataSets.Campo('natOp_B04').Value     := 'VENDA DE MERCADORIA ADQ. DE TERCEIRO - PF E PJ NAO CONTRIBUI';
spdNFeDataSets.Campo('indPag_B05').Value    := '0';
spdNFeDataSets.Campo('mod_B06').Value       := '55';
spdNFeDataSets.Campo('serie_B07').Value     := '50';
spdNFeDataSets.Campo('nNF_B08').Value       := intToStr(Random(100000));
spdNFeDataSets.Campo('dhEmi_B09').Value     := FormatDateTime('YYYY-mm-dd"T"hh:nn:ss',now) + '-03:00';
spdNFeDataSets.Campo('dhSaiEnt_B10').Value  := FormatDateTime('YYYY-mm-dd"T"hh:nn: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       := '';
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   := '5';

//Grupo do Emitente
spdNFeDataSets.Campo('CNPJ_C02').Value     := '08187168000160';
spdNFeDataSets.Campo('xNome_C03').Value    := 'ACME LTDA';
spdNFeDataSets.Campo('xFant_C04').Value    := 'ACME';
spdNFeDataSets.Campo('xLgr_C06').Value     := 'RUA TAL';
spdNFeDataSets.Campo('nro_C07').Value      := '123';
spdNFeDataSets.Campo('xBairro_C09').Value  := 'CENTRO';
spdNFeDataSets.Campo('cMun_C10').Value     := '4115200';
spdNFeDataSets.Campo('xMun_C11').Value     := 'PORTO ALEGRE';
spdNFeDataSets.Campo('UF_C12').Value       := 'PR';
spdNFeDataSets.Campo('CEP_C13').Value      := '87500000';
spdNFeDataSets.Campo('cPais_C14').Value    := '1058';
spdNFeDataSets.Campo('xPais_C15').Value    := 'BRASIL';
spdNFeDataSets.Campo('fone_C16').Value     := '4432222222';
spdNFeDataSets.Campo('IE_C17').Value       := '9044016688';
spdNFeDataSets.Campo('IEST_C18').Value     := '';
spdNFeDataSets.Campo('CRT_C21').Value      := '3';

//Grupo do Destinatário
spdNFeDataSets.Campo('CPF_E03').Value        := '06965393149';
spdNFeDataSets.Campo('xNome_E04').Value      := 'NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL';
spdNFeDataSets.Campo('xLgr_E06').Value       := 'RUA DO CENTRO';
spdNFeDataSets.Campo('nro_E07').Value        := '897';
spdNFeDataSets.Campo('xCpl_E08').Value       := 'TESTE';
spdNFeDataSets.Campo('xBairro_E09').Value    := 'CENTRO';
spdNFeDataSets.Campo('cMun_E10').Value       := '2927408';
spdNFeDataSets.Campo('xMun_E11').Value       := 'Salvador';
spdNFeDataSets.Campo('UF_E12').Value         := 'BA';
spdNFeDataSets.Campo('CEP_E13').Value        := '87500000';
spdNFeDataSets.Campo('cPais_E14').Value      := '1058';
spdNFeDataSets.Campo('xPais_E15').Value      := 'BRASIL';
spdNFeDataSets.Campo('fone_E16').Value       := '445555555';
spdNFeDataSets.Campo('indIEDest_E16a').Value := '9';

//Item da NF-e
spdNFeDataSets.IncluirItem;
 spdNFeDataSets.Campo('nItem_H02').Value     := '1';
 spdNFeDataSets.Campo('vTotTrib_M02').Value  := '0.00';
 spdNFeDataSets.Campo('cProd_I02').Value     := '25';
 spdNFeDataSets.Campo('cEAN_I03').Value      := '7898106035513';
 spdNFeDataSets.Campo('xProd_I04').Value     := 'CETROTIDE 0,25MG 1 FA PO LIOF 0,25MG  1 SER DIL';
 spdNFeDataSets.Campo('NCM_I05').Value       := '30043929';
 spdNFeDataSets.Campo('CEST_I05c').Value     := '12345678';
 spdNFeDataSets.Campo('CFOP_I08').Value      := '6102';
 spdNFeDataSets.Campo('uCom_I09').Value      := 'CX';
 spdNFeDataSets.Campo('qCom_I10').Value      := '1.0000';
 spdNFeDataSets.Campo('vUnCom_I10a').Value   := '1000.0000';
 spdNFeDataSets.Campo('vProd_I11').Value     := '1000.00';
 spdNFeDataSets.Campo('cEANTrib_I12').Value  := '7898106035513';
 spdNFeDataSets.Campo('uTrib_I13').Value     := 'CX';
 spdNFeDataSets.Campo('qTrib_I14').Value     := '1.0000';
 spdNFeDataSets.Campo('vUnTrib_I14a').Value  := '1000.00';
 spdNFeDataSets.Campo('indTot_I17b').Value   := '1';
 spdNFeDataSets.Campo('xPed_I60').Value      := '4509916408';
 spdNFeDataSets.Campo('nItemPed_I61').Value  := '000001';
 spdNFeDataSets.Campo('infAdProd_V01').Value := 'Teste teste | Teste teste';

 spdNFeDataSets.Campo('nLote_K02').Value := '00001';
 spdNFeDataSets.Campo('qLote_K03').Value := '32154';
 spdNFeDataSets.Campo('dFab_K04').Value  := '2017-04-05';
 spdNFeDataSets.Campo('dVal_K05').Value  := '2019-04-05';
 spdNFeDataSets.Campo('vPMC_K06').Value  := '2153.12';

 spdNFeDataSets.IncluirPart('K');
 spdNFeDataSets.Campo('nLote_K02').Value := '00002';
 spdNFeDataSets.Campo('qLote_K03').Value := '32154';
 spdNFeDataSets.Campo('dFab_K04').Value  := '2017-04-05';
 spdNFeDataSets.Campo('dVal_K05').Value  := '2019-04-05';
 spdNFeDataSets.Campo('vPMC_K06').Value  := '2153.12';
 spdNFeDataSets.SalvarPart('K');

 if spdNFeDataSets.Campo('CRT_C21').Value = '3' then
 begin
 //Tributacao do ICMS Normal
 spdNFeDataSets.Campo('orig_N11').Value := '0';
 spdNFeDataSets.Campo('CST_N12').Value := '00';
 spdNFeDataSets.Campo('modBC_N13').Value := '0';
 spdNFeDataSets.Campo('vBC_N15').Value := '1000.00';
 spdNFeDataSets.Campo('pICMS_N16').Value := '7.00';
 spdNFeDataSets.Campo('vICMS_N17').Value := '70.00';
 end
 else
 begin
 //Tributacao do ICMS SimplesNacional
 spdNFeDataSets.Campo('orig_N11').Value := '0';
 spdNFeDataSets.Campo('CSOSN_N12a').Value := '103';
 end;

 //Tributacao do Pis
 spdNFeDataSets.Campo('CST_Q06').Value := '08';

 //Tributacao do Cofins
 spdNFeDataSets.Campo('CST_S06').Value := '08';

if (spdNFeDataSets.Campo('idDest_B11a').Value = '2') and (spdNFeDataSets.Campo('finNFe_B25').Value = '1') and
    (spdNFeDataSets.Campo('indFinal_B25a').Value = '1') and (spdNFeDataSets.Campo('indIEDest_E16a').Value = '9')then
    begin
    //Grupo de ICMS INTERESTADUAL
    spdNFeDataSets.Campo('vBCUFDest_NA03').Value      := '1000.00';
    spdNFeDataSets.Campo('pFCPUFDest_NA05').Value     := '2.00';
    spdNFeDataSets.Campo('pICMSUFDest_NA07').Value    := '18.00';
    spdNFeDataSets.Campo('pICMSInter_NA09').Value     := '7.00';
    spdNFeDataSets.Campo('pICMSInterPart_NA11').Value := '40.00';
    spdNFeDataSets.Campo('vFCPUFDest_NA13').Value     := '20.00';
    spdNFeDataSets.Campo('vICMSUFDest_NA15').Value    := '44.00';
    spdNFeDataSets.Campo('vICMSUFRemet_NA17').Value   := '66.00';
    end;

 spdNFeDataSets.SalvarItem;

spdNFeDataSets.Campo('vBC_W03').Value         := '1000.00';
spdNFeDataSets.Campo('vICMS_W04').Value       := '70.00';
spdNFeDataSets.Campo('vICMSDeson_W04a').Value := '0.00';

if (spdNFeDataSets.Campo('idDest_B11a').Value = '2') and (spdNFeDataSets.Campo('finNFe_B25').Value = '1') and
 (spdNFeDataSets.Campo('indFinal_B25a').Value = '1') and (spdNFeDataSets.Campo('indIEDest_E16a').Value = '9')then
 begin
  spdNFeDataSets.Campo('vFCPUFDest_W04c').Value := '20.00';
  spdNFeDataSets.Campo('vICMSUFDest_W04e').Value := '44.00';
  spdNFeDataSets.Campo('vICMSUFRemet_W04g').Value := '66.00';
 end;

spdNFeDataSets.Campo('vBCST_W05').Value       := '0.00';
spdNFeDataSets.Campo('vST_W06').Value         := '0.00';
spdNFeDataSets.Campo('vProd_W07').Value       := '1000.00';
spdNFeDataSets.Campo('vFrete_W08').Value      := '0.00';
spdNFeDataSets.Campo('vSeg_W09').Value        := '0.00';
spdNFeDataSets.Campo('vDesc_W10').Value       := '0.00';
spdNFeDataSets.Campo('vII_W11').Value         := '0.00';
spdNFeDataSets.Campo('vIPI_W12').Value        := '0.00';
spdNFeDataSets.Campo('vPIS_W13').Value        := '0.00';
spdNFeDataSets.Campo('vCOFINS_W14').Value     := '0.00';
spdNFeDataSets.Campo('vOutro_W15').Value      := '0.00';
spdNFeDataSets.Campo('vNF_W16').Value         := '1000.00';

spdNFeDataSets.Campo('modFrete_X02').Value := '9';

spdNFeDataSets.Campo('nFat_Y03').Value  := '2000';
spdNFeDataSets.Campo('vOrig_Y04').Value := '1000.00';
spdNFeDataSets.Campo('vDesc_Y05').Value := '100.00';
spdNFeDataSets.Campo('vLiq_Y06').Value  := '900.00';

spdNFeDataSets.IncluirCobranca;
 spdNFeDataSets.Campo('nDup_Y08').Value := IntToStr(1);
 spdNFeDataSets.Campo('dVenc_Y09').Value := '2017-' + '03' + '-25';
spdNFeDataSets.Campo('vDup_Y10').Value := '900.00';
spdNFeDataSets.SalvarCobranca;

spdNFeDataSets.IncluirCobranca;
  spdNFeDataSets.Campo('nDup_Y08').Value := IntToStr(2);
  spdNFeDataSets.Campo('dVenc_Y09').Value := '2017-' + '04' + '-25';
  spdNFeDataSets.Campo('vDup_Y10').Value := '900.00';
spdNFeDataSets.SalvarCobranca;

spdNFeDataSets.IncluirPart('obsFisco');
 spdNFeDataSets.Campo('xCampo_Z08').Value := '';
 spdNFeDataSets.Campo('xTexto_Z09').Value := '';
spdNFeDataSets.SalvarPart('obsFisco');

spdNFeDataSets.IncluirPart('obsFisco');
 spdNFeDataSets.Campo('xCampo_Z08').Value := '';
 spdNFeDataSets.Campo('xTexto_Z09').Value := '';
spdNFeDataSets.SalvarPart('obsFisco');

spdNFeDataSets.IncluirPart('obsFisco');
 spdNFeDataSets.Campo('xCampo_Z08').Value := '';
 spdNFeDataSets.Campo('xTexto_Z09').Value := '';
spdNFeDataSets.SalvarPart('obsFisco');

 spdNFeDataSets.Campo('infAdFisco_Z02').Value := 'OBSERVACAO TESTE DA DANFE - FISCO  OBSERVACAO TESTE DA DANFE - FISCO';
 spdNFeDataSets.Campo('infCpl_Z03').Value := 'Alíquota de ICMS reduzida de 18% para 12% conforme Decreto 6080/ 2012 - Art. 108 - Inciso 1, mantida até 31/12/215|##FECOP59.38##|Val Aprox. Tributos R$806,40 (27,16%) Fonte: IBPT';
spdNFeDataSets.Salvar;

  _XML := spdNFeDataSets.LoteNFe.GetText;
  _chaveNota := Copy(spdNFeDataSets.Campo('Id_A03').AsString,4,44);
													
												

Ainda com dúvidas quanto aos campos do ICMS e CSOSN ?

Acesse nosso Simulador

Caso queira, disponíbilizamos mais dois vídeos que pode lhe auxiliar muito na compreenção e na implementação.

Configurando o DataSet

Implementando

Assinado 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.

Para ajudar o desenvolvedor, a TecnoSpeed está incluindo uma parceria para fornecer certificado A1 aos seus clientes, tanto para diminuir os problemas com certificado A3, quanto para aumentar a credibilidade do software que já pode ir para o cliente com o Certificado, caso tenha interesse,

Validando o XML da NF-e para o Envio

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".|									
								
							

Veja como encontrar soluções para as rejeições em nossa base de conhecimento.

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
  					.
  					.
  					.
								
							

Existem situações, em que é necessário emitir a NF-e em contingência, para a NF-e são utilizadas as contingências EPEC, SVC e a impressão FS-DA.

Veja aqui o manual das Contingências

Consultando o Recibo e a chave da NF-e

Apenas com o retorno do envio, na maioria dos casos não dá para saber se a nota já tem uma situação final(Autorizada ou Rejeitada).

Para ter este discernimento, é necessário fazer a consulta do recibo, ou até mesmo a consulta da chave da nota.

O método de consulta do recibo, tem como parâmetro o número do recibo, que é obtido no retorno do envio. O retorno do método de consulta do recibo, é um XML que deve ser tratado como o de retorno do envio.

O método é descrito da seguinte maneira:

								
_XMLRetConsulta := spdNFe.ConsultarRecibo(_NroRecibo);
								
							

Esse retorno deve ser tratado para saber se o cStat é um cStat de autorização ou se não.

Se for, o fluxo pode continuar para a impressão ou envio de e-mail.

Se não for, o fluxo deve seguir para uma re-validação da nota, correção e continuação do fluxo de envio.

Para capturar o cStat do retorno da consulta, pode-se usar o seguinte código:

								
xDoc.LoadXml(xmlRetConsRecibo);
cStat = xDoc.GetElementsByTagName("cStat").Item(0).InnerText;
NumProtocolo = xDoc.GetElementsByTagName("nProt").Item(0).InnerText;
  if (cStat == "100") || (cStat == "103") || (cStat == "104"){
  					.
  					.
  					.									
								
							

Caso não tenha-se conseguido capturar o Recibo, pode-se fazer a consulta pela chave para obter o resultado da nota.

O método para a consulta da chave recebe como parâmetro a chave, e tem como retorno o XML da SEFAZ.

Exemplo:

								
xmlRetConsChave = _spdNFeX.ConsultarNF(chaveNota);
								
							

Exemplo de XML de Retorno:

								
<retConsReciNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe">
	<tpAmb>2</tpAmb>
	<verAplic>PR-v3_4_3</verAplic>
	<nRec>411110213055179</nRec>
	<cStat>104</cStat>
	<xMotivo>Lote processado</xMotivo>
	<cUF>41</cUF>
	<dhRecbto>2015-09-09T15:06:30-03:00</dhRecbto>
	<protNFe versao="3.10">
		<infProt>
			<tpAmb>2</tpAmb>
			<verAplic>PR-v3_4_3</verAplic>
			<chNFe>41150908187168000160553320000034601004640320</chNFe>
			<dhRecbto>2015-09-09T15:06:24-03:00</dhRecbto>
			<nProt>141150000926666</nProt>
			<digVal>CIcTKKXe8zGiBrmDM6wRhTbzKBI=</digVal>
			<cStat>100</cStat>
			<xMotivo>Autorizado o uso da NF-e</xMotivo>
		</infProt>
	</protNFe>
</retConsReciNFe>
								
							
Validando o Retorno e Corrigindo a NF-e

Interpretar as rejeições da NF-e, não é uma tarefa simples, percebendi isto, nós da TecnoSpeed TI temos a cultura de compartilhar o conhecimento com a comunidade.

As rejeições são catalogadas na nossa Base de Conhecimento e uma pesquisa simples no google te leva à solução do seu problema.

Mas como eu faço a correção da nota ?

Primeiro você precisa saber o que está errado e aonde está errando de acordo com a rejeição que a SEFAZ te devolve.

Para encontrar as nossas publicações, basta uma pesquisa simples no Google.

Exemplos:

Digamos que você esteja fazendo uma NF-e de venda de combustível e recebeu a seguinte rejeição: Rejeição 379: Grupo de Encerrante na NF-e (modelo 55) para CFOP diferente de venda de combustível para consumidor final [nItem:nnn]

Para encontrar a solução da sua rejeição, basta efetuar uma pesquisa no Google da seguinte maneira:


A disseminação do conhecimento dentro da organização, é peça chave para o crescimento, uma equipe de suporte que tenha conhecimento suficiente para interpretar as regras de validação dos documentos fiscais, agiliza muito o processo de solução dos problemas e dúvidas dos clientes, agregando valor ao nome da organização e economizando em tempo de suporte.

Depois de entender a regra de validação, é necessário que a correção seja feita no sistema e então deve-se gerar uma nova nota, assinar e então transmiti-la novamente à SEFAZ.

Configurando a impressão e Imprimindo

No componente NF-e, existem 5 métodos de impressão para gerar a DANFE a partir do XML autorizado: Preview, Visualização, Impressão, Exportação e Edição.

As propriedades de configuração, devem ser setadas para que os métodos funcionem corretamente.

A baixo, seguem as propriedades que devem ser setadas:

								
spdNFe.DanfeSettings.LogotipoEmitente  := ExtractFilePath(ParamStr(0))+ 'LogoEmitente\Logo.png';
spdNFe.DanfeSettings.QtdeCopias        := 1;
spdNFe.DanfeSettings.InfCplMaxCol      := 70;
spdNFe.DanfeSettings.InfCplMaxRow      := 6;
spdNFe.DanfeSettings.FraseHomologacao  := 'NF-e SEM VALOR FISCAL';
spdNFe.DanfeSettings.FraseContingencia := 'Danfe em contingência - Impresso em decorrência de problemas técnicos';
spdNFe.DanfeSettings.LineDelimiter     := '|';
spdNFe.DanfeSettings.ModeloRetrato     := ExtractFilePath(ParamStr(0))+ 'templates\vm50a\Danfe\retrato.rtm';
spdNFe.DanfeSettings.MensagemPartilhaAutomatica := True
spdNFe.DanfeSettings.ImprimirDuplicata := True;
spdNFe.DanfeSimplificado               := False;
								
							

Obs.: É interessante que o sistema possua uma parte para fazer essas configurações, visto que pode surgir a necessídade de alterá-las.

Prever

Com o componente NF-e é possível prever a DANFE antes do envio da nota.

No método prever, você completa dois parâmetros, o XML(assinado ou não) e o caminho do RTM.

								
spdNFe.PreverDanfe(_XMLAssinado,'');
								
							

Visualizando

O método de visualização, possui três parâmetros: uma string com o número do lote, o caminho do XML destinatário ou seu conteúdo e o caminho do RTM ou uma string vazia(para pegar da propriedade já definida).

								
spdNFe.VisualizarDanfe(_NumeroLote, LoadXmlDestinatario(Copy(_ChaveNota,0,44), '-nfe'), _CaminhoModeloRTM);
								
							

Imprimir

O método de impressão, possui quatro parâmetros: uma string com o número do lote, o caminho do XML destinatário ou seu conteúdo, o caminho do RTM ou uma string vazia(para pegar da propriedade já definida) e o nome da impressora(Uma string vazia para usar a impressora padrão da máquina).

								
spdNFe.ImprimirDanfe(_NumeroLote, LoadXmlDestinatario(Copy(_ChaveNota,0,44), '-nfe'), _CaminhoModeloRTM,'');
								
							

Exportar

O método de exportação, possui cinco parâmetros: uma string com o número do lote, o caminho do XML destinatário ou seu conteúdo, o caminho do RTM ou uma string vazia(para pegar da propriedade já definida), qual o Formato a ser exportado(1 - PDF; 2 - HTML) e uma string com o caminho completo, nome e extenção do arquivo.

								
//Exportar PDF
spdNFe.ExportarDanfe('00001', LoadXmlDestinatario(Copy(_ChaveNota,0,44), '-nfe'), _CaminhoModeloRTM,1,_CaminhoExportacao + _Chave + '-nfe.pdf');

//Exportar HTML
spdNFe.ExportarDanfe('00001', LoadXmlDestinatario(Copy(_ChaveNota,0,44), '-nfe'), _CaminhoModeloRTM,2,_CaminhoExportacao + _Chave + '-nfe.html');

//Exportar os XML's de uma pasta em Vários PDF's
spdNFe.ImprimirDanfeXmlDiretorio(spdNFe.DiretorioXmlDestinatario ,_CaminhoModeloRTM , ExtractFilePath(ParamStr(0)) + '\DanfPDF\'+ _ChaveNota + '-nfe.pdf');
								
							

Editar

No método editar, são esperados três parâmetros: uma string com o número do lote, o caminho do XML destinatário ou seu conteúdo e o caminho do RTM ou uma string vazia(para pegar da propriedade já definida).

								
spdNFe.EditarModeloDanfe('0001', Copy(_ChaveNota,0,44), '-nfe'), _CaminhoModeloRTM);
								
							

Nota Cancelada

Para imprimir uma nota cancelada, existem duas formas, a impressão resumida e a impressão da NF-e completa com a tarja de cancelamento.

Para imprimir(qualquer método de impressão) a nota cancelada resumida, basta passar o XML de cancelamento da nota.

								
spdNFe.ImprimirDanfe(_NumeroLote, Trim(LoadXmlDestinatario(Copy(_ChaveNota,0,44), '-nfe') + LoadXmlDestinatario(Copy(_ChaveNota,0,44), '-caneve')), _CaminhoModeloRTM,'');
								
							

Para visualizar a nota completa com a tarja de cancelamento, é necessário passar o para o método, no 2º parâmetro, o XML Destinatário autorizado concatenado com o XML de cancelamento.

								
spdNFe.VisualizarDanfe(_NumeroLote, Trim(LoadXmlDestinatario(Copy(_ChaveNota,0,44), '-nfe') + LoadXmlDestinatario(Copy(_ChaveNota,0,44), '-caneve')), _CaminhoModeloRTM,'');
								
							

Para facilitar, a função LoadXmlDestinatario é disponibilizada da seguinte forma:

								
function TfrmDemoNfe.LoadXmlDestinatario(aChaveNFe: String; aSufixo: String): WideString;
var
  _file: TStringList;
  _fileName : String;
begin
  _file := TStringList.Create;
    try
      _fileName := ExtractFilePath(ParamStr(0)) + 'XmlDestinatario\' + aChaveNFe + aSufixo + '.xml';
      if not FileExists(_fileName) then
        raise Exception.CreateFmt('Não foi possível encontrar o arquivo XML %s. Verifique se a NFe esta autorizada!', [_fileName]);
        _file.LoadFromFile(_fileName);
        Result := _file.Text;
      finally
        _file.Free;
    end;
end;
								
							
Configurando e enviando e-mail

Para enviar e-mail da nota com o componente, é necessário setar as seguintes propriedades:

						  		
spdNFe.EmailSettings.ServidorSmtp      := 'smtp.gmail.com';
spdNFe.EmailSettings.Porta             := 587;
spdNFe.EmailSettings.TimeOut           := 60000;
spdNFe.EmailSettings.ConteudoHtml      := true;
spdNFe.EmailSettings.EmailRemetente    := 'email@remetente.com.br';
spdNFe.EmailSettings.EmailDestinatario := 'email@destinatario.com.br';
spdNFe.EmailSettings.Assunto           := 'Assunto de teste';
spdNFe.EmailSettings.Mensagem          := 'Corpo do e-mail de teste';
spdNFe.EmailSettings.Usuario           := 'user@user.com.br';
spdNFe.EmailSettings.Senha             := 'password';
spdNFe.EmailSettings.Autenticacao      := true;
						  		
						  	

Para enviar e-mail da NF-e com o PDF da DANFE e o XML da NF-e ao destinatário, basta usar o seguinte método:

						  	    
spdNFe.EnviarNotaDestinatario(_ChaveNFe,'','');
						  	    
						  	

Para enviar e-mail do cancelamento da NF-e, deve-se usar o seguinte método:

						  		
.spdNFe.EnviarNotaCanceladaDestinatario(_ChaveNFe,'','',spdNFe.EmailSettings.EmailDestinatario);
						  		
						  	

Algumas configurações podem ser necessárias para fazer o envio de e-mail

Clique aqui para saber mais.

Consultando DF-e(Notas emitidas contra um CNPJ)

A Consulta DF-e tem como função disponibilizar informações de documentos fiscais eletrônicos para os seus atores (destinatário, transportador ou qualquer outro CNPJ informado no grupo 'autXML'), sejam eles pessoas físicas ou pessoas jurídicas.

Softwares que dispõem desta funcionalidade oferecem muita agilidade nos processos que devem ser realizados quanto as notas de entrada. Mesmo antes que fornecedor informe que a venda já foi realizada e a nota fiscal foi emitida, o software permite ao usuário se adiantar a consulta, ficando ciente das notas emitidas contra o CNPJ dele. Desta forma, é possível se organizar e dar entrada nos produtos automaticamente.

A consulta DF-e facilita muito o processo de manifestação do destinatário e do download da nota, visto que a manifestação é obrigatória para que se faça o download da nota fiscal válida para a SEFAZ via software.


Veja aqui, como pode ser implementada a consulta DF-e

Importando XML para DataSet

Uma facilidade maior ainda que o componente tem, é disponibilizar para o desenvolvedor de software uma forma facilitada de pegar o XML da NF-e e dar entrada nos seus produtos.

Para isto, foi desenvolvido o método ConverterXmlParaDataSet.

O mesmo é utilizado da seguinte maneira para pegar os dados da NF-e:

					
procedure TfrmDemoNFe.btnConverterParaDataSetClick(Sender: TObject);
var
  _xml : widestring;  
begin  
      
    	spdNFeDataSets := spdNFe.ConverteXmlparaDataSet(_xml, pl_008i2);
		
       //Dados da NF
        _cbcUF_B02       := spdNFeDataSets.Campo('cUF_B02').Value;
        _edtcNF_B03      := spdNFeDataSets.Campo('cNF_B03').Value;
        _edtnatOp_B04    := spdNFeDataSets.Campo('natOp_B04').Value;
        _cbindPag_B05    := spdNFeDataSets.Campo('indPag_B05').Value;
        _edtmod_B06      := spdNFeDataSets.Campo('mod_B06').Value;
        _edtserie_B07    := spdNFeDataSets.Campo('serie_B07').Value;
        _edtnNF_B08      := spdNFeDataSets.Campo('nNF_B08').Value;
        _edtdhEmi_B09    := spdNFeDataSets.Campo('dhEmi_B09').Value;
        _edtdhSaiEnt_B10 := spdNFeDataSets.Campo('dhSaiEnt_B10').Value;
        _cbtpNF_B11      := spdNFeDataSets.Campo('tpNF_B11').Value;
        _cbidDest_B11a   := spdNFeDataSets.Campo('idDest_B11a').Value;
        _edtcMunFG_B12   := spdNFeDataSets.Campo('cMunFG_B12').Value;
        _cbtpImp_B21     := spdNFeDataSets.Campo('tpImp_B21').Value;
        _cbtpEmis_B22    := spdNFeDataSets.Campo('tpEmis_B22').Value;
        _edtcDV_B23      := spdNFeDataSets.Campo('cDV_B23').Value;
        _edttpAmb_B24    := spdNFeDataSets.Campo('tpAmb_B24').Value;
        _cbfinNFe_B25    := spdNFeDataSets.Campo('finNFe_B25').Value;
        _cbindFinal_B25a := spdNFeDataSets.Campo('indFinal_B25a').Value;
        _cbindPres_B25b  := spdNFeDataSets.Campo('indPres_B25b').Value;
        _cbProcEmi_B26   := spdNFeDataSets.Campo('ProcEmi_B26').Value;
        _edtverProc_B27  := spdNFeDataSets.Campo('verProc_B27').Value;
        //Dados da NF
        //Dados Emitente
        _edtCNPJ_C02  	 := spdNFeDataSets.Campo('CNPJ_C02').Value;
        _edtxNome_C03 	 := spdNFeDataSets.Campo('xNome_C03').Value;
        _edtxFant_C04 	 := spdNFeDataSets.Campo('xFant_C04').Value;
        _edtxLgr_C06  	 := spdNFeDataSets.Campo('xLgr_C06').Value;
        _edtnro_C07   	 := spdNFeDataSets.Campo('nro_C07').Value;
        _edtxMun_C11  	 := spdNFeDataSets.Campo('xMun_C11').Value;
        _edtUF_C12    	 := spdNFeDataSets.Campo('UF_C12').Value;
        _edtCEP_C13   	 := spdNFeDataSets.Campo('CEP_C13').Value;
        _edtcPais_C14 	 := spdNFeDataSets.Campo('cPais_C14').Value;
        _edtxPais_C15 	 := spdNFeDataSets.Campo('xPais_C15').Value;
        _edtfone_C16  	 := spdNFeDataSets.Campo('fone_C16').Value;
        _edtIE_C17    	 := spdNFeDataSets.Campo('IE_C17').Value;
        _cbCRT_C21    	 := spdNFeDataSets.Campo('CRT_C21').Value;
        //Dados Emitente
        //Dados Destinatário
        _edtCNPJ_E02      := spdNFeDataSets.Campo('CNPJ_E02').Value;
        _edtCPF_E03       := spdNFeDataSets.Campo('CPF_E03').Value;
        _edtxNome_E04     := spdNFeDataSets.Campo('xNome_E04').Value;
        _edtxLgr_E06      := spdNFeDataSets.Campo('xLgr_E06').Value;
        _edtnro_E07       := spdNFeDataSets.Campo('nro_E07').Value;
        _edtxBairro_E09   := spdNFeDataSets.Campo('xBairro_E09').Value;
        _edtxMun_E11      := spdNFeDataSets.Campo('xMun_E11').Value;
        _cbUF_E12         := spdNFeDataSets.Campo('UF_E12').Value;
        _edtCEP_E13       := spdNFeDataSets.Campo('CEP_E13').Value;
        _edtcPais_E14     := spdNFeDataSets.Campo('cPais_E14').Value;
        _edtxPais_E15     := spdNFeDataSets.Campo('xPais_E15').Value;
        _edtfone_E16      := spdNFeDataSets.Campo('fone_E16').Value;
        _cbindIEDest_E16a := spdNFeDataSets.Campo('indIEDest_E16a').Value;
        _edtIE_E17        := spdNFeDataSets.Campo('IE_E17').Value;
        _edtemail_E19     := spdNFeDataSets.Campo('email_E19').Value;
        //Dados Destinatário
		
        //Itens
        spdNFeDataSets.H.First;
        while not (spdNFeDataSets.H.Eof) do
        begin
			//Conta a quantidade de itens
          _TotalnItem := StrToInt(spdNFeDataSets.Campo('nItem_H02').Value);
          spdNFeDataSets.H.Next;
        end;

        spdNFeDataSets.H.First;
        spdNFeDataSets.H.Edit;
        while not (spdNFeDataSets.H.Eof) do
        begin           
            //dados Item
            _Item := _nItem.ToString();//Número do Item
            cProd_I02    := spdNFeDataSets.Campo('cProd_I02').Value;//'cProd';
            xProd_I04    := spdNFeDataSets.Campo('xProd_I04').Value;//'xProd';
            NCM_I05      := spdNFeDataSets.Campo('NCM_I05').Value;//'NCM';
            CEST_I05c    := spdNFeDataSets.Campo('CEST_I05c').Value;//'CEST';
            CFOP_I08     := spdNFeDataSets.Campo('CFOP_I08').Value;//'CFOP';
            uCom_I09     := spdNFeDataSets.Campo('uCom_I09').Value;//'uCom';
            qCom_I10     := spdNFeDataSets.Campo('qCom_I10').Value;//'qCom';
            vUnCom_I10   := spdNFeDataSets.Campo('vUnCom_I10a').Value;//'vUnCom';
            vProd_I11    := spdNFeDataSets.Campo('vProd_I11').Value;//'vProd';
            cEANTrib_I12 := spdNFeDataSets.Campo('cEANTrib_I12').Value;//'cEANTrib';
            uTrib_I13    := spdNFeDataSets.Campo('uTrib_I13').Value;//'uTrib';
            qTrib_I14    := spdNFeDataSets.Campo('qTrib_I14').Value;//'qTrib';
            vUnTrib_I14a := spdNFeDataSets.Campo('vUnTrib_I14a').Value;//'vUnTrib';
            indTot_I17b  := spdNFeDataSets.Campo('indTot_I17b').Value;//'indTot';
             //Grupo de ICMS
            orig_N11     := spdNFeDataSets.Campo('orig_N11').Value;
            CST_N12      := spdNFeDataSets.Campo('CST_N12').Value;
            modBC_N13    := spdNFeDataSets.Campo('modBC_N13').Value;
            vBC_N15      := spdNFeDataSets.Campo('vBC_N15').Value;
            pICMS_N16    := spdNFeDataSets.Campo('pICMS_N16').Value;
            vICMS_N17    := spdNFeDataSets.Campo('vICMS_N17').Value;
             //Grupo de PIS
            CST_Q06      := spdNFeDataSets.Campo('CST_Q06').Value;
            vBC_Q07      := spdNFeDataSets.Campo('vBC_Q07').Value;
            pPis_Q08     := spdNFeDataSets.Campo('pPis_Q08').Value;
            vPis_Q09     := spdNFeDataSets.Campo('vPis_Q09').Value;
             // Grupo de COFINS
            CST_S06      := spdNFeDataSets.Campo('CST_S06').Value;
            vBC_S07      := spdNFeDataSets.Campo('vBC_S07').Value;
            pCOFINS_S08  := spdNFeDataSets.Campo('pCOFINS_S08').Value;
            vCOFINS_S11  := spdNFeDataSets.Campo('vCOFINS_S11').Value;
          spdNFeDataSets.H.Next;
        end;
        //Fim Itens
		
        //Totalizadores
        _vBC_W03         := spdNFeDataSets.Campo('vBC_W03').Value;
        _vICMS_W04       := spdNFeDataSets.Campo('vICMS_W04').Value;
        _vICMSDeson_W04a := spdNFeDataSets.Campo('vICMSDeson_W04a').Value;
        _vBCST_W05       := spdNFeDataSets.Campo('vBCST_W05').Value;
        _vST_W06         := spdNFeDataSets.Campo('vST_W06').Value;
        _vProd_W07       := spdNFeDataSets.Campo('vProd_W07').Value;
        _vFrete_W08      := spdNFeDataSets.Campo('vFrete_W08').Value;
        _vSeg_W09        := spdNFeDataSets.Campo('vSeg_W09').Value;
        _vDesc_W10       := spdNFeDataSets.Campo('vDesc_W10').Value;
        _vII_W11         := spdNFeDataSets.Campo('vII_W11').Value;
        _vIPI_W12        := spdNFeDataSets.Campo('vIPI_W12').Value;
        _vPIS_W13        := spdNFeDataSets.Campo('vPIS_W13').Value;
        _vCOFINS_W14     := spdNFeDataSets.Campo('vCOFINS_W14').Value;
        _vOutro_W15      := spdNFeDataSets.Campo('vOutro_W15').Value;
        _vNF_W16         := spdNFeDataSets.Campo('vNF_W16').Value;
        _vTotTrib_W16a   := spdNFeDataSets.Campo('vTotTrib_W16a').Value;
        //Totalizadores
end;			
					
				
Eventos: Cancelamento da NF-e, Manifestação e Download

Algumas funcões necessárias para as empresas emitentes de NF-e são separadas das demais. Estas são denominadas como eventos: o cancelamento, a carta de correção, o download e a manifestação do destinatário.

O cancelamento da NF-e é um método que tem 6 parâmetros e retorna o XML do cancelamento:

Chave da nota a ser cancelada, número do protocolo de autorização, justificativa do cancelamento, data e hora do cancelamento, sequencia do evento e fuso horário.

								
_retXmlCancelamento = spdNFe.CancelarNFeEvento(_chaveCancelamento,
 						_protocolo, 
 						_justificativaCancelamento, 
 						_dataHoraCancelamento, 
 						1, 
 						_fusoCancelamento);
								
							

A manifestão do destinatário, é o evento onde o destinatário informa se ele está sabendo da operação que o envolve ou não.

Este evento é de extrema importancia para todos os atores da NF-e, e principalmente se o download da nota for necesssário.

Este evento possui 8 parâmemetros e como retorno o XML da manifestação:

								
_xmlMDe = spdNFe.EnviarManifestacaoDestinatario(_tpEvento,
                                    _chaveNF,
                                    spdNFe.CNPJ, 
                                    'Justificativa da Manifestação', 
                                    FormatDateTime('YYYY-MM-DD"T"HH:MM:SS',Now),
                                    1, 
                                    '-03:00', 
                                    '91');
								
							

Tipos de Eventos:

								
1 - Confirmação da operação
2 - Ciência da operação
3 - Desconhecimento da operação
4 - Operação não Realizada
								
							

O Download da NF-e, é um evento que permite que os atores da NF-e possam fazer o download desta, somente, após a manifestação do destinatário.

O método de download possui dois métodos: A chave da nota e o cOrgão do ambiente nacional.

								
  _xmlNFeDownload = spdNFe.DownloadNFe(_chaveDownload, '91');
								
							

CC-e Carta de Correção Eletrônica

A carta de correção eletrônica, é um evento utilizado para fazer as correções necessárias na NF-e.

Prevista na cláusula décima quarta-A do Ajuste SINIEF 07/05, o autor do evento é o emissor da NF-e.

A mensagem XML do evento será assinada com o certificado digital que tenha o CNPJ base do Emissor da NF-e.

Informações sobre a CCe da página 70/311 à 79/311
Manual de Orientação do Contribuinte - Versão 6.0

No componente NF-e são dispostos 6 métodos para a CC-e.

O método de envio da CC-e possui como parâmetros:

a chave da NFe, a descrição da correção com uma String de 15-1000 caracteres, a data e hora da correção, o código da UF conforme o IBGE, a Sequencia do evento começando em 1 e o fuso horário da UF que pode ser verificado neste Post.

							  	
_xmlCCe = spdNFe.EnviarCCe(_ChaveCCe, 
			_correcao, 
			FormatDateTime('YYYY-MM-DD"T"HH:MM:SS',Now), 
			_codigoOrgao, 
			_idCCe, 
			1, 
			_fusoCCe);
						  		
						  	

As configurações de impressão da CCe, são herdadas das propriedade spdNFe.DanfeSettings, a única que precisa ser incrementada aqui é:

						  		
spdNFe.ModeloRTMCCe = '';  //Caminho completo do modelo retrato
						  		
						  	

Visualizar CCe:

						  		
spdNFe.VisualizarCCe(_XmlCCe);
						  		
						  	

Imprimir CCe: Tem como segundo parâmetro o nome da impressora ou caminho da rede.

						  		
spdNFe.ImprimirCCe(_XmlCCe, '');
						  		
						  	

Exporta CCe:

						  		
spdNFe.ExportarCCe(_XmlCCe, 'C:\cce.pdf');
						  		
						  	

Editar CCe:

						  		
spdNFe.EditarModeloCCe(_XmlCCe);
						  		
						  	

Envio de e-Mail CCe:

						  		
spdNFe.EnviarCCeDestinatario(_XmlDestinatarioCCe);