ADD: Warehouse inventory management system
- Add WarehouseItem model with bilingual names (FA/EN) and bilingual counting units - Add WarehouseItemTransaction model for IN/OUT movements with reason and actor - Add WarehouseItemStock model for denormalized per-(item×warehouse) running balance - Add warehouseItemService with full CRUD, atomic stock updates via $inc, negative stock guard, and aggregation queries for per-item/per-warehouse/total stock - Add warehouseItemController and REST routes at /api/warehouse-items - Add warehouseService, warehouseController, warehouseRoutes for warehouse location CRUD at /api/warehouses - Register both route groups in routerEndpoints.js
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
const catchAsync = require('../../globalErrorHandler/catchAsync')
|
||||
const warehouseItemService = require('./warehouseItemService')
|
||||
|
||||
// ─── ITEMS ────────────────────────────────────────────────────────────────────
|
||||
|
||||
exports.createItem = catchAsync(async (req, res, next) => {
|
||||
const item = await warehouseItemService.createItem(req.body)
|
||||
res.status(201).json({ status: 'success', data: item })
|
||||
})
|
||||
|
||||
exports.listItems = catchAsync(async (req, res, next) => {
|
||||
const result = await warehouseItemService.listItems(req.query)
|
||||
res.status(200).json({ status: 'success', ...result })
|
||||
})
|
||||
|
||||
exports.getItem = catchAsync(async (req, res, next) => {
|
||||
const item = await warehouseItemService.getItem(req.params.itemId)
|
||||
res.status(200).json({ status: 'success', data: item })
|
||||
})
|
||||
|
||||
exports.updateItem = catchAsync(async (req, res, next) => {
|
||||
const item = await warehouseItemService.updateItem(req.params.itemId, req.body)
|
||||
res.status(200).json({ status: 'success', data: item })
|
||||
})
|
||||
|
||||
exports.deleteItem = catchAsync(async (req, res, next) => {
|
||||
await warehouseItemService.deleteItem(req.params.itemId)
|
||||
res.status(200).json({ status: 'success', data: null })
|
||||
})
|
||||
|
||||
// ─── TRANSACTIONS ─────────────────────────────────────────────────────────────
|
||||
|
||||
exports.createTransaction = catchAsync(async (req, res, next) => {
|
||||
const transaction = await warehouseItemService.createTransaction(req.body, req.user)
|
||||
res.status(201).json({ status: 'success', data: transaction })
|
||||
})
|
||||
|
||||
exports.listTransactions = catchAsync(async (req, res, next) => {
|
||||
const result = await warehouseItemService.listTransactions(req.query)
|
||||
res.status(200).json({ status: 'success', ...result })
|
||||
})
|
||||
|
||||
exports.deleteTransaction = catchAsync(async (req, res, next) => {
|
||||
await warehouseItemService.deleteTransaction(req.params.transactionId)
|
||||
res.status(200).json({ status: 'success', data: null })
|
||||
})
|
||||
|
||||
// ─── STOCK ────────────────────────────────────────────────────────────────────
|
||||
|
||||
exports.getStockByItem = catchAsync(async (req, res, next) => {
|
||||
const result = await warehouseItemService.getStockByItem(req.params.itemId)
|
||||
res.status(200).json({ status: 'success', data: result })
|
||||
})
|
||||
|
||||
exports.getStockByWarehouse = catchAsync(async (req, res, next) => {
|
||||
const stocks = await warehouseItemService.getStockByWarehouse(req.params.warehouseId)
|
||||
res.status(200).json({ status: 'success', results: stocks.length, data: stocks })
|
||||
})
|
||||
|
||||
exports.getTotalStock = catchAsync(async (req, res, next) => {
|
||||
const result = await warehouseItemService.getTotalStock()
|
||||
res.status(200).json({ status: 'success', results: result.length, data: result })
|
||||
})
|
||||
Reference in New Issue
Block a user