namespace NetinaShop.Core.EntityServices.DiscountHandlers; public class CalculateOrderDiscountCommandHandler : IRequestHandler { private readonly IRepositoryWrapper _repositoryWrapper; public CalculateOrderDiscountCommandHandler(IRepositoryWrapper repositoryWrapper) { _repositoryWrapper = repositoryWrapper; } public async Task Handle(CalculateOrderDiscountCommand request, CancellationToken cancellationToken) { if (request.Order == null) throw new AppException("Order is null", ApiResultStatusCode.BadRequest); var discount = await _repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.Code == request.DiscountCode, cancellationToken); if (discount == null) throw new AppException("تخفیف وجود منقضی شده است یا وجود ندارد", ApiResultStatusCode.NotFound); double discountPrice = 0; if (discount.Type == DiscountType.All) { if (!discount.IsExpired()) { var totalPrice = request.Order.OrderProducts.Sum(op => op.ProductCost); discountPrice = discount.AmountType == DiscountAmountType.Amount ? totalPrice - discount.DiscountAmount : totalPrice - ((totalPrice / 100) * discount.DiscountAmount); } } else if (discount.Type == DiscountType.Category) { var categoryDiscount = await _repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.Code == request.DiscountCode, cancellationToken); if ( categoryDiscount!=null && !categoryDiscount.IsExpired()) { var totalPrice = request.Order.OrderProducts.Where(op => op.ProductCategoryId == categoryDiscount.CategoryId).Sum(op => op.ProductCost); discountPrice = discount.AmountType == DiscountAmountType.Amount ? totalPrice - discount.DiscountAmount : totalPrice - ((totalPrice / 100) * discount.DiscountAmount); } } else if (discount.Type == DiscountType.Product) { var productDiscount = await _repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.Code == request.DiscountCode, cancellationToken); if (productDiscount != null && !productDiscount.IsExpired()) { var totalPrice = request.Order.OrderProducts.Where(op => op.ProductId == productDiscount!.ProductId).Sum(op => op.ProductCost); discountPrice = discount.AmountType == DiscountAmountType.Amount ? totalPrice - discount.DiscountAmount : totalPrice - ((totalPrice / 100) * discount.DiscountAmount); } } else if (discount.Type == DiscountType.Subscriber) { throw new NotImplementedException("Subscribe discount not implemented"); } return discountPrice; } }