public PartsRequestViewModel BuildPartsViewModel(JobPlanViewModel formData)
        {
            var manufacturerPart = _context.ManufacturerParts
                                   .Include(m => m.Manufacturer)
                                   .ToList();
            ManufacturerPart part = null;
            var manufacturers     = _context.Manufacturers.ToList();
            List <StockRoomRequestLine> requestLines = null;

            if (formData != null && formData.PartsIdList != null)
            {
                part         = new ManufacturerPart();
                requestLines = new List <StockRoomRequestLine>();
                string[]             tokens     = formData.PartsIdList.Split(';');
                int[]                partIds    = Array.ConvertAll <string, int>(tokens, int.Parse);
                int                  partIdsLen = partIds.Length / 2;
                StockRoomRequestLine requestLine;
                for (int i = 0; i < partIdsLen; i++)
                {
                    part = manufacturerPart.Single(m => m.Id == partIds[i]);
                    if (part != null)
                    {
                        requestLine = new StockRoomRequestLine();
                        requestLine.ManufacturerPart = part;
                        requestLine.Number           = partIds[i + partIdsLen];
                        requestLine.Description      = "Test" + part.Name;
                        requestLine.Id = i;
                        requestLines.Add(requestLine);
                    }
                }
            }
            var viewModel = new PartsRequestViewModel()
            {
                RequestLines      = requestLines,
                ManufacturerParts = manufacturerPart,
                Manufacturers     = manufacturers,
                WorkOrderNumber   = null,
                JobPlanNumber     = null
            };

            if (formData == null || formData.JobPlanId == null || formData.WorkOrderNumber == null)
            {
                return(viewModel);
            }
            viewModel.WorkOrderNumber = (int)formData.WorkOrderNumber;
            viewModel.Lines           = formData.PartsIdList;
            viewModel.Notes           = formData.PartNotesList;
            viewModel.JobPlanNumber   = (int)formData.JobPlanId;
            return(viewModel);
        }
        public ActionResult PartsRequest(JobPlanViewModel formData)
        {
            var manufacturerPart = _context.ManufacturerParts
                                   .Include(m => m.Manufacturer)
                                   .ToList();
            ManufacturerPart part = new ManufacturerPart();
            var manufacturers     = _context.Manufacturers.ToList();
            List <StockRoomRequestLine> requestLines = new List <StockRoomRequestLine>();
            StockRoomRequestLine        requestLine;

            string[] tokens     = formData.PartsIdList.Split(';');
            int[]    partIds    = Array.ConvertAll <string, int>(tokens, int.Parse);
            int      planId     = formData.JobPlanId;
            int      partIdsLen = partIds.Length / 2;

            for (int i = 0; i < partIdsLen; i++)
            {
                part = manufacturerPart.Single(m => m.Id == partIds[i]);
                if (part != null)
                {
                    requestLine = new StockRoomRequestLine();
                    requestLine.ManufacturerPart = part;
                    requestLine.Number           = partIds[i + partIdsLen];
                    requestLine.Description      = "Test" + part.Name;
                    requestLine.Id = i;
                    requestLines.Add(requestLine);
                }
            }

            var viewModel = new PartsRequestViewModel()
            {
                RequestLines      = requestLines,
                ManufacturerParts = manufacturerPart,
                WorkOrderNumber   = formData.WorkOrderNumber,
                Manufacturers     = manufacturers,
                Lines             = formData.PartsIdList,
                Notes             = formData.PartNotesList,
                JobPlanNumber     = formData.JobPlanId
            };

            return(View(viewModel));
        }
        public ActionResult MakeRequest(PartsRequestViewModel formData)
        {
            //get information from form here:
            string value;
            int    keyNumber;

            string[] keySplit;
            bool     refresh = false;
            List <RequestLineStruct> requestLines = new List <RequestLineStruct>();
            RequestLineStruct        requestLine  = new RequestLineStruct()
            {
                Number = 0, Note = "", PartId = 0
            };

            foreach (var key in Request.Form.AllKeys)
            {
                value = Request.Form.Get(key);
                if (key == "refresh")
                {
                    refresh = true;
                    System.Diagnostics.Debug.WriteLine("Refresh");
                }
                else if (key == "place")
                {
                    System.Diagnostics.Debug.WriteLine("Place");
                }
                else if ((key.StartsWith("RequestLine.") && (value != "0")) ||
                         (key.StartsWith("Note.") && (requestLine.Note == null)) ||
                         (key.StartsWith("Part.") && (value != "0")) ||
                         (key.StartsWith("PartId.")))
                {
                    keySplit  = key.Split('.');
                    keyNumber = Int32.Parse(keySplit[1]);
                    if (keySplit[0] == "RequestLine") // Take advantage of always having the order of requestLine, Note and PartId in same order...
                    {
                        if (value != "0")
                        {
                            requestLine.Number = Int32.Parse(value);
                            requestLine.PartId = null;
                            requestLine.Note   = null;
                        }
                        else
                        {
                            requestLine.Number = 0;
                            requestLine.PartId = 0;
                            requestLine.Note   = "";
                        }
                    }
                    else if (keySplit[0] == "Note" && requestLine.Note == null)
                    {
                        requestLine.Note = value ?? "";
                    }
                    else if (keySplit[0] == "PartId" && requestLine.PartId == null)
                    {
                        requestLine.PartId = Int32.Parse(value);
                        requestLines.Add(requestLine);
                    }
                    else if (keySplit[0] == "Part" && value != "0")
                    {
                        requestLine.PartId = keyNumber;
                        requestLine.Number = Int32.Parse(value);
                        requestLine.Note   = "";
                        requestLines.Add(requestLine);
                    }
                }
            }
            List <int>    partIdList = new List <int>();
            List <int>    numberList = new List <int>();
            List <string> noteList   = new List <string>();
            List <StockRoomRequestLine> requestLineList = new List <StockRoomRequestLine>();
            StockRoomRequestLine        requestLineLine;

            var    manufacturerPart = _context.ManufacturerParts.ToList();
            object stockRoomRequest = null;

            if (formData != null && formData.PartRequestNumber != null)
            {
                stockRoomRequest = _context.StockRoomRequests.Single(r => r.Id == (int)formData.PartRequestNumber);
            }


            for (int i = 0; i < requestLines.Count; i++)
            {
                requestLine     = requestLines[i];
                requestLineLine = new StockRoomRequestLine();
                requestLineLine.ManufacturerPart   = manufacturerPart.Single(p => p.Id == requestLine.PartId);
                requestLineLine.ManufacturerPartId = requestLineLine.ManufacturerPart.Id;
                requestLineLine.Description        = requestLine.Note;
                requestLineLine.Number             = requestLine.Number;
                requestLineLine.Id = i;
                if (stockRoomRequest != null)
                {
                    requestLineLine.StockRoomRequest   = (StockRoomRequest)stockRoomRequest;
                    requestLineLine.StockRoomRequestId = requestLineLine.StockRoomRequest.Id;
                }

                requestLineList.Add(requestLineLine);
            }
            if (refresh)
            {
                JobPlanViewModel buildModel = new JobPlanViewModel()
                {
                    WorkOrderNumber = formData.WorkOrderNumber,
                    JobPlanId       = formData.JobPlanNumber,
                };
                var viewModel = BuildPartsViewModel(buildModel);
                viewModel.RequestLines = requestLineList;
                if (formData.PartRequestNumber != null)
                {
                    viewModel.PartRequestNumber = formData.PartRequestNumber;
                }
                return(View("PartsRequest", viewModel));
            }
            else
            {
                if (formData != null && formData.PartRequestNumber != null) // save changed record
                {
                    int requestId             = (int)formData.PartRequestNumber;
                    var stockRoomRequestLines = _context.StockroomRequestLines;
                    var requestRecords        = stockRoomRequestLines.Where(r => r.StockRoomRequestId == requestId).ToList();
                    StockRoomRequestLine record;
                    foreach (var line in requestLineList) // Change or add first
                    {
                        record = requestRecords.SingleOrDefault(r => r.ManufacturerPartId == line.ManufacturerPartId);
                        if (record != null)
                        {
                            record.Description = line.Description;
                            record.Number      = line.Number;
                        }
                        else
                        {
                            stockRoomRequestLines.Add(line);
                        }
                    }
                    _context.SaveChanges();
                    bool done = false;
                    while (!done)
                    {
                        requestRecords = stockRoomRequestLines.Where(r => r.StockRoomRequestId == requestId).ToList();
                        bool doDelete;
                        foreach (var line in requestRecords) // Delete ones no longer needed
                        {
                            doDelete = true;
                            done     = true;
                            foreach (var request in requestLineList)
                            {
                                if (request.ManufacturerPartId == line.ManufacturerPartId)
                                {
                                    doDelete = false;
                                    break;
                                }
                            }
                            if (doDelete)
                            {
                                var itemToRemove = _context.StockroomRequestLines.SingleOrDefault(x => x.Id == line.Id);
                                if (itemToRemove != null)
                                {
                                    _context.StockroomRequestLines.Remove(itemToRemove);
                                    _context.SaveChanges();
                                }
                                System.Diagnostics.Debug.WriteLine("Delete Record");
                                done = false;
                                break;
                            }
                        }
                    }
                }
                else // new record
                {
                    // create a request first and get the id for it.
                    int workOrderNumber;
                    MaintenanceWorkOrder workOrder       = null;
                    Worker           worker              = null;
                    var              workers             = _context.Workers.ToList();
                    StockRoomRequest newStockRoomRequest = new StockRoomRequest()
                    {
                        StockRoomRequestStatus = _context.StockRoomRequestStatuses.Single(i => i.Id == 0),
                        Requested = DateTime.Now,
                        Required  = DateTime.Now.AddDays(14),
                        Approval  = false
                    };
                    newStockRoomRequest.StockRoomRequestStatusId = newStockRoomRequest.Id;
                    if (formData != null && formData.WorkOrderNumber != null)
                    {
                        workOrderNumber = (int)formData.WorkOrderNumber;
                        workOrder       = _context.MaintenanceWorkOrders.Single(id => id.Id == workOrderNumber);
                        if (workOrder.LeadWorkerId != null)
                        {
                            worker = workers.Single(i => i.Id == workOrder.LeadWorker.Id);
                            newStockRoomRequest.Worker   = worker;
                            newStockRoomRequest.WorkerId = worker.Id;
                        }

                        newStockRoomRequest.MaintenanceWorkOrder   = workOrder;
                        newStockRoomRequest.MaintenanceWorkOrderId = workOrder.Id;
                    }
                    else
                    {
                        // Will be replaced when logins are possible
                        Random rand      = new Random();
                        Worker rndWorker = workers.ElementAt(rand.Next(_context.Workers.Count()));
                        newStockRoomRequest.Worker   = rndWorker;
                        newStockRoomRequest.WorkerId = newStockRoomRequest.Worker.Id;
                    }
                    _context.StockRoomRequests.Add(newStockRoomRequest);
                    _context.SaveChanges();
                    int requestId = newStockRoomRequest.Id; // Id of new request
                    StockRoomRequest tempStockRoomRequest = _context.StockRoomRequests.Single(i => i.Id == requestId);
                    foreach (var line in requestLineList)
                    {
                        line.StockRoomRequest   = tempStockRoomRequest;
                        line.StockRoomRequestId = tempStockRoomRequest.Id;
                        _context.StockroomRequestLines.Add(line);
                    }
                    _context.SaveChanges();
                }
            }


            return(RedirectToAction("Index", "Maintenance"));
        }