const cron = require('node-cron'); const { FEATURE_FLAG_KEYS, evaluateFeatureFlag } = require('../services/featureFlags'); const { syncErpMasterData } = require('../services/integrations/erpMasterData'); async function runErpMasterDataSyncOnce(prisma, config, logger) { if (!config.erpMasterDataSyncCron) { return { skipped: true, reason: 'cron_disabled', items: [], }; } const gate = await evaluateFeatureFlag({ prisma, config, flagKey: FEATURE_FLAG_KEYS.erpSync, departmentId: null, strictDepartment: false, }); if (!gate.enabled) { logger.info( { featureFlag: FEATURE_FLAG_KEYS.erpSync, reason: gate.reason, }, 'ERP master data sync skipped by ERP gate', ); return { skipped: true, reason: gate.reason, items: [], }; } return syncErpMasterData(prisma, config, { logger }); } function startErpMasterDataSyncJob(fastify) { if (!fastify.config.erpMasterDataSyncCron) { fastify.log.info('ERP master data sync cron disabled'); return null; } let running = false; const task = cron.schedule(fastify.config.erpMasterDataSyncCron, async () => { if (running) { return; } running = true; try { await runErpMasterDataSyncOnce(fastify.prisma, fastify.config, fastify.log); fastify.metrics?.jobRunsTotal?.inc?.({ job: 'erp.master-data.sync', driver: 'cron', outcome: 'success', }); } catch (error) { fastify.log.error({ err: error }, 'ERP master data sync job failed'); fastify.metrics?.jobRunsTotal?.inc?.({ job: 'erp.master-data.sync', driver: 'cron', outcome: 'failure', }); } finally { running = false; } }); fastify.addHook('onClose', async () => { task.stop(); task.destroy(); }); fastify.log.info( { cron: fastify.config.erpMasterDataSyncCron, }, 'ERP master data sync job scheduled', ); return task; } module.exports = { runErpMasterDataSyncOnce, startErpMasterDataSyncJob, };