Example #1
0
        public void GenerateTotal(IList <EmployeeHours> employeeHoursList)
        {
            if (employeeHoursList != null && employeeHoursList.Any())
            {
                int      tempEmployeeId = 0;
                DateTime?tempDate       = null;
                RateType?tempRate       = null;

                TotalEmployeeHours totalEmployeeHours = null;

                EmployeeHours last = employeeHoursList.Last();

                foreach (EmployeeHours hours in employeeHoursList)
                {
                    // If not the same date, type and employee as the last entry should create new total employee hours
                    if (tempEmployeeId != hours.EmployeeId ||
                        tempDate != hours.Date || tempRate != hours.Type)
                    {
                        //Save previous entry if any
                        if (totalEmployeeHours != null)
                        {
                            //Check if there's an existing total entry for the employee, rate type and date
                            var existingTotalEmployeeHours = _totalEmployeeHoursRepository
                                                             .GetByEmployeeDateAndType(totalEmployeeHours.EmployeeId,
                                                                                       totalEmployeeHours.Date, totalEmployeeHours.Type);

                            //If yes update the value
                            if (existingTotalEmployeeHours != null)
                            {
                                _totalEmployeeHoursRepository.Update(existingTotalEmployeeHours);

                                existingTotalEmployeeHours.Hours = (existingTotalEmployeeHours.Hours + totalEmployeeHours.Hours);
                            }
                            else //Create new entry
                            {
                                totalEmployeeHours.Hours = (totalEmployeeHours.Hours);

                                _totalEmployeeHoursRepository.Add(totalEmployeeHours);
                            }
                        }

                        //Create new total employee hours obj
                        totalEmployeeHours = new TotalEmployeeHours
                        {
                            Date       = hours.Date,
                            EmployeeId = hours.EmployeeId,
                            Type       = hours.Type,
                            Hours      = hours.Hours
                        };
                    }
                    else //Same Employee, Date and Rate, Update the total Employee hours data
                    {
                        totalEmployeeHours.Hours = totalEmployeeHours.Hours + hours.Hours;
                    }

                    //If Last Iteration and New entry
                    //Save
                    if (hours.Equals(last) && totalEmployeeHours.TotalEmployeeHoursId <= 0)
                    {
                        //Check if there's an existing total entry for the employee, rate type and date
                        var existingTotalEmployeeHours = _totalEmployeeHoursRepository
                                                         .GetByEmployeeDateAndType(totalEmployeeHours.EmployeeId,
                                                                                   totalEmployeeHours.Date, totalEmployeeHours.Type);

                        //If yes update the value
                        if (existingTotalEmployeeHours != null)
                        {
                            _totalEmployeeHoursRepository.Update(existingTotalEmployeeHours);

                            existingTotalEmployeeHours.Hours = (existingTotalEmployeeHours.Hours + totalEmployeeHours.Hours);
                        }
                        else //Create new entry
                        {
                            totalEmployeeHours.Hours = (totalEmployeeHours.Hours);

                            _totalEmployeeHoursRepository.Add(totalEmployeeHours);
                        }
                    }

                    //Set Reference data
                    tempDate       = hours.Date;
                    tempEmployeeId = hours.EmployeeId;
                    tempRate       = hours.Type;

                    //Update employee hours IsIncludedInTotal value
                    _employeeHoursService.Update(hours);

                    hours.IsIncludedInTotal = true;
                }

                //Commit all change
                _unitOfWork.Commit();
            }
        }
        public void ComputeAllowance()
        {
            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 totalEmployeeHours = new TotalEmployeeHours
            {
                EmployeeId           = 1,
                Date                 = DateTime.Parse("05/06/2016"),
                Hours                = 8,
                Type                 = RateType.Regular,
                TotalEmployeeHoursId = 1
            };

            var totalEmployeeHours2 = new TotalEmployeeHours
            {
                EmployeeId           = 1,
                Date                 = DateTime.Parse("05/06/2016"),
                Hours                = 3,
                Type                 = RateType.OverTime,
                TotalEmployeeHoursId = 2
            };

            var totalEmployeeHours3 = new TotalEmployeeHours
            {
                EmployeeId           = 2,
                Date                 = DateTime.Parse("05/06/2016"),
                Hours                = 5,
                Type                 = RateType.Regular,
                TotalEmployeeHoursId = 1
            };

            var totalEmployeeHours4 = new TotalEmployeeHours
            {
                EmployeeId           = 2,
                Date                 = DateTime.Parse("05/06/2016"),
                Hours                = 2,
                Type                 = RateType.OverTime,
                TotalEmployeeHoursId = 2
            };

            var totalEmployeeHours5 = new TotalEmployeeHours
            {
                EmployeeId           = 1,
                Date                 = DateTime.Parse("05/07/2016"),
                Hours                = 10,
                Type                 = RateType.Regular,
                TotalEmployeeHoursId = 1
            };

            var totalEmployeeHours6 = new TotalEmployeeHours
            {
                EmployeeId           = 1,
                Date                 = DateTime.Parse("05/07/2016"),
                Hours                = 3,
                Type                 = RateType.OverTime,
                TotalEmployeeHoursId = 2
            };

            var totalEmployeeHours7 = new TotalEmployeeHours
            {
                EmployeeId           = 2,
                Date                 = DateTime.Parse("05/07/2016"),
                Hours                = 1,
                Type                 = RateType.Regular,
                TotalEmployeeHoursId = 1
            };

            var totalEmployeeHours8 = new TotalEmployeeHours
            {
                EmployeeId           = 2,
                Date                 = DateTime.Parse("05/07/2016"),
                Hours                = 2,
                Type                 = RateType.NightDifferential,
                TotalEmployeeHoursId = 2
            };

            _totalEmployeeHoursRepository.Add(totalEmployeeHours);
            _totalEmployeeHoursRepository.Add(totalEmployeeHours2);
            _totalEmployeeHoursRepository.Add(totalEmployeeHours3);
            _totalEmployeeHoursRepository.Add(totalEmployeeHours4);
            _totalEmployeeHoursRepository.Add(totalEmployeeHours5);
            _totalEmployeeHoursRepository.Add(totalEmployeeHours6);
            _totalEmployeeHoursRepository.Add(totalEmployeeHours7);
            _totalEmployeeHoursRepository.Add(totalEmployeeHours8);

            var payrollDate = DateTime.Parse("05/11/2016");

            var employeePayrollItem = new EmployeePayrollItem
            {
                EmployeeId  = 1,
                TotalAmount = 220.55M,
                PayrollDate = payrollDate,
                RateType    = RateType.RegularHolidayRestDay,
                Multiplier  = 1,
                RatePerHour = 0.25M
            };

            var employeePayrollItem2 = new EmployeePayrollItem
            {
                EmployeeId  = 1,
                TotalAmount = 100,
                PayrollDate = payrollDate,
                RateType    = RateType.RegularHolidayRestDay,
                Multiplier  = 1,
                RatePerHour = 0.25M
            };

            var employeePayrollItem3 = new EmployeePayrollItem
            {
                EmployeeId  = 1,
                TotalAmount = 15,
                PayrollDate = payrollDate,
                RateType    = RateType.RegularHolidayRestDay,
                Multiplier  = 1,
                RatePerHour = 0.25M
            };

            var employeePayrollItem4 = new EmployeePayrollItem
            {
                EmployeeId  = 2,
                TotalAmount = 300.10M,
                PayrollDate = payrollDate,
                RateType    = RateType.RegularHolidayRestDay,
                Multiplier  = 1,
                RatePerHour = 0.25M
            };

            var employeePayrollItem5 = new EmployeePayrollItem
            {
                EmployeeId  = 2,
                TotalAmount = 50,
                PayrollDate = payrollDate,
                RateType    = RateType.RegularHolidayRestDay,
                Multiplier  = 1,
                RatePerHour = 0.25M
            };

            var employeePayrollItem6 = new EmployeePayrollItem
            {
                EmployeeId  = 1,
                TotalAmount = 150.12M,
                PayrollDate = payrollDate,
                RateType    = RateType.RegularHolidayRestDay,
                Multiplier  = 1,
                RatePerHour = 0.25M
            };

            var employeePayrollItem7 = new EmployeePayrollItem
            {
                EmployeeId  = 1,
                TotalAmount = 40,
                PayrollDate = payrollDate,
                RateType    = RateType.RegularHolidayRestDay,
                Multiplier  = 1,
                RatePerHour = 0.25M
            };

            var employeePayrollItem8 = new EmployeePayrollItem
            {
                EmployeeId  = 2,
                TotalAmount = 540.02M,
                PayrollDate = payrollDate,
                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);

            _unitOfWork.Commit();

            //Test
            var dateStart = DateTime.Parse("04/30/2016");
            var dateEnd   = DateTime.Parse("05/10/2016");

            _employeePayrollService.GeneratePayroll(dateStart, dateEnd);
            _unitOfWork.Commit();

            var payrollList = _employeePayrollService.GetByDateRange(payrollDate, payrollDate);

            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(true, payrollList[0].IsTaxed);
            Assert.AreEqual(0, payrollList[0].TotalAdjustment);
            Assert.AreEqual(200.6M, payrollList[0].TotalDeduction);
            Assert.AreEqual(552.59M, decimal.Round(payrollList[0].TotalGross, 2));
            Assert.AreEqual(351.99M, decimal.Round(payrollList[0].TotalNet, 2));
            Assert.AreEqual(351.99M, decimal.Round(payrollList[0].TaxableIncome, 2));
            Assert.AreEqual(26.92M, decimal.Round(payrollList[0].TotalAllowance, 2));

            Assert.AreEqual(2, payrollList[1].EmployeeId);
            Assert.AreEqual(dateStart, payrollList[1].CutOffStartDate);
            Assert.AreEqual(dateEnd, payrollList[1].CutOffEndDate);
            Assert.AreEqual(true, payrollList[1].IsTaxed);
            Assert.AreEqual(0, payrollList[1].TotalAdjustment);
            Assert.AreEqual(201.60M, payrollList[1].TotalDeduction);
            Assert.AreEqual(902.43M, decimal.Round(payrollList[1].TotalGross, 2));
            Assert.AreEqual(700.83M, decimal.Round(payrollList[1].TotalNet, 2));
            Assert.AreEqual(700.83M, decimal.Round(payrollList[1].TaxableIncome, 2));
            Assert.AreEqual(12.31M, decimal.Round(payrollList[1].TotalAllowance, 2));
        }
        //[TestMethod]
        public void GenerateEmployeeDailySalaryByDateRangeRegular()
        {
            //Arrange
            Initialize();
            DeleteData();

            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",
                LastName     = "Cawicaan",
                MiddleName   = "Bue",
                BirthDate    = DateTime.Parse("10/30/1989"),
                Gender       = 2,
                IsActive     = true
            };

            var employeeInfo = new EmployeeInfo
            {
                Employee        = employee,
                Salary          = 5000,
                SalaryFrequency = FrequencyType.Weekly
            };

            var employeeInfo2 = new EmployeeInfo
            {
                Employee        = employee2,
                Salary          = 8000,
                SalaryFrequency = FrequencyType.Weekly
            };

            _employeeInfoRepository.Add(employeeInfo);
            _employeeInfoRepository.Add(employeeInfo2);

            var workSchedule = new WorkSchedule
            {
                TimeStart = new TimeSpan(0, 7, 0, 0),
                TimeEnd   = new TimeSpan(0, 16, 0, 0),
                WeekStart = 1,
                WeekEnd   = 5
            };

            var employeeWorkSchedule = new EmployeeWorkSchedule
            {
                WorkSchedule = workSchedule,
                EmployeeId   = 1
            };

            var employeeWorkSchedule2 = new EmployeeWorkSchedule
            {
                WorkSchedule = workSchedule,
                EmployeeId   = 2
            };

            _employeeWorkScheduleRepository.Add(employeeWorkSchedule);
            _employeeWorkScheduleRepository.Add(employeeWorkSchedule2);

            //Total EmployeeHours
            var totalEmployeeHours1 = new TotalEmployeeHours
            {
                Date                 = DateTime.Parse("05/02/2016"),
                EmployeeId           = 1,
                Hours                = 8,
                TotalEmployeeHoursId = 1,
                Type                 = RateType.Regular
            };

            var totalEmployeeHours2 = new TotalEmployeeHours
            {
                Date                 = DateTime.Parse("05/02/2016"),
                EmployeeId           = 2,
                Hours                = 7.5,
                TotalEmployeeHoursId = 2,
                Type                 = RateType.Regular
            };

            var totalEmployeeHours3 = new TotalEmployeeHours
            {
                Date                 = DateTime.Parse("05/03/2016"),
                EmployeeId           = 1,
                Hours                = 8.1,
                TotalEmployeeHoursId = 2,
                Type                 = RateType.Regular
            };

            var totalEmployeeHours4 = new TotalEmployeeHours
            {
                Date                 = DateTime.Parse("05/03/2016"),
                EmployeeId           = 2,
                Hours                = 4,
                TotalEmployeeHoursId = 2,
                Type                 = RateType.Regular
            };

            _totalEmployeeHoursRepository.Add(totalEmployeeHours1);
            _totalEmployeeHoursRepository.Add(totalEmployeeHours2);
            _totalEmployeeHoursRepository.Add(totalEmployeeHours3);
            _totalEmployeeHoursRepository.Add(totalEmployeeHours4);

            _unitOfWork.Commit();

            //Test
            var dateFrom = DateTime.Parse("05/02/2016");
            var dateTo   = DateTime.Parse("05/03/2016");

            _employeeDailyPayrollService.GenerateEmployeeDailySalaryByDateRange(dateFrom, dateTo);

            //Results Verification
            var results = _employeeDailyPayrollService.GetByDateRange(dateFrom, dateTo);

            Assert.IsNotNull(results);
            Assert.AreEqual(4, results.Count);

            Assert.AreEqual(1, results[0].EmployeeId);
            Assert.AreEqual(3, results[0].TotalEmployeeHoursId);
            Assert.AreEqual((decimal)1012.50, results[0].TotalPay);
            Assert.AreEqual(DateTime.Parse("05/03/2016"), results[0].Date);

            Assert.AreEqual(1, results[1].EmployeeId);
            Assert.AreEqual(1, results[1].TotalEmployeeHoursId);
            Assert.AreEqual((decimal)1000, results[1].TotalPay);
            Assert.AreEqual(DateTime.Parse("05/02/2016"), results[1].Date);

            Assert.AreEqual(2, results[2].EmployeeId);
            Assert.AreEqual(4, results[2].TotalEmployeeHoursId);
            Assert.AreEqual((decimal)800, results[2].TotalPay);
            Assert.AreEqual(DateTime.Parse("05/03/2016"), results[2].Date);

            Assert.AreEqual(2, results[3].EmployeeId);
            Assert.AreEqual(2, results[3].TotalEmployeeHoursId);
            Assert.AreEqual((decimal)1500, results[3].TotalPay);
            Assert.AreEqual(DateTime.Parse("05/02/2016"), results[3].Date);
        }