public async static Task UpdateAttendance(DateTime ProcessingDate, DateTime ProcessingDayCheckIn, DateTime ProcessingDayCheckOut, string empid) { try { var employee = Client.GetObject(DocType.Employee, empid); if (employee != null) { Log.Info($"updating attendance of employee:{empid} for the day {ProcessingDate} with chekin {ProcessingDayCheckIn} and checkout{ProcessingDayCheckOut}"); int HalfDayThreshold = Convert.ToInt32(ConfigurationManager.AppSettings["HalfDayThresholdHour"]); int FullDayThreshold = Convert.ToInt32(ConfigurationManager.AppSettings["FullDayThresholdHour"]); float workinghours = 0; float othours = 0; ERPAttendance attendance = new ERPAttendance(); List <TimeSheetLog> TimeSheetLogs = new List <TimeSheetLog>(); TimeSheetLog timeSheetLog = new TimeSheetLog(); //If there is no records in AMS for the day if (ProcessingDayCheckOut == DateTime.MinValue) { //Check the employee is on leave or not Log.Info($"Checking employee {empid} is leave or not"); FetchListOption listOption = new FetchListOption(); listOption.Filters.Add(new ERPFilter(DocType.Attendance, "employee_id", OperatorFilter.Equals, empid)); listOption.Filters.Add(new ERPFilter(DocType.Attendance, "attendance_date", OperatorFilter.Equals, ProcessingDate.ToString("yyyy-MM-dd"))); listOption.IncludedFields.AddRange(new string[] { "name", "status", "attendance_date" }); var documents = Client.ListObjects(DocType.Attendance, listOption); if (documents.Count > 0 && documents != null) { attendance.status = (AttendanceStatusEnum)Enum.Parse(typeof(AttendanceStatusEnum), documents[0].Data.status.Replace(" ", "")); attendance.attendance_date = documents[0].Data.attendance_date.ToString(); //timeSheetLog.from_time = documents[0].Data.attendance_date.ToString(); //timeSheetLog.hours = 0; //timeSheetLog.activity_type = "Execution"; //TimeSheetLogs.Add(timeSheetLog); Log.Info($"Employee {empid} is on leave with status {attendance.status}"); } else { //Not on Leave and also there is no swipe attendance.status = AttendanceStatusEnum.Absent; attendance.attendance_date = ProcessingDate.ToString("yyyy-MM-dd"); //timeSheetLog.from_time = ProcessingDate.ToString("yyyy-MM-dd"); //timeSheetLog.hours = 0; //timeSheetLog.activity_type = "Execution"; //TimeSheetLogs.Add(timeSheetLog); Log.Info($"Employee {empid} is Not on leave and there is no swipe so status :{attendance.status}"); } } //if checkout is before 1 pm else if (ProcessingDayCheckOut < ProcessingDate.Date.AddHours(HalfDayThreshold)) { attendance.status = AttendanceStatusEnum.Absent; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); //workinghours=(float)(ProcessingDayCheckOut - ProcessingDayCheckIn).TotalHours; //timeSheetLog.from_time = ProcessingDayCheckIn.ToString("yyyy-MM-dd"); //timeSheetLog.to_time = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); //var ts = (ProcessingDayCheckOut - ProcessingDayCheckIn); //var h = Math.Floor(ts.TotalHours); //var m = (ts.TotalHours - h) * 60; //workinghours = (float)(h + m/60); //timeSheetLog.hours = workinghours; //timeSheetLog.activity_type = "Execution"; //TimeSheetLogs.Add(timeSheetLog); Log.Info($"Employee {empid} checkout {ProcessingDayCheckOut} before 1pm so marking as leave with status {attendance.status}"); } //if checkout is before 5 pm else if (ProcessingDayCheckOut < ProcessingDate.Date.AddHours(FullDayThreshold)) { attendance.status = AttendanceStatusEnum.HalfDay; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); //var ts = (ProcessingDayCheckOut - ProcessingDayCheckIn); //var h = Math.Floor(ts.TotalHours); //var m = (ts.TotalHours - h) * 60; //workinghours = (float)(h + m/60); //timeSheetLog.from_time = ProcessingDayCheckIn.ToString("yyyy-MM-dd"); //timeSheetLog.to_time = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); //timeSheetLog.hours = workinghours; //timeSheetLog.activity_type = "Execution"; //TimeSheetLogs.Add(timeSheetLog); Log.Info($"Employee {empid} chekout {ProcessingDayCheckOut} before 5pm so marking attendance status as {attendance.status}"); } else { attendance.status = AttendanceStatusEnum.Present; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); // workinghours = (float)(ProcessingDayCheckOut - ProcessingDayCheckIn).TotalHours; var ts = (ProcessingDayCheckOut - ProcessingDayCheckIn); var h = Math.Floor(ts.TotalHours); var m = (ts.TotalHours - h) * 60; workinghours = (float)(h + m / 60); timeSheetLog.from_time = ProcessingDayCheckIn.ToString("yyyy-MM-dd"); timeSheetLog.to_time = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); if (workinghours > 8) { othours = workinghours - 8; } else { othours = 0; } timeSheetLog.hours = othours; timeSheetLog.activity_type = "Execution"; TimeSheetLogs.Add(timeSheetLog); Log.Info($"Employee {empid} checkout {ProcessingDayCheckOut} properly and marking attendance status {attendance.status} and workinghours {timeSheetLog.hours}"); } attendance.employee_name = employee.Data.employee_name; attendance.employee = employee.Data.employee; attendance.company = employee.Data.company; attendance.department = employee.Data.department; attendance.docstatus = 1; //mark the attendance Client.InsertObject(attendance.Object); Log.Info($"Marked the attendance for the eemployee {empid} successfully"); //create the time sheet for the employee if (TimeSheetLogs.Count > 0) { ERPTimesheet timesheet = new ERPTimesheet(); timesheet.employee_name = employee.Data.employee_name; timesheet.employee = employee.Data.employee; timesheet.company = employee.Data.company; timesheet.department = employee.Data.department; timesheet.time_logs = TimeSheetLogs; timesheet.docstatus = 1; //timesheet.total_hours = workinghours; Client.InsertObject(timesheet.Object); Log.Info($"created time sheet for the employee {empid} successfully"); } //finally update Employee with lastattendance date ERPObject updated_obj = new ERPObject(DocType.Employee); updated_obj.Data.last_attendance_date = ProcessingDate.ToString("yyyy-MM-dd"); Client.UpdateObject(DocType.Employee, empid, updated_obj); Log.Info($"updated the processed date for the employee {empid} successfully"); } } catch (Exception ex) { Log.Error(ex); } }
public async static Task UpdateAttendance(DateTime ProcessingDate, DateTime ProcessingDayCheckIn, DateTime ProcessingDayCheckOut, string empid) { try { var employee = Client.GetObject(DocType.Employee, empid); if (employee != null) { Log.Info($"updating attendance of employee:{empid} for the day {ProcessingDate} with chekin {ProcessingDayCheckIn} and checkout{ProcessingDayCheckOut}"); int ShiftOneHalfDayThresholdHour = 0; int ShiftTwoHalfDayThresholdHour = 0; int ShiftThreeHalfDayThresholdHour = 0; float workinghours = 0; float othours = 0; float otThreshold = 0; float BufferHour = 0; ERPAttendance attendance = new ERPAttendance(); List <TimeSheetLog> TimeSheetLogs = new List <TimeSheetLog>(); TimeSheetLog timeSheetLog = new TimeSheetLog(); ShiftOneHalfDayThresholdHour = Convert.ToInt32(ConfigurationManager.AppSettings["ShiftOneHalfDayThresholdHour"]); ShiftTwoHalfDayThresholdHour = Convert.ToInt32(ConfigurationManager.AppSettings["ShiftTwoHalfDayThresholdHour"]); ShiftThreeHalfDayThresholdHour = Convert.ToInt32(ConfigurationManager.AppSettings["ShiftThreeHalfDayThresholdHour"]); otThreshold = Convert.ToInt32(ConfigurationManager.AppSettings["OtHoursThreshold"]); BufferHour = Convert.ToInt32(ConfigurationManager.AppSettings["BufferHours"]); //fetching shift timings from webconfig IList <string> ShiftOneStartList = ConfigurationManager.AppSettings["ShiftOneStartTime"].Split(':'); TimeSpan ShiftOneStartTs = new TimeSpan(Convert.ToInt32(ShiftOneStartList[0]), Convert.ToInt32(ShiftOneStartList[1]), 0); var ShiftOneStartdate = ProcessingDate.Date.Add(ShiftOneStartTs); IList <string> ShiftOneEndList = ConfigurationManager.AppSettings["ShiftOneEndTime"].Split(':'); TimeSpan ShiftOneEndTs = new TimeSpan(Convert.ToInt32(ShiftOneEndList[0]), Convert.ToInt32(ShiftOneEndList[1]), 0); var ShiftOneEnddate = ProcessingDate.Date.Add(ShiftOneEndTs); IList <string> ShiftTwoStartList = ConfigurationManager.AppSettings["ShiftTwoStartTime"].Split(':'); TimeSpan ShiftTwoStartTs = new TimeSpan(Convert.ToInt32(ShiftTwoStartList[0]), Convert.ToInt32(ShiftTwoStartList[1]), 0); var ShiftTwoStartdate = ProcessingDate.Date.Add(ShiftTwoStartTs); IList <string> ShiftTwoEndList = ConfigurationManager.AppSettings["ShiftTwoEndTime"].Split(':'); TimeSpan ShiftTwoEndTs = new TimeSpan(Convert.ToInt32(ShiftTwoEndList[0]), Convert.ToInt32(ShiftTwoEndList[1]), 0); var ShiftTwoEnddate = ProcessingDate.Date.Add(ShiftTwoEndTs).AddDays(1); IList <string> ShiftThreeStartList = ConfigurationManager.AppSettings["ShiftThreeStartTime"].Split(':'); TimeSpan ShiftThreeStartTs = new TimeSpan(Convert.ToInt32(ShiftThreeStartList[0]), Convert.ToInt32(ShiftThreeStartList[1]), 0); var ShiftThreeStartdate = ProcessingDate.Date.Add(ShiftThreeStartTs); IList <string> ShiftThreeEndList = ConfigurationManager.AppSettings["ShiftThreeEndTime"].Split(':'); TimeSpan ShiftThreeEndTs = new TimeSpan(Convert.ToInt32(ShiftThreeEndList[0]), Convert.ToInt32(ShiftThreeEndList[1]), 0); var ShiftThreeEnddate = ProcessingDate.Date.Add(ShiftThreeEndTs); //If there is no checkin records in AMS for the day if (ProcessingDayCheckIn == DateTime.MinValue || ProcessingDayCheckOut == DateTime.MinValue) { //Check the employee is on leave or not Log.Info($"Checking employee {empid} is leave or not"); FetchListOption listOption = new FetchListOption(); listOption.Filters.Add(new ERPFilter(DocType.Attendance, "employee_id", OperatorFilter.Equals, empid)); listOption.Filters.Add(new ERPFilter(DocType.Attendance, "attendance_date", OperatorFilter.Equals, ProcessingDate.ToString("yyyy-MM-dd"))); listOption.IncludedFields.AddRange(new string[] { "name", "status", "attendance_date" }); var documents = Client.ListObjects(DocType.Attendance, listOption); if (documents.Count > 0 && documents != null) { attendance.status = (AttendanceStatusEnum)Enum.Parse(typeof(AttendanceStatusEnum), documents[0].Data.status.Replace(" ", "")); attendance.attendance_date = documents[0].Data.attendance_date.ToString(); Log.Info($"Employee {empid} is on leave with status {attendance.status}"); } else { //Not on Leave and also there is no swipe attendance.status = AttendanceStatusEnum.Absent; attendance.attendance_date = ProcessingDate.ToString("yyyy-MM-dd"); Log.Info($"Employee {empid} is Not on leave and there is no swipe so status :{attendance.status}"); } } if (ProcessingDayCheckIn >= ShiftOneStartdate.AddHours(BufferHour) && ProcessingDayCheckOut >= ShiftOneEnddate.AddHours(BufferHour) || ProcessingDayCheckIn >= ShiftOneStartdate.AddHours(-BufferHour) && ProcessingDayCheckOut >= ShiftOneEnddate.AddHours(-BufferHour)) { Log.Info($"Employee {empid} is found in shift1 so processing attendance"); //if checkout is before HalfDayThreshold if (ProcessingDayCheckOut < ProcessingDate.Date.AddHours(ShiftOneHalfDayThresholdHour)) { attendance.status = AttendanceStatusEnum.Absent; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); Log.Info($"Employee {empid} checkout {ProcessingDayCheckOut} before HalfDayThreshold so marking as leave with status {attendance.status}"); } //if checkout is before FullDayThreshold else if (ProcessingDayCheckOut < ShiftOneEnddate) { attendance.status = AttendanceStatusEnum.HalfDay; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); Log.Info($"Employee {empid} chekout {ProcessingDayCheckOut} before Full Day Threshold so marking attendance status as {attendance.status}"); } else { attendance.status = AttendanceStatusEnum.Present; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); var ts = (ProcessingDayCheckOut - ProcessingDayCheckIn); var h = Math.Floor(ts.TotalHours); var m = (ts.TotalHours - h) * 60; workinghours = (float)(h + m / 60); timeSheetLog.from_time = ProcessingDayCheckIn.ToString("yyyy-MM-dd"); timeSheetLog.to_time = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); if (workinghours > otThreshold && ProcessingDayCheckIn <= ShiftOneStartdate.AddHours(BufferHour)) { othours = workinghours - (float)otThreshold; timeSheetLog.hours = (float)Math.Round(othours); timeSheetLog.activity_type = "Execution"; TimeSheetLogs.Add(timeSheetLog); } Log.Info($"Employee {empid} checkout {ProcessingDayCheckOut} properly and marking attendance status {attendance.status} and workinghours {timeSheetLog.hours}"); } } else if (ProcessingDayCheckIn >= ShiftTwoStartdate.AddHours(BufferHour) && ProcessingDayCheckOut >= ShiftTwoEnddate.AddHours(BufferHour) || ProcessingDayCheckIn >= ShiftTwoStartdate.AddHours(-BufferHour) && ProcessingDayCheckOut >= ShiftTwoEnddate.AddHours(-BufferHour)) { Log.Info($"Employee {empid} is found in shift2 so processing attendance"); //this shift is ending in next day so feteching chekouttime again if (ProcessingDayCheckOut == ProcessingDayCheckIn) { ProcessingDayCheckOut = await AMSConnector.GetChekOutTime(empid, ProcessingDate.AddDays(1)); } //if checkout is before HalfDayThreshold if (ProcessingDayCheckOut < ProcessingDate.Date.AddHours(ShiftTwoHalfDayThresholdHour)) { attendance.status = AttendanceStatusEnum.Absent; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); Log.Info($"Employee {empid} checkout {ProcessingDayCheckOut} before HalfDayThreshold so marking as leave with status {attendance.status}"); } //if checkout is before FullDayThreshold else if (ProcessingDayCheckOut < ShiftTwoEnddate) { attendance.status = AttendanceStatusEnum.HalfDay; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); Log.Info($"Employee {empid} chekout {ProcessingDayCheckOut} before Full Day Threshold so marking attendance status as {attendance.status}"); } else { attendance.status = AttendanceStatusEnum.Present; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); var ts = (ProcessingDayCheckOut - ProcessingDayCheckIn); var h = Math.Floor(ts.TotalHours); var m = (ts.TotalHours - h) * 60; workinghours = (float)(h + m / 60); timeSheetLog.from_time = ProcessingDayCheckIn.ToString("yyyy-MM-dd"); timeSheetLog.to_time = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); if (workinghours > otThreshold && ProcessingDayCheckIn <= ShiftTwoStartdate.AddHours(BufferHour)) { othours = workinghours - (float)otThreshold; timeSheetLog.hours = (float)Math.Round(othours); timeSheetLog.activity_type = "Execution"; TimeSheetLogs.Add(timeSheetLog); } Log.Info($"Employee {empid} checkout {ProcessingDayCheckOut} properly and marking attendance status {attendance.status} and workinghours {timeSheetLog.hours}"); } } else if (ProcessingDayCheckIn >= ShiftThreeStartdate.AddHours(BufferHour) && ProcessingDayCheckOut >= ShiftThreeEnddate.AddHours(BufferHour) || ProcessingDayCheckIn >= ShiftThreeStartdate.AddHours(-BufferHour) && ProcessingDayCheckOut >= ShiftThreeEnddate.AddHours(-BufferHour)) { Log.Info($"Employee {empid} is found in shift3 so processing attendance"); //if checkout is before HalfDayThreshold if (ProcessingDayCheckOut < ProcessingDate.Date.AddHours(ShiftThreeHalfDayThresholdHour)) { attendance.status = AttendanceStatusEnum.Absent; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); Log.Info($"Employee {empid} checkout {ProcessingDayCheckOut} before HalfDayThreshold so marking as leave with status {attendance.status}"); } //if checkout is before FullDayThreshold else if (ProcessingDayCheckOut < ShiftThreeEnddate) { attendance.status = AttendanceStatusEnum.HalfDay; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); Log.Info($"Employee {empid} chekout {ProcessingDayCheckOut} before Full Day Threshold so marking attendance status as {attendance.status}"); } else { attendance.status = AttendanceStatusEnum.Present; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); var ts = (ProcessingDayCheckOut - ProcessingDayCheckIn); var h = Math.Floor(ts.TotalHours); var m = (ts.TotalHours - h) * 60; workinghours = (float)(h + m / 60); timeSheetLog.from_time = ProcessingDayCheckIn.ToString("yyyy-MM-dd"); timeSheetLog.to_time = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); if (workinghours > otThreshold && ProcessingDayCheckIn <= ShiftTwoStartdate.AddHours(BufferHour)) { othours = workinghours - (float)otThreshold; timeSheetLog.hours = (float)Math.Round(othours); timeSheetLog.activity_type = "Execution"; TimeSheetLogs.Add(timeSheetLog); } Log.Info($"Employee {empid} checkout {ProcessingDayCheckOut} properly and marking attendance status {attendance.status} and workinghours {timeSheetLog.hours}"); } } //if employee is not there in any shift else { var Datediff = (ProcessingDayCheckOut - ProcessingDayCheckIn); var Diffh = Math.Floor(Datediff.TotalHours); var Diffm = (Datediff.TotalHours - Diffh) * 60; var Totalworkinghours = (float)(Diffh + Diffm / 60); if (Totalworkinghours <= 4) { attendance.status = AttendanceStatusEnum.Absent; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); Log.Info($"Employee {empid} is not there in any shift and his checkout {ProcessingDayCheckOut} and checkin {ProcessingDayCheckIn} the total working hours {Totalworkinghours} so marking attendance status {attendance.status} and workinghours {timeSheetLog.hours}"); } else if (Totalworkinghours <= 8) { attendance.status = AttendanceStatusEnum.HalfDay; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); Log.Info($"Employee {empid} checkout {ProcessingDayCheckOut} properly and marking attendance status {attendance.status} and workinghours {timeSheetLog.hours}"); } else { attendance.status = AttendanceStatusEnum.Present; attendance.attendance_date = ProcessingDayCheckOut.ToString("yyyy-MM-dd"); Log.Info($"Employee {empid} checkout {ProcessingDayCheckOut} properly and marking attendance status {attendance.status} and workinghours {timeSheetLog.hours}"); } } attendance.employee_name = employee.Data.employee_name; attendance.employee = employee.Data.employee; attendance.company = employee.Data.company; attendance.department = employee.Data.department; attendance.docstatus = 1; //mark the attendance Client.InsertObject(attendance.Object); Log.Info($"Marked the attendance for the eemployee {empid} successfully"); //create the time sheet for the employee if (TimeSheetLogs.Count > 0) { ERPTimesheet timesheet = new ERPTimesheet(); timesheet.employee_name = employee.Data.employee_name; timesheet.employee = employee.Data.employee; timesheet.company = employee.Data.company; timesheet.department = employee.Data.department; timesheet.time_logs = TimeSheetLogs; timesheet.docstatus = 0; Client.InsertObject(timesheet.Object); Log.Info($"created OT for the employee {empid} successfully"); } //finally update Employee with lastattendance date ERPObject updated_obj = new ERPObject(DocType.Employee); updated_obj.Data.last_attendance_date = ProcessingDate.ToString("yyyy-MM-dd"); Client.UpdateObject(DocType.Employee, empid, updated_obj); Log.Info($"updated the processed date for the employee {empid} successfully"); } } catch (Exception ex) { Log.Error(ex); } }