Ir para conteúdo
  • Cadastre-se

dev botao

Recommended Posts

  • Membros Pro
Postado

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
Postado

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.

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(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
Postado

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
Postado

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
Postado

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

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...