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,39 @@
const mongoose = require('mongoose')
const ObjectID = mongoose.Schema.Types.ObjectId
// Running balance snapshot per (item × warehouse)
// Updated atomically on each transaction using $inc
// Acts as a fast-read cache — transactions are the source of truth
const warehouseItemStockSchema = new mongoose.Schema(
{
item: {
type: ObjectID,
ref: 'WarehouseItem',
required: true,
},
warehouse: {
type: ObjectID,
ref: 'Warehouse',
required: true,
},
quantity: {
type: Number,
default: 0, // current balance
},
unit: {
type: String,
},
unitEn: {
type: String,
},
},
{
timestamps: true,
}
)
// Guarantee one document per (item, warehouse) combination
warehouseItemStockSchema.index({ item: 1, warehouse: 1 }, { unique: true })
const WarehouseItemStock = mongoose.model('WarehouseItemStock', warehouseItemStockSchema)
module.exports = WarehouseItemStock