/// <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(); } }
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); } }
/// <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(); } }
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"); }
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."); }
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); }
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(); } }