/// <summary>
 /// Calculates the tax.
 /// </summary>
 /// <param name="userName">Name of the user.</param>
 public static void CalculateTax(string userName)
 {
     Order order = new OrderController().FetchOrder(userName);
       TaxService taxService = new TaxService();
       taxService.GetTaxRate(order);
       foreach(OrderItem orderItem in order.OrderItemCollection) {
     orderItem.Save(userName);
       }
       order.Save(userName);
 }
        /// <summary>
        /// Calculates the tax.
        /// </summary>
        /// <param name="userName">Name of the user.</param>
        public static void CalculateTax(string userName)
        {
            Order      order      = new OrderController().FetchOrder(userName);
            TaxService taxService = new TaxService();

            taxService.GetTaxRate(order);
            foreach (OrderItem orderItem in order.OrderItemCollection)
            {
                orderItem.Save(userName);
            }
            order.Save(userName);
        }
 /// <summary>
 /// Sets the shipping.
 /// </summary>
 /// <param name="userName">Name of the user.</param>
 /// <param name="shippingAmount">The shipping amount.</param>
 /// <param name="shippingMethod">The shipping method.</param>
 public static void SetShipping(string userName, decimal shippingAmount, string shippingMethod)
 {
     Order order = new OrderController().FetchOrder(userName);
       order.ShippingAmount = shippingAmount;
       order.ShippingMethod = shippingMethod;
       order.Save(userName);
 }
        /// <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);
            }
              }
        }
        /// <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);
                }
            }
        }