Esempio n. 1
0
        /// <summary>
        /// 使用優惠券
        /// </summary>
        /// <param name="order">訂單</param>
        public virtual void Use(IOrder order)
        {
            if (!IsAvailable(order))
            {
                return;
            }

            var couponItem = new CouponOrderItem()
            {
                Name   = Name,
                Price  = 0,
                Count  = 1,
                Coupon = this
            };

            var amount = order.TotalAmount;

            if (AllowReuse)
            {
                var discount = (100 - DiscountPercent) / 100m;

                // amount * discount ^ count = Threshold
                // discount ^ count = Threshold / amount;
                // log_(Threshold / amount) discount = count

                var count = Convert.ToUInt32(Math.Ceiling(
                                                 Math.Log(decimal.ToDouble(Threshold / amount), decimal.ToDouble(discount))
                                                 ));

                if (Count.HasValue)
                {
                    count = Convert.ToUInt32(Math.Min(count, Count.Value));
                }

                couponItem.Price  = amount - new decimal(Math.Pow(decimal.ToDouble(discount), count)) * amount;
                couponItem.Price *= -1;

                #region 使用並扣除數量
                if (Count.HasValue)
                {
                    Count -= count;
                }

                order.Items.Add(couponItem);
                UsedOrder.Add(order);
                #endregion
            }
            else
            {
                couponItem.Price  = amount * DiscountPercent / 100m;
                couponItem.Price *= -1;

                #region 使用並扣除數量
                Count -= 1;
                order.Items.Add(couponItem);
                UsedOrder.Add(order);
                #endregion
            }
        }
Esempio n. 2
0
        /// <summary>
        /// 使用優惠券
        /// </summary>
        /// <param name="order">訂單</param>
        public void Use(IOrder order)
        {
            // 合併項目
            Cashier.MergeOrderItem <TOrderItemIdentifier>(order);

            while (IsAvailable(order))
            {
                // 適用於此優惠券項目
                var setItems = order.Items
                               .Where(x =>
                                      x is IOrderItem <TOrderItemIdentifier> item &&
                                      Set.Keys.Contains(item.Id)
                                      )
                               .Cast <IOrderItem <TOrderItemIdentifier> >();

                // 查詢目前占用
                var occupy = Cashier.GetTotalOccupyOrderItemCount(order);

                // 取得目前已經使用的項目
                CouponOrderItem couponOrderItem
                    = order.Items.SingleOrDefault(x => x is CouponOrderItem item && item.Coupon == this)
                      as CouponOrderItem;

                // 如果沒有則加入
                if (couponOrderItem == null)
                {
                    couponOrderItem = new CouponOrderItem()
                    {
                        Coupon = this,
                        Name   = Name,
                        Price  = -DiscountPrice
                    };

                    order.Items.Add(couponOrderItem);
                }

                // 累計
                couponOrderItem.Count++;

                // 更新占用項目
                foreach (var item in setItems)
                {
                    if (!couponOrderItem.OccupyOrderItemCount.ContainsKey(item))
                    {
                        couponOrderItem.OccupyOrderItemCount[item] = 0;
                    }
                    couponOrderItem.OccupyOrderItemCount[item] += Set[item.Id];
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// 使用優惠券
        /// </summary>
        /// <param name="order">訂單</param>
        public override void Use(IOrder order)
        {
            // 合併項目
            Cashier.MergeOrderItem <TOrderItemIdentifier>(order);

            foreach (var orderItem in order.Items.ToArray())
            {
                if (IsAvailable(order, orderItem) &&
                    orderItem is IOrderItem <TOrderItemIdentifier> item)
                {
                    var totalOccupy = Cashier.GetTotalOccupyOrderItemCount(order);

                    var thisItemUsedCouponCount
                        = totalOccupy.ContainsKey(item) ?
                          totalOccupy[item].Sum(x => x.Value) :
                          0;

                    var count = item.Count - (uint)thisItemUsedCouponCount;

                    if (Count.HasValue)
                    {
                        count = Math.Min(Count.Value, count);
                    }

                    var couponItem = new CouponOrderItem()
                    {
                        Coupon = this,
                        Name   = Name,
                        Price  = -DiscountPrice,
                        Count  = count
                    };

                    couponItem.OccupyOrderItemCount[item] = count;

                    if (Count.HasValue)
                    {
                        Count -= couponItem.Count;
                    }

                    order.Items.Add(couponItem);
                }
            }
        }