/// <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); }
/// <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; }
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(); } } }