diff --git a/apps/api/src/jobs/sat-sync.job.ts b/apps/api/src/jobs/sat-sync.job.ts index be0a111..468da58 100644 --- a/apps/api/src/jobs/sat-sync.job.ts +++ b/apps/api/src/jobs/sat-sync.job.ts @@ -15,11 +15,12 @@ const SYNC_CRON_SCHEDULE = '0 3-7 * * *'; // 3:00–7:00 AM CDMX — ~20% de ten const RECOVERY_CRON_SCHEDULE = '0 14 * * *'; // 2:00 PM todos los días const RETRY_4PM_CRON_SCHEDULE = '0 16 * * *'; // 4:00 PM todos los días const CONCURRENT_SYNCS = 3; // Máximo de sincronizaciones simultáneas (legacy, se mantiene por compatibilidad) -const CONCURRENT_CONTRIBUYENTES = Number(process.env.SAT_CONCURRENT_CONTRIBUYENTES || '5'); // Máximo de contribuyentes en paralelo +const CONCURRENT_CONTRIBUYENTES = Number(process.env.SAT_CONCURRENT_CONTRIBUYENTES || '3'); // Máximo de contribuyentes en paralelo const OPINION_CRON_SCHEDULE = '0 4 * * 0'; // Sundays 4:00 AM const CSF_CRON_SCHEDULE = '0 4 1 * *'; // Día 1 de cada mes 04:00 AM (CSF mensual) const INCREMENTAL_CRON_SCHEDULE = '0 12,16 * * *'; // 12:00 PM y 4:00 PM CDMX const BATCH_JITTER_MS = Number(process.env.SAT_BATCH_JITTER_MS || '60000'); // Jitter máximo entre inicios de sync en un batch (default 60s) +const BATCH_DELAY_MS = Number(process.env.SAT_BATCH_DELAY_MS || '30000'); // Pausa entre lotes para no saturar al SAT const SUBSCRIPTION_LIFECYCLE_CRON = '30 2 * * *'; // 2:30 AM diario — aplica pending changes + expira trials const EXPIRY_REMINDERS_CRON = '0 9 * * *'; // 9:00 AM diario — avisos pre-vencimiento (7d/3d/1d/0d) @@ -384,9 +385,10 @@ async function runSyncJob(): Promise { return syncUnit(unit, '[SAT Cron]'); })); - // Pequeña pausa entre lotes + // Pausa entre lotes para no saturar al SAT if (i + CONCURRENT_CONTRIBUYENTES < units.length) { - await new Promise(resolve => setTimeout(resolve, 5000)); + console.log(`[SAT Cron] Pausa de ${BATCH_DELAY_MS / 1000}s entre lotes`); + await new Promise(resolve => setTimeout(resolve, BATCH_DELAY_MS)); } } @@ -533,8 +535,10 @@ async function runIncrementalSyncJob(): Promise { return syncUnit(unit, '[SAT Cron Inc]'); })); + // Pausa entre lotes para no saturar al SAT if (i + CONCURRENT_CONTRIBUYENTES < units.length) { - await new Promise(resolve => setTimeout(resolve, 5000)); + console.log(`[SAT Cron Inc] Pausa de ${BATCH_DELAY_MS / 1000}s entre lotes`); + await new Promise(resolve => setTimeout(resolve, BATCH_DELAY_MS)); } } diff --git a/ecosystem.config.js b/ecosystem.config.js index 960f6d8..9748fb3 100644 --- a/ecosystem.config.js +++ b/ecosystem.config.js @@ -16,6 +16,7 @@ module.exports = { NODE_ENV: 'production', PORT: 4000, SAT_SYNC_EXCLUDED_TENANTS: 'DEMO2501019X2', + SAT_CONCURRENT_CONTRIBUYENTES: '3', }, }, {