Initial commit

This commit is contained in:
2026-09-16 17:36:46 +05:30
commit c9f429d123
117 changed files with 14145 additions and 0 deletions

View File

@@ -0,0 +1,85 @@
const Product = require('../models/Product');
const InventoryHistory = require('../models/InventoryHistory');
const { successResponse, errorResponse } = require('../utils/apiResponse');
// @desc Get stock overview & alerts (Admin)
// @route GET /api/inventory/overview
// @access Private/Admin
const getStockOverview = async (req, res, next) => {
try {
const products = await Product.find({})
.select('name sku stock lowStockThreshold price category brand images')
.populate('category', 'name')
.populate('brand', 'name');
const lowStock = products.filter(p => p.stock > 0 && p.stock <= p.lowStockThreshold);
const outOfStock = products.filter(p => p.stock === 0);
return successResponse(res, 'Stock overview retrieved', {
totalProducts: products.length,
lowStockCount: lowStock.length,
outOfStockCount: outOfStock.length,
lowStock,
outOfStock,
products
});
} catch (error) {
next(error);
}
};
// @desc Adjust inventory stock level (Admin)
// @route POST /api/inventory/adjust
// @access Private/Admin
const adjustStock = async (req, res, next) => {
try {
const { productId, newStock, reason, changeType = 'Manual Adjustment' } = req.body;
const product = await Product.findById(productId);
if (!product) {
return errorResponse(res, 'Product not found', [], 404);
}
const previousStock = product.stock;
const quantityChanged = Number(newStock) - previousStock;
product.stock = Number(newStock);
await product.save();
// Log history
const history = await InventoryHistory.create({
product: product._id,
sku: product.sku,
changeType,
quantityChanged,
previousStock,
newStock: product.stock,
reason: reason || 'Manual admin inventory adjustment',
performedBy: req.user._id
});
return successResponse(res, 'Stock adjusted successfully', { product, history });
} catch (error) {
next(error);
}
};
// @desc Get complete inventory change audit log (Admin)
// @route GET /api/inventory/history
// @access Private/Admin
const getInventoryHistory = async (req, res, next) => {
try {
const history = await InventoryHistory.find({})
.populate('product', 'name images')
.populate('performedBy', 'name email')
.sort({ createdAt: -1 })
.limit(100);
return successResponse(res, 'Inventory history audit log retrieved', history);
} catch (error) {
next(error);
}
};
module.exports = { getStockOverview, adjustStock, getInventoryHistory };