Existe uma forma simples de automatizar a emissão de NFe em seu software desenvolvido em Javascript. Quero te apresentar a integração com o Componente NFe da TecnoSpeed.
Criar uma conta TecnoSpeed (TecnoAccount)
Primeiramente, se você não possuí um Token de acesso é necessário realizar um cadastro no Tecno Account da Tecnospeed TI no link: https://conta.tecnospeed.com.br/
Caso você já possua um cadastro no TecnoAccount e um token, você irá utilizar este mesmo token, não sendo necessário um novo cadastro.
Clique em Criar uma conta e preencha os dados do formulário
Com a conta criada faça o login e pegue o seu Token
Esse Token será utilizado no método ConfigurarSoftwareHouse do componente, a baixo veremos como usar.
Criar uma conta TecnoSpeed (TecnoAccount)
Primeiro de tudo, é preciso instalar o Componente no computador. Caso haja necessidade, acompanhe a documentação de Instalação.
No caso de Node/JS, lembre-se de assinalar os campos :
Para demonstrar como usar o Componente NFe, é necessário ter instalado o Node e NPM no computador. Através deles será possível baixar e instalar pacotes necessários para a instanciação dos componentes. Para instalar o pacote necessário digite no terminal na pasta do projeto:
npm install winax
Após isso, é possível instanciá-lo dentro do projeto JS e então trazer os componentes NFeX para serem utilizados, conforme o exemplo:
const nfe = new ActiveX.Object('NFeX.spdNFeX')
const spdNFeDataSets = new ActiveX.Object('NFeDataSetX.spdNFeDataSetX')
É importante também criar uma variável que represente o caminho o qual se encontra os arquivos do projeto
const path = require('path')
const arquivosNFE = path.join('C:\\Program Files\\TecnoSpeed\\NFe', 'arquivos', '') //Caminho para onde foi instalado o componente
Logo após criar o objeto do componente, é necessário configurar a Software House emissora, inserindo o CNPJ de contrato com a TecnoSpeed e o token gerado na TecnoAccount:
nfe.ConfigurarSoftwareHouse('00000000000000', '') //preencha com seu cnpj e token
Para fazer as configurações do componente, é possível fazê-lo diretamente através do código fonte.
Isso pode ser feito da seguinte maneira:
/* Configurações locais */
nfe.NomeCertificado = '' //preencha com certificado da empresa
nfe.CNPJ = '00000000000000' // modifique para o CNPJ da empresa
nfe.ArquivoServidoresHom = path.join(arquivosNFe, 'nfeServidoresHom.ini')
nfe.ArquivoServidoresProd = path.join(arquivosNFe, 'nfeServidoresProd.ini')
nfe.DiretorioEsquemas = path.join(arquivosNFe, 'Esquemas')
nfe.DiretorioTemplates = path.join(arquivosNFe, 'Templates')
nfe.DiretorioLog = path.join(arquivosNFe, 'Log')
nfe.PINCODE = ''
nfe.DiretorioXmlDestinatario = path.join(arquivosNFe, 'XmlDestinatario')
nfe.DiretorioLogErro = path.join(arquivosNFe, 'LogErro')
nfe.DiretorioTemporario = path.join(arquivosNFe, 'Temp')
nfe.ModoOperacao = 0
nfe.DiretorioDownloads = path.join(arquivosNFe, 'Downloads')
nfe.UF = 'RS' //modifique para o estado da empresa
nfe.VersaoManual = '6.0'
nfe.ConexaoSegura = 1
nfe.Ambiente = '2' //1 para produção, 2 para homologação
nfe.EmailServidor = "smtp.gmail.com"
nfe.EmailRemetente = "teste@remetente.com"
nfe.EmailDestinatario = "teste@destinatario.com"
nfe.EmailAssunto = "exemplo de assunto"
nfe.EmailMensagem = "Ex de mensagem"
nfe.EmailUsuario = "usuario@teste.com"
nfe.EmailSenha = "senha"
nfe.EmailAutenticacao = "True"
nfe.EmailPorta = 587
//DANFE
nfe.LogotipoEmitente = "c:/caminho/" //preencha com o caminho correto
nfe.FraseContingencia = "DANFE em contingencia"
nfe.FraseHomologacao = "SEM VALOR FISCAL"
nfe.ModeloRetrato = path.join(arquivosNFe, "Templates/Danfe/retato.rtm")
nfe.ModeloPaisagem path.join(arquivosNFe, "Templates/Danfe/paisagem.rtm")
Após essa configuração inicial, está tudo pronto para utilizar os métodos do componente para consultas e emissões de NFe.
Métodos do Componente NF-e
Consulta de Status: Método utilizado para realizar a consulta de Status da UF configurada na propriedade nfe.UF Tem como retorno um XML com a resposta do Web Service da UF.
nfe.StatusDoServico() //Consulta o Status do serviço
Gerar XML por Data Set: Método do componente NF-e para gerar o XML através da implementação do DataSet.
spdNFeDataSets.VersaoEsquema = "pl_009";
spdNFeDataSets.DicionarioXML = "C:\Program Files\TecnoSpeed\NFSe\arquivos\templates\vm60\ConversorNFeDataSets.xml";
spdNFeDataSets.Incluir();
spdNFeDataSets.SetCampo("versao_A02=3.10")
spdNFeDataSets.SetCampo("Id_A03=")
spdNFeDataSets.SetCampo("cUf_B02=41")
spdNFeDataSets.SetCampo("cNF_B03=004640327")
spdNFeDataSets.SetCampo("natOp_B04=VENDA MERC.ADQ.REC.TERC")
spdNFeDataSets.SetCampo("indPag_B05=1")
spdNFeDataSets.SetCampo("mod_B06=55")
spdNFeDataSets.SetCampo("serie_B07=") //numero aleatório
spdNFeDataSets.SetCampo("nNF_B08=312342")
spdNFeDataSets.SetCampo("dhEmi_B09=") //datahora
spdNFeDataSets.SetCampo("dhSaiEnt_B10=") //datahora
spdNFeDataSets.SetCampo("tpNF_B11=1")
spdNFeDataSets.SetCampo("idDest_B11a=1")
spdNFeDataSets.SetCampo("cMunFG_B12=4115200")
spdNFeDataSets.SetCampo("tpImp_B21=1")
spdNFeDataSets.SetCampo("tpEmis_B22=1")
spdNFeDataSets.SetCampo("cDV_B23=")
spdNFeDataSets.SetCampo("tpAmb_B24=2")
spdNFeDataSets.SetCampo("finNFe_B25=1")
spdNFeDataSets.SetCampo("indFinal_B25a=0")
spdNFeDataSets.SetCampo("indPres_B25b=0")
spdNFeDataSets.SetCampo("procEmi_B26=0")
spdNFeDataSets.SetCampo("verProc_B27=VersaoAplicacao")
//Dados do Emitente
spdNFeDataSets.SetCampo("CNPJ_C02=00000000000000")
spdNFeDataSets.SetCampo("xNome_C03=Exemplo de Razão Social")
spdNFeDataSets.SetCampo("xFant_C04=Exemplo de nome fantasia")
spdNFeDataSets.SetCampo("xLgr_C06=Exemplo")
spdNFeDataSets.SetCampo("nro_C07=123")
spdNFeDataSets.SetCampo("xBairro_C09=Bairro de Exemplo")
spdNFeDataSets.SetCampo("cMun_C10=4115200")
spdNFeDataSets.SetCampo("xMun_C11=Maringa")
spdNFeDataSets.SetCampo("UF_C12=PR")
spdNFeDataSets.SetCampo("CEP_C13=87500000")
spdNFeDataSets.SetCampo("cPais_C14=1058")
spdNFeDataSets.SetCampo("xPais_C15=Brasil")
spdNFeDataSets.SetCampo("fone_C16=4432222222")
spdNFeDataSets.SetCampo("IE_C17=9044016688")
spdNFeDataSets.SetCampo("CRT_C21=3")
//Dados do Destinatário
spdNFeDataSets.SetCampo("CNPJ_E02=00000000000000")
spdNFeDataSets.SetCampo("xNome_E04=NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL")
spdNFeDataSets.SetCampo("xLgr_E06=RUA DO CENTRO")
spdNFeDataSets.SetCampo("nro_E07=123 )
spdNFeDataSets.SetCampo("xCpl_E08=TESTE")
spdNFeDataSets.SetCampo("xBairro_E09=Centro")
spdNFeDataSets.SetCampo("cMun_E10=4115200")
spdNFeDataSets.SetCampo("xMun_E11=Teste")
spdNFeDataSets.SetCampo("UF_E12=PR")
spdNFeDataSets.SetCampo("CEP_E13=87500000")
spdNFeDataSets.SetCampo("cPais_E14=1058")
spdNFeDataSets.SetCampo("xPais_E15=BRASIL")
spdNFeDataSets.SetCampo("fone_E16=445555555")
spdNFeDataSets.SetCampo("IndIEDest_E16a=1")
spdNFeDataSets.SetCampo("IE_E17=1111111111")
spdNFeDataSets.SetCampo("email_E19=teste@hotmail.com")
//Dados do Itens
spdNFeDataSets->IncluirItem();
spdNFeDataSets.SetCampo("nItem_H02=1")
spdNFeDataSets.SetCampo("xProd_I04=MELAO Saborozinho")
spdNFeDataSets.SetCampo("cProd_I02=0999")
spdNFeDataSets.SetCampo("cEAN_I03=")
spdNFeDataSets.SetCampo("NCM_I05=11081200")
spdNFeDataSets.SetCampo("CFOP_I08=51020")
spdNFeDataSets.SetCampo("CEST_I05c=")
spdNFeDataSets.SetCampo("uCom_I09=AABCC")
spdNFeDataSets.SetCampo("qCom_I10=1.00")
spdNFeDataSets.SetCampo("vUnCom_I10a=10.0000")
spdNFeDataSets.SetCampo("vProd_I11=10.00")
spdNFeDataSets.SetCampo("cEANTrib_I12=")
spdNFeDataSets.SetCampo("uTrib_I13=AABCC")
spdNFeDataSets.SetCampo("qTrib_I14=1")
spdNFeDataSets.SetCampo("vUnTrib_I14a=10.00")
spdNFeDataSets.SetCampo("indTot_I17b=1")
spdNFeDataSets.SetCampo("infAdProd_V01=Observações do produto infAdProd")
//Dados dos impostos
spdNFeDataSets.SetCampo("orig_N11=0")
spdNFeDataSets.SetCampo("CST_N12=00")
spdNFeDataSets.SetCampo("modBC_N13=0")
spdNFeDataSets.SetCampo("vBC_N15=0.01")
spdNFeDataSets.SetCampo("pICMS_N16=7.60")
spdNFeDataSets.SetCampo("vICMS_N17=0.01")
spdNFeDataSets.SetCampo("CST_Q06=01")
spdNFeDataSets.SetCampo("vBC_Q07=0.01")
spdNFeDataSets.SetCampo("pPIS_Q08=1.65")
spdNFeDataSets.SetCampo("vPIS_Q09=0.00")
spdNFeDataSets.SetCampo("CST_S06=01")
spdNFeDataSets.SetCampo("vBC_S07=0.01")
spdNFeDataSets.SetCampo("pCOFINS_S08=7.60")
spdNFeDataSets.SetCampo("vCOFINS_S11=0.01")
spdNFeDataSets.SalvarItem();
spdNFeDataSets.SetCampo("vBC_W03=0.01")
spdNFeDataSets.SetCampo("vICMS_W04=0.01")
spdNFeDataSets.SetCampo("vICMSDeson_W04a=0.00")
spdNFeDataSets.SetCampo("vBCST_W05=0.00")
spdNFeDataSets.SetCampo("vST_W06=0.00")
spdNFeDataSets.SetCampo("vProd_W07=10.00")
spdNFeDataSets.SetCampo("vFrete_W08=0.00")
spdNFeDataSets.SetCampo("vSeg_W09=0.00")
spdNFeDataSets.SetCampo("vDesc_W10=0.00")
spdNFeDataSets.SetCampo("vII_W11=0.00")
spdNFeDataSets.SetCampo("vIPI_W12=0.00")
spdNFeDataSets.SetCampo("vPIS_W13=0.00")
spdNFeDataSets.SetCampo("vCOFINS_W14=0.01")
spdNFeDataSets.SetCampo("vOutro_W15=0.00")
spdNFeDataSets.SetCampo("vNF_W16=10.00")
spdNFeDataSets.SetCampo("modFrete_X02=9")
spdNFeDataSets.Salvar();
try {
let Xml = nfe.ConverterLoteParaXml('C:/NFe/tx2nfe.tx2', 1, 'pl_009') //digite o caminho para salvar tx2
response.end(Xml)
} catch (error) {
console.log(error)
}
}
Assinar Nota : Método do componente NF-e que tem como parâmetro o XML gerado pelo Data Set e retorna o XML assinado da NF-e para ser enviado. Obs.: Após o uso deste método, modificações posteriores feitas ao XML farão com que a Sefaz retorne negativamente.
try {
let XmlAssinado = nfe.AssinarNota(request.body.xml)
response.end(XmlAssinado)
} catch (error) {
console.log(error)
}
}
Enviar Nota(Assíncrono): Método do componente que tem como parâmetro o num. Lote, o XML Assinado e se o lote é compactado ou não. Tem como retorno o status do processamento do Lote e o número do Recibo.
try {
const retorno = nfe.EnviarNF('00001', request.body.xml, false)
response.end(retorno)
} catch (error) {
console.log(error)
}
Exemplo de retorno Assíncrono:
<retEnviNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>2</tpAmb><verAplic>PR-v3_6_7</verAplic><cStat>103</cStat><xMotivo>Lote recebido com sucesso</xMotivo><cUF>41</cUF><dhRecbto>2020-08-26T14:53:54-03:00</dhRecbto><infRec><nRec>411110215728646</nRec><tMed>1</tMed></infRec></retEnviNFe>
Enviar Nota(Síncrono): Método do componente que faz o envio e já retorna o resultado da autorização da nota.(Alguns Web Services não apresentam estabilidade quanto ao uso deste método, o mais aconselhado é usar o envio Assíncrono).
try {
const retorno = nfe.EnviarNFSincrono('00001', request.body.xml, false)
response.end(retorno)
} catch (error) {
console.log(error)
}
Exemplo de retorno Síncrono:
<retEnviNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>2</tpAmb><verAplic>PR-v3_6_7</verAplic><cStat>104</cStat><xMotivo>Lote processado</xMotivo><cUF>41</cUF><dhRecbto>2020-08-26T15:02:42-03:00</dhRecbto><protNFe versao="3.10"><infProt Id="ID141160000760514"><tpAmb>2</tpAmb><verAplic>PR-v3_6_7</verAplic><chNFe>41160908187168000160553670003123421004640324</chNFe><dhRecbto>2020-08-26T15:02:42-03:00</dhRecbto><nProt>141160000760514</nProt><digVal>HpNE7evWmgOzlahz1yY6hMUiQj0=</digVal><cStat>100</cStat><xMotivo>Autorizado o uso da NF-e</xMotivo></infProt></protNFe></retEnviNFe>
Minha nota está trazendo rejeições, e agora, o que fazer ?
Como encontrar soluções para as Rejeições
Consultar Recibo: Método do componente que tem como parâmetro o número do Recibo, que vem no retorno do envio Assíncrono. Retorna o resultado do processamento da NF-e.
let numeroRecibo = '' //preencha com recibo da NFe
let retorno = nfe.ConsultarRecibo(numeroRecibo)
Exemplo de retorno do método:
<retConsReciNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>2</tpAmb><verAplic>PR-v3_6_7</verAplic><nRec>411110215728750</nRec><cStat>104</cStat><xMotivo>Lote processado</xMotivo><cUF>41</cUF><dhRecbto>2020-08-26T15:21:27-03:00</dhRecbto><protNFe versao="3.10"><infProt><tpAmb>2</tpAmb><verAplic>PR-v3_6_7</verAplic><chNFe>41160908187168000160552910003123421004640328</chNFe><dhRecbto>2020-08-26T15:21:24-03:00</dhRecbto><nProt>141160000760604</nProt><digVal>hCm7VA2TpfJSa69oqOAN7Pa0i1g=</digVal><cStat>100</cStat><xMotivo>Autorizado o uso da NF-e</xMotivo></infProt></protNFe></retConsReciNFe>
Consultar NF-e: Método do componente que tem como parâmetro a chave da Nota. Retorna o status do processamento da NF-e.
let chaveNota = "" //preencha com o retorno da chave
let retorno = nfe.ConsultarNF(chaveNota)
Exemplo de retorno do método:
<retConsSitNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>2</tpAmb><verAplic>PR-v3_6_7</verAplic><cStat>100</cStat><xMotivo>Autorizado o uso da NF-e</xMotivo><cUF>41</cUF><dhRecbto>2020-08-26T15:22:08-03:00</dhRecbto><chNFe>41160908187168000160552910003123421004640328</chNFe><protNFe versao="3.10"><infProt Id="ID141160000760604"><tpAmb>2</tpAmb><verAplic>PR-v3_6_7</verAplic><chNFe>41160908187168000160552910003123421004640328</chNFe><dhRecbto>2020-08-26T15:21:24-03:00</dhRecbto><nProt>141160000760604</nProt><digVal>hCm7VA2TpfJSa69oqOAN7Pa0i1g=</digVal><cStat>100</cStat><xMotivo>Autorizado o uso da NF-e</xMotivo></infProt></protNFe></retConsSitNFe>
Gerar PDF: Método do componente NF-e que gera o PDF da NF-e a partir do XML Autorizado da nota. Tem como parâmetro o número do Lote, o XML da nota Autorizado, o modelo RTM do componente NF-e, o formato de saída e o diretório para gravação do arquivo.
try {
nfe.ExportarDanfe('1', xml, '', 1, 'C:/teste.pdf'); //com caminho para salvar arquivo
let pdf = fs.readFileSync('C:/teste.pdf', 'binary').toString('binary');
response.end(Buffer.from(pdf, 'binary'))
} catch (error) {
console.log(error)
}
Também é possível auditar/validar o XML da NFe antes de fazer o envio. Para isto, usa-se o método AuditorValidarXml , que tem como parâmetro o XML da NFe e o separador do retorno.
nfe.AuditorExibirRegrasValidacao = true;
nfe.AuditorCodigoProduto = 1;
nfe.AuditorModoOperacao = 0;
nfe.AuditorEstagio = 0;
nfe.AuditorTipoResposta = 1;
nfe.AuditorDiretorioEsquemas = path.join(arquivosNFe, "Esquemas\Auditor")
nfe.AuditorDiretorioTemplates = path.join(arquivosNFe, "templates\Auditor")
nfe.AuditorDiretorioRegras = path.join(arquivosNFe, "templates\Auditor\Regras";
let xmlResposta = nfe.AuditorValidarXml(xml, "|");
Exemplo de retorno do método:
{"notas":[{"ID":"Nota NFe41160908187168000160557450003123421004640329","valido":"XML Valido"}],"tags":[],"helper":[]}
Lista de Tipos dentro do DataSet
{A - Dados da Nota Fiscal eletrônica}
{B - Identificação da Nota Nota Fiscal Eletrônica }
{C - Identificação do Emitente da Nota Nota Fiscal Eletrônica }
{D - Identificação do Fisco Emitente da Nota Nota Fiscal Eletrônica }
{E - Identificação do Destinatário da Nota Nota Fiscal Eletrônica }
{F - Identificação do Local da Retirada da Nota Nota Fiscal Eletrônica }
{G - Identificação do Local da Entrega da Nota Nota Fiscal Eletrônica }
{H - Detalhamento de Produtos e Serviços da Nota Nota Fiscal Eletrônica }
{I - Produtos e Serviços da Nota Nota Fiscal Eletrônica }
{J - Detalhamento Específico de Veículos Novos }
{K - Detalhamento Específico de Medicamentos }
{L - Detalhamento Específico de Armamentos }
{M - Tributos Incidentes no Produto ou Serviço }
{N - ICMS Normal e ST } {O - Imposto sobre Produto Industrializado }
{P - Imposto de Importação }
{Q - PIS }
{R - PIS ST }
{S - COFINS }
{T - COFINS ST }
{U - ISSQN }
{V - Informações Adicionais do Item }
{W - Valores Totais da NFe }
{X - Informações do Transporte da NFe }
{Y - Dados da Cobrança }
{Z - Informações Adicionais da NFe }
Comentários
0 comentário
Por favor, entre para comentar.