Initial commit
This commit is contained in:
85
server/controllers/inventoryController.js
Normal file
85
server/controllers/inventoryController.js
Normal 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 };
|
||||
|
||||
Reference in New Issue
Block a user