/* * This file is part of Treeunfe DFe. * * Treeunfe DFe is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Treeunfe DFe is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Treeunfe DFe. If not, see . */ import { NFEGerarDanfe } from '@treeunfe/danfe'; import { Environment, GerarConsulta, applyDefaultTmpStoragePaths, logger, SaveFiles, Utility, XmlBuilder, } from '@treeunfe/shared'; import { Cancelamento, CartaDeCorrecao, CienciaDaOperacao, ConfirmacaoDaOperacao, ConsultaCadastroNFe, ConsultaNFe, ConsGTIN, DesconhecimentoDaOperacao, DFePorChaveNFe, DFePorNSU, DFePorUltimoNSU, EPEC, EventoNFe, InutilizacaoData, NFeConfig, NFEGerarDanfeProps, NFe as NFeType, OperacaoNaoRealizada, } from '@treeunfe/types'; import type { AxiosInstance } from 'axios'; import { NFEAutorizacao, NFECancelamento, NFECartaDeCorrecao, NFECienciaDaOperacao, NFEConfirmacaoDaOperacao, NFEConsultaGTIN, NFEConsultaProtocolo, NfeConsultaCadastro, NFEDesconhecimentoDaOperacao, NFEDistribuicaoDFe, NFEDistribuicaoDFePorChave, NFEDistribuicaoDFePorNSU, NFEDistribuicaoDFePorUltNSU, NFEEpec, NFEInutilizacao, NFEOperacaoNaoRealizada, NFERecepcaoEvento, NFEStatusServico, } from '../operations'; import { NFEAutorizacaoService, NFECancelamentoService, NFECartaDeCorrecaoService, NFECienciaDaOperacaoService, NFEConfirmacaoDaOperacaoService, NFEconsultaProtocoloService, NFEConsultaGTINService, NfeConsultaCadastroService, NFEDesconhecimentoDaOperacaoService, NFEDistribuicaoDFePorChaveService, NFEDistribuicaoDFePorNSUService, NFEDistribuicaoDFePorUltNSUService, NFEDistribuicaoDFeService, NFEEpecService, NFEInutilizacaoService, NFEOperacaoNaoRealizadaService, NFERecepcaoEventoService, NFEStatusServicoService, } from '../services'; export default class NFe { private environment: Environment; private axios!: AxiosInstance; private utility!: Utility; private xmlBuilder!: XmlBuilder; private saveFiles!: SaveFiles; private gerarConsulta!: GerarConsulta; private loadEnvironmentPromise: Promise; constructor(config: NFeConfig) { // Valida se a configuração obrigatória foi fornecida if (!config.ambiente || !config.versaoDF) { throw new Error('Configuração NFe incompleta. Por favor, forneça "ambiente" e "versaoDF".'); } const environment = new Environment(applyDefaultTmpStoragePaths(config, 'NFe')); this.environment = environment; // Carrega o environment automaticamente this.loadEnvironmentPromise = (async () => { try { const { axios: axiosInstance } = await environment.loadEnvironment(); this.axios = axiosInstance; this.utility = new Utility(environment); this.saveFiles = new SaveFiles(environment, this.utility); this.xmlBuilder = new XmlBuilder(environment); this.gerarConsulta = new GerarConsulta(environment, this.utility, this.xmlBuilder); } catch (error) { logger.error(``, error, { context: 'NFe_LoadEnvironment' }); throw new Error(`Erro ao inicializar a lib: ${error}`); } })(); } /** * Status Serviço */ async ConsultaStatusServico() { await this.loadEnvironmentPromise; try { const service = new NFEStatusServicoService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFEStatusServico(service); const response = await operation.Exec(); console.log('Retorno NFE_ConsultaStatusServico'); console.log(` ${response.xMotivo}`); console.log('==================================='); return response; } catch (error: any) { logger.error(``, error, { context: 'NFE_ConsultaStatusServico' }); throw new Error(`NFE_ConsultaStatusServico: ${error.message}`); } } /** * Consulta Protocolo */ async ConsultaProtocolo(chave: string) { await this.loadEnvironmentPromise; try { const service = new NFEconsultaProtocoloService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFEConsultaProtocolo(service); const response = await operation.Exec(chave); console.log('Retorno NFE_ConsultaProtocolo'); console.log(` ${response.xMotivo}`); console.log('==================================='); return response; } catch (error: any) { logger.error(``, error, { context: 'NFE_ConsultaProtocolo' }); throw new Error(`NFE_ConsultaProtocolo: ${error.message}`); } } /** * Consulta GTIN */ async ConsultaGTIN(data: ConsGTIN) { await this.loadEnvironmentPromise; try { const service = new NFEConsultaGTINService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFEConsultaGTIN(service); const response = await operation.Exec(data.GTIN); console.log('Retorno NFE_ConsultaGTIN'); console.log(` ${response.xMotivo}`); console.log('==================================='); return response; } catch (error: any) { logger.error(``, error, { context: 'NFE_ConsultaGTIN' }); throw new Error(`NFE_ConsultaGTIN: ${error.message}`); } } /** * Consulta cadastro de contribuinte (consCad 2.00 / CadConsultaCadastro). * A UF do pedido deve ser a mesma da configuração (`UF`), pois define o endpoint SEFAZ. */ async ConsultaCadastro(data: ConsultaCadastroNFe) { await this.loadEnvironmentPromise; try { const service = new NfeConsultaCadastroService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NfeConsultaCadastro(service); const response = await operation.Exec(data); console.log('Retorno NFE_ConsultaCadastro'); const cStat = response?.cStat ?? response?.infCons?.cStat; const msg = response?.xMotivo ?? response?.infCons?.xMotivo; console.log(` cStat=${cStat ?? '?'} — ${msg ?? '(sem xMotivo)'}`); console.log('==================================='); return response; } catch (error: any) { logger.error(``, error, { context: 'NFE_ConsultaCadastro' }); throw new Error(`NFE_ConsultaCadastro: ${error.message}`); } } /** * Recepção de Eventos */ async RecepcaoEvento(evento: EventoNFe) { await this.loadEnvironmentPromise; try { const service = new NFERecepcaoEventoService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFERecepcaoEvento(service); const response = await operation.Exec(evento); console.log('Retorno NFE_RecepcaoEvento'); console.table(response.xMotivos); console.log('==================================='); return response.response; } catch (error: any) { logger.error(``, error, { context: 'NFE_RecepcaoEvento' }); throw new Error(`NFE_RecepcaoEvento: ${error.message}`); } } async EventoPrevioDeEmissaoEmContingencia(evento: EPEC) { await this.loadEnvironmentPromise; try { const service = new NFEEpecService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFEEpec(service); const response = await operation.Exec(evento); console.log('Retorno NFEEpec'); console.table(response.xMotivos); console.log('==================================='); return response.response; } catch (error: any) { logger.error(``, error, { context: 'NFE_EventoPrevioDeEmissaoEmContingencia' }); throw new Error(`NFEEpec: ${error.message}`); } } async Cancelamento(evento: Cancelamento) { await this.loadEnvironmentPromise; try { const service = new NFECancelamentoService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFECancelamento(service); const response = await operation.Exec(evento); console.log('Retorno NFE_Cancelamento'); console.table(response.xMotivos); console.log('==================================='); return response.response; } catch (error: any) { logger.error(``, error, { context: 'NFE_Cancelamento' }); throw new Error(`NFE_Cancelamento: ${error.message}`); } } async CienciaDaOperacao(evento: CienciaDaOperacao) { await this.loadEnvironmentPromise; try { const service = new NFECienciaDaOperacaoService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFECienciaDaOperacao(service); const response = await operation.Exec(evento); console.log('Retorno NFE_CienciaDaOperacao'); console.table(response.xMotivos); console.log('==================================='); return response.response; } catch (error: any) { logger.error(``, error, { context: 'NFE_CienciaDaOperacao' }); throw new Error(`NFE_CienciaDaOperacao: ${error.message}`); } } async ConfirmacaoDaOperacao(evento: ConfirmacaoDaOperacao) { await this.loadEnvironmentPromise; try { const service = new NFEConfirmacaoDaOperacaoService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFEConfirmacaoDaOperacao(service); const response = await operation.Exec(evento); console.log('Retorno NFE_ConfirmacaoDaOperacao'); console.table(response.xMotivos); console.log('==================================='); return response.response; } catch (error: any) { logger.error(``, error, { context: 'NFE_ConfirmacaoDaOperacao' }); throw new Error(`NFE_ConfirmacaoDaOperacao: ${error.message}`); } } async OperacaoNaoRealizada(evento: OperacaoNaoRealizada) { await this.loadEnvironmentPromise; try { const service = new NFEOperacaoNaoRealizadaService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFEOperacaoNaoRealizada(service); const response = await operation.Exec(evento); console.log('Retorno NFE_OperacaoNaoRealizada'); console.table(response.xMotivos); console.log('==================================='); return response.response; } catch (error: any) { logger.error(``, error, { context: 'NFE_OperacaoNaoRealizada' }); throw new Error(`NFE_OperacaoNaoRealizada: ${error.message}`); } } async CartaDeCorrecao(evento: CartaDeCorrecao) { await this.loadEnvironmentPromise; try { const service = new NFECartaDeCorrecaoService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFECartaDeCorrecao(service); const response = await operation.Exec(evento); console.log('Retorno NFE_CartaDeCorrecao'); console.table(response.xMotivos); console.log('==================================='); return response.response; } catch (error: any) { logger.error(``, error, { context: 'NFE_CartaDeCorrecao' }); throw new Error(`NFE_CartaDeCorrecao: ${error.message}`); } } async DesconhecimentoDaOperacao(evento: DesconhecimentoDaOperacao) { await this.loadEnvironmentPromise; try { const service = new NFEDesconhecimentoDaOperacaoService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFEDesconhecimentoDaOperacao(service); const response = await operation.Exec(evento); console.log('Retorno NFE_DesconhecimentoDaOperacao'); console.table(response.xMotivos); console.log('==================================='); return response.response; } catch (error: any) { logger.error(``, error, { context: 'NFE_DesconhecimentoDaOperacao' }); throw new Error(`NFE_DesconhecimentoDaOperacao: ${error.message}`); } } /** * Distribuição DFe */ async DistribuicaoDFe(data: ConsultaNFe) { await this.loadEnvironmentPromise; try { const service = new NFEDistribuicaoDFeService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFEDistribuicaoDFe(service); const response = await operation.Exec(data); console.log('Retorno NFE_DistribuicaoDFe'); console.log(` ${response.xMotivo}`); console.log('==================================='); return response.data; } catch (error: any) { logger.error(``, error, { context: 'NFE_DistribuicaoDFe' }); throw new Error(`NFE_DistribuicaoDFe: ${error.message}`); } } async DistribuicaoDFePorUltNSU(data: DFePorUltimoNSU) { await this.loadEnvironmentPromise; try { const service = new NFEDistribuicaoDFePorUltNSUService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFEDistribuicaoDFePorUltNSU(service); const response = await operation.Exec(data); console.log('Retorno NFE_DistribuicaoDFePorUltNSU'); console.log(` ${response.xMotivo}`); console.log('==================================='); return response.data; } catch (error: any) { logger.error(``, error, { context: 'NFE_DistribuicaoDFePorUltNSU' }); throw new Error(`NFE_DistribuicaoDFePorUltNSU: ${error.message}`); } } async DistribuicaoDFePorNSU(data: DFePorNSU) { await this.loadEnvironmentPromise; try { const service = new NFEDistribuicaoDFePorNSUService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFEDistribuicaoDFePorNSU(service); const response = await operation.Exec(data); console.log('Retorno NFE_DistribuicaoDFePorNSU'); console.log(` ${response.xMotivo}`); console.log('==================================='); return response.data; } catch (error: any) { logger.error(``, error, { context: 'NFE_DistribuicaoDFePorNSU' }); throw new Error(`NFE_DistribuicaoDFePorNSU: ${error.message}`); } } async DistribuicaoDFePorChave(data: DFePorChaveNFe) { await this.loadEnvironmentPromise; try { const service = new NFEDistribuicaoDFePorChaveService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFEDistribuicaoDFePorChave(service); const response = await operation.Exec(data); console.log('Retorno NFE_DistribuicaoDFePorChave'); console.log(` ${response.xMotivo}`); console.log('==================================='); return response.data; } catch (error: any) { logger.error(``, error, { context: 'NFE_DistribuicaoDFePorChave' }); throw new Error(`NFE_DistribuicaoDFePorChave: ${error.message}`); } } /** * Autorização */ async Autorizacao(data: NFeType) { await this.loadEnvironmentPromise; try { const service = new NFEAutorizacaoService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFEAutorizacao(service); const response = await operation.Exec(data); console.log('Retorno NFE_Autorizacao'); console.table(response.xMotivo); console.log('==================================='); return response.xmls; } catch (error: any) { logger.error(``, error, { context: 'NFE_Autorizacao' }); throw new Error(`NFE_Autorizacao: ${error.message}`); } } /** * Inutilização */ async Inutilizacao(data: InutilizacaoData) { await this.loadEnvironmentPromise; try { const service = new NFEInutilizacaoService(this.environment, this.utility, this.xmlBuilder, this.axios, this.saveFiles, this.gerarConsulta); const operation = new NFEInutilizacao(service); const response = await operation.Exec(data); console.log('Retorno NFE_Inutilizacao'); console.log(` ${response.xMotivo}`); console.log('==================================='); return response; } catch (error: any) { logger.error(``, error, { context: 'NFE_Inutilizacao' }); throw new Error(`NFE_Inutilizacao: ${error.message}`); } } /** * DANFE */ async GerarDanfe(data: NFEGerarDanfeProps) { await this.loadEnvironmentPromise; try { const { exibirMarcaDaguaDanfe } = this.environment.getConfig(); const danfe = new NFEGerarDanfe(data); const response = await danfe.generatePDF(exibirMarcaDaguaDanfe); console.log('Retorno NFE_GerarDanfe'); console.log(response.message); console.log('==================================='); return response; } catch (error: any) { logger.error(``, error, { context: 'NFE_GerarDanfe' }); throw new Error(`NFE_GerarDanfe: ${error.message}`); } } }