CEL_Payroll/Payroll.BO/Attendence/AttendanceProcess.cs

1818 lines
89 KiB
C#
Raw Permalink Normal View History

2024-09-17 14:30:13 +06:00
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<Employee> _employees = null;
//ObjectsTemplate<MonthlyWorkPlan> _monthlyWorkPlans = null;
ObjectsTemplate<AttnNationalHoliday> _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<AttnRawData> GetRawData(ObjectsTemplate<AttnRawData> rawData, ID empID)
//{
// ObjectsTemplate<AttnRawData> empRawData = new ObjectsTemplate<AttnRawData>();
// 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<DateTime> GetLastTenWorkingDays(DateTime Attdate)
{
List<DateTime> dates = new List<DateTime>();
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<ShiftRotation> 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<DailyAttnProcess> dailyattProcesses = new ObjectsTemplate<DailyAttnProcess>();
List<EmpFieldTrack> oEmpFieldTracks = new List<EmpFieldTrack>();
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<ShiftRotation> CounterClockRotation = ShiftRotation.Get(EnumWorkPlanGroup.Counter_Clock_1);
ObjectsTemplate<ShiftRotation> CounterClock2Rotation = ShiftRotation.Get(EnumWorkPlanGroup.Counter_Clock_2);
ObjectsTemplate<ShiftRotation> CounterClock3Rotation = ShiftRotation.Get(EnumWorkPlanGroup.Counter_Clock_3);
ObjectsTemplate<ShiftRotation> CounterClock4Rotation = ShiftRotation.Get(EnumWorkPlanGroup.Counter_Clock_4);
ObjectsTemplate<EmployeeWorkPlanSetup> empWPGroups = EmployeeWorkPlanSetup.Get();
ObjectsTemplate<Employee> employees = Employee.Get();
ObjectsTemplate<Shift> shifts = Shift.Get();
ObjectsTemplate<WorkPlanGroup> workPlanGroups = WorkPlanGroup.Get();
ObjectsTemplate<Employee> discontinueEmps = Employee.GetDiscontinueEmp(Attdate, DateTime.Now);
ObjectsTemplate<AttnRawData> attRawdata = AttnRawData.Get(startTime, ToTime);// get raw data by a date and order by date, employee, punchTime
ObjectsTemplate<EmployeeOutsideDuty> outSideDuties = EmployeeOutsideDuty.Get(Attdate); // get transaction by the a rate
ObjectsTemplate<LeaveEntry> leaves = LeaveEntry.Get(Attdate); // workplans by the date
oEmpFieldTracks = EmpFieldTrack.Get().Where(obj=> obj.TranDateTime.Date == Attdate.Date).ToList();
List<LeaveParameter> 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<DailyAttnProcess> prvDayattns = DailyAttnProcess.Get(Attdate.AddDays(-1));
ObjectsTemplate<DailyAttnProcess> 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<AttnRawData> 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<AttnRawData>();
}
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<ShiftRotation> 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<AttnRawData> empInRawData = empAttnData.Where(rd => rd.EntryMode == EnumEntryMode.In)
.OrderBy(rd => rd.PunchTime)
.ToList();
List<AttnRawData> 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<EmpFieldTrack> 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<ShiftRotation> CcRotation = ShiftRotation.Get(EnumWorkPlanGroup.Counter_Clock);
// ObjectsTemplate<ShiftRotation> TwoShiftRotation = ShiftRotation.Get(EnumWorkPlanGroup.Counter_Clock_2);
// ObjectsTemplate<EmployeeWorkPlanSetup> empWPGroups = EmployeeWorkPlanSetup.Get();
// ObjectsTemplate<WorkPlanGroup> oWPGroup = WorkPlanGroup.Get();
// ObjectsTemplate<Employee> employees = Employee.Get();
// ObjectsTemplate<AttnRawData> attRawdata = AttnRawData.Get(startTime, ToTime);// get raw data by a date and order by date, employee, punchTime
// ObjectsTemplate<DailyAttnProcess> dailyattProcesses = new ObjectsTemplate<DailyAttnProcess>();
// ObjectsTemplate<EmployeeOutsideDuty> outSideDuties = EmployeeOutsideDuty.Get(Attdate); // get transaction by the a rate
// ObjectsTemplate<MonthlyWorkPlan> monthlyWorkPlans = MonthlyWorkPlan.Get(Attdate); // get workplans by the date
// ObjectsTemplate<LeaveEntry> leaves = LeaveEntry.Get(Attdate); // workplans by the date
// ObjectsTemplate<BuyerSetup> buyers = BuyerSetup.Get();
// ObjectsTemplate<BuyerDailyAttProcess> bDailyattProcesses = new ObjectsTemplate<BuyerDailyAttProcess>();
// ObjectsTemplate<Shift> shifts = Shift.Get();
// ObjectsTemplate<WorkPlanGroup> workPlanGroups = WorkPlanGroup.Get();
// EmployeeWorkPlanSetup oesetup = null;
// //for considering employess discontinued after the process date
// ObjectsTemplate<Employee> 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<DailyAttnProcess> prvDayattns = DailyAttnProcess.Get(Attdate.AddDays(-1));
// // manual entry Actual
// ObjectsTemplate<DailyAttnProcess> manualAttnProcesses = DailyAttnProcess.GetManualProcess(Attdate);
// foreach (DailyAttnProcess item in manualAttnProcesses)
// {
// dailyattProcesses.Add(item);
// }
// //manual entry Buyer
// ObjectsTemplate<BuyerDailyAttProcess> 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<AttnRawData> 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<AttnRawData>();
// 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<ShiftRotation> 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<DateTime> 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<DailyAttnProcess> dAPMorningShift = null;
//// ObjectsTemplate<DailyAttnProcess> dAPEveningShift = null;
//// ObjectsTemplate<DailyAttnProcess> dAPNightShift = null;
//// //for previous Day Process(AttnDate)
//// ObjectsTemplate<AttnRawData> 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<AttnRawData> 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<AttnRawData> 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<AttnRawData> rawData, ObjectsTemplate<DailyAttnProcess> dAProcesses1, ObjectsTemplate<DailyAttnProcess> dAProcesses2, DateTime Attdate, Shift shift, bool isNightShift)
////{
//// try
//// {
//// ObjectsTemplate<DailyAttnProcess> dAProcessesToSave = new ObjectsTemplate<DailyAttnProcess>();
//// 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<AttnRawData> rawData, Shift shift, DateTime Attdate)
////{
//// try
//// {
//// ObjectsTemplate<DailyAttnProcess> dAProcess = new ObjectsTemplate<DailyAttnProcess>();
//// _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<DailyAttnProcess> dailtAttnProcess = new ObjectsTemplate<DailyAttnProcess>();
// ObjectsTemplate<Employee> employees = Employee.GetAbsentEmp(attnDate, EnumWorkPlanGroup.CounterClock);
// if (employees != null && employees.Count > 0)
// {
// ObjectsTemplate<MonthlyWorkPlan> monthlyWorkPlans = MonthlyWorkPlan.GetByDateAndWPGType(attnDate, EnumWorkPlanGroup.CounterClock);
// ObjectsTemplate<LeaveEntry> leaves = LeaveEntry.Get(attnDate);
// ObjectsTemplate<EmployeeOutsideDuty> 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<AttnRawData> 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<AttnRawData> RemoveOutTime(ObjectsTemplate<AttnRawData> rawData, ID employeeID)
//{
// ObjectsTemplate<AttnRawData> empRawData = new ObjectsTemplate<AttnRawData>();
// foreach (AttnRawData item in rawData)
// {
// if (item.EmployeeID != employeeID)
// {
// empRawData.Add(item);
// }
// }
// return empRawData;
//}
//#endregion
//#endregion
//private void ProcessBuyerWiseCounterClockEmp(DateTime Attdate)
//{
// try
// {
// ObjectsTemplate<BuyerDailyAttProcess> dBuyerDAProcess = new ObjectsTemplate<BuyerDailyAttProcess>();
// BuyerDailyAttProcess bDailyAttnProcess = null;
// ObjectsTemplate<BuyerSetup> buyers = BuyerSetup.Get();
// ObjectsTemplate<DailyAttnProcess> 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
}
}