Exemplo n.º 1
0
        public void ProcessDailyAttendance()
        {
            DateTime        _dt              = GlobalSettings._dateTime;
            DateTime        dtTo             = new DateTime(2015, 12, 7);
            DateTime        dtFrom           = new DateTime(2015, 12, 8);
            List <PollData> unprocessedPolls = context.PollDatas.Where(p => (p.Process == false)).OrderBy(e => e.EntTime).ToList();

            //List<PollData> unprocessedPolls = context.PollDatas.Where(p => (p.EntDate >= dtTo && p.EntDate <= dtFrom) && p.EmpID == 180).OrderBy(e => e.EntTime).ToList();
            foreach (PollData up in unprocessedPolls)
            {
                try
                {
                    //Create Attendance if any poll date is not processed already
                    if (context.AttProcesses.Where(ap => ap.ProcessDate == up.EntDate).Count() == 0)
                    {
                        CreateAttendance(up.EntDate.Date);
                    }
                    //Check AttData with EmpDate
                    if (context.AttDatas.Where(attd => attd.EmpDate == up.EmpDate).Count() > 0)
                    {
                        AttData attendanceRecord = context.AttDatas.First(attd => attd.EmpDate == up.EmpDate);
                        employee = attendanceRecord.Emp;
                        Shift shift = employee.Shift;
                        //Set Time In and Time Out in AttData
                        if (attendanceRecord.Emp.Shift.OpenShift == true)
                        {
                            //Set Time In and Time Out for open shift
                            PlaceTimeInOuts.CalculateTimeINOUTOpenShift(attendanceRecord, up);
                        }
                        else
                        {
                            TimeSpan checkTimeEnd = new TimeSpan();
                            DateTime TimeInCheck  = new DateTime();
                            if (attendanceRecord.TimeIn == null)
                            {
                                TimeInCheck = attendanceRecord.AttDate.Value.Add(attendanceRecord.DutyTime.Value);
                            }
                            else
                            {
                                TimeInCheck = attendanceRecord.TimeIn.Value;
                            }
                            if (attendanceRecord.ShifMin == 0)
                            {
                                checkTimeEnd = TimeInCheck.TimeOfDay.Add(new TimeSpan(0, 480, 0));
                            }
                            else
                            {
                                checkTimeEnd = TimeInCheck.TimeOfDay.Add(new TimeSpan(0, (int)attendanceRecord.ShifMin, 0));
                            }
                            if (checkTimeEnd.Days > 0)
                            {
                                //if Time out occur at next day
                                if (up.RdrDuty == 5)
                                {
                                    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)
                                        {
                                            TimeSpan t1 = new TimeSpan(11, 00, 00);
                                            if (up.EntTime.TimeOfDay < t1)
                                            {
                                                if ((up.EntTime - _attData.TimeIn.Value).Hours < 18)
                                                {
                                                    attendanceRecord = _attData;
                                                    up.EmpDate       = up.EmpID.ToString() + dt.Date.ToString("yyMMdd");
                                                }
                                            }
                                        }
                                        else
                                        {
                                            attendanceRecord = _attData;
                                            up.EmpDate       = up.EmpID.ToString() + dt.Date.ToString("yyMMdd");
                                        }
                                    }
                                }
                            }
                            //Set Time In and Time Out
                            if (up.RdrDuty == 5)
                            {
                                if (attendanceRecord.TimeIn != null)
                                {
                                    TimeSpan dt = (TimeSpan)(up.EntTime.TimeOfDay - attendanceRecord.TimeIn.Value.TimeOfDay);
                                    if (dt.Minutes < 0)
                                    {
                                        DateTime dt1 = new DateTime();
                                        dt1 = up.EntDate.Date.AddDays(-1);
                                        var _attData = context.AttDatas.FirstOrDefault(aa => aa.AttDate == dt1 && aa.EmpID == up.EmpID);
                                        attendanceRecord = _attData;
                                        up.EmpDate       = up.EmpID.ToString() + dt1.Date.ToString("yyMMdd");
                                        PlaceTimeInOuts.CalculateTimeINOUT(attendanceRecord, up);
                                    }
                                    else
                                    {
                                        PlaceTimeInOuts.CalculateTimeINOUT(attendanceRecord, up);
                                    }
                                }
                                else
                                {
                                    PlaceTimeInOuts.CalculateTimeINOUT(attendanceRecord, up);
                                }
                            }
                            else
                            {
                                PlaceTimeInOuts.CalculateTimeINOUT(attendanceRecord, up);
                            }
                        }
                        if (employee.Shift.OpenShift == true)
                        {
                            if (up.EntTime.TimeOfDay < PlaceTimeInOuts.OpenShiftThresholdEnd)
                            {
                                DateTime dt = up.EntDate.Date.AddDays(-1);
                                CalculateWorkMins.CalculateOpenShiftTimes(context.AttDatas.FirstOrDefault(aa => aa.AttDate == dt && aa.EmpID == up.EmpID), shift);
                                context.SaveChanges();
                            }
                        }
                        //If TimeIn and TimeOut are not null, then calculate other Atributes
                        if (attendanceRecord.TimeIn != null && attendanceRecord.TimeOut != null)
                        {
                            if (context.Rosters.Where(r => r.EmpDate == up.EmpDate).Count() > 0)
                            {
                                CalculateWorkMins.CalculateRosterTimes(attendanceRecord, context.Rosters.FirstOrDefault(r => r.EmpDate == up.EmpDate), shift);
                                context.SaveChanges();
                            }
                            else
                            {
                                if (shift.OpenShift == true)
                                {
                                    if (up.EntTime.TimeOfDay < PlaceTimeInOuts.OpenShiftThresholdEnd)
                                    {
                                        DateTime dt = up.EntDate.Date.AddDays(-1);
                                        CalculateWorkMins.CalculateOpenShiftTimes(context.AttDatas.FirstOrDefault(aa => aa.AttDate == dt && aa.EmpID == up.EmpID), shift);
                                        CalculateWorkMins.CalculateOpenShiftTimes(attendanceRecord, shift);
                                        context.SaveChanges();
                                    }
                                    else
                                    {
                                        //Calculate open shifft time of the same date
                                        CalculateWorkMins.CalculateOpenShiftTimes(attendanceRecord, shift);
                                        context.SaveChanges();
                                    }
                                }
                                else
                                {
                                    CalculateWorkMins.CalculateShiftTimes(attendanceRecord, shift);
                                    context.SaveChanges();
                                }
                            }
                        }
                        up.Process = true;
                    }
                }
                catch (Exception ex)
                {
                    string _error = "";
                    if (ex.InnerException.Message != null)
                    {
                        _error = ex.InnerException.Message;
                    }
                    else
                    {
                        _error = ex.Message;
                    }
                    _myHelperClass.WriteToLogFile("Attendance Processing Error Level 1 " + _error);
                }
                context.SaveChanges();
            }
            _myHelperClass.WriteToLogFile("Attendance Processing Completed");
            context.Dispose();
        }
        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).OrderBy(aa => aa.EditDateTime).ToList();
                    _AttData = ctx.AttDatas.Where(aa => aa.AttDate == _dateStart).ToList();
                }
                else
                {
                    _dateEnd = _dateEnd + new TimeSpan(23, 59, 59);
                    _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;
                    _TempAttData.ShifMin  = item.NewShiftMin;
                    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))
                            {
                                CalculateWorkMins.CalculateOpenShiftTimes(_TempAttData, _TempAttData.Emp.Shift);
                            }
                            else
                            {
                                //if (attendanceRecord.TimeIn.Value.Date.Day == attendanceRecord.TimeOut.Value.Date.Day)
                                //{
                                CalculateWorkMins.CalculateShiftTimes(_TempAttData, _TempAttData.Emp.Shift);
                                //}
                                //else
                                //{
                                //    CalculateOpenShiftTimes(attendanceRecord, shift);
                                //}
                            }
                            _TempAttData.Remarks = _TempAttData.Remarks + "[Manual]";
                        }

                        //If TimeIn = TimeOut then calculate according to DutyCode
                    }
                    ctx.SaveChanges();
                }
                ctx.Dispose();
            }
            _myHelperClass.WriteToLogFile("ProcessManual Attendance Completed: ");
        }