Esempio n. 1
0
        /// <summary>
        /// AddOrder will create a new customer order, processing it as a single transaction.
        /// </summary>
        /// <param name="order">The particulars of the order</param>
        private void AddPendingOrder(EditCustomerOrder order)
        {
            using (var context = new WestWindContext())
            {
                var orderInProcess = context.Orders.Add(new Order());
                // Make the orderInProcess match the customer order as given...
                // A) The general order information
                orderInProcess.CustomerID   = order.CustomerId;
                orderInProcess.SalesRepID   = order.EmployeeId;
                orderInProcess.RequiredDate = order.RequiredDate;
                orderInProcess.Freight      = order.FreightCharge;
                // B) Add order details
                foreach (var item in order.OrderItems)
                {
                    // Add as a new item
                    var newItem = new OrderDetail
                    {
                        ProductID = item.ProductId,
                        Quantity  = item.OrderQuantity,
                        UnitPrice = item.UnitPrice,
                        Discount  = item.DiscountPercent
                    };
                    orderInProcess.OrderDetails.Add(newItem);
                }

                // C) Save the changes (one save, one transaction)
                context.SaveChanges();
            }
        }
Esempio n. 2
0
        public void Save(EditCustomerOrder order)
        {
            // Always ensure you have been given data to work with
            if (order == null)
            {
                throw new ArgumentNullException("order", "Cannot save order; order information was not supplied.");
            }

            // Business validation rules
            if (order.OrderDate.HasValue)
            {
                throw new Exception($"An order date of {order.OrderDate.Value.ToLongDateString()} has been supplied. The order date should only be supplied when placing orders, not saving them.");
            }

            // Decide whether to add new or update
            //  NOTE: Notice that no db activity is occurring yet.
            if (order.OrderId == 0)
            {
                AddPendingOrder(order);
            }
            else
            {
                UpdatePendingOrder(order);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// UpdateExistingOrder will make changes to an existing customer order, processing it as a single transaction.
        /// </summary>
        /// <param name="order">The particulars of the order</param>
        private void UpdatePendingOrder(EditCustomerOrder order)
        {
            using (var context = new WestWindContext())
            {
                var orderInProcess = context.Orders.Find(order.OrderId);
                if (orderInProcess == null)
                {
                    throw new Exception("The order could not be found");
                }
                // Make the orderInProcess match the customer order as given...
                // A) The general order information
                orderInProcess.CustomerID   = order.CustomerId;
                orderInProcess.SalesRepID   = order.EmployeeId;
                orderInProcess.RequiredDate = order.RequiredDate;
                orderInProcess.Freight      = order.FreightCharge;

                // B) Add/Update/Delete order details
                //    Loop through the items as known in the database (to update/remove)
                foreach (var detail in orderInProcess.OrderDetails.ToList()) // .ToList() to bring into RAM
                {
                    var changes = order.OrderItems.SingleOrDefault(x => x.ProductId == detail.ProductID);
                    if (changes == null)
                    {
                        //toRemove.Add(detail);
                        context.Entry(detail).State = EntityState.Deleted; // flag for deletion
                    }
                    else
                    {
                        detail.Discount             = changes.DiscountPercent;
                        detail.Quantity             = changes.OrderQuantity;
                        detail.UnitPrice            = changes.UnitPrice;
                        context.Entry(detail).State = EntityState.Modified;
                    }
                }
                //    Loop through the new items to add to the database
                foreach (var item in order.OrderItems)
                {
                    bool notPresent = !orderInProcess.OrderDetails.Any(x => x.ProductID == item.ProductId);
                    if (notPresent)
                    {
                        // Add as a new item
                        var newItem = new OrderDetail
                        {
                            ProductID = item.ProductId,
                            Quantity  = item.OrderQuantity,
                            UnitPrice = item.UnitPrice,
                            Discount  = item.DiscountPercent
                        };
                        orderInProcess.OrderDetails.Add(newItem);
                    }
                }

                // C) Save the changes (one save, one transaction)
                context.Entry(orderInProcess).State = EntityState.Modified;
                context.SaveChanges();
            }
        }
Esempio n. 4
0
        protected void SaveOrder_Click(object sender, EventArgs e)
        {
            MessageUserControl.TryRun(() => {
                // 1) Build the EditCustomerOrder object from the form
                EditCustomerOrder order = BuildCustomerOrder();

                // 2) Send the object to the SalesController for bulk processing
                var controller = new SalesController();
                controller.Save(order);
            }, "Save Order", "Customer order saved");
        }
Esempio n. 5
0
        protected void PlaceOrder_Click(object sender, EventArgs e)
        {
            MessageUserControl.TryRun(() => {
                // 1) Build the EditCustomerOrder object from the form
                EditCustomerOrder order = BuildCustomerOrder();

                // 2) Send the object to the SalesController for bulk processing
                var controller = new SalesController();
                controller.PlaceOrder(order);
                CustomerOrderEditingPanel.Enabled = false;
            }, "Place Order", "The customer order has been placed and is in queue for shipping.");
        }
Esempio n. 6
0
        private EditCustomerOrder BuildCustomerOrder()
        {
            EditCustomerOrder order = new EditCustomerOrder();
            int anId;

            int.TryParse(OrderId.Value, out anId);
            order.OrderId    = anId;
            order.CustomerId = CustomerDropDown.SelectedValue;
            DateTime someDate;

            if (DateTime.TryParse(EditOrderDate.Text, out someDate))
            {
                order.OrderDate = someDate;
            }
            if (DateTime.TryParse(EditRequiredDate.Text, out someDate))
            {
                order.RequiredDate = someDate;
            }

            // TODO: Remove EditShipper dropdown
            //if (int.TryParse(EditShipper.SelectedValue, out anId))
            //    order.ShipperId = anId;
            decimal amount;

            if (decimal.TryParse(EditFreight.Text, NumberStyles.Currency, null, out amount))
            {
                order.FreightCharge = amount;
            }

            var items = ExtractFromOrderItemsListViewItems();

            order.OrderItems = items.Select <CustomerOrderItem, EditOrderItem>(x => new EditOrderItem {
                ProductId = x.ProductId, OrderQuantity = x.Quantity, UnitPrice = x.UnitPrice, DiscountPercent = x.DiscountPercent
            });

            order.EmployeeId = EmployeeId.Value;
            return(order);
        }
Esempio n. 7
0
        public void PlaceOrder(EditCustomerOrder order)
        {
            // Always ensure you have been given data to work with
            if (order == null)
            {
                throw new ArgumentNullException("order", "Cannot place order; order information was not supplied.");
            }

            // Business validation rules
            if (!order.RequiredDate.HasValue)
            {
                throw new Exception($"A  required date for the order is required when placing orders.");
            }
            if (order.OrderItems.Count() == 0)
            {
                throw new Exception("An order must have at least one item before it can be placed.");
            }

            // Begin processing the order
            order.OrderDate = DateTime.Today;
            using (var context = new WestWindContext())
            {
                // Prep for processing...
                var customer = context.Customers.Find(order.CustomerId);
                if (customer == null)
                {
                    throw new Exception("Customer does not exist");
                }
                var orderInProcess = context.Orders.Find(order.OrderId);
                if (orderInProcess == null)
                {
                    orderInProcess = context.Orders.Add(new Order());
                }
                else
                {
                    if (orderInProcess.OrderDate.HasValue)
                    {
                        throw new Exception("Aborting changes: The order has previously been placed.");
                    }
                    context.Entry(orderInProcess).State = EntityState.Modified;
                }
                // Make the orderInProcess match the customer order as given...
                // A) The general order information
                orderInProcess.CustomerID   = order.CustomerId;
                orderInProcess.SalesRepID   = order.EmployeeId;
                orderInProcess.OrderDate    = order.OrderDate;
                orderInProcess.RequiredDate = order.RequiredDate;
                orderInProcess.Freight      = order.FreightCharge;

                // B) Default the ship-to info to the customer's info
                orderInProcess.ShipName = customer.CompanyName;
                // TODO: Redesign for new Address information
                //orderInProcess.ShipAddress = customer.Address;
                //orderInProcess.ShipCity = customer.City;
                //orderInProcess.ShipRegion = customer.Region;
                //orderInProcess.ShipPostalCode = customer.PostalCode;

                // C) Add/Remove/Update order details
                //var toRemove = new List<OrderDetail>();
                foreach (var detail in orderInProcess.OrderDetails.ToList()) // .ToList() to bring into RAM
                {
                    var changes = order.OrderItems.SingleOrDefault(x => x.ProductId == detail.ProductID);
                    if (changes == null)
                    {
                        //toRemove.Add(detail);
                        context.Entry(detail).State = EntityState.Deleted; // flag for deletion
                    }
                    else
                    {
                        detail.Discount             = changes.DiscountPercent;
                        detail.Quantity             = changes.OrderQuantity;
                        detail.UnitPrice            = changes.UnitPrice;
                        context.Entry(detail).State = EntityState.Modified;
                    }
                }
                foreach (var item in order.OrderItems)
                {
                    if (!orderInProcess.OrderDetails.Any(x => x.ProductID == item.ProductId))
                    {
                        // Add as a new item
                        var newItem = new OrderDetail
                        {
                            ProductID = item.ProductId,
                            Quantity  = item.OrderQuantity,
                            UnitPrice = item.UnitPrice,
                            Discount  = item.DiscountPercent
                        };
                        orderInProcess.OrderDetails.Add(newItem);
                    }
                }

                // D) Save the changes (one save, one transaction)
                context.SaveChanges();
            }
        }