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;
|
|
}
|
|
} |