Membros Pro GEW Tecnologia Postado 27 Novembro Membros Pro Postado 27 Novembro Olá, estou tentando recriar o PDF de uma nota já emitida através do XML salvo em banco de dados usando a sequencia de funções: NFE_Inicializar > NFE_CarregarXML > NFE_SalvarPDF > NFE_Finalizar O PDF retornado vem como "NF-E NÃO ENVIADA PARA SEFAZ" Estou fazendo em Node async gerarPdf(dados: NotaPDFDto): Promise<ResponseStatusModel> { let handle = null; try { let response: ResponseStatusModel; handle = ref.alloc('pointer'); const handleBuffer = 1024; const tamanhoBuffer = 2000000; response = await inicializarNfe(handle); if (response.status !== HttpStatus.NO_CONTENT) { return response; } handle = ref.readPointer(handle, 0, handleBuffer); response = await carregarXML(handle, dados.xml); if (response.status !== HttpStatus.NO_CONTENT) { return response; } response = await salvarPDF(handle, tamanhoBuffer); if (response.status !== HttpStatus.NO_CONTENT) { return response; } return { status: HttpStatus.OK, data: response.data }; } catch (err) { return rejeitarPromise(err); } finally { await finalizarNfe(handle); } } Deixei em anexo o XML a NF original e a NF recriada por esta função nfe.xml nfe-original.pdf nfe-recriada.pdf
Consultores Diego Foliene Postado 27 Novembro Consultores Postado 27 Novembro Bom dia! O problema está em seu arquivo nfe.xml. Veja que o mesmo não possui as informações de autorização. Ele não tem um grupo: <protNFe versao="4.00"> <infProt> <tpAmb>2</tpAmb> <verAplic>XXXX</verAplic> <chNFe>35XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX00</chNFe> <dhRecbto>2024-11-21T20:37:26-03:00</dhRecbto> <nProt>1XXXXXXXXXXX3</nProt> <digVal>4+XXXXXXXXXXXXXXXME=</digVal> <cStat>100</cStat> <xMotivo>Autorizado o uso da NF-e</xMotivo> </infProt> </protNFe> E por isso, quando a biblioteca faz a leitura, ela entende que ele não foi enviado para a Sefaz. Diego FolieniAjude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Discord Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!
Membros Pro GEW Tecnologia Postado 27 Novembro Autor Membros Pro Postado 27 Novembro Que estranho, pois na função de criar e enviar a nota, eu enviou um email com o XML e PDF da nota, este XML é pego da função NFE_ObterXml e adicionado na função NFE_EnviarEmail no parâmetro eXMLNFe, o XML enviado por Email e o salvo em banco é o mesmo, porem o salvo em banco não tem esta parte <protNFe> e a que vai por email possui, sabe me informar se a função de enviar Email pega este XML de outro lugar? Esta é a função que gera e envia a NFe, retornando a nota criada para ser salva em banco: async criarEnviarNFe(dados: CriarNfeDto): Promise<ResponseStatusModel> { let response: ResponseStatusModel; this.dadosGerados = ''; if (!!dados.numeroSerieDispositivo === false) { return rejeitarPromise({ status: HttpStatus.FORBIDDEN, error: 'Emissão de NF-e não autorizada. Número de série do dispositivo não encontrado.' }); } this.gerarSecaoNfe('infNFe', { versao: '4.00' }); this.gerarSecaoNfe('Identificacao', dados.conteudo.identificacao); this.gerarSecaoNfe('Emitente', dados.conteudo.emitente); this.gerarSecaoNfe('Destinatario', dados.conteudo.destinatario); this.gerarListaProdutosTributos(dados.conteudo.produtoList); this.gerarSecaoNfe('Total', dados.conteudo.total); this.gerarSecaoNfe('Transportador', dados.conteudo.transportador); this.gerarSecaoNfe('Fatura', dados.conteudo.fatura); this.gerarLista<PagModel>('Pag', dados.conteudo.pagamentoList); this.gerarSecaoNfe('InfRespTec', dados.conteudo.informacaoResponsavelTecnico); let date = new Date(); this.gerarLista<any>('obsCont', [{ xCampo: '(c) 2007-' + date.getFullYear(), xTexto: 'GESTOR - solix.com.br' }]); this.gerarSecaoNfe('DadosAdicionais', { infCpl: 'Total aproximado dos tributos Mun., Est. e Fed.: R$ 1.98 (23.86%)(Fonte: IBPT);Cliente.: 1 - GEW SISTEMAS ( GEW EMPREENDIMENTOS LTDA );(GEW TESTES) TEXTO FISCAL PADRAO DE TESTES DE IMPRESSAO (GEW TESTES)Observacao do Comprovante... testando a Observacao do Comprovante cadastro de Entidades.;EMPRESA OPTANTE PELO SIMPLES NACIONAL;PERMITE O APROVEITAMENTO DO CREDITO DE ICMS NO VALOR DE R$ 0.23, CORRESPONDENTE;A ALIQ. DE 2.73% NOS TERMOS DO ARTIGO 23 DA LC 123.' }); let handle = ref.alloc('pointer'); const handleBuffer = 1024; const tamanhoBuffer = 200000; try { response = await inicializarNfe(handle); if (response.status !== HttpStatus.NO_CONTENT) { return response; } handle = ref.readPointer(handle, 0, handleBuffer); response = await carregarIniNfe(handle, this.dadosGerados); if (response.status !== HttpStatus.NO_CONTENT) { return response; } response = await assinarNFE(handle); if (response.status !== HttpStatus.NO_CONTENT) { return response; } response = await validarNFE(handle); if (response.status !== HttpStatus.NO_CONTENT) { return response; } response = await obterXmlNfe(handle, tamanhoBuffer); if (response.status !== HttpStatus.OK) { return response; } const xmlObtido = response.data; response = await enviarNfe( handle, tamanhoBuffer, dados.conteudo.identificacao.nNf, dados.conteudo.identificacao.nNf, false, false, false ); if (response.status !== HttpStatus.CREATED) { response = await ultimoRetornoNfe(handle, tamanhoBuffer); return response; } const statusNfe: StatusNotaFiscalEnum = obterStatusNotaFiscal(response.data.cStat); const dataRecebimento = new Date(response.data.dhRecbto); const protocoloAutorizacao = response.data.nProt; const notaFiscalCriada: any = { numero: dados.conteudo.identificacao.nNf, cnpj: dados.conteudo.destinatario.cpfCnpj, nomeEmpresa: dados.conteudo.destinatario.xNome, email: dados.conteudo.destinatario.email, ano: new Date(dataRecebimento).getFullYear(), chave: response.data.chDFe, modelo: dados.conteudo.identificacao.mod, serie: dados.conteudo.identificacao.serie, dataRecebimento, conteudoXml: xmlObtido, status: statusNfe, motivoNaoProcessamento: statusNfe !== StatusNotaFiscalEnum.AUTORIZADA ? response.data.xMotivo : null }; let sendMail = false; if (statusNfe === StatusNotaFiscalEnum.AUTORIZADA) { const mensagemEmail: string = `---AQUI VAI O TEXTO DO EMAIL---`; const dadosEmail: LibNfeEmailModel = { destinatario: dados.conteudo.destinatario.email, conteudoXml: notaFiscalCriada.conteudoXml, isEnviarPdf: true, assunto: 'Emissão de Nota Fiscal', cc: '', anexos: '', mensagem: mensagemEmail }; response = await enviarEmailNfe(handle, dadosEmail); sendMail = response.status !== HttpStatus.TOO_MANY_REQUESTS; } return { status: HttpStatus.CREATED, data: { protocolo: protocoloAutorizacao, notaFiscalCriada, isEmailEnviado: sendMail } }; } catch (err) { return rejeitarPromise(err); } finally { await finalizarNfe(handle); } }
Membros Pro GEW Tecnologia Postado 29 Novembro Autor Membros Pro Postado 29 Novembro A dúvida que ficou é como eu consigo este XML com a sessão <protNFe>, pois eu gero o XML com a função NFE_ObterXml e uso ele para salvar no banco e enviar por email com a função NFE_EnviarEmail, porem só o XML enviado por email tem esta sessão <protNFe>, sendo que usando o console.log tanto no XML da função que salva em banco como na função que envia o email, ambos não possuem a sessão <protNFe> mas o XML que chega no email possui esta sessão. A NFE_EnviarEmail gera esta sessão, como proceder para recuperar este XML correto para salvar no banco?
Membros Pro Solution GEW Tecnologia Postado 29 Novembro Autor Membros Pro Solution Postado 29 Novembro Depois de muito procurar, achei uma solução, após carregar o XML eu executo a função NFE_Consultar, assim o XML retorna com a tag <protNFe> quando chamo a função NFE_SalvarPDF
Moderadores Juliomar Marchetti Postado 29 Novembro Moderadores Postado 29 Novembro 1 hora atrás, GEW Tecnologia disse: Depois de muito procurar, achei uma solução, após carregar o XML eu executo a função NFE_Consultar, assim o XML retorna com a tag <protNFe> quando chamo a função NFE_SalvarPDF Nesse caso quer dizer que tu não está pegando xml completo e guardando após a emissão dele no sefaz. senão me engano após o comando enviar de emissão tu tem que exectar o NFE_ObterXML Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Recommended Posts