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:
2026-08-11 20:09:10 +03:30
parent 0fe799e008
commit a9432b96c0
11 changed files with 653 additions and 6 deletions
@@ -0,0 +1,26 @@
const express = require('express')
const warehouseItemController = require('./warehouseItemController')
const loginCheck = require('../../middlewares/loginCheck')
const router = new express.Router()
router.use(loginCheck.loginProtect)
// ─── Items ────────────────────────────────────────────────────────────────────
router.get('/admin/items', warehouseItemController.listItems)
router.post('/admin/items', warehouseItemController.createItem)
router.get('/admin/items/:itemId', warehouseItemController.getItem)
router.patch('/admin/items/:itemId', warehouseItemController.updateItem)
router.delete('/admin/items/:itemId', warehouseItemController.deleteItem)
// ─── Transactions ─────────────────────────────────────────────────────────────
router.get('/admin/transactions', warehouseItemController.listTransactions)
router.post('/admin/transactions', warehouseItemController.createTransaction)
router.delete('/admin/transactions/:transactionId', warehouseItemController.deleteTransaction)
// ─── Stock ────────────────────────────────────────────────────────────────────
router.get('/admin/stock/total', warehouseItemController.getTotalStock)
router.get('/admin/stock/by-item/:itemId', warehouseItemController.getStockByItem)
router.get('/admin/stock/by-warehouse/:warehouseId', warehouseItemController.getStockByWarehouse)
module.exports = router