const cron = require("node-cron"); const PayoutService = require("../services/payoutService"); const paymentsSchedule = "31 * * * *"; // Run every hour at minute 0 const retrySchedule = "0 7 * * *"; // Retry failed payouts once daily at 7 AM class PayoutProcessor { static startScheduledPayouts() { console.log("Starting automated payout processor..."); const payoutJob = cron.schedule( paymentsSchedule, async () => { console.log("Running scheduled payout processing..."); try { const results = await PayoutService.processAllEligiblePayouts(); if (results.totalProcessed > 0) { console.log( `Payout batch completed: ${results.successful.length} successful, ${results.failed.length} failed` ); // Log any failures for monitoring if (results.failed.length > 0) { console.warn("Failed payouts:", results.failed); } } } catch (error) { console.error("Error in scheduled payout processing:", error); } }, { scheduled: false, timezone: "America/New_York", } ); const retryJob = cron.schedule( retrySchedule, async () => { console.log("Running failed payout retry process..."); try { const results = await PayoutService.retryFailedPayouts(); if (results.totalProcessed > 0) { console.log( `Retry batch completed: ${results.successful.length} successful, ${results.failed.length} still failed` ); } } catch (error) { console.error("Error in retry payout processing:", error); } }, { scheduled: false, timezone: "America/New_York", } ); // Start the jobs payoutJob.start(); retryJob.start(); console.log("Payout processor jobs scheduled:"); console.log("- Hourly payout processing: " + paymentsSchedule); console.log("- Daily retry processing: " + retrySchedule); return { payoutJob, retryJob, stop() { payoutJob.stop(); retryJob.stop(); console.log("Payout processor jobs stopped"); }, getStatus() { return { payoutJobRunning: payoutJob.getStatus() === "scheduled", retryJobRunning: retryJob.getStatus() === "scheduled", }; }, }; } } module.exports = PayoutProcessor;