Files
HoruxDespachosNuevo/apps/api/scripts/refresh-metricas-cache.ts

60 lines
2.1 KiB
TypeScript

/**
* Limpia el cache `metricas_mensuales` de TODOS los tenants activos.
*
* Ejecutar después de cambios fiscales en las fórmulas de ingresos/deducciones
* (dashboard.service.ts) — los valores ya escritos en el cache reflejan la
* fórmula vieja y muestran datos incorrectos para meses pasados hasta ser
* recomputados.
*
* Estrategia: TRUNCATE (vía DELETE) por tenant. La próxima consulta a un
* período pasado cae al path on-the-fly y rehidrata el cache con la fórmula
* vigente. No bloquea uso normal — solo aumenta latencia de la primera lectura.
*
* Idempotente. Por-tenant try/catch para que un tenant que falla no tumbe el
* resto.
*/
import { prisma, tenantDb } from '../src/config/database.js';
async function main() {
const tenants = await prisma.tenant.findMany({
where: { active: true },
select: { id: true, nombre: true, rfc: true, databaseName: true },
orderBy: { rfc: 'asc' },
});
console.log(`[Cache Refresh] Iterando ${tenants.length} tenant(s) activo(s)...\n`);
let totalRows = 0;
let okTenants = 0;
let failedTenants = 0;
for (const t of tenants) {
try {
const pool = await tenantDb.getPool(t.id, t.databaseName);
const result = await pool.query('DELETE FROM metricas_mensuales');
const rows = result.rowCount ?? 0;
totalRows += rows;
okTenants++;
console.log(`${t.rfc.padEnd(15)} ${t.nombre.padEnd(40)}${rows.toLocaleString('es-MX')} filas borradas`);
} catch (err: any) {
failedTenants++;
console.error(`${t.rfc.padEnd(15)} ${t.nombre.padEnd(40)} → ERROR: ${err.message || err}`);
}
}
console.log(`\n[Cache Refresh] Completado:`);
console.log(` Tenants OK: ${okTenants}`);
console.log(` Tenants fallidos: ${failedTenants}`);
console.log(` Total filas: ${totalRows.toLocaleString('es-MX')}`);
console.log(`\nLa próxima consulta a un período en cache lo recomputará on-demand`);
console.log(`con las fórmulas vigentes en dashboard.service.ts.`);
await prisma.$disconnect();
process.exit(failedTenants > 0 ? 1 : 0);
}
main().catch(err => {
console.error(err);
process.exit(1);
});