using System; using System.Collections.Generic; using System.Linq; using System.Text; using Ease.CoreV35.Model; namespace Payroll.BO { [Serializable] public class AttendanceProcess { #region Declaration double _lateHour, _earlyHour, _oTHour; //public event System.EventHandler RefreshStatus; //ObjectsTemplate _employees = null; //ObjectsTemplate _monthlyWorkPlans = null; ObjectsTemplate _AttNHolidays = null; EnumWorkPlanGroup _empWPtype = EnumWorkPlanGroup.Fixed; #endregion #region Private functions private double GetOTHourForBuyer(BuyerSetup buyerSetup, double totalOTHour) { double OTHour = totalOTHour; double AssignedOTHour = 0; if (buyerSetup.IsHolidayOTAllowed) { AssignedOTHour = Math.Round((buyerSetup.AcceptHour - (buyerSetup.MaxHolidayOTHour * buyerSetup.MaxHDInMonth)) / 26); } else { AssignedOTHour = Math.Round(buyerSetup.AcceptHour / 26);//maximum OT Hour for each day } if (OTHour > AssignedOTHour) { //double rand = 0; //Random rd = new Random(); //rand = Convert.ToDouble(rd.Next(0, 15)); //OTHour = AssignedOTHour - rand / 10; OTHour = AssignedOTHour; } return OTHour; } //private ObjectsTemplate GetRawData(ObjectsTemplate rawData, ID empID) //{ // ObjectsTemplate empRawData = new ObjectsTemplate(); // foreach (AttnRawData item in rawData) // { // if (item.EmployeeID == empID) // { // empRawData.Add(item); // } // } // return empRawData; //} private DateTime GetFirstFriday(DateTime Attdate) { DateTime date = new DateTime(); date = Convert.ToDateTime(Attdate.ToString("1 MMM yyyy")); for (int i = 0; i < 7; i++) { if (date.DayOfWeek == DayOfWeek.Friday) break; date = date.AddDays(1); } return date; // *** For GetFirstTwoFridays //DateTime[] dates = new DateTime[2]; //DateTime dt; //dt = Convert.ToDateTime(Attdate.ToString("1 MMM yyyy")); //for (int i = 0; i < 7; i++) //{ // if (dt.DayOfWeek == DayOfWeek.Friday) // break; // dt = dt.AddDays(1); //} //dates[0] = dt; //dates[1] = dt.AddDays(7); //return dates; } private List GetLastTenWorkingDays(DateTime Attdate) { List dates = new List(); DateTime dt, dtLast; dt = Convert.ToDateTime(Attdate.ToString("21 MMM yyyy")); dtLast = Convert.ToDateTime(Attdate.ToString("1 MMM yyyy")); dtLast = dtLast.AddMonths(1); for (int i = 0; dt < dtLast; i++) { if (dt.DayOfWeek == DayOfWeek.Friday) { i--; } else { dates.Add(dt); } dt = dt.AddDays(1); } return dates; } private EnumAttendanceType GetAttnType(DateTime empInTime, DateTime empOutTime, Shift shift, DateTime attnDate, MonthlyWorkPlan empMonthlyWorkPlan) { EnumAttendanceType attntype = EnumAttendanceType.Present; DateTime shiftInTime = attnDate.Subtract(attnDate.TimeOfDay).Add(shift.InTime.TimeOfDay); DateTime shiftOutTime = DateTime.MinValue; DateTime shiftOutTimeWithMinimumOT = DateTime.MinValue; if (shift.InTime <= shift.OutTime) { shiftOutTime = attnDate.Subtract(attnDate.TimeOfDay).Add(shift.OutTime.TimeOfDay); shiftOutTimeWithMinimumOT = attnDate.Subtract(attnDate.TimeOfDay).Add(shift.OutTime.TimeOfDay).AddMinutes(shift.MinimumOTHour); } else { shiftOutTime = attnDate.AddDays(1).Subtract(attnDate.TimeOfDay).Add(shift.OutTime.TimeOfDay); shiftOutTimeWithMinimumOT = attnDate.AddDays(1).Subtract(attnDate.TimeOfDay).Add(shift.OutTime.TimeOfDay).AddMinutes(shift.MinimumOTHour); } // DateTime shiftInTimeWithLatehour = attnDate.Subtract(attnDate.TimeOfDay).Add(shift.InTime.TimeOfDay).AddMinutes(shift.LateCalcualtion); if (empMonthlyWorkPlan.Type != EnumWorkPlanDayType.WorkingDay) { TimeSpan OTHour = empOutTime.Subtract(empInTime); _oTHour = Convert.ToDouble(OTHour.Hours) + (Convert.ToDouble(OTHour.Minutes) >= Convert.ToDouble(shift.MinimumOTHour) ? 1 : 0); //For Launch break if (_oTHour > 6) { _oTHour = _oTHour - 1; } OTHour = empOutTime.Subtract(empOutTime); // for fixed group employee, night 1 am to 2 pm is rest time, so this one hour will be not included in overtime. if (_empWPtype == EnumWorkPlanGroup.Fixed && empInTime.Date > empOutTime.Date && empOutTime.Hour >= 1 && empOutTime.Minute >= shift.MinimumOTHour) { _oTHour = _oTHour - 1; } if (empMonthlyWorkPlan.Type == EnumWorkPlanDayType.NationalHoliday) { attntype = EnumAttendanceType.Holiday; } else if (empMonthlyWorkPlan.Type == EnumWorkPlanDayType.WeeklyHoliday) { attntype = EnumAttendanceType.WeeklyHoliday; } } else { if (empOutTime > shiftOutTimeWithMinimumOT) { TimeSpan OTHour = empOutTime.Subtract(shiftOutTime); _oTHour = Convert.ToDouble(OTHour.Hours) + (Convert.ToDouble(OTHour.Minutes) >= Convert.ToDouble(shift.MinimumOTHour) ? 1 : 0); } } if (_oTHour < 0) _oTHour = 0; return attntype; } private void CalcullateWorkdayType(DailyAttnProcess attnProcess, EmployeeWorkPlanSetup oEmpWorkplan, WorkPlanGroup oEmpWPlanGroup) { //ObjectsTemplate oShiftRotations = null; //oShiftRotations = ShiftRotation.Get(oEmpWPlanGroup.Type); attnProcess.WorkDayType = EnumWorkPlanDayType.WorkingDay; if (_AttNHolidays == null) { DateTime oLastDate = GlobalFunctions.LastDateOfMonth(attnProcess.AttnDate); DateTime oFirstDate = GlobalFunctions.FirstDateOfMonth(attnProcess.AttnDate); _AttNHolidays = AttnNationalHoliday.GetByMonth(oFirstDate, oLastDate); } AttnNationalHoliday oAttNHoliday = _AttNHolidays.Where(o => attnProcess.AttnDate.Date >= o.FromDate.Date && attnProcess.AttnDate.Date <= o.ToDate.Date) .FirstOrDefault(); if (oAttNHoliday.LocationID == null) { //Holiday; } if (oAttNHoliday != null && oAttNHoliday.LocationID == null) { attnProcess.WorkDayType = EnumWorkPlanDayType.NationalHoliday; attnProcess.ReferenceID = oAttNHoliday.ID; return; } if(oAttNHoliday != null) if (oEmpWPlanGroup.Type == EnumWorkPlanGroup.Fixed) { if ((oEmpWorkplan.WeekEndOn != null && attnProcess.AttnDate.DayOfWeek == (DayOfWeek)oEmpWorkplan.WeekEndOn) || (oEmpWorkplan.WeekEndOn2 != null && attnProcess.AttnDate.DayOfWeek == (DayOfWeek)oEmpWorkplan.WeekEndOn2)) { attnProcess.WorkDayType = EnumWorkPlanDayType.WeeklyHoliday; } } else { if (oEmpWorkplan.WeekEndOn != null) { if (attnProcess.AttnDate.DayOfWeek == (DayOfWeek)oEmpWorkplan.WeekEndOn) { attnProcess.WorkDayType = EnumWorkPlanDayType.WeeklyHoliday; } } else { if (attnProcess.AttnDate >= oEmpWorkplan.StartDate) { int nShiftInterval = 7; TimeSpan st = attnProcess.AttnDate - oEmpWorkplan.StartDate; int dayCount = st.Days; int nCircleDay = (dayCount % nShiftInterval); if ((nShiftInterval - nCircleDay - 1) == 0) { attnProcess.WorkDayType = EnumWorkPlanDayType.WeeklyHoliday; } } } } } private void CalcullateOT(DailyAttnProcess attnProcess, Shift oshift, DateTime Attdate) { _oTHour = 0; //DateTime shiftInTime = Attdate.Subtract(Attdate.TimeOfDay).Add(oshift.InTime.TimeOfDay); DateTime shiftInTime = Attdate.Subtract(Attdate.TimeOfDay).Add(attnProcess.InTime.TimeOfDay); DateTime shiftOutTime = DateTime.MinValue; DateTime shiftOutTimeWithMinimumOT = DateTime.MinValue; TimeSpan shiftTimeDifference = new TimeSpan(0); if (oshift.InTime <= oshift.OutTime) { shiftTimeDifference = oshift.OutTime.Subtract(oshift.InTime); } else { shiftTimeDifference = oshift.OutTime.AddDays(1).Subtract(oshift.InTime); } shiftOutTime = shiftInTime.Add(shiftTimeDifference); shiftOutTimeWithMinimumOT = shiftOutTime.AddMinutes(oshift.MinimumOTHour); //if (oshift.InTime <= oshift.OutTime) //{ // shiftOutTime = Attdate.Subtract(Attdate.TimeOfDay).Add(oshift.OutTime.TimeOfDay); // shiftOutTimeWithMinimumOT = Attdate.Subtract(Attdate.TimeOfDay).Add(oshift.OutTime.TimeOfDay).AddMinutes(oshift.MinimumOTHour); //} //else //{ // shiftOutTime = Attdate.AddDays(1).Subtract(Attdate.TimeOfDay).Add(oshift.OutTime.TimeOfDay); // shiftOutTimeWithMinimumOT = Attdate.AddDays(1).Subtract(Attdate.TimeOfDay).Add(oshift.OutTime.TimeOfDay).AddMinutes(oshift.MinimumOTHour); //} if (attnProcess.WorkDayType != EnumWorkPlanDayType.WorkingDay) { TimeSpan OTHour = attnProcess.OutTime.Subtract(attnProcess.InTime); DateTime tempShiftInTime = Attdate.Subtract(Attdate.TimeOfDay).Add(oshift.InTime.TimeOfDay); DateTime tempShiftOutTime = oshift.InTime <= oshift.OutTime ? Attdate.Subtract(Attdate.TimeOfDay).Add(oshift.OutTime.TimeOfDay) : Attdate.Subtract(Attdate.TimeOfDay).Add(oshift.OutTime.TimeOfDay).AddDays(1); // _oTHour = Convert.ToDouble(OTHour.Hours) + (Convert.ToDouble(OTHour.Minutes) >= Convert.ToDouble(oshift.MinimumOTHour) ? 1 : 0); // *** Early by Out time // If there is an early exit rule if (oshift.EarlyExitBefore != 0) { // check whether he/she has done early exit if (attnProcess.OutTime < tempShiftOutTime) { // if he or she left between the early exit range if (attnProcess.OutTime.AddMinutes(oshift.EarlyExitBefore) >= tempShiftOutTime) { // then his/her out time will be shift's out time OTHour = tempShiftOutTime.Subtract(attnProcess.InTime); } } } // *** Early by total Hour // If there is an early exit rule //if (oshift.EarlyExitBefore != 0) //{ // TimeSpan totalShiftHour = shiftOutTime.Subtract(shiftInTime); // // check whether he/she has done early exit // if (_oTHour < totalShiftHour.Hours) // { // // if his (worktime + early exit time) overtakes his total shift hour // // then he/she is given full shift hour OT // if ((_oTHour + (oshift.EarlyExitBefore / 60.0)) >= (double)totalShiftHour.Hours) // { // _oTHour = totalShiftHour.Hours; // } // } //} _oTHour = Convert.ToDouble(OTHour.Hours) + (Convert.ToDouble(OTHour.Minutes) >= Convert.ToDouble(oshift.MinimumOTHour) ? 1 : 0); //For Launch break if (_oTHour > 6) { _oTHour = _oTHour - 1; } // need to discuss // for fixed group employee, night 1 am to 2 pm is rest time, so this one hour will be not included in overtime. //if (_empWPtype == EnumWorkPlanGroup.Fixed && attnProcess.InTime.Date > attnProcess.OutTime.Date && attnProcess.OutTime.Hour >= 1 && attnProcess.OutTime.Minute >= oshift.MinimumOTHour) //{ // _oTHour = _oTHour - 1; //} } else { //TimeSpan WorkHour = attnProcess.OutTime.Subtract(attnProcess.InTime); if (attnProcess.OutTime > shiftOutTimeWithMinimumOT) { TimeSpan OTHour = attnProcess.OutTime.Subtract(shiftOutTime); _oTHour = Convert.ToDouble(OTHour.Hours) + (Convert.ToDouble(OTHour.Minutes) >= Convert.ToDouble(oshift.MinimumOTHour) ? 1 : 0); } } if (_oTHour < 0) _oTHour = 0; attnProcess.OTHour = _oTHour; } #endregion #region Public Functions public void Process(DateTime Attdate,EnumProcessMode prMode) { AttnProcessRunSummary oAttnRunSummary = new AttnProcessRunSummary(); oAttnRunSummary.ProcessMode = prMode; bool isInOutApplicable = false; try { // #region Load Attendence Raw Data //AttnRawData.CollectRawData(oAttnRunSummary); // #endregion #region Initialization for Attendence Process isInOutApplicable = ConfigurationManager.GetBoolValue("attendence", "inoutapplicable", EnumConfigurationType.Logic); ObjectsTemplate dailyattProcesses = new ObjectsTemplate(); List oEmpFieldTracks = new List(); DateTime startTime = new DateTime(Attdate.Year, Attdate.Month, Attdate.Day, 5, 30, 0); DateTime ToTime = Attdate.AddDays(1); ToTime = new DateTime(ToTime.Year, ToTime.Month, ToTime.Day, 10, 0, 0); ObjectsTemplate CounterClockRotation = ShiftRotation.Get(EnumWorkPlanGroup.Counter_Clock_1); ObjectsTemplate CounterClock2Rotation = ShiftRotation.Get(EnumWorkPlanGroup.Counter_Clock_2); ObjectsTemplate CounterClock3Rotation = ShiftRotation.Get(EnumWorkPlanGroup.Counter_Clock_3); ObjectsTemplate CounterClock4Rotation = ShiftRotation.Get(EnumWorkPlanGroup.Counter_Clock_4); ObjectsTemplate empWPGroups = EmployeeWorkPlanSetup.Get(); ObjectsTemplate employees = Employee.Get(); ObjectsTemplate shifts = Shift.Get(); ObjectsTemplate workPlanGroups = WorkPlanGroup.Get(); ObjectsTemplate discontinueEmps = Employee.GetDiscontinueEmp(Attdate, DateTime.Now); ObjectsTemplate attRawdata = AttnRawData.Get(startTime, ToTime);// get raw data by a date and order by date, employee, punchTime ObjectsTemplate outSideDuties = EmployeeOutsideDuty.Get(Attdate); // get transaction by the a rate ObjectsTemplate leaves = LeaveEntry.Get(Attdate); // workplans by the date oEmpFieldTracks = EmpFieldTrack.Get().Where(obj=> obj.TranDateTime.Date == Attdate.Date).ToList(); List lvParameters = LeaveParameter.Get(true); if (discontinueEmps != null && discontinueEmps.Count > 0) { foreach (Employee emp in discontinueEmps) { if (employees.Contains(emp.ID) == false) employees.Add(emp); } } ObjectsTemplate prvDayattns = DailyAttnProcess.Get(Attdate.AddDays(-1)); ObjectsTemplate manualAttnProcesses = DailyAttnProcess.GetManualProcess(Attdate); foreach (DailyAttnProcess item in manualAttnProcesses) { dailyattProcesses.Add(item); } #endregion foreach (Employee emp in employees) { // For Test //if (emp.EmployeeNo.Trim()=="182") //{ //} #region EmployeeWise Setup // 1. If Joining date is after Attendendence date then no attendence if (emp.JoiningDate > Attdate) { oAttnRunSummary.AddError(EnumErrorType.Others, "Employee Joining Date Greater than Attendence Date.", emp); continue; } var manualEntry = manualAttnProcesses .Where(obj => obj.EmployeeID == emp.ID) .ToList(); // 2. If Attendendence is manually enterred then it is already added if (manualEntry.Count > 0) continue; DailyAttnProcess attnProcess = new DailyAttnProcess(); attnProcess.AttnDate = Attdate; attnProcess.EmployeeID = emp.ID; attnProcess.IsManualEntry = false; _lateHour = 0; _earlyHour = 0; _oTHour = 0; MonthlyWorkPlan empMonthlyWorkPlan = null; List empAttnData = null; EmployeeOutsideDuty empOutsideDuty = null; LeaveEntry empLeaveEntry = null; #region Some fine tuning in Employee's attendence RawData if (attRawdata != null && attRawdata.Count > 0) { empAttnData = attRawdata.Where(erd => erd.EmployeeID.Integer == emp.ID.Integer) .OrderBy(erd => erd.PunchTime) .ToList(); // If empAttendence Data exist and if (empAttnData.Count > 0) { // If empAttendence Data's first punchTime is greater than current date's last Time if (empAttnData[0].PunchTime > new DateTime(ToTime.Year, ToTime.Month, ToTime.Day, 2, 0, 0)) { // We Clear empAttendence Data empAttnData = new ObjectsTemplate(); } else { // Gets Employees Previous Days Attendence DailyAttnProcess op = prvDayattns.Where(itm => itm.EmployeeID.Integer == emp.ID.Integer) .OrderByDescending(itm => itm.OutTime) .FirstOrDefault(); // if Previous day attendence exists if (op != null) { // Previous Day's Out time Exists if (op.OutTime != DateTime.MinValue) { while (empAttnData.Count > 0) { // Take the Current First Attndence Data AttnRawData ordata = empAttnData[0]; // If PunchTime is less than Previous Date's OutTime OR // Difference is less Than 10 minutes if (ordata.PunchTime < op.OutTime || Math.Abs((ordata.PunchTime - op.OutTime).TotalMinutes) < 10) { // discard that attendence entry empAttnData.Remove(ordata); } else { break; } } } else { // What to do?? } } } if (isInOutApplicable) { empAttnData = empAttnData .OrderBy(erd => (int)erd.EntryMode) .ThenBy(erd => erd.PunchTime) .ToList(); } } } #endregion if (outSideDuties != null && outSideDuties.Count > 0) { empOutsideDuty = outSideDuties.Where(od => od.EmployeeID.Integer == emp.ID.Integer) .FirstOrDefault(); } if (leaves != null && leaves.Count > 0) { empLeaveEntry = leaves.Where(lv => lv.EmpID == emp.ID.Integer) .FirstOrDefault(); } EmployeeWorkPlanSetup oEmpWorkplan = empWPGroups.Where(oGr => oGr.EmployeeID.Integer == emp.ID.Integer) .SingleOrDefault(); // 3. If There is no EmployeeWorkPlanSetup then no attendence if (oEmpWorkplan == null) { oAttnRunSummary.AddError(EnumErrorType.WorkGroupUndefine, "Employee WorkPlan Not Defined.", emp); continue; } WorkPlanGroup oEmpWPlanGroup = workPlanGroups.Where(o => o.ID.Integer == oEmpWorkplan.WorkPlanGroupID.Integer) .Single(); #endregion #region Calcullate ShiftID and WorkPlan Day Type // not needed now // _empWPtype = oEmpWPlanGroup.Type; // Set Workplan Type // Get ShiftID from WorkPlan for Fixed workplan if (oEmpWPlanGroup.Type == EnumWorkPlanGroup.Fixed) { switch (Attdate.DayOfWeek) { case DayOfWeek.Friday: attnProcess.ShiftID = oEmpWorkplan.FridayShiftID.HasValue ? ID.FromInteger(oEmpWorkplan.FridayShiftID.Value) : null; break; case DayOfWeek.Monday: attnProcess.ShiftID = oEmpWorkplan.MondayShiftID.HasValue ? ID.FromInteger(oEmpWorkplan.MondayShiftID.Value) : null; break; case DayOfWeek.Saturday: attnProcess.ShiftID = oEmpWorkplan.SaturdayShiftID.HasValue ? ID.FromInteger(oEmpWorkplan.SaturdayShiftID.Value) : null; break; case DayOfWeek.Sunday: attnProcess.ShiftID = oEmpWorkplan.SundayShiftID.HasValue ? ID.FromInteger(oEmpWorkplan.SundayShiftID.Value) : null; break; case DayOfWeek.Thursday: attnProcess.ShiftID = oEmpWorkplan.ThursdayShiftID.HasValue ? ID.FromInteger(oEmpWorkplan.ThursdayShiftID.Value) : null; break; case DayOfWeek.Tuesday: attnProcess.ShiftID = oEmpWorkplan.TuesdayShiftID.HasValue ? ID.FromInteger(oEmpWorkplan.TuesdayShiftID.Value) : null; break; case DayOfWeek.Wednesday: attnProcess.ShiftID = oEmpWorkplan.WednesdayShiftID.HasValue ? ID.FromInteger(oEmpWorkplan.WednesdayShiftID.Value) : null; break; default: break; } } // Calcullate ShiftID for Rotation workplan else { if (empAttnData != null && empAttnData.Count > 0) { DateTime inTime = empAttnData[0].PunchTime; double nminutes = 10000; ObjectsTemplate osrs; if (oEmpWPlanGroup.Type == EnumWorkPlanGroup.Counter_Clock_2) { osrs = CounterClock2Rotation; } else if (oEmpWPlanGroup.Type == EnumWorkPlanGroup.Counter_Clock_3) { osrs = CounterClock3Rotation; } else if (oEmpWPlanGroup.Type == EnumWorkPlanGroup.Counter_Clock_4) { osrs = CounterClock4Rotation; } else { osrs = CounterClockRotation; } foreach (ShiftRotation sr in osrs) { Shift oshift = shifts.Where(o => o.ID.Integer == sr.ShiftID.Integer) .Single(); DateTime shiftInTime = Attdate.Subtract(Attdate.TimeOfDay).Add(oshift.InTime.TimeOfDay); TimeSpan ospan = (inTime - shiftInTime); if (nminutes > Math.Abs(ospan.TotalMinutes)) { nminutes = Math.Abs(ospan.TotalMinutes); attnProcess.ShiftID = sr.ShiftID; } } } } CalcullateWorkdayType(attnProcess, oEmpWorkplan, oEmpWPlanGroup); #endregion #region calculate In/Out time and With Other Things /* * if ShiftID found and attendence data exists * Calcullate InTime and OutTime * If elligable for OT calcullate OT according to DayType(Holiday or Workday) */ if (empAttnData != null && empAttnData.Count > 0 && attnProcess.ShiftID.Integer != 0) { attnProcess.AttenType = EnumAttendanceType.Present; Shift oshift = shifts.GetItem(attnProcess.ShiftID); #region Calcullate In Out if (!isInOutApplicable) { attnProcess.InTime = empAttnData[0].PunchTime; if (empAttnData.Count > 1) { attnProcess.OutTime = empAttnData[empAttnData.Count - 1].PunchTime; //TimeSpan otime = attnProcess.OutTime - attnProcess.InTime; // here we defined that total working hour is 19 hour in a day. for (int i = empAttnData.Count - 1; i >= 1; i--) { TimeSpan ntime = empAttnData[i].PunchTime - attnProcess.InTime; if (oEmpWPlanGroup.Type != EnumWorkPlanGroup.Fixed) { if (ntime.TotalHours <= 16) { attnProcess.OutTime = empAttnData[i].PunchTime; break; } } else { attnProcess.OutTime = DateTime.MinValue; if (empAttnData[i].PunchTime.Date > attnProcess.InTime.Date && empAttnData[i].PunchTime.Hour > 5) continue; else { attnProcess.OutTime = empAttnData[i].PunchTime; break; } } } if (attnProcess.OutTime != DateTime.MinValue) { if (Math.Abs((attnProcess.InTime - attnProcess.OutTime).TotalMinutes) < 10) { attnProcess.OutTime = DateTime.MinValue; } } } } else { List empInRawData = empAttnData.Where(rd => rd.EntryMode == EnumEntryMode.In) .OrderBy(rd => rd.PunchTime) .ToList(); List empOutRawData = empAttnData.Where(rd => rd.EntryMode == EnumEntryMode.Out) .OrderByDescending(rd => rd.PunchTime) .ToList(); if (empInRawData.Count > 0) { attnProcess.InTime = empInRawData[0].PunchTime; if (empOutRawData.Count > 0) { attnProcess.OutTime = empOutRawData[0].PunchTime; foreach (AttnRawData item in empOutRawData) { TimeSpan ntime = item.PunchTime - attnProcess.InTime; if (oEmpWPlanGroup.Type != EnumWorkPlanGroup.Fixed) { if (ntime.TotalHours <= 16) { attnProcess.OutTime = item.PunchTime; break; } } else { attnProcess.OutTime = DateTime.MinValue; if (item.PunchTime.Date > attnProcess.InTime.Date && item.PunchTime.Hour > 5) continue; else { attnProcess.OutTime = item.PunchTime; break; } } } } if (attnProcess.OutTime != DateTime.MinValue) { if (Math.Abs((attnProcess.InTime - attnProcess.OutTime).TotalMinutes) < 10) { attnProcess.OutTime = DateTime.MinValue; } } } } #endregion #region Calcullate Delay & Absent if (oshift.LateCalcualtion != 0 && attnProcess.InTime.TimeOfDay.Subtract(oshift.InTime.TimeOfDay).TotalMinutes > oshift.LateCalcualtion) { attnProcess.AttenType = EnumAttendanceType.Late; attnProcess.IsLate = true; _lateHour = attnProcess.InTime.TimeOfDay.Subtract(oshift.InTime.TimeOfDay).TotalMinutes/60; } if(oshift.DelayCalcualtion!=0 && attnProcess.InTime.TimeOfDay.Subtract(oshift.InTime.TimeOfDay).TotalMinutes > oshift.DelayCalcualtion) { attnProcess.AttenType = EnumAttendanceType.Delay; attnProcess.IsLate = true; _lateHour = attnProcess.InTime.TimeOfDay.Subtract(oshift.InTime.TimeOfDay).TotalMinutes / 60; } if (oshift.OutTime.TimeOfDay.Subtract(attnProcess.OutTime.TimeOfDay).TotalMinutes > 0) { _earlyHour = oshift.OutTime.TimeOfDay.Subtract(attnProcess.OutTime.TimeOfDay).TotalMinutes / 60; } if (oshift.hasAbsentTime) { if (oshift.InTime.TimeOfDay <= oshift.OutTime.TimeOfDay) { if (attnProcess.InTime.TimeOfDay > oshift.AbsentTime.TimeOfDay) { attnProcess.AttenType = EnumAttendanceType.Absent; } } else { if (oshift.AbsentTime.TimeOfDay <= oshift.OutTime.TimeOfDay) { if (attnProcess.InTime.TimeOfDay > oshift.AbsentTime.TimeOfDay && attnProcess.InTime.TimeOfDay <= oshift.OutTime.TimeOfDay) { attnProcess.AttenType = EnumAttendanceType.Absent; } } else { if(!(attnProcess.InTime.TimeOfDay < oshift.AbsentTime.TimeOfDay && attnProcess.InTime.TimeOfDay > oshift.OutTime.TimeOfDay)) { attnProcess.AttenType = EnumAttendanceType.Absent; } } } } #endregion #region CalcullateOT // If Eligable for OT calcullate OT if(emp.IsEligibleOT && attnProcess.AttenType == EnumAttendanceType.Present) { CalcullateOT(attnProcess, oshift, Attdate); } #endregion // here _lateHour & _earlyHour is set to '0' // May need to calcullate in future attnProcess.LateHour = _lateHour; attnProcess.EarlyHour = _earlyHour; } #endregion #region Calcullate MobileAttendence if Not found in rawData if (attnProcess.InTime == DateTime.MinValue && oEmpFieldTracks.Any(obj=>obj.EmployeeID.Integer == attnProcess.EmployeeID.Integer)) { List oCurrentEmpFTracks = oEmpFieldTracks.Where(obj => obj.EmployeeID.Integer == attnProcess.EmployeeID.Integer).OrderBy(o=>o.TranDateTime).ToList(); attnProcess.InTime = oCurrentEmpFTracks[0].TranDateTime; if(oCurrentEmpFTracks.Count>1) attnProcess.OutTime = oCurrentEmpFTracks[oCurrentEmpFTracks.Count-1].TranDateTime; attnProcess.AttenType = EnumAttendanceType.Present; } #endregion #region Calcullate not present status if (attnProcess.InTime == DateTime.MinValue) { if (empOutsideDuty != null) { attnProcess.AttenType = EnumAttendanceType.OutSideDuty; attnProcess.ReferenceID = empOutsideDuty.ID; } else if (empLeaveEntry != null) { // Check wether Ignore Holidays if (lvParameters.Where(x => x.LeaveId == empLeaveEntry.LeaveID.Integer).Any(x => x.IgnoreHoliday)) { if (attnProcess.WorkDayType == EnumWorkPlanDayType.WeeklyHoliday) { attnProcess.AttenType = EnumAttendanceType.WeeklyHoliday; } else if (attnProcess.WorkDayType == EnumWorkPlanDayType.NationalHoliday) { attnProcess.AttenType = EnumAttendanceType.Holiday; } else { attnProcess.AttenType = EnumAttendanceType.Leave; attnProcess.ReferenceID = empLeaveEntry.LeaveID; } } else { attnProcess.AttenType = EnumAttendanceType.Leave; attnProcess.ReferenceID = empLeaveEntry.LeaveID; } } else if (attnProcess.WorkDayType == EnumWorkPlanDayType.WeeklyHoliday) { attnProcess.AttenType = EnumAttendanceType.WeeklyHoliday; } else if (attnProcess.WorkDayType == EnumWorkPlanDayType.NationalHoliday) { attnProcess.AttenType = EnumAttendanceType.Holiday; } else { attnProcess.AttenType = EnumAttendanceType.Absent; } } #endregion dailyattProcesses.Add(attnProcess); // Add the process to collection } //if (dailyattProcesses.Count == 0) // throw new ServiceException("After process Raw data, no attandance found for the selected date."); //DailyAttnProcess.Save(dailyattProcesses, false); DailyAttnProcess.SaveAuto(dailyattProcesses, oAttnRunSummary); } catch (ServiceException ex) { oAttnRunSummary.AddError(EnumErrorType.ServiceException, ex.Message, null); oAttnRunSummary.Save(); throw new ServiceException(ex.Message, ex); } catch (Exception e) { oAttnRunSummary.AddError(EnumErrorType.Exception, e.Message, null); oAttnRunSummary.Save(); throw new ServiceException(e.Message, e); } } //public void ProcessOld(DateTime Attdate) //{ // #region Process // try // { // DateTime startTime = new DateTime(Attdate.Year, Attdate.Month, Attdate.Day, 5, 30, 0); // DateTime ToTime = Attdate.AddDays(1); // ToTime = new DateTime(ToTime.Year, ToTime.Month, ToTime.Day, 10, 0, 0); // ObjectsTemplate CcRotation = ShiftRotation.Get(EnumWorkPlanGroup.Counter_Clock); // ObjectsTemplate TwoShiftRotation = ShiftRotation.Get(EnumWorkPlanGroup.Counter_Clock_2); // ObjectsTemplate empWPGroups = EmployeeWorkPlanSetup.Get(); // ObjectsTemplate oWPGroup = WorkPlanGroup.Get(); // ObjectsTemplate employees = Employee.Get(); // ObjectsTemplate attRawdata = AttnRawData.Get(startTime, ToTime);// get raw data by a date and order by date, employee, punchTime // ObjectsTemplate dailyattProcesses = new ObjectsTemplate(); // ObjectsTemplate outSideDuties = EmployeeOutsideDuty.Get(Attdate); // get transaction by the a rate // ObjectsTemplate monthlyWorkPlans = MonthlyWorkPlan.Get(Attdate); // get workplans by the date // ObjectsTemplate leaves = LeaveEntry.Get(Attdate); // workplans by the date // ObjectsTemplate buyers = BuyerSetup.Get(); // ObjectsTemplate bDailyattProcesses = new ObjectsTemplate(); // ObjectsTemplate shifts = Shift.Get(); // ObjectsTemplate workPlanGroups = WorkPlanGroup.Get(); // EmployeeWorkPlanSetup oesetup = null; // //for considering employess discontinued after the process date // ObjectsTemplate discontinueEmps = Employee.GetDiscontinueEmp(Attdate, DateTime.Now); // if (discontinueEmps != null && discontinueEmps.Count > 0) // { // foreach (Employee emp in discontinueEmps) // { // if (employees.Contains(emp.ID) == false) // employees.Add(emp); // } // } // ObjectsTemplate prvDayattns = DailyAttnProcess.Get(Attdate.AddDays(-1)); // // manual entry Actual // ObjectsTemplate manualAttnProcesses = DailyAttnProcess.GetManualProcess(Attdate); // foreach (DailyAttnProcess item in manualAttnProcesses) // { // dailyattProcesses.Add(item); // } // //manual entry Buyer // ObjectsTemplate manualAttnEntry = BuyerDailyAttProcess.GetManualEntry(Attdate); // foreach (BuyerDailyAttProcess item in manualAttnEntry) // { // bDailyattProcesses.Add(item); // } // if (monthlyWorkPlans == null || monthlyWorkPlans.Count == 0) // throw new ServiceException("Current month monthly work plan not yet save."); // int nCount = 0; // _empWPtype = EnumWorkPlanGroup.Fixed; // foreach (Employee emp in employees) // { // if (emp.EmployeeNo == "99000254") // { // emp.EmployeeNo = "99000254"; // } // if (emp.JoiningDate > Attdate) continue; // nCount = nCount + 1; // #region // var manualEntry = from DailyAttnProcess item in manualAttnProcesses // where item.EmployeeID == emp.ID // select item; // if (manualEntry.ToList().Count > 0) continue; // DailyAttnProcess attnProcess = new DailyAttnProcess(); // attnProcess.AttnDate = Attdate; // attnProcess.EmployeeID = emp.ID; // attnProcess.IsManualEntry = false; // _lateHour = 0; _earlyHour = 0; _oTHour = 0; // MonthlyWorkPlan empMonthlyWorkPlan = null; // List empAttnData = null; // EmployeeOutsideDuty empOutsideDuty = null; // LeaveEntry empLeaveEntry = null; // if (attRawdata != null && attRawdata.Count > 0) // { // empAttnData = attRawdata.Where(erd => erd.EmployeeID.Integer == emp.ID.Integer) // .OrderBy(erd => erd.PunchTime) // .ToList(); // //empAttnData = GetRawData(attRawdata, emp.ID); // if (empAttnData.Count > 0 && empAttnData[0].PunchTime > new DateTime(ToTime.Year, ToTime.Month, ToTime.Day, 2, 0, 0)) // empAttnData = new ObjectsTemplate(); // DailyAttnProcess op = prvDayattns.Find(delegate(DailyAttnProcess item) // { return item.EmployeeID.Integer == emp.ID.Integer; }); // if (empAttnData.Count > 0 && op != null && op.OutTime != DateTime.MinValue) // { // while (true) // { // if (empAttnData.Count == 0) break; // AttnRawData ordata = empAttnData[0]; // if (Math.Abs((ordata.PunchTime - op.OutTime).TotalMinutes) < 10) // { // empAttnData.Remove(ordata); // } // else break; // } // } // } // if (outSideDuties != null && outSideDuties.Count > 0) // { // empOutsideDuty = outSideDuties.Find(delegate(EmployeeOutsideDuty item) // { return item.EmployeeID == emp.ID; }); // } // if (leaves != null && leaves.Count > 0) // { // empLeaveEntry = leaves.Find(delegate(LeaveEntry item) // { return item.EmpID == emp.ID.Integer; }); // } // #endregion // #region find monthly workplan // if (monthlyWorkPlans != null && monthlyWorkPlans.Count > 0) // { // empMonthlyWorkPlan = monthlyWorkPlans.Find(delegate(MonthlyWorkPlan item) // { return item.EmployeeID == emp.ID; }); // if (empMonthlyWorkPlan != null) // { // oesetup = empWPGroups.Find(delegate(EmployeeWorkPlanSetup item) // { return item.EmployeeID.Integer == emp.ID.Integer; }); // if (oesetup == null) _empWPtype = EnumWorkPlanGroup.Fixed; // else // { // WorkPlanGroup wpgroup = workPlanGroups.Find(delegate(WorkPlanGroup wpitem) // { return wpitem.ID.Integer == oesetup.WorkPlanGroupID.Integer; }); // _empWPtype = wpgroup.Type; // } // if (!empMonthlyWorkPlan.ShiftID.IsUnassigned) // attnProcess.ShiftID = empMonthlyWorkPlan.ShiftID; // if (_empWPtype != EnumWorkPlanGroup.Fixed && empAttnData != null && empAttnData.Count > 0) // { // DateTime inTime = empAttnData[0].PunchTime; // double nminutes = 10000; // ObjectsTemplate osrs = CcRotation; // if (_empWPtype == EnumWorkPlanGroup.Counter_Clock_2) osrs = TwoShiftRotation; // foreach (ShiftRotation sr in osrs) // { // Shift oshift = shifts.Find(delegate(Shift item) // { // return item.ID.Integer == sr.ShiftID.Integer; // }); // DateTime shiftInTime = Attdate.Subtract(Attdate.TimeOfDay).Add(oshift.InTime.TimeOfDay); // TimeSpan ospan = (inTime - shiftInTime); // if (nminutes > Math.Abs(ospan.TotalMinutes)) // { // nminutes = Math.Abs(ospan.TotalMinutes); // attnProcess.ShiftID = sr.ShiftID; // } // } // } // if (!empMonthlyWorkPlan.HolidayID.IsUnassigned) // attnProcess.ReferenceID = empMonthlyWorkPlan.HolidayID; // } // else continue; // } // #endregion find monthly workplan // #region calculate In/Out time and OT hour // if (empAttnData != null && empAttnData.Count > 0 && attnProcess.ShiftID.Integer != 0) // { // Shift oshift = shifts.GetItem(attnProcess.ShiftID); // attnProcess.InTime = empAttnData[0].PunchTime; // if (empAttnData.Count > 1) // { // attnProcess.OutTime = empAttnData[empAttnData.Count - 1].PunchTime; // TimeSpan otime = attnProcess.OutTime - attnProcess.InTime; // // here we defined that total working hour is 19 hour in a day. // for (int i = empAttnData.Count - 1; i >= 1; i--) // { // TimeSpan ntime = empAttnData[i].PunchTime - attnProcess.InTime; // if (_empWPtype != EnumWorkPlanGroup.Fixed) // { // if (ntime.TotalHours <= 16) // { // attnProcess.OutTime = empAttnData[i].PunchTime; // break; // } // } // else // { // attnProcess.OutTime = DateTime.MinValue; // if (empAttnData[i].PunchTime.Date > attnProcess.InTime.Date && empAttnData[i].PunchTime.Hour > 5) // continue; // else // { // attnProcess.OutTime = empAttnData[i].PunchTime; // break; // } // } // } // if (attnProcess.OutTime != DateTime.MinValue) // { // if (Math.Abs((attnProcess.InTime - attnProcess.OutTime).TotalMinutes) < 10) // { // attnProcess.OutTime = DateTime.MinValue; // } // } // } // #region Old Code, Do not remove // //Shift oshift = shifts.GetItem(attnProcess.ShiftID); // //DateTime shiftIntimeStart = Attdate.Subtract(Attdate.TimeOfDay).Add(oshift.InTime.TimeOfDay).Subtract(new TimeSpan(2, 0, 0)); // //DateTime shiftIntimeEnd = Attdate.Subtract(Attdate.TimeOfDay).Add(oshift.InTime.TimeOfDay).Add(new TimeSpan(4, 0, 0)); // //DateTime shiftOutTimeEnd = DateTime.MinValue; // //if (oshift.InTime > oshift.OutTime) // //{ // // shiftOutTimeEnd = Attdate.AddDays(1).Subtract(Attdate.TimeOfDay).Add(oshift.OutTime.TimeOfDay).Add(new TimeSpan(6, 0, 0)); // //} // //else // //{ // // shiftOutTimeEnd = Attdate.Subtract(Attdate.TimeOfDay).Add(oshift.OutTime.TimeOfDay).Add(new TimeSpan(6, 0, 0)); // //} // //bool inTime = false; // //foreach (AttnRawData attndata in empAttnData) // //{ // // if (inTime == false && attndata.PunchTime >= shiftIntimeStart && attndata.PunchTime <= shiftIntimeEnd) // // { // // attnProcess.InTime = attndata.PunchTime; // // inTime = true; // // } // // if (inTime == true && attndata.PunchTime > shiftIntimeEnd && attndata.PunchTime <= shiftOutTimeEnd) // // { // // attnProcess.OutTime = attndata.PunchTime; // // } // //} // #endregion Old Code, Do not remove // attnProcess.AttenType = GetAttnType(attnProcess.InTime, attnProcess.OutTime, oshift, Attdate, empMonthlyWorkPlan); // if (emp.IsEligibleOT) // { // attnProcess.LateHour = _lateHour; // attnProcess.EarlyHour = _earlyHour; // attnProcess.OTHour = _oTHour; // } // } // #endregion calculate In/Out time and OT hour // #region present status // if (attnProcess.InTime == DateTime.MinValue) // { // if (empOutsideDuty != null) // { // attnProcess.AttenType = EnumAttendanceType.OutSideDuty; // attnProcess.ReferenceID = empOutsideDuty.ID; // } // else if (empLeaveEntry != null) // { // attnProcess.AttenType = EnumAttendanceType.Leave; // attnProcess.ReferenceID = empLeaveEntry.LeaveID; // } // else if (empMonthlyWorkPlan != null && empMonthlyWorkPlan.Type != EnumWorkPlanDayType.WorkingDay) // { // if (empMonthlyWorkPlan.Type == EnumWorkPlanDayType.NationalHoliday) // attnProcess.AttenType = EnumAttendanceType.Holiday; // else if (empMonthlyWorkPlan.Type == EnumWorkPlanDayType.WeeklyHoliday) // attnProcess.AttenType = EnumAttendanceType.WeeklyHoliday; // } // else attnProcess.AttenType = EnumAttendanceType.Absent; // if (_empWPtype == EnumWorkPlanGroup.Counter_Clock && oesetup.WeekEndOn != null // && attnProcess.AttnDate.DayOfWeek == (DayOfWeek)oesetup.WeekEndOn // && attnProcess.AttenType != EnumAttendanceType.Holiday) // { // attnProcess.AttenType = EnumAttendanceType.WeeklyHoliday; // } // } // #endregion present status // dailyattProcesses.Add(attnProcess); // #region BuyerWise Process // //int exceesOTDays = 3; // foreach (BuyerSetup buyerSetup in buyers) // { // BuyerDailyAttProcess bDailyAttnProcess = new BuyerDailyAttProcess(); // bDailyAttnProcess.BuyerID = buyerSetup.ID; // bDailyAttnProcess.AttnDate = attnProcess.AttnDate; // bDailyAttnProcess.Comments = attnProcess.Comments; // bDailyAttnProcess.EmployeeID = attnProcess.EmployeeID; // bDailyAttnProcess.IsManualEntry = attnProcess.IsManualEntry; // bDailyAttnProcess.ShiftID = attnProcess.ShiftID; // bDailyAttnProcess.AttenType = attnProcess.AttenType; // bDailyAttnProcess.ReferenceID = attnProcess.ReferenceID; // #region Fixed workpan buyer process // if (_empWPtype == EnumWorkPlanGroup.Fixed) // { // if (empMonthlyWorkPlan != null && empMonthlyWorkPlan.Type != EnumWorkPlanDayType.WorkingDay) // { // bDailyAttnProcess.ReferenceID = attnProcess.ReferenceID; // bDailyAttnProcess.LateHour = 0; // bDailyAttnProcess.EarlyHour = 0; // WorkPlanGroup workPlanGroup = workPlanGroups.GetItem(empMonthlyWorkPlan.WorkPlanGroupID); // if (buyerSetup.IsHolidayOTAllowed && workPlanGroup.Type != EnumWorkPlanGroup.Counter_Clock) // { // //DateTime[] dates = GetFirstTwoFridays(Attdate); // if (Attdate == GetFirstFriday(Attdate)) // { // bDailyAttnProcess.InTime = attnProcess.InTime; // if (attnProcess.OTHour > buyerSetup.MaxHolidayOTHour) // { // bDailyAttnProcess.OTHour = buyerSetup.MaxHolidayOTHour; // bDailyAttnProcess.OutTime = attnProcess.InTime.AddHours(buyerSetup.MaxHolidayOTHour); // } // else // { // bDailyAttnProcess.OTHour = attnProcess.OTHour; // bDailyAttnProcess.OutTime = attnProcess.InTime.AddHours(bDailyAttnProcess.OTHour); // } // } // } // else // { // bDailyAttnProcess.OTHour = 0; // } // } // else // { // // in Counter Clock wise shift there should be no OTHour and in & out time should be shift In & out Time // Shift oShift = attnProcess.Shift; // WorkPlanGroup workPlanGroup = workPlanGroups.GetItem(empMonthlyWorkPlan.WorkPlanGroupID); // bDailyAttnProcess.InTime = attnProcess.InTime; // bDailyAttnProcess.ReferenceID = attnProcess.ReferenceID; // bDailyAttnProcess.LateHour = attnProcess.LateHour; // bDailyAttnProcess.EarlyHour = attnProcess.EarlyHour; // bDailyAttnProcess.OTHour = GetOTHourForBuyer(buyerSetup, attnProcess.OTHour); // if (bDailyAttnProcess.OTHour > 0) // { // int rand = 0; // Random rd = new Random(); // rand = rd.Next(0, 15); // //bDailyAttnProcess.OTHour = exceesOTDays != 0 ? bDailyAttnProcess.OTHour + 1 : bDailyAttnProcess.OTHour; // //exceesOTDays--; // List dates = GetLastTenWorkingDays(Attdate); // if (buyerSetup.AcceptHour == 95) // { // if (dates.Contains(Attdate)) // { // bDailyAttnProcess.OTHour = bDailyAttnProcess.OTHour + 1; // } // } // if (oShift.InTime > oShift.OutTime) // { // bDailyAttnProcess.OutTime = Attdate.AddDays(1).Subtract(Attdate.TimeOfDay).Add(oShift.OutTime.TimeOfDay).AddHours(bDailyAttnProcess.OTHour).AddMinutes(Convert.ToDouble(rand)); // } // else // { // bDailyAttnProcess.OutTime = Attdate.Subtract(Attdate.TimeOfDay).Add(oShift.OutTime.TimeOfDay).AddHours(bDailyAttnProcess.OTHour).AddMinutes(Convert.ToDouble(rand)); // } // } // else // { // bDailyAttnProcess.OutTime = attnProcess.OutTime; // } // // } // } // } // #endregion Fixed workpan buyer process // #region counter clock buyer process // else if (_empWPtype == EnumWorkPlanGroup.Counter_Clock || _empWPtype == EnumWorkPlanGroup.Counter_Clock_2) // { // EnumAttendanceType ntype = bDailyAttnProcess.AttenType; //EnumAttendanceType.Present; // if (empMonthlyWorkPlan != null && empMonthlyWorkPlan.Type != EnumWorkPlanDayType.WorkingDay) // { // if (empMonthlyWorkPlan.Type == EnumWorkPlanDayType.NationalHoliday) // ntype = EnumAttendanceType.Holiday; // else if (empMonthlyWorkPlan.Type == EnumWorkPlanDayType.WeeklyHoliday) // ntype = EnumAttendanceType.WeeklyHoliday; // } // bDailyAttnProcess.AttenType = ntype; // if (ntype == EnumAttendanceType.Present) // { // Shift oShift = shifts.GetItem(empMonthlyWorkPlan.ShiftID); // if (oShift == null) continue; // int rand = 0; // Random rd = new Random(); // rand = rd.Next(0, 15); // bDailyAttnProcess.InTime = Attdate.Subtract(Attdate.TimeOfDay).Add(oShift.InTime.TimeOfDay).AddMinutes(Convert.ToDouble(rand)); // rand = rd.Next(0, 15); // if (oShift.InTime > oShift.OutTime) // bDailyAttnProcess.OutTime = Attdate.AddDays(1).Subtract(Attdate.TimeOfDay).Add(oShift.OutTime.TimeOfDay).AddMinutes(Convert.ToDouble(rand)); // else // bDailyAttnProcess.OutTime = Attdate.Subtract(Attdate.TimeOfDay).Add(oShift.OutTime.TimeOfDay).AddMinutes(Convert.ToDouble(rand)); // } // else // { // bDailyAttnProcess.InTime = DateTime.MinValue; // bDailyAttnProcess.OutTime = DateTime.MinValue; // } // } // #endregion counter clock buyer process // bDailyattProcesses.Add(bDailyAttnProcess); // } // #endregion // //if (RefreshStatus != null) // //{ // // object sender = "Total employee:" + employees.Count.ToString() + " left:" + Convert.ToString(employees.Count - nCount); // // RefreshStatus(sender, null); // //} // } // if (dailyattProcesses.Count == 0) // throw new ServiceException("After process Raw data, no attandance found for the selected date."); // DailyAttnProcess.Save(dailyattProcesses, false); // //BuyerDailyAttProcess.Save(bDailyattProcesses, false); // } // catch (Exception e) // { // throw new ServiceException(e.Message, e); // } // #endregion //} //#region Attendance Process for CounterClockEmployee //#region odd ////for counterClock Employee ////public void ProcessCounterClockEmp(DateTime Attdate) ////{ //// try //// { //// ObjectsTemplate dAPMorningShift = null; //// ObjectsTemplate dAPEveningShift = null; //// ObjectsTemplate dAPNightShift = null; //// //for previous Day Process(AttnDate) //// ObjectsTemplate rawDataEvening = AttnRawData.Get(Attdate.Subtract(Attdate.TimeOfDay).Add(_counterClockShifts[1].InTime.TimeOfDay).Subtract(new TimeSpan(3, 0, 0)), Attdate.Subtract(Attdate.TimeOfDay).Add(_counterClockShifts[1].InTime.TimeOfDay).Add(new TimeSpan(4, 59, 0))); //// ObjectsTemplate rawDataNight = AttnRawData.Get(Attdate.Subtract(Attdate.TimeOfDay).Add(_counterClockShifts[2].InTime.TimeOfDay).Subtract(new TimeSpan(3, 0, 0)), Attdate.Subtract(Attdate.TimeOfDay).Add(_counterClockShifts[2].InTime.TimeOfDay).Add(new TimeSpan(4, 59, 0))); //// //for current Day Process(AttnDate+1) //// ObjectsTemplate rawDataMorning = AttnRawData.Get(Attdate.Subtract(Attdate.TimeOfDay).AddDays(1).Add(_counterClockShifts[0].InTime.TimeOfDay).Subtract(new TimeSpan(3, 0, 0)), Attdate.Subtract(Attdate.TimeOfDay).AddDays(1).Add(_counterClockShifts[0].InTime.TimeOfDay).Add(new TimeSpan(4, 59, 0))); //// //process outTime of morning shift and Nightshift(Previous Date) and in time of evening shift //// dAPMorningShift = DailyAttnProcess.GetWhrOutTimeIsNull(Attdate, _counterClockShifts[0].ID); //// dAPNightShift = DailyAttnProcess.GetWhrOutTimeIsNull(Attdate.AddDays(-1), _counterClockShifts[2].ID); //// if (rawDataEvening != null) //// { //// ProcessOutTime(rawDataEvening, dAPMorningShift, dAPNightShift, Attdate, _counterClockShifts[1], false); //// } //// //process outtime of evening shift AND Morning Shift and intime of night shift //// dAPEveningShift = DailyAttnProcess.GetWhrOutTimeIsNull(Attdate, _counterClockShifts[1].ID); //// dAPMorningShift = DailyAttnProcess.GetWhrOutTimeIsNull(Attdate, _counterClockShifts[0].ID); //// if (rawDataNight != null) //// { //// ProcessOutTime(rawDataNight, dAPEveningShift, dAPMorningShift, Attdate, _counterClockShifts[2], false); //// } //// //process outtime of nightshift And Evening Shift and intime of morning shift(currentDay) //// dAPNightShift = DailyAttnProcess.GetWhrOutTimeIsNull(Attdate, _counterClockShifts[2].ID); //// dAPEveningShift = DailyAttnProcess.GetWhrOutTimeIsNull(Attdate, _counterClockShifts[1].ID); //// if (rawDataMorning != null) //// { //// ProcessOutTime(rawDataMorning, dAPNightShift, dAPEveningShift, Attdate, _counterClockShifts[0], true); //// } //// //process absent employee //// ProcessAbsentEmp(Attdate); //// ProcessBuyerWiseCounterClockEmp(Attdate); //// } //// catch (Exception e) //// { //// throw new ServiceException(e.Message, e); //// } ////} ////private void ProcessOutTime(ObjectsTemplate rawData, ObjectsTemplate dAProcesses1, ObjectsTemplate dAProcesses2, DateTime Attdate, Shift shift, bool isNightShift) ////{ //// try //// { //// ObjectsTemplate dAProcessesToSave = new ObjectsTemplate(); //// AttnRawData empAttnData = null; //// Shift oShift = null; //// Employee emp = null; //// if (dAProcesses1 != null) //// { //// foreach (DailyAttnProcess dAP in dAProcesses1) //// { //// empAttnData = GetRawData(rawData, dAP.EmployeeID, false); //// if (empAttnData != null) //// { //// emp = _employees.GetItem(dAP.EmployeeID); //// dAP.OutTime = empAttnData.PunchTime; //// oShift = _counterClockShifts.GetItem(dAP.ShiftID); //// if (emp != null && emp.IsEligibleOT) //// { //// if (isNightShift) //// { //// dAP.OTHour = GetOTHour(Attdate.AddDays(1), oShift, dAP.InTime, dAP.OutTime, dAP.AttenType); //// } //// else //// { //// dAP.OTHour = GetOTHour(Attdate, oShift, dAP.InTime, dAP.OutTime, dAP.AttenType); //// } //// } //// rawData = RemoveOutTime(rawData, dAP.EmployeeID); //// //dailyAttnProcessesToSave.Add(dAP); //// } //// dAProcessesToSave.Add(dAP); //// } //// } //// if (dAProcesses2 != null) //// { //// foreach (DailyAttnProcess dAP in dAProcesses2) //// { //// empAttnData = GetRawData(rawData, dAP.EmployeeID, false); //// if (empAttnData != null) //// { //// dAP.OutTime = empAttnData.PunchTime; //// oShift = _counterClockShifts.GetItem(dAP.ShiftID); //// if (isNightShift) //// { //// dAP.OTHour = GetOTHour(Attdate.AddDays(1), oShift, dAP.InTime, dAP.OutTime, dAP.AttenType); //// } //// else //// { //// dAP.OTHour = GetOTHour(Attdate, oShift, dAP.InTime, dAP.OutTime, dAP.AttenType); //// } //// rawData = RemoveOutTime(rawData, dAP.EmployeeID); //// //dailyAttnProcessesToSave.Add(dAP); //// } //// dAProcessesToSave.Add(dAP); //// } //// } //// if (dAProcessesToSave.Count > 0) //// { //// DailyAttnProcess.Save(dAProcessesToSave, true); //// } //// if (isNightShift) //// { //// ProcessInTime(rawData, shift, Attdate.AddDays(1)); //// } //// else //// { //// ProcessInTime(rawData, shift, Attdate); //// } //// } //// catch (Exception e) //// { //// throw new ServiceException(e.Message, e); //// } ////} ////private void ProcessInTime(ObjectsTemplate rawData, Shift shift, DateTime Attdate) ////{ //// try //// { //// ObjectsTemplate dAProcess = new ObjectsTemplate(); //// _monthlyWorkPlans = MonthlyWorkPlan.GetByDateAndWPGType(Attdate, EnumWorkPlanGroup.CounterClock); //// DailyAttnProcess dAP = null; //// MonthlyWorkPlan empMonthlyWorkPlan = null; //// if (_employees != null) //// { //// AttnRawData empAttnData = null; //// foreach (Employee item in _employees) //// { //// empAttnData = GetRawData(rawData, item.ID, true); //// if (empAttnData != null) //// { //// dAP = new DailyAttnProcess(); //// dAP.AttnDate = Attdate; //// dAP.EmployeeID = item.ID; //// dAP.ShiftID = shift.ID; //// dAP.InTime = empAttnData.PunchTime; //// dAP.IsManualEntry = false; //// if (_monthlyWorkPlans != null && _monthlyWorkPlans.Count > 0) //// { //// empMonthlyWorkPlan = _monthlyWorkPlans.Find(delegate(MonthlyWorkPlan mWP) //// { return mWP.EmployeeID == item.ID; }); //// } //// if (empMonthlyWorkPlan != null) //// { //// dAP.AttenType = GetAttendanceType(empMonthlyWorkPlan); //// } //// else //// { //// dAP.AttenType = EnumAttendanceType.Present; //// } //// dAProcess.Add(dAP); //// } //// } //// DailyAttnProcess.Save(dAProcess, true); //// } //// } //// catch (Exception e) //// { //// throw new ServiceException(e.Message, e); //// } ////} //private EnumAttendanceType GetAttendanceType(MonthlyWorkPlan empMonthlyWorkPlan) //{ // EnumAttendanceType attnType = EnumAttendanceType.Present; // if (empMonthlyWorkPlan.Type == EnumWorkPlanDayType.NationalHoliday) // { // attnType = EnumAttendanceType.Holiday; // } // else if (empMonthlyWorkPlan.Type == EnumWorkPlanDayType.WeeklyHoliday) // { // attnType = EnumAttendanceType.WeeklyHoliday; // } // return attnType; //} //private double GetOTHour(DateTime AttDate, Shift shift, DateTime inTime, DateTime outTime, EnumAttendanceType attnType) //{ // double OTHour = 0.0; // DateTime shiftOutTime = AttDate.Subtract(AttDate.TimeOfDay).Add(shift.OutTime.TimeOfDay); // if (attnType == EnumAttendanceType.Present) // { // if (outTime > shiftOutTime) // { // TimeSpan OT = outTime.Subtract(shiftOutTime); // OTHour = Convert.ToDouble(OT.Hours) + (Convert.ToDouble(OT.Minutes) >= Convert.ToDouble(shift.MinimumOTHour) ? 1 : 0); // } // else // { // OTHour = 0.0; // } // } // //for any Kind of holiday total workHour will be treated as OT // else // { // TimeSpan OT = outTime.Subtract(inTime); // OTHour = Convert.ToDouble(OT.Hours) + (Convert.ToDouble(OT.Minutes) >= Convert.ToDouble(shift.MinimumOTHour) ? 1 : 0); // } // return OTHour; //} //private void ProcessAbsentEmp(DateTime attnDate) //{ // try // { // ObjectsTemplate dailtAttnProcess = new ObjectsTemplate(); // ObjectsTemplate employees = Employee.GetAbsentEmp(attnDate, EnumWorkPlanGroup.CounterClock); // if (employees != null && employees.Count > 0) // { // ObjectsTemplate monthlyWorkPlans = MonthlyWorkPlan.GetByDateAndWPGType(attnDate, EnumWorkPlanGroup.CounterClock); // ObjectsTemplate leaves = LeaveEntry.Get(attnDate); // ObjectsTemplate outSideDuties = EmployeeOutsideDuty.Get(attnDate); // MonthlyWorkPlan empMonthlyWorkPlan = null; // DailyAttnProcess attnProcess = null; // EmployeeOutsideDuty empOutsideDuty = null; // LeaveEntry empLeaveEntry = null; // foreach (Employee emp in employees) // { // attnProcess = new DailyAttnProcess(); // attnProcess.EmployeeID = emp.ID; // attnProcess.AttnDate = attnDate; // if (monthlyWorkPlans != null && monthlyWorkPlans.Count > 0) // { // empMonthlyWorkPlan = monthlyWorkPlans.Find(delegate(MonthlyWorkPlan item) // { return item.EmployeeID == emp.ID; }); // if (empMonthlyWorkPlan != null) // { // if (!empMonthlyWorkPlan.ShiftID.IsUnassigned) // { // attnProcess.ShiftID = empMonthlyWorkPlan.ShiftID; // } // if (!empMonthlyWorkPlan.HolidayID.IsUnassigned) // { // attnProcess.ReferenceID = empMonthlyWorkPlan.HolidayID; // } // } // } // if (outSideDuties != null && outSideDuties.Count > 0) // { // empOutsideDuty = outSideDuties.Find(delegate(EmployeeOutsideDuty item) // { return item.EmployeeID == emp.ID; }); // } // if (leaves != null && leaves.Count > 0) // { // empLeaveEntry = leaves.Find(delegate(LeaveEntry item) // { return item.EmpID == emp.ID.Integer; }); // } // if (empOutsideDuty != null) // { // attnProcess.AttenType = EnumAttendanceType.OutSideDuty; // attnProcess.ReferenceID = empOutsideDuty.ID; // } // else if (empLeaveEntry != null) // { // attnProcess.AttenType = EnumAttendanceType.Leave; // attnProcess.ReferenceID = empLeaveEntry.LeaveID; // } // else if (empMonthlyWorkPlan != null && empMonthlyWorkPlan.Type != EnumWorkPlanDayType.WorkingDay) // { // if (empMonthlyWorkPlan.Type == EnumWorkPlanDayType.NationalHoliday) // { // attnProcess.AttenType = EnumAttendanceType.Holiday; // } // else if (empMonthlyWorkPlan.Type == EnumWorkPlanDayType.WeeklyHoliday) // { // attnProcess.AttenType = EnumAttendanceType.WeeklyHoliday; // } // } // else // { // attnProcess.AttenType = EnumAttendanceType.Absent; // } // dailtAttnProcess.Add(attnProcess); // } // if (dailtAttnProcess.Count > 0) // { // DailyAttnProcess.Save(dailtAttnProcess, true); // } // } // } // catch (Exception e) // { // throw new ServiceException(e.Message, e); // } //} //private AttnRawData GetRawData(ObjectsTemplate rawData, ID employeeID, bool isInTime) //{ // AttnRawData empRawData = null; // foreach (AttnRawData item in rawData) // { // if (item.EmployeeID == employeeID) // { // empRawData = item; // if (isInTime) // { // break; // } // } // } // return empRawData; //} //private ObjectsTemplate RemoveOutTime(ObjectsTemplate rawData, ID employeeID) //{ // ObjectsTemplate empRawData = new ObjectsTemplate(); // foreach (AttnRawData item in rawData) // { // if (item.EmployeeID != employeeID) // { // empRawData.Add(item); // } // } // return empRawData; //} //#endregion //#endregion //private void ProcessBuyerWiseCounterClockEmp(DateTime Attdate) //{ // try // { // ObjectsTemplate dBuyerDAProcess = new ObjectsTemplate(); // BuyerDailyAttProcess bDailyAttnProcess = null; // ObjectsTemplate buyers = BuyerSetup.Get(); // ObjectsTemplate dAProcesses = DailyAttnProcess.GetProcessByWPG(EnumWorkPlanGroup.CounterClock, Attdate); // if (_monthlyWorkPlans == null) // { // _monthlyWorkPlans = MonthlyWorkPlan.GetByDateAndWPGType(Attdate, EnumWorkPlanGroup.CounterClock); // } // if (buyers != null && _monthlyWorkPlans != null && dAProcesses != null) // { // foreach (BuyerSetup buyer in buyers) // { // Shift oShift = null; // MonthlyWorkPlan empMonthlyWorkPlan = null; // foreach (DailyAttnProcess attnProcess in dAProcesses) // { // bDailyAttnProcess = new BuyerDailyAttProcess(); // bDailyAttnProcess.BuyerID = buyer.ID; // bDailyAttnProcess.AttnDate = attnProcess.AttnDate; // bDailyAttnProcess.Comments = attnProcess.Comments; // bDailyAttnProcess.EmployeeID = attnProcess.EmployeeID; // bDailyAttnProcess.IsManualEntry = attnProcess.IsManualEntry; // bDailyAttnProcess.ShiftID = attnProcess.ShiftID; // bDailyAttnProcess.AttenType = attnProcess.AttenType; // bDailyAttnProcess.ReferenceID = attnProcess.ReferenceID; // bDailyAttnProcess.EarlyHour = 0; // bDailyAttnProcess.LateHour = 0; // bDailyAttnProcess.OTHour = 0; // if (bDailyAttnProcess.AttenType == EnumAttendanceType.Present) // { // if (_monthlyWorkPlans != null && _monthlyWorkPlans.Count > 0) // { // empMonthlyWorkPlan = _monthlyWorkPlans.Find(delegate(MonthlyWorkPlan mWP) // { return mWP.EmployeeID == attnProcess.EmployeeID; }); // } // if (empMonthlyWorkPlan == null) // { // continue; // } // oShift = _counterClockShifts.GetItem(empMonthlyWorkPlan.ShiftID); // if (oShift == null) // { // continue; // } // int rand = 0; // Random rd = new Random(); // rand = rd.Next(0, 15); // bDailyAttnProcess.InTime = Attdate.Subtract(Attdate.TimeOfDay).Add(oShift.InTime.TimeOfDay).AddMinutes(Convert.ToDouble(rand)); // rand = rd.Next(0, 15); // if (oShift.InTime > oShift.OutTime) // { // bDailyAttnProcess.OutTime = Attdate.AddDays(1).Subtract(Attdate.TimeOfDay).Add(oShift.OutTime.TimeOfDay).AddMinutes(Convert.ToDouble(rand)); // } // else // { // bDailyAttnProcess.OutTime = Attdate.Subtract(Attdate.TimeOfDay).Add(oShift.OutTime.TimeOfDay).AddMinutes(Convert.ToDouble(rand)); // } // } // else // { // bDailyAttnProcess.InTime = DateTime.MinValue; // bDailyAttnProcess.OutTime = DateTime.MinValue; // } // dBuyerDAProcess.Add(bDailyAttnProcess); // } // } // } // if (dBuyerDAProcess.Count > 0) // { // BuyerDailyAttProcess.Save(dBuyerDAProcess, true); // } // } // catch (Exception e) // { // throw new ServiceException(e.Message, e); // } //} #endregion } }