public void GenerateDeduction()
        {
            Initialize();
            DeleteInfo();

            //Initialize 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/1981"),
                Gender       = 1,
                IsActive     = true
            };

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

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

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

            var employeeDeduction = new EmployeeDeduction
            {
                EmployeeId  = 1,
                DeductionId = HDMF_DEDUCTION_ID,
                Amount      = 100.10M
            };

            var employeeDeduction2 = new EmployeeDeduction
            {
                EmployeeId  = 1,
                DeductionId = SSS_DEDUCTION_ID,
                Amount      = 50.25M
            };

            var employeeDeduction3 = new EmployeeDeduction
            {
                EmployeeId  = 1,
                DeductionId = PHILHEALTH_DEDUCTION_ID,
                Amount      = 50.25M
            };

            var employeeDeduction4 = new EmployeeDeduction
            {
                EmployeeId  = 2,
                DeductionId = HDMF_DEDUCTION_ID,
                Amount      = 100.20M
            };

            var employeeDeduction5 = new EmployeeDeduction
            {
                EmployeeId  = 2,
                DeductionId = SSS_DEDUCTION_ID,
                Amount      = 45.5M
            };

            var employeeDeduction6 = new EmployeeDeduction
            {
                EmployeeId  = 2,
                DeductionId = PHILHEALTH_DEDUCTION_ID,
                Amount      = 55.90M
            };

            _employeeDeductionRepository.Add(employeeDeduction);
            _employeeDeductionRepository.Add(employeeDeduction2);
            _employeeDeductionRepository.Add(employeeDeduction3);
            _employeeDeductionRepository.Add(employeeDeduction4);
            _employeeDeductionRepository.Add(employeeDeduction5);
            _employeeDeductionRepository.Add(employeeDeduction6);

            var employeePayroll = new EmployeePayroll
            {
                EmployeeId      = 1,
                IsTaxed         = false,
                TaxableIncome   = 1500,
                TotalNet        = 1500,
                CutOffStartDate = DateTime.Parse("05/04/2016"),
                CutOffEndDate   = DateTime.Parse("05/10/2016"),
                PayrollDate     = DateTime.Parse("05/11/2016"),
                TotalGross      = 1500
            };

            var employeePayroll2 = new EmployeePayroll
            {
                EmployeeId      = 1,
                IsTaxed         = false,
                TaxableIncome   = 1300.25M,
                TotalNet        = 1300.25M,
                CutOffStartDate = DateTime.Parse("05/11/2016"),
                CutOffEndDate   = DateTime.Parse("05/17/2016"),
                PayrollDate     = DateTime.Parse("05/18/2016"),
                TotalGross      = 1300.25M
            };

            var employeePayroll3 = new EmployeePayroll
            {
                EmployeeId      = 1,
                IsTaxed         = false,
                TaxableIncome   = 1500.25M,
                TotalNet        = 1500.25M,
                CutOffStartDate = DateTime.Parse("05/18/2016"),
                CutOffEndDate   = DateTime.Parse("05/24/2016"),
                PayrollDate     = DateTime.Parse("05/25/2016"),
                TotalGross      = 1500.25M
            };

            var employeePayroll4 = new EmployeePayroll
            {
                EmployeeId      = 1,
                IsTaxed         = false,
                TaxableIncome   = 950.50M,
                TotalNet        = 950.50M,
                CutOffStartDate = DateTime.Parse("05/25/2016"),
                CutOffEndDate   = DateTime.Parse("05/31/2016"),
                PayrollDate     = DateTime.Parse("06/01/2016"),
                TotalGross      = 950.50M
            };

            var employeePayroll5 = new EmployeePayroll
            {
                EmployeeId      = 2,
                IsTaxed         = false,
                TaxableIncome   = 2000.05M,
                TotalNet        = 2000.05M,
                CutOffStartDate = DateTime.Parse("05/04/2016"),
                CutOffEndDate   = DateTime.Parse("05/10/2016"),
                PayrollDate     = DateTime.Parse("05/11/2016"),
                TotalGross      = 2000.05M
            };

            var employeePayroll6 = new EmployeePayroll
            {
                EmployeeId      = 2,
                IsTaxed         = false,
                TaxableIncome   = 2100,
                TotalNet        = 2100,
                CutOffStartDate = DateTime.Parse("05/11/2016"),
                CutOffEndDate   = DateTime.Parse("05/17/2016"),
                PayrollDate     = DateTime.Parse("05/18/2016"),
                TotalGross      = 2100
            };

            var employeePayroll7 = new EmployeePayroll
            {
                EmployeeId      = 2,
                IsTaxed         = false,
                TaxableIncome   = 2200.50M,
                TotalNet        = 2200.50M,
                CutOffStartDate = DateTime.Parse("05/18/2016"),
                CutOffEndDate   = DateTime.Parse("05/24/2016"),
                PayrollDate     = DateTime.Parse("05/25/2016"),
                TotalGross      = 2200.50M
            };

            var employeePayroll8 = new EmployeePayroll
            {
                EmployeeId      = 2,
                IsTaxed         = false,
                TaxableIncome   = 750.50M,
                TotalNet        = 750.50M,
                CutOffStartDate = DateTime.Parse("05/25/2016"),
                CutOffEndDate   = DateTime.Parse("05/31/2016"),
                PayrollDate     = DateTime.Parse("06/01/2016"),
                TotalGross      = 750.50M
            };


            _employeePayrollRepository.Add(employeePayroll);
            _employeePayrollRepository.Add(employeePayroll2);
            _employeePayrollRepository.Add(employeePayroll3);
            _employeePayrollRepository.Add(employeePayroll4);
            _employeePayrollRepository.Add(employeePayroll5);
            _employeePayrollRepository.Add(employeePayroll6);
            _employeePayrollRepository.Add(employeePayroll7);
            _employeePayrollRepository.Add(employeePayroll8);

            _unitOfWork.Commit();

            //Current payroll
            IList <EmployeePayroll> payrollList = new List <EmployeePayroll>();

            payrollList.Add(employeePayroll4);
            payrollList.Add(employeePayroll8);

            decimal[] results = { 200.6m, 201.6m };
            //Test
            var counter = 0;

            foreach (EmployeePayroll payroll in payrollList)
            {
                var totalDeductions = _employeePayrollDeductionService
                                      .GenerateDeductionsByPayroll(payroll);

                Assert.AreEqual(results[counter], totalDeductions);

                counter++;
            }

            _unitOfWork.Commit();

            //Verify
            var startDate = DateTime.Parse("06/01/2016");
            var endDate   = DateTime.Parse("06/01/2016");

            /*IList<EmployeePayroll> finalizedPayroll = _employeePayrollService.GetByDateRange(startDate, endDate);
             *
             * Assert.IsNotNull(finalizedPayroll);
             *
             * Assert.AreEqual(2, finalizedPayroll.Count());
             * Assert.AreEqual(1, finalizedPayroll[0].EmployeeId);
             * Assert.AreEqual(false, finalizedPayroll[0].IsTaxed);
             * Assert.AreEqual(DateTime.Parse("05/25/2016"), finalizedPayroll[0].CutOffStartDate);
             * Assert.AreEqual(DateTime.Parse("05/31/2016"), finalizedPayroll[0].CutOffEndDate);
             * Assert.AreEqual(DateTime.Parse("06/01/2016"), finalizedPayroll[0].PayrollDate);
             * Assert.AreEqual(749.9M, finalizedPayroll[0].TaxableIncome);
             * Assert.AreEqual(950.50M, finalizedPayroll[0].TotalGross);*/

            //Get all deductions
            IList <EmployeePayrollDeduction> employeePayrollDeduction
                = _employeePayrollDeductionService.GetByPayroll(4);

            Assert.AreEqual(3, employeePayrollDeduction.Count());

            Assert.AreEqual(employeePayrollDeduction[0].EmployeeId, 1);
            Assert.AreEqual(employeePayrollDeduction[0].EmployeePayrollId, 4);
            Assert.AreEqual(employeePayrollDeduction[0].Amount, 100.10M);
            Assert.AreEqual(employeePayrollDeduction[0].DeductionId, HDMF_DEDUCTION_ID);

            Assert.AreEqual(employeePayrollDeduction[1].EmployeeId, 1);
            Assert.AreEqual(employeePayrollDeduction[1].EmployeePayrollId, 4);
            Assert.AreEqual(employeePayrollDeduction[1].Amount, 50.25M);
            Assert.AreEqual(employeePayrollDeduction[1].DeductionId, SSS_DEDUCTION_ID);

            Assert.AreEqual(employeePayrollDeduction[2].EmployeeId, 1);
            Assert.AreEqual(employeePayrollDeduction[2].EmployeePayrollId, 4);
            Assert.AreEqual(employeePayrollDeduction[2].Amount, 50.25M);
            Assert.AreEqual(employeePayrollDeduction[2].DeductionId, PHILHEALTH_DEDUCTION_ID);

            //Check Tax

            /*Assert.AreEqual(employeePayrollDeduction[3].EmployeeId, 1);
             * Assert.AreEqual(employeePayrollDeduction[3].EmployeePayrollId, 4);
             * Assert.AreEqual(employeePayrollDeduction[3].Amount, 46.71M);
             * Assert.AreEqual(employeePayrollDeduction[3].DeductionId, TAX_DEDUCTION_ID);*/

            /*Assert.AreEqual(2, finalizedPayroll[1].EmployeeId);
             * Assert.AreEqual(true, finalizedPayroll[1].IsTaxed);
             * Assert.AreEqual(DateTime.Parse("05/25/2016"), finalizedPayroll[1].CutOffStartDate);
             * Assert.AreEqual(DateTime.Parse("05/31/2016"), finalizedPayroll[1].CutOffEndDate);
             * Assert.AreEqual(DateTime.Parse("06/01/2016"), finalizedPayroll[1].PayrollDate);
             * Assert.AreEqual(548.90M, finalizedPayroll[1].TaxableIncome);
             * Assert.AreEqual(750.50M, finalizedPayroll[1].TotalGross);
             * Assert.AreEqual(437.2975M, finalizedPayroll[1].TotalDeduction);
             * Assert.AreEqual(313.2025M, finalizedPayroll[1].TotalNet);*/

            employeePayrollDeduction
                = _employeePayrollDeductionService.GetByPayroll(8);

            Assert.AreEqual(3, employeePayrollDeduction.Count());

            Assert.AreEqual(employeePayrollDeduction[0].EmployeeId, 2);
            Assert.AreEqual(employeePayrollDeduction[0].EmployeePayrollId, 8);
            Assert.AreEqual(employeePayrollDeduction[0].Amount, 100.20M);
            Assert.AreEqual(employeePayrollDeduction[0].DeductionId, HDMF_DEDUCTION_ID);

            Assert.AreEqual(employeePayrollDeduction[1].EmployeeId, 2);
            Assert.AreEqual(employeePayrollDeduction[1].EmployeePayrollId, 8);
            Assert.AreEqual(employeePayrollDeduction[1].Amount, 45.5M);
            Assert.AreEqual(employeePayrollDeduction[1].DeductionId, SSS_DEDUCTION_ID);

            Assert.AreEqual(employeePayrollDeduction[2].EmployeeId, 2);
            Assert.AreEqual(employeePayrollDeduction[2].EmployeePayrollId, 8);
            Assert.AreEqual(employeePayrollDeduction[2].Amount, 55.90M);
            Assert.AreEqual(employeePayrollDeduction[2].DeductionId, PHILHEALTH_DEDUCTION_ID);

            //Check Tax

            /*Assert.AreEqual(employeePayrollDeduction[3].EmployeeId, 2);
             * Assert.AreEqual(employeePayrollDeduction[3].EmployeePayrollId, 8);
             * Assert.AreEqual(employeePayrollDeduction[3].Amount, 235.6975M);
             * Assert.AreEqual(employeePayrollDeduction[3].DeductionId, TAX_DEDUCTION_ID);*/
        }
        //[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);
        }
        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);
        }
Ejemplo n.º 4
0
        public virtual ActionResult Create(EmployeeInfoViewModel viewModel)
        {
            //validate birthdate
            if (!viewModel.EmployeeInfo.Employee.BirthDate.IsValidBirthDate())
            {
                GetDropDowns(viewModel, viewModel.EmployeeInfo.EmployeeId);
                ModelState.AddModelError("", ErrorMessages.INVALID_DATE);
                return(View("Details", viewModel));
            }

            //validate employee code
            var existingEmployeeCode = _employeeRepository.Find(x => x.EmployeeCode == viewModel.EmployeeInfo.Employee.EmployeeCode && x.IsActive);

            if (existingEmployeeCode != null && existingEmployeeCode.Any())
            {
                GetDropDowns(viewModel, viewModel.EmployeeInfo.EmployeeId);
                ModelState.AddModelError("", ErrorMessages.USED_EMPLOYEECODE);
                return(View("Details", viewModel));
            }

            var employee = viewModel.EmployeeInfo.Employee.MapItem <Employee>();

            employee.Gender = viewModel.Gender;
            var employeeInfo = viewModel.EmployeeInfo;

            employeeInfo.Employee         = employee;
            employeeInfo.PositionId       = viewModel.PositionId != 0 ? viewModel.PositionId : (int?)null;
            employeeInfo.SalaryFrequency  = (FrequencyType)viewModel.PaymentFrequency;
            employeeInfo.EmploymentStatus = viewModel.EmploymentStatus;

            var newEmployee = _employeeInfoRepository.Add(employeeInfo).Employee;

            _employeeInfoHistoryRepository.Add(employeeInfo.MapItem <EmployeeInfoHistory>());

            _unitOfWork.Commit();

            //departments
            var departments = viewModel.CheckedDepartments != null
                            ? viewModel.CheckedDepartments.Split(',').Select(Int32.Parse)
                            : new List <int>();

            _employeeRepository.UpdateDepartment(departments, employee.EmployeeId);

            //employee deductions
            if (!String.IsNullOrEmpty(viewModel.CheckedEmployeeDeductions))
            {
                var employeeDeductions = viewModel.CheckedEmployeeDeductions != null
                        ? JsonConvert.DeserializeObject <List <EmployeeDeduction> >(viewModel.CheckedEmployeeDeductions)
                        : new List <EmployeeDeduction>();

                _employeeDeductionService.UpdateEmployeeDeduction(employeeDeductions, viewModel.EmployeeInfo.EmployeeId);
            }

            //work schedule
            if (viewModel.WorkScheduleId > 0)
            {
                _employeeWorkScheduleService.Add(viewModel.WorkScheduleId, employee.EmployeeId);
            }

            _unitOfWork.Commit();

            //upload the picture and update the record
            var imagePath = UploadImage(newEmployee.EmployeeId);

            if (!String.IsNullOrEmpty(imagePath))
            {
                _employeeRepository.Update(newEmployee);
                newEmployee.Picture = imagePath;
                _unitOfWork.Commit();
            }

            _logger.Info(LoggerMessages.INFO_USER_CREATE, newEmployee.EmployeeId, User.Identity.GetUserId());
            return(RedirectToAction("Index"));
        }