From 7d83288deb787aca40e0df3dbdc552e422fd31c2 Mon Sep 17 00:00:00 2001 From: Sibunnayak Date: Fri, 16 Aug 2024 15:21:26 +0530 Subject: [PATCH] Inventory --- resources/Inventory/InventoryController.js | 124 +++++++++++---------- resources/Inventory/InventoryModel.js | 5 + 2 files changed, 73 insertions(+), 56 deletions(-) diff --git a/resources/Inventory/InventoryController.js b/resources/Inventory/InventoryController.js index 7995c5f..5fd4be1 100644 --- a/resources/Inventory/InventoryController.js +++ b/resources/Inventory/InventoryController.js @@ -4,21 +4,27 @@ import { KYC } from "../KYC/KycModel.js"; import ShippingAddress from "../ShippingAddresses/ShippingAddressModel.js"; import TerritoryManager from "../TerritoryManagers/TerritoryManagerModel.js"; import SalesCoordinator from "../SalesCoOrdinators/SalesCoOrdinatorModel.js"; +import crypto from "crypto"; // Add inventory data export const addInventory = async (req, res) => { try { const { products, addedFor, addedForId } = req.body; const userId = req.user._id; const userType = req.userType; - // console.log("req.user", req.user); + console.log("req.user", req.user); + const currentYear = new Date().getFullYear().toString().slice(-2); + const randomChars = crypto.randomBytes(4).toString("hex").toUpperCase(); + const uniqueId = `${currentYear}-${randomChars}`; + // console.log("uniqueId", uniqueId); const newInventory = new Inventory({ userId, userType, addedFor, addedForId, products, + uniqueId, }); - + // console.log("newInventory", newInventory); await newInventory.save(); res.status(201).json({ success: true, @@ -34,25 +40,31 @@ export const addInventory = async (req, res) => { export const getDistributors = async (req, res) => { try { const { type } = req.params; - + if (!["PrincipalDistributor", "RetailDistributor"].includes(type)) { return res.status(400).json({ message: "Invalid distributor type" }); } let distributors; -// console.log("type",type); + // console.log("type",type); if (type === "PrincipalDistributor") { // Fetch all PrincipalDistributors - const principalDistributors = await User.find({ role: "principal-Distributor" }); -// console.log("principalDistributors",principalDistributors); + const principalDistributors = await User.find({ + role: "principal-Distributor", + }); + // console.log("principalDistributors",principalDistributors); // Map each PrincipalDistributor to include their ShippingAddress - distributors = await Promise.all(principalDistributors.map(async (distributor) => { - const shippingAddress = await ShippingAddress.findOne({ user: distributor._id }); - return { - ...distributor.toObject(), - shippingAddress, - }; - })); + distributors = await Promise.all( + principalDistributors.map(async (distributor) => { + const shippingAddress = await ShippingAddress.findOne({ + user: distributor._id, + }); + return { + ...distributor.toObject(), + shippingAddress, + }; + }) + ); } else { // For RetailDistributor, fetch approved KYC documents distributors = await KYC.find({ status: "approved" }); @@ -66,16 +78,11 @@ export const getDistributors = async (req, res) => { export const getAllInventories = async (req, res) => { try { - const { - page = 1, - show = 10, - startDate, - endDate - } = req.query; + const { page = 1, show = 10, startDate, endDate } = req.query; // Build query const query = {}; - + if (startDate && endDate) { const start = new Date(startDate); const end = new Date(endDate); @@ -84,25 +91,25 @@ export const getAllInventories = async (req, res) => { // If startDate and endDate are the same, fetch records for that day query.createdAt = { $gte: new Date(startDate), - $lt: new Date(startDate).setDate(new Date(startDate).getDate() + 1) // Until the end of that day + $lt: new Date(startDate).setDate(new Date(startDate).getDate() + 1), // Until the end of that day }; } else { // If startDate and endDate are different, fetch records between these dates query.createdAt = { $gte: start, - $lte:new Date(end).setDate(new Date(end).getDate() + 1) + $lte: new Date(end).setDate(new Date(end).getDate() + 1), }; } } else if (startDate) { // Only startDate is provided query.createdAt = { $gte: new Date(startDate), - $lte: new Date() // Up to today's date + $lte: new Date(), // Up to today's date }; } else if (endDate) { // Only endDate is provided query.createdAt = { - $lte: new Date(endDate) + $lte: new Date(endDate), }; } @@ -116,38 +123,42 @@ export const getAllInventories = async (req, res) => { .sort({ createdAt: -1 }); // Optional: Sort by createdAt date in descending order // Populate additional details - const populatedInventories = await Promise.all(inventories.map(async (inventory) => { - // Populate user details based on userType - let user = null; - if (inventory.userType === 'TerritoryManager') { - user = await TerritoryManager.findById(inventory.userId); - } else if (inventory.userType === 'SalesCoordinator') { - user = await SalesCoordinator.findById(inventory.userId); - } + const populatedInventories = await Promise.all( + inventories.map(async (inventory) => { + // Populate user details based on userType + let user = null; + if (inventory.userType === "TerritoryManager") { + user = await TerritoryManager.findById(inventory.userId); + } else if (inventory.userType === "SalesCoordinator") { + user = await SalesCoordinator.findById(inventory.userId); + } - // Populate addedFor details based on addedFor - let addedForData = null; - if (inventory.addedFor === 'PrincipalDistributor') { - addedForData = await User.findById(inventory.addedForId); - const shippingAddress = await ShippingAddress.findOne({ user: addedForData._id }); - addedForData = { - ...addedForData.toObject(), - shippingAddress, + // Populate addedFor details based on addedFor + let addedForData = null; + if (inventory.addedFor === "PrincipalDistributor") { + addedForData = await User.findById(inventory.addedForId); + const shippingAddress = await ShippingAddress.findOne({ + user: addedForData._id, + }); + addedForData = { + ...addedForData.toObject(), + shippingAddress, + }; + } else if (inventory.addedFor === "RetailDistributor") { + addedForData = await KYC.findById(inventory.addedForId); + } + return { + ...inventory.toObject(), + user, + addedForData, }; - } else if (inventory.addedFor === 'RetailDistributor') { - addedForData = await KYC.findById(inventory.addedForId); - } - return { - ...inventory.toObject(), - user, - addedForData, - }; - })); + }) + ); // Send response with pagination info res.status(200).json({ total_data, - inventories: populatedInventories + inventories: populatedInventories, }); } catch (error) { res.status(500).json({ message: error.message }); @@ -165,22 +176,24 @@ export const getSingleInventory = async (req, res) => { // Populate user details based on userType let user = null; - if (inventory.userType === 'TerritoryManager') { + if (inventory.userType === "TerritoryManager") { user = await TerritoryManager.findById(inventory.userId); - } else if (inventory.userType === 'SalesCoOrdinator') { + } else if (inventory.userType === "SalesCoOrdinator") { user = await SalesCoordinator.findById(inventory.userId); } // Populate addedFor details based on addedFor let addedForData = null; - if (inventory.addedFor === 'PrincipalDistributor') { + if (inventory.addedFor === "PrincipalDistributor") { addedForData = await User.findById(inventory.addedForId); - const shippingAddress = await ShippingAddress.findOne({ user: addedForData._id }); + const shippingAddress = await ShippingAddress.findOne({ + user: addedForData._id, + }); addedForData = { ...addedForData.toObject(), shippingAddress, }; - } else if (inventory.addedFor === 'RetailDistributor') { + } else if (inventory.addedFor === "RetailDistributor") { addedForData = await KYC.findById(inventory.addedForId); } @@ -193,4 +206,3 @@ export const getSingleInventory = async (req, res) => { res.status(500).json({ message: error.message }); } }; - diff --git a/resources/Inventory/InventoryModel.js b/resources/Inventory/InventoryModel.js index db6a91f..31fd7c0 100644 --- a/resources/Inventory/InventoryModel.js +++ b/resources/Inventory/InventoryModel.js @@ -22,6 +22,11 @@ const ProductRecordSchema = new mongoose.Schema({ // Define main Inventory schema const InventorySchema = new mongoose.Schema({ + uniqueId: { + type: String, + required: true, + unique: true, + }, userId: { type: mongoose.Schema.Types.ObjectId, refPath: 'userType',