public void CreateAttendance(DateTime dateTime)
        {
            using (var ctx = new TAS2013Entities())
            {
                List<Emp> _emp = new List<Emp>();
                _emp = ctx.Emps.Where(aa => aa.Status == true).ToList();
                List<Roster> _Roster = new List<Roster>();
                _Roster = context.Rosters.Where(aa => aa.RosterDate == dateTime).ToList();
                List<RosterDetail> _NewRoster = new List<RosterDetail>();
                _NewRoster = context.RosterDetails.Where(aa => aa.RosterDate == dateTime).ToList();
                List<LvData> _LvData = new List<LvData>();
                _LvData = context.LvDatas.Where(aa => aa.AttDate == dateTime).ToList();
                List<LvShort> _lvShort = new List<LvShort>();
                _lvShort = context.LvShorts.Where(aa => aa.DutyDate == dateTime).ToList();
                List<AttData> _AttData = context.AttDatas.Where(aa => aa.AttDate == dateTime).ToList();
                _myHelperClass.WriteToLogFile("**********************Attendance Creating Started: Total Employees are:" + _emp.Count + "*********************");
                foreach (var emp in _emp)
                {
                    string empDate = emp.EmpID + dateTime.ToString("yyMMdd");
                    if (_AttData.Where(aa => aa.EmpDate == empDate).Count() == 0)
                    {
                        try
                        {
                            /////////////////////////////////////////////////////
                            //  Mark Everyone Absent while creating Attendance //
                            /////////////////////////////////////////////////////
                            //Set DUTYCODE = D, StatusAB = true, and Remarks = [Absent]
                            AttData att = new AttData();
                            att.AttDate = dateTime.Date;
                            att.DutyCode = "D";
                            att.StatusAB = true;
                            att.Remarks = "[Absent]";
                            if (emp.Shift != null)
                                att.DutyTime = emp.Shift.StartTime;
                            else
                                att.DutyTime = new TimeSpan(07, 45, 00);
                            att.EmpID = emp.EmpID;
                            att.EmpNo = emp.EmpNo;
                            att.EmpDate = emp.EmpID + dateTime.ToString("yyMMdd");
                            att.ShifMin = CalculateShiftMinutes(emp.Shift, dateTime.DayOfWeek);
                            //////////////////////////
                            //  Check for Rest Day //
                            ////////////////////////
                            //Set DutyCode = R, StatusAB=false, StatusDO = true, and Remarks=[DO]
                            //Check for 1st Day Off of Shift
                            if (emp.Shift.DaysName.Name == ReturnDayOfWeek(dateTime.DayOfWeek))
                            {
                                att.DutyCode = "R";
                                att.StatusAB = false;
                                att.StatusDO = true;
                                att.Remarks = "[DO]";
                            }
                            //Check for 2nd Day Off of shift
                            if (emp.Shift.DaysName1.Name == ReturnDayOfWeek(dateTime.DayOfWeek))
                            {
                                att.DutyCode = "R";
                                att.StatusAB = false;
                                att.StatusDO = true;
                                att.Remarks = "[DO]";
                            }

                            //////////////////////////
                            //  Check for GZ Day //
                            ////////////////////////
                            //Set DutyCode = R, StatusAB=false, StatusGZ = true, and Remarks=[GZ]
                            if (emp.Shift.GZDays == true)
                            {
                                foreach (var holiday in context.Holidays)
                                {
                                    if (context.Holidays.Where(hol => hol.HolDate.Month == att.AttDate.Value.Month && hol.HolDate.Day == att.AttDate.Value.Day).Count() > 0)
                                    {
                                        att.DutyCode = "G";
                                        att.StatusAB = false;
                                        att.StatusGZ = true;
                                        att.Remarks = "[GZ]";
                                        att.ShifMin = 0;
                                    }
                                }
                            }

                            //////////////////////////
                            //  Check for Roster   //
                            ////////////////////////
                            //If Roster DutyCode is Rest then change the StatusAB and StatusDO
                            foreach (var roster in _Roster.Where(aa => aa.EmpDate == att.EmpDate))
                            {
                                att.DutyCode = roster.DutyCode.Trim();
                                if (att.DutyCode == "R")
                                {
                                    att.StatusAB = false;
                                    att.StatusDO = true;
                                    att.DutyCode = "R";
                                    att.Remarks = "[DO]";
                                }
                                att.ShifMin = roster.WorkMin;
                                att.DutyTime = roster.DutyTime;
                            }

                            ////New Roster
                            string empCdate = "Emp" + emp.EmpID.ToString() + dateTime.ToString("yyMMdd");
                            string sectionCdate = "Section" + emp.SecID.ToString() + dateTime.ToString("yyMMdd");
                            string crewCdate = "Crew" + emp.CrewID.ToString() + dateTime.ToString("yyMMdd");
                            string shiftCdate = "Shift" + emp.ShiftID.ToString() + dateTime.ToString("yyMMdd");
                            if (_NewRoster.Where(aa => aa.CriteriaValueDate == empCdate).Count() > 0)
                            {
                                var roster = _NewRoster.FirstOrDefault(aa => aa.CriteriaValueDate == empCdate);
                                if (roster.WorkMin == 0)
                                {
                                    att.StatusAB = false;
                                    att.StatusDO = true;
                                    att.Remarks = "[DO]";
                                    att.DutyCode = "R";
                                    att.ShifMin = 0;
                                }
                                else
                                {
                                    att.ShifMin = roster.WorkMin;
                                    att.DutyCode = "D";
                                    att.DutyTime = roster.DutyTime;
                                }
                            }
                            else if (_NewRoster.Where(aa => aa.CriteriaValueDate == sectionCdate).Count() > 0)
                            {
                                var roster = _NewRoster.FirstOrDefault(aa => aa.CriteriaValueDate == sectionCdate);
                                if (roster.WorkMin == 0)
                                {
                                    att.StatusAB = false;
                                    att.StatusDO = true;
                                    att.Remarks = "[DO]";
                                    att.DutyCode = "R";
                                    att.ShifMin = 0;
                                }
                                else
                                {
                                    att.ShifMin = roster.WorkMin;
                                    att.DutyCode = "D";
                                    att.DutyTime = roster.DutyTime;
                                }
                            }
                            else if (_NewRoster.Where(aa => aa.CriteriaValueDate == crewCdate).Count() > 0)
                            {
                                var roster = _NewRoster.FirstOrDefault(aa => aa.CriteriaValueDate == crewCdate);
                                if (roster.WorkMin == 0)
                                {
                                    att.StatusAB = false;
                                    att.StatusDO = true;
                                    att.Remarks = "[DO]";
                                    att.DutyCode = "R";
                                    att.ShifMin = 0;
                                }
                                else
                                {
                                    att.ShifMin = roster.WorkMin;
                                    att.DutyCode = "D";
                                    att.DutyTime = roster.DutyTime;
                                }
                            }
                            else if (_NewRoster.Where(aa => aa.CriteriaValueDate == shiftCdate).Count() > 0)
                            {
                                var roster = _NewRoster.FirstOrDefault(aa => aa.CriteriaValueDate == shiftCdate);
                                if (roster.WorkMin == 0)
                                {
                                    att.StatusAB = false;
                                    att.StatusDO = true;
                                    att.Remarks = "[DO]";
                                    att.DutyCode = "R";
                                    att.ShifMin = 0;
                                }
                                else
                                {
                                    att.ShifMin = roster.WorkMin;
                                    att.DutyCode = "D";
                                    att.DutyTime = roster.DutyTime;
                                }
                            }
                            ////////////////////////////
                            //TODO Check for Job Card//
                            //////////////////////////

                            ////////////////////////////
                            //  Check for Short Leave//
                            //////////////////////////
                            foreach (var sLeave in _lvShort.Where(aa => aa.EmpDate == att.EmpDate))
                            {
                                if (_lvShort.Where(lv => lv.EmpDate == att.EmpDate).Count() > 0)
                                {
                                    att.StatusSL = true;
                                    att.StatusAB = null;
                                    att.DutyCode = "L";
                                    att.Remarks = "[Short Leave]";
                                }
                            }

                            //////////////////////////
                            //   Check for Leave   //
                            ////////////////////////
                            //Set DutyCode = R, StatusAB=false, StatusGZ = true, and Remarks=[GZ]
                            foreach (var Leave in _LvData)
                            {
                                var _Leave = _LvData.Where(lv => lv.EmpDate == att.EmpDate && lv.HalfLeave != true);
                                if (_Leave.Count() > 0)
                                {
                                    att.StatusLeave = true;
                                    att.StatusAB = false;
                                    att.DutyCode = "L";
                                    att.StatusDO = false;
                                    if (Leave.LvCode == "A")
                                        att.Remarks = "[Casual Leave]";
                                    else if (Leave.LvCode == "B")
                                        att.Remarks = "[Annual Leave]";
                                    else if (Leave.LvCode == "C")
                                        att.Remarks = "[Sick Leave]";
                                    else
                                        att.Remarks = "[" + _Leave.FirstOrDefault().LvType.LvDesc + "]";
                                }
                                else
                                {
                                    att.StatusLeave = false;
                                }
                            }

                            /////////////////////////
                            //Check for Half Leave///
                            ////////////////////////
                            var _HalfLeave = _LvData.Where(lv => lv.EmpDate == att.EmpDate && lv.HalfLeave == true);
                            if (_HalfLeave.Count() > 0)
                            {
                                att.StatusLeave = true;
                                att.StatusAB = false;
                                att.DutyCode = "L";
                                att.StatusHL = true;
                                att.StatusDO = false;
                                if (_HalfLeave.FirstOrDefault().LvCode == "A")
                                    att.Remarks = "[H-CL]";
                                else if (_HalfLeave.FirstOrDefault().LvCode == "B")
                                    att.Remarks = "[S-AL]";
                                else if (_HalfLeave.FirstOrDefault().LvCode == "C")
                                    att.Remarks = "[H-SL]";
                                else
                                    att.Remarks = "[Half Leave]";
                            }
                            else
                            {
                                att.StatusLeave = false;
                            }
                            ctx.AttDatas.AddObject(att);
                            ctx.SaveChanges();
                        }
                        catch (Exception ex)
                        {
                            _myHelperClass.WriteToLogFile("-------Error In Creating Attendance of Employee: " + emp.EmpNo + " ------" + ex.InnerException.Message);
                        }
                    }
                }
                _myHelperClass.WriteToLogFile("****************Creating Attendance Completed*****************");
                AttProcess attp = new AttProcess();
                attp.ProcessDate = dateTime;
                ctx.AttProcesses.AddObject(attp);
                ctx.SaveChanges();
                ctx.Dispose();
            }
            // reprocess attendance from last 5 days
            CreateMissingAttendance ca = new CreateMissingAttendance();
            ca.CreatemissingAttendance(dateTime.AddDays(-7), dateTime);
            _myHelperClass.WriteToLogFile("Creating Attendance of Date: " + dateTime.ToString());
        }
        private void CalculateOpenShiftTimes(AttData attendanceRecord, Shift shift)
        {
            try
            {
                //Calculate WorkMin
                if (attendanceRecord != null)
                {
                    if (attendanceRecord.TimeOut != null && attendanceRecord.TimeIn != null)
                    {
                        attendanceRecord.Remarks = "";
                        TimeSpan mins = (TimeSpan)(attendanceRecord.TimeOut - attendanceRecord.TimeIn);
                        //Check if GZ holiday then place all WorkMin in GZOTMin
                        if (attendanceRecord.StatusGZ == true)
                        {
                            attendanceRecord.GZOTMin = (short)mins.TotalMinutes;
                            attendanceRecord.WorkMin = (short)mins.TotalMinutes;
                            attendanceRecord.StatusGZOT = true;
                            attendanceRecord.Remarks = attendanceRecord.Remarks + "[GZ-OT]";
                        }
                        else if (attendanceRecord.StatusDO == true)
                        {
                            attendanceRecord.OTMin = (short)mins.TotalMinutes;
                            attendanceRecord.WorkMin = (short)mins.TotalMinutes;
                            attendanceRecord.StatusOT = true;
                            attendanceRecord.Remarks = attendanceRecord.Remarks + "[R-OT]";
                            // RoundOff Overtime
                            //if ((employee.EmpType.CatID == 2 || employee.EmpType.CatID == 4) && employee.CompanyID == 1)
                            //{
                            //    if (attendanceRecord.OTMin > 0)
                            //    {
                            //        float OTmins = (float)attendanceRecord.OTMin;
                            //        float remainder = OTmins / 60;
                            //        int intpart = (int)remainder;
                            //        double fracpart = remainder - intpart;
                            //        if (fracpart < 0.5)
                            //        {
                            //            attendanceRecord.OTMin = (short)(intpart * 60);
                            //        }
                            //    }
                            //}
                        }
                        else
                        {
                            if (shift.HasBreak == true)
                            {
                                attendanceRecord.WorkMin = (short)(mins.TotalMinutes - shift.BreakMin);
                                attendanceRecord.ShifMin = (short)(CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) - (short)shift.BreakMin);
                            }
                            else
                            {
                                // CalculateShiftEndTime = ShiftStart + DutyHours
                                TimeSpan shiftEnd = CalculateShiftEndTime(shift, attendanceRecord.AttDate.Value.DayOfWeek);
                                attendanceRecord.WorkMin = (short)(mins.TotalMinutes);
                                //Calculate OverTIme,
                                if ((mins.TotalMinutes > (CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) + shift.OverTimeMin)) && employee.HasOT == true)
                                {
                                    attendanceRecord.OTMin = (Int16)(Convert.ToInt16(mins.TotalMinutes) - CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek));
                                    attendanceRecord.WorkMin = (short)((mins.TotalMinutes) - attendanceRecord.OTMin);
                                    attendanceRecord.StatusOT = true;
                                    attendanceRecord.Remarks = attendanceRecord.Remarks + "[N-OT]";
                                }
                                //Calculate Early Out
                                if (mins.TotalMinutes < (CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) - shift.EarlyOut))
                                {
                                    Int16 EarlyoutMin = (Int16)(CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) - Convert.ToInt16(mins.TotalMinutes));
                                    if (EarlyoutMin > shift.EarlyOut)
                                    {
                                        attendanceRecord.EarlyOut = EarlyoutMin;
                                        attendanceRecord.StatusEO = true;
                                        attendanceRecord.Remarks = attendanceRecord.Remarks + "[EO]";
                                    }
                                    else
                                    {
                                        attendanceRecord.StatusEO = null;
                                        attendanceRecord.EarlyOut = null;
                                        attendanceRecord.Remarks.Replace("[EO]", "");
                                    }
                                }
                                else
                                {
                                    attendanceRecord.StatusEO = null;
                                    attendanceRecord.EarlyOut = null;
                                    attendanceRecord.Remarks.Replace("[EO]", "");
                                }
                                // round off work mins if overtime less than shift.OverTimeMin >
                                if (attendanceRecord.WorkMin > CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) && (attendanceRecord.WorkMin <= (CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) + shift.OverTimeMin)))
                                {
                                    attendanceRecord.WorkMin = CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek);
                                }
                                //// RoundOff Overtime
                                //if ((employee.EmpType.CatID == 2 || employee.EmpType.CatID == 4) && employee.CompanyID == 1)
                                //{
                                //    if (attendanceRecord.OTMin > 0)
                                //    {
                                //        float OTmins = (float)attendanceRecord.OTMin;
                                //        float remainder = OTmins / 60;
                                //        int intpart = (int)remainder;
                                //        double fracpart = remainder - intpart;
                                //        if (fracpart < 0.5)
                                //        {
                                //            attendanceRecord.OTMin = (short)(intpart * 60);
                                //        }
                                //    }
                                //}
                                //Mark Absent if less than 4 hours
                                if (attendanceRecord.AttDate.Value.DayOfWeek != DayOfWeek.Friday && attendanceRecord.StatusDO != true && attendanceRecord.StatusGZ != true)
                                {
                                    short MinShiftMin = (short)shift.MinHrs;
                                    if (attendanceRecord.WorkMin < MinShiftMin)
                                    {
                                        attendanceRecord.StatusAB = true;
                                        attendanceRecord.StatusP = false;
                                        attendanceRecord.Remarks = attendanceRecord.Remarks + "[Absent]";
                                    }
                                    else
                                    {
                                        attendanceRecord.StatusAB = false;
                                        attendanceRecord.StatusP = true;
                                        attendanceRecord.Remarks.Replace("[Absent]", "");
                                    }

                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string _error = "";
                if (ex.InnerException.Message != null)
                    _error = ex.InnerException.Message;
                else
                    _error = ex.Message;
                _myHelperClass.WriteToLogFile("Attendance Processing at Calculating Times;  " + _error);
            }
            context.SaveChanges();
        }
        // Sorting Time In
        private void SortingInTime(AttData attendanceRecord)
        {
            List<DateTime> _InTimes = new List<DateTime>();

            if (attendanceRecord.Tin0 != null)
                _InTimes.Add((DateTime)attendanceRecord.Tin0);
            if (attendanceRecord.Tin1 != null)
                _InTimes.Add((DateTime)attendanceRecord.Tin1);
            if (attendanceRecord.Tin2 != null)
                _InTimes.Add((DateTime)attendanceRecord.Tin2);
            if (attendanceRecord.Tin3 != null)
                _InTimes.Add((DateTime)attendanceRecord.Tin3);
            if (attendanceRecord.Tin4 != null)
                _InTimes.Add((DateTime)attendanceRecord.Tin4);
            if (attendanceRecord.Tin5 != null)
                _InTimes.Add((DateTime)attendanceRecord.Tin5);
            if (attendanceRecord.Tin6 != null)
                _InTimes.Add((DateTime)attendanceRecord.Tin6);
            if (attendanceRecord.Tin7 != null)
                _InTimes.Add((DateTime)attendanceRecord.Tin7);
            if (attendanceRecord.Tin8 != null)
                _InTimes.Add((DateTime)attendanceRecord.Tin8);
            if (attendanceRecord.Tin9 != null)
                _InTimes.Add((DateTime)attendanceRecord.Tin9);
            if (attendanceRecord.Tin10 != null)
                _InTimes.Add((DateTime)attendanceRecord.Tin10);

            var list = _InTimes.OrderBy(x => x.TimeOfDay.Hours).ToList();
            PlacedSortedInTime(attendanceRecord, list);
        }
        //Sorting Time Out
        private void SortingOutTime(AttData attendanceRecord)
        {
            List<DateTime> _OutTimes = new List<DateTime>();

            if (attendanceRecord.Tout0 != null)
                _OutTimes.Add((DateTime)attendanceRecord.Tout0);
            if (attendanceRecord.Tout1 != null)
                _OutTimes.Add((DateTime)attendanceRecord.Tout1);
            if (attendanceRecord.Tout2 != null)
                _OutTimes.Add((DateTime)attendanceRecord.Tout2);
            if (attendanceRecord.Tout3 != null)
                _OutTimes.Add((DateTime)attendanceRecord.Tout3);
            if (attendanceRecord.Tout4 != null)
                _OutTimes.Add((DateTime)attendanceRecord.Tout4);
            if (attendanceRecord.Tout5 != null)
                _OutTimes.Add((DateTime)attendanceRecord.Tout5);
            if (attendanceRecord.Tout6 != null)
                _OutTimes.Add((DateTime)attendanceRecord.Tout6);
            if (attendanceRecord.Tout7 != null)
                _OutTimes.Add((DateTime)attendanceRecord.Tout7);
            if (attendanceRecord.Tout8 != null)
                _OutTimes.Add((DateTime)attendanceRecord.Tout8);
            if (attendanceRecord.Tout9 != null)
                _OutTimes.Add((DateTime)attendanceRecord.Tout9);
            if (attendanceRecord.Tout10 != null)
                _OutTimes.Add((DateTime)attendanceRecord.Tout10);

            var list = _OutTimes.OrderBy(x => x.TimeOfDay.Hours).ToList();
            PlacedSortedOutTime(attendanceRecord, list);
        }
 private void PlacedSortedInTime(AttData attendanceRecord, List<DateTime> _InTimes)
 {
     for (int i = 0; i < _InTimes.Count; i++)
     {
         switch (i)
         {
             case 0:
                 attendanceRecord.Tin0 = _InTimes[i];
                 attendanceRecord.TimeIn = _InTimes[i];
                 break;
             case 1:
                 attendanceRecord.Tin1 = _InTimes[i];
                 break;
             case 2:
                 attendanceRecord.Tin2 = _InTimes[i];
                 break;
             case 3:
                 attendanceRecord.Tin3 = _InTimes[i];
                 break;
             case 4:
                 attendanceRecord.Tin4 = _InTimes[i];
                 break;
             case 5:
                 attendanceRecord.Tin5 = _InTimes[i];
                 break;
             case 6:
                 attendanceRecord.Tin6 = _InTimes[i];
                 break;
             case 7:
                 attendanceRecord.Tin7 = _InTimes[i];
                 break;
             case 8:
                 attendanceRecord.Tin8 = _InTimes[i];
                 break;
             case 9:
                 attendanceRecord.Tin9 = _InTimes[i];
                 break;
         }
     }
 }
 private void PlacedSortedOutTime(AttData attendanceRecord, List<DateTime> _OutTimes)
 {
     for (int i = 0; i < _OutTimes.Count; i++)
     {
         switch (i)
         {
             case 0:
                 attendanceRecord.Tout0 = _OutTimes[i];
                 attendanceRecord.TimeOut = _OutTimes[i];
                 break;
             case 1:
                 attendanceRecord.Tout1 = _OutTimes[i];
                 attendanceRecord.TimeOut = _OutTimes[i];
                 break;
             case 2:
                 attendanceRecord.Tout2 = _OutTimes[i];
                 attendanceRecord.TimeOut = _OutTimes[i];
                 break;
             case 3:
                 attendanceRecord.Tout3 = _OutTimes[i];
                 attendanceRecord.TimeOut = _OutTimes[i];
                 break;
             case 4:
                 attendanceRecord.Tout4 = _OutTimes[i];
                 attendanceRecord.TimeOut = _OutTimes[i];
                 break;
             case 5:
                 attendanceRecord.Tout5 = _OutTimes[i];
                 attendanceRecord.TimeOut = _OutTimes[i];
                 break;
             case 6:
                 attendanceRecord.Tout6 = _OutTimes[i];
                 attendanceRecord.TimeOut = _OutTimes[i];
                 break;
             case 7:
                 attendanceRecord.Tout7 = _OutTimes[i];
                 attendanceRecord.TimeOut = _OutTimes[i];
                 break;
             case 8:
                 attendanceRecord.Tout8 = _OutTimes[i];
                 attendanceRecord.TimeOut = _OutTimes[i];
                 break;
             case 9:
                 attendanceRecord.Tout9 = _OutTimes[i];
                 attendanceRecord.TimeOut = _OutTimes[i];
                 break;
         }
     }
 }
        private void CalculateTimeINOUTOpenShift(AttData attendanceRecord, PollData up)
        {
            try
            {
                switch (up.RdrDuty)
                {
                    case 1: //IN
                        if (attendanceRecord.Tin0 == null)
                        {
                            if (up.EntTime.TimeOfDay < OpenShiftThresholdEnd)
                            {
                                DateTime dt = new DateTime();
                                dt = up.EntDate.Date.AddDays(-1);
                                var _attData = context.AttDatas.FirstOrDefault(aa => aa.AttDate == dt && aa.EmpID == up.EmpID);
                                if (_attData != null)
                                {

                                    if (_attData.TimeIn != null)
                                    {
                                        if (_attData.TimeIn.Value.TimeOfDay > OpenShiftThresholdStart)
                                        {
                                            //attdata - 1 . multipleTimeIn =  up.EntTime

                                        }
                                        else
                                        {
                                            attendanceRecord.Tin0 = up.EntTime;
                                            attendanceRecord.TimeIn = up.EntTime;
                                            attendanceRecord.StatusAB = false;
                                            attendanceRecord.StatusP = true;
                                            attendanceRecord.Remarks = null;
                                            attendanceRecord.StatusIN = true;
                                        }
                                    }
                                    else
                                    {
                                        attendanceRecord.Tin0 = up.EntTime;
                                        attendanceRecord.TimeIn = up.EntTime;
                                        attendanceRecord.StatusAB = false;
                                        attendanceRecord.StatusP = true;
                                        attendanceRecord.Remarks = null;
                                        attendanceRecord.StatusIN = true;
                                    }
                                }
                                else
                                {
                                    attendanceRecord.Tin0 = up.EntTime;
                                    attendanceRecord.TimeIn = up.EntTime;
                                    attendanceRecord.StatusAB = false;
                                    attendanceRecord.StatusP = true;
                                    attendanceRecord.Remarks = null;
                                    attendanceRecord.StatusIN = true;
                                }
                            }
                            else
                            {
                                attendanceRecord.Tin0 = up.EntTime;
                                attendanceRecord.TimeIn = up.EntTime;
                                attendanceRecord.StatusAB = false;
                                attendanceRecord.StatusP = true;
                                attendanceRecord.Remarks = null;
                                attendanceRecord.StatusIN = true;
                            }

                        }
                        else if (attendanceRecord.Tin1 == null)
                        {
                            attendanceRecord.Tin1 = up.EntTime;
                            SortingInTime(attendanceRecord);
                        }
                        else if (attendanceRecord.Tin2 == null)
                        {
                            attendanceRecord.Tin2 = up.EntTime;
                            SortingInTime(attendanceRecord);
                        }
                        else if (attendanceRecord.Tin3 == null)
                        {
                            attendanceRecord.Tin3 = up.EntTime;
                            SortingInTime(attendanceRecord);
                        }
                        else if (attendanceRecord.Tin4 == null)
                        {
                            attendanceRecord.Tin4 = up.EntTime;
                            SortingInTime(attendanceRecord);
                        }
                        else if (attendanceRecord.Tin5 == null)
                        {
                            attendanceRecord.Tin5 = up.EntTime;
                            SortingInTime(attendanceRecord);
                        }
                        else if (attendanceRecord.Tin6 == null)
                        {
                            attendanceRecord.Tin6 = up.EntTime;
                            SortingInTime(attendanceRecord);
                        }
                        else if (attendanceRecord.Tin7 == null)
                        {
                            attendanceRecord.Tin7 = up.EntTime;
                            SortingInTime(attendanceRecord);
                        }
                        else if (attendanceRecord.Tin8 == null)
                        {
                            attendanceRecord.Tin8 = up.EntTime;
                            SortingInTime(attendanceRecord);
                        }
                        else if (attendanceRecord.Tin9 == null)
                        {
                            attendanceRecord.Tin9 = up.EntTime;
                            SortingInTime(attendanceRecord);
                        }
                        else if (attendanceRecord.Tin10 == null)
                        {
                            attendanceRecord.Tin10 = up.EntTime;
                            SortingInTime(attendanceRecord);
                        }
                        else
                        {
                            attendanceRecord.Tin11 = up.EntTime;
                            SortingInTime(attendanceRecord);
                        }
                        break;
                    case 5: //OUT
                        if (up.EntTime.TimeOfDay < OpenShiftThresholdEnd)
                        {
                            DateTime dt = up.EntDate.AddDays(-1);
                            if (context.AttDatas.Where(aa => aa.AttDate == dt && aa.EmpID == up.EmpID).Count() > 0)
                            {
                                AttData AttDataOfPreviousDay = context.AttDatas.FirstOrDefault(aa => aa.AttDate == dt && aa.EmpID == up.EmpID);
                                if (AttDataOfPreviousDay.TimeIn != null)
                                {
                                    if (AttDataOfPreviousDay.TimeIn.Value.TimeOfDay > OpenShiftThresholdStart)
                                    {
                                        //AttDate -1, Possible TimeOut = up.entryTime
                                        MarkOUTForOpenShift(up.EntTime, AttDataOfPreviousDay);
                                    }
                                    else
                                    {
                                        // Mark as out of that day
                                        MarkOUTForOpenShift(up.EntTime, attendanceRecord);
                                    }
                                }
                                else
                                    MarkOUTForOpenShift(up.EntTime, attendanceRecord);
                            }
                            else
                            {
                                // Mark as out of that day
                                MarkOUTForOpenShift(up.EntTime, attendanceRecord);
                            }

                        }
                        else
                        {
                            //Mark as out of that day
                            MarkOUTForOpenShift(up.EntTime, attendanceRecord);
                        }
                        //-------------------------------------------------------
                        context.SaveChanges();
                        break;
                }
            }
            catch (Exception ex)
            {
                string _error = "";
                if (ex.InnerException.Message != null)
                    _error = ex.InnerException.Message;
                else
                    _error = ex.Message;
                _myHelperClass.WriteToLogFile("Attendance Processing Error at Markin In/Out " + _error);
            }
        }
 /// <summary>
 /// Create a new AttData object.
 /// </summary>
 /// <param name="empDate">Initial value of the EmpDate property.</param>
 public static AttData CreateAttData(global::System.String empDate)
 {
     AttData attData = new AttData();
     attData.EmpDate = empDate;
     return attData;
 }
        private void CalculateShiftTimes(AttData attendanceRecord, Shift shift)
        {
            try
            {
                //Calculate WorkMin
                attendanceRecord.Remarks = "";
                TimeSpan mins = (TimeSpan)(attendanceRecord.TimeOut - attendanceRecord.TimeIn);
                //Check if GZ holiday then place all WorkMin in GZOTMin
                if (attendanceRecord.StatusGZ == true)
                {
                    attendanceRecord.GZOTMin = (short)mins.TotalMinutes;
                    attendanceRecord.WorkMin = (short)mins.TotalMinutes;
                    attendanceRecord.StatusGZOT = true;
                    attendanceRecord.Remarks = attendanceRecord.Remarks + "[G-OT]";
                }
                //if Rest day then place all WorkMin in OTMin
                else if (attendanceRecord.StatusDO == true)
                {
                    attendanceRecord.OTMin = (short)mins.TotalMinutes;
                    attendanceRecord.WorkMin = (short)mins.TotalMinutes;
                    attendanceRecord.StatusOT = true;
                    attendanceRecord.Remarks = attendanceRecord.Remarks + "[R-OT]";
                }
                else
                {
                    /////////// to-do -----calculate Margins for those shifts which has break mins
                    if (shift.HasBreak == true)
                    {
                        attendanceRecord.WorkMin = (short)(mins.TotalMinutes - shift.BreakMin);
                        attendanceRecord.ShifMin = (short)(CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) - (short)shift.BreakMin);
                    }
                    else
                    {
                        //Calculate Late IN, Compare margin with Shift Late In
                        if (attendanceRecord.TimeIn.Value.TimeOfDay > attendanceRecord.DutyTime)
                        {
                            TimeSpan lateMinsSpan = (TimeSpan)(attendanceRecord.TimeIn.Value.TimeOfDay - attendanceRecord.DutyTime);
                            if (lateMinsSpan.TotalMinutes > shift.LateIn)
                            {
                                attendanceRecord.LateIn = (short)lateMinsSpan.TotalMinutes;
                                attendanceRecord.StatusLI = true;
                                attendanceRecord.EarlyIn = null;
                                attendanceRecord.Remarks = attendanceRecord.Remarks + "[LI]";
                            }
                            else
                            {
                                attendanceRecord.StatusLI = null;
                                attendanceRecord.LateIn = null;
                                attendanceRecord.Remarks.Replace("[LI]", "");
                            }
                        }
                        else
                        {
                            attendanceRecord.StatusLI = null;
                            attendanceRecord.LateIn = null;
                            attendanceRecord.Remarks.Replace("[LI]", "");
                        }

                        //Calculate Early In, Compare margin with Shift Early In
                        if (attendanceRecord.TimeIn.Value.TimeOfDay < attendanceRecord.DutyTime)
                        {
                            TimeSpan EarlyInMinsSpan = (TimeSpan)(attendanceRecord.DutyTime - attendanceRecord.TimeIn.Value.TimeOfDay);
                            if (EarlyInMinsSpan.TotalMinutes > shift.EarlyIn)
                            {
                                attendanceRecord.EarlyIn = (short)EarlyInMinsSpan.TotalMinutes;
                                attendanceRecord.StatusEI = true;
                                attendanceRecord.LateIn = null;
                                attendanceRecord.Remarks = attendanceRecord.Remarks + "[EI]";
                            }
                            else
                            {
                                attendanceRecord.StatusEI = null;
                                attendanceRecord.EarlyIn = null;
                                attendanceRecord.Remarks.Replace("[EI]", "");
                            }
                        }
                        else
                        {
                            attendanceRecord.StatusEI = null;
                            attendanceRecord.EarlyIn = null;
                            attendanceRecord.Remarks.Replace("[EI]", "");
                        }

                        // CalculateShiftEndTime = ShiftStart + DutyHours
                        DateTime shiftEnd = CalculateShiftEndTime(shift, attendanceRecord.AttDate.Value, attendanceRecord.DutyTime.Value);

                        //Calculate Early Out, Compare margin with Shift Early Out
                        if (attendanceRecord.TimeOut < shiftEnd)
                        {
                            TimeSpan EarlyOutMinsSpan = (TimeSpan)(shiftEnd - attendanceRecord.TimeOut);
                            if (EarlyOutMinsSpan.TotalMinutes > shift.EarlyOut)
                            {
                                attendanceRecord.EarlyOut = (short)EarlyOutMinsSpan.TotalMinutes;
                                attendanceRecord.StatusEO = true;
                                attendanceRecord.LateOut = null;
                                attendanceRecord.Remarks = attendanceRecord.Remarks + "[EO]";
                            }
                            else
                            {
                                attendanceRecord.StatusEO = null;
                                attendanceRecord.EarlyOut = null;
                                attendanceRecord.Remarks.Replace("[EO]", "");
                            }
                        }
                        else
                        {
                            attendanceRecord.StatusEO = null;
                            attendanceRecord.EarlyOut = null;
                            attendanceRecord.Remarks.Replace("[EO]", "");
                        }
                        //Calculate Late Out, Compare margin with Shift Late Out
                        if (attendanceRecord.TimeOut > shiftEnd)
                        {
                            TimeSpan LateOutMinsSpan = (TimeSpan)(attendanceRecord.TimeOut - shiftEnd);
                            if (LateOutMinsSpan.TotalMinutes > shift.LateOut)
                            {
                                attendanceRecord.LateOut = (short)LateOutMinsSpan.TotalMinutes;
                                // Late Out cannot have an early out, In case of poll at multiple times before and after shiftend
                                attendanceRecord.EarlyOut = null;
                                attendanceRecord.StatusLO = true;
                                attendanceRecord.Remarks = attendanceRecord.Remarks + "[LO]";
                            }
                            else
                            {
                                attendanceRecord.StatusLO = null;
                                attendanceRecord.LateOut = null;
                                attendanceRecord.Remarks.Replace("[LO]", "");
                            }
                        }
                        else
                        {
                            attendanceRecord.StatusLO = null;
                            attendanceRecord.LateOut = null;
                            attendanceRecord.Remarks.Replace("[LO]", "");
                        }

                        //Subtract EarlyIn and LateOut from Work Minutes
                        //////-------to-do--------- Automate earlyin,lateout from shift setup
                        attendanceRecord.WorkMin = (short)(mins.TotalMinutes);
                        if (attendanceRecord.EarlyIn != null && attendanceRecord.EarlyIn > shift.EarlyIn)
                        {
                            attendanceRecord.WorkMin = (short)(attendanceRecord.WorkMin - attendanceRecord.EarlyIn);
                        }
                        if (attendanceRecord.LateOut != null && attendanceRecord.LateOut > shift.LateOut)
                        {
                            attendanceRecord.WorkMin = (short)(attendanceRecord.WorkMin - attendanceRecord.LateOut);
                        }
                        if (attendanceRecord.LateOut != null || attendanceRecord.EarlyIn != null)

                            // round off work mins if overtime less than shift.OverTimeMin >
                            if (attendanceRecord.WorkMin > CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) && (attendanceRecord.WorkMin <= (CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) + shift.OverTimeMin)))
                            {
                                attendanceRecord.WorkMin = CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek);
                            }
                        //Calculate OverTime = OT, Compare margin with Shift OverTime
                        //----to-do----- Handle from shift
                        //if (attendanceRecord.EarlyIn > shift.EarlyIn || attendanceRecord.LateOut > shift.LateOut)
                        //{
                        //    if (attendanceRecord.StatusGZ != true || attendanceRecord.StatusDO != true)
                        //    {
                        //        short _EarlyIn;
                        //        short _LateOut;
                        //        if (attendanceRecord.EarlyIn == null)
                        //            _EarlyIn = 0;
                        //        else
                        //            _EarlyIn = 0;

                        //        if (attendanceRecord.LateOut == null)
                        //            _LateOut = 0;
                        //        else
                        //            _LateOut = (short)attendanceRecord.LateOut;

                        //        attendanceRecord.OTMin = (short)(_EarlyIn + _LateOut);
                        //        attendanceRecord.StatusOT = true;
                        //        attendanceRecord.Remarks = attendanceRecord.Remarks + "[N-OT]";
                        //    }
                        //}
                        if (attendanceRecord.StatusGZ != true || attendanceRecord.StatusDO != true)
                        {
                            if (attendanceRecord.LateOut != null)
                            {
                                attendanceRecord.OTMin = attendanceRecord.LateOut;
                                attendanceRecord.StatusOT = true;
                                attendanceRecord.Remarks = attendanceRecord.Remarks + "[N-OT]";
                            }
                            else
                            {

                                attendanceRecord.OTMin = null;
                                attendanceRecord.StatusOT = null;
                                attendanceRecord.Remarks.Replace("[OT]", "");
                                attendanceRecord.Remarks.Replace("[N-OT]", "");
                            }
                        }
                        else
                        {
                            attendanceRecord.OTMin = null;
                            attendanceRecord.StatusOT = null;
                            attendanceRecord.Remarks.Replace("[OT]", "");
                            attendanceRecord.Remarks.Replace("[N-OT]", "");
                        }
                    }
                }
            }
            catch (Exception ex)
            {

            }
        }
 private void CalculateTimeINOUT(AttData attendanceRecord, PollData up)
 {
     try
     {
         switch (up.RdrDuty)
         {
             case 1: //IN
                 if (attendanceRecord.Tin0 == null)
                 {
                     attendanceRecord.Tin0 = up.EntTime;
                     attendanceRecord.TimeIn = up.EntTime;
                     attendanceRecord.StatusAB = false;
                     attendanceRecord.StatusP = true;
                     attendanceRecord.Remarks = null;
                 }
                 else if (attendanceRecord.Tin1 == null)
                 {
                     attendanceRecord.Tin1 = up.EntTime;
                     SortingInTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tin2 == null)
                 {
                     attendanceRecord.Tin2 = up.EntTime;
                     SortingInTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tin3 == null)
                 {
                     attendanceRecord.Tin3 = up.EntTime;
                     SortingInTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tin4 == null)
                 {
                     attendanceRecord.Tin4 = up.EntTime;
                     SortingInTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tin5 == null)
                 {
                     attendanceRecord.Tin5 = up.EntTime;
                     SortingInTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tin6 == null)
                 {
                     attendanceRecord.Tin6 = up.EntTime;
                     SortingInTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tin7 == null)
                 {
                     attendanceRecord.Tin7 = up.EntTime;
                     SortingInTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tin8 == null)
                 {
                     attendanceRecord.Tin8 = up.EntTime;
                     SortingInTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tin9 == null)
                 {
                     attendanceRecord.Tin9 = up.EntTime;
                     SortingInTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tin10 == null)
                 {
                     attendanceRecord.Tin10 = up.EntTime;
                     SortingInTime(attendanceRecord);
                 }
                 else
                 {
                     attendanceRecord.Tin11 = up.EntTime;
                     SortingInTime(attendanceRecord);
                 }
                 break;
             case 5: //OUT
                 if (attendanceRecord.Tout0 == null)
                 {
                     attendanceRecord.Tout0 = up.EntTime;
                     attendanceRecord.TimeOut = up.EntTime;
                     SortingOutTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tout1 == null)
                 {
                     attendanceRecord.Tout1 = up.EntTime;
                     attendanceRecord.TimeOut = up.EntTime;
                     SortingOutTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tout2 == null)
                 {
                     attendanceRecord.Tout2 = up.EntTime;
                     attendanceRecord.TimeOut = up.EntTime;
                     SortingOutTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tout3 == null)
                 {
                     attendanceRecord.Tout3 = up.EntTime;
                     attendanceRecord.TimeOut = up.EntTime;
                     SortingOutTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tout4 == null)
                 {
                     attendanceRecord.Tout4 = up.EntTime;
                     attendanceRecord.TimeOut = up.EntTime;
                     SortingOutTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tout5 == null)
                 {
                     attendanceRecord.Tout5 = up.EntTime;
                     attendanceRecord.TimeOut = up.EntTime;
                     SortingOutTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tout6 == null)
                 {
                     attendanceRecord.Tout6 = up.EntTime;
                     attendanceRecord.TimeOut = up.EntTime;
                     SortingOutTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tout7 == null)
                 {
                     attendanceRecord.Tout7 = up.EntTime;
                     attendanceRecord.TimeOut = up.EntTime;
                     SortingOutTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tout8 == null)
                 {
                     attendanceRecord.Tout8 = up.EntTime;
                     attendanceRecord.TimeOut = up.EntTime;
                     SortingOutTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tout9 == null)
                 {
                     attendanceRecord.Tout9 = up.EntTime;
                     attendanceRecord.TimeOut = up.EntTime;
                     SortingOutTime(attendanceRecord);
                 }
                 else if (attendanceRecord.Tout10 == null)
                 {
                     attendanceRecord.Tout10 = up.EntTime;
                     attendanceRecord.TimeOut = up.EntTime;
                     SortingOutTime(attendanceRecord);
                 }
                 else
                 {
                     attendanceRecord.Tout11 = up.EntTime;
                     attendanceRecord.TimeOut = up.EntTime;
                     SortingOutTime(attendanceRecord);
                 }
                 break;
             case 8: //DUTY
                 if (attendanceRecord.Tin0 != null)
                 {
                     if (attendanceRecord.Tout0 == null)
                     {
                         attendanceRecord.Tout0 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tin1 == null)
                     {
                         attendanceRecord.Tin1 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tout1 == null)
                     {
                         attendanceRecord.Tout1 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tin2 == null)
                     {
                         attendanceRecord.Tin2 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tout2 == null)
                     {
                         attendanceRecord.Tout2 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tin3 == null)
                     {
                         attendanceRecord.Tin3 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tout3 == null)
                     {
                         attendanceRecord.Tout3 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tin4 == null)
                     {
                         attendanceRecord.Tin4 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tout4 == null)
                     {
                         attendanceRecord.Tout4 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tin5 == null)
                     {
                         attendanceRecord.Tin5 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tout5 == null)
                     {
                         attendanceRecord.Tout5 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tin6 == null)
                     {
                         attendanceRecord.Tin6 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tout6 == null)
                     {
                         attendanceRecord.Tout6 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     //
                     else if (attendanceRecord.Tin7 == null)
                     {
                         attendanceRecord.Tin7 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tout7 == null)
                     {
                         attendanceRecord.Tout7 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tin8 == null)
                     {
                         attendanceRecord.Tin8 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tout8 == null)
                     {
                         attendanceRecord.Tout8 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tin9 == null)
                     {
                         attendanceRecord.Tin9 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tout9 == null)
                     {
                         attendanceRecord.Tout9 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tin10 == null)
                     {
                         attendanceRecord.Tin10 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tout10 == null)
                     {
                         attendanceRecord.Tout10 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tin11 == null)
                     {
                         attendanceRecord.Tin11 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tout11 == null)
                     {
                         attendanceRecord.Tout11 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tin12 == null)
                     {
                         attendanceRecord.Tin12 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tout12 == null)
                     {
                         attendanceRecord.Tout12 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else if (attendanceRecord.Tin13 == null)
                     {
                         attendanceRecord.Tin13 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                     else
                     {
                         attendanceRecord.Tout13 = up.EntTime;
                         attendanceRecord.TimeOut = up.EntTime;
                     }
                 }
                 else
                 {
                     attendanceRecord.Tin0 = up.EntTime;
                     attendanceRecord.TimeIn = up.EntTime;
                     attendanceRecord.StatusAB = false;
                     attendanceRecord.StatusP = true;
                     attendanceRecord.Remarks = null;
                 }
                 break;
         }
     }
     catch (Exception ex)
     {
         //Error in TimeIN/OUT
         _myHelperClass.WriteToLogFile("Error At Creating Attendance");
     }
 }
        public void ProcessManualEditAttendance(DateTime _dateStart, DateTime _dateEnd)
        {
            List<AttDataManEdit> _attEdit = new List<AttDataManEdit>();
            List<AttData> _AttData = new List<AttData>();
            AttData _TempAttData = new AttData();
            using (var ctx = new TAS2013Entities())
            {

                if (_dateStart == _dateEnd)
                {
                    _attEdit = ctx.AttDataManEdits.Where(aa => aa.NewTimeIn == _dateStart).OrderBy(aa => aa.EditDateTime).ToList();
                    _dateEnd = _dateEnd + new TimeSpan(23, 59, 59);
                    //_attEdit = ctx.AttDataManEdits.Where(aa => aa.NewTimeIn >= _dateStart && aa.NewTimeIn <= _dateEnd && (aa.EmpID == 472)).OrderBy(aa => aa.EditDateTime).ToList();
                    _AttData = ctx.AttDatas.Where(aa => aa.AttDate == _dateStart).ToList();
                }
                else
                {
                    _attEdit = ctx.AttDataManEdits.Where(aa => aa.NewTimeIn >= _dateStart && aa.NewTimeOut <= _dateEnd).OrderBy(aa => aa.EditDateTime).ToList();
                    //_attEdit = ctx.AttDataManEdits.Where(aa => aa.NewTimeIn >= _dateStart && (aa.NewTimeOut <= _dateEnd && aa.EmpID == 472)).OrderBy(aa => aa.EditDateTime).ToList();
                    _AttData = ctx.AttDatas.Where(aa => aa.AttDate >= _dateStart && aa.AttDate <= _dateEnd).ToList();
                }

                foreach (var item in _attEdit)
                {
                    _TempAttData = _AttData.First(aa => aa.EmpDate == item.EmpDate);
                    _TempAttData.TimeIn = item.NewTimeIn;
                    _TempAttData.TimeOut = item.NewTimeOut;
                    _TempAttData.DutyCode = item.NewDutyCode;
                    _TempAttData.DutyTime = item.NewDutyTime;
                    switch (_TempAttData.DutyCode)
                    {
                        case "D":
                            _TempAttData.StatusAB = true;
                            _TempAttData.StatusP = false;
                            _TempAttData.StatusMN = true;
                            _TempAttData.StatusDO = false;
                            _TempAttData.StatusGZ = false;
                            _TempAttData.StatusLeave = false;
                            _TempAttData.StatusOT = false;
                            _TempAttData.OTMin = null;
                            _TempAttData.EarlyIn = null;
                            _TempAttData.EarlyOut = null;
                            _TempAttData.LateIn = null;
                            _TempAttData.LateOut = null;
                            _TempAttData.WorkMin = null;
                            _TempAttData.GZOTMin = null;
                            break;
                        case "G":
                            _TempAttData.StatusAB = false;
                            _TempAttData.StatusP = false;
                            _TempAttData.StatusMN = true;
                            _TempAttData.StatusDO = false;
                            _TempAttData.StatusGZ = true;
                            _TempAttData.StatusLeave = false;
                            _TempAttData.StatusOT = false;
                            _TempAttData.OTMin = null;
                            _TempAttData.EarlyIn = null;
                            _TempAttData.EarlyOut = null;
                            _TempAttData.LateIn = null;
                            _TempAttData.LateOut = null;
                            _TempAttData.WorkMin = null;
                            _TempAttData.GZOTMin = null;
                            break;
                        case "R":
                            _TempAttData.StatusAB = false;
                            _TempAttData.StatusP = false;
                            _TempAttData.StatusMN = true;
                            _TempAttData.StatusDO = true;
                            _TempAttData.StatusGZ = false;
                            _TempAttData.StatusLeave = false;
                            _TempAttData.StatusOT = false;
                            _TempAttData.OTMin = null;
                            _TempAttData.EarlyIn = null;
                            _TempAttData.EarlyOut = null;
                            _TempAttData.LateIn = null;
                            _TempAttData.LateOut = null;
                            _TempAttData.WorkMin = null;
                            _TempAttData.GZOTMin = null;
                            break;
                    }
                    if (_TempAttData.TimeIn != null && _TempAttData.TimeOut != null)
                    {
                        //If TimeIn = TimeOut then calculate according to DutyCode
                        if (_TempAttData.TimeIn == _TempAttData.TimeOut)
                        {
                            CalculateInEqualToOut(_TempAttData);
                        }
                        else
                        {
                            if (_TempAttData.DutyTime == new TimeSpan(0, 0, 0))
                            {
                                CalculateOpenShiftTimes(_TempAttData, _TempAttData.Emp.Shift);
                            }
                            else
                            {
                                //if (attendanceRecord.TimeIn.Value.Date.Day == attendanceRecord.TimeOut.Value.Date.Day)
                                //{
                                CalculateShiftTimes(_TempAttData, _TempAttData.Emp.Shift);
                                //}
                                //else
                                //{
                                //    CalculateOpenShiftTimes(attendanceRecord, shift);
                                //}
                            }
                        }

                        //If TimeIn = TimeOut then calculate according to DutyCode
                    }
                    ctx.SaveChanges();
                }
                ctx.Dispose();

            }
            _myHelperClass.WriteToLogFile("ProcessManual Attendance Completed: ");
        }
 private void CalculateOpenShiftTimes(AttData attendanceRecord, Shift shift)
 {
     try
     {
         //Calculate WorkMin
         if (attendanceRecord != null)
         {
             if (attendanceRecord.TimeOut != null && attendanceRecord.TimeIn != null)
             {
                 attendanceRecord.Remarks = "";
                 TimeSpan mins = (TimeSpan)(attendanceRecord.TimeOut - attendanceRecord.TimeIn);
                 //Check if GZ holiday then place all WorkMin in GZOTMin
                 if (attendanceRecord.StatusGZ == true)
                 {
                     attendanceRecord.GZOTMin = (short)mins.TotalMinutes;
                     attendanceRecord.WorkMin = (short)mins.TotalMinutes;
                     attendanceRecord.StatusGZOT = true;
                     attendanceRecord.Remarks = attendanceRecord.Remarks + "[GZ-OT]";
                 }
                 else if (attendanceRecord.StatusDO == true)
                 {
                     attendanceRecord.OTMin = (short)mins.TotalMinutes;
                     attendanceRecord.WorkMin = (short)mins.TotalMinutes;
                     attendanceRecord.StatusOT = true;
                     attendanceRecord.Remarks = attendanceRecord.Remarks + "[R-OT]";
                 }
                 else
                 {
                     if (shift.HasBreak == true)
                     {
                         attendanceRecord.WorkMin = (short)(mins.TotalMinutes - shift.BreakMin);
                         attendanceRecord.ShifMin = (short)(CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) - (short)shift.BreakMin);
                     }
                     else
                     {
                         // CalculateShiftEndTime = ShiftStart + DutyHours
                         TimeSpan shiftEnd = CalculateShiftEndTime(shift, attendanceRecord.AttDate.Value.DayOfWeek);
                         attendanceRecord.WorkMin = (short)(mins.TotalMinutes);
                         //Calculate OverTIme,
                         if (mins.TotalMinutes > (CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) + shift.OverTimeMin))
                         {
                             attendanceRecord.OTMin = (Int16)(Convert.ToInt16(mins.TotalMinutes) - CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek));
                             attendanceRecord.WorkMin = (short)((mins.TotalMinutes) - attendanceRecord.OTMin);
                             attendanceRecord.StatusOT = true;
                             attendanceRecord.Remarks = attendanceRecord.Remarks + "[N-OT]";
                         }
                         //Calculate Early Out
                         if (mins.TotalMinutes < (CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) - shift.EarlyOut))
                         {
                             Int16 EarlyoutMin = (Int16)(CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) - Convert.ToInt16(mins.TotalMinutes));
                             if (EarlyoutMin > shift.EarlyOut)
                             {
                                 attendanceRecord.EarlyOut = EarlyoutMin;
                                 attendanceRecord.StatusEO = true;
                                 attendanceRecord.Remarks = attendanceRecord.Remarks + "[EO]";
                             }
                             else
                             {
                                 attendanceRecord.StatusEO = null;
                                 attendanceRecord.EarlyOut = null;
                                 attendanceRecord.Remarks.Replace("[EO]", "");
                             }
                         }
                         else
                         {
                             attendanceRecord.StatusEO = null;
                             attendanceRecord.EarlyOut = null;
                             attendanceRecord.Remarks.Replace("[EO]", "");
                         }
                         // round off work mins if overtime less than shift.OverTimeMin >
                         if (attendanceRecord.WorkMin > CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) && (attendanceRecord.WorkMin <= (CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) + shift.OverTimeMin)))
                         {
                             attendanceRecord.WorkMin = CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek);
                         }
                     }
                 }
             }
         }
     }
     catch (Exception ex)
     {
         string _error = "";
         if (ex.InnerException.Message != null)
             _error = ex.InnerException.Message;
         else
             _error = ex.Message;
         _myHelperClass.WriteToLogFile("Attendance Processing at Calculating Times;  " + _error);
     }
 }
 private void CalculateInEqualToOut(AttData attendanceRecord)
 {
     switch (attendanceRecord.DutyCode)
     {
         case "G":
             attendanceRecord.StatusAB = false;
             attendanceRecord.StatusGZ = true;
             attendanceRecord.WorkMin = 0;
             attendanceRecord.EarlyIn = 0;
             attendanceRecord.EarlyOut = 0;
             attendanceRecord.LateIn = 0;
             attendanceRecord.LateOut = 0;
             attendanceRecord.OTMin = 0;
             attendanceRecord.GZOTMin = 0;
             attendanceRecord.StatusGZOT = false;
             attendanceRecord.TimeIn = null;
             attendanceRecord.TimeOut = null;
             attendanceRecord.Remarks = "[GZ][Manual]";
             break;
         case "R":
             attendanceRecord.StatusAB = false;
             attendanceRecord.StatusGZ = false;
             attendanceRecord.WorkMin = 0;
             attendanceRecord.EarlyIn = 0;
             attendanceRecord.EarlyOut = 0;
             attendanceRecord.LateIn = 0;
             attendanceRecord.LateOut = 0;
             attendanceRecord.OTMin = 0;
             attendanceRecord.GZOTMin = 0;
             attendanceRecord.StatusGZOT = false;
             attendanceRecord.TimeIn = null;
             attendanceRecord.TimeOut = null;
             attendanceRecord.StatusDO = true;
             attendanceRecord.Remarks = "[DO][Manual]";
             break;
         case "D":
             attendanceRecord.StatusAB = true;
             attendanceRecord.StatusGZ = false;
             attendanceRecord.WorkMin = 0;
             attendanceRecord.EarlyIn = 0;
             attendanceRecord.EarlyOut = 0;
             attendanceRecord.LateIn = 0;
             attendanceRecord.LateOut = 0;
             attendanceRecord.OTMin = 0;
             attendanceRecord.GZOTMin = 0;
             attendanceRecord.StatusGZOT = false;
             attendanceRecord.TimeIn = null;
             attendanceRecord.TimeOut = null;
             attendanceRecord.StatusDO = false;
             attendanceRecord.StatusP = false;
             attendanceRecord.Remarks = "[Absent][Manual]";
             break;
     }
 }
        private void CalculateRosterTimes(AttData attendanceRecord, Roster roster, Shift _shift)
        {
            try
            {
                TimeSpan mins = (TimeSpan)(attendanceRecord.TimeOut - attendanceRecord.TimeIn);
                attendanceRecord.Remarks = "";
                if (attendanceRecord.StatusGZ == true)
                {
                    attendanceRecord.GZOTMin = (short)mins.TotalMinutes;
                    attendanceRecord.WorkMin = (short)mins.TotalMinutes;
                    attendanceRecord.StatusGZOT = true;
                    attendanceRecord.Remarks = attendanceRecord.Remarks + "[GZ-OT]";
                }
                else if (attendanceRecord.StatusDO == true)
                {
                    attendanceRecord.OTMin = (short)mins.TotalMinutes;
                    attendanceRecord.WorkMin = (short)mins.TotalMinutes;
                    attendanceRecord.StatusOT = true;
                    attendanceRecord.Remarks = attendanceRecord.Remarks + "[R-OT]";
                    // RoundOff Overtime
                    if ((employee.EmpType.CatID == 2 || employee.EmpType.CatID == 4) && employee.CompanyID == 1)
                    {
                        if (attendanceRecord.OTMin > 0)
                        {
                            float OTmins = (float)attendanceRecord.OTMin;
                            float remainder = OTmins / 60;
                            int intpart = (int)remainder;
                            double fracpart = remainder - intpart;
                            if (fracpart < 0.5)
                            {
                                attendanceRecord.OTMin = (short)(intpart * 60);
                            }
                        }
                    }
                }
                else
                {
                    ////------to-do ----------handle shift break time
                    //Calculate Late IN, Compare margin with Shift Late In
                    if (attendanceRecord.TimeIn.Value.TimeOfDay > roster.DutyTime)
                    {
                        TimeSpan lateMinsSpan = (TimeSpan)(attendanceRecord.TimeIn.Value.TimeOfDay - attendanceRecord.DutyTime);
                        if (lateMinsSpan.TotalMinutes > _shift.LateIn)
                        {
                            attendanceRecord.LateIn = (short)lateMinsSpan.TotalMinutes;
                            attendanceRecord.StatusLI = true;
                            attendanceRecord.EarlyIn = null;
                            attendanceRecord.Remarks = attendanceRecord.Remarks + "[LI]";
                        }
                        else
                        {
                            attendanceRecord.LateIn = null;
                            attendanceRecord.StatusLI = null;
                            attendanceRecord.Remarks.Replace("[LI]", "");
                        }
                    }
                    else
                    {
                        attendanceRecord.LateIn = null;
                        attendanceRecord.StatusLI = null;
                        attendanceRecord.Remarks.Replace("[LI]", "");
                    }

                    //Calculate Early In, Compare margin with Shift Early In
                    if (attendanceRecord.TimeIn.Value.TimeOfDay < attendanceRecord.DutyTime)
                    {
                        TimeSpan EarlyInMinsSpan = (TimeSpan)(attendanceRecord.DutyTime - attendanceRecord.TimeIn.Value.TimeOfDay);
                        if (EarlyInMinsSpan.TotalMinutes > _shift.EarlyIn)
                        {
                            attendanceRecord.EarlyIn = (short)EarlyInMinsSpan.TotalMinutes;
                            attendanceRecord.StatusEI = true;
                            attendanceRecord.LateIn = null;
                            attendanceRecord.Remarks = attendanceRecord.Remarks + "[EI]";
                        }
                        else
                        {
                            attendanceRecord.StatusEI = null;
                            attendanceRecord.EarlyIn = null;
                            attendanceRecord.Remarks.Replace("[EI]", "");
                        }
                    }
                    else
                    {
                        attendanceRecord.StatusEI = null;
                        attendanceRecord.EarlyIn = null;
                        attendanceRecord.Remarks.Replace("[EI]", "");
                    }

                    // CalculateShiftEndTime = ShiftStart + DutyHours
                    TimeSpan shiftEnd = (TimeSpan)attendanceRecord.DutyTime + (new TimeSpan(0, (int)roster.WorkMin, 0));

                    //Calculate Early Out, Compare margin with Shift Early Out
                    if (attendanceRecord.TimeOut.Value.TimeOfDay < shiftEnd)
                    {
                        TimeSpan EarlyOutMinsSpan = (TimeSpan)(shiftEnd - attendanceRecord.TimeOut.Value.TimeOfDay);
                        if (EarlyOutMinsSpan.TotalMinutes > _shift.EarlyOut)
                        {
                            attendanceRecord.EarlyOut = (short)EarlyOutMinsSpan.TotalMinutes;
                            attendanceRecord.StatusEO = true;
                            attendanceRecord.LateOut = null;
                            attendanceRecord.Remarks = attendanceRecord.Remarks + "[EO]";
                        }
                        else
                        {
                            attendanceRecord.StatusEO = null;
                            attendanceRecord.EarlyOut = null;
                            attendanceRecord.Remarks.Replace("[EO]", "");
                        }
                    }
                    else
                    {
                        attendanceRecord.StatusEO = null;
                        attendanceRecord.EarlyOut = null;
                        attendanceRecord.Remarks.Replace("[EO]", "");
                    }
                    //Calculate Late Out, Compare margin with Shift Late Out
                    if (attendanceRecord.TimeOut.Value.TimeOfDay > shiftEnd)
                    {
                        TimeSpan LateOutMinsSpan = (TimeSpan)(attendanceRecord.TimeOut.Value.TimeOfDay - shiftEnd);
                        if (LateOutMinsSpan.TotalMinutes > _shift.LateOut)
                        {
                            attendanceRecord.LateOut = (short)LateOutMinsSpan.TotalMinutes;
                            // Late Out cannot have an early out, In case of poll at multiple times before and after shiftend
                            attendanceRecord.EarlyOut = null;
                            attendanceRecord.StatusLO = true;
                            attendanceRecord.Remarks = attendanceRecord.Remarks + "[LO]";
                        }
                        else
                        {
                            attendanceRecord.LateOut = null;
                            attendanceRecord.LateOut = null;
                            attendanceRecord.Remarks.Replace("[LO]", "");
                        }
                    }
                    else
                    {
                        attendanceRecord.LateOut = null;
                        attendanceRecord.LateOut = null;
                        attendanceRecord.Remarks.Replace("[LO]", "");
                    }
                    attendanceRecord.WorkMin = (short)(mins.TotalMinutes);
                    //if (attendanceRecord.EarlyIn != null && attendanceRecord.EarlyIn > _shift.EarlyIn)
                    //{
                    //    attendanceRecord.WorkMin = (short)(attendanceRecord.WorkMin - _shift.EarlyIn);
                    //}
                    //if (attendanceRecord.LateOut != null && attendanceRecord.LateOut > _shift.LateOut)
                    //{
                    //    attendanceRecord.WorkMin = (short)(attendanceRecord.WorkMin - _shift.LateOut);
                    //}
                    //if (attendanceRecord.EarlyIn == null && attendanceRecord.LateOut == null)
                    //{

                    //}
                    //round off work minutes
                    if (attendanceRecord.WorkMin > CalculateShiftMinutes(_shift, attendanceRecord.AttDate.Value.DayOfWeek) && (attendanceRecord.WorkMin <= (CalculateShiftMinutes(_shift, attendanceRecord.AttDate.Value.DayOfWeek) + _shift.OverTimeMin)))
                    {
                        attendanceRecord.WorkMin = CalculateShiftMinutes(_shift, attendanceRecord.AttDate.Value.DayOfWeek);
                    }
                    if ((attendanceRecord.WorkMin - attendanceRecord.ShifMin) > 0)
                    {
                        attendanceRecord.OTMin = (short)(attendanceRecord.ShifMin - attendanceRecord.WorkMin);
                    }

                    if ((attendanceRecord.StatusGZ != true || attendanceRecord.StatusDO != true) && employee.HasOT == true)
                    {
                        if (attendanceRecord.LateOut != null)
                        {
                            attendanceRecord.OTMin = attendanceRecord.LateOut;
                            attendanceRecord.StatusOT = true;
                            attendanceRecord.Remarks = attendanceRecord.Remarks + "[N-OT]";
                        }
                    }
                    //Mark Absent if less than 4 hours
                    if (attendanceRecord.AttDate.Value.DayOfWeek != DayOfWeek.Friday && attendanceRecord.StatusDO != true && attendanceRecord.StatusGZ != true)
                    {
                        short MinShiftMin = (short)_shift.MinHrs;
                        if (attendanceRecord.WorkMin < MinShiftMin)
                        {
                            attendanceRecord.StatusAB = true;
                            attendanceRecord.StatusP = false;
                            attendanceRecord.Remarks = attendanceRecord.Remarks + "[Absent]";
                        }
                        else
                        {
                            attendanceRecord.StatusAB = false;
                            attendanceRecord.StatusP = true;
                            attendanceRecord.Remarks.Replace("[Absent]", "");
                        }

                    }
                }

            }
            catch (Exception ex)
            {
                string _error = "";
                if (ex.InnerException.Message != null)
                    _error = ex.InnerException.Message;
                else
                    _error = ex.Message;
                _myHelperClass.WriteToLogFile("Attendance Processing Roster Times" + _error);
            }
        }
 private void MarkOUTForOpenShift(DateTime _pollTime, AttData _attendanceRecord)
 {
     if (_attendanceRecord.Tout0 == null)
     {
         _attendanceRecord.Tout0 = _pollTime;
         _attendanceRecord.TimeOut = _pollTime;
         SortingOutTime(_attendanceRecord);
     }
     else if (_attendanceRecord.Tout1 == null)
     {
         _attendanceRecord.Tout1 = _pollTime;
         _attendanceRecord.TimeOut = _pollTime;
         SortingOutTime(_attendanceRecord);
     }
     else if (_attendanceRecord.Tout2 == null)
     {
         _attendanceRecord.Tout2 = _pollTime;
         _attendanceRecord.TimeOut = _pollTime;
         SortingOutTime(_attendanceRecord);
     }
     else if (_attendanceRecord.Tout3 == null)
     {
         _attendanceRecord.Tout3 = _pollTime;
         _attendanceRecord.TimeOut = _pollTime;
         SortingOutTime(_attendanceRecord);
     }
     else
     {
         _attendanceRecord.Tout4 = _pollTime;
         _attendanceRecord.TimeOut = _pollTime;
         SortingOutTime(_attendanceRecord);
     }
     //else if (_attendanceRecord.Tout5 == null)
     //{
     //    _attendanceRecord.Tout5 = up.EntTime;
     //    _attendanceRecord.TimeOut = up.EntTime;
     //    SortingOutTime(_attendanceRecord);
     //}
     //else if (_attendanceRecord.Tout6 == null)
     //{
     //    _attendanceRecord.Tout6 = up.EntTime;
     //    _attendanceRecord.TimeOut = up.EntTime;
     //    SortingOutTime(_attendanceRecord);
     //}
     //else if (_attendanceRecord.Tout7 == null)
     //{
     //    _attendanceRecord.Tout7 = up.EntTime;
     //    _attendanceRecord.TimeOut = up.EntTime;
     //    SortingOutTime(_attendanceRecord);
     //}
     //else if (_attendanceRecord.Tout8 == null)
     //{
     //    _attendanceRecord.Tout8 = up.EntTime;
     //    _attendanceRecord.TimeOut = up.EntTime;
     //    SortingOutTime(_attendanceRecord);
     //}
     //else if (_attendanceRecord.Tout9 == null)
     //{
     //    _attendanceRecord.Tout9 = up.EntTime;
     //    _attendanceRecord.TimeOut = up.EntTime;
     //    SortingOutTime(_attendanceRecord);
     //}
     //else if (_attendanceRecord.Tout10 == null)
     //{
     //    _attendanceRecord.Tout10 = up.EntTime;
     //    _attendanceRecord.TimeOut = up.EntTime;
     //    SortingOutTime(_attendanceRecord);
     //}
     //else
     //{
     //    _attendanceRecord.Tout11 = up.EntTime;
     //    _attendanceRecord.TimeOut = up.EntTime;
     //    SortingOutTime(_attendanceRecord);
     //}
 }
        private void CalculateShiftTimes(AttData attendanceRecord, Shift shift)
        {
            try
            {
                //Calculate WorkMin
                attendanceRecord.Remarks = "";
                TimeSpan mins = (TimeSpan)(attendanceRecord.TimeOut - attendanceRecord.TimeIn);
                //Check if GZ holiday then place all WorkMin in GZOTMin
                if (attendanceRecord.StatusGZ == true)
                {
                    attendanceRecord.GZOTMin = (short)mins.TotalMinutes;
                    attendanceRecord.WorkMin = (short)mins.TotalMinutes;
                    attendanceRecord.StatusGZOT = true;
                    attendanceRecord.Remarks = attendanceRecord.Remarks + "[G-OT]";
                }
                //if Rest day then place all WorkMin in OTMin
                else if (attendanceRecord.StatusDO == true)
                {
                    attendanceRecord.OTMin = (short)mins.TotalMinutes;
                    attendanceRecord.WorkMin = (short)mins.TotalMinutes;
                    attendanceRecord.StatusOT = true;
                    attendanceRecord.Remarks = attendanceRecord.Remarks + "[R-OT]";

                }
                else
                {
                    /////////// to-do -----calculate Margins for those shifts which has break mins
                    if (shift.HasBreak == true)
                    {
                        attendanceRecord.WorkMin = (short)(mins.TotalMinutes - shift.BreakMin);
                        attendanceRecord.ShifMin = (short)(CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) - (short)shift.BreakMin);
                    }
                    else
                    {
                        //Calculate Late IN, Compare margin with Shift Late In
                        if (attendanceRecord.TimeIn.Value.TimeOfDay > attendanceRecord.DutyTime)
                        {
                            TimeSpan lateMinsSpan = (TimeSpan)(attendanceRecord.TimeIn.Value.TimeOfDay - attendanceRecord.DutyTime);
                            if (lateMinsSpan.TotalMinutes > shift.LateIn)
                            {
                                attendanceRecord.LateIn = (short)lateMinsSpan.TotalMinutes;
                                attendanceRecord.StatusLI = true;
                                attendanceRecord.EarlyIn = null;
                                attendanceRecord.Remarks = attendanceRecord.Remarks + "[LI]";
                            }
                            else
                            {
                                attendanceRecord.StatusLI = null;
                                attendanceRecord.LateIn = null;
                                attendanceRecord.Remarks.Replace("[LI]", "");
                            }
                        }
                        else
                        {
                            attendanceRecord.StatusLI = null;
                            attendanceRecord.LateIn = null;
                            attendanceRecord.Remarks.Replace("[LI]", "");
                        }

                        //Calculate Early In, Compare margin with Shift Early In
                        if (attendanceRecord.TimeIn.Value.TimeOfDay < attendanceRecord.DutyTime)
                        {
                            TimeSpan EarlyInMinsSpan = (TimeSpan)(attendanceRecord.DutyTime - attendanceRecord.TimeIn.Value.TimeOfDay);
                            if (EarlyInMinsSpan.TotalMinutes > shift.EarlyIn)
                            {
                                attendanceRecord.EarlyIn = (short)EarlyInMinsSpan.TotalMinutes;
                                attendanceRecord.StatusEI = true;
                                attendanceRecord.LateIn = null;
                                attendanceRecord.Remarks = attendanceRecord.Remarks + "[EI]";
                            }
                            else
                            {
                                attendanceRecord.StatusEI = null;
                                attendanceRecord.EarlyIn = null;
                                attendanceRecord.Remarks.Replace("[EI]", "");
                            }
                        }
                        else
                        {
                            attendanceRecord.StatusEI = null;
                            attendanceRecord.EarlyIn = null;
                            attendanceRecord.Remarks.Replace("[EI]", "");
                        }

                        // CalculateShiftEndTime = ShiftStart + DutyHours
                        DateTime shiftEnd = CalculateShiftEndTime(shift, attendanceRecord.AttDate.Value, attendanceRecord.DutyTime.Value);

                        //Calculate Early Out, Compare margin with Shift Early Out
                        if (attendanceRecord.TimeOut < shiftEnd)
                        {
                            TimeSpan EarlyOutMinsSpan = (TimeSpan)(shiftEnd - attendanceRecord.TimeOut);
                            if (EarlyOutMinsSpan.TotalMinutes > shift.EarlyOut)
                            {
                                attendanceRecord.EarlyOut = (short)EarlyOutMinsSpan.TotalMinutes;
                                attendanceRecord.StatusEO = true;
                                attendanceRecord.LateOut = null;
                                attendanceRecord.Remarks = attendanceRecord.Remarks + "[EO]";
                            }
                            else
                            {
                                attendanceRecord.StatusEO = null;
                                attendanceRecord.EarlyOut = null;
                                attendanceRecord.Remarks.Replace("[EO]", "");
                            }
                        }
                        else
                        {
                            attendanceRecord.StatusEO = null;
                            attendanceRecord.EarlyOut = null;
                            attendanceRecord.Remarks.Replace("[EO]", "");
                        }
                        //Calculate Late Out, Compare margin with Shift Late Out
                        if (attendanceRecord.TimeOut > shiftEnd)
                        {
                            TimeSpan LateOutMinsSpan = (TimeSpan)(attendanceRecord.TimeOut - shiftEnd);
                            if (LateOutMinsSpan.TotalMinutes > shift.LateOut)
                            {
                                attendanceRecord.LateOut = (short)LateOutMinsSpan.TotalMinutes;
                                // Late Out cannot have an early out, In case of poll at multiple times before and after shiftend
                                attendanceRecord.EarlyOut = null;
                                attendanceRecord.StatusLO = true;
                                attendanceRecord.Remarks = attendanceRecord.Remarks + "[LO]";
                            }
                            else
                            {
                                attendanceRecord.StatusLO = null;
                                attendanceRecord.LateOut = null;
                                attendanceRecord.Remarks.Replace("[LO]", "");
                            }
                        }
                        else
                        {
                            attendanceRecord.StatusLO = null;
                            attendanceRecord.LateOut = null;
                            attendanceRecord.Remarks.Replace("[LO]", "");
                        }
                        attendanceRecord.WorkMin = (short)(mins.TotalMinutes);
                        // round off work mins if overtime less than shift.OverTimeMin >
                        //if ((attendanceRecord.WorkMin > CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek)) && (attendanceRecord.WorkMin <= (CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek) + shift.OverTimeMin)))
                        //{
                        //    attendanceRecord.WorkMin = CalculateShiftMinutes(shift, attendanceRecord.AttDate.Value.DayOfWeek);
                        //}
                        if (attendanceRecord.WorkMin > (attendanceRecord.ShifMin + shift.OverTimeMin))
                        {
                            attendanceRecord.OTMin = (short)(attendanceRecord.WorkMin - attendanceRecord.ShifMin);
                            attendanceRecord.WorkMin = attendanceRecord.ShifMin;
                            attendanceRecord.StatusOT = true;

                        }
                        //if ((attendanceRecord.WorkMin - attendanceRecord.ShifMin) > 0)
                        //{
                        //    attendanceRecord.OTMin = (short)(attendanceRecord.ShifMin - attendanceRecord.WorkMin);
                        //}

                        if ((attendanceRecord.StatusGZ != true || attendanceRecord.StatusDO != true) && employee.HasOT == true)
                        {
                            if (attendanceRecord.LateOut != null)
                            {
                                //attendanceRecord.OTMin = attendanceRecord.LateOut;
                                attendanceRecord.StatusOT = true;
                                attendanceRecord.Remarks = attendanceRecord.Remarks + "[N-OT]";
                            }
                        }
                        //Mark Absent if less than 4 hours
                        if (attendanceRecord.AttDate.Value.DayOfWeek != DayOfWeek.Friday && attendanceRecord.StatusDO != true && attendanceRecord.StatusGZ != true)
                        {
                            short MinShiftMin = (short)shift.MinHrs;
                            if (attendanceRecord.WorkMin < MinShiftMin)
                            {
                                attendanceRecord.StatusAB = true;
                                attendanceRecord.StatusP = false;
                                attendanceRecord.Remarks = "[Absent]";
                            }
                            else
                            {
                                attendanceRecord.StatusAB = false;
                                attendanceRecord.StatusP = true;
                                attendanceRecord.Remarks.Replace("[Absent]", "");
                            }

                        }
                    }
                }
            }
            catch (Exception ex)
            {

            }
        }
 /// <summary>
 /// Deprecated Method for adding a new object to the AttDatas EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
 /// </summary>
 public void AddToAttDatas(AttData attData)
 {
     base.AddObject("AttDatas", attData);
 }