Esempio n. 1
0
        public int GenerateEmployeeHours(DateTime fromDate, DateTime toDate)
        {
            //Get all active employee with the same frequency
            var employees = _employeeInfoService.GetAllActive();

            //Delete existing entries with the same date
            var employeeHoursList = this.GetByDateRange(fromDate, toDate);

            _employeeHoursRepository.DeleteAll(employeeHoursList);
            _unitOfWork.Commit();

            foreach (var employee in employees)
            {
                employeeWorkSchedule = _employeeWorkScheduleService.GetByEmployeeId(employee.EmployeeId);

                //Will not compute if work schedule is null
                if (employeeWorkSchedule != null)
                {
                    foreach (DateTime d in DatetimeExtension.EachDay(fromDate, toDate))
                    {
                        day = d;
                        //Get all employee attendance within date range
                        // Will not include attendance without clockout
                        IList <Attendance> attendanceList = _attendanceService
                                                            .GetAttendanceForProcessing(employee.EmployeeId, day);

                        ComputeEmployeeHours(attendanceList, day);
                    }
                }
            }

            _unitOfWork.Commit();

            return(0);
        }
Esempio n. 2
0
        public decimal GetSalaryRateForEachYear()
        {
            decimal percent = EmployeeType.SalaryRateForEachYear * DatetimeExtension.GetYearLeft(DateDeployment);

            percent = percent > EmployeeType.MaxSalaryRateForEachYear ? EmployeeType.MaxSalaryRateForEachYear : percent;
            return(GetBasicSalary() / 100 * percent);
        }
        public int GenerateEmployeeHours(DateTime fromDate, DateTime toDate)
        {
            //Get all active employee with the same frequency
            var employees = _employeeInfoService.GetAllActive();

            //Delete existing entries with the same date
            //var employeeHoursList = this.GetByDateRange(fromDate, toDate);
            //_employeeHoursRepository.DeleteAll(employeeHoursList);
            //_unitOfWork.Commit();

            foreach (var employee in employees)
            {
                employeeWorkSchedule = _employeeWorkScheduleService.GetByEmployeeId(employee.EmployeeId);

                //Will not compute if work schedule is null
                if (employeeWorkSchedule != null)
                {
                    foreach (DateTime d in DatetimeExtension.EachDay(fromDate, toDate))
                    {
                        ComputeEmployeeHours(d, employee.EmployeeId);
                    }
                }
            }

            _unitOfWork.Commit();

            return(0);
        }
Esempio n. 4
0
        public void WeekOfYearStringTest()
        {
            DateTime dtime    = DateTime.Today.LastWeekendDate().AddDays(21); // TODO: Initialize to an appropriate value
            string   expected = string.Empty;                                 // TODO: Initialize to an appropriate value
            string   actual;

            actual = DatetimeExtension.WeekOfYearString(dtime);
        }
        public int GenerateEmployeeHours(DateTime fromDate, DateTime toDate, int employeeId)
        {
            employeeWorkSchedule = _employeeWorkScheduleService.GetByEmployeeId(employeeId);

            //Will not compute if work schedule is null
            if (employeeWorkSchedule != null)
            {
                foreach (DateTime d in DatetimeExtension.EachDay(fromDate, toDate))
                {
                    ComputeEmployeeHours(d, employeeId);
                }
            }

            _unitOfWork.Commit();

            return(0);
        }
Esempio n. 6
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);
        }
Esempio n. 7
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();
                        }
                    }
                }
            }
        }
Esempio n. 8
0
        /**
         * Generate employee holiday pay NOT WORKED
         *
         **/
        public void GenerateEmployeeHolidayPay(DateTime payrollDate, DateTime payrollStartDate, DateTime payrollEndDate)
        {
            //Get all active employees
            IList <EmployeeInfo> employees = _employeeInfoService.GetAllActive();

            foreach (DateTime day in DatetimeExtension.EachDay(payrollStartDate, payrollEndDate))
            {
                //Check if holiday
                var    holiday = _holidayService.GetHoliday(day);
                bool   isSpecialHolidayPaid = Convert.ToInt32(_settingService.GetByKey(SettingValue.PAYROLL_IS_SPHOLIDAY_WITH_PAY)) > 0;
                bool   isRestDayHolidayPaid = Convert.ToInt32(_settingService.GetByKey(SettingValue.PAYROLL_IS_REST_DAY_HOLIDAY_WITH_PAY)) > 0;
                Double restDayRate          = Double.Parse(_settingService.GetByKey(SettingValue.RATE_REST_DAY));
                var    isRestDay            = false;

                if (holiday != null && (holiday.IsRegularHoliday || isSpecialHolidayPaid))
                {
                    foreach (EmployeeInfo employee in employees)
                    {
                        WorkSchedule workSchedule = _employeeWorkScheduleService.GetByEmployeeId(employee.EmployeeId).WorkSchedule;

                        if (workSchedule != null)
                        {
                            isRestDay = day.IsRestDay(workSchedule.WeekStart, workSchedule.WeekEnd);

                            //Will only check if within schedule if rest day holiday is NOT paid or
                            // if SPECIAL Holiday
                            if (!isRestDayHolidayPaid || !holiday.IsRegularHoliday)
                            {
                                //Check if within schedule
                                if (isRestDay)
                                {
                                    //Don't proceed
                                    continue;
                                }
                            }

                            //Check if worked before holiday
                            var lastDayOfWork = getLastDayOfWork(day, workSchedule);
                            var employeeHours = _totalEmployeeHoursService.GetByEmployeeDate(employee.EmployeeId, lastDayOfWork);

                            //Don't proceed if the employee didn't work the day before holiday
                            if (holiday.IsAlwaysPayable == false)
                            {
                                //If didnt work before holiday
                                //Check if there's a filed leave with holiday pay after payable
                                if (employeeHours == null || employeeHours.Count <= 0)
                                {
                                    var leave = _employeeLeaveRepository
                                                .CountLeavesHolidayPayable(employee.EmployeeId, lastDayOfWork);
                                    //Without filed don't proceed in computing
                                    if (leave <= 0)
                                    {
                                        continue;
                                    }
                                }
                            }
                        }
                        else
                        {
                            //No work schedule, no holiday pay
                            continue;
                        }

                        //If with schedule on this date, generate holiday pay

                        //Check if with worked hours
                        double totalEmployeeHours =
                            _totalEmployeeHoursService.CountTotalHours(employee.EmployeeId, day);

                        int workHours  = Convert.ToInt32(_settingService.GetByKey(SettingValue.PAYROLL_REGULAR_HOURS));
                        var hourlyRate = _employeeSalaryService.GetEmployeeHourlyRate(employee);
                        var rateType   = holiday.IsRegularHoliday ?
                                         (isRestDay ? RateType.RegularHolidayRestDayNotWorked : RateType.RegularHolidayNotWorked) :
                                         RateType.SpecialHolidayNotWorked;

                        var employeePayrollItem = Find(employee.EmployeeId, day, rateType);
                        //If null create a holiday pay
                        if (totalEmployeeHours <= 0)
                        {
                            var multiplier = 1d;
                            if (isRestDay)
                            {
                                multiplier *= restDayRate;
                            }
                            //Update
                            if (employeePayrollItem != null)
                            {
                                _employeePayrollItemRepository.Update(employeePayrollItem);

                                employeePayrollItem.TotalAmount += (hourlyRate * workHours) * (decimal)multiplier;
                                employeePayrollItem.TotalHours  += workHours;
                            }
                            else
                            {
                                //Create new
                                EmployeePayrollItem payrollItem = new EmployeePayrollItem
                                {
                                    EmployeeId  = employee.EmployeeId,
                                    PayrollDate = payrollDate,
                                    TotalAmount = (hourlyRate * workHours) * (decimal)multiplier,
                                    TotalHours  = workHours,
                                    RateType    = rateType,
                                    Multiplier  = multiplier,
                                    RatePerHour = hourlyRate
                                };

                                _employeePayrollItemRepository.Add(payrollItem);
                            }
                        }
                        else
                        {
                            var multiplier = 1d;
                            if (isRestDay)
                            {
                                multiplier *= restDayRate;
                            }
                            //If existing create new for remaining unpaid hours
                            if (totalEmployeeHours < workHours)
                            {
                                var remainingUnpaidHours =
                                    Convert.ToDouble(workHours - totalEmployeeHours);

                                var amount = hourlyRate * (decimal)remainingUnpaidHours;

                                //Update
                                if (employeePayrollItem != null)
                                {
                                    _employeePayrollItemRepository.Update(employeePayrollItem);

                                    employeePayrollItem.TotalAmount += (amount * (decimal)multiplier);
                                    employeePayrollItem.TotalHours  += remainingUnpaidHours;
                                }
                                else
                                {
                                    //Create new
                                    EmployeePayrollItem payrollItem = new EmployeePayrollItem
                                    {
                                        EmployeeId  = employee.EmployeeId,
                                        PayrollDate = payrollDate,
                                        TotalAmount = (amount * (decimal)multiplier),
                                        TotalHours  = remainingUnpaidHours,
                                        RateType    = rateType,
                                        Multiplier  = multiplier,
                                        RatePerHour = hourlyRate
                                    };
                                    _employeePayrollItemRepository.Add(payrollItem);
                                }
                            }
                        }
                        _unitOfWork.Commit();
                    }
                }
            }
        }
        public void GenerateEmployeeHolidayPay(DateTime payrollStartDate, DateTime payrollEndDate)
        {
            //Get all active employees
            IList <EmployeeInfo> employees = _employeeInfoService.GetAllActive();

            foreach (DateTime day in DatetimeExtension.EachDay(payrollStartDate, payrollEndDate))
            {
                //Check if holiday
                var  holiday = _holidayService.GetHoliday(day);
                bool isSpecialHolidayPaid = Convert.ToInt32(_settingService.GetByKey(SettingValue.PAYROLL_IS_SPHOLIDAY_WITH_PAY)) > 0;

                if (holiday != null && (holiday.IsRegularHoliday || isSpecialHolidayPaid))
                {
                    foreach (EmployeeInfo employee in employees)
                    {
                        WorkSchedule workSchedule = _employeeWorkScheduleService.GetByEmployeeId(employee.EmployeeId).WorkSchedule;

                        if (workSchedule != null)
                        {
                            //Check if within schedule
                            if (day.IsRestDay(workSchedule.WeekStart, workSchedule.WeekEnd))
                            {
                                //Don't proceed
                                continue;
                            }
                        }
                        else
                        {
                            //No work schedule, no holiday pay
                            continue;
                        }

                        //If with schedule on this date, generate holiday pay

                        //Check if already have daily entry
                        EmployeeDailyPayroll dailyPayroll = _employeeDailyPayrollRepository.GetByDate(employee.EmployeeId, day);

                        int workHours  = Convert.ToInt32(_settingService.GetByKey(SettingValue.PAYROLL_REGULAR_HOURS));
                        var hourlyRate = _employeeSalaryService.GetEmployeeHourlyRate(employee);

                        //If null create a holiday pay
                        if (dailyPayroll == null)
                        {
                            EmployeeDailyPayroll newDailyPayroll = new EmployeeDailyPayroll
                            {
                                EmployeeId = employee.EmployeeId,
                                Date       = day,
                                TotalPay   = hourlyRate * workHours,
                                //RateType = RateType.
                            };

                            _employeeDailyPayrollRepository.Add(newDailyPayroll);
                        }
                        else
                        {
                            //If existing create new for remaining unpaid hours
                            //if total hours worked is less than regular working hours
                            //Get total hours worked
                            IList <TotalEmployeeHours> employeeHours =
                                _totalEmployeeHoursService.GetByTypeAndDateRange(employee.EmployeeId, null, payrollStartDate, payrollEndDate);
                            var totalEmployeeHours = employeeHours.Sum(h => h.Hours);
                            if (totalEmployeeHours < workHours)
                            {
                                var remainingUnpaidHours =
                                    Convert.ToDecimal(workHours - totalEmployeeHours);

                                EmployeeDailyPayroll newDailyPayroll = new EmployeeDailyPayroll
                                {
                                    EmployeeId = employee.EmployeeId,
                                    Date       = day,
                                    TotalPay   = hourlyRate * remainingUnpaidHours,
                                    //RateType = RateType.Holiday
                                };
                                _employeeDailyPayrollRepository.Add(newDailyPayroll);
                            }
                        }
                    }
                }
            }
        }