using CMSMicroservice.Application.Common.Interfaces; using CMSMicroservice.Domain.Enums; using MediatR; using Microsoft.EntityFrameworkCore; namespace CMSMicroservice.Application.DiscountShopCQ.Commands.CompleteOrderPayment; public class CompleteOrderPaymentCommandHandler : IRequestHandler { private readonly IApplicationDbContext _context; private readonly IInventoryService _inventoryService; public CompleteOrderPaymentCommandHandler( IApplicationDbContext context, IInventoryService inventoryService) { _context = context; _inventoryService = inventoryService; } public async Task Handle(CompleteOrderPaymentCommand request, CancellationToken cancellationToken) { var order = await _context.DiscountOrders .Include(o => o.OrderDetails) .ThenInclude(od => od.Product) .FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken); if (order == null) { return new CompleteOrderPaymentResponseDto { Success = false, Message = "سفارش یافت نشد" }; } var transaction = await _context.Transactions .FirstOrDefaultAsync(t => t.Id == request.TransactionId, cancellationToken); if (transaction == null) { return new CompleteOrderPaymentResponseDto { Success = false, Message = "تراکنش یافت نشد" }; } if (request.PaymentSuccess) { // Update transaction transaction.PaymentStatus = PaymentStatus.Success; transaction.PaymentDate = DateTime.Now; transaction.RefId = request.RefId; // Update order order.PaymentStatus = PaymentStatus.Success; order.PaymentDate = DateTime.Now; order.DeliveryStatus = DeliveryStatus.Pending; // Deduct discount balance from user wallet var userWallet = await _context.UserWallets .FirstOrDefaultAsync(w => w.UserId == order.UserId, cancellationToken); if (userWallet != null) { userWallet.DiscountBalance -= order.DiscountBalanceUsed; } // تایید فروش و کسر موجودی از طریق InventoryService foreach (var orderDetail in order.OrderDetails) { await _inventoryService.ConfirmSaleAsync( orderDetail.ProductId, ProductType.DiscountProduct, orderDetail.Count, order.Id, cancellationToken); // افزایش تعداد فروش orderDetail.Product.SaleCount += orderDetail.Count; } await _context.SaveChangesAsync(cancellationToken); return new CompleteOrderPaymentResponseDto { Success = true, Message = "پرداخت با موفقیت انجام شد", OrderId = order.Id }; } else { // Payment failed - آزادسازی رزرو foreach (var orderDetail in order.OrderDetails) { await _inventoryService.ReleaseReservationAsync( orderDetail.ProductId, ProductType.DiscountProduct, orderDetail.Count, order.Id, cancellationToken); } transaction.PaymentStatus = PaymentStatus.Reject; order.PaymentStatus = PaymentStatus.Reject; order.DeliveryStatus = DeliveryStatus.Cancelled; await _context.SaveChangesAsync(cancellationToken); return new CompleteOrderPaymentResponseDto { Success = false, Message = "پرداخت ناموفق بود", OrderId = order.Id }; } } }