diff --git a/src/CMSMicroservice.Application/OrderManagementCQ/Commands/CancelOrderByAdmin/CancelOrderByAdminCommandHandler.cs b/src/CMSMicroservice.Application/OrderManagementCQ/Commands/CancelOrderByAdmin/CancelOrderByAdminCommandHandler.cs index c53ea04..2a72c7b 100644 --- a/src/CMSMicroservice.Application/OrderManagementCQ/Commands/CancelOrderByAdmin/CancelOrderByAdminCommandHandler.cs +++ b/src/CMSMicroservice.Application/OrderManagementCQ/Commands/CancelOrderByAdmin/CancelOrderByAdminCommandHandler.cs @@ -10,15 +10,18 @@ public class CancelOrderByAdminCommandHandler : IRequestHandler _logger; public CancelOrderByAdminCommandHandler( IApplicationDbContext context, ICurrentUserService currentUser, + IInventoryService inventoryService, ILogger logger) { _context = context; _currentUser = currentUser; + _inventoryService = inventoryService; _logger = logger; } @@ -33,6 +36,7 @@ public class CancelOrderByAdminCommandHandler : IRequestHandler x.User) .ThenInclude(x => x.UserWallets) + .Include(x => x.FactorDetails) .FirstOrDefaultAsync(x => x.Id == request.OrderId && !x.IsDeleted, cancellationToken); if (order == null) @@ -87,6 +91,26 @@ public class CancelOrderByAdminCommandHandler : IRequestHandler CreateNewUserOrder(CreateNewUserOrderRequest request, ServerCallContext context) @@ -285,6 +287,18 @@ public class UserOrderService : UserOrderContract.UserOrderContractBase throw new RpcException(new Status(StatusCode.InvalidArgument, $"مبلغ نامعتبر است. محاسبه شده: {totalAmount}, دریافتی: {request.TotalAmount}")); } + + // Validate stock availability for all cart items before any financial operation + foreach (var cartItem in cartItems) + { + var available = await _inventoryService.GetAvailableQuantityAsync( + cartItem.ProductId, ProductType.RegularProduct, ct: context.CancellationToken); + if (available < cartItem.Count) + { + throw new RpcException(new Status(StatusCode.FailedPrecondition, + $"موجودی «{cartItem.Product.Title}» کافی نیست. موجود: {available}، درخواستی: {cartItem.Count}")); + } + } // Get user's wallet var wallet = await _context.UserWallets @@ -461,6 +475,18 @@ public class UserOrderService : UserOrderContract.UserOrderContractBase cartItem.IsDeleted = true; } + await _context.SaveChangesAsync(context.CancellationToken); + + // Deduct inventory and update SaleCount for each purchased item + foreach (var cartItem in cartItems) + { + await _inventoryService.ConfirmSaleAsync( + cartItem.ProductId, ProductType.RegularProduct, + cartItem.Count, order.Id, context.CancellationToken); + + cartItem.Product.SaleCount += cartItem.Count; + } + await _context.SaveChangesAsync(context.CancellationToken); return new SubmitShopBuyOrderResponse