/* Return array of BasketSet, return null if package not applicable */ /* * Basket(Available) = {A:10, C:2, D:7} * Basket(Used) = {B:3} * Basket(Free) = {E:1} * BasketSet = {A={A:10, C:2, D:7}, U={B:3}, F={E:1}} */ public override CBasketSet ApplyPakageLogic(CBasketSet inBasket) { if (!isPackageEligible(res, null, false)) { res.SetInputBasketSet(inBasket.Clone()); res.SetOutputBasketSet(inBasket); addProcessingResult(res); return(inBasket); } Hashtable accumHash = getAccumulateHash(inBasket); Hashtable filterHash = getEligibleItemsHash(accumHash); CPrice accum = getAccumulatePrice(filterHash); CBasketSet output = finalizeOutput(inBasket, filterHash, accum); res.SetInputBasketSet(inBasket.Clone()); res.SetOutputBasketSet(output); addProcessingResult(res); if (giftCount <= 0) { res.SetErrorCode("ERROR_NO_PROMOTION_MATCH"); res.SetStatus(ProcessingResultStatus.ProcessingFail); } else { res.SetStatus(ProcessingResultStatus.ProcessingSuccess); } return(output); }
public CBasketSet MergeUsedToAvailable(CBasketSet inBasket, Boolean trayFlag) { BasketTypeEnum type1 = BasketTypeEnum.Available; BasketTypeEnum type2 = BasketTypeEnum.Used; String name = "MergeUsedToAvailable"; if (trayFlag) { type1 = BasketTypeEnum.AvailableTray; type2 = BasketTypeEnum.UsedTray; name = name + "Tray"; } CBasketSet output = new CBasketSet(); CProcessingResult res = new CProcessingResult(name); res.SetInputBasketSet(inBasket.Clone()); ArrayList useds = inBasket.GetAllBasketByType(type2); ArrayList avails = inBasket.GetAllBasketByType(type1); if (avails != null) { foreach (CBasket a in avails) { //Move the original 'Available' basket CBasket na = new CBasket(type1); na.CopyEntireFrom(a); output.AddBasket(na); } } if (useds != null) { foreach (CBasket u in useds) { CBasket nb = new CBasket(type1); nb.CopyEntireFrom(u); output.AddBasket(nb); } } Hashtable filterSet = new Hashtable(); filterSet[type1] = null; filterSet[type2] = null; copyBasketsExc(output, inBasket, filterSet); res.IsOperation = true; res.SetOutputBasketSet(output); res.SetStatus(ProcessingResultStatus.ProcessingSuccess); addProcessingResult(res); return(output); }
/* Return array of BasketSet, return null if package not applicable */ /* * Basket(Available) = {A:10, C:2, D:7} * Basket(Used) = {B:3} * Basket(Free) = {E:1} * BasketSet = {A={A:10, C:2, D:7}, U={B:3}, F={E:1}} */ public override CBasketSet ApplyPakageLogic(CBasketSet inBasket) { if (!isPackageEligible(res, null, false)) { res.SetInputBasketSet(inBasket.Clone()); res.SetOutputBasketSet(inBasket); addProcessingResult(res); return(inBasket); } Hashtable accumHash = getAccumulateHash(inBasket); Hashtable filterHash = getEligibleItemsHash(accumHash); //CPrice accum = getAccumulatePrice(filterHash); //totalBundleAmt created in finalizeOutput() and used in getAccumulatePrice() CBasketSet output = finalizeOutput(inBasket, filterHash); CPrice accum = getAccumulatePrice(filterHash); res.SetInputBasketSet(inBasket.Clone()); res.SetOutputBasketSet(output); Boolean priceMatched = calculateFinalDiscount(accum); addProcessingResult(res); if ((filterHash.Count <= 0) || (!priceMatched)) { res.SetErrorCode("ERROR_NO_PROMOTION_MATCH"); res.SetStatus(ProcessingResultStatus.ProcessingFail); } else { res.SetStatus(ProcessingResultStatus.ProcessingSuccess); } return(output); }
protected Boolean isPackageEligible(CProcessingResult res, CBasket inBsk, Boolean chkNullFlag) { if (chkNullFlag && (inBsk == null)) { res.SetErrorCode("ERROR_NO_PROMOTION_MATCH"); res.SetStatus(ProcessingResultStatus.ProcessingFail); return(false); } if (package.IsEnabled != true) { res.SetErrorCode("ERROR_PROMOTION_IS_DISABLE"); res.SetStatus(ProcessingResultStatus.ProcessingFail); return(false); } if (isNotEffectiveOrExpire(res)) { res.SetStatus(ProcessingResultStatus.ProcessingFail); return(false); } if (package.IsTimeSpecific == true) { Boolean isTimeOK = isTimeEligible(); if (!isTimeOK) { res.SetErrorCode("ERROR_TIME_NOT_MATCH"); res.SetStatus(ProcessingResultStatus.ProcessingFail); return(false); } } if (package.IsCustomerSpecific == true) { Boolean isCustomerOK = isCustomerEligible(); if (!isCustomerOK) { res.SetErrorCode("ERROR_CUSTOMER_NOT_MATCH"); res.SetStatus(ProcessingResultStatus.ProcessingFail); return(false); } } if (package.IsBranchSpecific == true) { Boolean isBranchOK = isBranchEligible(); if (!isBranchOK) { res.SetErrorCode("ERROR_BRANCH_NOT_MATCH"); res.SetStatus(ProcessingResultStatus.ProcessingFail); return(false); } } return(true); }
public CBasketSet SumInGroup(CBasketSet inBasket, BasketTypeEnum bt) { CBasketSet output = new CBasketSet(); CProcessingResult res = new CProcessingResult("SumInGroup-" + bt.ToString()); res.SetInputBasketSet(inBasket.Clone()); Hashtable quantities = new Hashtable(); Hashtable objects = new Hashtable(); ArrayList keys = new ArrayList(); ArrayList items = inBasket.GetAllBasketByType(bt); if (items == null) { items = new ArrayList(); } foreach (CBasket b in items) { int cnt = b.GetBasketItemCount(); for (int i = 0; i < cnt; i++) { CBasketItem bi = b.GetBasketItem(i); object o = quantities[bi.Key]; if (o == null) { quantities[bi.Key] = bi.Quantity; objects[bi.Key] = bi; keys.Add(bi.Key); } else { double tmp = (double)quantities[bi.Key]; tmp = tmp + bi.Quantity; quantities[bi.Key] = tmp; } } } CBasket bkt = new CBasket(bt); foreach (String k in keys) { CBasketItem bi = (CBasketItem)objects[k]; double qty = (double)quantities[k]; CBasketItem bki = new CBasketItem(k, bi.Item, qty); bkt.AddBasketItem(bki); } if (bkt.GetBasketItemCount() > 0) { output.AddBasket(bkt); } Hashtable filterSet = new Hashtable(); filterSet[bt] = null; copyBasketsExc(output, inBasket, filterSet); res.IsOperation = true; res.SetOutputBasketSet(output); res.SetStatus(ProcessingResultStatus.ProcessingSuccess); addProcessingResult(res); return(output); }
/* Return array of BasketSet, return null if package not applicable */ /* * Basket(Available) = {A:10, C:2, D:7} * Basket(Used) = {B:3} * Basket(Free) = {E:1} * BasketSet = {A={A:10, C:2, D:7}, U={B:3}, F={E:1}} */ public override CBasketSet ApplyPakageLogic(CBasketSet inBasket) { CBasket avBskt = inBasket.GetBasket(BasketTypeEnum.Available, 0); if (!isPackageEligible(res, avBskt, true)) { res.SetInputBasketSet(inBasket.Clone()); res.SetOutputBasketSet(inBasket); addProcessingResult(res); return(inBasket); } loadAllPossibleUsedAndFree(); int multiplier = minumConfigQty; Boolean done = false; int goodBasketCnt = 0; CBasket trackingBasket = null; CBasket lastTrackingBkt = null; while (!done) { trackingBasket = new CBasket(BasketTypeEnum.Available); int cnt = avBskt.GetBasketItemCount(); for (int i = 0; i < cnt; i++) { CBasketItem bi = avBskt.GetBasketItem(i); //Keep current amount of each item in the basket CBasketItem nbi = new CBasketItem(bi.Key, bi.Item, bi.Quantity); trackingBasket.AddBasketItem(nbi); } int status = ratioStatus(combinedHash, minumConfigQty, multiplier, trackingBasket); if (status == 0) { //Good basket are already kept lastTrackingBkt = trackingBasket; lastSuccessMultiplier = multiplier; triedCount++; goodBasketCnt++; } else if (status == 1) { done = true; } multiplier++; } if (goodBasketCnt <= 0) { //Unable to find the best match res.SetErrorCode("ERROR_NO_PROMOTION_MATCH"); res.SetStatus(ProcessingResultStatus.ProcessingFail); } else { res.SetStatus(ProcessingResultStatus.ProcessingSuccess); } CBasketSet output = finalizeOutput(inBasket, lastTrackingBkt, getLastGoodUsedBasket(), getLastGoodFreeBasket()); res.SetInputBasketSet(inBasket.Clone()); res.SetOutputBasketSet(output); addProcessingResult(res); return(output); }
/* Return array of BasketSet, return null if package not applicable */ /* * Basket(Available) = {A:10, C:2, D:7} * Basket(Used) = {B:3} * Basket(Free) = {E:1} * BasketSet = {A={A:10, C:2, D:7}, U={B:3}, F={E:1}} */ public override CBasketSet ApplyPakageLogic(CBasketSet inBasket) { //Support only first one Available type basket CBasket avBskt = inBasket.GetBasket(BasketTypeEnum.AvailableTray, 0); if (!isPackageEligible(res, avBskt, true)) { res.SetInputBasketSet(inBasket.Clone()); res.SetOutputBasketSet(inBasket); addProcessingResult(res); return(inBasket); } loadPackagePriceDefinitions(); int cnt = avBskt.GetBasketItemCount(); int matchCnt = 0; CBasket nb = new CBasket(BasketTypeEnum.PricedTray); CBasket db = new CBasket(BasketTypeEnum.DiscountedTray); CBasket absk = new CBasket(BasketTypeEnum.AvailableTray); //For each item in the "AvailableTray" basket for (int i = 0; i < cnt; i++) { CBasketItem bi = avBskt.GetBasketItem(i); CBasketItem bo = calculatePrice(bi); if (bo == null) { //Move to AvailableTray but in the new basket absk.AddBasketItem(bi); } else { matchCnt++; CBasketItem di = calculateDiscount(bo); if (di == null) { nb.AddBasketItem(bo); } else { db.AddBasketItem(di); } } } CBasketSet output = new CBasketSet(); if (nb.GetBasketItemCount() > 0) { output.AddBasket(nb); } if (db.GetBasketItemCount() > 0) { output.AddBasket(db); } if (absk.GetBasketItemCount() > 0) { output.AddBasket(absk); } Hashtable filterSet = new Hashtable(); filterSet[BasketTypeEnum.AvailableTray] = null; copyBasketsExc(output, inBasket, filterSet); if (matchCnt <= 0) { res.SetErrorCode("ERROR_NO_PROMOTION_MATCH"); res.SetStatus(ProcessingResultStatus.ProcessingFail); } else { res.SetStatus(ProcessingResultStatus.ProcessingSuccess); } res.SetInputBasketSet(inBasket.Clone()); res.SetOutputBasketSet(output); addProcessingResult(res); return(output); }
/* Return array of BasketSet, return null if package not applicable */ /* * Basket(Available) = {A:10, C:2, D:7} * Basket(Used) = {B:3} * Basket(Free) = {E:1} * BasketSet = {A={A:10, C:2, D:7}, U={B:3}, F={E:1}} */ public override CBasketSet ApplyPakageLogic(CBasketSet inBasket) { ArrayList priceds = inBasket.GetAllBasketByType(BasketTypeEnum.Priced); CBasketSet output = new CBasketSet(); int matchCnt = 0; if (!isPackageEligible(res, null, false)) { res.SetInputBasketSet(inBasket.Clone()); res.SetOutputBasketSet(inBasket); addProcessingResult(res); return(inBasket); } loadPackageDiscountDefinitions(); if (priceds == null) { priceds = new ArrayList(); } foreach (CBasket b in priceds) { int c = b.GetBasketItemCount(); CBasket nb = new CBasket(BasketTypeEnum.Discounted); CBasket absk = new CBasket(BasketTypeEnum.Priced); for (int i = 0; i < c; i++) { CBasketItem bi = b.GetBasketItem(i); CBasketItem bo = calculateDiscount(bi); if (bo != null) { matchCnt++; nb.AddBasketItem(bo); } else { //Move to Priced but in the new basket absk.AddBasketItem(bi); } } if (nb.GetBasketItemCount() > 0) { output.AddBasket(nb); } if (absk.GetBasketItemCount() > 0) { output.AddBasket(absk); } } Hashtable filterSet = new Hashtable(); filterSet[BasketTypeEnum.Priced] = null; copyBasketsExc(output, inBasket, filterSet); if (matchCnt <= 0) { res.SetErrorCode("ERROR_NO_PROMOTION_MATCH"); res.SetStatus(ProcessingResultStatus.ProcessingFail); } else { res.SetStatus(ProcessingResultStatus.ProcessingSuccess); } res.SetInputBasketSet(inBasket.Clone()); res.SetOutputBasketSet(output); addProcessingResult(res); return(output); }