Files
kavehhn a9432b96c0 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
2026-08-11 20:09:10 +03:30

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 })
})