/* 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);
        }
Beispiel #2
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        /* 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);
        }
Beispiel #6
0
        /* 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);
        }
Beispiel #7
0
        /* 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);
        }