feat: added dashboard controllers

This commit is contained in:
Sathishkumar Krishnan
2021-12-29 07:15:34 +05:30
parent cd00c9b7bb
commit 60e6f0cb94
8 changed files with 361 additions and 6 deletions

View File

@@ -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);
}
},
};