/// <summary> /// Calculate the total number of leave days as of the requested date. /// </summary> /// <param name="eid"></param> /// <param name="numDays"></param> /// <param name="reqDate"></param> public static void ApproveLeaveRequest(int eid, decimal numDays, DateTime reqDate) { var proxy = new LeaveProxy(); var employee = proxy.Context.Employees.FirstOrDefault(ep => ep.EmployeeId == eid); //ty - this year. var ty = reqDate.Year; //sy - service year. sy holds only the year part ignoring the month part. int sy = reqDate.Subtract(Convert.ToDateTime(employee.HireDate)).Days / 365; //fy - the last service year just befor the request year. DateTime fy = new DateTime(); fy = sy > 0 ? Convert.ToDateTime(employee.HireDate).AddYears(sy - 1) : Convert.ToDateTime(employee.HireDate); //fyv - the first year remaining leave value decimal fyv = 0; if (fy == Convert.ToDateTime(employee.HireDate)) { fyv = 0; } else { fyv = GetRemaingLeaveAmount(fy, eid); } var fullYear = Convert.ToDateTime(employee.HireDate).AddYears(sy); decimal rate = Convert.ToDecimal(GetTotalAnnualLeave(reqDate, eid)) / 12; decimal md = Math.Round(Convert.ToDecimal(reqDate.Subtract(fullYear).Days / (362.25 / 12))); var v = Math.Round(md * rate) - GetAmountTaken(DateTime.Today, eid); decimal tyv = 0; if (v >= 0) { tyv = v; } var x = numDays; if (fyv > 0 && x > 0) { if (fyv >= x) { var obj = new EmployeePtoTransaction() { ApprovedBy = "####", ApprovedDate = DateTime.Today, EmployeeId = eid, Year = fy.Year, NoDays = x }; var obj2 = proxy.Context.EmployeePtoStatus.FirstOrDefault(ep => ep.EmployeeId == eid); if (obj2 != null) { obj2.PrevCount = fyv - x; obj2.CurrentCount = tyv; } else { obj2 = new EmployeePtoStatus() { EmployeeId = eid, CurrentCount = tyv, PrevCount = fyv - x }; proxy.Context.EmployeePtoStatus.AddObject(obj2); } proxy.Context.EmployeePtoTransactions.AddObject(obj); employee.CurrentLeaveDays = (fyv - x) + tyv; proxy.Save(); return; } else { x = x - fyv; var obj = new EmployeePtoTransaction() { ApprovedBy = "####", ApprovedDate = DateTime.Today, EmployeeId = eid, Year = fy.Year, NoDays = fyv }; proxy.Context.EmployeePtoTransactions.AddObject(obj); } } if (tyv > 0 && x > 0) { if (x >= tyv) // case of Overridden { var obj = new EmployeePtoTransaction() { ApprovedBy = "#####", ApprovedDate = DateTime.Today, EmployeeId = eid, Year = ty, NoDays = tyv }; var obj2 = proxy.Context.EmployeePtoStatus.FirstOrDefault(ep => ep.EmployeeId == eid); if (obj2 != null) { obj2.PrevCount = 0; obj2.CurrentCount = 0; } else { obj2 = new EmployeePtoStatus() { EmployeeId = eid, PrevCount = 0, CurrentCount = 0 }; proxy.Context.EmployeePtoStatus.AddObject(obj2); } proxy.Context.EmployeePtoTransactions.AddObject(obj); employee.CurrentLeaveDays = 0; proxy.Save(); return; } else { var obj = new EmployeePtoTransaction() { ApprovedBy = "#####", ApprovedDate = DateTime.Today, EmployeeId = eid, Year = ty, NoDays = x }; var obj2 = proxy.Context.EmployeePtoStatus.FirstOrDefault(ep => ep.EmployeeId == eid); if (obj2 != null) { obj2.PrevCount = 0; obj2.CurrentCount = tyv - x; } else { obj2 = new EmployeePtoStatus() { EmployeeId = eid, PrevCount = 0, CurrentCount = tyv - x }; proxy.Context.EmployeePtoStatus.AddObject(obj2); } proxy.Context.EmployeePtoTransactions.AddObject(obj); employee.CurrentLeaveDays = tyv - x; proxy.Save(); return; } } }
/// <summary> /// Add the intial leave amount all employees. /// </summary> /// <param name="employees"></param> public static void AddInitialLeave(List <EmployeeInfo> employees) { var proxy = new LeaveProxy(); foreach (var e in employees) { var hd = Convert.ToDateTime(e.HireDate); var eid = e.EmployeeId; int sy = DateTime.Today.Subtract(hd).Days / 365; var emp = proxy.Context.Employees.FirstOrDefault(ep => ep.EmployeeId == eid); decimal fyv = 0; decimal tv = 0; DateTime fy = sy > 0 ? Convert.ToDateTime(hd).AddYears(sy - 1) : Convert.ToDateTime(hd); decimal fyav = GetTotalAnnualLeave(fy, eid); // if the use enter a null value for the previous amount we will assum the employee hasn't taken any leave in previous year. // if the fy == hd the employee hasn't have 1 year service year, so he willn't have transaction in the previous year. if (e.PrevValue != null && fy != hd) { fyv = fyav - Convert.ToDecimal(e.PrevValue); var obj = new EmployeePtoTransaction() { Year = fy.Year, EmployeeId = eid, NoDays = fyv, ApprovedBy = "#####", ApprovedDate = DateTime.Today }; proxy.Context.EmployeePtoTransactions.AddObject(obj); } if (e.CurrentValue != null) { var fullYear = hd.AddYears(sy); decimal rate = Convert.ToDecimal(GetTotalAnnualLeave(DateTime.Today, eid)) / 12; decimal md = Math.Round(Convert.ToDecimal(DateTime.Today.Subtract(fullYear).Days / (362.25 / 12))); //tyv - total leave value for the this year. decimal tyv = Math.Round(md * rate); tv = tyv - Convert.ToDecimal(e.CurrentValue); if (tv > 0) { var obj = new EmployeePtoTransaction() { Year = DateTime.Today.Year, EmployeeId = eid, NoDays = tv, ApprovedBy = "#####", ApprovedDate = DateTime.Today }; proxy.Context.EmployeePtoTransactions.AddObject(obj); } } if (e.PrevValue != null && e.CurrentValue != null) { emp.CurrentLeaveDays = Math.Round(Convert.ToDecimal(e.PrevValue) + Convert.ToDecimal(e.CurrentValue)); var status = proxy.Context.EmployeePtoStatus.FirstOrDefault(es => es.EmployeeId == eid); if (status != null) { status.PrevCount = e.PrevValue; status.CurrentCount = e.CurrentValue; } else { status = new EmployeePtoStatus() { EmployeeId = eid, PrevCount = e.PrevValue, CurrentCount = e.CurrentValue }; proxy.Context.EmployeePtoStatus.AddObject(status); } } } proxy.Save(); }