59 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
| namespace NetinaShop.Repository.Handlers.Discounts;
 | |
| 
 | |
| public class CalculateDiscountCommandHandler : IRequestHandler<CalculateDiscountCommand , double>
 | |
| {
 | |
|     private readonly IRepositoryWrapper _repositoryWrapper;
 | |
| 
 | |
|     public CalculateDiscountCommandHandler(IRepositoryWrapper repositoryWrapper)
 | |
|     {
 | |
|         _repositoryWrapper = repositoryWrapper;
 | |
|     }
 | |
|     public async Task<double> Handle(CalculateDiscountCommand request, CancellationToken cancellationToken)
 | |
|     {
 | |
|         if (request.Order == null)
 | |
|             throw new AppException("Order is null", ApiResultStatusCode.BadRequest);
 | |
|         var discount = await _repositoryWrapper.SetRepository<Discount>()
 | |
|             .TableNoTracking
 | |
|             .FirstOrDefaultAsync(d => d.Code == request.DiscountCode, cancellationToken);
 | |
|         if (discount == null)
 | |
|             throw new AppException("Discount not found", ApiResultStatusCode.NotFound);
 | |
| 
 | |
|         double discountPrice = 0;
 | |
| 
 | |
|         if (discount.Type == DiscountType.All)
 | |
|         {
 | |
|             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<CategoryDiscount>()
 | |
|                 .TableNoTracking
 | |
|                 .FirstOrDefaultAsync(d => d.Code == request.DiscountCode, cancellationToken);
 | |
| 
 | |
|             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<ProductDiscount>()
 | |
|                 .TableNoTracking
 | |
|                 .FirstOrDefaultAsync(d => d.Code == request.DiscountCode, cancellationToken);
 | |
| 
 | |
|             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;
 | |
|     }
 | |
| } |