Como emitir NF-e em C# com o componente TecnoSpeed

Introdução

Com o componente Tecnospeed é muito simples realizar a integração com C#. Pensando em auxiliar o Desenvolvedor, criamos este tutorial para ajudar a implementar em seu software a emissão de NF-e com C#.

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

Veja no vídeo abaixo como referenciar o componente NFe no Visual Studio e como instanciar a classe do componente


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 :

									
_spdNFeX.LoadConfig("");
									
								

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.

								
_spdNFeX.NomeCertificado = "CN=TECNOSPEED TECNOLOGIA DE INFORMACAO LTDA:08187168000160, OU=AR CERTIFICADOS PONTO COM, O=ICP-Brasil, C=BR, S=PR, L=MARINGA, E=, SE=64 A0 98 6F 68 EE 4A C7";

string startPath = Application.StartupPath;//Caminho do exe.

_spdNFeX.UF                       = "PR";
_spdNFeX.CNPJ                     = "08187168000160";
_spdNFeX.ArquivoServidoresHom     = startPath + @"\NFe\nfeServidoresHom.ini";
_spdNFeX.ArquivoServidoresProd    = startPath + @"\NFe\nfeServidoresHom.ini";
_spdNFeX.DiretorioTemplates       = startPath + @"\NFe\Templates\";
_spdNFeX.DiretorioEsquemas        = startPath + @"\NFe\Esquemas\";
_spdNFeX.DiretorioXmlDestinatario = startPath + @"\NFe\XmlDestinatario\";
_spdNFeX.DiretorioLog             = startPath + @"\NFe\Log\";
_spdNFeX.DiretorioLogErro         = startPath + @"\NFe\LogErro\";
_spdNFeX.DiretorioDownloads       = startPath + @"\NFe\Downloads";
_spdNFeX.TipoCertificado          = NFeX.TipoCertificado.ckFile;
_spdNFeX.ModoOperacao             = "NORMAL";
_spdNFeX.Ambiente                 = NFeX.Ambiente.akHomologacao;
_spdNFeX.VersaoManual             = "5.0a";
_spdNFeX.TimeOut                  = 30000;
_spdNFeX.MaxSizeLoteEnvio         = 500;
_spdNFeX.ValidarEsquemaAntesEnvio = false;

/*Atente-se, as propriedades _spdNFeX.NomeCertificado e _spdNFeX.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.*/

_spdNFeX.CaminhoCertificado = @"";
_spdNFeX.SenhaCertificado = "";

								
							

Para a função _spdNFeX.ListarCertificados Funcionar listando os certificados instalados na máquina em uma lista ou ComboBox, é necessário a seguinte implementação:

								
string[] vetor = _spdNFeX.ListarCertificados("|").Split('|');
cbCertificado.Items.Clear();
for (int i = 0; i < vetor.Length; i++)
{
    cbCertificado.Items.Add(vetor[i]);
}
								
							

Observação: É recomendada a chamada da função após o InitializeComponent();

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.

								
_spdNFeDataSetX.VersaoEsquema = "pl_008i2";
_spdNFeDataSetX.DicionarioXML = _spdNFeX.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.

													
_spdNFeDataSetX.VersaoEsquema = "pl_008i2";
_spdNFeDataSetX.DicionarioXML = _spdNFeX.DiretorioTemplates + @"\Conversor\NFeDataSets.xml";
_spdNFeDataSetX.Incluir();
/* Dados NF-e */
_spdNFeDataSetX.SetCampo("versao_A02=3.10");
_spdNFeDataSetX.SetCampo("Id_A03=");
_spdNFeDataSetX.SetCampo("cUf_B02=41");
_spdNFeDataSetX.SetCampo("cNF_B03=004640327");
_spdNFeDataSetX.SetCampo("natOp_B04=VENDA MERC.ADQ.REC.TERC");
_spdNFeDataSetX.SetCampo("indPag_B05=1");
_spdNFeDataSetX.SetCampo("mod_B06=55");
_spdNFeDataSetX.SetCampo("serie_B07=332");
_spdNFeDataSetX.SetCampo("nNF_B08=123");
_spdNFeDataSetX.SetCampo("dhEmi_B09=" + dat.ToString("yyyy-MM-dd'T'HH:mm:ss") + "-03:00");
_spdNFeDataSetX.SetCampo("dhSaiEnt_B10=" + dat.ToString("yyyy-MM-dd'T'HH:mm:ss") + "-03:00");
_spdNFeDataSetX.SetCampo("tpNF_B11=1");
_spdNFeDataSetX.SetCampo("idDest_B11a=1");
_spdNFeDataSetX.SetCampo("cMunFG_B12=4115200");
_spdNFeDataSetX.SetCampo("tpImp_B21=1");
_spdNFeDataSetX.SetCampo("tpEmis_B22=1");
_spdNFeDataSetX.SetCampo("cDV_B23= ");
_spdNFeDataSetX.SetCampo("tpAmb_B24=2");
_spdNFeDataSetX.SetCampo("finNFe_B25=1");
_spdNFeDataSetX.SetCampo("indFinal_B25a=1");
_spdNFeDataSetX.SetCampo("indPres_B25b=0");
_spdNFeDataSetX.SetCampo("procEmi_B26=0");
_spdNFeDataSetX.SetCampo("verProc_B27=000");

/* //Exemplo de NF-e Refênciada
_spdNFeDataSetX.IncluirParte("nRef");
_spdNFeDataSetX.SetCampo("refNFe_BA02=43150413156160000176550010000017781000017784");
_spdNFeDataSetX.SalvarParte("nRef");*/

/* Dados do Emitente */
_spdNFeDataSetX.SetCampo("CNPJ_C02=" + _spdNFeX.CNPJ);
_spdNFeDataSetX.SetCampo("xNome_C03=Exemplo de Razão Social");
_spdNFeDataSetX.SetCampo("xFant_C04=Exemplo de nome fantasia");
_spdNFeDataSetX.SetCampo("xLgr_C06=Exemplo");
_spdNFeDataSetX.SetCampo("nro_C07=123");
_spdNFeDataSetX.SetCampo("xBairro_C09=Bairro de Exemplo");
_spdNFeDataSetX.SetCampo("cMun_C10=4115200");
_spdNFeDataSetX.SetCampo("xMun_C11=Maringa");
_spdNFeDataSetX.SetCampo("UF_C12=" + _spdNFeX.UF);
_spdNFeDataSetX.SetCampo("CEP_C13=87500000");
_spdNFeDataSetX.SetCampo("cPais_C14=1058");
_spdNFeDataSetX.SetCampo("xPais_C15=Brasil");
_spdNFeDataSetX.SetCampo("fone_C16=4432222222");
_spdNFeDataSetX.SetCampo("IE_C17=9044016688");
_spdNFeDataSetX.SetCampo("CRT_C21=3");

/* Dados do Destinatário */
_spdNFeDataSetX.SetCampo("CNPJ_E02=08187168000160");
_spdNFeDataSetX.SetCampo("xNome_E04=NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL");
_spdNFeDataSetX.SetCampo("xLgr_E06=RUA DO CENTRO");
_spdNFeDataSetX.SetCampo("nro_E07=123");
_spdNFeDataSetX.SetCampo("xCpl_E08=TESTE");
_spdNFeDataSetX.SetCampo("xBairro_E09=Centro");
_spdNFeDataSetX.SetCampo("cMun_E10=4115200");
_spdNFeDataSetX.SetCampo("xMun_E11=Teste");
_spdNFeDataSetX.SetCampo("UF_E12=PR");
_spdNFeDataSetX.SetCampo("CEP_E13=87500000");
_spdNFeDataSetX.SetCampo("cPais_E14=1058");
_spdNFeDataSetX.SetCampo("xPais_E15=BRASIL");
_spdNFeDataSetX.SetCampo("fone_E16=445555555");
_spdNFeDataSetX.SetCampo("IndIEDest_E16a=9");
_spdNFeDataSetX.SetCampo("IE_E17=9044016688");
_spdNFeDataSetX.SetCampo("email_E19=destinatario@destinatario.com");

/* Dados do(s) Item(ns)*/
_spdNFeDataSetX.IncluirItem();
_spdNFeDataSetX.SetCampo("nItem_H02=" + nitem.ToString());
_spdNFeDataSetX.SetCampo("xProd_I04=Danoninho ICE");
_spdNFeDataSetX.SetCampo("cProd_I02=0999");
_spdNFeDataSetX.SetCampo("cEAN_I03=");
_spdNFeDataSetX.SetCampo("NCM_I05=11081200");
_spdNFeDataSetX.SetCampo("CFOP_I08=51020");
_spdNFeDataSetX.SetCampo("CEST_I05c=");
_spdNFeDataSetX.SetCampo("uCom_I09=AABCC");
_spdNFeDataSetX.SetCampo("qCom_I10=1.00");
_spdNFeDataSetX.SetCampo("vUnCom_I10a=10.0000");
_spdNFeDataSetX.SetCampo("vProd_I11=10.00");
_spdNFeDataSetX.SetCampo("cEANTrib_I12=");
_spdNFeDataSetX.SetCampo("uTrib_I13=AABCC");
_spdNFeDataSetX.SetCampo("qTrib_I14=1");
_spdNFeDataSetX.SetCampo("vUnTrib_I14a=10.00");
_spdNFeDataSetX.SetCampo("indTot_I17b=1");
_spdNFeDataSetX.SetCampo("infAdProd_V01=Obs do produto");

/* Grupo de ICMS */
_spdNFeDataSetX.SetCampo("orig_N11=0");
_spdNFeDataSetX.SetCampo("CST_N12=00");
_spdNFeDataSetX.SetCampo("modBC_N13=0");
_spdNFeDataSetX.SetCampo("vBC_N15=0.01");
_spdNFeDataSetX.SetCampo("pICMS_N16=7.60");
_spdNFeDataSetX.SetCampo("vICMS_N17=0.01");

/* Grupo de PIS */
_spdNFeDataSetX.SetCampo("CST_Q06=01");
_spdNFeDataSetX.SetCampo("vBC_Q07=0.01");
_spdNFeDataSetX.SetCampo("pPIS_Q08=1.65");
_spdNFeDataSetX.SetCampo("vPIS_Q09=0.00");

/* Grupo de COFINS */
_spdNFeDataSetX.SetCampo("CST_S06=01");
_spdNFeDataSetX.SetCampo("vBC_S07=0.01");
_spdNFeDataSetX.SetCampo("pCOFINS_S08=7.60");
_spdNFeDataSetX.SetCampo("vCOFINS_S11=0.01");
_spdNFeDataSetX.SalvarItem();

/* Totalizadores */
_spdNFeDataSetX.SetCampo("vBC_W03=0.01");
_spdNFeDataSetX.SetCampo("vICMS_W04=0.01");
_spdNFeDataSetX.SetCampo("vICMSDeson_W04a=0.00");
_spdNFeDataSetX.SetCampo("vBCST_W05=0.00");
_spdNFeDataSetX.SetCampo("vST_W06=0.00");
_spdNFeDataSetX.SetCampo("vProd_W07=10.00");
_spdNFeDataSetX.SetCampo("vFrete_W08=0.00");
_spdNFeDataSetX.SetCampo("vSeg_W09=0.00");
_spdNFeDataSetX.SetCampo("vDesc_W10=0.00");
_spdNFeDataSetX.SetCampo("vII_W11=0.00");
_spdNFeDataSetX.SetCampo("vIPI_W12=0.00");
_spdNFeDataSetX.SetCampo("vPIS_W13=0.00");
_spdNFeDataSetX.SetCampo("vCOFINS_W14=0.01");
_spdNFeDataSetX.SetCampo("vOutro_W15=0.00");
_spdNFeDataSetX.SetCampo("vNF_W16=10.00");

_spdNFeDataSetX.SetCampo("modFrete_X02=9");

_spdNFeDataSetX.Salvar();
string conteudoXml = _spdNFeDataSetX.LoteNFe;
string idNota = _spdNFeDataSetX.GetCampo("Id_A03").ToString().Remove(0, 3);
													
												

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

Acesse nosso Simulador
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 = _spdNFeX.AssinarNota(conteudoXml);
								
							

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 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, você precisa instanciar a classe do validador em seu código da seguinte maneira:

								
public ValidadorClientX.spdValidadorClientX _spdValidadorNFex = new ValidadorClientX.spdValidadorClientX();
								
							

Configurar e utilizar o validdor também é bastante simples.

Par configurar são usados os seguinte parâmetros:

								
_spdValidadorNFex.ModoOperacao = TModoOperacao.moCliente;
_spdValidadorNFex.ExibirRegrasValidacao = true;
_spdValidadorNFex.CodigoProduto = 1;
_spdValidadorNFex.Estagio = TEstagio.esProducao;
_spdValidadorNFex.TipoResposta = TResposta.trJSON;
_spdValidadorNFex.WidthHtml = 800;
_spdValidadorNFex.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:

								
_spdValidadorNFex.ModoOperacao = TModoOperacao.moLocal;

string pathTempAuditor = Application.StartupPath + @"\Templates\Auditor";
string pathEempAuditor = Application.StartupPath + @"\Esquemas\Auditor";
string pathRempAuditor = Application.StartupPath + @"\Templates\Auditor\Regras";

_spdValidadorNFex.DiretorioEsquemas = pathTempAuditor;
_spdValidadorNFex.DiretorioTemplates = pathEempAuditor;
_spdValidadorNFex.DiretorioRegras = pathRempAuditor;

_spdValidadorNFex.ExibirRegrasValidacao = true;
_spdValidadorNFex.CodigoProduto = 1;
_spdValidadorNFex.Estagio = TEstagio.esProducao;
_spdValidadorNFex.TipoResposta = TResposta.trJSON;
_spdValidadorNFex.WidthHtml = 800;
_spdValidadorNFex.HeigthHtml = 500;									
								
							

Para fazer a validação é simpes, basta usar o seguinte código:

								
retValidacao = _spdValidadorNFex.ValidarXml(xmlAssinado, "|");
_spdNFeX.AuditorShowHtml(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 = _spdNFeX.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>
								
							

Para capturar o cStat e então tratar o retorno, é simples.

O C# possui uma using que é declarada como:

								
using System.Xml;
								
							

Esta tem a seginte instância:

									
XmlDocument xDoc = new XmlDocument();
									
								

Para capturar um valor, basta fazer como o exemplo a baixo:

								
xDoc.LoadXml(xmlRetEnvio);
//Capturar o número do recibo para fazer a consulta do Recibo.
numRecibo = xDoc.GetElementsByTagName("nRec").Item(0).InnerText;
//Capturar o cStat para validar
cStat = xDoc.GetElementsByTagName("cStat").Item(0).InnerText;
//Assim é possível tomar as decisões necessárias.
								
							

Cada cStat tem um significado, você pode o compreender pelo seu xMotivo.

Veja aqui a Lista dos cStat | xMotivo.

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:

								
xmlRetConsRecibo = _spdNFeX.ConsultarRecibo(numRecibo);
								
							

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:

								
_spdNFeX.LogotipoEmitente = @"logo.png";
_spdNFeX.QtdeCopias = 1;
_spdNFeX.InfCplMaxCol = 60;
_spdNFeX.InfCplMaxRow = 7;
_spdNFeX.FraseHomologacao = "NF-e SEM VALOR FISCAL";
_spdNFeX.FraseContingencia = "Contingência em decorrência de problemas técnicos";
_spdNFeX.LineDelimiter = "|";
_spdNFeX.ModeloRetrato = @"templates\vm50a\Danfe\retrato.rtm";
_spdNFeX.MensagemPartilhaAutomatica = false;
_spdNFeX.ImprimirDuplicata = false;
_spdNFeX.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.

								
_spdNFeX.PreverDanfe(_xml, "");
								
							

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

								
_spdNFeX.VisualizarDanfe("0000", ReadFile(_chaveNota, "-nfe"), "");
								
							

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

								
_spdNFeX.ImprimirDanfe("0000", ReadFile(_chaveNota, "-nfe"), "", "");
								
							

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.

								
_spdNFeX.ExportarDanfe("0000", ReadFile(_chaveNota, "-nfe"), "", 1, @"C:\teste.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).

								
_spdNFeX.EditarModeloDanfe("0000", ReadFile(_chaveNota, "-nfe"), "");
								
							

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.

								
_spdNFeX.ImprimirDanfe("0000", ReadFile(_chaveNotaCancelada, "-caneve"), "", "");
								
							

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.

								
_spdNFeX.VisualizarDanfe("0000", String.Concat(ReadFile(_chaveNota, "-nfe"), ReadFile(edtIdNota.Text, "-caneve")), "");
								
							

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

								
public string ReadFile(string Arquivo, string sufixo)
{
    string xml = _spdNFeX.DiretorioXmlDestinatario + Arquivo + sufixo + ".xml";
    xDoc.Load(xml);
    return xDoc.InnerXml;
}
								
							
Configurando e enviando e-mail

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

						  		
_spdNFeX.EmailServidor     = servidorSMTP;
_spdNFeX.EmailPorta        = Convert.ToInt32("587");
_spdNFeX.EmailRemetente    = emailRemetente;
_spdNFeX.EmailDestinatario = emailDestinatario;
_spdNFeX.EmailAssunto      = assunto;
_spdNFeX.EmailMensagem     = mensagem;
_spdNFeX.EmailUsuario      = emailUsuario;
_spdNFeX.EmailSenha        = emailSenha;
_spdNFeX.EmailTimeOut      = Convert.ToInt32("30000");
_spdNFeX.EmailAutenticacao = true;
_spdNFeX.EmailConteudoHtml = 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:

						  	    
_spdNFeX.EnviarNotaDestinatario(_chaveNota, "", "");
						  	    
						  	

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

						  		
_spdNFeX.EnviarNotaCanceladaDestinatario(tbChaveNota.Text, 
						"", 
						"", 
						tbEmailDestinatario.Text);
						  		
						  	

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:

						  	        
_spdNFeDataSetX.DiretorioTemplates = Application.StartupPath + @"\templates";
_spdNFeDataSetX.ConverterXmlParaDataSet(_xmlEntrada, "pl_008i2");

chave = _spdNFeDataSetX.GetCampo("Id_A03");

_spdNFeDataSetX.FindDataset("nRef").First();
while (!_spdNFeDataSetX.FindDataset("nRef").Eof())
{                
    nRef =  _spdNFeDataSetX.GetCampo("refNFe_BA02");
    _spdNFeDataSetX.FindDataset("nRef").Next();
}

_spdNFeDataSetX.FindDataset("H").First();
while (!_spdNFeDataSetX.FindDataset("H").Eof())
{
    nItem = _spdNFeDataSetX.GetCampo("nItem_H02");
    xProd = _spdNFeDataSetX.GetCampo("xProd_I04");
    vProd = _spdNFeDataSetX.GetCampo("vProd_I11");
    csosn = _spdNFeDataSetX.GetCampo("CSOSN_N12a");
    _spdNFeDataSetX.FindDataset("H").Next();
}

_spdNFeDataSetX.FindDataset("Y").First();
while (!_spdNFeDataSetX.FindDataset("Y").Eof())
{
    nFat  = _spdNFeDataSetX.GetCampo("nFat_Y03");
    vOrig = _spdNFeDataSetX.GetCampo("vOrig_Y04");
    vDesc = _spdNFeDataSetX.GetCampo("vDesc_Y05");
    vLiq = _spdNFeDataSetX.GetCampo("vLiq_Y06");
    _spdNFeDataSetX.FindDataset("Y").Next();
}

_spdNFeDataSetX.FindDataset("Dup").First();
while (!_spdNFeDataSetX.FindDataset("Dup").Eof())
{
    nroDup = _spdNFeDataSetX.GetCampo("nDup_Y08");
    venc   = _spdNFeDataSetX.GetCampo("dVenc_Y09");
    valor  = _spdNFeDataSetX.GetCampo("vDup_Y10");
    _spdNFeDataSetX.FindDataset("Dup").Next();
}
						  	
						  
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 = _spdNFeX.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 = _spdNFeX.EnviarManifestacaoDestinatario(_tpEvento,
                                    _chaveNF,
                                    _spdNFeX.CNPJ, 
                                    "Justificativa da Manifestação", 
                                    DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss"),
                                    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 = _spdNFeX.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 = _spdNFeX.EnviarCCe(_ChaveCCe, 
			_correcao, 
			DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss"), 
			_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 é:

						  		
_spdNFeX.ModeloRTMCCe = @"";  //Caminho completo do modelo retrato
						  		
						  	

Visualizar CCe:

						  		
_spdNFeX.VisualizarCCe(_XmlCCe);
						  		
						  	

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

						  		
_spdNFeX.ImprimirCCe(_XmlCCe, "");
						  		
						  	

Exporta CCe:

						  		
_spdNFeX.ExportarCCe(_XmlCCe, @"C:\cce.pdf");
						  		
						  	

Editar CCe:

						  		
_spdNFeX.EditarModeloCCe(_XmlCCe);
						  		
						  	

Envio de e-Mail CCe:

						  		
_spdNFeX.EnviarCCeDestinatario(_XmlDestinatarioCCe);