- 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
64 lines
3.0 KiB
JavaScript
64 lines
3.0 KiB
JavaScript
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 })
|
|
})
|