public void TestThatWtkfProfileWillBeMappedToExceptionRulePerPayRuleIfExceptionRuleDoesntExist()
        {
            var wsaExceptionRuleCount = 3;
            var wtkProfiles           = new List <WtkProfile>();
            var wtkProfile            = new WtkProfile
            {
                PayRule = new PayRule
                {
                    FullName     = "FullName",
                    PayRuleName  = "PayRuleName",
                    PersonNumber = "PersonNumber"
                },
                ExceptionRuleName = "ExceptionRuleNameNotExist"
            };

            wtkProfiles.Add(wtkProfile);

            var wsaExceptionRules = new List <WsaExceptionRule>();

            for (int i = 1; i <= wsaExceptionRuleCount; i++)
            {
                var exceptionRule = new WsaExceptionRule
                {
                    Name                  = "ExceptionRuleName" + i,
                    InEarly               = new TimeSpan(0, 17 + i, 0),
                    OutEarly              = new TimeSpan(8, 10 + i, 0),
                    InVeryEarly           = "InVeryEarly" + i,
                    OutVeryLate           = "OutVeryLate" + i,
                    InLate                = new TimeSpan(0, 15 + i, 0),
                    OutLate               = new TimeSpan(4, 10 + i, 0),
                    EarlyOutNdPayCodeName = "EarlyOutNdPayCodeName" + i,
                    Unscheduled           = i % 2 == 0,
                    Breaks                = new List <string>
                    {
                        "Break" + i + 1,
                        "Break" + i + 2,
                        "Break" + i + 3
                    }
                };
                wsaExceptionRules.Add(exceptionRule);
            }

            var mapper = new ExceptionRuleMapper();

            var results = mapper.Map(wtkProfiles, wsaExceptionRules);

            Assert.NotNull(results);
            Assert.AreEqual(1, results.Count);
            Assert.AreEqual("FullName", results[0].PayRule.FullName);
            Assert.AreEqual("PersonNumber", results[0].PayRule.PersonNumber);
            Assert.AreEqual("PayRuleName", results[0].PayRule.PayRuleName);

            Assert.AreEqual(null, results[0].ExceptionRule.Name);
        }
        public void TestThatDataMapCorrectly()
        {
            var payRuleCount = 3;
            var wtkProfiles  = new List <WtkProfile>();

            for (int i = 1; i <= payRuleCount; i++)
            {
                var wtkProfile = new WtkProfile
                {
                    PayRule = new PayRule
                    {
                        FullName     = "FullName" + i,
                        PayRuleName  = "PayRuleName" + i,
                        PersonNumber = "PersonNumber" + i
                    },
                    ExceptionRuleName = "ExceptionRuleName" + i
                };
                wtkProfiles.Add(wtkProfile);
            }

            var timesheets = TimesheetStub.GetData();

            var mapper = new DailyTimecardMapper();
            var result = mapper.Map(wtkProfiles, timesheets);

            Assert.AreEqual(payRuleCount, result.Count);
            for (int i = 0; i < payRuleCount; i++)
            {
                Assert.AreEqual(wtkProfiles[i], result[i].Profile);
                if (i < payRuleCount - 1)
                {
                    Assert.True(result[i].TotalsUpToDateFlag);
                }
                else
                {
                    Assert.False(result[i].TotalsUpToDateFlag);
                }
            }

            Assert.AreEqual(1, result[0].PunchDateTotals.Count);
            Assert.AreEqual(new TimeSpan(12, 31, 0), result[0].PunchDateTotals[0].PunchIn.Time);
            Assert.AreEqual(new TimeSpan(13, 31, 0), result[0].PunchDateTotals[0].PunchOut.Time);
            Assert.AreEqual(new DateTime(2017, 1, 1), result[0].PunchDateTotals[0].Date);
            Assert.AreEqual(1, result[0].PunchDateTotals[0].Totals.Count);
            Assert.AreEqual(new TimeSpan(9, 0, 0), result[0].PunchDateTotals[0].Totals[0].AmountInTime);
            Assert.AreEqual("LaborAccountDescription", result[0].PunchDateTotals[0].Totals[0].LaborAccountDescription);
            Assert.AreEqual("PayCodeName", result[0].PunchDateTotals[0].Totals[0].PayCodeName);

            Assert.AreEqual(0, result[2].PunchDateTotals.Count);
        }
        public void TestThatWtkfProfileAndOvertimeRuleAndBonusRuleModelsMapToOvertimeRulePerPayRuleCorrectly()
        {
            var payRuleCount          = 2;
            var overtimeRulesCount    = 3;
            var bonusDeductRulesCount = 1;
            var wtkProfiles           = new List <WtkProfile>();

            for (int i = 1; i <= payRuleCount; i++)
            {
                var wtkProfile = new WtkProfile
                {
                    PayRule = new PayRule
                    {
                        FullName     = "FullName" + i,
                        PayRuleName  = "PayRuleName" + i,
                        PersonNumber = "PersonNumber" + i
                    },
                    OvertimeRuleName    = "OvertimeRuleName" + i,
                    BonusDeductRuleName = "BonusDeductRule" + i
                };
                wtkProfiles.Add(wtkProfile);
                var wtkProfile2 = new WtkProfile
                {
                    PayRule = new PayRule
                    {
                        FullName     = "FullName2" + i,
                        PayRuleName  = "PayRuleName" + i,
                        PersonNumber = "PersonNumber2" + i
                    },
                    OvertimeRuleName    = "OvertimeRuleName" + i,
                    BonusDeductRuleName = "BonusDeductRule" + i
                };
                wtkProfiles.Add(wtkProfile2);
            }

            var overtimeRules = new List <OvertimeRule>();

            for (int i = 1; i <= overtimeRulesCount; i++)
            {
                var overtimeRule = new OvertimeRule
                {
                    Name             = "OvertimeRuleName" + i,
                    Amount           = new TimeSpan(0, 17 + i, 0),
                    ResetAtTime      = new TimeSpan(8, 10 + i, 0),
                    RequiresApproval = true,
                    ResetDay         = i,
                    UseRoundedTime   = true
                };
                overtimeRules.Add(overtimeRule);
            }

            var bonusDeductRules = new List <BonusDeductRule>();

            for (int i = 1; i <= bonusDeductRulesCount; i++)
            {
                var bonusDeductRule = new BonusDeductRule
                {
                    Name              = "BonusDeductRule" + i,
                    Amount            = "Amount" + i,
                    PayCode           = "PayCode" + i,
                    ShiftMinimumHours = new TimeSpan(8, 10 + i, 0),
                    Type              = "Type" + i
                };
                bonusDeductRules.Add(bonusDeductRule);
            }

            var mapper = new OvertimeRuleMapper();

            var results = mapper.Map(wtkProfiles, overtimeRules, bonusDeductRules);

            Assert.NotNull(results);
            Assert.AreEqual(payRuleCount, results.Count);
            for (int i = 1; i <= payRuleCount; i++)
            {
                Assert.AreEqual("FullName" + i, results[i - 1].PayRule.FullName);
                Assert.AreEqual("PersonNumber" + i, results[i - 1].PayRule.PersonNumber);
                Assert.AreEqual("PayRuleName" + i, results[i - 1].PayRule.PayRuleName);

                if (overtimeRules.Any(s => s.Name.Equals("OvertimeRuleName" + i, StringComparison.OrdinalIgnoreCase)))
                {
                    Assert.AreEqual("OvertimeRuleName" + i, results[i - 1].OvertimeRule.Name);
                    Assert.AreEqual(new TimeSpan(0, 17 + i, 0), results[i - 1].OvertimeRule.Amount);
                    Assert.AreEqual(new TimeSpan(8, 10 + i, 0), results[i - 1].OvertimeRule.ResetAtTime);
                    Assert.AreEqual(true, results[i - 1].OvertimeRule.RequiresApproval);
                    Assert.AreEqual(true, results[i - 1].OvertimeRule.UseRoundedTime);
                    Assert.AreEqual(i, results[i - 1].OvertimeRule.ResetDay);
                }
                else
                {
                    Assert.Null(results[i - 1].OvertimeRule);
                }

                if (bonusDeductRules.Any(s => s.Name.Equals("BonusDeductRule" + i, StringComparison.OrdinalIgnoreCase)))
                {
                    Assert.AreEqual("BonusDeductRule" + i, results[i - 1].BonusDeductRule.Name);
                    Assert.AreEqual("Amount" + i, results[i - 1].BonusDeductRule.Amount);
                    Assert.AreEqual("PayCode" + i, results[i - 1].BonusDeductRule.PayCode);
                    Assert.AreEqual("Type" + i, results[i - 1].BonusDeductRule.Type);
                    Assert.AreEqual(new TimeSpan(8, 10 + i, 0), results[i - 1].BonusDeductRule.ShiftMinimumHours);
                }
                else
                {
                    Assert.Null(results[i - 1].BonusDeductRule);
                }
            }
        }
        public void TestThatWtkfProfileAndPunchRoundRuleAndBreakRuleModelsMapToPunchRoundRulePerPayRuleCorrectly()
        {
            var payRuleCount         = 2;
            var punchRoundRulesCount = 3;
            var breakRulesCount      = 1;
            var wtkProfiles          = new List <WtkProfile>();

            for (int i = 1; i <= payRuleCount; i++)
            {
                var wtkProfile = new WtkProfile
                {
                    PayRule = new PayRule
                    {
                        FullName     = "FullName" + i,
                        PayRuleName  = "PayRuleName" + i,
                        PersonNumber = "PersonNumber" + i
                    },
                    BreakRuleNames = "BreakRuleNames" + i,
                    RoundRuleName  = "RoundRuleName" + i
                };
                wtkProfiles.Add(wtkProfile);
                var wtkProfile2 = new WtkProfile
                {
                    PayRule = new PayRule
                    {
                        FullName     = "FullName2" + i,
                        PayRuleName  = "PayRuleName" + i,
                        PersonNumber = "PersonNumber2" + i
                    },
                    BreakRuleNames = "BreakRuleNames" + i,
                    RoundRuleName  = "RoundRuleName" + i
                };
                wtkProfiles.Add(wtkProfile2);
            }

            var punchRoundRules = new List <PunchRoundRule>();

            for (int i = 1; i <= punchRoundRulesCount; i++)
            {
                var punchRoundRule = new PunchRoundRule
                {
                    Name = "RoundRuleName" + i,
                    InPunchEarlyChangePoint  = new TimeSpan(0, 10 + i, 0),
                    InPunchEarlyInsideRound  = new TimeSpan(0, 11 + i, 0),
                    InPunchEarlyInsideGrace  = new TimeSpan(0, 12 + i, 0),
                    OutPunchEarlyChangePoint = new TimeSpan(0, 10 + i, 0),
                    OutPunchEarlyInsideRound = new TimeSpan(0, 11 + i, 0),
                    OutPunchEarlyInsideGrace = new TimeSpan(0, 12 + i, 0)
                };
                punchRoundRules.Add(punchRoundRule);
            }

            var breakRules = new List <BreakRule>();

            for (int i = 1; i <= breakRulesCount; i++)
            {
                var breakRule = new BreakRule
                {
                    Name                        = "BreakRuleNames" + i,
                    LongChangePoint             = new TimeSpan(0, i, 0),
                    LongGrace                   = new TimeSpan(0, 1 + i, 0),
                    LongRound                   = new TimeSpan(0, 2 + i, 0),
                    ShortChangePoint            = new TimeSpan(0, i, 0),
                    ShortGrace                  = new TimeSpan(0, 1 + i, 0),
                    ShortRound                  = new TimeSpan(0, 2 + i, 0),
                    UseUnscheduledPunchRounding = true
                };
                breakRules.Add(breakRule);
            }

            var mapper = new PunchRoundRuleMapper();

            var results = mapper.Map(wtkProfiles, punchRoundRules, breakRules);

            Assert.NotNull(results);
            Assert.AreEqual(payRuleCount, results.Count);
            for (int i = 1; i <= payRuleCount; i++)
            {
                Assert.AreEqual("FullName" + i, results[i - 1].PayRule.FullName);
                Assert.AreEqual("PersonNumber" + i, results[i - 1].PayRule.PersonNumber);
                Assert.AreEqual("PayRuleName" + i, results[i - 1].PayRule.PayRuleName);

                if (punchRoundRules.Any(s => s.Name.Equals("RoundRuleName" + i, StringComparison.OrdinalIgnoreCase)))
                {
                    Assert.AreEqual("RoundRuleName" + i, results[i - 1].PunchRoundRule.Name);
                    Assert.AreEqual(new TimeSpan(0, 10 + i, 0), results[i - 1].PunchRoundRule.InPunchEarlyChangePoint);
                    Assert.AreEqual(new TimeSpan(0, 11 + i, 0), results[i - 1].PunchRoundRule.InPunchEarlyInsideRound);
                    Assert.AreEqual(new TimeSpan(0, 12 + i, 0), results[i - 1].PunchRoundRule.InPunchEarlyInsideGrace);
                    Assert.AreEqual(new TimeSpan(0, 10 + i, 0), results[i - 1].PunchRoundRule.OutPunchEarlyChangePoint);
                    Assert.AreEqual(new TimeSpan(0, 11 + i, 0), results[i - 1].PunchRoundRule.OutPunchEarlyInsideRound);
                    Assert.AreEqual(new TimeSpan(0, 12 + i, 0), results[i - 1].PunchRoundRule.OutPunchEarlyInsideGrace);
                }
                else
                {
                    Assert.Null(results[i - 1].PunchRoundRule);
                }

                if (breakRules.Any(s => s.Name.Equals("BreakRuleNames" + i, StringComparison.OrdinalIgnoreCase)))
                {
                    Assert.AreEqual("BreakRuleNames" + i, results[i - 1].BreakRule.Name);
                    Assert.AreEqual(new TimeSpan(0, i, 0), results[i - 1].BreakRule.LongChangePoint);
                    Assert.AreEqual(new TimeSpan(0, 1 + i, 0), results[i - 1].BreakRule.LongGrace);
                    Assert.AreEqual(new TimeSpan(0, 2 + i, 0), results[i - 1].BreakRule.LongRound);
                    Assert.AreEqual(new TimeSpan(0, i, 0), results[i - 1].BreakRule.ShortChangePoint);
                    Assert.AreEqual(new TimeSpan(0, 1 + i, 0), results[i - 1].BreakRule.ShortGrace);
                    Assert.AreEqual(new TimeSpan(0, 2 + i, 0), results[i - 1].BreakRule.ShortRound);
                    Assert.AreEqual(true, results[i - 1].BreakRule.UseUnscheduledPunchRounding);
                }
                else
                {
                    Assert.Null(results[i - 1].BreakRule);
                }
            }
        }
        public void TestThatWtkfProfileAndShiftGuaranteeMapToShiftGuaranteePerPayRuleCorrectly()
        {
            var payRuleCount = 2;

            var wtkProfiles = new List <WtkProfile>();

            for (int i = 1; i <= payRuleCount; i++)
            {
                var wtkProfile = new WtkProfile
                {
                    PayRule = new PayRule
                    {
                        FullName     = "FullName" + i,
                        PayRuleName  = "PayRuleName" + i,
                        PersonNumber = "PersonNumber" + i
                    },
                    WorkruleName        = "WorkruleName" + i,
                    BreakRuleNames      = "BreakRuleNames" + i,
                    BonusDeductRuleName = "BonusDeductRuleName" + i,
                    ShiftGuaranteeName  = "ShiftGuarantee" + i
                };
                wtkProfiles.Add(wtkProfile);

                var wtkProfile2 = new WtkProfile
                {
                    PayRule = new PayRule
                    {
                        FullName     = "FullName2" + i,
                        PayRuleName  = "PayRuleName" + i,
                        PersonNumber = "PersonNumber2" + i
                    },
                    WorkruleName        = "WorkruleName" + i,
                    BreakRuleNames      = "BreakRuleNames" + i,
                    BonusDeductRuleName = "BonusDeductRuleName" + i,
                    ShiftGuaranteeName  = "ShiftGuarantee" + i
                };
                wtkProfiles.Add(wtkProfile2);
            }

            var data = new List <ShiftGuarantee>
            {
                new ShiftGuarantee
                {
                    ReductByAmountTardy = true,
                    Sunday    = new TimeSpan(13, 10, 0),
                    Monday    = new TimeSpan(13, 11, 0),
                    Tuesday   = new TimeSpan(13, 12, 0),
                    Wednesday = new TimeSpan(13, 13, 0),
                    Thursday  = new TimeSpan(13, 14, 0),
                    Friday    = new TimeSpan(13, 15, 0),
                    Saturday  = new TimeSpan(13, 16, 0),
                    Name      = "ShiftGuarantee1",
                    WorkRule  = "WorkRule0"
                },
                new ShiftGuarantee
                {
                    ReductByAmountTardy = true,
                    Sunday    = new TimeSpan(14, 10, 0),
                    Monday    = new TimeSpan(14, 11, 0),
                    Tuesday   = new TimeSpan(14, 12, 0),
                    Wednesday = new TimeSpan(14, 13, 0),
                    Thursday  = new TimeSpan(14, 14, 0),
                    Friday    = new TimeSpan(14, 15, 0),
                    Saturday  = new TimeSpan(14, 16, 0),
                    Name      = "ShiftGuarantee1",
                    WorkRule  = "WorkRule1"
                },
                new ShiftGuarantee
                {
                    ReductByAmountTardy = true,
                    Sunday    = new TimeSpan(15, 10, 0),
                    Monday    = new TimeSpan(15, 11, 0),
                    Tuesday   = new TimeSpan(15, 12, 0),
                    Wednesday = new TimeSpan(15, 13, 0),
                    Thursday  = new TimeSpan(15, 14, 0),
                    Friday    = new TimeSpan(15, 15, 0),
                    Saturday  = new TimeSpan(15, 16, 0),
                    Name      = "ShiftGuarantee2",
                    WorkRule  = "WorkRule2"
                }
            };

            var mapper = new ShiftGuaranteeMapper();
            var result = mapper.Map(wtkProfiles, data);

            Assert.NotNull(result);
            Assert.AreEqual(2, result.Count);
            var ind = 1;

            for (int i = 0; i <= 1; i++)
            {
                if (i == 1)
                {
                    ind = 2;
                }
                Assert.AreEqual("FullName" + ind, result[i].PayRule.FullName);
                Assert.AreEqual("PersonNumber" + ind, result[i].PayRule.PersonNumber);
                Assert.AreEqual("PayRuleName" + ind, result[i].PayRule.PayRuleName);
                Assert.AreEqual("BonusDeductRuleName" + ind, result[i].BonusDeductRuleName);
                Assert.AreEqual("BreakRuleNames" + ind, result[i].BreakRuleNames);
                Assert.AreEqual("WorkruleName" + ind, result[i].WorkruleName);
                Assert.AreEqual(true, result[i].ShiftGuarantee.ReductByAmountTardy);
                Assert.AreEqual("ShiftGuarantee" + ind, result[i].ShiftGuarantee.Name);
                Assert.AreEqual("WorkRule" + ind, result[i].ShiftGuarantee.WorkRule);
                Assert.AreEqual(new TimeSpan(14 + ind - 1, 10, 0), result[i].ShiftGuarantee.Sunday);
                Assert.AreEqual(new TimeSpan(14 + ind - 1, 11, 0), result[i].ShiftGuarantee.Monday);
                Assert.AreEqual(new TimeSpan(14 + ind - 1, 12, 0), result[i].ShiftGuarantee.Tuesday);
                Assert.AreEqual(new TimeSpan(14 + ind - 1, 13, 0), result[i].ShiftGuarantee.Wednesday);
                Assert.AreEqual(new TimeSpan(14 + ind - 1, 14, 0), result[i].ShiftGuarantee.Thursday);
                Assert.AreEqual(new TimeSpan(14 + ind - 1, 15, 0), result[i].ShiftGuarantee.Friday);
                Assert.AreEqual(new TimeSpan(14 + ind - 1, 16, 0), result[i].ShiftGuarantee.Saturday);
            }
        }
        public void TestThatWtkfProfileAndWsaExceptionRuleModelsMapToExceptionRulePerPayRuleCorrectly()
        {
            var payRuleCount          = 2;
            var wsaExceptionRuleCount = 3;
            var wtkProfiles           = new List <WtkProfile>();

            for (int i = 1; i <= payRuleCount; i++)
            {
                var wtkProfile = new WtkProfile
                {
                    PayRule = new PayRule
                    {
                        FullName     = "FullName" + i,
                        PayRuleName  = "PayRuleName" + i,
                        PersonNumber = "PersonNumber" + i
                    },
                    ExceptionRuleName = "ExceptionRuleName" + i
                };
                wtkProfiles.Add(wtkProfile);
            }

            var wsaExceptionRules = new List <WsaExceptionRule>();

            for (int i = 1; i <= wsaExceptionRuleCount; i++)
            {
                var exceptionRule = new WsaExceptionRule
                {
                    Name                  = "ExceptionRuleName" + i,
                    InEarly               = new TimeSpan(0, 17 + i, 0),
                    OutEarly              = new TimeSpan(8, 10 + i, 0),
                    InVeryEarly           = "InVeryEarly" + i,
                    OutVeryLate           = "OutVeryLate" + i,
                    InLate                = new TimeSpan(0, 15 + i, 0),
                    OutLate               = new TimeSpan(4, 10 + i, 0),
                    EarlyOutNdPayCodeName = "EarlyOutNdPayCodeName" + i,
                    Unscheduled           = i % 2 == 0,
                    Breaks                = new List <string>
                    {
                        "Break" + i + 1,
                        "Break" + i + 2,
                        "Break" + i + 3
                    }
                };
                wsaExceptionRules.Add(exceptionRule);
            }

            var mapper = new ExceptionRuleMapper();

            var results = mapper.Map(wtkProfiles, wsaExceptionRules);

            Assert.NotNull(results);
            Assert.AreEqual(payRuleCount, results.Count);
            for (int i = 1; i <= payRuleCount; i++)
            {
                Assert.AreEqual("FullName" + i, results[i - 1].PayRule.FullName);
                Assert.AreEqual("PersonNumber" + i, results[i - 1].PayRule.PersonNumber);
                Assert.AreEqual("PayRuleName" + i, results[i - 1].PayRule.PayRuleName);

                Assert.AreEqual(new TimeSpan(0, 17 + i, 0), results[i - 1].ExceptionRule.InEarly);
                Assert.AreEqual(new TimeSpan(8, 10 + i, 0), results[i - 1].ExceptionRule.OutEarly);
                Assert.AreEqual(new TimeSpan(0, 15 + i, 0), results[i - 1].ExceptionRule.InLate);
                Assert.AreEqual("InVeryEarly" + i, results[i - 1].ExceptionRule.InVeryEarly);
                Assert.AreEqual("OutVeryLate" + i, results[i - 1].ExceptionRule.OutVeryLate);
                Assert.AreEqual(new TimeSpan(4, 10 + i, 0), results[i - 1].ExceptionRule.OutLate);
                Assert.AreEqual("EarlyOutNdPayCodeName" + i, results[i - 1].ExceptionRule.EarlyOutNdPayCodeName);
                Assert.AreEqual(i % 2 == 0, results[i - 1].ExceptionRule.Unscheduled);
                Assert.AreEqual("Break" + i + 3, results[i - 1].Break);
            }
        }