diff --git a/app/controllers/products.controller.js b/app/controllers/products.controller.js index a84ea6c..dd8e24a 100644 --- a/app/controllers/products.controller.js +++ b/app/controllers/products.controller.js @@ -181,7 +181,13 @@ exports.getAllProducts = async (req, res) => { }, ], order: [ - ["product_name", "ASC"] + [ + Sequelize.literal( + "GREATEST(products.created_at, COALESCE(products.updated_at, products.created_at))" + ), + "DESC", + ], + ["id", "DESC"], ], }); diff --git a/app/controllers/unitMasterController.js b/app/controllers/unitMasterController.js index 549f963..4107423 100644 --- a/app/controllers/unitMasterController.js +++ b/app/controllers/unitMasterController.js @@ -39,7 +39,7 @@ exports.createUnit = async (req, res) => { message: "Description is required and must be a non-empty string.", }); } - const cleaned = uom.replace(/[^A-Za-z]/g, "").toUpperCase(); + const cleaned = uom.replace(/[^A-Za-z]/g, ""); if (!cleaned) { return res.status(400).json({ @@ -60,9 +60,10 @@ exports.createUnit = async (req, res) => { } const existingUOM = await UnitMaster.findOne({ - where: { - uom: cleaned - } + where: Sequelize.where( + Sequelize.fn("LOWER", Sequelize.col("uom")), + cleaned.toLowerCase() + ), }); if (existingUOM) { @@ -96,7 +97,7 @@ exports.createUnit = async (req, res) => { let uomShort = cleaned.length <= 5 ? cleaned - : (abbreviationMap[cleaned] || cleaned.substring(0, 3)) + + : (abbreviationMap[cleaned.toUpperCase()] || cleaned.substring(0, 3)) + Math.random().toString(36).substring(2, 4).toUpperCase(); uomShort = uomShort.substring(0, 5); @@ -196,10 +197,21 @@ 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(); + const payload = { ...req.body }; + payload.updated_by = payload.updated_by || req.user.id; + payload.updated_at = payload.updated_at || new Date(); - await unit.update(req.body); + if (payload.uom !== undefined) { + payload.uom = sanitizeStringValue(payload.uom); + } + if (payload.description !== undefined) { + payload.description = sanitizeStringValue(payload.description); + } + if (payload.factor !== undefined && typeof payload.factor === "string") { + payload.factor = sanitizeStringValue(payload.factor); + } + + await unit.update(payload); res.status(200).json({ status: "success" }); } catch (err) { logger.error(err.message); @@ -454,7 +466,7 @@ exports.uploadUnitMasterFromCSV = async (req, res) => { const seenInFile = new Set(); const generateShortName = (name) => { - const base = name.replace(/[^A-Z]/gi, "").toUpperCase().slice(0, 3); + const base = name.replace(/[^A-Za-z]/g, "").slice(0, 3); const suffix = Math.random().toString(36).substring(2, 4).toUpperCase(); return `${base}${suffix}`; }; @@ -512,7 +524,10 @@ exports.uploadUnitMasterFromCSV = async (req, res) => { const exists = await UnitMaster.findOne({ where: { [Op.or]: [ - { uom: uom.toUpperCase() }, + Sequelize.where( + Sequelize.fn("LOWER", Sequelize.col("uom")), + uom.toLowerCase() + ), { uom_short_name: shortName }, ], },