UNPKG

facturacionelectronicapy-xmlgen

Version:

API Node JS para generar el archivo XML del Documento electrónico exigido por SIFEN en base a JSON

490 lines 43.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const StringUtil_service_1 = __importDefault(require("./StringUtil.service")); const constants_service_1 = __importDefault(require("./constants.service")); class JSonDteItemValidateService { constructor() { this.errors = new Array(); } /** * E8. Campos que describen los ítems de la operación (E700-E899) * * @param params * @param data * @param options */ generateDatosItemsOperacionValidate(params, data, config, errors) { var _a, _b, _c, _d, _e; this.errors = errors; const regExpOnlyNumber = new RegExp(/^\d+$/); const jsonResult = []; //Recorrer array de items e informar en el JSON if (data['items'] && data['items'].length > 0) { for (let i = 0; i < data['items'].length; i++) { const item = data['items'][i]; let unidadMedida = +item['unidadMedida']; //Validaciones if (!((item['codigo'] + '').length >= 1 && (item['codigo'] + '').length <= 50)) { this.errors.push('El código del item (' + item['codigo'] + ') en data.items[' + i + '].codigo debe tener una longitud de 1 a 50 caracteres'); } if (!item['ncm']) { //this.errors.push('La descripción del item en data.items[' + i + '].ncm no puede ser null'); } else { if (!(item['ncm'].length >= 6 && item['ncm'].length <= 8)) { this.errors.push('El valor del campo NCM (' + item['ncm'] + ') en data.items[' + i + '].ncm debe tener una longitud de 6 a 8 caracteres'); } } if (constants_service_1.default.unidadesMedidas.filter((um) => um.codigo === +unidadMedida).length == 0) { this.errors.push("Unidad de Medida '" + unidadMedida + "' en data.items[" + i + '].unidadMedida no encontrado. Valores: ' + constants_service_1.default.unidadesMedidas.map((a) => a.codigo + '-' + a.descripcion.trim())); } if (data['tipoDocumento'] === 7) { if (!item['tolerancia']) { /*this.errors.push( 'La Tolerancia es opcional para el Tipo de Documento = 7 en data.items[' + i + '].tolerancia', );*/ //No es obligatorio } else { //Si tiene tolerancia, entonces valida if (constants_service_1.default.relevanciasMercaderias.filter((um) => um.codigo === +item['tolerancia']).length == 0) { this.errors.push("Tolerancia de Mercaderia '" + item['tolerancia'] + "' en data.items[" + i + '].tolerancia no encontrado. Valores: ' + constants_service_1.default.relevanciasMercaderias.map((a) => a.codigo + '-' + a.descripcion)); } if (!(item['toleranciaCantidad'] && item['toleranciaPorcentaje'])) { this.errors.push('La Tolerancia require especificar la cantidad y porcentaje de quiebra o merma en data.items[' + i + '].toleranciaCantidad y data.items[' + i + '].toleranciaPorcenaje'); } } } let regexp = new RegExp('<[^>]*>'); //HTML/XML TAGS if (!item['descripcion']) { this.errors.push('La descripción del item en data.items[' + i + '].descripcion no puede ser null'); } else { if (!((item['descripcion'] + '').length >= 1 && (item['descripcion'] + '').length <= 2000)) { this.errors.push('La descripción del item (' + item['descripcion'] + ') en data.items[' + i + '].descripcion debe tener una longitud de 1 a 2000 caracteres'); } if (regexp.test(item['descripcion'])) { this.errors.push('La descripción del item (' + item['descripcion'] + ') en data.items[' + i + '].descripcion contiene valores inválidos'); } } if (((_a = (item['cantidad'] + '').split('.')[1]) === null || _a === void 0 ? void 0 : _a.length) > 8) { this.errors.push('La Cantidad del item "' + item['cantidad'] + '" en data.items[' + i + '].cantidad, no puede contener mas de 8 decimales'); } if (data.moneda == 'PYG') { /*if ((item['precioUnitario'] + '').split('.')[1]?.length > (config.pygDecimals || 0)) { this.errors.push( 'El Precio Unitario del item "' + item['precioUnitario'] + '" en "PYG" en data.items[' + i + '].precioUnitario, no puede contener mas de ' + (config.pygDecimals || 0) + ' decimales', ); }*/ if (((_b = (item['precioUnitario'] + '').split('.')[1]) === null || _b === void 0 ? void 0 : _b.length) > 8) { this.errors.push('El Precio Unitario del item "' + item['precioUnitario'] + '" en "PYG" en data.items[' + i + '].precioUnitario, no puede contener más de 8 decimales'); } } else { if (((_c = (item['precioUnitario'] + '').split('.')[1]) === null || _c === void 0 ? void 0 : _c.length) > 8) { this.errors.push('El Precio Unitario del item "' + item['precioUnitario'] + '" en data.items[' + i + '].precioUnitario, no puede contener más de 8 decimales'); } } if (data.moneda == 'PYG') { /*if ((item['descuento'] + '').split('.')[1]?.length > (config.pygDecimals || 0)) { this.errors.push( 'El Descuento del item "' + item['descuento'] + '" en "PYG" en data.items[' + i + '].descuento, no puede contener mas de ' + (config.pygDecimals || 0) + ' decimales', ); }*/ if (((_d = (item['descuento'] + '').split('.')[1]) === null || _d === void 0 ? void 0 : _d.length) > 8) { this.errors.push('El Descuento del item "' + item['descuento'] + '" en "PYG" en data.items[' + i + '].descuento, no puede contener más de 8 decimales'); } } else { if (((_e = (item['descuento'] + '').split('.')[1]) === null || _e === void 0 ? void 0 : _e.length) > 8) { this.errors.push('El Descuento del item "' + item['descuento'] + '" en data.items[' + i + '].descuento, no puede contener más de 8 decimales'); } } //se comenta por que este tien problemas con los decimales regExpOnlyNumber /*if ( !(item['cantidad'] != null && (item['cantidad'] + '').length > 0 && regExpOnlyNumber.test(item['cantidad'])) ) { this.errors.push('Debe especificar la cantidad del item en data.items[' + i + '].cantidad'); } else {*/ if (+item['cantidad'] <= 0) { this.errors.push('La cantidad del item en data.items[' + i + '].cantidad debe ser mayor a cero'); } //} /*if ( !( item['precioUnitario'] != null && (item['precioUnitario'] + '').length > 0 && regExpOnlyNumber.test(item['precioUnitario']) ) ) { this.errors.push('Debe especificar la precio unitario del item en data.items[' + i + '].precioUnitario'); } else {*/ if (+item['precioUnitario'] < 0) { this.errors.push('El precio unitario del item en data.items[' + i + '].precioUnitario debe ser mayor o igual a cero'); } //} if (item['descuento']) { if (+item['descuento'] < 0) { this.errors.push('El Descuento del item en data.items[' + i + '].descuento debe ser mayor o igual Anticipo cero'); } } if (item['anticipo']) { if (+item['anticipo'] < 0) { this.errors.push('El Anticipo del item en data.items[' + i + '].anticipo debe ser mayor o igual a cero'); } } if (item['cambio']) { if (+item['cambio'] < 0) { this.errors.push('El Cambio del item en data.items[' + i + '].cambio debe ser mayor o igual a cero'); } } if (item['cdcAnticipo']) { if (item['cdcAnticipo'].length != 44) { this.errors.push('El Valor (' + item['cdcAnticipo'] + ') del CDC del Anticipo en data.items[' + i + '].cdcAnticipo debe tener 44 caracteres'); } } if (item['pais']) { if (constants_service_1.default.paises.filter((pais) => pais.codigo === item['pais']).length == 0) { this.errors.push("Pais '" + item['pais'] + "' del Producto en data.items[" + i + '].pais no encontrado. Valores: ' + constants_service_1.default.paises.map((a) => a.codigo + '-' + a.descripcion)); } } if (item['observacion'] && (item['observacion'] + '').trim().length > 0) { if (!((item['observacion'] + '').trim().length >= 1 && (item['observacion'] + '').trim().length <= 500)) { this.errors.push('La observación del item (' + item['observacion'] + ') en data.items[' + i + '].observacion debe tener una longitud de 1 a 500 caracteres'); } if (regexp.test(item['observacion'])) { this.errors.push('La observación del item (' + item['observacion'] + ') en data.items[' + i + '].observacion contiene valores inválidos'); } } //Tratamiento E719. Tiene relacion con generateDatosGeneralesInherentesOperacion if (data['tipoDocumento'] == 1 || data['tipoDocumento'] == 4) { if (data['tipoTransaccion'] !== 9) { /*if (data['documentoAsociado'] != null && tiene que ser tipo 9) { if (!item['cdcAnticipo']) { this.errors.push('Debe informar data.items*.cdcAnticipo'); } }*/ } } if (data['tipoDocumento'] != 7) { //Oblitatorio informar this.generateDatosItemsOperacionDescuentoAnticipoValorTotalValidate(params, data, item, i); } if (data['tipoImpuesto'] == 1 || data['tipoImpuesto'] == 3 || data['tipoImpuesto'] == 4 || data['tipoImpuesto'] == 5) { if (data['tipoDocumento'] != 4 && data['tipoDocumento'] != 7) { this.generateDatosItemsOperacionIVAValidate(params, data, item, i); } } //Rastreo if (item['lote'] || item['vencimiento'] || item['numeroSerie'] || item['numeroPedido'] || item['numeroSeguimiento']) { this.generateDatosItemsOperacionRastreoMercaderiasValidate(params, data, item, i); } //Automotores if (item['sectorAutomotor'] && item['sectorAutomotor']['tipo']) { this.generateDatosItemsOperacionSectorAutomotoresValidate(params, data, item, i); } if (data['cliente']['tipoOperacion'] && data['cliente']['tipoOperacion'] === 3) { if (!item['dncp']) { this.errors.push('Debe especificar los datos de la DNCP en ' + 'data.items[' + i + '].dncp para el tipo de operación 3-B2G'); } else { if (!(item['dncp']['codigoNivelGeneral'] && (item['dncp']['codigoNivelGeneral'] + '').length > 0 && (item['dncp']['codigoNivelGeneral'] + '').length <= 8)) { this.errors.push('Debe especificar los datos de la DNCP en ' + 'data.items[' + i + '].dncp.codigoNivelGeneral (hasta 8 digitos) para el tipo de operación 3-B2G'); } else { item['dncp']['codigoNivelGeneral'] = StringUtil_service_1.default.leftZero(item['dncp']['codigoNivelGeneral'], 8); } if (!(item['dncp']['codigoNivelEspecifico'] && (item['dncp']['codigoNivelEspecifico'] + '').length >= 3 && (item['dncp']['codigoNivelEspecifico'] + '').length <= 4)) { this.errors.push('Debe especificar los datos de la DNCP en ' + 'data.items[' + i + '].dncp.codigoNivelEspecifico (3 o 4 digitos) para el tipo de operación 3-B2G'); } else { //item['dncp']['codigoNivelEspecifico'] = stringUtilService.leftZero( item['dncp']['codigoNivelEspecifico'], 8); } } } } //end-for } return this.errors; } /** * E8.1.1 Campos que describen los descuentos, anticipos y valor total por ítem (EA001-EA050) * * @param params * @param data * @param options * @param items Es el item actual del array de items de "data" que se está iterando */ generateDatosItemsOperacionDescuentoAnticipoValorTotalValidate(params, data, item, i) { const jsonResult = {}; if (item['descuento'] && +item['descuento'] > 0) { //Validar que si el descuento es mayor al precio if (+item['descuento'] > +item['precioUnitario']) { this.errors.push("Descuento '" + item['descuento'] + "' del Producto en data.items[" + i + "].descuento supera al Precio Unitario '" + item['precioUnitario']); } /* if (+item['descuento'] == +item['precioUnitario']) { //Validar IVA //Quiere decir que no va a ir nada en exenta, gravada5 y gravada10, para este item. if (item['ivaTipo'] != 3) { this.errors.push( 'Descuento igual a Precio Unitario corresponde tener Tipo de Iva = 3-Exento en data.items[' + i + '].ivaTipo', ); } }*/ } } /** * E8.2. Campos que describen el IVA de la operación por ítem (E730-E739) * * @param params * @param data * @param options * @param items Es el item actual del array de items de "data" que se está iterando */ generateDatosItemsOperacionIVAValidate(params, data, item, i) { if (constants_service_1.default.codigosAfectaciones.filter((um) => um.codigo === +item['ivaTipo']).length == 0) { this.errors.push("Tipo de IVA '" + item['ivaTipo'] + "' en data.items[" + i + '].ivaTipo no encontrado. Valores: ' + constants_service_1.default.codigosAfectaciones.map((a) => a.codigo + '-' + a.descripcion)); } if (item['ivaTipo'] == 1) { if (item['ivaBase'] != 100) { this.errors.push('Valor de "ivaBase"=' + item['ivaBase'] + ' debe ser igual a 100 para "ivaTipo" = 1 en data.items[' + i + '].ivaBase'); } } if (item['ivaTipo'] == 2 || item['ivaTipo'] == 3) { //Exento if (item['ivaBase'] != 0) { this.errors.push('Valor de "ivaBase"=' + item['ivaBase'] + ' debe ser igual a 0 para "ivaTipo" = ' + item['ivaTipo'] + ' en data.items[' + i + '].ivaBase'); } if (item['iva'] != 0) { this.errors.push('Valor de "iva"=' + item['iva'] + ' debe ser igual a 0 para "ivaTipo" = ' + item['ivaTipo'] + ' en data.items[' + i + '].iva'); } } if (item['iva'] == 0) { if (item['ivaTipo'] != 2 && item['ivaTipo'] != 3) { this.errors.push('"Iva" = 0 no se admite para "ivaTipo"=' + item['ivaTipo'] + ' proporcionado en data.items[' + i + '].iva'); } } if (item['iva'] == 5) { if (item['ivaTipo'] != 1 && item['ivaTipo'] != 4) { this.errors.push('"Iva" = 5 no se admite para "ivaTipo"=' + item['ivaTipo'] + ' proporcionado en data.items[' + i + '].iva'); } } if (item['iva'] == 10) { if (item['ivaTipo'] != 1 && item['ivaTipo'] != 4) { this.errors.push('"Iva" = 10 no se admite para "ivaTipo"=' + item['ivaTipo'] + ' proporcionado en data.items[' + i + '].iva'); } } if (!(item['iva'] == 0 || item['iva'] == 5 || item['iva'] == 10)) { this.errors.push('Valor invalido "iva"=' + item['iva'] + ' proporcionado en data.items[' + i + '].iva'); } if (!(item['ivaBase'] >= 0 && item['ivaBase'] <= 100)) { this.errors.push('Valor invalido "ivaBase"=' + item['iva'] + ' proporcionado en data.items[' + i + '].ivaBase'); } } /** * E8.4. Grupo de rastreo de la mercadería (E750-E760) * * @param params * @param data * @param options * @param items Es el item actual del array de items de "data" que se está iterando */ generateDatosItemsOperacionRastreoMercaderiasValidate(params, data, item, i) { let regexpXMLHTML = new RegExp('<[^>]*>'); //HTML/XML TAGS if (item['registroEntidadComercial'] && (item['registroEntidadComercial'] + '').trim().length > 0) { if (!((item['registroEntidadComercial'] + '').trim().length >= 1 && (item['registroEntidadComercial'] + '').trim().length <= 20)) { this.errors.push('El Número de Registro de la Entidad Comercial del item (' + item['registroEntidadComercial'] + ') en data.items[' + i + '].registroEntidadComercial debe tener una longitud entre 1 y 20 caracteres'); } if (regexpXMLHTML.test(item['registroEntidadComercial'])) { this.errors.push('El Número de Registro de la Entidad Comercial del item (' + item['registroEntidadComercial'] + ') en data.items[' + i + '].registroEntidadComercial contiene valores inválidos'); } } } /** * E8.5. Sector de automotores nuevos y usados (E770-E789) * * @param params * @param data * @param options * @param items Es el item actual del array de items de "data" que se está iterando */ generateDatosItemsOperacionSectorAutomotoresValidate(params, data, item, i) { if (!item['sectorAutomotor']) { //Como no indica que este campo es obligatorio, si no se informa sale con vacio return null; } if (constants_service_1.default.tiposOperacionesVehiculos.filter((um) => um.codigo === item['sectorAutomotor']['tipo']).length == 0) { this.errors.push("Tipo de Operación de Venta de Automotor '" + item['sectorAutomotor']['tipo'] + "' en data.items[" + i + '].sectorAutomotor.tipo no encontrado. Valores: ' + constants_service_1.default.tiposOperacionesVehiculos.map((a) => a.codigo + '-' + a.descripcion)); } if (constants_service_1.default.tiposCombustibles.filter((um) => um.codigo === item['sectorAutomotor']['tipoCombustible']) .length == 0) { this.errors.push("Tipo de Combustible '" + item['sectorAutomotor']['tipoCombustible'] + "' en data.items[" + i + '].sectorAutomotor.tipoCombustible no encontrado. Valores: ' + constants_service_1.default.tiposCombustibles.map((a) => a.codigo + '-' + a.descripcion)); } if (item['sectorAutomotor']['chasis']) { if (item['sectorAutomotor']['chasis'].length != 17) { this.errors.push("El Chassis '" + item['sectorAutomotor']['chasis'] + "' en data.items[" + i + '] debe tener 17 caracteres'); } } if (item['sectorAutomotor']['cilindradas']) { if ((item['sectorAutomotor']['cilindradas'] + '').length != 4) { this.errors.push("La Cilindradas '" + item['sectorAutomotor']['cilindradas'] + "' en data.items[" + i + '] debe tener 4 caracteres'); } } } } exports.default = new JSonDteItemValidateService(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkR0ZUl0ZW1WYWxpZGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2pzb25EdGVJdGVtVmFsaWRhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDhFQUFxRDtBQUNyRCw0RUFBbUQ7QUFHbkQsTUFBTSwwQkFBMEI7SUFHOUI7UUFDRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1DQUFtQyxDQUFDLE1BQVcsRUFBRSxJQUFTLEVBQUUsTUFBb0IsRUFBRSxNQUFxQjs7UUFDNUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3QyxNQUFNLFVBQVUsR0FBUSxFQUFFLENBQUM7UUFFM0IsK0NBQStDO1FBQy9DLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM3QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTlCLElBQUksWUFBWSxHQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUVqRCxjQUFjO2dCQUNkLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENB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