diff --git a/src/controller/inventory.controller.js b/src/controller/inventory.controller.js index 3a01bdd..ad94c20 100644 --- a/src/controller/inventory.controller.js +++ b/src/controller/inventory.controller.js @@ -1,6 +1,7 @@ const Inventory = require("../models/Inventory"); const WidgetFamily = require("../models/WidgetFamily"); const { InventoryTypes } = require("../config/constants"); +const mongoose = require("mongoose"); module.exports = { /** @@ -37,10 +38,10 @@ module.exports = { * Create a Inventory */ createInventory: async (req, res, next) => { - const { name, type, policies } = req.body; + const { name, policies, widgetName } = req.body; - if (!(name && type)) { - res.status(400).send("Missing params param"); + if (!(name && widgetName)) { + res.status(400).send("Missing params name"); return; } const preferredLocations = []; @@ -51,21 +52,17 @@ module.exports = { } const verifiedPolicies = { - orderTracking: policies.orderTracking || {}, - alerting: { - lowestStockLevel: policies.alerting && policies.alerting.lowestStockLevel ? policies.alerting.lowestStockLevel : false, - highestStockLevel: policies.alerting && policies.alerting.highestStockLevel ? policies.alerting.highestStockLevel : false, - alertStockLevel: policies.alerting && policies.alerting.alertStockLevel ? policies.alerting.alertStockLevel : false, - reOrderLevel: policies.alerting && policies.alerting.reOrderLevel ? policies.alerting.reOrderLevel : false, - }, - replenishment: policies.replenishment || {}, - preferredLocations: preferredLocations, + orderTracking: policies.orderTracking || false, + alerting: policies.alerting || false, + replenishment: policies.replenishment || false, + preferredLocations: preferredLocations || false, + inventory_process: policies.inventory_process, }; try { const inventoryData = new Inventory({ name, - type, + widgetName, policies: verifiedPolicies, }); @@ -74,7 +71,8 @@ module.exports = { res.status(404); return; } - res.send({ success: true, data: inventoryData }); + // const widgetFamilyData = createWidgetFamiliesData(inventoryData, widgetFamily); + res.send({ success: true, data: { inventoryData } }); } catch (error) { next(error); } @@ -84,65 +82,46 @@ module.exports = { * Update a Inventory detail */ updateInventoryByID: async (req, res, next) => { - const { id } = req.params; - - if (!id) { - res.status(400).send("Missing id param"); - return; - } - - const { name, type, policies } = req.body; - - if (!(name || type)) { - res.status(400).send("Missing data in body"); - return; - } - try { - const inventoryData = await Inventory.findById(id); - if (!inventoryData) { - res.status(404); + const { id } = req.params; + + if (!(id && mongoose.isValidObjectId(id))) { + res.status(400).send("Missing/Improper id param"); return; } - if (name) inventoryData.name = name; - if (type) inventoryData.type = type; + const inventory = await Inventory.findById(id); - if (policies) { - const preferredLocations = []; - if (policies.preferredLocations && Array.isArray(policies.preferredLocations)) { - for (const preferredLocation of policies.preferredLocations) { - preferredLocations.push({ id: preferredLocation.id, type: preferredLocation.type }); - } - } - - inventoryData.policies = { - orderTracking: policies.orderTracking || inventoryData.policies.orderTracking, - alerting: { - lowestStockLevel: - policies.alerting && policies.alerting.lowestStockLevel !== undefined - ? policies.alerting.lowestStockLevel - : inventoryData.policies.alerting.lowestStockLevel, - highestStockLevel: - policies.alerting && policies.alerting.highestStockLevel !== undefined - ? policies.alerting.highestStockLevel - : inventoryData.policies.alerting.highestStockLevel, - alertStockLevel: - policies.alerting && policies.alerting.alertStockLevel !== undefined - ? policies.alerting.alertStockLevel - : inventoryData.policies.alerting.alertStockLevel, - reOrderLevel: - policies.alerting && policies.alerting.reOrderLevel !== undefined - ? policies.alerting.reOrderLevel - : inventoryData.policies.alerting.reOrderLevel, - }, - replenishment: policies.replenishment || inventoryData.policies.replenishment, - preferredLocations: preferredLocations, - }; + if (!inventory) { + res.status(400).send("Inventory not found"); + return; + } + let { name, policies, widgetName } = req.body; + if (name) { + inventory.name = name; } - await inventoryData.save(); - res.send({ success: true, data: inventoryData }); + if (widgetName) { + inventory.widgetName = widgetName; + } + + if (!policies) { + policies = {}; + } + + // const widgetFamilyData = createWidgetFamiliesData(inventory, widgetFamily); + + const verifiedPolicies = { + orderTracking: policies.orderTracking !== undefined ? policies.orderTracking : inventory.policies.orderTracking, + alerting: policies.alerting !== undefined ? policies.alerting : inventory.policies.alerting, + replenishment: policies.replenishment !== undefined ? policies.replenishment : inventory.policies.replenishment, + preferredLocations: policies.replenishment !== undefined ? policies.replenishment : inventory.policies.preferredLocations, + inventory_process: policies.inventory_process || inventory.policies.inventory_process, + }; + + inventory.policies = verifiedPolicies; + await inventory.save(); + res.send({ success: true, data: { inventory } }); } catch (error) { next(error); } diff --git a/src/controller/item.controller.js b/src/controller/item.controller.js index 49901f2..faad61d 100644 --- a/src/controller/item.controller.js +++ b/src/controller/item.controller.js @@ -29,7 +29,7 @@ module.exports = { } try { - const itemData = await Item.findById(id); + const itemData = await Item.findById(id).populate({ path: "widgetFamily", populate: "inventory" }); if (!itemData) { res.status(404); return; @@ -63,6 +63,12 @@ module.exports = { countPerPalletPackage: req.body.countPerPalletPackage, customAttributes: req.body.customAttributes, widgetFamily: widgetFamily, + policiesMetadata: { + underStockLevelCount: req.body.policiesMetadata.underStockLevelCount, + overStockLevelCount: req.body.policiesMetadata.overStockLevelCount, + alertStockLevelCount: req.body.policiesMetadata.alertStockLevelCount, + reorderStockLevelCount: req.body.policiesMetadata.reorderStockLevelCount, + }, }; for (const key of Object.keys(item)) { @@ -229,7 +235,7 @@ module.exports = { return; } - const { putQuantity, subLevel } = req.body; + const { putQuantity, subLevel, usageReason, job } = req.body; if (!(putQuantity && putQuantity > 0) || !(subLevel && mongoose.isValidObjectId(subLevel))) { res.status(400).send("Invalid value for putQuantity/subLevel"); return; @@ -250,6 +256,8 @@ module.exports = { performedBy: res.locals.user, putQuantity: putQuantity, subLevel: subLevelObj, + usageReason: usageReason ? usageReason : "", + job: job, }); res.send({ success: true, data: { itemAssociation, itemTransaction } }); res.send({ success: true, data: { itemAssociation, itemTransaction } }); @@ -272,7 +280,7 @@ module.exports = { return; } - const { pickupQuantity, subLevel } = req.body; + const { pickupQuantity, subLevel, usageReason, job } = req.body; if (!(pickupQuantity && pickupQuantity > 0) || !(subLevel && mongoose.isValidObjectId(subLevel))) { res.status(400).send("Invalid value for pickupQuantity/subLevel"); return; @@ -293,6 +301,8 @@ module.exports = { performedBy: res.locals.user, pickupQuantity: pickupQuantity, subLevel: subLevelObj, + usageReason: usageReason ? usageReason : "", + job: job, }); res.send({ success: true, data: { itemAssociation, itemTransaction } }); } catch (error) { @@ -314,15 +324,15 @@ module.exports = { return; } - const { reserveQuantity, job, pickupDate } = req.body; - if (!(reserveQuantity && reserveQuantity > 0) || !(job && mongoose.isValidObjectId(job)) || !(pickupDate && Date.parse(pickupDate))) { - res.status(400).send("Invalid value for reserveQuantity/job/pickupDate"); + const { reserveQuantity, job, pickupDate, usageReason } = req.body; + if (!(reserveQuantity && reserveQuantity > 0) || !(job && mongoose.isValidObjectId(job))) { + res.status(400).send("Invalid value for reserveQuantity/job"); return; } const itemAssociation = await ItemAssociation.findOne({ item_id: item._id, availableQuantity: { $gte: reserveQuantity } }); if (!itemAssociation) { - res.status(500).send("Quantity unavailable"); + res.status(500).send({ success: false, error: "Quantity unavailable" }); return; } itemAssociation.reservedQuantity = itemAssociation.reservedQuantity + reserveQuantity; @@ -335,7 +345,8 @@ module.exports = { performedBy: res.locals.user, reserveQuantity: reserveQuantity, job: job, - pickupDate: Date.parse(pickupDate), + pickupDate: pickupDate ? Date.parse(pickupDate) : undefined, + usageReason: usageReason ? usageReason : "", }); res.send({ success: true, data: { itemAssociation, itemTransaction } }); } catch (error) { @@ -357,19 +368,17 @@ module.exports = { return; } - const { checkInMeterReading, hasIssue, issueDescription } = req.body; - if (!(checkInMeterReading && checkInMeterReading > 0)) { - res.status(400).send("Invalid value for checkInMeterReading"); - return; - } + const { checkInMeterReading, hasIssue, issueDescription, usageReason, job } = req.body; const itemTransaction = await CheckInItemTransaction.create({ type: "CHECK-IN", performedOn: item, performedBy: res.locals.user, checkInMeterReading: checkInMeterReading, - hasIssue: hasIssue, + hasIssue: hasIssue || false, issueDescription: hasIssue ? issueDescription : "", + usageReason: usageReason ? usageReason : "", + job: job, }); res.send({ success: true, data: { itemTransaction } }); } catch (error) { @@ -391,19 +400,15 @@ module.exports = { return; } - const { checkOutMeterReading, job, usageReason } = req.body; - if (!(checkOutMeterReading && checkOutMeterReading > 0) || !(job && mongoose.isValidObjectId(job))) { - res.status(400).send("Invalid value for checkOutMeterReading/job"); - return; - } + const { checkOutMeterReading, usageReason, job } = req.body; const itemTransaction = await CheckOutItemTransaction.create({ type: "CHECK-OUT", performedOn: item, performedBy: res.locals.user, checkOutMeterReading: checkOutMeterReading, - job: job, usageReason: usageReason ? usageReason : "", + job: job, }); res.send({ success: true, data: { itemTransaction } }); } catch (error) { @@ -425,7 +430,7 @@ module.exports = { return; } - const { reportingFor, details } = req.body; + const { reportingFor, details, usageReason, job } = req.body; if (!(reportingFor && ReportItemForTypes.includes(reportingFor))) { res.status(400).send("Invalid value for checkOutMeterReading/job"); return; @@ -437,6 +442,8 @@ module.exports = { performedBy: res.locals.user, reportingFor: reportingFor, details: details ? details : "", + usageReason: usageReason ? usageReason : "", + job: job, }); res.send({ success: true, data: { itemTransaction } }); } catch (error) { @@ -458,7 +465,7 @@ module.exports = { return; } - const { recountedQuantity, damagedQuantity, subLevel } = req.body; + const { recountedQuantity, damagedQuantity, subLevel, usageReason, job } = req.body; if (!(recountedQuantity && recountedQuantity > 0) || !(subLevel && mongoose.isValidObjectId(subLevel))) { res.status(400).send("Invalid value for pickupQuantity/subLevel"); return; @@ -483,6 +490,8 @@ module.exports = { damagedQuantity, totalAdjustment, newAdjustedQuantity: itemAssociation.totalQuantity, + usageReason: usageReason ? usageReason : "", + job: job, }); res.send({ success: true, data: { itemAssociation, itemTransaction } }); } catch (error) { diff --git a/src/controller/sublevel.controller.js b/src/controller/sublevel.controller.js index 4c353a8..1b7ee8f 100644 --- a/src/controller/sublevel.controller.js +++ b/src/controller/sublevel.controller.js @@ -70,7 +70,7 @@ module.exports = { res.status(404); return; } - req.send(sublevelData); + res.send({ success: true, data: sublevelData }); } catch (error) { next(error); } diff --git a/src/controller/utils/sublevel.js b/src/controller/utils/sublevel.js index 3e63a93..ce6cf75 100644 --- a/src/controller/utils/sublevel.js +++ b/src/controller/utils/sublevel.js @@ -58,7 +58,7 @@ const deleteSubLevelTreeFromRoot = async (root_sub_level_id) => { const addSublevelToParent = async (payload, parent_id, parentIsLevel) => { if (parentIsLevel) { // add sublevel to parent - const parentData = await Sublevel.findById(parent_id); + const parentData = await Level.findById(parent_id); parentData.sub_levels.push(payload); return await parentData.save(); } else { diff --git a/src/models/Inventory.js b/src/models/Inventory.js index 4ee1fb6..084afc0 100644 --- a/src/models/Inventory.js +++ b/src/models/Inventory.js @@ -1,5 +1,5 @@ const mongoose = require("mongoose"); -const { InventoryTypes, WarehouseScopes } = require("./../config/constants"); +// const { InventoryTypes } = require("./../config/constants"); const schema = new mongoose.Schema( { @@ -8,49 +8,41 @@ const schema = new mongoose.Schema( required: true, trim: true, }, - type: { + widgetName: { type: String, required: true, trim: true, - enum: InventoryTypes, }, policies: { orderTracking: { type: Object, // Create a different model and reference it here once more details available }, alerting: { - lowestStockLevel: { - type: Boolean, - required: true, - }, - highestStockLevel: { - type: Boolean, - required: true, - }, - alertStockLevel: { - type: Boolean, - required: true, - }, - reOrderLevel: { - type: Boolean, - required: true, - }, + type: Boolean, + required: true, }, replenishment: { + type: Boolean, // Create a different model and reference it here once more details available + }, + inventory_process: { + type: String, + required: true, + }, + // preferredLocations: [ + // { + // id: { + // type: mongoose.Schema.Types.ObjectId, + // refPath: "type", + // }, + // type: { + // type: String, + // enum: WarehouseScopes, + // }, + // }, + // ], + preferredLocations: { type: Object, // Create a different model and reference it here once more details available }, - preferredLocations: [ - { - id: { - type: mongoose.Schema.Types.ObjectId, - refPath: "type", - }, - type: { - type: String, - enum: WarehouseScopes, - }, - }, - ], }, }, { diff --git a/src/models/Item.js b/src/models/Item.js index 4c46b4a..a0e35b9 100644 --- a/src/models/Item.js +++ b/src/models/Item.js @@ -93,6 +93,9 @@ const schema = new mongoose.Schema( alertStockLevelCount: { type: Number, }, + reorderStockLevelCount: { + type: Number, + }, }, }, { diff --git a/src/models/ItemTransaction.js b/src/models/ItemTransaction.js index d670589..8b61898 100644 --- a/src/models/ItemTransaction.js +++ b/src/models/ItemTransaction.js @@ -17,6 +17,13 @@ const schema = new mongoose.Schema( type: mongoose.Schema.Types.ObjectId, ref: "User", }, + usageReason: { + type: String, + trim: true, + }, + job: { + type: mongoose.Schema.Types.ObjectId, + }, }, { timestamps: true, @@ -35,7 +42,7 @@ const PutItemTransaction = ItemTransaction.discriminator( }, subLevel: { type: mongoose.Schema.Types.ObjectId, - ref: "Sublevel" + ref: "Sublevel", }, }) ); @@ -61,13 +68,8 @@ const ReserveItemTransaction = ItemTransaction.discriminator( type: Number, required: true, }, - job: { - type: mongoose.Schema.Types.ObjectId, - required: true, - }, pickupDate: { type: Date, - required: true, }, }) ); @@ -77,7 +79,6 @@ const CheckInItemTransaction = ItemTransaction.discriminator( new mongoose.Schema({ checkInMeterReading: { type: Number, - required: true, }, hasIssue: { type: Boolean, @@ -95,15 +96,6 @@ const CheckOutItemTransaction = ItemTransaction.discriminator( new mongoose.Schema({ checkOutMeterReading: { type: Number, - required: true, - }, - job: { - type: mongoose.Schema.Types.ObjectId, - required: true, - }, - usageReason: { - type: String, - trim: true, }, }) ); diff --git a/src/models/WidgetFamily.js b/src/models/WidgetFamily.js index 3f52b98..9b809d0 100644 --- a/src/models/WidgetFamily.js +++ b/src/models/WidgetFamily.js @@ -14,7 +14,7 @@ const schema = new mongoose.Schema( inventory: { type: mongoose.Schema.Types.ObjectId, ref: "Inventory", - required: true + required: true, }, }, { @@ -22,6 +22,8 @@ const schema = new mongoose.Schema( } ); +schema.index({ name: 1, parent: 1, inventory: 1 }, { unique: true }); + const WidgetFamily = mongoose.model("WidgetFamily", schema); module.exports = WidgetFamily;