Exemplo n.º 1
0
        public void GenerateTax(EmployeePayroll payroll)
        {
            //Tax computation
            //Get old payroll for tax computation
            var frequency = _settingService.GetByKey(TAX_FREQUENCY);

            FrequencyType taxFrequency = (FrequencyType)Convert.ToInt32(frequency);

            var payrollForTaxProcessing =
                GetForTaxProcessingByEmployee(payroll.EmployeeId, payroll.PayrollDate,
                                              (taxFrequency == FrequencyType.SemiMonthly ? true : false));

            decimal totalTaxableIncome = payroll.TaxableIncome;

            foreach (EmployeePayroll employeePayroll in payrollForTaxProcessing)
            {
                totalTaxableIncome += employeePayroll.TaxableIncome;

                //Update Payroll
                Update(employeePayroll);
                employeePayroll.IsTaxed = true;
            }

            //Compute tax
            var employeeInfo = _employeeInfoService.GetByEmployeeId(payroll.EmployeeId);
            var totalTax     = _employeePayrollDeductionService
                               .ComputeTax(payroll.PayrollId, employeeInfo, totalTaxableIncome, taxFrequency);

            //Update payroll for total deductions and total grosss
            payroll.TotalDeduction += totalTax;
            payroll.TotalNet        = payroll.TotalGross - payroll.TotalDeduction;
            payroll.IsTaxed         = true;
        }
        public Decimal GenerateDeductionsByPayroll(EmployeePayroll employeePayroll)
        {
            double totalHours = 0;
            //Get total number of hours

            /* if (isSemiMonthly)
             * {
             *   totalHours = Double.Parse(_settingService.GetByKey(SEMIMONTHLY_TOTAL_HOURS));
             * }
             * else
             * {
             *   totalHours = Double.Parse(_settingService.GetByKey(MONTHLY_TOTAL_HOURS));
             * }*/

            //Get employees
            //var employeeList = _employeeInfoService.GetAllActive();

            var employee      = _employeeInfoService.GetByEmployeeId(employeePayroll.EmployeeId);
            var deductionList = _deductionService.GetAllCustomizable();

            decimal totalDeductions = 0;

            //Every deductions check for available deduction for employee
            foreach (Deduction deduction in deductionList)
            {
                var employeeDeduction = _employeeDeductionService
                                        .GetByDeductionAndEmployee(deduction.DeductionId, employee.EmployeeId);

                if (employeeDeduction != null)
                {
                    //Create a deduction entry
                    EmployeePayrollDeduction employeePayrollDeduction =
                        new EmployeePayrollDeduction
                    {
                        EmployeeId        = employee.EmployeeId,
                        DeductionId       = deduction.DeductionId,
                        Amount            = employeeDeduction.Amount,
                        DeductionDate     = DateTime.Now,
                        EmployeePayrollId = employeePayroll.PayrollId
                    };

                    _employeePayrollDeductionRepository.Add(employeePayrollDeduction);
                    totalDeductions += employeeDeduction.Amount;
                }
            }

            return(totalDeductions);
        }
Exemplo n.º 3
0
        /**
         * Generate employee leaves
         *
         **/
        public void GenerateEmployeeLeavesPay(DateTime payrollDate, DateTime payrollStartDate, DateTime payrollEndDate)
        {
            //Get all active leaves within payroll dates
            IList <EmployeeLeave> leaves = _employeeLeaveRepository
                                           .GetEmployeePayableLeavesByDateRange(payrollStartDate, payrollEndDate)
                                           .OrderBy(l => l.EmployeeId).ToList();

            //for each leaves
            foreach (EmployeeLeave leave in leaves)
            {
                WorkSchedule workSchedule = _employeeWorkScheduleService
                                            .GetByEmployeeId(leave.EmployeeId).WorkSchedule;
                var employee            = _employeeInfoService.GetByEmployeeId(leave.EmployeeId);
                var hourlyRate          = _employeeSalaryService.GetEmployeeHourlyRate(employee);
                var employeePayrollItem = this.Find(leave.EmployeeId, payrollDate, RateType.Leave);

                //for each day in leaves
                foreach (DateTime day in DatetimeExtension.EachDay(leave.StartDate, leave.EndDate))
                {
                    //Check if within payroll date
                    if (day.IsWithinDateRange(payrollStartDate, payrollEndDate))
                    {
                        var isRestDay = day.IsRestDay(workSchedule.WeekStart, workSchedule.WeekEnd);

                        //Will be paid only if employee have schedule on current day
                        if (!isRestDay)
                        {
                            //If more than 8 use 8 hours else use indicated hours
                            //Note that if the employee will file half day in a date range
                            //File the half day on a separate entry
                            var hours = leave.Hours > 8 ? 8 : leave.Hours;
                            //Update
                            if (employeePayrollItem != null)
                            {
                                _employeePayrollItemRepository.Update(employeePayrollItem);

                                employeePayrollItem.TotalAmount += (hourlyRate * hours);
                                employeePayrollItem.TotalHours  += hours;
                            }
                            else
                            {
                                //Create new
                                EmployeePayrollItem payrollItem = new EmployeePayrollItem
                                {
                                    EmployeeId  = leave.EmployeeId,
                                    PayrollDate = payrollDate,
                                    RateType    = RateType.Leave,
                                    Multiplier  = 1,
                                    RatePerHour = hourlyRate,
                                    TotalAmount = (hourlyRate * hours),
                                    TotalHours  = hours
                                };
                                _employeePayrollItemRepository.Add(payrollItem);
                            }

                            _unitOfWork.Commit();
                        }
                    }
                }
            }
        }
        /*Note that this method is applicable to employees with hourly rate*/
        public void GenerateEmployeeDailySalaryByDateRange(DateTime dateFrom, DateTime dateTo)
        {
            //Delete existing by date range
            DeleteByDateRange(dateFrom, dateTo);

            IList <TotalEmployeeHours> totalEmployeeHours =
                _totalEmployeeHoursService.GetByDateRange(dateFrom, dateTo);

            Double restDayRate               = Double.Parse(_settingService.GetByKey(SettingValue.RATE_REST_DAY));
            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));

            foreach (TotalEmployeeHours totalHours in totalEmployeeHours)
            {
                EmployeeInfo employeeInfo = _employeeInfoService.GetByEmployeeId(totalHours.EmployeeId);

                var hourlyRate = _employeeSalaryService.GetEmployeeHourlyRate(employeeInfo);

                var employeeWorkSchedule =
                    _employeeWorkScheduleService.GetByEmployeeId(totalHours.EmployeeId);

                //No work schedule, no computation
                if (employeeWorkSchedule != null)
                {
                    DateTime date           = totalHours.Date;
                    Double   rateMultiplier = 0;

                    var     workSchedule = employeeWorkSchedule.WorkSchedule;
                    var     isRestDay    = date.IsRestDay(workSchedule.WeekStart, workSchedule.WeekEnd);
                    Holiday holiday      = _holidayService.GetHoliday(date);

                    //Check if rest day and not special holiday
                    if (isRestDay &&
                        !(holiday != null && !holiday.IsRegularHoliday))
                    {
                        rateMultiplier *= restDayRate;
                    }

                    //Check if holiday
                    if (holiday != null)
                    {
                        if (holiday.IsRegularHoliday)
                        {
                            rateMultiplier *= holidayRegularRate;
                        }
                        else
                        {
                            if (isRestDay)
                            {
                                rateMultiplier *= holidaySpecialRestDayRate;
                            }
                            else
                            {
                                rateMultiplier *= holidaySpecialRate;
                            }
                        }
                    }
                    //if OT
                    if (totalHours.Type == RateType.OverTime)
                    {
                        //If holiday use holiday ot rate
                        if (holiday != null)
                        {
                            rateMultiplier *= OTRateHoliday;
                        }
                        else
                        {
                            rateMultiplier *= OTRate;
                        }
                    }

                    decimal totalPayment = 0;

                    //if NightDif
                    if (totalHours.Type == RateType.NightDifferential)
                    {
                        //rateMultiplier *= nightDiffRate;

                        /*if (rateMultiplier > 1)
                         * {
                         *  totalPayment = ((decimal)(totalHours.Hours * (rateMultiplier - 1)) * hourlyRate);
                         * }*/
                        totalPayment += (decimal)(nightDiffRate * totalHours.Hours * rateMultiplier);
                    }
                    else
                    {
                        totalPayment = ((decimal)(totalHours.Hours * rateMultiplier)) * hourlyRate;
                    }

                    var employeeDailySalary = new EmployeeDailyPayroll
                    {
                        EmployeeId           = totalHours.EmployeeId,
                        Date                 = totalHours.Date,
                        TotalPay             = totalPayment,
                        TotalEmployeeHoursId = totalHours.TotalEmployeeHoursId,
                        RateType             = totalHours.Type
                    };

                    //Save
                    _employeeDailyPayrollRepository.Add(employeeDailySalary);
                }
            }
            _unitOfWork.Commit();

            //Generate holiday pays
            GenerateEmployeeHolidayPay(dateFrom, dateTo);
            _unitOfWork.Commit();
        }