First upload

This commit is contained in:
2026-03-17 14:12:37 +01:00
commit c857900860
46 changed files with 3343 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
/**
* Acciones base para operaciones CRUD y búsquedas
*/
export const actions = {
/**
* Inserta o actualiza un registro y devuelve el objeto completo actualizado
*/
_set: async (db, { table, view, data }) => {
// Si el id viene vacío o es 0, lo eliminamos para que MariaDB genere uno nuevo (AUTO_INCREMENT)
if (!data.id) delete data.id;
const result = await db.upsert(table, data);
// Normalizamos la respuesta del driver de MariaDB
const res = Array.isArray(result) ? result[0] : result;
// Obtenemos el ID: o bien el que ya venía en data, o el nuevo generado por el insert
const idToFetch = data.id || res?.insertId;
if (!idToFetch) throw new Error("No se pudo determinar el ID del registro");
// Devolvemos el registro fresco (útil si usamos una 'view' con campos calculados)
return db.one(view || table, { id: idToFetch });
},
/**
* Elimina un registro por ID
*/
_del: async (db, { table, id }) => {
if (!id) throw new Error("ID requerido para eliminar");
return db.delete(table, { id });
},
/**
* Obtiene todos los clientes (compatibilidad con ClientesOld)
*/
Clientes: async (db) => {
return db.select('ClientesOld');
},
Recibos: async (db) => {
return db.select('Recibos');
},
/**
* Búsqueda avanzada usando parámetros nombrados (raw query)
*/
Search: async (db, { text }) => {
const query = 'SELECT * FROM ClientesOld WHERE Cliente LIKE :term OR NIF LIKE :term';
const params = { term: `%${text}%` };
return db.raw(query, params);
}
};

View File

@@ -0,0 +1,138 @@
import schemaDataRaw from '../lib/schema.json' assert { type: 'json' };
// El schema se usa para validar qué columnas existen realmente en la DB
const schemaData = schemaDataRaw;
/**
* Formatea fechas a estándar ISO (YYYY-MM-DD) para MariaDB
*/
const fmt = (d) =>
(d instanceof Date && !isNaN(d.getTime()) ? d.toISOString().split('T')[0] : null);
/**
* Filtra y limpia las columnas según el schema.json
*/
const filterColumns = (tableName, rowData) => {
const schema = schemaData[tableName];
if (!schema) return rowData;
return Object.keys(rowData).reduce((cleanRow, col) => {
const colDef = schema[col];
if (!colDef) return cleanRow; // Si la columna no existe en el JSON, se ignora
let val = rowData[col];
const type = colDef.type || ''; // Usamos el campo 'type' generado por tu script anterior
if (val != null) {
// Lógica de fechas
if (type.includes('date')) {
try {
const s = val.toString().trim();
const isISO = val instanceof Date || s.includes('T');
val = isISO ? fmt(new Date(val)) :
/^\d{8}$/.test(s) ? `${s.slice(4, 8)}-${s.slice(2, 4)}-${s.slice(0, 2)}` :
s.includes('.') ? s.split('.').reverse().join('-') : s.slice(0, 10);
} catch {
val = null;
}
}
// Lógica de texto: trim y recorte por seguridad según definición
else if (type === 'text' && typeof val === 'string') {
val = val.trim().slice(0, 255);
}
}
cleanRow[col] = val;
return cleanRow;
}, {});
};
/**
* Orquestador para guardar datos transformados de SOAP a DB
*/
const saveSoap = async (db, raw, config) => {
if (!raw || !raw.length) return 0;
const rawArray = Array.isArray(raw) ? raw : [raw];
for (const [table, transform] of Object.entries(config)) {
const data = rawArray.flatMap(item => {
const res = transform ? transform(item) : item;
if (!res) return [];
return Array.isArray(res)
? res.map(sub => filterColumns(table, sub))
: [filterColumns(table, res)];
});
if (data.length) {
await db.upsert(table, data, true); // true para INSERT IGNORE
}
}
return rawArray.length;
};
/**
* Acciones exportables para el motor TRX
* Estas funciones son llamadas dinámicamente según el nombre del servicio SOAP
*/
export const actions = {
DescargaCompletaRecibos: async (db, { data }) => {
const raw = data.ListaRecibos?.ReciboAmpliado || data || [];
const total = await saveSoap(db, raw, { 'Recibos': null, 'RecibosEstados': null });
return { totalProcesado: total };
},
DescargaCartera: async (db, { data }) => {
const raw = data.DatosCartera?.Cartera || data || [];
const total = await saveSoap(db, raw, { 'Cartera': null });
return { totalProcesado: total };
},
DescargaSiniestros: async (db, { data }) => {
const raw = data.ListaSiniestros?.SiniestroAmpliado || data || [];
const total = await saveSoap(db, raw, { 'Siniestros': null, 'SiniestrosEstados': null });
return { totalProcesado: total };
},
ConsultaAgendaTramitacion: async (db, { data }) => {
const raw = data.Datos?.DatosTramitacionResponse || data || [];
const total = await saveSoap(db, raw, { 'SiniestrosTramites': null });
return { totalProcesado: total };
},
DescargaPolizas: async (db, { data }) => {
const raw = data.ListaPolizas?.Poliza || data || [];
const total = await saveSoap(db, raw, {
'Polizas': i => ({
...i.DatosGenerales,
Riesgo: [
i.DatosAccidentes?.NombreAsegurado,
i.DatosAutos?.CodigoModelo && `${i.DatosAutos.CodigoModelo} ${i.DatosAutos.Matricula || ''}`.trim(),
i.DatosMultirriesgos?.SituacionRiesgo
].filter(Boolean).join(' | ')
}),
'PolizasDetalle': i => i.DatosGenerales
? { ...i.DatosGenerales.DatosTomador, ...i.DatosGenerales, CodigoPoliza: i.DatosGenerales.CodigoPoliza, CodigoSuplemento: i.DatosGenerales.CodigoSuplemento }
: null,
'PolizasAutos': i => i.DatosAutos?.CodigoModelo
? { ...i.DatosAutos, CodigoPoliza: i.DatosGenerales.CodigoPoliza, CodigoSuplemento: i.DatosGenerales.CodigoSuplemento }
: null,
'PolizasAutosConductor': i => {
const { CodigoPoliza, CodigoSuplemento } = i.DatosGenerales || {};
const { DatosConductor: hab, DatosConductorOcasional: oca } = i.DatosAutos || {};
return [
hab?.Nombre ? { ...hab, CodigoPoliza, CodigoSuplemento, TipoConductor: 'Habitual' } : null,
oca?.Nombre ? { ...oca, CodigoPoliza, CodigoSuplemento, TipoConductor: 'Ocasional' } : null
].filter(Boolean);
},
'PolizasMultirriesgos': i => i.DatosMultirriesgos
? { ...i.DatosMultirriesgos, CodigoPoliza: i.DatosGenerales.CodigoPoliza, CodigoSuplemento: i.DatosGenerales.CodigoSuplemento }
: null,
'PolizasAccidentes': i => i.DatosAccidentes
? { ...i.DatosAccidentes, CodigoPoliza: i.DatosGenerales.CodigoPoliza, CodigoSuplemento: i.DatosGenerales.CodigoSuplemento }
: null
});
return { totalProcesado: total };
}
};