diff --git a/Distribution/Features/Order/OrderService.cs b/Distribution/Features/Order/OrderService.cs
index 21e1527..aa00a6c 100644
--- a/Distribution/Features/Order/OrderService.cs
+++ b/Distribution/Features/Order/OrderService.cs
@@ -1,6 +1,7 @@
using Distribution.Features.Item;
using Distribution.Features.PriceList;
using Distribution.Features.Store;
+using Distribution.Features.Stock;
using Distribution.Infra.Authorization;
using Distribution.Infra.UoW;
using Distribution.Models;
@@ -12,6 +13,7 @@ public class OrderService(
IOrderRepository repo,
IStoreRepository storeRepo,
IItemRepository itemRepo,
+ IStockRepository stockRepo,
PriceListService priceListService,
IUnitOfWork uow,
ICurrentUserService currentUser,
@@ -56,6 +58,19 @@ public class OrderService(
return requestedUnitPrice.Value;
}
+ ///
+ /// checkStockAvailability (mainPlan.md §1): confirms the requested quantity does not exceed
+ /// total on-hand stock for the item, summed across every warehouse/vehicle location. Does not
+ /// reserve or decrement stock — actual decrement happens later at loading/delivery time
+ /// (04_loading_event.md / future 05-06 ride execution), not at order placement.
+ ///
+ private async Task HasSufficientStockAsync(Guid itemId, decimal quantity)
+ {
+ var balances = await stockRepo.GetBalancesByItemAsync(itemId);
+ var totalAvailable = balances.Sum(b => b.Quantity);
+ return quantity <= totalAvailable;
+ }
+
public async Task> GetAllAsync()
{
var orders = (await repo.GetAllAsync()).Where(o => o.IsActive).ToList();
@@ -116,6 +131,8 @@ public class OrderService(
var orderItems = new List();
foreach (var i in request.Items)
{
+ if (!await HasSufficientStockAsync(i.ItemId, i.Quantity)) return null;
+
var unitPrice = await ResolveUnitPriceAsync(i.ItemId, i.UnitPrice, store, request.OrderDate);
if (unitPrice is null) return null;