public bool IsScheduleReadyBySequencingStationId(int id)
        {
            PartSequencingDataContext dbSeq = new PartSequencingDataContext();
            SequencingFactory maker = new SequencingFactory();
            HP_MESDataContext dbMes = new HP_MESDataContext();

            var seqStations = dbSeq.SequencingStationSettings.Where(i => i.SequencingLocationId == id).ToList();
            if (seqStations.Count() > 0)
            {
                var seqStation = seqStations.FirstOrDefault();
                if (seqStation != null)
                {
                    var station = maker.UpdateNextBoxBySequencingId(seqStation.Id);
                    if (!station.Status)
                    {
                        if (station.ItemsWaiting != 0)
                            return false;
                    }
                    
                    var scheduleStatus = dbSeq.SequencingStationLookups.Where(s => s.SequenceStationSettingsId == station.Id).FirstOrDefault();
                    var tokens = MessageTokensCacheManager.MessageTokens.Where(s => s.LineId == station.Line.Id || s.LineId == 4).ToList();

                    var lineBuffer = maker.GetSequencingBuffer(station);

                    SequencingTrackingItem lastItem = null;
                    var tracking = maker.GetSequencingHistory(station);

                    if (tracking.Any())
                        lastItem = tracking.OrderByDescending(i => i.OrderId).First();

                    var lastJobId = Int32.MinValue;

                    if (lastItem != null)
                        lastJobId = lastItem.OrderId;

                    if (lineBuffer != null)
                    {
                        var itemsinbox = station.PartsPerBox;
                        var boxperschedule = station.BoxPerSchedule;
                        var itemsinschedule = itemsinbox * boxperschedule;

                        var jobs = lineBuffer.Where(i => i.OrderId >= station.NextBox.OrderId).Take(itemsinschedule).ToList();
                        if (itemsinschedule == jobs.Count())
                            return true;
                    }
                }
            }

            return false;
        }
        public TrimScheduleInfo TrimPreviousScheduleHistoryDetail(int locationId)
        {
            SequencingFactory factory = new SequencingFactory();
            TrimScheduleFactory trimFactory = new TrimScheduleFactory();
            var histories = factory.GetScheduleHistory(locationId);
            var lastHistory = histories.FirstOrDefault();
            if (lastHistory != null)
            {
                var schedule = trimFactory.GetTrimScheduleHistoryDetail(locationId, (int)lastHistory.ScheduleNum);
                if (schedule == null)
                {
                    throw new HttpResponseException(
                          HttpErrorResponse.GetHttpErrorResponse(
                          HttpStatusCode.NotFound, "Trim Previous Schedule Not Available", string.Format("Trim Previous Schedule With Aisle ID = {0} does not exist", locationId)));
                }
                return schedule;
            
            }

            throw new HttpResponseException(
                          HttpErrorResponse.GetHttpErrorResponse(
                          HttpStatusCode.NotFound, "Trim Previous Schedule Not Available", string.Format("Trim Previous Schedule With Aisle ID = {0} does not exist", locationId)));
        }
        public IEnumerable<SideBySide> GetSequencingTracking2StationsByLineId(int lineId, int seqId1, int seqId2)
        {
            HP_MESDataContext dbMes = new HP_MESDataContext();
            SequencingFactory factory = new SequencingFactory();

            var results = (from s in dbMes.IWS_SP_GetWIPSequencingTracking2StationsByLineId(lineId, seqId1, seqId2)
                           select new SideBySide
                           {
                               Complete1 = s.ScheduleNum1 == -1 ? false : true,
                               Complete2 = s.ScheduleNum2 == -1 ? false : true,
                               BoxNum1 = s.BoxNum1,
                               BoxNum2 = s.BoxNum2,
                               Group = s.Group,
                               ItemNumber = s.ItemNumber,
                               ItemType = s.ItemType,
                               JobId = (int)s.JobId,
                               LineId = (int)s.LineId,
                               OrderId = (int)s.OrderId,
                               OrderStatus = (int)s.OrderStatus,
                               OrderNumber = s.OrderNumber,
                               Position1 = s.Position1,
                               Position2 = s.Position2,
                               Region = s.Region,
                               ScheduleNum1 = s.ScheduleNum1,
                               ScheduleNum2 = s.ScheduleNum2,
                               Type1 = s.Type1,
                               Type2 = s.Type2,
                           }).ToList();

            var station1 = factory.UpdateNextBoxBySequencingId(seqId1);
            var station2 = factory.UpdateNextBoxBySequencingId(seqId2);

            UpdateNextSeqScheduleSideBySide(station1, results, 1);
            UpdateNextSeqScheduleSideBySide(station2, results, 2);


            var scheduleNum1 = -1;
            var scheduleNum2 = -1;
            var boxNum1 = -1;
            var boxNum2 = -1;

            var itemsinschedule1 = station1.PartsPerBox * station1.BoxPerSchedule;
            var itemsinschedule2 = station2.PartsPerBox * station2.BoxPerSchedule;

            //Schedule calc
            for (var i = 0; i < results.Count(); i++)
            {

                if (results[i].ScheduleNum1 != scheduleNum1)
                {

                    results[i].StartDrawSchedule1 = true;

                    var countSchedule = 0;
                    for (var j = i; j < results.Count(); j++)
                    {
                        if (results[j].ScheduleNum1 == results[i].ScheduleNum1)
                        {
                            countSchedule++;
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (results[i].Complete1)
                        results[i].ScheduleCount1 = countSchedule;
                    else
                    {
                        if (countSchedule > itemsinschedule1)
                            results[i].ScheduleCount1 = itemsinschedule1;
                        else
                            results[i].ScheduleCount1 = countSchedule;
                    }

                    scheduleNum1 = results[i].ScheduleNum1;
                }
                else
                {
                    results[i].StartDrawSchedule1 = false;
                }

                if (results[i].ScheduleNum2 != scheduleNum2)
                {

                    results[i].StartDrawSchedule2 = true;

                    var countSchedule = 0;
                    for (var j = i; j < results.Count(); j++)
                    {
                        if (results[j].ScheduleNum2 == results[i].ScheduleNum2)
                        {
                            countSchedule++;
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (results[i].Complete2)
                        results[i].ScheduleCount2 = countSchedule;
                    else
                    {
                        if (countSchedule > itemsinschedule2)
                            results[i].ScheduleCount2 = itemsinschedule2;
                        else
                            results[i].ScheduleCount2 = countSchedule;
                    }

                    scheduleNum2 = results[i].ScheduleNum2;
                }
                else
                {
                    results[i].StartDrawSchedule2 = false;
                }


            }

            //Box Calc
            scheduleNum1 = -1;
            scheduleNum2 = -1;
            for (var i = 0; i < results.Count(); i++)
            {
                if (results[i].BoxNum1 != boxNum1 || results[i].ScheduleNum1 != scheduleNum1)
                {
                    results[i].StartDrawBox1 = true;

                    var countBox = 0;

                    for (var j = i; j < results.Count(); j++)
                    {
                        if (results[j].BoxNum1 == results[i].BoxNum1 && results[j].ScheduleNum1 == results[i].ScheduleNum1)
                        {
                            countBox++;
                        }

                    }
                    results[i].BoxCount1 = countBox;

                    boxNum1 = results[i].BoxNum1;
                    scheduleNum1 = results[i].ScheduleNum1;

                }
                else
                {
                    results[i].StartDrawBox1 = false;
                }

                if (results[i].BoxNum2 != boxNum2 || results[i].ScheduleNum2 != scheduleNum2)
                {
                    results[i].StartDrawBox2 = true;

                    var countBox = 0;

                    for (var j = i; j < results.Count(); j++)
                    {
                        if (results[j].BoxNum2 == results[i].BoxNum2 && results[j].ScheduleNum2 == results[i].ScheduleNum2)
                        {
                            countBox++;
                        }

                    }
                    results[i].BoxCount2 = countBox;

                    boxNum2 = results[i].BoxNum2;
                    scheduleNum2 = results[i].ScheduleNum2;

                }
                else
                {
                    results[i].StartDrawBox2 = false;
                }
            }



            return results;
        }
        private void UpdateNextSeqScheduleSideBySide(SequencingStation station, List<SideBySide> buffer, int side)
        {
            SequencingFactory factory = new SequencingFactory();
            var seqMessageProcessor = new SeqMessageProcessor();

            var tokens = MessageTokensCacheManager.MessageTokens.Where(t => t.LineId == station.Line.Id).ToList();

            var itemsinbox = station.PartsPerBox;
            var boxperschedule = station.BoxPerSchedule;
            var itemsinschedule = itemsinbox * boxperschedule;

            SideBySide firstItem = null;
            if (side ==1)
                firstItem = buffer.Where(s => s.Complete1 == false).OrderBy(s => s.OrderId).FirstOrDefault();
            else
                firstItem = buffer.Where(s => s.Complete2 == false).OrderBy(s => s.OrderId).FirstOrDefault();

            if (firstItem != null)
            {
                if(side == 1)
                    firstItem.StartDrawSchedule1 = true;
                else
                    firstItem.StartDrawSchedule2 = true;

                var currentBox = station.NextBox.BoxNum;
                var jobs = buffer.Where(s => s.OrderId >= firstItem.OrderId).OrderBy(s => s.OrderId).Take(itemsinschedule).ToList();

                var itemsinscheduleTmp = itemsinschedule;
                var itemsinboxTmp = itemsinbox;
                var boxesperscheduleTmp = boxperschedule;

                foreach (var j in jobs)
                {
                    if (side == 1)
                    {
                        j.ScheduleNum1 = station.NextBox.ScheduleNum;
                        j.ScheduleCount1 = itemsinschedule;
                        j.StartDrawBox1 = true;
                        j.BoxNum1 = currentBox;
                    }
                    else
                    {
                        j.ScheduleNum2 = station.NextBox.ScheduleNum;
                        j.ScheduleCount2 = itemsinschedule;
                        j.StartDrawBox2 = true;
                        j.BoxNum2 = currentBox;
                    }

                    var message = seqMessageProcessor.GetSequencingMessage(station, j.ItemNumber, tokens).Trim();

                    if (message.ToUpper().IndexOf("*SKIPPED*") < 0)
                        --itemsinboxTmp;

                    --itemsinscheduleTmp;

                    if (itemsinboxTmp > 0 && itemsinscheduleTmp > 0) continue;
                    if (itemsinschedule <= 0)
                        break;

                    itemsinboxTmp = station.PartsPerBox;
                    --boxesperscheduleTmp;

                    if (side == 1)
                        j.StartDrawBox1 = false;
                    else
                        j.StartDrawBox2 = false;

                    if (currentBox + 1 > station.BoxQty)
                        currentBox = 1;
                    else
                    {
                        currentBox++;
                    }

                }

                

            }
        }
        public IEnumerable<SequencingStation> GetSequencingStationsBySequencingLocationId(int id)
        {
            PartSequencingDataContext dbSeq = new PartSequencingDataContext();
            SequencingFactory factory = new SequencingFactory();
            List<SequencingStation> listStations = new List<SequencingStation>();

            var results = (from s in SequencingSettingsCacheManager.SequencingStationSettings
                               where s.SequencingLocationId == id
                               select s).ToList();

            foreach (var seqStation in results)
            {
                var station = factory.UpdateNextBoxBySequencingId(seqStation.Id);
                listStations.Add(station);
            }

            return listStations;
        }
 public IEnumerable<SequencingStationScheduleHistory> SequencingScheduleHistory(int id)
 {
     SequencingFactory factory = new SequencingFactory();
     var items = factory.GetScheduleHistory(id);
     return items;
 }
        public void CompletePlasticSeqByStation(SequencingStation station)
        {
            #region Complete Plastic Seq By Station
            PartSequencingDataContext dbSeq = new PartSequencingDataContext();
            HP_MESDataContext dbMes = new HP_MESDataContext();
            SequencingFactory seqFactory = new SequencingFactory();
            var seqMessageProcessor = new SeqMessageProcessor();

            var completeDTM = DateTime.Now;

            var lineBuffer = seqFactory.GetSequencingBuffer(station);

            if (station.ScheduleAvailable)
            {
                Log.Logging.Info("station.ScheduleAvailable = true|Seq Id: {0}", station.Id);

                var itemsinbox = station.PartsPerBox;
                var boxperschedule = station.BoxPerSchedule;
                var itemsinschedule = itemsinbox * boxperschedule;

                var currentBox = station.NextBox.BoxNum;

                var jobs = lineBuffer.Where(i => i.OrderId >= station.NextBox.OrderId).Take(itemsinschedule).ToList();
                Log.Logging.Info("Job Count: {0}|Station: {1} Seq Id: {2}", jobs.Count(), station.SequencingLocation.Description, station.Id);
                var tokens = MessageTokensCacheManager.MessageTokens.Where(t => t.LineId == station.Line.Id).ToList();

                SequencingTrackingHistoryDetail histDetail = new SequencingTrackingHistoryDetail
                {
                    BoxNum = currentBox,
                    DTM = completeDTM,
                    ScheduleNum = station.NextBox.ScheduleNum,
                    SequencingStationSettingsId = station.Id,
                    Type = 1
                };

                dbSeq.SequencingTrackingHistoryDetails.InsertOnSubmit(histDetail);
                dbSeq.SubmitChanges();

                Log.Logging.Info("History Header|BoxNum={0}, DTM={1}, ScheduleNum={2}, SeqId={3}, Type={4}", histDetail.BoxNum, histDetail.DTM, histDetail.ScheduleNum, histDetail.SequencingStationSettingsId, histDetail.Type);

                int position = 1;
                foreach (var job in jobs)
                {
                    var message = seqMessageProcessor.GetSequencingMessage(station, job.ItemNumber, tokens).Trim();

                    SequencingTrackingHistory hist = new SequencingTrackingHistory
                    {
                        OrderNumber = job.OrderNumber,
                        ItemNumber = job.ItemNumber,
                        ItemType = job.ItemType,
                        JobId = job.JobId,
                        Position = position,
                        OrderId = job.OrderId,
                        SequencingTrackingHistoryDetail = histDetail,
                    };
                    position++;

                    dbSeq.SequencingTrackingHistories.InsertOnSubmit(hist);

                    Log.Logging.Info("History Detail Item|Job Hist = {0}|Station: {1} Seq Id: {2}", hist, station.SequencingLocation.Description, station.Id);
                    Log.Logging.Info("History Detail Item|OrderNumber={0}, ItemNumber={1}, ItemType={2}, JobId={3}, Position={4}, OrderId={5}", hist.OrderNumber, hist.ItemNumber, hist.ItemType, hist.JobId, hist.Position, hist.OrderId);

                    dbSeq.SubmitChanges();

                    if (message.ToUpper().IndexOf("*SKIPPED*") < 0)
                        --itemsinbox;

                    --itemsinschedule;

                    if (itemsinbox > 0 && itemsinschedule > 0) continue;
                    if (itemsinschedule <= 0)
                        break;

                    itemsinbox = station.PartsPerBox;
                    --boxperschedule;

                    if (currentBox + 1 > station.BoxQty)
                        currentBox = 1;
                    else
                    {
                        currentBox++;
                        position = 1;
                    }

                    histDetail = new SequencingTrackingHistoryDetail
                    {
                        Type = 1,
                        BoxNum = currentBox,
                        DTM = completeDTM,
                        ScheduleNum = station.NextBox.ScheduleNum,
                        SequencingStationSettingsId = station.Id,
                    };

                    Log.Logging.Info("History Detail|BoxNum={0}, DTM={1}, ScheduleNum={2}, SeqId={3}, Type={4}", histDetail.BoxNum, histDetail.DTM, histDetail.ScheduleNum, histDetail.SequencingStationSettingsId, histDetail.Type);

                }


                var lookup = dbSeq.SequencingStationLookups.Where(s => s.SequenceStationSettingsId == station.Id).FirstOrDefault();
                if (lookup != null)
                {
                    if (jobs.Count() > 0)
                    {
                        Log.Logging.Info("Count Jobs={0} SeqId={1}", jobs.Count(), station.Id);
                        var lastJob = jobs.Last();
                        if (lastJob != null)
                        {
                            Log.Logging.Info("Last Jobs: OrderId={0} SeqId={1}", lastJob.OrderId, station.Id);
                            lookup.NextOrderId = lastJob.OrderId + 1;
                            dbSeq.SubmitChanges();
                            Log.Logging.Info("Success Update Lookup: NextOrderId={0} NextScheduleNum={1} NextNextBoxNum={2}", lookup.NextOrderId, lookup.NextScheduleNum, lookup.NextBoxNum);
                        }
                    }
                }

            }
            else
            {
                Log.Logging.Info("station.ScheduleAvailable = false|Seq Id: {0}", station.Id);
            }
            #endregion
        }
        public TrimScheduleInfo GetTrimScheduleHistoryDetail(int locationId, int scheduleNum)
        {
            PartSequencingDataContext dbSeq = new PartSequencingDataContext();
            ItemDetailsFactory itemDetailsModel = new ItemDetailsFactory();
            SequencingFactory factory = new SequencingFactory();
            var seqMessageProcessor = new SeqMessageProcessor();

            var seqStation = dbSeq.SequencingStationSettings.Where(i => i.SequencingLocationId == locationId).FirstOrDefault();
            var tokens = MessageTokensCacheManager.MessageTokens.Where(s => s.LineId == seqStation.LineId || s.LineId == 4).ToList();
            var station = factory.UpdateNextBoxBySequencingId(seqStation.Id);

            TrimScheduleInfo trimHistorySchedule = null;

            if (station != null)
            {
                SequencingTrackingItem lastItem = null;
                var tracking = factory.GetSequencingHistory(station);

                if (tracking.Any())
                {
                    lastItem = tracking.OrderByDescending(i => i.OrderId).First();
                    if (lastItem != null)
                    {
                        var historyjobs = (from t in dbSeq.IWS_GetSequencingDetailHistoryBySeqSettingsIdAndScheduleNum(station.Id, scheduleNum)
                                          select new Seat
                                          {
                                            ScheduleNum = t.ScheduleNum,
                                            BoxNum = t.BoxNum,
                                            Complete = false,
                                            TrimStyle = GetOptionValue(t.ItemNumber.Trim(), 100),
                                            Colour = GetOptionValue(t.ItemNumber.Trim(), 101),
                                            ItemNumber = t.ItemNumber.Trim(),
                                            ItemType = t.ItemType.Trim(),
                                            DescLine1 = t.ItemNumber.Trim(),
                                            DescLine2 = seqMessageProcessor.GetSequencingMessage(station, t.ItemNumber.Trim(), tokens),
                                            OrderId = t.OrderId,
                                            Item = itemDetailsModel.GetItemInfoByLineId(t.ItemNumber.Trim(), station.Line.Id)
                                          }).ToList();

                        var firstItem = historyjobs.FirstOrDefault();

                        trimHistorySchedule = new TrimScheduleInfo
                        {
                            Complete = true,
                            ScheduleStatus = new TrimScheduleStatus
                            {
                                CurrentBoxNumber = firstItem == null ? 0 : firstItem.BoxNum,
                                CurrentScheduleNumber = firstItem == null ? 0 : firstItem.ScheduleNum
                            },
                            SeatSchedule = historyjobs,
                            SummaryList = GetSummaryHeaderItems(historyjobs, station.Line.Id),
                        };
                        return trimHistorySchedule;
                    }

                }

            }
            return trimHistorySchedule;
        }
 public SideBySideStatistics GetStationOffset2Stations(int lineId, int seqId1, int seqId2)
 {
     SequencingFactory factory = new SequencingFactory();
     var stat = factory.GetSideBySideStatistics(lineId, seqId1, seqId2);
     return stat;
 }
        public JobBuffer ScheduleAdminView(int id)
        {
            SequencingFactory maker = new SequencingFactory();
            return maker.ScheduleAdminView(id);

        }
 public HttpResponseMessage AutoCorrectOffsetByStationId(int id)
 {
     SequencingFactory maker = new SequencingFactory();
     maker.AutoCorrectSeqScheduleBySequencingStationId(id);
     return new HttpResponseMessage(HttpStatusCode.OK);
 }
 public HttpResponseMessage UpdateOffsetStationById(int id, int direction, int offset)
 {
     SequencingFactory maker = new SequencingFactory();
     maker.UpdateOffsetStationById(id, direction, offset);
     return new HttpResponseMessage(HttpStatusCode.OK);
 }
        public HttpResponseException TrimScheduleReady(int id)
        {
            SequencingFactory seqFactory = new SequencingFactory();
            TrimScheduleFactory trimFactory = new TrimScheduleFactory();
            var ready = trimFactory.IsScheduleReadyBySequencingStationId(id);
            if (ready)
            {
                return new HttpResponseException(HttpStatusCode.OK);
            }
            else
            {
                throw new HttpResponseException(
                          HttpErrorResponse.GetHttpErrorResponse(
                          HttpStatusCode.NotFound, "Trim Schedule Not Available", string.Format("Trim Schedule With Aisle ID = {0} does not exist", id)));
            }

        }
        public PlasticSeqSchedule GetPlasticSeqScheduleBySequencingStationId(int id)
        {
            #region Get Plastic Seq Schedule By Sequencing Station Id
            PartSequencingDataContext dbSeq = new PartSequencingDataContext();
            HP_MESDataContext dbMes = new HP_MESDataContext();
            SequencingFactory seqFactory = new SequencingFactory();
            var seqMessageProcessor = new SeqMessageProcessor();


            PlasticSeqSchedule schedule = null;

            var station = seqFactory.UpdateNextBoxBySequencingId(id);
            var scheduleStatus = dbSeq.SequencingStationLookups.Where(s => s.SequenceStationSettingsId == station.Id).FirstOrDefault();

            var tokens = MessageTokensCacheManager.MessageTokens.Where(s => s.LineId == station.Line.Id || s.LineId == 4).ToList();

            var lineBuffer = seqFactory.GetSequencingBuffer(station);

            schedule = new PlasticSeqSchedule
            {
                SequencingStation = station,
            };

            SequencingTrackingItem lastTrackItem = null;
            var tracking = seqFactory.GetSequencingHistory(station);

            if (tracking.Any())
            {
                lastTrackItem = tracking.OrderByDescending(i => i.OrderId).FirstOrDefault();
                if (lastTrackItem != null)
                {
                    if (lastTrackItem.Type == 2)
                    {
                        var lastRealJob = tracking.Where(o => o.OrderId < lastTrackItem.OrderId).OrderByDescending(f => f.OrderId).Where(x => x.ScheduleNum > 0).FirstOrDefault();

                        if (lastRealJob != null)
                        {
                            var unassignedBuffer = tracking.Where(o => o.OrderId <= lastTrackItem.OrderId && o.OrderId > lastRealJob.OrderId).OrderBy(f => f.OrderId).ToList();
                            if (unassignedBuffer.Count() > 0)
                            {
                                var unassignbox = new ScheduleBox(1, 1);
                                var items = unassignedBuffer.Select(item => seqMessageProcessor.GetSequencingMessage(station, item.ItemNumber, tokens).Trim());
                                int unassignPosition = 1;
                                foreach (var message in items)
                                {
                                    if (message.ToUpper().IndexOf("*SKIPPED*") < 0)
                                    {
                                        //string[] msg = message.Split(',');
                                        unassignbox.Items.Add(new ScheduleItem(unassignPosition, message));
                                        unassignPosition++;
                                    }

                                }
                                schedule.OffsetBoxes = unassignbox;
                            }
                        }


                    }
                }
            }


            if (lineBuffer != null)
            {
                //check for not assigned parts for schedule
                var itemsinbox = station.PartsPerBox;
                var boxperschedule = station.BoxPerSchedule;
                var itemsinschedule = itemsinbox * boxperschedule;

                var jobs = lineBuffer.Where(i => i.OrderId >= station.NextBox.OrderId).Take(itemsinschedule).ToList();
                var boxPosition = 1;
                var boxperpage = boxperschedule;

                do
                {
                    var currentbox = station.NextBox.BoxNum;
                    var box = new ScheduleBox(boxPosition, currentbox);

                    var items = jobs.Select(item => seqMessageProcessor.GetSequencingMessage(station, item.ItemNumber.Trim(), tokens).Trim());
                    if (!items.Any())
                        break;


                    foreach (var message in items)
                    {
                        if (message.ToUpper().IndexOf("*SKIPPED*") < 0)
                        {
                            box.Items.Add(new ScheduleItem((station.PartsPerBox - itemsinbox + 1), message));
                            --itemsinbox;
                        }

                        --itemsinschedule;
                        if (itemsinbox > 0 && itemsinschedule > 0) continue;
                        itemsinbox = station.PartsPerBox;
                        currentbox = currentbox >= station.BoxQty ? 1 : (++currentbox);
                        schedule.Boxes.Add(box);
                        --boxperschedule;
                        if (boxperschedule > 0 && itemsinschedule > 0)
                        {
                            --boxperpage;
                            boxPosition++;
                            box = new ScheduleBox(boxPosition, currentbox);
                        }
                        else
                        {
                            boxperpage = 0;
                            boxPosition = 1;
                            break;
                        }
                    }
                } while (boxperpage > 1);

            }

            return schedule;
            #endregion
        }
        public TrimScheduleInfo GetNextTrimSchedule(int locationId)
        {
            PartSequencingDataContext dbSeq = new PartSequencingDataContext();
            SequencingFactory factory = new SequencingFactory();
            HP_MESDataContext dbMes = new HP_MESDataContext();
            ItemDetailsFactory itemDetailsModel = new ItemDetailsFactory();
            TrimScheduleInfo nextTrimScheduleInfo = null;

            var seqMessageProcessor = new SeqMessageProcessor();

            var seqStations = dbSeq.SequencingStationSettings.Where(i => i.SequencingLocationId == locationId).ToList();
            if (seqStations.Count() > 0)
            {
                var seqStation = seqStations.FirstOrDefault();
                if (seqStation != null)
                {
                    var station = factory.UpdateNextBoxBySequencingId(seqStation.Id);
                    var scheduleStatus = dbSeq.SequencingStationLookups.Where(s => s.SequenceStationSettingsId == station.Id).FirstOrDefault();
                    var tokens = MessageTokensCacheManager.MessageTokens.Where(s => s.LineId == station.Line.Id || s.LineId == 4).ToList();

                    var lineBuffer = factory.GetSequencingBuffer(station);

                    if (lineBuffer != null)
                    {
                        var itemsinbox = station.PartsPerBox;
                        var boxperschedule = station.BoxPerSchedule;
                        var itemsinschedule = itemsinbox * boxperschedule;
                        var boxqty = station.BoxQty;

                        var currentjobs = (from j in lineBuffer.Where(i => i.OrderId >= station.NextBox.OrderId).Take(itemsinschedule).ToList()
                                           select new Seat
                                           {
                                               OrderStatus = (int)j.OrderStatus,
                                               Complete = false,
                                               TrimStyle = GetOptionValue(j.ItemNumber.Trim(), 100),
                                               Colour = GetOptionValue(j.ItemNumber.Trim(), 101),
                                               OrderNumber = j.OrderNumber == null ? "" : j.OrderNumber.Trim(),
                                               ItemNumber = j.ItemNumber.Trim(),
                                               ItemType = j.ItemType.Trim(),
                                               DescLine1 = j.ItemNumber.Trim(),
                                               DescLine2 = seqMessageProcessor.GetSequencingMessage(station, j.ItemNumber.Trim(), tokens),
                                               JobId = (int)j.JobId,
                                               OrderId = j.OrderId,
                                               Item = itemDetailsModel.GetItemInfoByLineId(j.ItemNumber.Trim(), station.Line.Id),
                                           }).OrderBy(s => s.OrderId).ToList();

                        if (currentjobs.Count() != itemsinschedule)
                            return null;

                        var lastcurrentjob = currentjobs.Last();

                        var nextjobs = (from j in lineBuffer.Where(i => i.OrderId > lastcurrentjob.OrderId).Take(itemsinschedule).ToList()
                                        select new Seat
                                        {
                                            OrderStatus = (int)j.OrderStatus,
                                            Complete = false,
                                            TrimStyle = GetOptionValue(j.ItemNumber.Trim(), 100),
                                            Colour = GetOptionValue(j.ItemNumber.Trim(), 101),
                                            OrderNumber = j.OrderNumber == null ? "" : j.OrderNumber.Trim(),
                                            ItemNumber = j.ItemNumber.Trim(),
                                            ItemType = j.ItemType.Trim(),
                                            DescLine1 = j.ItemNumber.Trim(),
                                            DescLine2 = seqMessageProcessor.GetSequencingMessage(station, j.ItemNumber.Trim(), tokens),
                                            JobId = (int)j.JobId,
                                            OrderId = j.OrderId,
                                            Item = itemDetailsModel.GetItemInfoByLineId(j.ItemNumber.Trim(), station.Line.Id)
                                        }).OrderBy(s => s.OrderId).ToList();

                        if (nextjobs.Count() == itemsinschedule)
                        {
                            nextTrimScheduleInfo = new TrimScheduleInfo
                            {
                                Complete = false,
                                SeatSchedule = nextjobs,
                                SummaryList = GetSummaryHeaderItems(nextjobs, station.Line.Id),
                                ScheduleStatus = new TrimScheduleStatus
                                {
                                    CurrentBoxNumber = (scheduleStatus.NextBoxNum + 1) > boxqty ? 1 : scheduleStatus.NextBoxNum + 1,
                                    CurrentScheduleNumber = scheduleStatus.NextScheduleNum + 1
                                }
                            };
                        }
                        else
                        {
                            return null;
                        }

                        for (int i = 0; i < nextjobs.Count(); i++)
                            nextjobs[i].Index = i;

                        return nextTrimScheduleInfo;

                    }
                }
            }
            return null;
        }
        public HttpResponseMessage CompleteSeqStationSchedule(int seqId)
        {
            PlasticScheduleFactory maker = new PlasticScheduleFactory();
            SequencingFactory seqFactory = new SequencingFactory();
            var station = seqFactory.UpdateNextBoxBySequencingId(seqId);
            maker.CompletePlasticSeqByStation(station);

            return new HttpResponseMessage(HttpStatusCode.OK);
        }
        public TrimSchedule GetTrimSchedule(int id)
        {
            PartSequencingDataContext dbSeq = new PartSequencingDataContext();
            SequencingFactory factory = new SequencingFactory();
            HP_MESDataContext dbMes = new HP_MESDataContext();
            ItemDetailsFactory itemDetailsModel = new ItemDetailsFactory();
            TrimSchedule trimSchedule = null;
            List<Seat> offsetSeats = null;
            List<Seat> currentjobs = null;
            var seqMessageProcessor = new SeqMessageProcessor();

            var seqStations = dbSeq.SequencingStationSettings.Where(i => i.SequencingLocationId == id).ToList();
            if (seqStations.Count() > 0)
            {
                var seqStation = seqStations.FirstOrDefault();
                if (seqStation != null)
                {
                    var station = factory.UpdateNextBoxBySequencingId(seqStation.Id);
                    var scheduleStatus = dbSeq.SequencingStationLookups.Where(s => s.SequenceStationSettingsId == station.Id).FirstOrDefault();
                    var tokens = MessageTokensCacheManager.MessageTokens.Where(s => s.LineId == station.Line.Id || s.LineId == 4).ToList();

                    var lineBuffer = factory.GetSequencingBuffer(station);

                    if (lineBuffer != null)
                    {
                        var itemsinbox = station.PartsPerBox;
                        var boxperschedule = station.BoxPerSchedule;
                        var itemsinschedule = itemsinbox * boxperschedule;
                        var boxqty = station.BoxQty;

                        trimSchedule = new TrimSchedule();

                        var tracking = factory.GetSequencingHistory(station);
                        if (tracking.Any()) 
                        {
                            var lastTrackItem = tracking.LastOrDefault();
                            if (lastTrackItem != null)
                            {
                                if (lastTrackItem.Type == 2)
                                {
                                    var lastRealJob = tracking.Where(o => o.OrderId < lastTrackItem.OrderId).OrderByDescending(f => f.OrderId).Where(x => x.ScheduleNum > 0).FirstOrDefault();

                                    if (lastRealJob != null)
                                    {
                                        var unassignedBuffer = tracking.Where(o => o.OrderId <= lastTrackItem.OrderId && o.OrderId >lastRealJob.OrderId).OrderBy(f => f.OrderId).ToList();
                                        if (unassignedBuffer.Count() > 0)
                                        {
                                            var offsetjobs = (from j in unassignedBuffer
                                                              select new Seat
                                                              {
                                                                  OrderStatus = (int)j.OrderStatus,
                                                                  Complete = false,
                                                                  TrimStyle = GetOptionValue(j.ItemNumber.Trim(), 100),
                                                                  Colour = GetOptionValue(j.ItemNumber.Trim(), 101),
                                                                  OrderNumber = j.OrderNumber == null ? "" : j.OrderNumber.Trim(),
                                                                  ItemNumber = j.ItemNumber.Trim(),
                                                                  ItemType = j.ItemType.Trim(),
                                                                  DescLine1 = j.ItemNumber.Trim(),
                                                                  DescLine2 = seqMessageProcessor.GetSequencingMessage(station, j.ItemNumber.Trim(), tokens),
                                                                  JobId = (int)j.JobId,
                                                                  OrderId = j.OrderId,
                                                                  Item = itemDetailsModel.GetItemInfoByLineId(j.ItemNumber.Trim(), station.Line.Id)
                                                              }).ToList();

                                            offsetSeats = offsetjobs;
                                        }
                                    }

                                }
                            }


                        }


                        if (station.SequencingLocation.ParentId == null)
                        {
                            currentjobs = (from j in lineBuffer.Where(i => i.OrderId >= station.NextBox.OrderId).Take(itemsinschedule).ToList()
                                           select new Seat
                                           {
                                               OrderStatus = (int)j.OrderStatus,
                                               Complete = false,
                                               TrimStyle = GetOptionValue(j.ItemNumber.Trim(), 100),
                                               Colour = GetOptionValue(j.ItemNumber.Trim(), 101),
                                               OrderNumber = j.OrderNumber == null ? "" : j.OrderNumber.Trim(),
                                               ItemNumber = j.ItemNumber.Trim(),
                                               ItemType = j.ItemType.Trim(),
                                               DescLine1 = j.ItemNumber.Trim(),
                                               DescLine2 = seqMessageProcessor.GetSequencingMessage(station, j.ItemNumber.Trim(), tokens),
                                               JobId = (int)j.JobId,
                                               OrderId = j.OrderId,
                                               Item = itemDetailsModel.GetItemInfoByLineId(j.ItemNumber.Trim(), station.Line.Id),
                                           }).OrderBy(s => s.OrderId).ToList();
                        }
                        else //from queue
                        {
                            currentjobs = (from j in lineBuffer.Where(i => i.OrderId >= station.NextBox.OrderId).Take(itemsinschedule).ToList()
                                            select new Seat
                                            {
                                                ScheduleNum = j.ScheduleNum,
                                                BoxNum = j.BoxNum,
                                                OrderStatus = (int)j.OrderStatus,
                                                Complete = false,
                                                TrimStyle = GetOptionValue(j.ItemNumber.Trim(), 100),
                                                Colour = GetOptionValue(j.ItemNumber.Trim(), 101),
                                                OrderNumber = j.OrderNumber == null ? "" : j.OrderNumber.Trim(),
                                                ItemNumber = j.ItemNumber.Trim(),
                                                ItemType = j.ItemType.Trim(),
                                                DescLine1 = j.ItemNumber.Trim(),
                                                DescLine2 = seqMessageProcessor.GetSequencingMessage(station, j.ItemNumber.Trim(), tokens),
                                                JobId = (int)j.JobId,
                                                OrderId = j.OrderId,
                                                Item = itemDetailsModel.GetItemInfoByLineId(j.ItemNumber.Trim(), station.Line.Id),
                                            }).OrderBy(s => s.OrderId).ToList();
                        }


                        if (currentjobs.Count() != itemsinschedule)
                            return null;

                        for(int i=0; i<currentjobs.Count(); i++)
                            currentjobs[i].Index = i;

                        trimSchedule.CurrentSchedule = new TrimScheduleInfo
                        {
                            Complete = false,
                            SeatSchedule = currentjobs,
                            SummaryList = GetSummaryHeaderItems(currentjobs, station.Line.Id),
                            ScheduleStatus = GetTrimScheduleStatus(station, scheduleStatus, currentjobs),
                            OffsetSeats = offsetSeats
                        };

                        return trimSchedule;

                    }
                }
            }
            return null;
        }
 public HttpResponseMessage IncompleteLastSeqStationSchedule(int seqId)
 {
     SequencingFactory maker = new SequencingFactory();
     
     return new HttpResponseMessage(HttpStatusCode.OK);
 }
        public void CompleteTrimSchedule(TrimScheduleInfo schedule, int id, int employeeId)
        {
            PartSequencingDataContext dbSeq = new PartSequencingDataContext();
            EmployeeDatabase dbEmp = new EmployeeDatabase();
            SequencingFactory factory = new SequencingFactory();

            var employee = dbEmp.GetEmployeeInfo(employeeId);
            var seqStations = dbSeq.SequencingStationSettings.Where(i => i.SequencingLocationId == id).ToList();

            if (seqStations.Count() > 0)
            {
                var seqStation = seqStations.FirstOrDefault();
                if (seqStation != null)
                {
                    var station = factory.UpdateNextBoxBySequencingId(seqStation.Id);
                    var statusLookup = dbSeq.SequencingStationLookups.Where(i => i.SequenceStationSettingsId == seqStation.Id).FirstOrDefault();

                    int boxNum = schedule.ScheduleStatus.CurrentBoxNumber;
                    int scheduleNum = schedule.ScheduleStatus.CurrentScheduleNumber;

                    //check if job completed already
                    bool isComplete = false;
                    var isCompleteResult = dbSeq.IsSequencingScheduleComplete(seqStation.Id, boxNum, scheduleNum);
                    if (isCompleteResult.HasValue == true) // it's null
                        isComplete = (bool)isCompleteResult;

                    if (isComplete)
                    {
                        throw new HttpResponseException(
                            HttpErrorResponse.GetHttpErrorResponse(
                            HttpStatusCode.NotFound, "Trim Schedule Already Completed", string.Format("Trim Schedule {0} Already Completed", scheduleNum)));
                    }

                    if (schedule.ScheduleStatus.CurrentBoxNumber == statusLookup.NextBoxNum
                        && schedule.ScheduleStatus.CurrentScheduleNumber == statusLookup.NextScheduleNum)
                    {
                        var lastjob = schedule.SeatSchedule.Last();
                        var firstjob = schedule.SeatSchedule.First();

                        //get schedule parameters by station
                        var itemsinbox = station.PartsPerBox;
                        var boxperschedule = station.BoxPerSchedule;
                        var itemsinschedule = itemsinbox * boxperschedule;

                        //get sequencing buffer
                        var lineBuffer = factory.GetSequencingBuffer(station);
                        //filter sequencing buffer by last job and first job
                        var validBuffer = lineBuffer.Where(i => i.OrderId <= lastjob.OrderId && i.OrderId >= firstjob.OrderId).OrderBy(s => s.OrderId).ToList();

                        if (validBuffer.Count() == itemsinschedule) //check if there is enough seats to fulfill schedule
                        {
                            if (schedule.OffsetSeats != null)
                            {
                                if (schedule.OffsetSeats.Count() > 0)
                                {

                                }
                            }


                            //save history
                            SequencingTrackingHistoryDetail histDetail = new SequencingTrackingHistoryDetail
                            {
                                BoxNum = schedule.ScheduleStatus.CurrentBoxNumber,
                                DTM = DateTime.Now,
                                ScheduleNum = schedule.ScheduleStatus.CurrentScheduleNumber,
                                SequencingStationSettingsId = station.Id,
                                Type = 1
                            };
                            dbSeq.SequencingTrackingHistoryDetails.InsertOnSubmit(histDetail);

                            foreach (var seat in schedule.SeatSchedule)
                            {
                                SequencingTrackingHistory hist = new SequencingTrackingHistory
                                {
                                    Position = seat.Index + 1,
                                    OrderId = seat.OrderId,
                                    ItemNumber = seat.ItemNumber,
                                    OrderNumber = seat.OrderNumber,
                                    ItemType = seat.ItemType,
                                    JobId = seat.JobId,
                                    SequencingTrackingHistoryDetail = histDetail,
                                };

                                dbSeq.SequencingTrackingHistories.InsertOnSubmit(hist);
                            }

                            //queue station items
                            if ((bool)station.SequencingLocation.QueueItems)
                            {
                                var queueStations = dbSeq.SequencingLocations.Where(l => l.ParentId == station.SequencingLocation.Id).ToList();

                                if (queueStations.Count() > 0)
                                {
                                    foreach (var st in queueStations)
                                    {
                                        var queueItems = (from s in schedule.SeatSchedule
                                                          select new SequencingStationQueue
                                                          {
                                                              OrderNumber = s.OrderNumber == null ? "" : s.OrderNumber.Trim(),
                                                              BoxNum = schedule.ScheduleStatus.CurrentBoxNumber,
                                                              InsertedDTM = DateTime.Now,
                                                              UpdatedDTM = DateTime.Now,
                                                              ItemNumber = s.ItemNumber.Trim(),
                                                              ItemType = s.ItemType.Trim(),
                                                              JobId = s.JobId,
                                                              OrderId = s.OrderId,
                                                              Region = "",
                                                              ScheduleNum = schedule.ScheduleStatus.CurrentScheduleNumber,
                                                              SequencingLocationId = st.Id,
                                                              OrderStatus = (byte)s.OrderStatus,
                                                          }).ToList();

                                        dbSeq.SequencingStationQueues.InsertAllOnSubmit(queueItems);
                                        dbSeq.SubmitChanges();
                                    }
                                }
                            }

                            //no parent station delete from the queue table
                            if (station.SequencingLocation.ParentId != null)
                            {
                                var deleteSeats = dbSeq.SequencingStationQueues.Where(i => i.OrderId <= lastjob.OrderId && i.OrderId >= firstjob.OrderId && i.SequencingLocationId == station.SequencingLocation.Id).OrderBy(s => s.OrderId).ToList();
                                dbSeq.SequencingStationQueues.DeleteAllOnSubmit(deleteSeats);
                                dbSeq.SubmitChanges();
                            }

                            var scheduleHist = new SequencingStationScheduleHistory
                            {
                                EmployeeId = employeeId,
                                EmployeeName = employee == null ? "Unknown Employee" : employee.Name.Trim(),
                                ScheduleNum = schedule.ScheduleStatus.CurrentScheduleNumber,
                                SequencingLocationId = id,
                                DateCompleted = DateTime.Now,
                            };
                            dbSeq.SequencingStationScheduleHistories.InsertOnSubmit(scheduleHist);

                            var nextjob = lineBuffer.Where(i => i.OrderId > lastjob.OrderId).OrderBy(s => s.OrderId).FirstOrDefault();
                            statusLookup.NextBoxNum = schedule.ScheduleStatus.CurrentBoxNumber + 1;
                            statusLookup.NextOrderId = nextjob == null ? statusLookup.NextOrderId + 1 : nextjob.OrderId;
                            statusLookup.NextScheduleNum = schedule.ScheduleStatus.CurrentScheduleNumber + 1;
                            
                            dbSeq.SubmitChanges();

                            //if (id == 7) //first row complete schedule
                            //{
                            //    CompleteTrimSchedule(schedule, 8, employeeId);
                            //}
                        }
                    }
                }
            }
        }
        public PlasticSeqSchedule GetPlasticSeqScheduleHistoryDetail(SequencingStation station, int scheduleNum)
        {
            #region Get Plastic Seq Schedule History Detail
            PartSequencingDataContext dbSeq = new PartSequencingDataContext();
            SequencingFactory factory = new SequencingFactory();
            PlasticSeqSchedule plasticHistorySchedule = new PlasticSeqSchedule();
            var seqMessageProcessor = new SeqMessageProcessor();

            var tokens = MessageTokensCacheManager.MessageTokens.Where(t => t.LineId == station.Line.Id || t.LineId == 4).ToList();

            var boxHistory = (from h in dbSeq.IWS_GetSequencingDetailHistoryBySeqSettingsIdAndScheduleNum(station.Id, scheduleNum)
                              group h by new
                              {
                                  h.ScheduleNum,
                                  h.BoxNum
                              } into grp
                              select new ScheduleBox
                              {
                                  BoxNum = grp.Key.BoxNum,
                                  Items = (from s in grp.ToList()
                                           select new ScheduleItem
                                           {
                                               Message = seqMessageProcessor.GetSequencingMessage(station, s.ItemNumber.Trim(), tokens),
                                               Position = (int)s.Position
                                           }).ToList(),
                              }).ToList();

            plasticHistorySchedule = new PlasticSeqSchedule
            {
                SequencingStation = station,
                Boxes = boxHistory,
                Status = true,
            };

            return plasticHistorySchedule;
            #endregion
        }