diff --git a/src/controller/dashboard.controller.js b/src/controller/dashboard.controller.js new file mode 100644 index 0000000..cd99c29 --- /dev/null +++ b/src/controller/dashboard.controller.js @@ -0,0 +1,328 @@ +const mongoose = require("mongoose"); + +const Warehouse = require("../models/Warehouse"); +const Zone = require("../models/Zone"); +const Area = require("../models/Area"); +const Row = require("../models/Row"); +const Bay = require("../models/Bay"); +const Level = require("../models/Level"); +const Sublevel = require("../models/Sublevel"); +const Inventory = require("../models/Inventory"); +const Material = require("../models/Material"); +const Item = require("../models/Item"); + +const createWarehouse = async ({ name, address, specs, company_id }) => { + if (!(name && address)) { + return; + } + + return await Warehouse.create({ + name, + address, + specs, + company_id: mongoose.Types.ObjectId(company_id), + }); +}; + +const createZones = async (zones, warehouse) => { + const zonesArr = []; + for (const zone of zones) { + const { name, type, specs } = zone; + + const zoneObj = new Zone({ + name, + type, + specs, + warehouse_id: mongoose.Types.ObjectId(warehouse._id), + }); + + await zoneObj.save(); + + if (zone.areas) { + zoneObj.areas = await createAreas(zone.areas, zoneObj); + } + + zonesArr.push(zoneObj); + } + return zonesArr; +}; + +const createAreas = async (areas, zone) => { + const areasArr = []; + for (const area of areas) { + const { name, type, specs } = area; + const areaObj = new Area({ + name, + type, + specs, + zone_id: mongoose.Types.ObjectId(zone._id), + }); + + await areaObj.save(); + if (area.rows) { + areaObj.rows = await createRows(zone.areas, area); + } + areasArr.push(areaObj); + } + return areasArr; +}; + +const createRows = async (rows, area) => { + const rowsArr = []; + for (const row of rows) { + const { name, number, specs } = row; + const rowObj = new Row({ + name, + number: parseInt(number), + specs, + area_id: mongoose.Types.ObjectId(area._id), + }); + + await rowObj.save(); + if (row.bays) { + rowObj.bays = await createBays(row.bays, row); + } + rowsArr.push(rowObj); + } + return rowsArr; +}; + +const createBays = async (bays, row) => { + const baysArr = []; + for (const bay of bays) { + const { name, number, type, specs } = bay; + const bayObj = new Bay({ + name, + number: parseInt(number), + type, + specs, + row_id: mongoose.Types.ObjectId(row._id), + }); + + await bayObj.save(); + if (bay.levels) { + bayObj.levels = await createLevels(bay.levels, bay); + } + baysArr.push(bayObj); + } + return baysArr; +}; + +const createLevels = async (levels, bay) => { + const levelsArr = []; + for (const level of levels) { + const { name, number, specs } = level; + const levelObj = new Level({ + name, + number: parseInt(number), + specs, + row_id: mongoose.Types.ObjectId(bay._id), + }); + + await levelObj.save(); + if (level.levels) { + levelObj.subLevels = await createSublevels(level.subLevels, level); + } + levelsArr.push(levelObj); + } + return levelsArr; +}; + +const createSublevels = async ( + subLevels, + level, + parent = undefined, + depth = 0 +) => { + const subLevelsArr = []; + for (const subLevel of subLevels) { + const subLevelObj = await Sublevel.create({ + name: subLevel.name, + type: subLevel.type, + specs: subLevel.specs, + main_level_id: level._id, + current_depth: depth, + parent_subLevel_id: parent ? parent._id : undefined, + has_inventory: subLevel.has_inventory, + inventory: subLevel.inventory, + }); + + if (subLevel.sub_levels) { + const subSubLevels = await createSublevels( + subLevel.sub_levels, + level, + subLevelObj, + depth + 1 + ); + + subLevelObj.sub_levels = subSubLevels.map((_) => { + return { + type: _.type, + depth: _.depth, + sub_level_id: _._id, + }; + }); + + await subLevelObj.save(); + } + + subLevelsArr.push(subLevelObj); + } + return subLevelsArr; +}; + +const createInventory = async ({ name, type }) => { + if (!(name && type)) { + return; + } + + return await Inventory.create({ + name, + type, + }); +}; + +const createItems = async (items, material) => { + const itemsArray = []; + for (const itemData of items) { + const item = { + commonName: itemData.commonName, + formalName: itemData.formalName, + description: itemData.description, + manufacturer: itemData.manufacturer, + size: itemData.size, + color: itemData.color, + type: itemData.type, + unitOfMaterial: itemData.unitOfMaterial, + unitCost: itemData.unitCost, + packageCount: itemData.packageCount, + countPerPallet: itemData.countPerPallet, + countPerPalletPackage: itemData.countPerPalletPackage, + customAttributes: itemData.customAttributes, + material, + }; + + if (Object.values(item).every((_) => _)) { + const itemObj = await Item.create(item); + itemsArray.push(itemObj); + } + } + return itemsArray; +}; + +const createMaterials = async (materials, inventory, parent = undefined) => { + const materialsData = []; + for (const materialData of materials) { + const material = await Material.create({ + name, + parent, + inventory, + }); + + let materialFamily; + if (materialData.family) { + materialFamily = await createMaterials( + materialData.family, + inventory, + material + ); + } + + let items; + if (materialData.items) { + items = await createItems(materialData.items, material); + } + + materialsData.push({ + material, + family: materialFamily, + items, + }); + } + + return materialsData; +}; + +module.exports = { + createWarehouseSchema: async (req, res, next) => { + try { + const warehouseSchema = {}; + if (!req.body.warehouse) { + res.status(400).send({ + success: false, + message: "Creation of Inventory Failed, missing params", + }); + return; + } + + const warehouse = await createWarehouse(req.body.warehouse); + if (!warehouse) { + res.status(400).send({ + success: false, + message: "Creation of Inventory Failed, invalid/missing params", + }); + return; + } + + warehouseSchema.warehouse = warehouse; + if (!req.body.warehouse.zones) { + const zones = createZones(req.body.warehouse.zones, warehouse); + if (!zones) { + res.status(400).send({ + success: false, + message: "Creation of Zones Failed, invalid/missing params", + }); + return; + } + + warehouseSchema.warehouse.zones = zones; + } + res.send({ success: true, data: warehouseSchema }); + } catch (error) { + next(error); + } + }, + createInventorySchema: async (req, res, next) => { + try { + const inventorySchema = {}; + if (!req.body.inventory) { + res.status(400).send({ + success: false, + message: "Creation of Inventory Failed, missing params", + }); + return; + } + + const inventory = await createInventory(req.body.inventory); + + if (!inventory) { + res.status(400).send({ + success: false, + message: "Creation of Inventory Failed, invalid/missing params", + }); + return; + } + inventorySchema.inventory = inventory; + + if (req.body.inventory.materials) { + const materials = createMaterials( + req.body.inventory.materials, + inventory + ); + if (!materials) { + res.status(400).send({ + success: false, + message: "Creation of Materials Failed, invalid/missing params", + }); + return; + } + + inventorySchema.inventory.materials = materials; + } + + res.send({ success: true, data: inventorySchema }); + } catch (error) { + next(error); + } + }, +}; diff --git a/src/controller/dashboard.router.js b/src/controller/dashboard.router.js new file mode 100644 index 0000000..2781589 --- /dev/null +++ b/src/controller/dashboard.router.js @@ -0,0 +1,14 @@ +const router = require("express").Router(); +const controller = require("./dashboard.controller"); + +/** + * @route /dashboard/create-warehouse-schema + */ +router.post("/create-warehouse-schema", controller.createWarehouseSchema); + +/** + * @route /dashboard/create-inventory-schema + */ +router.post("/create-inventory-schema", controller.createInventorySchema); + +module.exports = router; diff --git a/src/controller/index.js b/src/controller/index.js index 3cbe6c5..82baf2a 100644 --- a/src/controller/index.js +++ b/src/controller/index.js @@ -11,6 +11,7 @@ const areaRouter = require("./area.router"); const bayRouter = require("./bay.router"); const rowRouter = require("./row.router"); const levelRouter = require("./level.router"); +const dashboardRouter = require("./dashboard.router"); router.use("/user-role", AuthenticateMiddleware, userRoleRouter); router.use("/user-permission", AuthenticateMiddleware, userPermissionRouter); @@ -22,7 +23,7 @@ router.use("/area", areaRouter); router.use("/bay", bayRouter); router.use("/row", rowRouter); router.use("/level", levelRouter); - +router.use("/dashboard", dashboardRouter); router.get("/", (req, res) => { res.send({ success: true, message: "Hello world" }); diff --git a/src/controller/item.controller.js b/src/controller/item.controller.js index f584e80..1653df2 100644 --- a/src/controller/item.controller.js +++ b/src/controller/item.controller.js @@ -1,4 +1,6 @@ +const mongoose = require("mongoose"); const Item = require("../models/Item"); +const Material = require("../models/Material"); module.exports = { /** @@ -28,6 +30,10 @@ module.exports = { * Create a Item */ createItem: async (req, res, next) => { + let material; + if (req.body.materialId && mongoose.isValidObjectId(req.body.materialId)) { + material = await Material.findById(material); + } const item = { commonName: req.body.commonName, formalName: req.body.formalName, @@ -42,6 +48,7 @@ module.exports = { countPerPallet: req.body.countPerPallet, countPerPalletPackage: req.body.countPerPalletPackage, customAttributes: req.body.customAttributes, + material, }; if (Object.values(item).every((_) => _)) { diff --git a/src/models/Bay.js b/src/models/Bay.js index 1c69b21..ca48242 100644 --- a/src/models/Bay.js +++ b/src/models/Bay.js @@ -37,6 +37,6 @@ const schema = new mongoose.Schema( } ); -const Level = mongoose.model("Level", schema); +const Bay = mongoose.model("Bay", schema); -module.exports = Level; +module.exports = Bay; diff --git a/src/models/Item.js b/src/models/Item.js index b9056be..6835345 100644 --- a/src/models/Item.js +++ b/src/models/Item.js @@ -18,6 +18,11 @@ const schema = new mongoose.Schema( required: true, trim: true, }, + material: { + type: mongoose.Schema.Types.ObjectId, + ref: "Material", + required: true, + }, manufacturer: { type: String, required: true, diff --git a/src/models/Level.js b/src/models/Level.js index 3e7b010..43b04c0 100644 --- a/src/models/Level.js +++ b/src/models/Level.js @@ -51,6 +51,6 @@ const schema = new mongoose.Schema( } ); -const Level = mongoose.models.Level || mongoose.model("Level", schema); +const Level = mongoose.model("Level", schema); module.exports = Level; diff --git a/src/models/Sublevel.js b/src/models/Sublevel.js index 06a52f5..d5aeeff 100644 --- a/src/models/Sublevel.js +++ b/src/models/Sublevel.js @@ -67,6 +67,6 @@ const schema = new mongoose.Schema( } ); -const Level = mongoose.model("Level", schema); +const Sublevel = mongoose.model("Sublevel", schema); -module.exports = Level; +module.exports = Sublevel;