fix: fechaPagoP pipe timestamp, admin redirects, despacho plans, CSF parsing
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user