public decimal GetTotal() { decimal markdown; total = 0; foreach (KeyValuePair <string, decimal> LineItem in Receipt) { if (Specials.ContainsKey(LineItem.Key)) { decimal val = 0; decimal itemsLeft = LineItem.Value; Special GenericSpecial = Specials[LineItem.Key]; if (GenericSpecial.GetType() == typeof(SpecialBuyNgetMatXPctOff)) { SpecialBuyNgetMatXPctOff special = (SpecialBuyNgetMatXPctOff)GenericSpecial; while (itemsLeft > 0) { if ((itemsLeft > special.m) && (LineItem.Value - itemsLeft < special.limit)) { val += special.m; itemsLeft -= special.m; if (itemsLeft < special.n) { val += itemsLeft * (1 - special.pct); itemsLeft = 0; } else { val += special.n * (1 - special.pct); itemsLeft -= special.n; } } else { val += itemsLeft; itemsLeft = 0; } } total += (costList[LineItem.Key].cost - (MarkDownList.TryGetValue(LineItem.Key, out markdown) ? markdown : 0)) * val; } else if (GenericSpecial.GetType() == typeof(SpecialNForX)) { SpecialNForX special = (SpecialNForX)GenericSpecial; while ((itemsLeft >= special.n) && (LineItem.Value - itemsLeft < special.limit)) { itemsLeft -= special.n; total += (special.cost - (MarkDownList.TryGetValue(LineItem.Key, out markdown) ? markdown : 0)) * special.n; } total += (costList[LineItem.Key].cost - (MarkDownList.TryGetValue(LineItem.Key, out markdown) ? markdown : 0)) * itemsLeft; } } else { total += (costList[LineItem.Key].cost - (MarkDownList.TryGetValue(LineItem.Key, out markdown) ? markdown : 0)) * LineItem.Value; } } return(total); }
public void AddSpecialNForX(string name, int N, decimal X, int limit = Int16.MaxValue) { SpecialNForX special = new SpecialNForX(name, N, X); special.limit = limit; if (Specials.ContainsKey(name)) { Specials[name] = special; } else { Specials.Add(name, special); } }