public void ShouldValidateOverTimeWithSingleTimePunch()
        {
            //GIVEN
            punches = new List <TimePunch>
            {
                new TimePunch {
                    ClockedIn  = DateTime.Parse("2017-10-11 21:11:00"),
                    ClockedOut = DateTime.Parse("2017-10-12 05:45:00"),
                    Created    = DateTime.Parse("2017-10-11 21:11:38"),
                    HourlyWage = 10,
                    Id         = 4046830,
                    LocationId = 4046830,
                    Modified   = DateTime.Parse("2017-10-12 05:45:49"),
                    UserId     = 517135
                }
            };

            labourSettings = new LabourSettings
            {
                DailyOvertimeMultiplier = 1.5,
                DailyOvertimeThreshold  = 480,
                Overtime = true,
                WeeklyOvertimeMultiplier = 2,
                WeeklyOvertimeThreshold  = 2400
            };

            //WHEN
            var calculator        = new WorkedHourCalculator(new BasicWageCalculator());
            var calculationResult = calculator.CalculateWorkedDay(punches, labourSettings);

            //THEN
            Assert.IsNotNull(calculationResult);
            Assert.AreEqual(8.0d, calculationResult.TotalRegularHours);
            Assert.AreEqual(0.57d, calculationResult.TotalOvertimeHours);
        }
        public void ShouldCalculateWeeklyWageWithoutOvertime()
        {
            decimal employeeHourSalary = 10;

            //GIVEN
            punches = TimePunchesMock.GetThreeWeeksFromEmployee().ToList();

            labourSettings = new LabourSettings
            {
                DailyOvertimeMultiplier = 1.5,
                DailyOvertimeThreshold  = 480,
                Overtime = true,
                WeeklyOvertimeMultiplier = 2,
                WeeklyOvertimeThreshold  = 2400
            };

            //WHEN
            var hourCalculator       = new WorkedHourCalculator(new BasicWageCalculator());
            var calculationResults   = hourCalculator.CalculateWorkedWeek(punches, labourSettings, user).ToArray();
            var wageCalculator       = new BasicWageCalculator();
            var weeklyCalculatedWage = wageCalculator.CalculateWage(calculationResults[0].TotalRegularHours, calculationResults[0].TotalWeekOverTime, employeeHourSalary, (decimal)labourSettings.WeeklyOvertimeMultiplier);
            var dailyCalculatedWage  = wageCalculator.CalculateWage(calculationResults[0].TotalRegularHours, calculationResults[0].TotalDailyOverTime, employeeHourSalary, (decimal)labourSettings.DailyOvertimeMultiplier);

            //THEN

            Assert.IsNotNull(weeklyCalculatedWage);
            Assert.AreEqual(0.0m, weeklyCalculatedWage.OvertimeWage);
            Assert.AreEqual(38.55m, dailyCalculatedWage.OvertimeWage);
            Assert.AreEqual(160m, weeklyCalculatedWage.RegularWage);
        }
        public void ShouldIdentifyAWorkDateWithMissingClockOut()
        {
            //GIVEN
            punches = new List <TimePunch>
            {
                new TimePunch {
                    ClockedIn  = DateTime.Parse("2017-10-11 21:11:00"),
                    ClockedOut = default(DateTime),
                    Created    = DateTime.Parse("2017-10-11 21:11:38"),
                    HourlyWage = 10,
                    Id         = 4046830,
                    LocationId = 4046830,
                    Modified   = DateTime.Parse("2017-10-12 05:45:49"),
                    UserId     = 517135
                }
            };

            labourSettings = new LabourSettings
            {
                DailyOvertimeMultiplier = 1.5,
                DailyOvertimeThreshold  = 480,
                Overtime = true,
                WeeklyOvertimeMultiplier = 2,
                WeeklyOvertimeThreshold  = 2400
            };

            //WHEN
            var calculator        = new WorkedHourCalculator(new BasicWageCalculator());
            var calculationResult = calculator.CalculateWorkedDay(punches, labourSettings);

            //THEN
            Assert.IsNotNull(calculationResult);
            Assert.IsTrue(calculationResult.Status == Domain.Enum.EWorkHourStatus.MissingClockEntries);
        }
        public void ShouldCalculateDailyWage()
        {
            //GIVEN
            double workedHours   = 8d;
            double overtimeHours = 0.57d;

            decimal employeeHourSalary = 10;

            labourSettings = new LabourSettings
            {
                DailyOvertimeMultiplier = 1.5,
                DailyOvertimeThreshold  = 480,
                Overtime = true,
                WeeklyOvertimeMultiplier = 2,
                WeeklyOvertimeThreshold  = 2400
            };

            //WHEN
            var calculator = new BasicWageCalculator();
            var result     = calculator.CalculateWage(workedHours, overtimeHours, employeeHourSalary, (decimal)labourSettings.DailyOvertimeMultiplier);

            //THEN
            Assert.IsNotNull(result);
            Assert.AreEqual(8.55m, result.OvertimeWage);
            Assert.AreEqual(80m, result.RegularWage);
        }
        public void ShoudValidateWeeklyTimePunchWithWeekOvertime()
        {
            //GIVEN
            punches = TimePunchesMock.GetThreeWeeksFromEmployee().ToList();

            labourSettings = new LabourSettings
            {
                DailyOvertimeMultiplier = 1.5,
                DailyOvertimeThreshold  = 480,
                Overtime = true,
                WeeklyOvertimeMultiplier = 2,
                WeeklyOvertimeThreshold  = 2400
            };

            //WHEN
            var calculator        = new WorkedHourCalculator(new BasicWageCalculator());
            var calculationResult = calculator.CalculateWorkedWeek(punches, labourSettings, user).ToArray();

            //THEN
            Assert.IsNotNull(calculationResult);
            Assert.AreEqual(2, calculationResult.Count());
            Assert.IsTrue(calculationResult[1].TotalWeekOverTime > 0);
        }