public async Task <IActionResult> CloaseCuttingPlanNotFinish([FromBody] CuttingPlanViewModel cuttingPlan)
        {
            var Message = "Not been found data.";

            try
            {
                if (cuttingPlan != null)
                {
                    var ExcludeId = await this.repositoryTask.GetToListAsync(x => x.JobCardDetailId,
                                                                             x => x.JobCardDetail.CuttingPlanId == cuttingPlan.CuttingPlanId);

                    var jobDetails = await this.repositoryJobCardD.GetToListAsync(x => x,
                                                                                  x => x.CuttingPlanId == cuttingPlan.CuttingPlanId &&
                                                                                  x.JobCardDetailStatus == JobCardDetailStatus.Wait &&
                                                                                  x.JobCardMaster.JobCardMasterStatus != JobCardMasterStatus.Cancel &&
                                                                                  x.JobCardMaster.JobCardMasterStatus != JobCardMasterStatus.Complete &&
                                                                                  !ExcludeId.Contains(x.JobCardDetailId));

                    if (jobDetails.Any())
                    {
                        foreach (var item in jobDetails)
                        {
                            item.JobCardDetailStatus = JobCardDetailStatus.Cancel;
                            item.ModifyDate          = DateTime.Now;
                            item.Modifyer            = cuttingPlan.Creator;
                            //update jobcard detail
                            await this.repositoryJobCardD.UpdateAsync(item, item.JobCardDetailId);

                            if (item.JobCardMasterId != null)
                            {
                                var jobCardM = await this.repositoryJobCardM.GetFirstOrDefaultAsync(x => x,
                                                                                                    x => x.JobCardMasterId == item.JobCardMasterId, null, x => x.Include(z => z.JobCardDetails));

                                if (jobCardM != null)
                                {
                                    jobCardM.JobCardMasterStatus = jobCardM.JobCardDetails.Any(z => z.JobCardDetailStatus == JobCardDetailStatus.Wait)
                                                                    ? JobCardMasterStatus.InProcess : JobCardMasterStatus.Complete;

                                    jobCardM.ModifyDate = DateTime.Now;
                                    jobCardM.Modifyer   = cuttingPlan.Creator;
                                    await this.repositoryJobCardM.UpdateAsync(jobCardM, jobCardM.JobCardMasterId);
                                }
                            }
                        }

                        return(new JsonResult(new { Result = true }, this.DefaultJsonSettings));
                    }
                    return(NoContent());
                }
            }
            catch (Exception ex)
            {
                Message = $"Has error {ex.ToString()}";
            }

            return(BadRequest(new { Error = Message }));
        }
        public async Task <IActionResult> CuttingPlanNotFinish([FromBody] ScrollViewModel Scroll)
        {
            var Message = "";

            try
            {
                if (Scroll == null)
                {
                    return(BadRequest());
                }

                int TotalRow;
                var predicate = PredicateBuilder.False <CuttingPlan>();
                // Filter
                var filters = string.IsNullOrEmpty(Scroll.Filter) ? new string[] { "" }
                                    : Scroll.Filter.Split(null);
                foreach (string temp in filters)
                {
                    string keyword = temp;
                    predicate = predicate.Or(x => x.Description.ToLower().Contains(keyword) ||
                                             x.CuttingPlanNo.ToLower().Contains(keyword) ||
                                             x.MaterialSize.ToLower().Contains(keyword) ||
                                             x.ProjectCodeDetail.ProjectCodeDetailCode.ToLower().Contains(keyword) ||
                                             x.ProjectCodeDetail.ProjectCodeMaster.ProjectCode.ToLower().Contains(keyword));
                }

                predicate = predicate.And(x =>
                                          x.JobCardDetails.Any(z => z.JobCardDetailStatus == JobCardDetailStatus.Wait &&
                                                               z.JobCardMaster.JobCardMasterStatus != JobCardMasterStatus.Complete &&
                                                               z.JobCardMaster.JobCardMasterStatus != JobCardMasterStatus.Cancel) &&
                                          x.TypeCuttingPlan == TypeCuttingPlan.CuttingPlan);

                // Option ProjectDetailId
                if (Scroll.WhereId.HasValue)
                {
                    predicate = predicate.And(x => x.ProjectCodeDetail.ProjectCodeDetailId == Scroll.WhereId);
                }

                // Option SDate
                if (Scroll.SDate.HasValue)
                {
                    Scroll.SDate = Scroll.SDate.Value.AddHours(7);
                    predicate    = predicate.And(x =>
                                                 x.CreateDate.Value.Date >= Scroll.SDate.Value.Date);
                }

                // Option EDate
                if (Scroll.EDate.HasValue)
                {
                    Scroll.EDate = Scroll.EDate.Value.AddHours(7);
                    predicate    = predicate.And(x =>
                                                 x.CreateDate.Value.Date <= Scroll.EDate.Value.Date);
                }

                TotalRow = await this.repository.GetLengthWithAsync(predicate);

                var HasData = await this.repository.GetToListAsync(
                    x => x, predicate,
                    x => x.OrderBy(z => z.CreateDate),
                    x => x.Include(z => z.ProjectCodeDetail.ProjectCodeMaster),
                    Scroll.Skip ?? 0, Scroll.Take ?? 10);

                if (HasData.Any())
                {
                    List <string> Columns = new List <string>();
                    // PlanDate
                    List <DateTime?> ListDate = new List <DateTime?>()
                    {
                        //START Date
                        HasData.Min(x => x.CreateDate),
                        //END Date
                        HasData.Max(x => x.CreateDate),
                    };

                    DateTime?MinDate = ListDate.Min();
                    DateTime?MaxDate = ListDate.Max();

                    if (MinDate == null && MaxDate == null)
                    {
                        return(BadRequest(new { Error = Message }));
                    }

                    // EachDay
                    var EachDate = new Helper.LoopEachDate();

                    foreach (DateTime day in EachDate.EachDate(MinDate.Value, MaxDate.Value.AddDays(1)).OrderByDescending(x => x.Value))
                    {
                        if (HasData.Any(x => x.CreateDate.Value.Date == day.Date))
                        {
                            Columns.Add(day.Date.ToString("dd/MM/yy"));
                        }
                    }

                    var DataTable = new List <IDictionary <string, object> >();

                    foreach (var Data in HasData.OrderBy(x => x.CreateDate))
                    {
                        var JobNumber = $"{Data?.ProjectCodeDetail?.ProjectCodeMaster?.ProjectCode ?? "No-Data"}" +
                                        $"/{(Data?.ProjectCodeDetail == null ? "No-Data" : Data.ProjectCodeDetail.ProjectCodeDetailCode)}";

                        IDictionary <string, object> rowData;
                        bool update = false;
                        if (DataTable.Any(x => (string)x["JobNumber"] == JobNumber))
                        {
                            var FirstData = DataTable.FirstOrDefault(x => (string)x["JobNumber"] == JobNumber);
                            if (FirstData != null)
                            {
                                rowData = FirstData;
                                update  = true;
                            }
                            else
                            {
                                rowData = new ExpandoObject();
                            }
                        }
                        else
                        {
                            rowData = new ExpandoObject();
                        }

                        if (Data.CreateDate != null)
                        {
                            //Get Employee Name

                            var Key = Data.CreateDate.Value.ToString("dd/MM/yy");
                            // New Data
                            var Master = new CuttingPlanViewModel()
                            {
                                CuttingPlanId = Data.CuttingPlanId,
                                // RequireString = $"{EmployeeReq} | No.{Data.RequireNo}",
                                CuttingPlanNo = Data.CuttingPlanNo,
                            };

                            if (rowData.Any(x => x.Key == Key))
                            {
                                // New Value
                                var ListMaster = (List <CuttingPlanViewModel>)rowData[Key];
                                ListMaster.Add(Master);
                                // add to row data
                                rowData[Key] = ListMaster;
                            }
                            else // add new
                            {
                                rowData.Add(Key, new List <CuttingPlanViewModel>()
                                {
                                    Master
                                });
                            }
                        }

                        if (!update)
                        {
                            rowData.Add("JobNumber", JobNumber);
                            DataTable.Add(rowData);
                        }
                    }

                    return(new JsonResult(new
                    {
                        TotalRow,
                        Columns,
                        DataTable
                    }, this.DefaultJsonSettings));
                }
                else
                {
                    return(NoContent());
                }
            }
            catch (Exception ex)
            {
                Message = $"Has error {ex.ToString()}";
            }

            return(BadRequest(new { Error = Message }));
        }