/// <summary> /// Normalizes the cart quantities. /// </summary> /// <param name="order">The order.</param> /// <returns></returns> public static bool NormalizeCartQuantities(Order order) { bool changesMade = false; if (order.OrderId > 0) { List <OrderItem> itemsToRemove = new List <OrderItem>(); foreach (OrderItem item in order.OrderItemCollection) { Product product = Product.FetchByID(item.ProductId); if (!product.AllowNegativeInventories) { SkuCollection skuCollection = new SkuCollection().Where(Sku.Columns.SkuX, SubSonic.Comparison.Equals, item.Sku).Load(); if (skuCollection != null) { if (skuCollection.Count == 0 || skuCollection[0].Inventory == 0 || product.ProductStatusDescriptorId == (int)ProductStatus.Inactive) { itemsToRemove.Add(item); changesMade = true; } else if (item.Quantity > skuCollection[0].Inventory) { item.Quantity = skuCollection[0].Inventory; new OrderController().AdjustQuantity(order.OrderId, item.OrderItemId, item.Quantity, order.UserName); changesMade = true; } } } } foreach (OrderItem item in itemsToRemove) { new OrderController().RemoveItem(order.OrderId, item.OrderItemId, order.UserName); order.OrderItemCollection.Remove(item); } if (order.OrderItemCollection.Count == 0) { Order.Delete(order.OrderId); } } return(changesMade); }
public bool Delete(object OrderId) { return(Order.Delete(OrderId) == 1); }
/// <summary> /// Migrates the cart. /// </summary> /// <param name="anonymousCartId">The anonymous cart id.</param> /// <param name="registeredCartId">The registered cart id.</param> public static void MigrateCart(string anonymousCartId, string registeredCartId) { Order anonymousOrder = new OrderController().FetchOrder(anonymousCartId); Order registeredOrder = new OrderController().FetchOrder(registeredCartId); //first see if there is an order for the now-recognized user if (string.IsNullOrEmpty(registeredOrder.OrderNumber) && !string.IsNullOrEmpty(anonymousOrder.OrderNumber)) { //if not, just update the old order with the new user's username anonymousOrder.UserName = registeredCartId; anonymousOrder.Save(registeredCartId); } else { //the logged-in user has an existing basket. //if there is no basket from their anon session, //we don't need to do anything if (!string.IsNullOrEmpty(anonymousOrder.OrderNumber)) { //in this case, there is an order (cart) from their anon session //and an order that they had open from their last session //need to marry the items. //this part is up to your business needs - some merchants //will want to replace the cart contents //others will want to synch them. We're going to assume that //this scenario will synch the existing items. //############### Synch the Cart Items if (registeredOrder.OrderItemCollection.Count > 0 && anonymousOrder.OrderItemCollection.Count > 0) { //there are items in both carts, move the old to the new //when synching, find matching items in both carts //update the quantities of the matching items in the logged-in cart //removing them from the anon cart //a switch to tell us if we need to update the from orders //1.) Find items that are the same between the two carts and add the anon quantity to the registered user quantity //2.) Mark found items as items to be removed from the anon cart. ArrayList toBeRemoved = new ArrayList(anonymousOrder.OrderItemCollection.Count); for (int i = 0; i < anonymousOrder.OrderItemCollection.Count; i++) { OrderItem foundItem = registeredOrder.OrderItemCollection.Find(delegate(OrderItem orderItemToFind) { return((orderItemToFind.Sku == anonymousOrder.OrderItemCollection[i].Sku) && (orderItemToFind.Attributes == anonymousOrder.OrderItemCollection[i].Attributes)); }); if (foundItem != null) { foundItem.Quantity += anonymousOrder.OrderItemCollection[i].Quantity; toBeRemoved.Add(i); } } //3.) Now remove any foundItems from the anon cart, but trim it up first toBeRemoved.TrimToSize(); for (int i = 0; i < toBeRemoved.Count; i++) { anonymousOrder.OrderItemCollection.RemoveAt((int)toBeRemoved[i]); } //4.) Move over to the registered user cart any remaining items in the anon cart. foreach (OrderItem anonItem in anonymousOrder.OrderItemCollection) { //reset the orderID anonItem.OrderId = registeredOrder.OrderId; registeredOrder.OrderItemCollection.Add(anonItem); } //5.) Finally, save it down to the DB // (Since we know toOrder.Items.Count > 0 && fromOrder.Items.Count > 0, we know a Save needs to occur) registeredOrder.OrderItemCollection.SaveAll(registeredCartId); registeredOrder.Save(registeredCartId); } else if (registeredOrder.OrderItemCollection.Count == 0) { //items exist only in the anon cart //move the anon items to the new cart //then save the order and the order items. registeredOrder.IsNew = true; registeredOrder.OrderStatusDescriptorId = anonymousOrder.OrderStatusDescriptorId; registeredOrder.OrderGuid = anonymousOrder.OrderGuid; registeredOrder.UserName = registeredCartId; registeredOrder.OrderNumber = anonymousOrder.OrderNumber; registeredOrder.Save(registeredCartId); foreach (OrderItem item in anonymousOrder.OrderItemCollection) { //reset the orderID on each item item.OrderId = registeredOrder.OrderId; registeredOrder.OrderItemCollection.Add(item); } registeredOrder.OrderItemCollection.SaveAll(registeredCartId); registeredOrder.Save(registeredCartId); } else if (anonymousOrder.OrderItemCollection.Count == 0) { //no items in the old cart, do nothing } //finally, drop the anon order from the DB, we don't want to //keep it OrderItem.Delete(OrderItem.Columns.OrderId, anonymousOrder.OrderId); Order.Delete(anonymousOrder.OrderId); } } }