示例#1
0
        public Tuple <bool, string> UpdateDiscountPolicy(User user, DiscountPolicy discountPolicy)
        {
            Logger.logEvent(this, System.Reflection.MethodBase.GetCurrentMethod());

            if (!owners.Contains(user.Name) && !managers.Contains(user.Name))
            {
                Logger.logEvent(this, System.Reflection.MethodBase.GetCurrentMethod(), CommonStr.StoreErrorMessage.notAOwnerOrManagerErrMsg);
                return(new Tuple <bool, string>(false, CommonStr.StoreErrorMessage.notAOwnerOrManagerErrMsg));
            }

            if (managers.Contains(user.Name))
            {
                if (!user.getUserPermission(Id, CommonStr.MangerPermission.DiscountPolicy))
                {
                    Logger.logEvent(this, System.Reflection.MethodBase.GetCurrentMethod(), CommonStr.StoreErrorMessage.ManagerNoPermissionErrMsg);
                    return(new Tuple <bool, string>(false, CommonStr.StoreErrorMessage.ManagerNoPermissionErrMsg));
                }
            }

            Tuple <bool, string> polcycheck = IsValidDiscountPolicy(discountPolicy);

            if (!polcycheck.Item1)
            {
                Logger.logEvent(this, System.Reflection.MethodBase.GetCurrentMethod(), CommonStr.StoreErrorMessage.DiscountPolicyErrMessage);
                return(polcycheck);
            }

            DiscountPolicy = discountPolicy;
            //DB update Discount Policy
            DbManager.Instance.UpdateDiscountPolicy(DiscountPolicy, this, true);
            return(new Tuple <bool, string>(true, ""));
        }
示例#2
0
        public IDiscountCalculator Get(DiscountPolicy type)
        {
            IDiscountCalculator discountCalculator;

            switch (type)
            {
            case DiscountPolicy.None:
            {
                discountCalculator = new NoDiscountCalculator();
                break;
            }
            //case DiscountType.Percent:
            //    {

            //        break;
            //    }
            //case DiscountType.FixedRate:
            //    {

            //        break;
            //    }
            default:
            {
                throw new NotImplementedException();
            }
            }

            return(discountCalculator);
        }
示例#3
0
 public Movie(string title, TimeSpan runningTime, Money fee, DiscountPolicy discountPolicy)
 {
     this.title          = title;
     this.runningTime    = runningTime;
     this.fee            = fee;
     this.discountPolicy = discountPolicy;
 }
        public void PopulateDiscount()
        {
            var apiDiscounts = HTTPRequests.GetDiscounts();

            foreach (var discount in apiDiscounts)
            {
                var newDiscount = new Discount
                {
                    Name       = discount.Name,
                    CategoryId = discount.CategoryId,
                    Policies   = new List <DiscountPolicy>()
                };

                _unitOfWork.Discount.Add(newDiscount);

                foreach (var policy in discount.Policies)
                {
                    var newPolicy = new DiscountPolicy
                    {
                        Discount   = policy.Discount,
                        DiscountId = newDiscount.Id,
                        Min        = policy.Min
                    };

                    _unitOfWork.DiscountPolicy.Add(newPolicy);
                    newDiscount.Policies.Add(newPolicy);
                }
            }

            _unitOfWork.Save();
        }
示例#5
0
 public Movie(string title, float runningTime, Money fee, DiscountPolicy discountPolicy)
 {
     m_Title          = title;
     m_RunningTime    = runningTime;
     m_Fee            = fee;
     m_DiscountPolicy = discountPolicy;
 }
        public Tuple <bool, string> UpdateDiscountPolicy(int storeId, string userName, string discountPolicy)
        {
            //throw new NotImplementedException();

            Logger.logEvent(this, System.Reflection.MethodBase.GetCurrentMethod());
            User user = userManager.GetAtiveUser(userName);

            if (user == null)
            {
                Logger.logEvent(this, System.Reflection.MethodBase.GetCurrentMethod(), CommonStr.StoreMangmentErrorMessage.userNotFoundErrMsg);
                return(new Tuple <bool, string>(false, CommonStr.StoreMangmentErrorMessage.userNotFoundErrMsg));
            }
            if (!stores.ContainsKey(storeId))
            {
                Logger.logEvent(this, System.Reflection.MethodBase.GetCurrentMethod(), CommonStr.StoreMangmentErrorMessage.nonExistingStoreErrMessage);
                return(new Tuple <bool, string>(false, CommonStr.StoreMangmentErrorMessage.nonExistingStoreErrMessage));
            }
            DiscountPolicy parsedDiscount = DiscountParser.Parse(discountPolicy);

            if (!DiscountParser.checkDiscount(parsedDiscount))
            {
                return(new Tuple <bool, string>(false, CommonStr.StoreMangmentErrorMessage.DiscountPolicyParsedFailed));
            }
            return(stores[storeId].UpdateDiscountPolicy(user, parsedDiscount));
        }
示例#7
0
    public async Task ShouldProcessDiscountOrder()
    {
        // arrange
        var saga = new DiscountPolicy
        {
            Data = new DiscountPolicyData()
        };
        var context = new TestableMessageHandlerContext();

        var discountOrder = new SubmitOrder
        {
            CustomerId  = Guid.NewGuid(),
            OrderId     = Guid.NewGuid(),
            TotalAmount = 1000
        };

        // act
        await saga.Handle(discountOrder, context)
        .ConfigureAwait(false);


        // assert
        var processMessage = (ProcessOrder)context.SentMessages[0].Message;

        Assert.That(processMessage.TotalAmount, Is.EqualTo(900));
        Assert.That(saga.Completed, Is.False);
    }
        public static DiscountPolicy DiscountAllThePizzas()
        {
            DiscountPolicy best = CreateBest(
                BuyOneGetOneFree,
                FivePercentOffMoreThanFiftyDollars,
                FiveDollarsOffStuffedCrust);

            return(best);
        }
示例#9
0
        public double GetBasketPriceWithDiscount(PurchaseBasket basket)
        {
            Logger.logEvent(this, System.Reflection.MethodBase.GetCurrentMethod());

            double basketPrice        = GetBasketOrigPrice(basket);
            double overallDiscount    = DiscountPolicy.CalcDiscount(basket);
            double priceAfterDiscount = basketPrice - overallDiscount;

            return(priceAfterDiscount);
        }
 // will return true iff <param> discountPolicy is a malformed discount, i.e failed
 // to parse, i.e if it is instance of RevealdDiscount with negative product id.
 public static bool checkDiscount(DiscountPolicy discountPolicy)
 {
     try
     {
         RevealdDiscount revealedDiscount = ((RevealdDiscount)discountPolicy);
         return(revealedDiscount.discountProdutId < 0 ? false : true);
     }
     catch (Exception)
     {
         return(true);
     }
 }
示例#11
0
        public decimal GetTotalPrice(IList <ProductPrice> productPrices, DiscountPolicy discountPolicy)
        {
            if (productPrices.IsEmpty())
            {
                throw new ArgumentNullException("productPrices");
            }

            IDiscountCalculator discountCalculator = _discountCalculatorFactory.Get(discountPolicy);
            decimal             totalPrice         = productPrices.Sum(x => x.Price);
            decimal             discount           = discountCalculator.Compute();

            return(totalPrice - discount);
        }
示例#12
0
    public async Task ShouldProcessRegularOrder()
    {
        var saga = new DiscountPolicy
        {
            Data = new DiscountPolicyData()
        };
        var context = new TestableMessageHandlerContext();

        var regularOrder = new SubmitOrder
        {
            CustomerId = Guid.NewGuid(),
            OrderId = Guid.NewGuid(),
            TotalAmount = 50
        };

        await saga.Handle(regularOrder, context);

        var processMessage = (ProcessOrder)context.SentMessages[0].Message;
        Assert.AreEqual(50, processMessage.TotalAmount);
    }
示例#13
0
    public async Task ShouldProcessRegularOrder()
    {
        var saga = new DiscountPolicy
        {
            Data = new DiscountPolicyData()
        };
        var context = new TestableMessageHandlerContext();

        var regularOrder = new SubmitOrder
        {
            CustomerId  = Guid.NewGuid(),
            OrderId     = Guid.NewGuid(),
            TotalAmount = 50
        };

        await saga.Handle(regularOrder, context);

        var processMessage = (ProcessOrder)context.SentMessages[0].Message;

        Assert.AreEqual(50, processMessage.TotalAmount);
    }
示例#14
0
    public async Task ShouldProcessDiscountOrder()
    {
        var saga = new DiscountPolicy
        {
            Data = new DiscountPolicyData()
        };
        var context = new TestableMessageHandlerContext();

        var discountOrder = new SubmitOrder
        {
            CustomerId  = Guid.NewGuid(),
            OrderId     = Guid.NewGuid(),
            TotalAmount = 1000
        };

        await saga.Handle(discountOrder, context)
        .ConfigureAwait(false);

        var processMessage = (ProcessOrder)context.SentMessages[0].Message;

        Assert.AreEqual(900, processMessage.TotalAmount);
    }
示例#15
0
        public DiscountPolicyData ToDiscountPolicyData(DiscountPolicy discountPolicy)
        {
            if (discountPolicy.GetType() == typeof(ConditionalProductDiscount))
            {
                int    discountProdutId   = ((ConditionalProductDiscount)discountPolicy).discountProdutId;
                int    preCondition       = ((ConditionalProductDiscount)discountPolicy).PreCondition.PreConditionNumber;
                double discountPrecentage = ((ConditionalProductDiscount)discountPolicy).Discount;
                return(new DiscountConditionalProductData(discountProdutId, preCondition, discountPrecentage));
            }

            else if (discountPolicy.GetType() == typeof(ConditionalBasketDiscount))
            {
                int    preCondition       = ((ConditionalBasketDiscount)discountPolicy).PreCondition.PreConditionNumber;
                double discountPrecentage = ((ConditionalBasketDiscount)discountPolicy).Discount;
                return(new DiscountConditionalBasketData(preCondition, discountPrecentage));
            }

            else if (discountPolicy.GetType() == typeof(RevealdDiscount))
            {
                int    discountProdutId   = ((RevealdDiscount)discountPolicy).discountProdutId;
                double discountPrecentage = ((RevealdDiscount)discountPolicy).discount;
                return(new DiscountRevealdData(discountProdutId, discountPrecentage));
            }

            else if (discountPolicy.GetType() == typeof(CompundDiscount))
            {
                int mergetype = ((CompundDiscount)discountPolicy).GetMergeType();
                List <DiscountPolicy>     policies = ((CompundDiscount)discountPolicy).getChildren();
                List <DiscountPolicyData> retList  = new List <DiscountPolicyData>();
                foreach (DiscountPolicy policy in policies)
                {
                    DiscountPolicyData newPolicyData = ToDiscountPolicyData(policy);
                    retList.Add(newPolicyData);
                }
                return(new CompoundDiscountPolicyData(mergetype, retList));
            }
            return(new DiscountPolicyData()); // not reached
        }
示例#16
0
 public Money CalculateMovieFee(Screening screening)
 {
     return(Fee.Minus(DiscountPolicy.CalculateDiscountAmount(screening)));
 }
        public void EvaluateDiscount_InvokedWithNull_ThrowsArgumentNullEx()
        {
            var discountPolicy = new DiscountPolicy();

            discountPolicy.EvaluateDiscount(null);
        }
示例#18
0
 public Movie(String title, TimeSpan runningTime, Money fee, DiscountPolicy discountPolicy)
 {
     Title          = title;
     RunningTime    = runningTime;
     DiscountPolicy = discountPolicy;
 }
示例#19
0
 public ProductOrderingCalulate(DiscountPolicy _discountPolicy)
 {
     discountPolicy = _discountPolicy;
 }
        public void EvaluateDiscount_InvokedWithNotNull_DoesntFail()
        {
            var discountPolicy = new DiscountPolicy();

            discountPolicy.EvaluateDiscount(order);
        }
示例#21
0
                public static DiscountPolicy CreateBest(params DiscountPolicy[] policies)
                {
                    DiscountPolicy policy = order => policies.Max(policy => policy.Invoke(order));

                    return(policy);
                }
示例#22
0
        public static DiscountPolicy DiscountAllTheProducts()
        {
            DiscountPolicy best = CreateBestDiscountPolicy(BuyOneGetOneFree, FivePercentOfMoreThanFiftyRMB, FiveRMBOffBody);

            return(best);
        }
 public PizzaOrderingSystem(DiscountPolicy discountPolicy)
 {
     this.discountPolicy = discountPolicy;
 }
示例#24
0
 public void ChangeDiscountPolicy(DiscountPolicy discountPolicy)
 {
     m_DiscountPolicy = discountPolicy;
 }
示例#25
0
        private Tuple <bool, string> IsValidDiscountPolicy(DiscountPolicy discountPolicy)
        {
            if (discountPolicy.GetType() == typeof(ConditionalProductDiscount))
            {
                int discountProdutId = ((ConditionalProductDiscount)discountPolicy).discountProdutId;
                if (!Inventory.InvProducts.ContainsKey(discountProdutId))
                {
                    return(new Tuple <bool, string>(false, CommonStr.InventoryErrorMessage.ProductNotExistErrMsg));
                }

                int preCondition = ((ConditionalProductDiscount)discountPolicy).PreCondition.preCondNumber;
                if (!(CommonStr.DiscountPreConditions.pre_min <= preCondition && preCondition <= CommonStr.DiscountPreConditions.pre_max))
                {
                    return(new Tuple <bool, string>(false, CommonStr.PoliciesErrors.PreConditionNumberErr));
                }

                double discountPrecentage = ((ConditionalProductDiscount)discountPolicy).Discount;
                if (!(0 <= discountPrecentage && discountPrecentage <= 100))
                {
                    return(new Tuple <bool, string>(false, CommonStr.PoliciesErrors.DiscountValueErr));
                }
                return(new Tuple <bool, string>(true, ""));
            }

            else if (discountPolicy.GetType() == typeof(ConditionalBasketDiscount))
            {
                int preCondition = ((ConditionalBasketDiscount)discountPolicy).PreCondition.preCondNumber;
                if (!(CommonStr.DiscountPreConditions.pre_min <= preCondition && preCondition <= CommonStr.DiscountPreConditions.pre_max))
                {
                    return(new Tuple <bool, string>(false, CommonStr.PoliciesErrors.PreConditionNumberErr));
                }
                double discountPrecentage = ((ConditionalBasketDiscount)discountPolicy).Discount;
                if (!(0 <= discountPrecentage && discountPrecentage <= 100))
                {
                    return(new Tuple <bool, string>(false, CommonStr.PoliciesErrors.DiscountValueErr));
                }
                return(new Tuple <bool, string>(true, ""));
            }

            else if (discountPolicy.GetType() == typeof(RevealdDiscount))
            {
                int discountProdutId = ((RevealdDiscount)discountPolicy).discountProdutId;
                if (!Inventory.InvProducts.ContainsKey(discountProdutId))
                {
                    return(new Tuple <bool, string>(false, CommonStr.InventoryErrorMessage.ProductNotExistErrMsg));
                }
                double discountPrecentage = ((RevealdDiscount)discountPolicy).discount;
                if (!(0 <= discountPrecentage && discountPrecentage <= 100))
                {
                    return(new Tuple <bool, string>(false, CommonStr.PoliciesErrors.DiscountValueErr));
                }
                return(new Tuple <bool, string>(true, ""));
            }

            else if (discountPolicy.GetType() == typeof(CompundDiscount))
            {
                int mergetype = ((CompundDiscount)discountPolicy).mergeType;
                if (!(0 <= mergetype && mergetype <= 2))
                {
                    return(new Tuple <bool, string>(false, CommonStr.PoliciesErrors.MergeTypeErr));
                }
                List <DiscountPolicy> policies = ((CompundDiscount)discountPolicy).getChildren();
                foreach (DiscountPolicy policy in policies)
                {
                    Tuple <bool, string> isvalidChildPolicy = IsValidDiscountPolicy(policy);
                    if (!isvalidChildPolicy.Item1)
                    {
                        return(isvalidChildPolicy);
                    }
                }

                return(new Tuple <bool, string>(true, ""));
            }
            return(null); // not reached
        }
示例#26
0
        public static DiscountPolicy DiscountAllPizzas()
        {
            DiscountPolicy best = CreateBest(BuyOneGetOneDiscount, FivePercentOffMorThanFiftyDollars);

            return(best);
        }
 public void remove(DiscountPolicy discount)
 {
     children.Remove(discount);
 }
 public void add(DiscountPolicy discountRule)
 {
     children.Add(discountRule);
 }
示例#29
0
 public Order()
 {
     _discountPolicy = DefaultPolicy();
     Id         = GenerateId();
     OrderLimit = OrderLimit.Unlimited();
 }
        public static DiscountPolicy Parse(string text)
        {
            if (simpleDiscountRegex.IsMatch(text))
            {
                if (conditionalBasketDiscountRegex.IsMatch(text))
                {
                    string[] constructs   = text.Split(':');
                    int      precondition = Convert.ToInt32(constructs[1]);
                    double   discount     = Convert.ToDouble(constructs[2]);
                    return(new ConditionalBasketDiscount(discount, new DiscountPreCondition(precondition)));
                }
                else if (conditionalBasketDiscountMBPRegex.IsMatch(text))
                {
                    string[] constructs     = text.Split(':');
                    int      precondition   = Convert.ToInt32(constructs[1]);
                    double   discount       = Convert.ToDouble(constructs[2]);
                    double   minBasketPrice = Convert.ToDouble(constructs[3]);
                    return(new ConditionalBasketDiscount(new DiscountPreCondition(precondition), discount, minBasketPrice));
                }
                else if (conditionalBasketDiscountMPPRegex.IsMatch(text))
                {
                    string[] constructs      = text.Split(':');
                    int      precondition    = Convert.ToInt32(constructs[1]);
                    double   discount        = Convert.ToDouble(constructs[2]);
                    double   minProductPrice = Convert.ToDouble(constructs[3]);
                    return(new ConditionalBasketDiscount(minProductPrice, discount, new DiscountPreCondition(precondition)));
                }
                else if (conditionalBasketDiscountMUBRegex.IsMatch(text))
                {
                    string[] constructs       = text.Split(':');
                    int      precondition     = Convert.ToInt32(constructs[1]);
                    double   discount         = Convert.ToDouble(constructs[2]);
                    int      minUnitsAtBasket = Convert.ToInt32(constructs[3]);
                    return(new ConditionalBasketDiscount(new DiscountPreCondition(precondition), discount, minUnitsAtBasket));
                }
                else if (conditionalProductDiscountRegex.IsMatch(text))
                {
                    string[] constructs   = text.Split(':');
                    int      minUnits     = Convert.ToInt32(constructs[1]);
                    int      productId    = Convert.ToInt32(constructs[2]);
                    int      precondition = Convert.ToInt32(constructs[3]);
                    double   discount     = Convert.ToDouble(constructs[4]);
                    return(new ConditionalProductDiscount(new DiscountPreCondition(precondition), discount, minUnits, productId));
                }
                else if (revealdDiscountRegex.IsMatch(text))
                {
                    string[] constructs = text.Split(':');
                    double   discount   = Convert.ToDouble(constructs[1]);
                    int      productId  = Convert.ToInt32(constructs[2]);
                    return(new RevealdDiscount(productId, discount));
                }
            }
            else // compount discount
            {
                int      counter    = 0;
                string   curr       = "";
                string[] constructs = Regex.Split(text, "(XOR|OR|AND)");
                if (constructs.Length <= 1)
                {
                    return(new RevealdDiscount(-1, -1));
                }
                string opStr = constructs[1];
                int    op    = opStr == "XOR" ? 0 : opStr == "OR" ? 1 : opStr == "AND" ? 2 : -1;
                if (op == -1)
                {
                    return(new RevealdDiscount(-3, -3));
                }
                string        restText  = text.Substring(opStr.Length + 2, text.Length - 1 - opStr.Length - 2);
                List <string> discounts = new List <string>();
                for (int i = 0; i < restText.Length; i++)
                {
                    if (restText[i] == '(')
                    {
                        if (counter == 0) // shift from 0 to 1 -> new element
                        {
                            curr = "";
                        }
                        counter++;
                    }
                    else if (restText[i] == ')')
                    {
                        if (counter == 1) // shift from 1 to 0 -> finish the current element
                        {
                            curr += restText[i];
                            discounts.Add(curr);
                            curr = "";
                        }
                        counter--;
                    }
                    else if (restText[i] == ' ' && counter == 0)
                    {
                        if (!discounts.Contains(curr) && curr != "")
                        {
                            discounts.Add(curr);
                            curr = "";
                        }
                    }
                    if (!(counter == 0 || curr == ")"))
                    {
                        curr += restText[i];
                    }
                    if (counter == 0 && restText[i] != ')' && restText[i] != '(' && restText[i] != ' ')
                    {
                        curr += restText[i];
                    }
                }
                if (curr != "")
                {
                    discounts.Add(curr);
                }
                if (counter != 0)
                {
                    return(new RevealdDiscount(-1, -1));
                }

                List <DiscountPolicy> children = new List <DiscountPolicy>();

                foreach (string discount in discounts)
                {
                    DiscountPolicy discountPolicy = Parse(discount);
                    if (checkDiscount(discountPolicy) == false) // this indicates an error!
                    {
                        return(new RevealdDiscount(-2, -2));
                    }
                    else
                    {
                        children.Add(discountPolicy);
                    }
                }
                DiscountPolicy compoundDiscount = new CompundDiscount(op, children);
                return(compoundDiscount);
            }
            return(new RevealdDiscount(-4, -4));
        }
示例#31
0
 public Order(OrderLimit limit)
 {
     _discountPolicy = DefaultPolicy();
     Id         = GenerateId();
     OrderLimit = limit;
 }