fix: fechaPagoP pipe timestamp, admin redirects, despacho plans, CSF parsing

This commit is contained in:
Horux Dev
2026-04-28 22:24:30 +00:00
parent 3eb0f33f3b
commit 066ba7deda
10 changed files with 322 additions and 118 deletions

View File

@@ -3,12 +3,13 @@ import { prisma } from '../config/database.js';
import { startSync, getSyncStatus, retryTimedOutJobs } from '../services/sat/sat.service.js';
import { sweepStaleSatJobs } from '../services/sat/sweep-stale-jobs.service.js';
import { hasFielConfigured } from '../services/fiel.service.js';
import { consultarOpinion, limpiarOpinionesAntiguas } from '../services/opinion-cumplimiento.service.js';
import { consultarOpinion, consultarOpinionContribuyente, limpiarOpinionesAntiguas } from '../services/opinion-cumplimiento.service.js';
import { applyPendingChanges, expireTrials } from '../services/payment/subscription.service.js';
import { resetExpiredMonthlyTimbres } from '../services/facturapi.service.js';
import { purgeDeclaracionesAntiguas } from '../services/declaraciones.service.js';
import { consultarConstancia, purgeConstanciasAntiguas } from '../services/constancia.service.js';
import { consultarConstancia, consultarConstanciaContribuyente, purgeConstanciasAntiguas } from '../services/constancia.service.js';
import { tenantDb } from '../config/database.js';
import { isDespachoTenant } from '@horux/shared';
const SYNC_CRON_SCHEDULE = '0 3 * * *'; // 3:00 AM todos los días
const CONCURRENT_SYNCS = 3; // Máximo de sincronizaciones simultáneas
@@ -216,6 +217,47 @@ async function runOpinionJob(): Promise<void> {
let skipped = 0;
for (const tenant of tenants) {
const isDespacho = isDespachoTenant(tenant.rfc);
if (isDespacho) {
// Modo despacho: iterar contribuyentes con FIEL
try {
const pool = await tenantDb.getPool(tenant.id, tenant.databaseName);
const { rows: contribuyentes } = await pool.query(`
SELECT c.entidad_id as id, c.rfc
FROM contribuyentes c
JOIN fiel_contribuyente f ON f.contribuyente_id = c.entidad_id
WHERE f.is_active = true
`);
if (contribuyentes.length === 0) {
skipped++;
continue;
}
for (const contrib of contribuyentes) {
try {
console.log(`[Opinion Cron] Consultando opinión para contribuyente ${contrib.rfc} (tenant ${tenant.rfc})...`);
await consultarOpinionContribuyente(pool, contrib.id);
success++;
} catch (err: any) {
console.error(`[Opinion Cron] Error para contribuyente ${contrib.rfc}:`, err.message);
failed++;
}
}
const deleted = await limpiarOpinionesAntiguas(pool);
if (deleted > 0) {
console.log(`[Opinion Cron] ${tenant.rfc}: ${deleted} opiniones antiguas eliminadas`);
}
} catch (error: any) {
console.error(`[Opinion Cron] Error despacho ${tenant.rfc}:`, error.message);
failed++;
}
continue;
}
// Modo legacy (Horux 360)
const hasFiel = await hasFielConfigured(tenant.id);
if (!hasFiel) {
skipped++;
@@ -247,7 +289,7 @@ async function runCsfJob(): Promise<void> {
const tenants = await prisma.tenant.findMany({
where: { active: true },
select: { id: true, rfc: true },
select: { id: true, rfc: true, databaseName: true },
});
let success = 0;
@@ -255,6 +297,42 @@ async function runCsfJob(): Promise<void> {
let skipped = 0;
for (const tenant of tenants) {
const isDespacho = isDespachoTenant(tenant.rfc);
if (isDespacho) {
// Modo despacho: iterar contribuyentes con FIEL
try {
const pool = await tenantDb.getPool(tenant.id, tenant.databaseName);
const { rows: contribuyentes } = await pool.query(`
SELECT c.entidad_id as id, c.rfc
FROM contribuyentes c
JOIN fiel_contribuyente f ON f.contribuyente_id = c.entidad_id
WHERE f.is_active = true
`);
if (contribuyentes.length === 0) {
skipped++;
continue;
}
for (const contrib of contribuyentes) {
try {
console.log(`[CSF Cron] Consultando CSF para contribuyente ${contrib.rfc} (tenant ${tenant.rfc})...`);
await consultarConstanciaContribuyente(pool, contrib.id);
success++;
} catch (err: any) {
console.error(`[CSF Cron] Error para contribuyente ${contrib.rfc}:`, err.message);
failed++;
}
}
} catch (error: any) {
console.error(`[CSF Cron] Error despacho ${tenant.rfc}:`, error.message);
failed++;
}
continue;
}
// Modo legacy (Horux 360)
const hasFiel = await hasFielConfigured(tenant.id);
if (!hasFiel) { skipped++; continue; }
try {