diff --git a/app/controllers/auth.controller.js b/app/controllers/auth.controller.js index 2ab0790..8c6afab 100644 --- a/app/controllers/auth.controller.js +++ b/app/controllers/auth.controller.js @@ -51,7 +51,7 @@ exports.login = async (req, res) => { }else{ const establishment_data = await Establishment.findByPk(userData.establishment_id); tokenData = { id: userData.id, email: userData.email , name: userData.name , role : userRole , establishment_id: userData.establishment_id , establishment_data , last_login : userData.last_login } - await EstablishmentUser.update({ last_login : Date() }, { where: { id: userData.id } }); + await EstablishmentUser.update({ last_login : Date(), updated_by: req.user.id, updated_at: new Date() }, { where: { id: userData.id } }); } const token = jwt.sign(tokenData, process.env.JWT_SECRET, { diff --git a/app/controllers/config.controller.js b/app/controllers/config.controller.js index 1846ae5..8bc8dad 100644 --- a/app/controllers/config.controller.js +++ b/app/controllers/config.controller.js @@ -26,7 +26,7 @@ exports.updateDeadlineData = async (req, res) => { first_reminder_days_before_deadline, second_reminder_days_before_deadline, updated_at: new Date(), - updated_by, + updated_by: req.body.updated_by || req.user.id, }); res.status(200).json({ status: "success", message: "Deadline updated successfully", data: existing }); @@ -39,7 +39,7 @@ exports.updateDeadlineData = async (req, res) => { first_reminder_days_before_deadline, second_reminder_days_before_deadline, created_at: new Date(), - created_by, + created_by: req.body.created_by || req.user.id, }); res.status(201).json({ status: "success", message: "Deadline created successfully", data: newRecord }); diff --git a/app/controllers/establishment.controller.js b/app/controllers/establishment.controller.js index ccf4424..daf5708 100644 --- a/app/controllers/establishment.controller.js +++ b/app/controllers/establishment.controller.js @@ -132,7 +132,7 @@ exports.createEstablishment = async (req, res) => { non_emirati_female, total_emirati, total_employees, - created_by, + created_by: req.body.created_by || req.user.id, created_at: new Date(), }); @@ -145,6 +145,7 @@ exports.createEstablishment = async (req, res) => { name: establishment_user.name, email: establishment_user.email, password: hashedPassword, + created_by: req.body.created_by || req.user.id, }); //send email to user @@ -513,7 +514,8 @@ exports.updateEstablishment = async (req, res) => { return res.status(400).json({ status:"failed", message:"establishment_code already exists" }); } } - + estData.updated_by = estData.updated_by || req.user.id; + estData.updated_at = estData.updated_at || new Date(); // update establishment await establishment.update(estData); @@ -528,6 +530,8 @@ exports.updateEstablishment = async (req, res) => { if (establishment_user.password) { updateUser.password = await bcrypt.hash(establishment_user.password,10); } + updateUser.updated_by = updateUser.updated_by || req.user.id; + updateUser.updated_at = updateUser.updated_at || new Date(); await user.update(updateUser); } } @@ -549,7 +553,7 @@ exports.updateEstablishment = async (req, res) => { const newIds = incomingIds.filter(v => !oldIds.includes(v)); for (let pid of newIds) { - await EstablishmentProduct.create({ establishment_id:id, product_id:pid }); + await EstablishmentProduct.create({ establishment_id:id, product_id:pid, created_by: req.user.id}); } } @@ -701,6 +705,7 @@ exports.createRequest = async (req, res) => { additional_notes, establishment_user_id: user.id, establishment_id: establishment.id, + created_by: req.user.id, }); // Trigger Email @@ -795,13 +800,7 @@ exports.forgotPasswordRequestOTP = async (req, res) => { "Password Reset OTP", `

Dear ${adminUser.name},

Your OTP for password reset is ${otp}. It is valid for 10 minutes.

` ); - - } - - - - logger.info(`OTP sent to ${registered_email}`); return res.status(200).json({ @@ -1234,8 +1233,6 @@ exports.establishmentBulkUpload = async (req, res) => { } }; - - // exports.establishmentBulkUpload = async (req, res) => { // try { // // Basic file & user validations diff --git a/app/controllers/establishment_products.controller.js b/app/controllers/establishment_products.controller.js index 724350f..65695d5 100644 --- a/app/controllers/establishment_products.controller.js +++ b/app/controllers/establishment_products.controller.js @@ -5,7 +5,7 @@ const Product = db.Product; const UnitMaster = db.UnitMaster; exports.createEstablishmentProduct = async (req, res) => { try { - + req.body.created_by = req.body.created_by || req.user.id; const data = await EstablishmentProduct.create(req.body); res.status(201).send({'status':"success",'message':"Creation successful",'data': data }); @@ -64,6 +64,9 @@ exports.getEstablishmentProductById = async (req, res) => { exports.updateEstablishmentProduct = async (req, res) => { try { + + req.body.updated_by = req.body.updated_by || req.user.id; + req.body.updated_at = req.body.updated_at || new Date(); const [updated] = await EstablishmentProduct.update(req.body, { where: { id: req.params.id } }); if (!updated) res.status(404).send({'status':"failed",'message':"Record not found",'data': "" }); diff --git a/app/controllers/establishment_user.controller.js b/app/controllers/establishment_user.controller.js index 644e834..630a3fc 100644 --- a/app/controllers/establishment_user.controller.js +++ b/app/controllers/establishment_user.controller.js @@ -23,6 +23,7 @@ exports.createUser = async (req, res) => { email, password: hashed, gender, + created_by: req.user.id, }); //send email to user @@ -83,6 +84,8 @@ exports.updateUser = async (req, res) => { if (email !== undefined && email !== null) data.email = email; if (is_active !== undefined && is_active !== null) data.is_active = is_active; if (password && password.trim() !== "") data.password = await bcrypt.hash(password, 10); + data.updated_by = req.body.updated_by || req.user.id; + data.updated_at = req.body.updated_at || new Date(); const [updated] = await EstablishmentUser.update(data, { where: { id: req.params.id }, @@ -127,7 +130,7 @@ exports.changeUserPassword = async (req, res) => { // Hash and update new password const hashedPassword = await bcrypt.hash(new_password, 10); await EstablishmentUser.update( - { password: hashedPassword }, + { password: hashedPassword, updated_by: req.user.id, updated_at: new Date() }, { where: { id: userId } } ); diff --git a/app/controllers/notificationTemplate.controller.js b/app/controllers/notificationTemplate.controller.js index 3a7ce1a..118493f 100644 --- a/app/controllers/notificationTemplate.controller.js +++ b/app/controllers/notificationTemplate.controller.js @@ -4,6 +4,7 @@ const NotificationTemplate = db.NotificationTemplate; // Create template exports.createTemplate = async (req, res) => { try { + req.body.created_by = req.body.created_by || req.user.id; const template = await NotificationTemplate.create(req.body); res.status(201).send({ status: "success", @@ -50,7 +51,10 @@ exports.getTemplateById = async (req, res) => { // Update template exports.updateTemplate = async (req, res) => { - try { + try { + req.body.updated_by = req.body.updated_by || req.user.id; + req.body.updated_at = req.body.updated_at || new Date(); + const [updated] = await NotificationTemplate.update(req.body, { where: { id: req.params.id }, }); diff --git a/app/controllers/products.controller.js b/app/controllers/products.controller.js index 8dbcae2..8006bfd 100644 --- a/app/controllers/products.controller.js +++ b/app/controllers/products.controller.js @@ -25,7 +25,7 @@ exports.createProduct = async (req, res) => { } req.body.created_by = req.user.id; - const data = await Product.create(req.body); + const data = await Product.create(req.body); res.status(201).send({'status':"success",'message':"created successfully",'data': data }); } catch (error) { res.status(500).send({'status':"failed",'message':error.message }); @@ -84,7 +84,8 @@ exports.updateProduct = async (req, res) => { const object = { ...req.body, - updated_at: Sequelize.literal("NOW()") + updated_by: req.user.id, + updated_at: new Date() }; const [updated] = await Product.update(object, { where: { id: req.params.id } }); diff --git a/app/controllers/quarterlyWindowsConfiguration.controller.js b/app/controllers/quarterlyWindowsConfiguration.controller.js index a1e2c48..d15b951 100644 --- a/app/controllers/quarterlyWindowsConfiguration.controller.js +++ b/app/controllers/quarterlyWindowsConfiguration.controller.js @@ -26,6 +26,7 @@ exports.createConfig = async (req, res) => { req.body.assigned = assignedCount; req.body.responded = 0; req.body.not_responded = assignedCount; + req.body.created_by = req.body.created_by || req.user.id; const data = await QuarterlyWindowsConfiguration.create(req.body); res.status(201).send({ @@ -83,6 +84,8 @@ exports.getConfigById = async (req, res) => { // Update configuration exports.updateConfig = async (req, res) => { try { + req.body.updated_by = req.body.updated_by || req.user.id; + req.body.updated_at = req.body.updated_at || new Date(); const [updated] = await QuarterlyWindowsConfiguration.update(req.body, { where: { id: req.params.id }, }); diff --git a/app/controllers/submission.controller.js b/app/controllers/submission.controller.js index aeb7a73..c73fc40 100644 --- a/app/controllers/submission.controller.js +++ b/app/controllers/submission.controller.js @@ -35,7 +35,7 @@ exports.createSubmission = async (req, res) => { if (exists) { return res.status(400).json({status: "failed", message: `Submission already exists for establishment_id: ${establishment_id}, quarter: ${quarter}, year: ${year}`}); } - + submissionData.created_by = submissionData.created_by || req.user.id; const submission = await Submission.create({establishment_id, quarter, year, ...submissionData}); @@ -45,11 +45,8 @@ exports.createSubmission = async (req, res) => { const currentResponded = config.responded ?? 0; const currentNotResponded = config.not_responded ?? 0; // respond increase, not responded decrease - await QuarterlyWindowsConfiguration.update({responded: currentResponded + 1, not_responded: currentNotResponded - 1 }, {where: { id: config.id }} ); + await QuarterlyWindowsConfiguration.update({responded: currentResponded + 1, not_responded: currentNotResponded - 1, updated_by: req.user.id, updated_at: new Date() }, {where: { id: config.id }} ); } - - - if (products.length) { // products.forEach((p) => (p.submission_id = submission.id)); @@ -212,6 +209,9 @@ exports.updateSubmission = async (req, res) => { if (!submission) return res.status(404).json({ status: "failed", message: "Submission not found" }); + submissionData.updated_by = submissionData.updated_by || req.user.id; + submissionData.updated_at = submissionData.updated_at || new Date(); + // Update main submission record await submission.update(submissionData); @@ -270,11 +270,15 @@ exports.updateSubmission = async (req, res) => { }); if (existingProduct) { + updatedProductData.updated_by = updatedProductData.updated_by || req.user.id; + updatedProductData.updated_at = updatedProductData.updated_at || new Date(); await existingProduct.update(updatedProductData); } else { + updatedProductData.created_by = updatedProductData.created_by || req.user.id; await SubmissionProduct.create(updatedProductData); } } else { + updatedProductData.created_by = updatedProductData.created_by || req.user.id; await SubmissionProduct.create(updatedProductData); } } @@ -675,7 +679,7 @@ exports.submissionEditRequest = async (req, res) => { return res.status(404).json({ status: "failed", message: "Submission not found" }); // Update submission main data - await submission.update({ edit_request }); + await submission.update({ edit_request, updated_by: req.user.id, updated_at: new Date() }); res.status(200).json({ status: "success", @@ -701,7 +705,7 @@ exports.enableOrDisableSubmissionEditAccess = async (req, res) => { return res.status(404).json({ status: "failed", message: "Submission not found" }); // Update submission main data - const result = await submission.update({ edit_request : 0 , edit_access : edit_access}); + const result = await submission.update({ edit_request : 0 , edit_access : edit_access, updated_by: req.user.id, updated_at: new Date()}); res.status(200).json({ status: "success", @@ -736,7 +740,7 @@ exports.approveOrRejectSubmission = async (req, res) => { return res.status(404).json({ status: "failed", message: "Submission not found" }); // Update submission main data - const result = await submission.update({ approve_reject_status : approve_reject_status , status : statusString, reject_reason, approve_or_reject_by }); + const result = await submission.update({ approve_reject_status : approve_reject_status , status : statusString, reject_reason, approve_or_reject_by, updated_by: req.user.id, updated_at: new Date() }); //send email to establishment user diff --git a/app/controllers/unitMasterController.js b/app/controllers/unitMasterController.js index 76e68bb..2fdfb28 100644 --- a/app/controllers/unitMasterController.js +++ b/app/controllers/unitMasterController.js @@ -89,6 +89,7 @@ exports.createUnit = async (req, res) => { }); } req.body.uom_short_name = uomShort; + req.body.created_by = req.body.created_by || req.user.id; const unit = await UnitMaster.create(req.body); res.status(201).json({ status: "success", data: unit }); @@ -137,6 +138,9 @@ exports.updateUnit = async (req, res) => { const unit = await UnitMaster.findByPk(req.params.id); if (!unit) return res.status(404).json({ status: "error", message: "Unit not found" }); + req.body.updated_by = req.body.updated_by || req.user.id; + req.body.updated_at = req.body.updated_at || new Date(); + await unit.update(req.body); res.status(200).json({ status: "success", data: unit }); } catch (err) { diff --git a/app/controllers/variationReasonMaster.controller.js b/app/controllers/variationReasonMaster.controller.js index 27304d2..dc3cc0c 100644 --- a/app/controllers/variationReasonMaster.controller.js +++ b/app/controllers/variationReasonMaster.controller.js @@ -10,7 +10,7 @@ exports.createReason = async (req, res) => { if (!reason) return res.status(400).send({ status: "failed", message: "Reason is required" }); - const newReason = await VariationReasonMaster.create({ reason, high_or_low }); + const newReason = await VariationReasonMaster.create({ reason, high_or_low, created_by: req.body.created_by || req.user.id }); res.status(201).send({ status: "success", message: "Reason created successfully", data: newReason }); } catch (err) { res.status(500).send({ status: "failed", message: err.message }); @@ -43,7 +43,7 @@ exports.updateReason = async (req, res) => { try { const { reason, high_or_low, is_active } = req.body; const updated = await VariationReasonMaster.update( - { reason, high_or_low, is_active, updated_at: new Date(), updated_on: new Date() }, + { reason, high_or_low, is_active, updated_at: new Date(), updated_on: new Date(), updated_by: req.user.id }, { where: { id: req.params.id } } ); diff --git a/app/controllers/zeroTargetReasonMaster.controller.js b/app/controllers/zeroTargetReasonMaster.controller.js index a4914f8..9a6632a 100644 --- a/app/controllers/zeroTargetReasonMaster.controller.js +++ b/app/controllers/zeroTargetReasonMaster.controller.js @@ -1,20 +1,20 @@ const db = require("../models"); const ZeroTargetReasonMaster = db.ZeroTargetReasonMaster; -// ✅ Create +// Create exports.create = async (req, res) => { try { const { reason, is_active } = req.body; if (!reason) return res.status(400).send({ status: "failed", message: "Reason is required" }); - const data = await ZeroTargetReasonMaster.create({ reason, is_active }); + const data = await ZeroTargetReasonMaster.create({ reason, is_active, created_by: req.user.id }); res.status(201).send({ status: "success", data }); } catch (err) { res.status(500).send({ status: "failed", message: err.message }); } }; -// ✅ Get All +// Get All exports.getAll = async (req, res) => { try { const data = await ZeroTargetReasonMaster.findAll(); @@ -24,7 +24,7 @@ exports.getAll = async (req, res) => { } }; -// ✅ Get By ID +// Get By ID exports.getById = async (req, res) => { try { const { id } = req.params; @@ -36,10 +36,12 @@ exports.getById = async (req, res) => { } }; -// ✅ Update +// Update exports.update = async (req, res) => { try { const { id } = req.params; + req.body.updated_by = req.body.updated_by || req.user.id; + req.body.updated_at = req.body.updated_at || new Date(); const [updated] = await ZeroTargetReasonMaster.update(req.body, { where: { id } }); if (!updated) return res.status(404).send({ status: "failed", message: "Not found" }); const data = await ZeroTargetReasonMaster.findByPk(id); @@ -49,7 +51,7 @@ exports.update = async (req, res) => { } }; -// ✅ Delete +// Delete exports.delete = async (req, res) => { try { const { id } = req.params; diff --git a/app/models/UnitMaster.model.js b/app/models/UnitMaster.model.js index fb29c12..fd3aaa4 100644 --- a/app/models/UnitMaster.model.js +++ b/app/models/UnitMaster.model.js @@ -38,7 +38,7 @@ module.exports = (sequelize, DataTypes) => { }, created_by: { type: DataTypes.INTEGER, - allowNull: true, + allowNull: false, }, updated_by: { type: DataTypes.INTEGER, @@ -48,8 +48,14 @@ module.exports = (sequelize, DataTypes) => { { tableName: "unit_master", timestamps: true, - createdAt: "created_at", - updatedAt: "updated_at", + createdAt: { + type: DataTypes.DATE, + defaultValue: DataTypes.NOW, + }, + updatedAt: { + type: DataTypes.DATE, + defaultValue: DataTypes.NOW, + }, } ); diff --git a/app/models/establishment.model.js b/app/models/establishment.model.js index 96e877e..35d18c9 100644 --- a/app/models/establishment.model.js +++ b/app/models/establishment.model.js @@ -61,7 +61,7 @@ module.exports = (sequelize, DataTypes) => { }, created_by: { type: DataTypes.INTEGER, - allowNull: true, + allowNull: false, }, updated_at: { type: DataTypes.DATE, diff --git a/app/models/establishmentPasswordResetRequest.model.js b/app/models/establishmentPasswordResetRequest.model.js index cb63be2..88ac014 100644 --- a/app/models/establishmentPasswordResetRequest.model.js +++ b/app/models/establishmentPasswordResetRequest.model.js @@ -15,7 +15,8 @@ module.exports = (sequelize, DataTypes) => { }, created_at: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }, updated_at: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }, - updated_by: { type: DataTypes.INTEGER }, + created_by: {type: DataTypes.INTEGER, allowNull: false }, + updated_by: { type: DataTypes.INTEGER, allowNull: true }, establishment_user_id: { type: DataTypes.INTEGER }, establishment_id: { type: DataTypes.INTEGER }, }, diff --git a/app/models/establishmentProduct.model.js b/app/models/establishmentProduct.model.js index 09bfb48..c7d24d4 100644 --- a/app/models/establishmentProduct.model.js +++ b/app/models/establishmentProduct.model.js @@ -23,7 +23,7 @@ module.exports = (sequelize, DataTypes) => { }, created_by: { type: DataTypes.INTEGER, - allowNull: true, + allowNull: false, }, updated_at: { type: DataTypes.DATE, diff --git a/app/models/establishment_user.model.js b/app/models/establishment_user.model.js index ba78775..f58bcc4 100644 --- a/app/models/establishment_user.model.js +++ b/app/models/establishment_user.model.js @@ -38,7 +38,7 @@ module.exports = (sequelize, DataTypes) => { }, created_by: { type: DataTypes.INTEGER, - allowNull: true, + allowNull: false, }, updated_at: { type: DataTypes.DATE, diff --git a/app/models/notificationTemplate.model.js b/app/models/notificationTemplate.model.js index 3597a38..61cde3a 100644 --- a/app/models/notificationTemplate.model.js +++ b/app/models/notificationTemplate.model.js @@ -40,6 +40,8 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.DATE, allowNull: true, }, + created_by: {type: DataTypes.INTEGER, allowNull: false }, + updated_by: { type: DataTypes.INTEGER, allowNull: true }, }, { tableName: "notification_templates", diff --git a/app/models/product.model.js b/app/models/product.model.js index 544b3fc..d139b03 100644 --- a/app/models/product.model.js +++ b/app/models/product.model.js @@ -31,7 +31,7 @@ module.exports = (sequelize, DataTypes) => { }, created_by: { type: DataTypes.INTEGER, - allowNull: true, + allowNull: false, }, updated_at: { type: DataTypes.DATE, diff --git a/app/models/quarterlyWindowsConfiguration.model.js b/app/models/quarterlyWindowsConfiguration.model.js index 84309f1..a0263d9 100644 --- a/app/models/quarterlyWindowsConfiguration.model.js +++ b/app/models/quarterlyWindowsConfiguration.model.js @@ -41,7 +41,7 @@ module.exports = (sequelize, DataTypes) => { }, created_by: { type: DataTypes.INTEGER, - allowNull: true, + allowNull: false, }, updated_at: { type: DataTypes.DATE, diff --git a/app/models/submission.model.js b/app/models/submission.model.js index c725a1a..091235f 100644 --- a/app/models/submission.model.js +++ b/app/models/submission.model.js @@ -45,7 +45,7 @@ module.exports = (sequelize, DataTypes) => { }, created_by: { type: DataTypes.INTEGER, - allowNull: true, + allowNull: false, }, updated_by: { type: DataTypes.INTEGER, diff --git a/app/models/submissionDeadline.model.js b/app/models/submissionDeadline.model.js index 750b374..32c148a 100644 --- a/app/models/submissionDeadline.model.js +++ b/app/models/submissionDeadline.model.js @@ -33,7 +33,7 @@ module.exports = (sequelize, DataTypes) => { }, created_by: { type: DataTypes.INTEGER, - allowNull: true, + allowNull: false, }, updated_by: { type: DataTypes.INTEGER, diff --git a/app/models/submissionHistory.model.js b/app/models/submissionHistory.model.js index 27d4627..b53312f 100644 --- a/app/models/submissionHistory.model.js +++ b/app/models/submissionHistory.model.js @@ -28,13 +28,21 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.STRING, allowNull: true, }, - updated_by: { - type: DataTypes.INTEGER, - allowNull: true, - }, created_at: { type: DataTypes.DATE, allowNull: true, + }, + created_by: { + type: DataTypes.INTEGER, + allowNull: false, + }, + updated_at: { + type: DataTypes.DATE, + allowNull: true, + }, + updated_by: { + type: DataTypes.INTEGER, + allowNull: true, } }, { diff --git a/app/models/submissionProduct.model.js b/app/models/submissionProduct.model.js index 4b45584..d9c9293 100644 --- a/app/models/submissionProduct.model.js +++ b/app/models/submissionProduct.model.js @@ -51,8 +51,14 @@ module.exports = (sequelize, DataTypes) => { zero_target_reason_master_id: DataTypes.INTEGER, other_zero_target_reason: DataTypes.STRING(255), remarks: DataTypes.STRING(255), - created_by: DataTypes.INTEGER, - updated_by: DataTypes.INTEGER, + created_by: { + type: DataTypes.INTEGER, + allowNull: false, + }, + updated_by: { + type: DataTypes.INTEGER, + allowNull: true, + }, is_active: { type: DataTypes.BOOLEAN, defaultValue: true, diff --git a/app/models/variationReasonMaster.model.js b/app/models/variationReasonMaster.model.js index 9bb4b47..e6db067 100644 --- a/app/models/variationReasonMaster.model.js +++ b/app/models/variationReasonMaster.model.js @@ -24,7 +24,7 @@ module.exports = (sequelize, DataTypes) => { }, created_by: { type: DataTypes.INTEGER, - allowNull: true, + allowNull: false, }, updated_at: { type: DataTypes.DATE, diff --git a/app/models/zeroTargetReason.model.js b/app/models/zeroTargetReason.model.js index 2d93c31..42a8aaf 100644 --- a/app/models/zeroTargetReason.model.js +++ b/app/models/zeroTargetReason.model.js @@ -19,7 +19,7 @@ module.exports = (sequelize, DataTypes) => { }, created_by: { type: DataTypes.INTEGER, - allowNull: true, + allowNull: false, }, updated_at: { type: DataTypes.DATE,