using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Collections; public class ShoppingCart : CollectionBase { private bool _InternationalOrder = false; private bool _ShippingResidental = true; private string _ShippingState = ""; private string _ShippingName = ""; private decimal _ShippingCost = 0; private bool _RequiresSalesTax = false; private double _TaxRate; private string _TaxState; private string _PromoCode = ""; private DiscountList _DiscountList; private string _Zipcode = null; private bool _IsFreeShipping = false; private int CurrentCartItemID = 0; #region storage properties public bool InternationalOrder { get { return _InternationalOrder; } set { _InternationalOrder = value; } } public bool ShippingResidental { get { return _ShippingResidental; } set { _ShippingResidental = value; } } public string ShippingName { get { return _ShippingName; } set { _ShippingName = value; } } public string ShippingState { get { return _ShippingState; } set { _ShippingState = value; } } public decimal ShippingCost { get { return _ShippingCost; } set { _ShippingCost = value; } } public double TaxRate { get { return _TaxRate; } set { _TaxRate = value; } } public string TaxState { get { return _TaxState; } set { _TaxState = value; } } public bool RequiresSalesTax { get { return _RequiresSalesTax; } set { _RequiresSalesTax = value; } } public string PromoCode { get { return _PromoCode; } set { _PromoCode = value; } } public DiscountList DiscountList { get { return _DiscountList; } set { _DiscountList = value; } } public string Zipcode { get { return _Zipcode; } set { _Zipcode = value; } } public bool IsFreeShipping { get { return _IsFreeShipping; } set { _IsFreeShipping = value; } } #endregion #region amount calculation properties public int TotalItems { get { int ret = 0; foreach (ShoppingCartItem sci in this) ret += sci.Quantity; return ret; } } public decimal SubTotal { get { decimal ret = 0; foreach (ShoppingCartItem sci in this) ret += sci.ItemTotal; return ret; } } public decimal SalesTax { get { if (RequiresSalesTax && ShippingState == TaxState) { return DiscountedTotal * (decimal)TaxRate; } return 0; } } public decimal GrandTotal { get { return SalesTax + DiscountedTotal + ShippingCost; } } public decimal DiscountedTotal { get { if (_DiscountList != null) return SubTotal - _DiscountList.TotalDiscountAmount; else return SubTotal; } } public double TotalWeight { get { double ret = 0; foreach (ShoppingCartItem sci in this) ret += sci.Weight * sci.Quantity; return ret; } } #endregion #region collection functions public ShoppingCartItem this[int index] { get { return (ShoppingCartItem)List[index]; } set { List[index] = value; } } public int Add(ShoppingCartItem value) { return Add(value, true); } public int Add(ShoppingCartItem value, bool CoalesceItems) { // we have to check if the customizations are different. If they are the same then we can Coalesce the items together ShoppingCartItem sci = FindByItemIDandCustomiationText(value.ItemID, value.CustomizationText); if (sci != null) { // what to do.. sci.Quantity += value.Quantity; return 1; } if (CoalesceItems) { sci = FindByItemID(value.ItemID); if (sci != null) { sci.Quantity += value.Quantity; return 1; } } value.CartItemID = CurrentCartItemID++; return (List.Add(value)); } public void Remove(ShoppingCartItem sci) { List.Remove(sci); } public void Remove(int CartItemID) { ShoppingCartItem tbr = FindByCartItemID(CartItemID); if (tbr != null) List.Remove(tbr); } public ShoppingCartItem FindByItemID(int ItemID) { ShoppingCartItem tbr = null; foreach (ShoppingCartItem sci in List) { if (sci.ItemID == ItemID) { tbr = sci; break; } } return tbr; } // returns all items in this cart with the same ItemID public ArrayList FindItemsWithItemID(int ItemID) { ArrayList items = new ArrayList(); foreach (ShoppingCartItem sci in List) { if (sci.ItemID == ItemID) { items.Add(sci); } } return items; } public ShoppingCartItem FindByItemIDandCustomiationText(int ItemID, string CustomizationText) { ShoppingCartItem tbr = null; foreach (ShoppingCartItem sci in List) { if (sci.ItemID == ItemID && sci.CustomizationText == CustomizationText) { tbr = sci; break; } } return tbr; } public ShoppingCartItem FindByCartItemID(int CartItemID) { ShoppingCartItem tbr = null; foreach (ShoppingCartItem sci in List) { if (sci.CartItemID == CartItemID) { tbr = sci; break; } } return tbr; } #endregion #region other functions public void UpdateItemQuantity(ShoppingCartItem sci, int quant, decimal volumePrice) { sci.Quantity = quant; sci.Price = volumePrice; } public void RunDiscountIfPresent() { if (_DiscountList != null) _DiscountList.RunDiscounts(); } public SingleDiscount MatchDiscount(string PotentialDiscountCode) { PotentialDiscountCode = PotentialDiscountCode.ToUpper(); DatabaseClass Database = DatabaseClass.Current; // check to make sure this discount isnt already in the shopping cart if (this.DiscountList != null) { if (this.DiscountList.FindByDiscountCode(PotentialDiscountCode) != null) { return null; } } // now match DataRow dr = Database.Discounts_MatchDiscount(PotentialDiscountCode); if (dr != null) { SingleDiscount returner = new SingleDiscount(); returner.DiscountCode = PotentialDiscountCode; returner.DiscountID = (int)dr["DiscountID"]; returner.DiscountTitle = (string)dr["DiscountTitle"]; returner.RequiredSubtotal = (decimal)dr["RequiredSubtotal"]; returner.DiscountDollarAmount = (decimal)dr["DiscountDollarAmount"]; returner.DiscountPercentage = (int)dr["DiscountPercentage"]; returner.GrantsFreeShipping = (bool)dr["GrantsFreeShipping"]; returner.IsOneTimeDiscount = (bool)dr["IsOneTimeDiscount"]; returner.AppliesToAllItems = (bool)dr["AppliesToAllItems"]; return returner; } else return null; } public static ShoppingCart CreateShoppingCart() { ShoppingCart ret = new ShoppingCart(); string taxEnable = Configuration.Get("Tax.Enable"); if (taxEnable != null && taxEnable.ToLower().Equals("true")) ret.RequiresSalesTax = true; else ret.RequiresSalesTax = false; string taxState = Configuration.Get("Tax.State"); if (taxState != null) ret.TaxState = taxState; else ret.TaxState = ""; string taxRate = Configuration.Get("Tax.Rate"); if (taxRate != null) { ret.TaxRate = Double.Parse(taxRate) / 100; } else ret.TaxRate = 0; return ret; } public static ShoppingCart Current { get { return (ShoppingCart)HttpContext.Current.Session["ShoppingCart"]; } } #endregion }