/*Note that this method is applicable to employees with hourly rate*/ public void GenerateEmployeePayrollItemByDateRange(DateTime payrollDate, DateTime payrollStartDate, DateTime payrollEndDate) { //Delete existing by date range DeleteByDateRange(payrollDate, payrollDate); Double restDayRate = Double.Parse(_settingService.GetByKey(SettingValue.RATE_REST_DAY)); Double restDayRateOT = Double.Parse(_settingService.GetByKey(SettingValue.RATE_REST_DAY_OT)); Double OTRate = Double.Parse(_settingService.GetByKey(SettingValue.RATE_OT)); Double nightDiffRate = Double.Parse(_settingService.GetByKey(SettingValue.RATE_NIGHTDIF)); Double holidayRegularRate = Double.Parse(_settingService.GetByKey(SettingValue.RATE_HOLIDAY_REGULAR)); Double holidaySpecialRate = Double.Parse(_settingService.GetByKey(SettingValue.RATE_HOLIDAY_SPECIAL)); Double OTRateHoliday = Double.Parse(_settingService.GetByKey(SettingValue.RATE_OT_HOLIDAY)); Double holidaySpecialRestDayRate = Double.Parse(_settingService.GetByKey(SettingValue.RATE_HOLIDAY_SPECIAL_REST_DAY)); IList <TotalEmployeeHours> totalEmployeeHours = _totalEmployeeHoursService.GetByDateRange(payrollStartDate, payrollEndDate); //Get all active employee var activeEmployeeList = _employeeInfoService.GetAllActive(); foreach (EmployeeInfo employee in activeEmployeeList) { var employeeWorkSchedule = _employeeWorkScheduleService.GetByEmployeeId(employee.EmployeeId); if (employeeWorkSchedule == null) { continue; } var workSchedule = employeeWorkSchedule.WorkSchedule; //Get all total employee hours var employeeTotalHoursList = totalEmployeeHours.Where(h => h.EmployeeId == employee.EmployeeId) .OrderByDescending(h => h.Date); var employeePayrollItemList = new List <EmployeePayrollItem>(); foreach (DateTime day in DatetimeExtension.EachDay(payrollStartDate, payrollEndDate)) { //Get all total employee hours for the day var employeeTotalHoursListPerDay = employeeTotalHoursList.Where(h => h.Date == day); foreach (TotalEmployeeHours totalHours in employeeTotalHoursListPerDay) { var hourlyRate = _employeeSalaryService.GetEmployeeHourlyRate(employee); Double rateMultiplier = 1; //No work schedule, no computation if (employeeWorkSchedule != null) { DateTime date = totalHours.Date; RateType rateType = totalHours.Type; var isRestDay = date.IsRestDay(workSchedule.WeekStart, workSchedule.WeekEnd); Holiday holiday = _holidayService.GetHoliday(date); Decimal totalPayment = 0; //If NightDif if (rateType == RateType.NightDifferential) { totalPayment += (decimal)(nightDiffRate * totalHours.Hours); hourlyRate = (decimal)nightDiffRate; } else { //If employee didn't work the day before holiday will not get holiday pay if (holiday != null) { var yesterdayHours = _totalEmployeeHoursService.GetByEmployeeDate(employee.EmployeeId, day.AddDays(-1)); var qualifiedForOT = (yesterdayHours != null && yesterdayHours.Count > 0); if (!qualifiedForOT) { var lastDayOfWork = getLastDayOfWork(day, workSchedule); var employeeHours = _totalEmployeeHoursService.GetByEmployeeDate(employee.EmployeeId, lastDayOfWork); qualifiedForOT = (employeeHours != null && employeeHours.Count > 0); } //Set holiday to null if the employee didn't work the day before holiday if (holiday.IsAlwaysPayable == false) { if (!qualifiedForOT) { holiday = null; } } } //Check if with holiday pay if (holiday != null) { if (holiday.IsRegularHoliday) { rateMultiplier *= holidayRegularRate; if (isRestDay) { rateMultiplier *= restDayRate; //Regular holiday rest day OT if (totalHours.Type == RateType.OverTime) { rateMultiplier *= OTRateHoliday; rateType = RateType.RegularHolidayRestDayOT; } else { //Regular holiday rest day rateType = RateType.RegularHolidayRestDay; } } else { //Regular Holiday OT if (totalHours.Type == RateType.OverTime) { rateMultiplier *= OTRateHoliday; rateType = RateType.RegularHolidayOT; } else { //Regular Holiday rateType = RateType.RegularHoliday; } } } else { //Special Holiday //Rest day if (isRestDay) { rateMultiplier = holidaySpecialRestDayRate; //Special holiday rest day OT if (totalHours.Type == RateType.OverTime) { rateMultiplier *= OTRateHoliday; rateType = RateType.SpecialHolidayRestDayOT; } else { //Special holiday rest day rateType = RateType.SpecialHolidayRestDay; } } else { rateMultiplier *= holidaySpecialRate; //Special Holiday OT if (totalHours.Type == RateType.OverTime) { rateMultiplier *= OTRateHoliday; rateType = RateType.SpecialHolidayOT; } else { //Special Holiday rateType = RateType.SpecialHoliday; } } } } else { //Check if rest day and not special holiday if (isRestDay) { rateMultiplier *= restDayRate; if (rateType == RateType.OverTime) { rateMultiplier *= restDayRateOT; rateType = RateType.RestDayOT; } else { rateType = RateType.RestDay; } } else { if (rateType == RateType.OverTime) { rateMultiplier *= OTRate; } } } totalPayment = (decimal)hourlyRate * (decimal)totalHours.Hours * (decimal)rateMultiplier; } //Get existing var employeePayrollItem = employeePayrollItemList.Where(pi => pi.EmployeeId == employee.EmployeeId && pi.RateType == rateType).FirstOrDefault(); if (employeePayrollItem == null) { //Create new entry employeePayrollItem = new EmployeePayrollItem() { Multiplier = rateMultiplier, EmployeeId = employee.EmployeeId, TotalHours = totalHours.Hours, TotalAmount = totalPayment, RatePerHour = hourlyRate, PayrollDate = payrollDate, RateType = rateType }; employeePayrollItemList.Add(employeePayrollItem); } else { //Update Entry employeePayrollItem.TotalHours += totalHours.Hours; employeePayrollItem.TotalAmount += totalPayment; } } } } //Insert all payroll items foreach (EmployeePayrollItem payrollItem in employeePayrollItemList) { _employeePayrollItemRepository.Add(payrollItem); } } _unitOfWork.Commit(); //Generate holiday pays GenerateEmployeeHolidayPay(payrollDate, payrollStartDate, payrollEndDate); //Generate leave pays GenerateEmployeeLeavesPay(payrollDate, payrollStartDate, payrollEndDate); }
public void GeneratePayrollNetPayByDateRange() { Initialize(); DeleteInfo(); //Test Data var employee = new Employee { EmployeeCode = "11001", FirstName = "Jona", LastName = "Pereira", MiddleName = "Aprecio", BirthDate = DateTime.Parse("02/02/1991"), Gender = 1, IsActive = true }; var employee2 = new Employee { EmployeeCode = "11002", FirstName = "Cornelio Jr.", LastName = "Cawicaan", MiddleName = "Bue", BirthDate = DateTime.Parse("10/30/1989"), Gender = 2, IsActive = true }; var employeeInfo = new EmployeeInfo { Employee = employee, Salary = 120, SalaryFrequency = FrequencyType.Hourly, Allowance = 350 }; var employeeInfo2 = new EmployeeInfo { Employee = employee2, Salary = 150, SalaryFrequency = FrequencyType.Hourly, Allowance = 400 }; _employeeInfoRepository.Add(employeeInfo); _employeeInfoRepository.Add(employeeInfo2); var payrollDate = DateTime.Parse("05/21/2016"); var employeePayrollItem = new EmployeePayrollItem { EmployeeId = 1, TotalAmount = 220.55M, TotalHours = 8, PayrollDate = payrollDate, RateType = RateType.Regular, Multiplier = 1, RatePerHour = 100 }; var employeePayrollItem2 = new EmployeePayrollItem { EmployeeId = 1, TotalHours = 10, TotalAmount = 100, PayrollDate = payrollDate, RateType = RateType.OverTime, Multiplier = 1, RatePerHour = 200 }; var employeePayrollItem3 = new EmployeePayrollItem { EmployeeId = 1, TotalHours = 10, TotalAmount = 15, PayrollDate = payrollDate, RateType = RateType.OverTime, Multiplier = 1, RatePerHour = 12.23M }; var employeePayrollItem4 = new EmployeePayrollItem { EmployeeId = 2, TotalHours = 15.2, TotalAmount = 300.10M, PayrollDate = payrollDate, RateType = RateType.NightDifferential, Multiplier = 1, RatePerHour = 122.2M }; var employeePayrollItem5 = new EmployeePayrollItem { EmployeeId = 2, TotalHours = 1.25, TotalAmount = 50, PayrollDate = payrollDate, RateType = RateType.RegularHoliday, Multiplier = 1, RatePerHour = 0.25M }; var employeePayrollItem6 = new EmployeePayrollItem { EmployeeId = 1, TotalAmount = 150.12M, PayrollDate = payrollDate, RateType = RateType.RegularHolidayNotWorked, Multiplier = 1, RatePerHour = 0.25M }; var employeePayrollItem7 = new EmployeePayrollItem { EmployeeId = 1, TotalAmount = 40, PayrollDate = payrollDate, RateType = RateType.RegularHolidayOT, Multiplier = 1, RatePerHour = 0.25M }; var employeePayrollItem8 = new EmployeePayrollItem { EmployeeId = 2, TotalAmount = 540.02M, PayrollDate = payrollDate, RateType = RateType.RegularHolidayRestDay, Multiplier = 1, RatePerHour = 0.25M }; //Not included var employeePayrollItem9 = new EmployeePayrollItem { EmployeeId = 2, TotalAmount = 540.02M, PayrollDate = DateTime.Parse("06/20/2016"), RateType = RateType.RegularHolidayRestDay, Multiplier = 1, RatePerHour = 0.25M }; _employeePayrollItemRepository.Add(employeePayrollItem); _employeePayrollItemRepository.Add(employeePayrollItem2); _employeePayrollItemRepository.Add(employeePayrollItem3); _employeePayrollItemRepository.Add(employeePayrollItem4); _employeePayrollItemRepository.Add(employeePayrollItem5); _employeePayrollItemRepository.Add(employeePayrollItem6); _employeePayrollItemRepository.Add(employeePayrollItem7); _employeePayrollItemRepository.Add(employeePayrollItem8); _employeePayrollItemRepository.Add(employeePayrollItem9); _unitOfWork.Commit(); //Test var dateStart = DateTime.Parse("05/19/2016"); var dateEnd = DateTime.Parse("05/20/2016"); var payrollList = _employeePayrollService.GeneratePayrollGrossPayByDateRange(payrollDate, dateStart, dateEnd); Assert.IsNotNull(payrollList); Assert.AreEqual(2, payrollList.Count()); Assert.AreEqual(1, payrollList[0].EmployeeId); Assert.AreEqual(dateStart, payrollList[0].CutOffStartDate); Assert.AreEqual(dateEnd, payrollList[0].CutOffEndDate); Assert.AreEqual(false, payrollList[0].IsTaxed); Assert.AreEqual(0, payrollList[0].TotalAdjustment); Assert.AreEqual(0, payrollList[0].TotalDeduction); Assert.AreEqual(525.67M, payrollList[0].TotalGross); Assert.AreEqual(525.67M, payrollList[0].TotalNet); Assert.AreEqual(525.67M, payrollList[0].TaxableIncome); Assert.AreEqual(2, payrollList[1].EmployeeId); Assert.AreEqual(dateStart, payrollList[1].CutOffStartDate); Assert.AreEqual(dateEnd, payrollList[1].CutOffEndDate); Assert.AreEqual(false, payrollList[1].IsTaxed); Assert.AreEqual(0, payrollList[1].TotalAdjustment); Assert.AreEqual(0, payrollList[1].TotalDeduction); Assert.AreEqual(890.12M, payrollList[1].TotalGross); Assert.AreEqual(890.12M, payrollList[1].TotalNet); Assert.AreEqual(890.12M, payrollList[1].TaxableIncome); }