private void TrViewSeasonal_AfterSelect(object sender, TreeViewEventArgs e)
        {
            try
            {
                var    selectNode    = e.Node;
                string selectKeyNode = selectNode.Name;
                var    listInOut     = inoutDatasAfterConvert.Where(d => d.Dept == selectKeyNode).ToList();
                var    listEmp       = listInOut.Select(d => d.EmpCode).Distinct().ToList();
                List <InOutDataMonth> listInoutMonth = new List <InOutDataMonth>();
                keyValuePairs = new Dictionary <string, MonthInOut>();
                for (int i = 0; i < listEmp.Count; i++)
                {
                    var listInoutByemp = listInOut.Where(d => d.EmpCode == listEmp[i]).ToList();
                    GetMonthInoutSeasonalEmp getInoutDataFrom = new GetMonthInoutSeasonalEmp();

                    Model.MonthInOut monthInOut = getInoutDataFrom.GetMonthInOutFromInoutdata(listInoutByemp);

                    var name = listInOut.Where(d => d.EmpCode == listEmp[i]).Select(d => d.Name).Distinct().ToList();
                    monthInOut.EmpCode = listEmp[i];
                    monthInOut.Name    = name[0];
                    monthInOut.dept    = selectKeyNode;
                    keyValuePairs.Add(listEmp[i], monthInOut);
                    InOutDataMonth inOutData = ConvertInOutDataMonthFromMonthInout(listEmp[i], name[0], monthInOut);


                    listInoutMonth.Add(inOutData);
                }

                dtgv_WorkingTime.DataSource = listInoutMonth;
            }
            catch (Exception ex)
            {
                SystemLog.Output(SystemLog.MSG_TYPE.Err, "TrViewSeasonal_AfterSelect(object sender, TreeViewEventArgs e)", ex.Message);
            }
        }
        public Dictionary <string, Model.MonthInOut> GetKeyValuePairsInOut(List <SeasonalEmployee> seasonalEmployees, DateTime from, DateTime to)
        {
            Dictionary <string, Model.MonthInOut> keyValuePairs = new Dictionary <string, Model.MonthInOut>();
            GetInoutDataFromEmployee getInoutDataFrom           = new GetInoutDataFromEmployee();

            List <Model.InoutData> InoutDatas = null;

            try
            {
                foreach (var item in seasonalEmployees)
                {
                    InoutDatas = getInoutDataFrom.GetInoutDatasFromEmpFinger(item.FingerCode, from, to);
                    Model.MonthInOut monthInOut = GetMonthInOutFromInoutdata(InoutDatas);
                    keyValuePairs.Add(item.FingerCode, monthInOut);
                }
            }
            catch (Exception ex)
            {
                throw;
            }
            return(keyValuePairs);
        }
        private InOutDataMonth ConvertInOutDataMonthFromMonthInout(string empCode, string name, Model.MonthInOut monthInOut)
        {
            InOutDataMonth inOutData = new InOutDataMonth();

            try
            {
                inOutData.EmpFinger = empCode;
                inOutData.Dept      = name;

                for (int k = 0; k < 31; k++)
                {
                    if (monthInOut.InData[k] != null)
                    {
                        if (k == 0)
                        {
                            inOutData.Day1  = monthInOut.InData[k] + Environment.NewLine;
                            inOutData.Day1 += monthInOut.OutData[k] + Environment.NewLine;
                            inOutData.Day1 += monthInOut.WorkingTime[k] + Environment.NewLine;
                        }
                        else if (k == 1)
                        {
                            inOutData.Day2 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 2)
                        {
                            inOutData.Day3 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 3)
                        {
                            inOutData.Day4 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 4)
                        {
                            inOutData.Day5 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 5)
                        {
                            inOutData.Day6 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 6)
                        {
                            inOutData.Day7 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 7)
                        {
                            inOutData.Day8 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 8)
                        {
                            inOutData.Day9 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 9)
                        {
                            inOutData.Day10 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 10)
                        {
                            inOutData.Day11 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 11)
                        {
                            inOutData.Day12 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 12)
                        {
                            inOutData.Day13 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 13)
                        {
                            inOutData.Day14 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 14)
                        {
                            inOutData.Day15 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 15)
                        {
                            inOutData.Day16 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 16)
                        {
                            inOutData.Day17 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 17)
                        {
                            inOutData.Day18 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 18)
                        {
                            inOutData.Day19 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 19)
                        {
                            inOutData.Day20 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 20)
                        {
                            inOutData.Day21 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 21)
                        {
                            inOutData.Day22 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 22)
                        {
                            inOutData.Day23 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 23)
                        {
                            inOutData.Day24 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 24)
                        {
                            inOutData.Day25 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 25)
                        {
                            inOutData.Day26 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 26)
                        {
                            inOutData.Day27 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 27)
                        {
                            inOutData.Day28 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 28)
                        {
                            inOutData.Day29 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 29)
                        {
                            inOutData.Day30 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                        else if (k == 30)
                        {
                            inOutData.Day31 = monthInOut.InData[k] + Environment.NewLine + monthInOut.OutData[k] + Environment.NewLine + monthInOut.WorkingTime[k] + Environment.NewLine + monthInOut.Shift[k];
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                SystemLog.Output(SystemLog.MSG_TYPE.Err, "ConvertInOutDataMonthFromMonthInout(string empCode,string name, Model.MonthInOut monthInOut)", ex.Message);
            }
            return(inOutData);
        }
        public Model.MonthInOut GetMonthInOutFromInoutdata(List <Model.InoutData> inoutDatas)
        {
            Model.MonthInOut monthInOut = new Model.MonthInOut();
            try
            {
                monthInOut.InData          = new string[31];
                monthInOut.OutData         = new string[31];
                monthInOut.WorkingTime     = new double[31];
                monthInOut.InOutEvaluation = new string[31];
                monthInOut.Shift           = new string[31];

                for (int i = 0; i < inoutDatas.Count; i++)
                {
                    if (inoutDatas[i].Shift == "Night")
                    {
                        var TimeIn = TimeSpan.ParseExact(inoutDatas[i].Time, "h\\:mm", CultureInfo.CurrentCulture);

                        //   if ( inoutDatas[i].FDateTime.Day+1 == inoutDatas[i+1].FDateTime.Day)
                        //   {
                        //       var TimeOut = TimeSpan.ParseExact(inoutDatas[i+1].Time, "h\\:mm", CultureInfo.CurrentCulture);
                        //       int day = inoutDatas[i].FDateTime.Day-1;
                        //       monthInOut.InData[day] = inoutDatas[i].Time;
                        //       monthInOut.OutData[day] = "T"+inoutDatas[i+1].Time;
                        //       monthInOut.WorkingTime[day] = 11;
                        //       monthInOut.InOutEvaluation[day] = "Night-12";
                        //   }
                        //else   if (inoutDatas[i + 1].InOut == "Out-Night8" && inoutDatas[i].FDateTime.Day + 1 == inoutDatas[i + 1].FDateTime.Day)
                        //   {
                        //       var TimeOut = TimeSpan.ParseExact(inoutDatas[i + 1].Time, "h\\:mm", CultureInfo.CurrentCulture);
                        //       int day = inoutDatas[i].FDateTime.Day - 1;
                        //       monthInOut.InData[day] = inoutDatas[i].Time;
                        //       monthInOut.OutData[day] = "T" + inoutDatas[i + 1].Time;
                        //       monthInOut.WorkingTime[day] = 8;
                        //       monthInOut.InOutEvaluation[day] = "Night-8";
                        //   }

                        if (inoutDatas[i].FDateTime.Day + 1 == inoutDatas[i + 1].FDateTime.Day)
                        {
                            var TimeOut = TimeSpan.ParseExact(inoutDatas[i + 1].Time, "h\\:mm", CultureInfo.CurrentCulture);
                            int day     = inoutDatas[i].FDateTime.Day;
                            monthInOut.Shift[day - 1]   = inoutDatas[i].Shift;
                            monthInOut.InData[day - 1]  = inoutDatas[i].Time;
                            monthInOut.OutData[day - 1] = "T" + inoutDatas[i + 1].Time;

                            if (TimeOut >= new TimeSpan(1, 0, 0))
                            {
                                var TimeConvert = ((TimeOut - new TimeSpan(20, 0, 0)).Add(new TimeSpan(24, 0, 0)).RoundDown(TimeSpan.FromMinutes(30)));

                                monthInOut.WorkingTime[day - 1] = Math.Round(TimeConvert.TotalHours - 1, 1);
                            }
                            else
                            {
                                var TimeConvert = ((TimeOut - new TimeSpan(20, 0, 0).Add(new TimeSpan(24, 0, 0)).RoundDown(TimeSpan.FromMinutes(30))));

                                monthInOut.WorkingTime[day - 1] = Math.Round(TimeConvert.TotalHours, 1);
                            }
                            monthInOut.InOutEvaluation[day - 1] = "Night-Undefined";
                        }
                    }
                    else if (inoutDatas[i].Shift == "Day")
                    {
                        var TimeIn = TimeSpan.ParseExact(inoutDatas[i].Time, "h\\:mm", CultureInfo.CurrentCulture);
                        // if (inoutDatas[i + 1].InOut == "Out-Day" && inoutDatas[i].FDateTime.Day == inoutDatas[i + 1].FDateTime.Day)
                        // {
                        //     var TimeOut = TimeSpan.ParseExact(inoutDatas[i + 1].Time, "h\\:mm", CultureInfo.CurrentCulture);
                        //     int day = inoutDatas[i].FDateTime.Day-1;
                        //     monthInOut.InData[day] = inoutDatas[i].Time;
                        //     monthInOut.OutData[day] =  inoutDatas[i + 1].Time;
                        //     monthInOut.WorkingTime[day] = 11;
                        //     monthInOut.InOutEvaluation[day] = "Day-12";

                        // }
                        //else if (inoutDatas[i + 1].InOut == "Out-Day8" && inoutDatas[i].FDateTime.Day == inoutDatas[i + 1].FDateTime.Day)
                        // {
                        //     var TimeOut = TimeSpan.ParseExact(inoutDatas[i + 1].Time, "h\\:mm", CultureInfo.CurrentCulture);
                        //     int day = inoutDatas[i].FDateTime.Day - 1;
                        //     monthInOut.InData[day] = inoutDatas[i].Time;
                        //     monthInOut.OutData[day] = inoutDatas[i + 1].Time;
                        //     monthInOut.WorkingTime[day] = 8;
                        //     monthInOut.InOutEvaluation[day] = "Day-8";
                        // }
                        if (inoutDatas[i].FDateTime.Day == inoutDatas[i + 1].FDateTime.Day && (inoutDatas[i + 1].FDateTime - inoutDatas[i].FDateTime) > new TimeSpan(2, 0, 0))
                        {
                            var TimeOut = TimeSpan.ParseExact(inoutDatas[i + 1].Time, "h\\:mm", CultureInfo.CurrentCulture);
                            int day     = inoutDatas[i].FDateTime.Day;
                            monthInOut.InData[day - 1]  = inoutDatas[i].Time;
                            monthInOut.OutData[day - 1] = inoutDatas[i + 1].Time;
                            monthInOut.Shift[day - 1]   = inoutDatas[i].Shift;
                            if (TimeOut >= new TimeSpan(13, 0, 0))
                            {
                                var TimeConvert = (TimeOut - new TimeSpan(8, 0, 0)).RoundDown(TimeSpan.FromMinutes(30));
                                monthInOut.WorkingTime[day - 1] = Math.Round(TimeConvert.TotalHours - 1, 1);
                            }
                            else
                            {
                                var TimeConvert = (TimeOut - new TimeSpan(8, 0, 0)).RoundDown(TimeSpan.FromMinutes(30));
                                monthInOut.WorkingTime[day - 1] = Math.Round(TimeConvert.TotalHours, 1);
                            }

                            monthInOut.InOutEvaluation[day - 1] = "Day-Undefined";
                        }
                    }
                    else
                    {
                        int day = inoutDatas[i].FDateTime.Day;
                        monthInOut.Shift[day - 1] = inoutDatas[i].Shift;
                    }
                    //else if(inoutDatas[i].InOut == "Undefined")
                    //{
                    //    int day = inoutDatas[i].FDateTime.Day;
                    //    monthInOut.InData[day] = inoutDatas[i].Date + " "+ inoutDatas[i].Time;
                    //    monthInOut.WorkingTime[day] = 0;
                    //    monthInOut.InOutEvaluation[day] = "Undefined";
                    //}
                }
            }
            catch (Exception ex)
            {
                SystemLog.Output(SystemLog.MSG_TYPE.Err, "GetMonthInOutFromInoutdata(List<Model.InoutData> inoutDatas)", ex.Message);
            }
            return(monthInOut);
        }
        public Dictionary <string, Model.MonthInOut> GetKeyValuePairsInOut(List <Model.InoutData> inoutDatas, string YearMonth)
        {
            Dictionary <string, Model.MonthInOut> keyValuePairs = new Dictionary <string, Model.MonthInOut>();

            try
            {
                var listCode = inoutDatas.Select(d => d.EmpCode).Distinct().ToList();
                foreach (var code in listCode)
                {
                    Model.MonthInOut monthInOut = new Model.MonthInOut();
                    monthInOut.EmpCode         = code;
                    monthInOut.InData          = new string[31];
                    monthInOut.OutData         = new string[31];
                    monthInOut.WorkingTime     = new double[31];
                    monthInOut.InOutEvaluation = new string[31];
                    for (int i = 1; i <= 31; i++)
                    {
                        if (i <= 29)
                        {
                            DateTime DateTime = new DateTime(2020, 2, i);
                            var      rows     = inoutDatas.Where(d => d.EmpCode == code && d.Date == DateTime.Date.ToString("dd/MM/yyyy")).ToList();
                            if (rows.Count > 0)
                            {
                                var MaxInTime = rows.Where(d => d.InOut == "In-Time").ToList();
                                if (MaxInTime.Count > 0)
                                {
                                    monthInOut.InData[i - 1] = MaxInTime.Min(d => d.Time);
                                    var Timespan = TimeSpan.ParseExact(monthInOut.InData[i - 1], "h\\:mm", CultureInfo.CurrentCulture);
                                    //if (Timespan > new TimeSpan(8, 0, 0))
                                    //    monthInOut.InOutEvaluation[i - 1] = "In Late ";
                                }
                                else
                                {
                                    monthInOut.InData[i - 1] = "";
                                }
                                var MaxOutTime = rows.Where(d => d.InOut == "Out-Time").ToList();
                                if (MaxOutTime.Count > 0)

                                {
                                    monthInOut.OutData[i - 1] = MaxOutTime.Max(d => d.Time);
                                    var Timespan = TimeSpan.ParseExact(monthInOut.OutData[i - 1], "h\\:mm", CultureInfo.CurrentCulture);
                                    //if (Timespan < new TimeSpan(17, 0, 0))
                                    //    monthInOut.InOutEvaluation[i - 1] += "Out Early ";
                                }
                                else
                                {
                                    monthInOut.OutData[i - 1] = "";
                                }
                            }
                            string GanCong = GanCongMa(code, YearMonth, i);
                            monthInOut.WorkingTime[i - 1] = WorkingTimeCalculate(monthInOut.InData[i - 1], monthInOut.OutData[i - 1], DateTime, GanCong, out monthInOut.InOutEvaluation[i - 1]);
                        }
                        else
                        {
                            monthInOut.InData[i - 1]          = "";
                            monthInOut.OutData[i - 1]         = "";
                            monthInOut.InOutEvaluation[i - 1] = " ";
                        }
                    }
                    keyValuePairs.Add(code, monthInOut);
                }
            }
            catch (Exception ex)
            {
                throw;
            }
            return(keyValuePairs);
        }