public bool ReceiveOrder(PurchaseOrderProcessed order) { using (var context = new eBikesContext()) { bool fulfilled = false; // Create and populate Receive Order var receiveOrder = context.ReceiveOrders.Add(new ReceiveOrder()); receiveOrder.PurchaseOrderID = order.POid; receiveOrder.ReceiveDate = DateTime.Now; foreach (var item in order.receivedDetails) { fulfilled = true; // Update Part QOH and QOO var part = context.Parts.Find(item.PartID); part.QuantityOnHand += item.QtyReceiving; part.QuantityOnOrder -= item.QtyReceiving; context.Entry(part).State = EntityState.Modified; // FLAG for UPDATE // Create ReceiveOrderDetail and populate if (item.QtyReceiving > 0) { var newReceiveDetail = new ReceiveOrderDetail { PurchaseOrderDetailID = item.PODetailID, QuantityReceived = item.QtyReceiving }; receiveOrder.ReceiveOrderDetails.Add(newReceiveDetail); // FLAG new ReceiveOrderDetail } // Create ReturnOrderDetail and populate if (item.QtyReturning > 0) { var newReturnDetail = new ReturnedOrderDetail { PurchaseOrderDetailID = item.PODetailID, Quantity = item.QtyReturning, Reason = item.ReturnReason }; receiveOrder.ReturnedOrderDetails.Add(newReturnDetail); // FLAG new ReturnOrderDetail } var pOrderDetail = context.PurchaseOrderDetails.Find(item.PODetailID); var qtyOutstaning = pOrderDetail.Quantity - (pOrderDetail.ReceiveOrderDetails.FirstOrDefault() == null ? 0 : pOrderDetail.ReceiveOrderDetails.Sum(x => x.QuantityReceived)); if (qtyOutstaning != 0) { fulfilled = false; } } // close order if fulfilled comes back true var pOrder = context.PurchaseOrders.Find(order.POid); if (fulfilled) { pOrder.Closed = fulfilled; context.Entry(pOrder).State = EntityState.Modified; // FLAG updated PurchaseOrder } // Move data from Unordered Cart into returned items List <UnorderedPart> partList = GetUnorderedPart(pOrder.PurchaseOrderNumber.Value); foreach (var item in partList) { var newReturnDetail = new ReturnedOrderDetail { Quantity = item.Quantity, Reason = "Not Part of Order", ItemDescription = item.Description, VendorPartNumber = item.VendorPartNumber }; receiveOrder.ReturnedOrderDetails.Add(newReturnDetail); } // Empty the Unordered Purchase Cart var unorderedParts = from u in context.UnorderedPurchaseItemCarts where u.PurchaseOrderNumber == pOrder.PurchaseOrderNumber select u; var unorderedPartsList = unorderedParts.ToList(); foreach (var item in unorderedPartsList) { context.UnorderedPurchaseItemCarts.Remove(item); // FLAG delete Cart items } context.SaveChanges(); // PROCCESS ALL CHANGES return(fulfilled); } }
protected void ReceiveOrder_Click(object sender, EventArgs e) { string sccssDetail = "Order Received."; MessageUserControl.TryRun(() => { try { PurchaseOrderProcessed order = new PurchaseOrderProcessed(); order.POid = Convert.ToInt32((PurchaseOrderDetailsGridView.Rows[0].FindControl("POid") as HiddenField).Value); List <ReceivedPODetail> detailList = new List <ReceivedPODetail>(); foreach (GridViewRow row in PurchaseOrderDetailsGridView.Rows) { // Unpack GridViewRow: var receivingAmount = Convert.ToInt32((row.Cells[4].Controls[1] as TextBox).Text); var qtyOutstanding = Convert.ToInt32((row.Cells[3].Controls[1] as Label).Text); if (receivingAmount > qtyOutstanding) { throw new Exception("Quantity receiving cannot be be greater then quantity outstanding."); } var returnAmount = Convert.ToInt32((row.Cells[5].Controls[1] as TextBox).Text); var returnReason = (row.Cells[6].Controls[1] as TextBox).Text; if (returnAmount > 0 && returnReason == "") { throw new Exception("Must provide reason for each item returned."); } var partID = Convert.ToInt32((row.Cells[0].Controls[1] as Label).Text); var poDetailID = Convert.ToInt32((row.FindControl("PODetailID") as HiddenField).Value); var POid = Convert.ToInt32((row.FindControl("POid") as HiddenField).Value); if (receivingAmount > 0 || returnAmount > 0) { // collect the data to be sent to BLL ReceivedPODetail data = new ReceivedPODetail { POid = POid, PODetailID = poDetailID, PartID = partID, QtyReceiving = receivingAmount, QtyReturning = returnAmount, ReturnReason = returnReason }; detailList.Add(data); } } // Check what button sent the request and check for item count for processing var button = ((LinkButton)sender).ID; if (detailList.Count == 0 && button == "ReceiveOrder" && UnorderedCart.Items.Count == 0) { throw new Exception("No items received in the order."); } order.receivedDetails = detailList; var controller = new ReceivingController(); bool closed = controller.ReceiveOrder(order); // Refresh GridView and ListView update after receive. var orderDetails = controller.GetPurchaseOrderDetails(order.POid); PurchaseOrderDetailsGridView.DataSource = orderDetails; PurchaseOrderDetailsGridView.DataBind(); UnorderedCart.DataBind(); // If order is closed refresh hide Order Details and refresh Order Panel. if (closed) { OrderPanel.Visible = false; OrderPanel.Enabled = false; OutstandingOrderGridView.DataBind(); sccssDetail = "Order Fulfilled and closed."; } } catch (FormatException) { throw new Exception("Returning and Receiving must be digits. If non returned / received enter 0."); } }, "Success", sccssDetail); }