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, "")); }
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); }
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(); }
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)); }
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); }
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); } }
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); }
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); }
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); }
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 }
public Money CalculateMovieFee(Screening screening) { return(Fee.Minus(DiscountPolicy.CalculateDiscountAmount(screening))); }
public void EvaluateDiscount_InvokedWithNull_ThrowsArgumentNullEx() { var discountPolicy = new DiscountPolicy(); discountPolicy.EvaluateDiscount(null); }
public Movie(String title, TimeSpan runningTime, Money fee, DiscountPolicy discountPolicy) { Title = title; RunningTime = runningTime; DiscountPolicy = discountPolicy; }
public ProductOrderingCalulate(DiscountPolicy _discountPolicy) { discountPolicy = _discountPolicy; }
public void EvaluateDiscount_InvokedWithNotNull_DoesntFail() { var discountPolicy = new DiscountPolicy(); discountPolicy.EvaluateDiscount(order); }
public static DiscountPolicy CreateBest(params DiscountPolicy[] policies) { DiscountPolicy policy = order => policies.Max(policy => policy.Invoke(order)); return(policy); }
public static DiscountPolicy DiscountAllTheProducts() { DiscountPolicy best = CreateBestDiscountPolicy(BuyOneGetOneFree, FivePercentOfMoreThanFiftyRMB, FiveRMBOffBody); return(best); }
public PizzaOrderingSystem(DiscountPolicy discountPolicy) { this.discountPolicy = discountPolicy; }
public void ChangeDiscountPolicy(DiscountPolicy discountPolicy) { m_DiscountPolicy = discountPolicy; }
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 }
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); }
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)); }
public Order(OrderLimit limit) { _discountPolicy = DefaultPolicy(); Id = GenerateId(); OrderLimit = limit; }