コード例 #1
0
        /*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);
        }
コード例 #2
0
        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);
        }