public void ApplyDiscount(Order order) { //indirimi bul uygula DiscountCalculateItem discountCalculateItem = DiscountCalculator.CalculateAndApplyDiscount(order); //indirmi orderDetail'a paylaştır if (discountCalculateItem != null) { DiscountCalculator.CalculateAndApplyUnitDiscount(discountCalculateItem); } }
public override void CalculateAndApplyUnitDiscount(DiscountCalculateItem discountCalculateItem) { decimal unitDiscountAmount = discountCalculateItem.DiscountAmount / discountCalculateItem.TotalQuantity; List <OrderDetail> orderDetailList = OrderDetailService.GetListByOrderIdCategoryId(discountCalculateItem.OrderId, discountCalculateItem.CategoryId); foreach (var orderDetail in orderDetailList) { orderDetail.TotalDiscountAmount = orderDetail.TotalDiscountAmount + unitDiscountAmount * orderDetail.Quantity; OrderDetailService.Update(orderDetail); } }
public override DiscountCalculateItem CalculateAndApplyDiscount(Order order) { //step1: sepette her kategoride toplam kaç ürün var List <OrderDetail> orderDetailList = OrderDetailService.GetByOrderId(order.Id); var orderDetailSummaryList = orderDetailList.GroupBy(p => p.CategoryId).Select(g => new { CategoryId = g.Key, Quantity = g.Sum(t => t.Quantity) }); //step2: her kategori için geçerli kampanyaları bul ve indirimi hesapla List <DiscountCalculateItem> discountCalculateItemList = new List <DiscountCalculateItem>(); foreach (var item in orderDetailSummaryList) { List <Campaign> currentCampaignList = _campaignService.GetCurrentCampaignList(item.CategoryId, item.Quantity); if (currentCampaignList.Count != 0) { foreach (var campaignItem in currentCampaignList) { DiscountCalculateItem discountCalculateItem = new DiscountCalculateItem(); discountCalculateItem.OrderId = order.Id; discountCalculateItem.CategoryId = item.CategoryId; discountCalculateItem.TotalQuantity = item.Quantity; if (campaignItem.DiscountType == (int)DiscountType.RATE) { discountCalculateItem.DiscountAmount = (order.OriginalPrice * campaignItem.Rate) / 100; } else if (campaignItem.DiscountType == (int)DiscountType.AMOUNT) { discountCalculateItem.DiscountAmount = campaignItem.DiscountAmount; } discountCalculateItemList.Add(discountCalculateItem); } } else { return(null); } } //step3:Max indirim tutarlı olanı bul var maxDiscountCampaign = discountCalculateItemList.OrderByDescending(i => i.DiscountAmount).First(); //indirimi order'a uygula order.TotalPrice = order.TotalPrice - maxDiscountCampaign.DiscountAmount; order.TotalCampaignAmount = maxDiscountCampaign.DiscountAmount; OrderService.Update(order); return(maxDiscountCampaign); }
public abstract void CalculateAndApplyUnitDiscount(DiscountCalculateItem discountCalculateItem);