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;