UNPKG

facturacionelectronicapy-recibo-xmlgen

Version:

API Node JS para generar el archivo XML del Recibo similar al exigido por la SET en base a JSON

524 lines 47.4 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const xml2js = __importStar(require("xml2js")); const FechaUtil_service_1 = __importDefault(require("./FechaUtil.service")); const Constante_service_1 = __importDefault(require("./Constante.service")); const StringUtil_service_1 = __importDefault(require("./StringUtil.service")); class JSonEventoMainService { constructor() { this.codigoSeguridad = null; this.codigoControl = null; this.json = {}; } /*public generateXMLEvento(params: any, data: any): Promise<any> { return new Promise((resolve, reject) => { try { resolve(this.generateXMLEventoService(params, data)); } catch (error) { reject(error); } }); }*/ generateXMLEventoCancelacion(id, params, data) { data.tipoEvento = 1; //Cancelacion return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { try { let xml = yield this.generateXMLEventoService(params, data); xml = xml.replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>', ''); /*let soapXMLData = `<?xml version="1.0" encoding="UTF-8" standalone="no"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">\n\ <env:Header/>\n\ <env:Body>\n\ <rEnviEventoDe xmlns="http://ekuatia.set.gov.py/sifen/xsd">\n\ <dId>${id}</dId>\n\ <dEvReg>${xml}</dEvReg>\n\ </rEnviEventoDe>\n\ </env:Body>\n\ </env:Envelope>\n`;*/ let soapXMLData = this.envelopeEvent(id, xml); resolve(soapXMLData); } catch (error) { reject(error); } })); } generateXMLEventoInutilizacion(id, params, data) { data.tipoEvento = 2; //Inutilizacion return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { try { let xml = yield this.generateXMLEventoService(params, data); xml = xml.replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>', ''); /*let soapXMLData = `<?xml version="1.0" encoding="UTF-8" standalone="no"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">\n\ <env:Header/>\n\ <env:Body>\n\ <rEnviEventoDe xmlns="http://ekuatia.set.gov.py/sifen/xsd">\n\ <dId>${id}</dId>\n\ <dEvReg>${xml}</dEvReg>\n\ </rEnviEventoDe>\n\ </env:Body>\n\ </env:Envelope>\n`; */ let soapXMLData = this.envelopeEvent(id, xml); resolve(soapXMLData); } catch (error) { reject(error); } })); } generateXMLEventoConformidad(id, params, data) { data.tipoEvento = 11; //Conformidad return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { try { let xml = yield this.generateXMLEventoService(params, data); xml = xml.replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>', ''); let soapXMLData = this.envelopeEvent(id, xml); resolve(soapXMLData); } catch (error) { reject(error); } })); } generateXMLEventoDisconformidad(id, params, data) { data.tipoEvento = 12; //Disconformidad return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { try { let xml = yield this.generateXMLEventoService(params, data); xml = xml.replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>', ''); let soapXMLData = this.envelopeEvent(id, xml); resolve(soapXMLData); } catch (error) { reject(error); } })); } generateXMLEventoDesconocimiento(id, params, data) { data.tipoEvento = 13; //Desconocimiento return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { try { let xml = yield this.generateXMLEventoService(params, data); xml = xml.replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>', ''); let soapXMLData = this.envelopeEvent(id, xml); resolve(soapXMLData); } catch (error) { reject(error); } })); } generateXMLEventoNotificacion(id, params, data) { data.tipoEvento = 14; //Notificacion return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { try { let xml = yield this.generateXMLEventoService(params, data); xml = xml.replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>', ''); let soapXMLData = this.envelopeEvent(id, xml); resolve(soapXMLData); } catch (error) { reject(error); } })); } envelopeEvent(id, xml) { return `<?xml version="1.0" encoding="UTF-8" standalone="no"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">\n\ <env:Header/>\n\ <env:Body>\n\ <rEnviEventoDe xmlns="http://ekuatia.set.gov.py/sifen/xsd">\n\ <dId>${id}</dId>\n\ <dEvReg>${xml}</dEvReg>\n\ </rEnviEventoDe>\n\ </env:Body>\n\ </env:Envelope>\n`; } /** * Metodo principal de generacion de XML del Evento * @param params * @param data * @returns */ generateXMLEventoService(params, data) { this.addUnderscore(data); this.validateValues(data); this.addDefaultValues(data); this.json = {}; //this.generateCodigoSeguridad(params, data); //Primero genera el codigo de seguridad aleatorio único //this.generateCodigoControl(params, data); //Luego genera el código de Control //this.generateRte(params); this.json['gGroupGesEve'] = {}; this.json['gGroupGesEve']['rGesEve'] = {}; this.json['gGroupGesEve']['$'] = {}; this.json['gGroupGesEve']['$']['xmlns:xsi'] = 'http://www.w3.org/2001/XMLSchema-instance'; this.json['gGroupGesEve']['$']['xsi:schemaLocation'] = 'http://ekuatia.set.gov.py/sifen/xsd siRecepEvento_v150.xsd'; this.json['gGroupGesEve']['rGesEve']['rEve'] = {}; this.json['gGroupGesEve']['rGesEve']['rEve']['$'] = {}; this.json['gGroupGesEve']['rGesEve']['rEve']['$']['Id'] = 1; this.json['gGroupGesEve']['rGesEve']['rEve']['dFecFirma'] = FechaUtil_service_1.default.convertToJSONFormat(new Date()); this.json['gGroupGesEve']['rGesEve']['rEve']['dVerFor'] = params.version; this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = {}; //Emisor if (data.tipoEvento == 1) { this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = this.eventosEmisorCancelacion(params, data); } if (data.tipoEvento == 2) { this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = this.eventosEmisorInutilizacion(params, data); } //if (data.tipoEvento == 3) { //this.json['gGroupGesEve']['rGesEve']['gGroupTiEvt'] = this.eventos(params, data); //} //Receptor (empieza en 11) if (data.tipoEvento == 11) { this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = this.eventosReceptorConformidad(params, data); } if (data.tipoEvento == 12) { this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = this.eventosReceptorDisconformidad(params, data); } if (data.tipoEvento == 13) { this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = this.eventosReceptorDesconocimiento(params, data); } if (data.tipoEvento == 14) { this.json['gGroupGesEve']['rGesEve']['rEve']['gGroupTiEvt'] = this.eventosReceptorNotificacionRecepcion(params, data); } var builder = new xml2js.Builder({ xmldec: { version: '1.0', encoding: 'UTF-8', standalone: false, }, }); var xml = builder.buildObject(this.json); return this.normalizeXML(xml); //Para firmar tiene que estar normalizado } /** * Valida los datos ingresados en el data del req.body * @param data */ validateValues(data) { } /** * Añade algunos valores por defecto al JSON de entrada, valido para * todas las operaciones * @param data */ addDefaultValues(data) { /*if (constanteService.tiposEventos.filter((um) => um.codigo === data['tipoEvento']).length == 0) { throw ( new Error("Tipo de Evento '" + data['tipoEvento']) + "' en data.tipoEvento no válido. Valores: " + constanteService.tiposEventos.map((a) => a.codigo + '-' + a.descripcion + ' ') ); } data['tipoEventoDescripcion'] = constanteService.tiposEventos.filter((td) => td.codigo == data['tipoEvento'])[0][ 'descripcion' ];*/ } /** * Si los valores vienen en underscore, crea los valores en formato variableJava que * sera utilizado dentro del proceso, * * Ej. si viene tipo_documento crea una variable tipoDocumento, con el mismo valor. * * @param data */ addUnderscore(data) { if (data.tipo_documento) { data.tipoDocumento = data.tipo_documento; } if (data.tipo_evento) { data.tipoEvento = data.tipo_evento; } } eventosEmisorCancelacion(params, data) { if (!data['cdc']) { throw new Error('Debe proporcionar el CDC en data.cdc'); } if (!(data['cdc'].length == 44)) { throw new Error('El CDC en data.cdc debe tener 44 caracteres'); } if (!data['motivo']) { throw new Error('Debe proporcionar el Motivo de la Cancelación en data.motivo'); } if (!((data['motivo'] + '').length >= 5 && (data['motivo'] + '').length <= 500)) { throw new Error('El Motivo de la Cancelación en data.motivo debe contener de [5-500] caracteres'); } const jsonResult = {}; jsonResult['rGeVeCan'] = { Id: data['cdc'], mOtEve: data['motivo'], }; return jsonResult; } eventosEmisorInutilizacion(params, data) { if (!data['timbrado']) { throw new Error('Falta el Timbrado en data.timbrado'); } if (!data['establecimiento']) { throw new Error('Falta el Establecimiento en data.establecimiento'); } if (new String(data['establecimiento']).length != 3) { throw new Error('El establecimiento debe tener una longitud de 3 caracteres'); } if (!data['punto']) { throw new Error('Falta el Punto en data.punto'); } if (new String(data['punto']).length != 3) { throw new Error('El punto debe tener una longitud de 3 caracteres'); } if (!data['desde']) { throw new Error('Falta el valor inicial Desde en data.desde'); } if (!data['hasta']) { throw new Error('Falta el valor final hasta en data.hasta'); } if (+data['desde'] > +data['hasta']) { throw new Error('El valor inicial en data.desde debe ser inferior o igual al valor final en data.hasta'); } if (!data['tipoDocumento']) { throw new Error('Falta el Tipo de Documento en data.tipoDocumento'); } if (new String(data['timbrado']).length != 8) { throw new Error('El timbrado debe tener una longitud de 8 caracteres'); } if (!data['motivo']) { throw new Error('Falta el Motivo de la Cancelación en data.motivo'); } if (!((data['motivo'] + '').length >= 5 && (data['motivo'] + '').length <= 500)) { throw new Error('El Motivo de la Inutilización en data.motivo debe contener de [5-500] caracteres'); } const jsonResult = {}; jsonResult['rGeVeInu'] = { dNumTim: StringUtil_service_1.default.leftZero(data['timbrado'], 8), dEst: StringUtil_service_1.default.leftZero(data['establecimiento'], 3), dPunExp: StringUtil_service_1.default.leftZero(data['punto'], 3), dNumIn: StringUtil_service_1.default.leftZero(data['desde'], 7), dNumFin: StringUtil_service_1.default.leftZero(data['hasta'], 7), iTiDE: data['tipoDocumento'], mOtEve: data['motivo'], }; return jsonResult; } //--- //--- //--- eventosReceptorConformidad(params, data) { const jsonResult = {}; if (Constante_service_1.default.eventoConformidadTipo.filter((um) => um.codigo === data['tipoConformidad']).length == 0) { throw new Error("Tipo de Conformidad '" + data['tipoConformidad'] + "' en data.tipoConformidad no encontrado. Valores: " + Constante_service_1.default.eventoConformidadTipo.map((a) => a.codigo + '-' + a.descripcion)); } if (!data['cdc']) { throw new Error('Debe proporcionar el CDC en data.cdc'); } if (new String(data['cdc']).length != 44) { throw new Error('El CDC en data.cdc debe tener una longitud de 44 caracteres'); } jsonResult['rGeVeConf'] = { /*$: { , },*/ Id: data['cdc'], iTipConf: data['tipoConformidad'], }; if (data['tipoConformidad'] == 2) { if (!data['fechaRecepcion']) { throw new Error('Obligatorio proporcionar Fecha estimada de recepción en data.fechaRecepcion'); } if (new String(data['fechaRecepcion']).length != 19) { throw new Error('La fecha de recepción debe tener una longitud de 19 caracteres en data.fechaRecepcion'); } jsonResult['rGeVeConf']['dFecRecep'] = data['fechaRecepcion']; } return jsonResult; } eventosReceptorDisconformidad(params, data) { const jsonResult = {}; if (!data['cdc']) { throw new Error('Debe proporcionar el CDC en data.cdc'); } if (!(data['cdc'].length == 44)) { throw new Error('El CDC en data.cdc debe tener 44 caracteres'); } if (!data['motivo']) { throw new Error('Debe proporcionar el Motivo de la Disconformidad en data.motivo'); } if (!((data['motivo'] + '').length >= 5 && (data['motivo'] + '').length <= 500)) { throw new Error('El Motivo de la Disconformidad en data.motivo debe contener de [5-500] caracteres'); } jsonResult['rGeVeDisconf'] = { Id: data['cdc'], mOtEve: data['motivo'], }; return jsonResult; } eventosReceptorDesconocimiento(params, data) { const jsonResult = {}; if (!data['cdc']) { throw new Error('Debe proporcionar el CDC en data.cdc'); } if (!(data['cdc'].length == 44)) { throw new Error('El CDC en data.cdc debe tener 44 caracteres'); } if (!data['motivo']) { throw new Error('Debe proporcionar el Motivo del Desconocimiento en data.motivo'); } if (!((data['motivo'] + '').length >= 5 && (data['motivo'] + '').length <= 500)) { throw new Error('El Motivo del Desconocimiento en data.motivo debe contener de [5-500] caracteres'); } if (Constante_service_1.default.tipoReceptor.filter((um) => um.codigo === +data['tipoReceptor']).length == 0) { throw new Error("Tipo de Receptor '" + data['tipoReceptor'] + "' en data.tipoReceptor no encontrado. Valores: " + Constante_service_1.default.tipoReceptor.map((a) => a.codigo + '-' + a.descripcion)); } if (!data['nombre']) { throw new Error('Debe especificar el Nombre/Razón Social del receptor en data.nombre'); } if (!(data['nombre'].length >= 4)) { throw new Error('El Nombre del Cliente en data.nombre debe tener una longitud mínima de 4 caracteres'); } if (new String(data['fechaRecepcion']).length != 19) { throw new Error('La fecha de emisión debe tener una longitud de 19 caracteres en data.fechaRecepcion'); } if (new String(data['fechaRecepcion']).length != 19) { throw new Error('La fecha de recepción debe tener una longitud de 19 caracteres en data.fechaRecepcion'); } jsonResult['rGeVeDescon'] = { Id: data['cdc'], dFecEmi: data['fechaEmision'], dFecRecep: data['fechaRecepcion'], iTipRec: +data['tipoReceptor'], dNomRec: data['nombre'], }; if (+data['tipoReceptor'] == 1) { if (data['ruc'].indexOf('-') == -1) { throw new Error('RUC del Receptor debe contener dígito verificador en data.ruc'); } const rucEmisor = data['ruc'].split('-')[0]; const dvEmisor = data['ruc'].split('-')[1]; jsonResult['rGeVeDescon']['dRucRec'] = rucEmisor; jsonResult['rGeVeDescon']['dDVRec'] = dvEmisor; } if (+data['tipoReceptor'] == 2) { if (Constante_service_1.default.tiposDocumentosIdentidades.filter((um) => um.codigo === data['documentoTipo']).length == 0) { throw new Error("Tipo de Documento '" + data['documentoTipo'] + "' en data.documentoTipo no encontrado. Valores: " + Constante_service_1.default.tiposDocumentosIdentidades.map((a) => a.codigo + '-' + a.descripcion)); } jsonResult['rGeVeDescon']['dTipIDRec'] = data['documentoTipo']; if (!data['documentoNumero']) { throw new Error('Debe especificar el Número de Documento del receptor en data.documentoNumero'); } jsonResult['rGeVeDescon']['dNumID'] = data['documentoNumero']; } jsonResult['rGeVeDescon']['mOtEve'] = data['motivo']; return jsonResult; } eventosReceptorNotificacionRecepcion(params, data) { const jsonResult = {}; if (!data['cdc']) { throw new Error('Debe proporcionar el CDC en data.cdc'); } if (!(data['cdc'].length == 44)) { throw new Error('El CDC en data.cdc debe tener 44 caracteres'); } if (Constante_service_1.default.tipoReceptor.filter((um) => um.codigo === +data['tipoReceptor']).length == 0) { throw new Error("Tipo de Receptor '" + data['tipoReceptor'] + "' en data.tipoReceptor no encontrado. Valores: " + Constante_service_1.default.tipoReceptor.map((a) => a.codigo + '-' + a.descripcion)); } if (!data['nombre']) { throw new Error('Debe especificar el Nombre/Razón Social del receptor en data.nombre'); } if (!(data['nombre'].length >= 4)) { throw new Error('El Nombre del Cliente en data.nombre debe tener una longitud mínima de 4 caracteres'); } if (new String(data['fechaRecepcion']).length != 19) { throw new Error('La fecha de emisión debe tener una longitud de 19 caracteres en data.fechaRecepcion'); } if (new String(data['fechaRecepcion']).length != 19) { throw new Error('La fecha de recepción debe tener una longitud de 19 caracteres en data.fechaRecepcion'); } jsonResult['rGeVeNotRec'] = { Id: data['cdc'], dFecEmi: data['fechaEmision'], dFecRecep: data['fechaRecepcion'], iTipRec: +data['tipoReceptor'], dNomRec: data['nombre'], }; if (+data['tipoReceptor'] == 1) { if (data['ruc'].indexOf('-') == -1) { throw new Error('RUC del Receptor debe contener dígito verificador en data.ruc'); } const rucEmisor = data['ruc'].split('-')[0]; const dvEmisor = data['ruc'].split('-')[1]; jsonResult['rGeVeNotRec']['dRucRec'] = rucEmisor; jsonResult['rGeVeNotRec']['dDVRec'] = dvEmisor; } if (+data['tipoReceptor'] == 2) { if (Constante_service_1.default.tiposDocumentosIdentidades.filter((um) => um.codigo === data['documentoTipo']).length == 0) { throw new Error("Tipo de Documento '" + data['documentoTipo'] + "' en data.documentoTipo no encontrado. Valores: " + Constante_service_1.default.tiposDocumentosIdentidades.map((a) => a.codigo + '-' + a.descripcion)); } jsonResult['rGeVeNotRec']['dTipIDRec'] = data['documentoTipo']; if (!data['documentoNumero']) { throw new Error('Debe especificar el Número de Documento del receptor en data.documentoNumero'); } jsonResult['rGeVeNotRec']['dNumID'] = data['documentoNumero']; } jsonResult['rGeVeNotRec']['dTotalGs'] = data['totalPYG']; return jsonResult; } normalizeXML(xml) { xml = xml.split('\r\n').join(''); xml = xml.split('\n').join(''); xml = xml.split('\t').join(''); xml = xml.split(' ').join(''); xml = xml.split('> <').join('><'); xml = xml.split('> <').join('><'); xml = xml.replace(/\r?\n|\r/g, ''); return xml; } } exports.default = new JSonEventoMainService(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkV2ZW50b01haW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9qc29uRXZlbnRvTWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyw0RUFBbUQ7QUFDbkQsNEVBQW1EO0FBQ25ELDhFQUFxRDtBQUVyRCxNQUFNLHFCQUFxQjtJQUEzQjtRQUNFLG9CQUFlLEdBQVEsSUFBSSxDQUFDO1FBQzVCLGtCQUFhLEdBQVEsSUFBSSxDQUFDO1FBQzFCLFNBQUksR0FBUSxFQUFFLENBQUM7SUFxa0JqQixDQUFDO0lBbmtCQzs7Ozs7Ozs7T0FRRztJQUVJLDRCQUE0QixDQUFDLEVBQVUsRUFBRSxNQUFXLEVBQUUsSUFBUztRQUNwRSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWE7UUFDbEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFPLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMzQyxJQUFJO2dCQUNGLElBQUksR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDNUQsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsd0RBQXdELEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2hGOzs7Ozs7Ozs7eURBU3lDO2dCQUV6QyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDOUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3RCO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2QsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2Y7UUFDSCxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLDhCQUE4QixDQUFDLEVBQVUsRUFB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