/// <summary>
 ///  This Methods Add/update item to shopping cart
 /// </summary>
 /// <param name="BilledItems"></param>
 /// <param name="billedItem"></param>
 /// <param name="findItem"></param>
 public static void CheckItemAndAdd(Dictionary <int, BilledItem> BilledItems, BilledItem billedItem, Item findItem)
 {
     if (BilledItems.ContainsKey(findItem.Id))
     {
         BilledItems[findItem.Id] = billedItem;
     }
     else
     {
         BilledItems.Add(findItem.Id, billedItem);
     }
 }
        /// <summary>
        ///  To Create Shopping Cart item
        /// </summary>
        /// <param name="findItem"></param>
        /// <param name="Qnum"></param>
        /// <param name="discDtl"></param>
        /// <param name="totalCost"></param>
        /// <returns></returns>
        public static BilledItem CreateItem(Item findItem, double Qnum, String discDtl, double totalCost)
        {
            BilledItem billItem = new BilledItem
            {
                ItmName       = findItem.Name,
                ItmQuantity   = Qnum,
                ItmCost       = findItem.Cost,
                DisCntDetails = discDtl,
                TotCost       = totalCost
            };

            return(billItem);
        }
Example #3
0
        /// <summary>
        /// Generate bill with applying Weekly offers to added items in the shopping cart
        /// </summary>
        /// <param name="ShoppingCart"></param>
        /// <param name="offer"></param>
        public static Bill GenerateBill(Dictionary <Products, long> ShoppingCart, WeeklyOffer offer, PricePerItem productPrices)
        {
            // Generate bill object
            Bill custBill = new Bill();

            List <BilledItem> billedItems = new List <BilledItem>();

            foreach (Products item in ShoppingCart.Keys)
            {
                BilledItem billItem = new BilledItem();

                billItem.Product = item;

                Dictionary <long, double> offeredPriceForItem = offer.Offer.FirstOrDefault(kvp => kvp.Key == item).Value;

                long productCountInBucket = ShoppingCart[item];

                // apply Offer
                long howManyOnOfferedPrice = 0;

                offeredPriceForItem?.Keys?.OrderByDescending(v => v).ToList().ForEach(key => {
                    if (offeredPriceForItem != null && productCountInBucket >= key)
                    {
                        howManyOnOfferedPrice = productCountInBucket - (productCountInBucket % key);
                        billItem.ItemsWithOfferedPrice.Add(howManyOnOfferedPrice, ((howManyOnOfferedPrice / key) * offeredPriceForItem[key]));
                    }
                });

                // check without offer items and apply rate.
                long howManyWithoutOfferedPrice = productCountInBucket - billItem.ItemsWithOfferedPrice.Keys.Sum();

                if (howManyWithoutOfferedPrice > 0)
                {
                    billItem.ItemsWithPrice.Add(howManyWithoutOfferedPrice, howManyWithoutOfferedPrice * productPrices.PricePerProduct[item]);
                }

                // add billed items in the bill array
                billedItems.Add(billItem);
            }

            custBill.Products = billedItems;
            return(custBill);
        }
        /// <summary>
        ///  To Display All items in shoping cart
        /// </summary>
        /// <param name="BilledItems"></param>
        public static void DisplayBill(Dictionary <int, BilledItem> BilledItems)
        {
            double gTotal = 0;

            Console.WriteLine("-----------------------------------------------------------------------");
            Console.WriteLine("SNo | Item Name | Quantity | Unit Cost | Discount Details | Total Cost");
            Console.WriteLine("-----------------------------------------------------------------------");
            // foreach (BilledItem bItm in BilledItems)
            int count = 1;

            foreach (KeyValuePair <int, BilledItem> item in BilledItems)
            {
                BilledItem bItm = item.Value;
                Console.WriteLine(String.Format("{0,3} | {1,-9} | {2,8} | {3,9} | {4,-16} | {5,10}", count++, bItm.ItmName, bItm.ItmQuantity, bItm.ItmCost, bItm.DisCntDetails, bItm.TotCost.ToString() + "$"));
                gTotal = gTotal + bItm.TotCost;
            }
            Console.WriteLine("-----------------------------------------------------------------------");
            Console.WriteLine(String.Format("{0,57} | {1,10}", "Grand Total ", gTotal.ToString() + "$"));
            Console.WriteLine("-----------------------------------------------------------------------");
            Console.WriteLine("");
        }
        /// <summary>
        /// To Apply Discout Percentage for items in the cart based on item discount value specified
        /// </summary>
        /// <param name="BilledItems"></param>
        /// <param name="findCop"></param>
        /// <param name="findItem"></param>
        /// <param name="billedItem"></param>
        /// <param name="Qnum"></param>
        /// <remarks> This Method First calculates total item quantity  by iterating through items. Discount amt calculated based on discount % information available for item
        /// </remarks>
        public static void ApplyDiscountPct(Dictionary <int, BilledItem> BilledItems, DiscountCoupon findCop, Item findItem, BilledItem billedItem, double Qnum)
        {
            BilledItems.TryGetValue(findItem.Id, out BilledItem DictValue);
            double totalQty = Qnum;

            if (DictValue != null)
            {
                totalQty = DictValue.ItmQuantity + Qnum;
            }
            billedItem.DisCntDetails = findCop.CDetails.CDiscountVal.ToString() + findCop.CDetails.CUnit;
            billedItem.TotCost       = totalQty * findItem.Cost * (double)(100 - findCop.CDetails.CDiscountVal) / 100;
            billedItem.ItmQuantity   = totalQty;
        }
        /// <summary>
        /// To Apply Discount on Quantity
        /// </summary>
        /// <param name="BilledItems"></param>
        /// <param name="findCop"></param>
        /// <param name="findItem"></param>
        /// <param name="billedItem"></param>
        /// <param name="Qnum"></param>
        /// <remarks> This Methods First calculates total quantity by iterating through items if needed. Calculate Discount Quantity by adding Discount coupon details.
        ///  Total Discount Quantity will be calculated by dividing total quantity and Discount Quantity. Total cost will be calculated after removing discount quantity
        /// </remarks>
        public static void ApplyDiscount(Dictionary <int, BilledItem> BilledItems, DiscountCoupon findCop, Item findItem, BilledItem billedItem, double Qnum)
        {
            BilledItems.TryGetValue(findItem.Id, out BilledItem DictValue);
            double totalQty = Qnum;

            if (DictValue != null)
            {
                totalQty = DictValue.ItmQuantity + Qnum;
            }
            int    totalQtyWithDiscout = findCop.CDetails.CDiscountVal + findCop.CDetails.CMinVal;
            double totalDiscountQty    = (int)totalQty / totalQtyWithDiscout;

            billedItem.DisCntDetails = "Buy " + findCop.CDetails.CMinVal.ToString() + " Get " + findCop.CDetails.CDiscountVal.ToString() + " Free";
            billedItem.TotCost       = (totalQty - totalDiscountQty) * findItem.Cost;
            billedItem.ItmQuantity   = totalQty;
        }
Example #7
0
        static void Main(string[] args)
        {
            for (int i = 0; i < MyItems; i++)
            {
                try
                {
                    if (MyItems == 1)
                    {
                        Console.WriteLine("Welcome to the Store....");
                        Console.Write("Please scan the item code (Enter item Id):");
                    }
                    else if (MyItems >= 1)
                    {
                        Console.Write("Please scan the next item code (Enter item Id):");
                    }

                    string inputItem = Console.ReadLine();

                    if (Int32.TryParse(inputItem, out int num))// (foo, out int number1))
                    {
                        ItemRepository itemsRep = new ItemRepository();
                        Item           finditem = itemsRep.Retrieve(num);
                        if (finditem == null)
                        {
                            Console.WriteLine("Input is not a valid item Id!");
                        }
                        else
                        {
                            Console.WriteLine("Item Name : " + finditem.Name + " --  Item Cost : " + finditem.Cost.ToString() + "$");
                            Console.Write("Enter the Quantity in " + finditem.IType.Unit + " : ");
                            string inputQuantity = Console.ReadLine();

                            double Qnum       = 0;
                            bool   validInput = true;
                            // To check the item type and user input
                            if (finditem.IType.Type == "Count")
                            {
                                if (Int32.TryParse(inputQuantity, out int inum))
                                {
                                    validInput = true;
                                    Qnum       = inum;
                                }
                                else
                                {
                                    validInput = false;
                                }
                            }
                            else
                            {
                                if (double.TryParse(inputQuantity, out Qnum))
                                {
                                    validInput = true;
                                }
                                else
                                {
                                    validInput = false;
                                }
                            }
                            if (validInput && Qnum > 0)
                            {
                                DiscountRepository desCop  = new DiscountRepository();
                                DiscountCoupon     findCop = desCop.Retrieve(num);
                                //  For no discount items
                                if (findCop == null || findCop.CouponID == 0)
                                {
                                    //Console.WriteLine("No Discount");
                                    // To calculate Total quantity by iterating through shopping cart if needed
                                    double totalQty = CashRegisterService.CalculateQty(Qnum, BilledItesmDict, finditem);
                                    // Adding item to shopping cart Dictionary
                                    CashRegisterService.CheckItemAndAdd(BilledItesmDict, CashRegisterService.CreateItem(finditem, totalQty, "-", totalQty * finditem.Cost), finditem);

                                    CashRegisterService.DisplayBill(BilledItesmDict);
                                }
                                else
                                {
                                    Console.WriteLine("Discount Value:" + findCop.CDetails.CDiscountVal.ToString());

                                    BilledItem billItem = new BilledItem
                                    {
                                        ItmName     = finditem.Name,
                                        ItmQuantity = Qnum,
                                        ItmCost     = finditem.Cost
                                    };

                                    if (finditem.IType.Type == "Count")
                                    {
                                        int FreeItems = 0;
                                        try
                                        {
                                            FreeItems = Convert.ToInt32(Qnum) / findCop.CDetails.CMinVal;
                                        }
                                        catch (Exception)
                                        {
                                            Console.WriteLine("Exception occurred while calculating free items");
                                        }
                                        if (FreeItems > 0)
                                        {
                                            // To Calculate Discount for Qunatity based items
                                            CashRegisterService.ApplyDiscount(BilledItesmDict, findCop, finditem, billItem, Qnum);
                                        }
                                        else
                                        {
                                            billItem.DisCntDetails = "-";
                                            billItem.TotCost       = Qnum * finditem.Cost;
                                        }
                                    }
                                    else
                                    {
                                        if (Qnum >= findCop.CDetails.CMinVal)
                                        {
                                            // To Calculate Discount based on percentage
                                            CashRegisterService.ApplyDiscountPct(BilledItesmDict, findCop, finditem, billItem, Qnum);
                                        }
                                        else
                                        {
                                            billItem.DisCntDetails = "-";
                                            billItem.TotCost       = Qnum * finditem.Cost;
                                        }
                                    }
                                    // Adding item to shopping cart Dictionary
                                    CashRegisterService.CheckItemAndAdd(BilledItesmDict, billItem, finditem);
                                    CashRegisterService.DisplayBill(BilledItesmDict);
                                }
                            }
                            else
                            {
                                Console.WriteLine("Input is not a valid item Id!");
                            }
                        }
                    }
                    else
                    {
                        Console.WriteLine("Input is not a valid item Id!");
                    }
                    ContinuePurchase();
                }
                catch (FormatException e)
                {
                    Console.WriteLine("\n\n\n\n\n{0}\n\n\n\n", e.Message);
                    ContinuePurchase();
                }
            }
        }