public SkuEntity Find(string id)
        {
            // Parse forward to the sku element for that id
            XElement skuElement = FindSkuElement(id);

            if (skuElement == null)
            {
                return(null);
            }

            SkuEntity skuEntity = new SkuEntity();

            // Set id
            skuEntity.Id = id;

            // Load properties
            skuEntity.Label        = skuElement.Element("label").Value;
            skuEntity.Price        = skuElement.Element("price").Value.SafeParse <decimal>(0);
            skuEntity.DiscountType = skuElement.Element("discounts").Attribute("selection").Value.SafeParse <DiscountTypes>(DiscountTypes.noDiscount);

            // Load the right discount entity
            LoadDiscountEntity(ref skuEntity, skuElement.Element("discounts"));

            return(skuEntity);
        }
Esempio n. 2
0
        public async Task <TData <string> > SaveForm(SkuEntity entity)
        {
            TData <string> obj = new TData <string>();
            await skuService.SaveForm(entity);

            obj.Data = entity.Id.ParseToString();
            obj.Tag  = 1;
            return(obj);
        }
        private void LoadDiscountEntity(ref SkuEntity skuEntity, XElement discountsElement)
        {
            // Make sure we start with a clean slate
            skuEntity.SimpleDiscountEntity = null;
            skuEntity.GroupDiscountEntity  = null;
            skuEntity.AddonDiscountEntity  = null;

            string discountTypeStr = skuEntity.DiscountType.ToString();

            switch (skuEntity.DiscountType)
            {
            case DiscountTypes.noDiscount:
                return;

            case DiscountTypes.simpleDiscount:
                skuEntity.SimpleDiscountEntity =
                    new Entities.Discounts.SimpleDiscountEntity
                {
                    EffectiveFromDate = discountsElement.Element(discountTypeStr).Attribute("effectiveFromDate").Value.SafeParse <DateTime>(default(DateTime)),
                    EffectiveToDate   = discountsElement.Element(discountTypeStr).Attribute("effectiveToDate").Value.SafeParse <DateTime>(default(DateTime)),
                    Label             = discountsElement.Element(discountTypeStr).Element("label").Value,
                    DiscountedPrice   = discountsElement.Element(discountTypeStr).Element("discountedPrice").Value.SafeParse <decimal>(0),
                };
                return;

            case DiscountTypes.groupDiscount:
                skuEntity.GroupDiscountEntity =
                    new Entities.Discounts.GroupDiscountEntity
                {
                    EffectiveFromDate = discountsElement.Element(discountTypeStr).Attribute("effectiveFromDate").Value.SafeParse <DateTime>(default(DateTime)),
                    EffectiveToDate   = discountsElement.Element(discountTypeStr).Attribute("effectiveToDate").Value.SafeParse <DateTime>(default(DateTime)),
                    Label             = discountsElement.Element(discountTypeStr).Element("label").Value,
                    GroupCount        = discountsElement.Element(discountTypeStr).Element("groupCount").Value.SafeParse <decimal>(0),
                    GroupPrice        = discountsElement.Element(discountTypeStr).Element("groupPrice").Value.SafeParse <decimal>(0),
                };
                return;

            case DiscountTypes.addonDiscount:
                skuEntity.AddonDiscountEntity =
                    new Entities.Discounts.AddonDiscountEntity
                {
                    EffectiveFromDate    = discountsElement.Element(discountTypeStr).Attribute("effectiveFromDate").Value.SafeParse <DateTime>(default(DateTime)),
                    EffectiveToDate      = discountsElement.Element(discountTypeStr).Attribute("effectiveToDate").Value.SafeParse <DateTime>(default(DateTime)),
                    Label                = discountsElement.Element(discountTypeStr).Element("label").Value,
                    BaseCount            = discountsElement.Element(discountTypeStr).Element("baseCount").Value.SafeParse <decimal>(0),
                    AddonCount           = discountsElement.Element(discountTypeStr).Element("addonCount").Value.SafeParse <decimal>(0),
                    AddonDiscountPercent = discountsElement.Element(discountTypeStr).Element("addonDiscountPercent").Value.SafeParse <decimal>(0),
                };
                return;

            default:
                return;
            }
        }
Esempio n. 4
0
        public async Task SaveForm(SkuEntity entity)
        {
            if (entity.Id.IsNullOrZero())
            {
                await entity.Create();

                await this.BaseRepository().Insert(entity);
            }
            else
            {
                await this.BaseRepository().Update(entity);
            }
        }
Esempio n. 5
0
        public static SkuModel Mapper(SkuEntity sEntity)
        {
            SkuModel sModel = new SkuModel
            {
                Barcode   = sEntity.Barcode,
                Color     = sEntity.Color,
                Id        = sEntity.Id,
                Name      = sEntity.Name,
                Price     = sEntity.Price,
                ProductId = sEntity.ProductEntityId,
                ImageUrl  = sEntity.ImageUrl
            };

            return(sModel);
        }
Esempio n. 6
0
        public static SkuEntity Mapper(SkuModel sModel)
        {
            SkuEntity sEntity = new SkuEntity
            {
                Id              = sModel.Id,
                Name            = sModel.Name,
                Price           = sModel.Price,
                Color           = sModel.Color,
                Barcode         = sModel.Barcode,
                ProductEntityId = sModel.ProductId,
                ImageUrl        = sModel.ImageUrl
            };

            return(sEntity);
        }
Esempio n. 7
0
        public LineItem GenerateDiscountLineItem(SkuEntity skuEntity, BasketItemEntity basketItem)
        {
            if (Utils.IsCurrentDateTimeWithinRange(skuEntity.SimpleDiscountEntity.EffectiveFromDate, skuEntity.SimpleDiscountEntity.EffectiveToDate))
            {
                return(new LineItem
                {
                    LineItemType = DiscountTypes.simpleDiscount,
                    Label = skuEntity.SimpleDiscountEntity.Label,
                    Sku = skuEntity.Id,
                    Total = (skuEntity.SimpleDiscountEntity.DiscountedPrice - skuEntity.Price) * basketItem.Qty
                });
            }

            return(null);
        }
Esempio n. 8
0
 public IActionResult DeleteSkuById(Guid Id)
 {
     try
     {
         DBContext     _context  = new DBContext();
         LogController log       = new LogController();
         SkuEntity     skuEntity = _context.Skus.Where(x => x.Id == Id).FirstOrDefault();
         log.LogRegister(skuEntity, "Deleted", Models.Enums.LogTypeEnum.Skus);
         _context.Remove(skuEntity);
         _context.SaveChanges();
         return(RedirectToAction("SucessMessage", "Home", new { message = "Sku have been deleted.|Index" }));
     }
     catch (Exception)
     {
         return(RedirectToAction("ErrorMessage", "Home", new { message = "Sku have not been deleted.|Index" }));
     }
 }
        public LineItem GenerateDiscountLineItem(SkuEntity skuEntity, BasketItemEntity basketItem)
        {
            if (Utils.IsCurrentDateTimeWithinRange(skuEntity.GroupDiscountEntity.EffectiveFromDate, skuEntity.GroupDiscountEntity.EffectiveToDate))
            {
                // We already gave the discount as customer already bought more than the group count.
                // This could change based on future requirements and business rules
                if (skuCounter.ContainsKey(skuEntity.Id))
                {
                    // First check if the group discount was already given for this item
                    if (skuCounter[skuEntity.Id] == discountAlreadyGivenFlag)
                    {
                        return(null);
                    }

                    // Keep a count of items
                    skuCounter[skuEntity.Id] = skuCounter[skuEntity.Id] + basketItem.Qty;
                }
                else
                {
                    // Add the item for the first time to start tracking it its count
                    skuCounter.Add(skuEntity.Id, basketItem.Qty);
                }

                // Now check if we've reached the group count required to give a discount. This should happen only once once. We don't want to keep giving discounts after it goes over 3 for example
                if (skuCounter[skuEntity.Id] >= skuEntity.GroupDiscountEntity.GroupCount)
                {
                    skuCounter[skuEntity.Id] = discountAlreadyGivenFlag;

                    return(new LineItem
                    {
                        LineItemType = DiscountTypes.groupDiscount,
                        Label = skuEntity.GroupDiscountEntity.Label,
                        Sku = skuEntity.Id,
                        Total = (skuEntity.GroupDiscountEntity.GroupPrice - (skuEntity.GroupDiscountEntity.GroupCount * skuEntity.Price))
                    });
                }
            }

            return(null);
        }
Esempio n. 10
0
        public static List <SkuEntity> Mapper(List <SkuModel> smList)
        {
            List <SkuEntity> seList = new List <SkuEntity>();

            foreach (var sm in smList)
            {
                SkuEntity sEntity = new SkuEntity
                {
                    Id              = sm.Id,
                    Name            = sm.Name,
                    Price           = sm.Price,
                    Color           = sm.Color,
                    Barcode         = sm.Barcode,
                    ProductEntityId = sm.ProductId,
                    ImageUrl        = sm.ImageUrl
                };

                seList.Add(sEntity);
            }

            return(seList);
        }
Esempio n. 11
0
        public async Task <ActionResult> SaveFormJson(SkuEntity entity)
        {
            TData <string> obj = await skuBLL.SaveForm(entity);

            return(Json(obj));
        }
 public LineItem GenerateDiscountLineItem(SkuEntity skuEntity, BasketItemEntity basketItem)
 {
     return(null);
 }
        public LineItem GenerateDiscountLineItem(SkuEntity skuEntity, BasketItemEntity basketItem)
        {
            if (Utils.IsCurrentDateTimeWithinRange(skuEntity.AddonDiscountEntity.EffectiveFromDate, skuEntity.AddonDiscountEntity.EffectiveToDate))
            {
                decimal lastRemainderQtyNotGivenDiscount = 0;

                // Keep a tally on the remainder qty that a discount wasn't applied to because it wasn't sufficient
                if (skuCounter.ContainsKey(skuEntity.Id))
                {
                    lastRemainderQtyNotGivenDiscount = skuCounter[skuEntity.Id];
                }
                else
                {
                    skuCounter.Add(skuEntity.Id, 0);
                }

                // Add the total qty of the minimum to defined to qualify for a discount
                decimal totalAddonAndBase = skuEntity.AddonDiscountEntity.AddonCount + skuEntity.AddonDiscountEntity.BaseCount;

                // Calculate the ratio to apply the discount to
                decimal discountQtyApplyRatio =
                    (skuEntity.AddonDiscountEntity.AddonCount / totalAddonAndBase);

                // Calculate the qty to apply the addon discount to
                decimal qualifyingQtyForDiscount = basketItem.Qty + lastRemainderQtyNotGivenDiscount;

                // Now apply the discount ratio to the qualified quantity
                decimal addonQtyToBeDiscounted = 0;
                decimal regularPrice           = 0;
                decimal discountAmount         = 0;
                decimal remainderNonQualified  = 0;

                if (qualifyingQtyForDiscount >= totalAddonAndBase)
                {
                    // Calculate the discount amount
                    regularPrice           = qualifyingQtyForDiscount * skuEntity.Price;
                    addonQtyToBeDiscounted = discountQtyApplyRatio * qualifyingQtyForDiscount;
                    discountAmount         = -(addonQtyToBeDiscounted * skuEntity.Price * skuEntity.AddonDiscountEntity.AddonDiscountPercent / 100);

                    // Remainder quantity not given discount so far so we count it on the next call
                    remainderNonQualified = qualifyingQtyForDiscount - addonQtyToBeDiscounted;

                    return(new LineItem
                    {
                        LineItemType = DiscountTypes.addonDiscount,
                        Label = skuEntity.AddonDiscountEntity.Label,
                        Sku = skuEntity.Id,
                        Total = discountAmount
                    });
                }
                else
                {
                    remainderNonQualified = qualifyingQtyForDiscount;
                }

                // Store the remainder that could not qualify for next time to accumulate and hopefully qualify again
                skuCounter[skuEntity.Id] = remainderNonQualified;
            }

            return(null);
        }