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 } = req.query; // Build query const query = {}; if (startDate && endDate) { const start = new Date(startDate); const end = new Date(endDate); if (start.toDateString() === end.toDateString()) { // 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 }; } 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), }; } } else if (startDate) { // Only startDate is provided query.createdAt = { $gte: new Date(startDate), $lte: new Date(), // Up to today's date }; } else if (endDate) { // Only endDate is provided query.createdAt = { $lte: new Date(endDate), }; } // Fetch total count of documents matching the query const total_data = await Inventory.countDocuments(query); // Fetch inventory data with pagination const inventories = await Inventory.find(query) .skip((page - 1) * show) .limit(Number(show)) .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); } // 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, }; }) ); // Send response with pagination info res.status(200).json({ total_data, inventories: populatedInventories, }); } catch (error) { res.status(500).json({ message: error.message }); } }; 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 }); } };