import { Inventory } from "../Inventory/InventoryModel.js"; import User from "../user/userModel.js"; 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); 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, message: "Inventory added successfully", data: newInventory, }); } catch (error) { res.status(500).json({ success: false, message: "Server error", error }); } }; // Get all distributors (PD or RD) 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); if (type === "PrincipalDistributor") { // Fetch all 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, }; }) ); } else { // For RetailDistributor, fetch approved KYC documents distributors = await KYC.find({ status: "approved" }); } res.status(200).json(distributors); } catch (error) { res.status(500).json({ message: error.message }); } }; export const getAllInventories = async (req, res) => { try { const { page = 1, show = 10, startDate, endDate, name } = req.query; const query = {}; if (startDate && endDate) { const start = new Date(startDate); const end = new Date(endDate); if (start.toDateString() === end.toDateString()) { query.createdAt = { $gte: start, $lt: new Date(start).setDate(start.getDate() + 1), }; } else { query.createdAt = { $gte: start, $lte: new Date(end).setDate(end.getDate() + 1), }; } } else if (startDate && endDate==='') { query.createdAt = { $gte: new Date(startDate), $lte: new Date(), }; } else if (endDate && startDate==='') { query.createdAt = { $lte: new Date(endDate), }; } const allInventories = await Inventory.find(query).sort({ createdAt: -1 }); // Populate additional details const populatedInventories = await Promise.all( allInventories.map(async (inventory) => { let user = null; if (inventory.userType === "TerritoryManager") { user = await TerritoryManager.findById(inventory.userId); } else if (inventory.userType === "SalesCoordinator") { user = await SalesCoordinator.findById(inventory.userId); } let addedForData = null; let tradeName = null; if (inventory.addedFor === "PrincipalDistributor") { addedForData = await User.findById(inventory.addedForId); if (addedForData) { const shippingAddress = await ShippingAddress.findOne({ user: addedForData._id, }); addedForData = { ...addedForData.toObject(), shippingAddress, }; tradeName = addedForData.shippingAddress?.tradeName?.toLowerCase() || ""; } } else if (inventory.addedFor === "RetailDistributor") { addedForData = await KYC.findById(inventory.addedForId); tradeName = addedForData?.trade_name?.toLowerCase() || ""; } return { ...inventory.toObject(), user, addedForData, tradeName, }; }) ); // Apply name filter if the name parameter is provided let filteredInventories = populatedInventories; if (name) { filteredInventories = filteredInventories.filter( (inventory) => inventory.tradeName && inventory.tradeName.includes(name.toLowerCase()) ); } // Calculate total count of filtered data const total_data = filteredInventories.length; // Apply pagination after filtering const paginatedInventories = filteredInventories.slice( (page - 1) * show, page * show ); // Calculate total pages const total_pages = Math.ceil(total_data / show); // Send response with pagination info res.status(200).json({ total_data, total_pages, current_page: Number(page), inventories: paginatedInventories, }); } catch (error) { console.error("Error in getAllInventories:", error); res.status(500).json({ message: error.message }); } }; // Get single inventory export const getSingleInventory = async (req, res) => { try { const { id } = req.params; const inventory = await Inventory.findById(id); if (!inventory) { return res.status(404).json({ message: "Inventory not found" }); } // 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, }; } else if (inventory.addedFor === "RetailDistributor") { addedForData = await KYC.findById(inventory.addedForId); } res.status(200).json({ ...inventory.toObject(), user, addedForData, }); } catch (error) { res.status(500).json({ message: error.message }); } };