public void On_Convert_Payroll_MultipleShift_FixesTips()
        {
            IPayrollConverterUtils payrollConverterUtils = new PayrollConverterUtils(logger);
            var employeeRepository    = new EmployeeRepositoryService(logger);
            IPayrollConverter subject = new PayrollConverter(logger, payrollConverterUtils, employeeRepository);
            var data         = new AlohaDataset();
            var empRow       = AlohaDataUtils.CreateEmpRow(data, 1, "123456789", "Test", "Employee", 123456789);
            var adjtimeRow   = AlohaDataUtils.CreateAdjTimeRow(data, 1, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 12, 0, 14, 30, 0.5m, 10m, 10m);
            var adjtimeRow2  = AlohaDataUtils.CreateAdjTimeRow(data, 1, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 15, 0, 16, 30, 0.5m, 10m, 10m);
            var gndbroeakRow = AlohaDataUtils.CreateBreakRow(data, 1, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 12, 30, 13, 00, 0.5m);

            data.emp.AddempRow(empRow);
            data.adjtime.AddadjtimeRow(adjtimeRow);
            data.adjtime.AddadjtimeRow(adjtimeRow2);
            data.gndbreak.AddgndbreakRow(gndbroeakRow);
            var tipStrategy = TipCalculation.Auto;

            var result = subject.ConvertPayroll(data, tipStrategy);

            var resultTips = result[0].Transactions.Where(t => t.Type == TransactionType.PayCode).ToList();

            resultTips.Count.Should().Be(2);
            resultTips[0].ClockIn.Hour.Should().Be(12);
            resultTips[0].ClockIn.Minute.Should().Be(0);
            resultTips[1].ClockIn.Hour.Should().Be(12);
            resultTips[1].ClockIn.Minute.Should().Be(5);
        }
        public static AlohaDataset.empRow CreateEmpRow(AlohaDataset data, int id, string ssn, string firstname, string lastname, decimal sec_num)
        {
            var empRow = data.emp.NewempRow();

            empRow.id        = id;
            empRow.ssn       = ssn;
            empRow.firstname = firstname;
            empRow.lastname  = lastname;
            empRow.sec_num   = sec_num;
            return(empRow);
        }
示例#3
0
        public List <Employee> GetEmployees(AlohaDataset data)
        {
            _logger.Debug("GetEmployees called");
            var employees = new List <Employee>();

            foreach (var empRow in data.emp)
            {
                employees.Add(ConverEmployeeRow(empRow));
            }

            return(employees);
        }
        public void On_Convert_Payroll_EmptyData_Returns_EmptyList()
        {
            IPayrollConverterUtils payrollConverterUtils = new PayrollConverterUtils(logger);
            var employeeRepository    = new EmployeeRepositoryService(logger);
            IPayrollConverter subject = new PayrollConverter(logger, payrollConverterUtils, employeeRepository);
            var data        = new AlohaDataset();
            var tipStrategy = TipCalculation.Auto;

            var result = subject.ConvertPayroll(data, tipStrategy);

            result.Should().NotBeNull();
            result.Should().BeEmpty();
        }
示例#5
0
        public void On_ConvertEmployeeRow_GetRightEmployee()
        {
            var data   = new AlohaDataset();
            var empRow = AlohaDataUtils.CreateEmpRow(data, 1, "123456789", "Test", "Employee", 123456789);
            IPayrollConverterUtils subject = new PayrollConverterUtils(logger);

            var result = subject.ConverEmployeeRow(empRow);

            result.ID.Should().Be(empRow.id);
            result.SocialSecurity.Should().Be(empRow.ssn);
            result.FirstName.Should().Be(empRow.firstname);
            result.LastName.Should().Be(empRow.lastname);
            result.Transactions.Should().BeEmpty();
        }
示例#6
0
        public void On_GetEmployees_Gets_EmployeeEnumerable()
        {
            IPayrollConverterUtils subject = new PayrollConverterUtils(logger);
            var data   = new AlohaDataset();
            var empRow = AlohaDataUtils.CreateEmpRow(data, 1, "123456789", "Test", "Employee", 123456789);

            data.emp.AddempRow(empRow);

            List <Employee> result = subject.GetEmployees(data);

            result.Should().NotBeNull();
            result.Should().NotBeEmpty();
            result.Should().Contain(c => c.ID == 1);
        }
示例#7
0
        public void On_GetBreaks_Ingores_From_IgnoreList()
        {
            IPayrollConverterUtils subject = new PayrollConverterUtils(logger);
            var data       = new AlohaDataset();
            var adjtimeRow = AlohaDataUtils.CreateAdjTimeRow(data, 1, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 12, 0, 12, 30, 0.5m, 10m, 10m);

            data.adjtime.AddadjtimeRow(adjtimeRow);
            var ignoreList = new List <int> {
                1
            };

            List <Transaction> result = subject.GetBreaks(data, ignoreList);

            result.Should().BeEmpty();
        }
示例#8
0
        public void On_GetEmployees_Gets_All_Employees()
        {
            IPayrollConverterUtils subject = new PayrollConverterUtils(logger);
            var data    = new AlohaDataset();
            var empRow  = AlohaDataUtils.CreateEmpRow(data, 1, "123456789", "Test", "Employee1", 123456789);
            var empRow2 = AlohaDataUtils.CreateEmpRow(data, 2, "987654321", "Test", "Employee2", 987654321);

            data.emp.AddempRow(empRow);
            data.emp.AddempRow(empRow2);

            var result = subject.GetEmployees(data);

            result.Count().Should().Be(data.emp.Count());
            result.Should().Contain(e => e.ID == 1);
            result.Should().Contain(e => e.ID == 2);
        }
示例#9
0
        public List <Transaction> GetTips(AlohaDataset data, List <int> ignoreJobCodeList, TipCalculation tipCalculationStrategy)
        {
            _logger.Debug("GetTips called");
            var transactions = new List <Transaction>();

            foreach (var adjtimeRow in data.adjtime.Where(t => t.cctips > 0m || t.dectips > 0m))
            {
                if (ignoreJobCodeList.Contains(adjtimeRow.jobcode))
                {
                    continue;
                }
                transactions.Add(ConvertTipRow(adjtimeRow, tipCalculationStrategy));
            }

            return(transactions);
        }
示例#10
0
        public List <Transaction> GetBreaks(AlohaDataset data, List <int> ignoreJobCodeList)
        {
            _logger.Debug("GetBreaks called");
            var transactions = new List <Transaction>();

            foreach (var gndbreakRow in data.gndbreak)
            {
                if (ignoreJobCodeList.Contains(gndbreakRow.jobcode))
                {
                    continue;
                }
                transactions.Add(ConvertBreakRow(gndbreakRow));
            }

            return(transactions);
        }
示例#11
0
        public List <Transaction> GetShifts(AlohaDataset data, List <int> ignoreJobCodeList)
        {
            _logger.Debug("GetShifts called");
            var transactions = new List <Transaction>();

            foreach (var adjtimeRow in data.adjtime)
            {
                if (ignoreJobCodeList.Contains(adjtimeRow.jobcode))
                {
                    continue;
                }
                transactions.Add(ConvertShiftRow(adjtimeRow));
            }

            return(transactions);
        }
示例#12
0
        public void On_GetBreaks_Get_TransactionEnumerable()
        {
            IPayrollConverterUtils subject = new PayrollConverterUtils(logger);
            var data        = new AlohaDataset();
            var gndbreakRow = AlohaDataUtils.CreateBreakRow(data, 1, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 12, 0, 12, 30, 0.5m);

            data.gndbreak.AddgndbreakRow(gndbreakRow);
            var ignoreList = new List <int> {
                10
            };

            List <Transaction> result = subject.GetBreaks(data, ignoreList);

            result.Should().NotBeNull();
            result.Should().NotBeEmpty();
            result.Should().Contain(c => c.EmpId == 1);
        }
        public void On_Convert_Payroll_OnlyEmployees_ReturnsListWith_EmptyTransactions()
        {
            IPayrollConverterUtils payrollConverterUtils = new PayrollConverterUtils(logger);
            var employeeRepository    = new EmployeeRepositoryService(logger);
            IPayrollConverter subject = new PayrollConverter(logger, payrollConverterUtils, employeeRepository);
            var data   = new AlohaDataset();
            var empRow = AlohaDataUtils.CreateEmpRow(data, 1, "123456789", "Test", "Employee", 123456789);

            data.emp.AddempRow(empRow);
            var tipStrategy = TipCalculation.Auto;

            var result = subject.ConvertPayroll(data, tipStrategy);

            result.Should().NotBeNull();
            result.Count.Should().Be(1);
            result[0].Transactions.Count.Should().Be(0);
        }
示例#14
0
        public void On_ConvertBreakRow_GetRightShift()
        {
            var data         = new AlohaDataset();
            var gndbroeakRow = AlohaDataUtils.CreateBreakRow(data, 1, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 12, 0, 12, 30, 0.5m);
            IPayrollConverterUtils subject = new PayrollConverterUtils(logger);

            var result = subject.ConvertBreakRow(gndbroeakRow);

            result.Type.Should().Be(TransactionType.ClockInOut);
            result.PeriodType.Should().Be(PeriodType.Break);
            result.PayCode.Should().Be(string.Empty);
            result.EmpId.Should().Be(gndbroeakRow.employee);
            result.SSN.Should().Be(gndbroeakRow.ssn);
            result.JobCode.Should().Be(gndbroeakRow.jobcode);
            result.ClockIn.Should().Be(DateTime.Today.AddHours(12));
            result.ClockOut.Should().Be(DateTime.Today.AddHours(12).AddMinutes(30));
            result.Hours.Should().BeApproximately(0.5m, 0.001m);
        }
示例#15
0
        public void On_GetTips_Get_TransactionEnumerable()
        {
            IPayrollConverterUtils subject = new PayrollConverterUtils(logger);
            var data       = new AlohaDataset();
            var adjtimeRow = AlohaDataUtils.CreateAdjTimeRow(data, 1, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 12, 0, 12, 30, 0.5m, 10m, 10m);

            data.adjtime.AddadjtimeRow(adjtimeRow);
            var ignoreList = new List <int> {
                10
            };
            var tipstrategy = TipCalculation.Auto;

            List <Transaction> result = subject.GetTips(data, ignoreList, tipstrategy);

            result.Should().NotBeNull();
            result.Should().NotBeEmpty();
            result.Should().Contain(c => c.EmpId == 1);
        }
示例#16
0
        public void On_GetBreaks_Gets_All_Transactions()
        {
            IPayrollConverterUtils subject = new PayrollConverterUtils(logger);
            var data         = new AlohaDataset();
            var gndbreakRow  = AlohaDataUtils.CreateBreakRow(data, 1, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 12, 0, 12, 30, 0.5m);
            var gndbreakRow2 = AlohaDataUtils.CreateBreakRow(data, 2, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 1, 0, 1, 30, 0.5m);

            data.gndbreak.AddgndbreakRow(gndbreakRow);
            data.gndbreak.AddgndbreakRow(gndbreakRow2);
            var ignoreList = new List <int> {
                10
            };

            var result = subject.GetBreaks(data, ignoreList);

            result.Count().Should().Be(data.gndbreak.Count());
            result.Should().Contain(t => t.EmpId == 1);
            result.Should().Contain(t => t.EmpId == 2);
        }
        public static AlohaDataset.gndbreakRow CreateBreakRow(AlohaDataset data, int employee,
                                                              string ssn, DateTime date, DateTime sysdatebeg, DateTime sysdateend, int jobcode,
                                                              int inhour, int inminute, int outhour, int outminute, decimal hours)
        {
            var gndbreakRow = data.gndbreak.NewgndbreakRow();

            gndbreakRow.employee   = employee;
            gndbreakRow.ssn        = ssn;
            gndbreakRow.date       = date;
            gndbreakRow.sysdatebeg = sysdatebeg;
            gndbreakRow.sysdateend = sysdateend;
            gndbreakRow.jobcode    = jobcode;
            gndbreakRow.inhour     = inhour;
            gndbreakRow.inminute   = inminute;
            gndbreakRow.outhour    = outhour;
            gndbreakRow.outminute  = outminute;
            gndbreakRow.hours      = hours;
            return(gndbreakRow);
        }
        public List <Employee> ConvertPayroll(AlohaDataset alohaData, TipCalculation tipStrategy)
        {
            var employees     = _payrollConverterUtils.GetEmployees(alohaData);
            var ignoreJobList = new List <int> {
                11, 33, 90, 91
            };
            var shifts = _payrollConverterUtils.GetShifts(alohaData, ignoreJobList);
            var tips   = _payrollConverterUtils.GetTips(alohaData, ignoreJobList, tipStrategy);
            var breaks = _payrollConverterUtils.GetBreaks(alohaData, ignoreJobList);

            _employeeRepositoryService.LoadEmployees(employees);
            _employeeRepositoryService.LoadTransactions(shifts);
            _employeeRepositoryService.LoadTransactions(tips);
            _employeeRepositoryService.LoadTransactions(breaks);

            _employeeRepositoryService.AdjustPaycodesForMultipleShifts();

            return(_employeeRepositoryService.Employees.Values.ToList <Employee>());
        }
示例#19
0
        public void On_GetTips_Gets_All_Transactions()
        {
            IPayrollConverterUtils subject = new PayrollConverterUtils(logger);
            var data        = new AlohaDataset();
            var adjtimeRow  = AlohaDataUtils.CreateAdjTimeRow(data, 1, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 12, 0, 12, 30, 0.5m, 10m, 10m);
            var adjtimeRow2 = AlohaDataUtils.CreateAdjTimeRow(data, 2, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 1, 0, 1, 30, 0.5m, 10m, 10m);

            data.adjtime.AddadjtimeRow(adjtimeRow);
            data.adjtime.AddadjtimeRow(adjtimeRow2);
            var ignoreList = new List <int> {
                10
            };
            var tipstrategy = TipCalculation.Auto;

            var result = subject.GetTips(data, ignoreList, tipstrategy);

            result.Count().Should().Be(data.adjtime.Count());
            result.Should().Contain(t => t.EmpId == 1);
            result.Should().Contain(t => t.EmpId == 2);
        }
        public void On_Convert_Payroll_EmpFullData_ReturnsListWith_Transactions()
        {
            IPayrollConverterUtils payrollConverterUtils = new PayrollConverterUtils(logger);
            var employeeRepository    = new EmployeeRepositoryService(logger);
            IPayrollConverter subject = new PayrollConverter(logger, payrollConverterUtils, employeeRepository);
            var data         = new AlohaDataset();
            var empRow       = AlohaDataUtils.CreateEmpRow(data, 1, "123456789", "Test", "Employee", 123456789);
            var adjtimeRow   = AlohaDataUtils.CreateAdjTimeRow(data, 1, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 12, 0, 14, 30, 0.5m, 10m, 10m);
            var gndbroeakRow = AlohaDataUtils.CreateBreakRow(data, 1, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 12, 30, 13, 00, 0.5m);

            data.emp.AddempRow(empRow);
            data.adjtime.AddadjtimeRow(adjtimeRow);
            data.gndbreak.AddgndbreakRow(gndbroeakRow);
            var tipStrategy = TipCalculation.Auto;

            var result = subject.ConvertPayroll(data, tipStrategy);

            result[0].Transactions.Count.Should().Be(3);
            result[0].Transactions.Should().Contain(t => t.Type == TransactionType.ClockInOut && t.PeriodType == PeriodType.Shift);
            result[0].Transactions.Should().Contain(t => t.Type == TransactionType.ClockInOut && t.PeriodType == PeriodType.Break);
            result[0].Transactions.Should().ContainSingle(t => t.Type == TransactionType.PayCode);
        }
        public static AlohaDataset.adjtimeRow CreateAdjTimeRow(AlohaDataset data, int employee,
                                                               string ssn, DateTime date, DateTime sysdatein, DateTime sysdateout, int jobcode,
                                                               int inhour, int inminute, int outhour, int outminute, decimal hours, decimal cctips,
                                                               decimal dectips)
        {
            var adjtimeRow = data.adjtime.NewadjtimeRow();

            adjtimeRow.employee   = employee;
            adjtimeRow.ssn        = ssn;
            adjtimeRow.date       = date;
            adjtimeRow.sysdatein  = sysdatein;
            adjtimeRow.sysdateout = sysdateout;
            adjtimeRow.jobcode    = jobcode;
            adjtimeRow.inhour     = inhour;
            adjtimeRow.inminute   = inminute;
            adjtimeRow.outhour    = outhour;
            adjtimeRow.outminute  = outminute;
            adjtimeRow.hours      = hours;
            adjtimeRow.cctips     = cctips;
            adjtimeRow.dectips    = dectips;
            return(adjtimeRow);
        }
示例#22
0
        public AlohaDataset ReadPayroll(string folder)
        {
            if (string.IsNullOrEmpty(folder))
            {
                throw new ArgumentException("Folder name is null or empty", nameof(folder));
            }

            if (Directory.Exists(folder))
            {
                _logger.Info($"ReadPayroll was called for folder {folder}");
                var result = new AlohaDataset();

                _logger.Debug("Loading emp table");
                var empAdapter = new empTableAdapter();
                empAdapter.Connection.ConnectionString = GetConnectionString(folder);
                empAdapter.Fill(result.emp);
                _logger.Debug($"Done loading emp, {result.emp.Count} loaded");

                _logger.Debug("Loading adjtime table");
                var adjtimeAdapter = new adjtimeTableAdapter();
                adjtimeAdapter.Connection.ConnectionString = GetConnectionString(folder);
                adjtimeAdapter.Fill(result.adjtime);
                _logger.Debug($"Done loading adjtime, {result.adjtime.Count} loaded");

                _logger.Debug("Loading gndbreak table");
                var gndbreakAdapter = new gndbreakTableAdapter();
                gndbreakAdapter.Connection.ConnectionString = GetConnectionString(folder);
                gndbreakAdapter.Fill(result.gndbreak);
                _logger.Debug($"Done loading gndbreak, {result.gndbreak.Count} loaded");

                _logger.Info("Done ReadPayroll");
                return(result);
            }
            else
            {
                _logger.Warn($"ReadPayroll: Folder {folder} not found");
                return(null);
            }
        }
示例#23
0
        public void On_ConvertTipRow_GetRightTip_Using_Strategy_Auto()
        {
            var data        = new AlohaDataset();
            var adjtimeRow  = AlohaDataUtils.CreateAdjTimeRow(data, 1, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 12, 0, 12, 30, 0.5m, 1m, 2m);
            var adjtimeRow2 = AlohaDataUtils.CreateAdjTimeRow(data, 1, "", DateTime.Today, DateTime.Today, DateTime.Today, 1, 12, 0, 12, 30, 0.5m, 2m, 1m);
            IPayrollConverterUtils subject = new PayrollConverterUtils(logger);
            var tipstrategy = TipCalculation.Auto;

            var result  = subject.ConvertTipRow(adjtimeRow, tipstrategy);
            var result2 = subject.ConvertTipRow(adjtimeRow2, tipstrategy);

            result.Type.Should().Be(TransactionType.PayCode);
            result.PeriodType.Should().Be(PeriodType.Unknown);
            result.PayCode.Should().Be("T");
            result.EmpId.Should().Be(adjtimeRow.employee);
            result.SSN.Should().Be(adjtimeRow.ssn);
            result.JobCode.Should().Be(adjtimeRow.jobcode);
            result.ClockIn.Should().Be(DateTime.Today.AddHours(12));
            result.ClockOut.Should().Be(DateTime.MinValue);
            result.Hours.Should().BeApproximately(0m, 0.001m);
            result.Tips.Should().BeApproximately(2m, 0.001m);
            result2.Tips.Should().BeApproximately(2m, 0.001m);
        }