public SessionCart(SHOPPING_CART cart) { Id = cart.ID; ProductAttributeId = cart.ProdAttrID; ProductAttributeVersion = cart.ProductAttributeVersion; Quantity = cart.Quantity; DateAdded = cart.DateAdded; FullName = cart.BrandName + " - " + cart.ProductNameWithSize; Price = cart.UnitPrice.Value; }
public void Update(SHOPPING_CART Entity, int PreviousQuantity) { PRODUCT_ATTRIBUTE prodAttr = _productDAO.GetProductAttributeById(Entity.ProdAttrID); Context.PRODUCT_ATTRIBUTE.Detach(prodAttr); if (PreviousQuantity != Entity.Quantity) { int difference = Entity.Quantity - PreviousQuantity; // using the version that was initially retrieved from db // if another user modified this record an OptimisticConcurrencyException will be raised only if the new quantity is greater than the old // so there is the risk of a negative availability // if difference is negative, products are being "returned to warehouse" so the // concurrency check is not needed. if ((prodAttr.Availability - difference) < 0) { //TODO think what to do with version // set the version that was read when the product-attribute was first retrieved from user interface // the entity must be detached in order to set it's concurrency-check attribute (version in this case) prodAttr.Version = Entity.ProductAttributeVersion; } prodAttr.Availability -= difference; _productDAO.UpdateProductAttribute(prodAttr); } Entity.PRODUCT_ATTRIBUTE = null; _shoppingCartDAO.Update(Entity); try { if (prodAttr.Availability < 0) { throw new System.Data.OptimisticConcurrencyException("Product availability negative."); } Context.SaveChanges(); } catch (System.Data.OptimisticConcurrencyException) { // when an optimistic exception is raised, the old quantity is restored the old quantity Entity.Quantity = PreviousQuantity; throw; } finally { Context.Refresh(RefreshMode.StoreWins, prodAttr); Context.Refresh(RefreshMode.StoreWins, Entity); Entity.PRODUCT_ATTRIBUTE = prodAttr; // setting the new version for further modifications Entity.ProductAttributeVersion = prodAttr.Version; } }
public void Insert(SHOPPING_CART Entity) { PRODUCT_ATTRIBUTE prodAttr = _productDAO.GetProductAttributeById(Entity.ProdAttrID); Context.PRODUCT_ATTRIBUTE.Detach(prodAttr); prodAttr.Availability -= Entity.Quantity; if (prodAttr.Availability < 0) { // partial verification, the exception is raised only if the resulting availability is less than 0 // using the version that was initially retrieved from db // if another user modified this record an OptimisticConcurrencyException will be raised prodAttr.Version = Entity.ProductAttributeVersion; } _productDAO.UpdateProductAttribute(prodAttr); _shoppingCartDAO.Insert(Entity); try { if (prodAttr.Availability < 0) { throw new System.Data.OptimisticConcurrencyException("Product availability negative."); } Context.SaveChanges(); } catch (System.Data.OptimisticConcurrencyException ex) { throw; } finally { Context.Refresh(RefreshMode.StoreWins, prodAttr); Entity.PRODUCT_ATTRIBUTE = prodAttr; // setting the new version for further modifications Entity.ProductAttributeVersion = prodAttr.Version; } }
protected void ddlQty_SelectedIndexChanged(object sender, EventArgs e) { DropDownList ddl = sender as DropDownList; int selectedQty; if (Int32.TryParse(ddl.SelectedValue, out selectedQty)) { RepeaterItem item = (RepeaterItem)ddl.NamingContainer; HiddenField field = (HiddenField)item.FindControl("ProdAttrID"); int prodAttrId; if (Int32.TryParse(field.Value, out prodAttrId)) { SessionCart cart = CartSession.Find(c => c.ProductAttributeId == prodAttrId); if (cart != null) { // we already have the right version in the session variable cartsession int oldQuantity = cart.Quantity; SHOPPING_CART shopping = new SHOPPING_CART() { ID = cart.Id, ProdAttrID = prodAttrId }; // session var cart.Quantity = selectedQty; cart.DateAdded = DateTime.Now; shopping.Quantity = selectedQty; shopping.DateAdded = DateTime.Now; shopping.ProductAttributeVersion = cart.ProductAttributeVersion; LinkButton lnk = (LinkButton)item.FindControl("lnkEdit"); try { ApplicationContext.Current.Carts.Update(shopping, oldQuantity); lblMessage.Text = String.Empty; } catch (Exception ex) { BasePage.Log(ex, ex.Message, ex.StackTrace, "Cart Control"); updAvailListInOptimisticScenario(ddl, prodAttrId, oldQuantity, selectedQty, lnk); } finally { DataBind(); ddl.Visible = false; lnk.Visible = true; } } } } }
public List<SHOPPING_CART> Search(SHOPPING_CART Entity, int PageSize, int PageIndex, out int TotalRecords, string OrderExp, Util.SortDirection SortDirection) { var result = Context.SHOPPING_CART.AsQueryable(); if (Entity != null) { if (!String.IsNullOrWhiteSpace(Entity.ProductName)) { result = result.Where(s => s.PRODUCT_ATTRIBUTE.PRODUCT.Name.Contains(Entity.ProductName)); } if (!String.IsNullOrWhiteSpace(Entity.CampaignName)) { result = result.Where(s => s.CAMPAIGN.Name.Contains(Entity.CampaignName)); } if (!String.IsNullOrWhiteSpace(Entity.CustomerName)) { result = result.Where(s => (s.CUSTOMER.Name + " " + s.CUSTOMER.Surname).Contains(Entity.CustomerName)); } if (Entity.SearchStartDate.HasValue) { result = result.Where(s => s.DateAdded >= Entity.SearchStartDate.Value); } if (Entity.CampaignID != 0) { result = result.Where(s => s.CampaignID == Entity.CampaignID); } if (!String.IsNullOrWhiteSpace(Entity.ID)) { result = result.Where(s => s.ID == Entity.ID); } } TotalRecords = result.Count(); if (!String.IsNullOrEmpty(OrderExp) && OrderExp.Equals("ProductName")) { if (SortDirection == SortDirection.Ascending) result = result.OrderBy(s => s.PRODUCT_ATTRIBUTE.PRODUCT.Name); else result = result.OrderByDescending(s => s.PRODUCT_ATTRIBUTE.PRODUCT.Name); } else if (!String.IsNullOrEmpty(OrderExp) && OrderExp.Equals("CustomerName")) { if (SortDirection == SortDirection.Ascending) result = result.OrderBy(s => s.CUSTOMER.Name).ThenBy(s => s.CUSTOMER.Surname); else result = result.OrderByDescending(s => s.CUSTOMER.Name).ThenBy(s => s.CUSTOMER.Surname); } else if (!String.IsNullOrEmpty(OrderExp) && OrderExp.Equals("CampaignName")) { if (SortDirection == SortDirection.Ascending) result = result.OrderBy(s => s.CAMPAIGN.Name); else result = result.OrderByDescending(s => s.CAMPAIGN.Name); } else { GenericSorterCaller<SHOPPING_CART> sorter = new GenericSorterCaller<SHOPPING_CART>(); result = sorter.Sort(result, String.IsNullOrEmpty(OrderExp) ? "ID" : OrderExp, SortDirection); } // pagination return result.Skip(PageIndex * PageSize).Take(PageSize).ToList(); }
public void Delete(SHOPPING_CART Entity) { Delete(Entity, true); }
public void Delete(SHOPPING_CART Entity, bool Attach = true) { if (Attach) { Context.SHOPPING_CART.Attach(Entity); } Context.SHOPPING_CART.DeleteObject(Entity); }
public void Update(SHOPPING_CART Entity) { Context.SHOPPING_CART.Attach(Entity); var entry = Context.ObjectStateManager.GetObjectStateEntry(Entity); entry.SetModifiedProperty("Quantity"); entry.SetModifiedProperty("DateAdded"); }
public void Insert(SHOPPING_CART Entity) { if (String.IsNullOrWhiteSpace(Entity.ID)) { throw new Exception("Entity key null or empty or white space."); } Context.SHOPPING_CART.AddObject(Entity); }
/// <summary> /// Adds a new product to this session cart /// </summary> /// <param name="CustomerID"></param> /// <param name="CampaignID"></param> /// <param name="ProductId"></param> /// <param name="ProdAttrId"></param> /// <param name="Quantity"></param> public void AddProductToCart(int CustomerID, int CampaignID, int ProductId, int ProdAttrId, int Quantity, string BrandName) { if (CartID == null) { Guid g = Guid.NewGuid(); UniqueIdGenerator unique = UniqueIdGenerator.GetInstance(); string cartId = unique.GetBase32UniqueId(g.ToByteArray(), 20).ToLower(); CartID = cartId; } SHOPPING_CART cart = new SHOPPING_CART(); cart.ID = CartID; cart.FrontEnd = false; cart.CampaignID = CampaignID; cart.CustomerID = CustomerID; cart.DateAdded = DateTime.Now; cart.ProductID = ProductId; cart.ProdAttrID = ProdAttrId; cart.Quantity = Quantity; cart.BrandName = BrandName; // the versions list of lists is created each time the product popup is shown, and destroyed each time it is closed if (Versions != null) { cart.ProductAttributeVersion = Versions.Where(x => x.Key == ProductId).FirstOrDefault().Value.Where(y => y.Key == ProdAttrId).FirstOrDefault().Value; } else { throw new ApplicationException("Session is compromised! Cannot proceed."); } if (CartSession == null) { CartSession = new List<SHOPPING_CART>(); } List<SHOPPING_CART> carts = CartSession; SHOPPING_CART sc; // already in the cart if (carts.Count > 0 && (sc = carts.Where(c => c.ID == cart.ID && c.ProdAttrID == cart.ProdAttrID).FirstOrDefault()) != null) { cart.Quantity += sc.Quantity; ApplicationContext.Current.Carts.Update(cart, sc.Quantity); // updating session with last quantity and last prod-attr version sc.Quantity = cart.Quantity; sc.ProductAttributeVersion = cart.ProductAttributeVersion; //sc = cart; } else { ApplicationContext.Current.Carts.Insert(cart); // already has the last version set from the context saving CartSession.Add(cart); } // refreshing session, optional //ApplicationContext.Current.Carts.GetShoppingCartItems(CartID); DataBind(CartSession); }
public SessionCart(SHOPPING_CART cart) { Id = cart.ID; ProductAttributeId = cart.ProdAttrID; ProductAttributeVersion = cart.ProductAttributeVersion; Quantity = cart.Quantity; DateAdded = cart.DateAdded; FullName = cart.BrandName + " - " + cart.ProductNameWithSize; Price = cart.UnitPrice.Value; }
protected void lnkAddToBasket_Click(object sender, EventArgs e) { string CartID = String.Empty; Guid g = Guid.NewGuid(); UniqueIdGenerator unique = UniqueIdGenerator.GetInstance(); string cartId = unique.GetBase32UniqueId(g.ToByteArray(), 20).ToLower(); if (CartSession == null || CartSession.Count == 0) { CartID = cartId; CartSession = new List<SessionCart>(); } else { List<SessionCart> cSession = CartSession.OrderByDescending(c => c.DateAdded).ToList(); SessionCart sessionCart = cSession.First(); if (sessionCart.DateAdded.AddMinutes(Configuration.CartExpirationValue) < DateTime.Now) { RefreshCart(); CartID = cartId; } else { CartID = CartSession.First().Id; } } SHOPPING_CART cart = new SHOPPING_CART(); cart.ID = CartID; cart.FrontEnd = true; cart.CampaignID = CampaignID; cart.CustomerID = CurrentCustomer.Id; cart.DateAdded = DateTime.Now; cart.ProductID = ProductID; int num = 0; if (!Int32.TryParse(ddlSize.SelectedValue, out num)) { return; } cart.ProdAttrID = num; num = 0; if (!Int32.TryParse(ddlQuantity.SelectedValue, out num) || num == 0) { return; } cart.Quantity = num; // the versions list of lists is created each time the product popup is shown, and destroyed each time it is closed if (Version != null) { cart.ProductAttributeVersion = Version; } else { throw new ApplicationException("Session is compromised! Cannot proceed."); } SessionCart sC; try { // already in the cart if (CartSession != null && CartSession.Count > 0 && (sC = CartSession.Find(c => c.ProductAttributeId == cart.ProdAttrID)) != null) { // sum with old quantity cart.Quantity += sC.Quantity; ApplicationContext.Current.Carts.Update(cart, sC.Quantity); // updating session with last quantity and last prod-attr version sC.Quantity = cart.Quantity; sC.ProductAttributeVersion = cart.ProductAttributeVersion; } else { ApplicationContext.Current.Carts.Insert(cart); sC = new SessionCart(cart); CartSession.Add(sC); } TotalAmount = ApplicationContext.Current.Carts.GetShoppingCartTotalAmount(CartID); } catch (Exception ex) { //TODO log error Log(ex, ex.Message, ex.StackTrace, "Product.AddToCart"); List<int> qtyList; PRODUCT_ATTRIBUTE prodAttr = ApplicationContext.Current.Products.GetProductAvailability(cart.ProdAttrID, out qtyList); Version = prodAttr.Version; ddlQuantity.DataSource = qtyList; ddlQuantity.DataBind(); if (!qtyList.Contains(cart.Quantity)) { lblMessage.Text = Resources.Lang.InsufficientAvailabilityMessage; } if (qtyList.Count == 0) { ddlQuantity.Enabled = false; lnkAddToBasket.Enabled = false; loadProductAttributes(); } //refreshing the size ddl loadProductAttributes(); updPanelDDL.Update(); return; } Version = null; Response.Redirect("/cart/mycart/"); }
public List<SHOPPING_CART> Search(SHOPPING_CART Entity, int PageSize, int PageIndex, out int TotalRecords, string OrderExp, Util.SortDirection SortDirection) { return _shoppingCartDAO.Search(Entity, PageSize, PageIndex, out TotalRecords, OrderExp, SortDirection); }
public void Delete(SHOPPING_CART Entity) { // first "put back" the product that was in cart // version is not needed as the availability is incremented, so no risk PRODUCT_ATTRIBUTE prodAttr = _productDAO.GetProductAttributeById(Entity.ProdAttrID); prodAttr.Availability += Entity.Quantity; _productDAO.UpdateProductAttribute(prodAttr, false); // second remove item from cart _shoppingCartDAO.Delete(Entity, false); // then save if everything was successful Context.SaveChanges(); }
public void Update(SHOPPING_CART Entity) { Update(Entity, Entity.Quantity); }