From 4f14f630a2ecfe2dc51ef446b8f4ad877e6b5a29 Mon Sep 17 00:00:00 2001 From: rahul-rajak-nsut Date: Sun, 12 Apr 2026 19:38:54 +0530 Subject: [PATCH] feat: add daily cron job to mark expired invoices as overdue --- backend/package-lock.json | 14 +++++++++++-- backend/package.json | 1 + backend/src/cron/invoiceCron.js | 36 +++++++++++++++++++++++++++++++++ backend/src/server.js | 3 +++ 4 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 backend/src/cron/invoiceCron.js diff --git a/backend/package-lock.json b/backend/package-lock.json index 3635c8039f..4c8e1f5540 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1,12 +1,12 @@ { "name": "idurar-erp-crm", - "version": "4.0.0", + "version": "4.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "idurar-erp-crm", - "version": "4.0.0", + "version": "4.1.0", "license": "Fair-code License", "dependencies": { "@aws-sdk/client-s3": "^3.509.0", @@ -30,6 +30,7 @@ "mongoose-autopopulate": "^1.1.0", "multer": "^1.4.4", "node-cache": "^5.1.2", + "node-cron": "^4.2.1", "openai": "^4.27.0", "pug": "^3.0.2", "resend": "^2.0.0", @@ -3953,6 +3954,15 @@ "node": ">= 8.0.0" } }, + "node_modules/node-cron": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-4.2.1.tgz", + "integrity": "sha512-lgimEHPE/QDgFlywTd8yTR61ptugX3Qer29efeyWw2rv259HtGBNn1vZVmp8lB9uo9wC0t/AT4iGqXxia+CJFg==", + "license": "ISC", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", diff --git a/backend/package.json b/backend/package.json index ee2b151ea8..3a61a63382 100644 --- a/backend/package.json +++ b/backend/package.json @@ -35,6 +35,7 @@ "mongoose-autopopulate": "^1.1.0", "multer": "^1.4.4", "node-cache": "^5.1.2", + "node-cron": "^4.2.1", "openai": "^4.27.0", "pug": "^3.0.2", "resend": "^2.0.0", diff --git a/backend/src/cron/invoiceCron.js b/backend/src/cron/invoiceCron.js new file mode 100644 index 0000000000..16d6265b7c --- /dev/null +++ b/backend/src/cron/invoiceCron.js @@ -0,0 +1,36 @@ +const cron = require('node-cron'); +const Invoice = require('../models/appModels/Invoice'); + +// 📚 Cron format: 'minute hour day month weekday' +// '0 0 * * *' means → at 00:00 (midnight) every day +cron.schedule('0 0 * * *', async () => { + console.log('⏰ Running daily invoice expiry check...'); + + const today = new Date(); + + try { + // 📚 updateMany = update ALL documents that match the filter + const expiredInvoices = await Invoice.updateMany( + { + // 📚 $lt = "less than" → find invoices where expiredDate < today + expiredDate: { $lt: today }, + isOverdue: false, // only update ones not already marked + removed: false, // skip deleted invoices + }, + { + // 📚 $set = update these fields + $set: { + isOverdue: true, + status: 'overdue', + }, + } + ); + + console.log(`✅ ${expiredInvoices.modifiedCount} invoices marked as overdue`); + + } catch (error) { + console.error('❌ Cron job failed:', error.message); + } +}); + +console.log('✅ Invoice expiry cron job scheduled — runs daily at midnight!'); \ No newline at end of file diff --git a/backend/src/server.js b/backend/src/server.js index e7b62ba1ea..14acaeb272 100644 --- a/backend/src/server.js +++ b/backend/src/server.js @@ -31,6 +31,9 @@ for (const filePath of modelsFiles) { require(path.resolve(filePath)); } +// Start cron jobs +require('./src/cron/invoiceCron'); + // Start our app! const app = require('./app'); app.set('port', process.env.PORT || 8888);