facturacionelectronicapy-recibo-xmlgen
Version:
API Node JS para generar el archivo XML del Recibo similar al exigido por la SET en base a JSON
296 lines • 27.1 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const Constante_service_1 = __importDefault(require("./Constante.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;
this.errors = errors;
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 (Constante_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: ' +
Constante_service_1.default.unidadesMedidas.map((a) => a.codigo + '-' + a.descripcion.trim()));
}
if (data['tipoDocumento'] === 7) {
if (!item['tolerancia']) {
this.errors.push('La Tolerancia es obligatoria para el Tipo de Documento = 7 en data.items[' + i + '].tolerancia');
}
if (Constante_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: ' +
Constante_service_1.default.relevanciasMercaderias.map((a) => a.codigo + '-' + a.descripcion));
}
}
if (!item['descripcion']) {
this.errors.push('La descripción del item en data.items[' + i + '].descripcion no puede ser null');
}
if (!(item['descripcion'].length >= 1 && item['descripcion'].length <= 120)) {
this.errors.push('La descripción del item (' +
item['descripcion'] +
') en data.items[' +
i +
'].descripcion debe tener una longitud de 1 a 120 caracteres');
}
let regexp = new RegExp('<[^>]*>'); //HTML/XML TAGS
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 4 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 data.items[' +
i +
'].precioUnitario, no puede contener mas de 8 decimales');
}
if (((_c = (item['descuento'] + '').split('.')[1]) === null || _c === void 0 ? void 0 : _c.length) > 8) {
this.errors.push('El Descuento del item "' +
item['descuento'] +
'" en data.items[' +
i +
'].descuento, no puede contener mas de 8 decimales');
}
if (+item['cantidad'] <= 0) {
this.errors.push('La cantidad del item en data.items[' + i + '].cantidad debe ser mayor a cero');
}
if (item['pais']) {
if (Constante_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: ' +
Constante_service_1.default.paises.map((a) => a.codigo + '-' + a.descripcion));
}
}
if (item['observacion'] && item['observacion'].trim().length > 0) {
if (!(item['observacion'].length >= 1 && item['observacion'].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 (!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);
}
} //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 (Constante_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: ' +
Constante_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'] == 3) {
//Exento
if (item['ivaBase'] != 0) {
this.errors.push('Valor de "ivaBase"=' +
item['ivaBase'] +
' debe ser igual a 0 para "ivaTipo" = 3 en data.items[' +
i +
'].ivaBase');
}
if (item['iva'] != 0) {
this.errors.push('Valor de "iva"=' + item['iva'] + ' debe ser igual a 0 para "ivaTipo" = 3 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');
}
}
}
/**
* 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) { }
/**
* 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 (Constante_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: ' +
Constante_service_1.default.tiposOperacionesVehiculos.map((a) => a.codigo + '-' + a.descripcion));
}
if (Constante_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: ' +
Constante_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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkR0ZUl0ZW1WYWxpZGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2pzb25EdGVJdGVtVmFsaWRhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLDRFQUFtRDtBQUduRCxNQUFNLDBCQUEwQjtJQUc5QjtRQUNFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksbUNBQW1DLENBQUMsTUFBVyxFQUFFLElBQVMsRUFBRSxNQUFvQixFQUFFLE1BQXFCOztRQUM1RyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixNQUFNLFVBQVUsR0FBUSxFQUFFLENBQUM7UUFFM0IsK0NBQStDO1FBQy9DLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM3QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTlCLElBQUksWUFBWSxHQUFXLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFFaEQsY0FBYztnQkFDZCxJQUFJLDJCQUFnQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtvQkFDM0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2Qsb0JBQW9CO3dCQUNsQixZQUFZO3dCQUNaLGtCQUFrQjt3QkFDbEIs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