Example #1
0
        public void LoadFromDatabaseTest()
        {
            var repository = new LiteClockWorkRepository(_options);
            var worker     = new ClockWorker("Mustermann", "Max", new DateTime(1970, 5, 10));
            var calendar   = new ClockWorkUnitCollection(
                worker,
                new ClockWorkUnit(new DateTime(2018, 10, 1, 7, 38, 0), new DateTime(2018, 10, 1, 16, 12, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 2, 7, 33, 0), new DateTime(2018, 10, 2, 17, 00, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 4, 7, 35, 0), new DateTime(2018, 10, 4, 17, 7, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 5, 7, 36, 0), new DateTime(2018, 10, 5, 17, 5, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 8, 6, 58, 0), new DateTime(2018, 10, 8, 15, 35, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 9, 7, 33, 0), new DateTime(2018, 10, 9, 17, 1, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 10, 7, 35, 0), new DateTime(2018, 10, 10, 21, 0, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 11, 8, 30, 0), new DateTime(2018, 10, 11, 21, 0, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 12, 7, 35, 0), new DateTime(2018, 10, 12, 16, 45, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 15, 7, 42, 0), new DateTime(2018, 10, 15, 17, 0, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 16, 7, 38, 0), new DateTime(2018, 10, 16, 15, 42, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 17, 7, 33, 0), new DateTime(2018, 10, 17, 17, 8, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 18, 7, 34, 0), new DateTime(2018, 10, 18, 17, 0, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 19, 7, 35, 0), new DateTime(2018, 10, 19, 17, 11, 0))
                );

            repository.Save(calendar);

            repository = new LiteClockWorkRepository(_options);
            var loadedCalendar = repository.LoadCalendar(calendar.Worker.Id);

            Assert.False(ReferenceEquals(calendar, loadedCalendar));
            Assert.Equal(calendar.Worker, loadedCalendar.Worker);
            Assert.Equal(calendar, loadedCalendar);
        }
Example #2
0
 public static Worker FromBusinessModel(ClockWorker clockWorker) => new Worker
 {
     Id          = clockWorker.Id,
     FamilyName  = clockWorker.FamilyName,
     GivenName   = clockWorker.GivenName,
     DateOfBirth = clockWorker.DateOfBirth
 };
Example #3
0
        public void CalendarTest()
        {
            var repository = new LiteClockWorkRepository(_options);
            var worker     = new ClockWorker("Mustermann", "Max", new DateTime(1970, 5, 10));
            var calendar   = new ClockWorkUnitCollection(
                worker,
                new ClockWorkUnit(new DateTime(2018, 10, 1, 7, 38, 0), new DateTime(2018, 10, 1, 16, 12, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 2, 7, 33, 0), new DateTime(2018, 10, 2, 17, 00, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 4, 7, 35, 0), new DateTime(2018, 10, 4, 17, 7, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 5, 7, 36, 0), new DateTime(2018, 10, 5, 17, 5, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 8, 6, 58, 0), new DateTime(2018, 10, 8, 15, 35, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 9, 7, 33, 0), new DateTime(2018, 10, 9, 17, 1, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 10, 7, 35, 0), new DateTime(2018, 10, 10, 21, 0, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 11, 8, 30, 0), new DateTime(2018, 10, 11, 21, 0, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 12, 7, 35, 0), new DateTime(2018, 10, 12, 16, 45, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 15, 7, 42, 0), new DateTime(2018, 10, 15, 17, 0, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 16, 7, 38, 0), new DateTime(2018, 10, 16, 15, 42, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 17, 7, 33, 0), new DateTime(2018, 10, 17, 17, 8, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 18, 7, 34, 0), new DateTime(2018, 10, 18, 17, 0, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 19, 7, 35, 0), new DateTime(2018, 10, 19, 17, 11, 0))
                );

            repository.Save(calendar);
            repository.Save(calendar); //loads from cache, test for database loading needed
            var savedCalendar = repository.LoadCalendar(worker.Id);

            Assert.Equal(calendar, savedCalendar);
        }
Example #4
0
        public void LoadEmptyCalendarTest()
        {
            var         repository = new LiteClockWorkRepository(_options);
            ClockWorker worker;

            repository.Save(worker = new ClockWorker("Mustermann", "Max", new DateTime(1970, 5, 10)));
            Assert.Null(repository.LoadCalendar(worker.Id));
        }
Example #5
0
        public void EqualityTest()
        {
            var worker      = new ClockWorker("Mustermann", "Max", DateTime.Now.AddYears(-21));
            var otherWorker = new ClockWorker("Mustermann", "max", DateTime.Today.AddYears(-21));
            var thirdWorker = new ClockWorker("Schildt", "Hans", new DateTime(1971, 12, 1));

            Assert.Equal(worker, otherWorker);
            Assert.Equal(worker, worker);
            Assert.Equal(worker.Clone(), otherWorker);
            Assert.NotEqual(worker, thirdWorker);

            Assert.Equal(2, new [] { worker, worker, worker, otherWorker, thirdWorker }.Distinct().Count());
        }
Example #6
0
        public Task <IActionResult> UpdateWorker(int id, [FromBody] ClockWorker worker)
        {
            if (worker.Id != id)
            {
                worker.Id = id;
            }

            _repository.Save(worker);

            IActionResult result = Ok(worker);

            return(Task.FromResult(result));
        }
Example #7
0
        public void Save(ClockWorker worker)
        {
            using (var db = GetDatabase(_options))
            {
                var workers = db.Workers;

                if (worker.Id == 0)
                {
                    worker.Id = workers.Insert(Worker.FromBusinessModel(worker));
                }
                else
                {
                    workers.Update(Worker.FromBusinessModel(worker));
                }
            }
        }
Example #8
0
        public void Test()
        {
            var unit     = new ClockWorkUnit(DateTime.Today.AddHours(8), DateTime.Today.AddHours(17)).PauseFor(30);
            var worker   = new ClockWorker("Mustermann", "Max", DateTime.Today.AddYears(-21));
            var calendar = new ClockWorkUnitCollection(worker, unit);

            IEffectiveWorkingTimeCalculator calculator = new StsWorkCalculator();
            var calculationResult = calculator.Calculate(calendar);

            Assert.Equal(TimeSpan.FromHours(8.5), calculationResult.CalculatedWorkedHours);
            Assert.Equal(TimeSpan.FromHours(8.5), calculationResult.ExactWorkedHours);

            calendar.Add(new ClockWorkUnit(new DateTime(2018, 10, 1, 7, 58, 10), new DateTime(2018, 10, 1, 16, 56, 20)));
            calculationResult = calculator.Calculate(calendar);
            Assert.Equal(TimeSpan.FromMinutes(1010), calculationResult.CalculatedWorkedHours);
            Assert.NotEqual(calculationResult.CalculatedWorkedHours, calculationResult.ExactWorkedHours);
        }
Example #9
0
        public void Test()
        {
            var startDate = new DateTime(2018, 10, 26).Date;

            var unit   = new ClockWorkUnit(startDate.AddHours(8), startDate.AddHours(17));
            var worker = new ClockWorker("Mustermann", "Max", startDate.AddYears(-21));

            var calendar = new ClockWorkUnitCollection(worker, unit);

            IEffectiveWorkingTimeCalculator calculator = new ExactWorkCalculator();
            var calculationResult = calculator.Calculate(calendar);

            Assert.Equal(TimeSpan.FromHours(9), calculationResult.CalculatedWorkedHours);
            Assert.Equal(TimeSpan.FromHours(9), calculationResult.ExactWorkedHours);

            var result = calculator.GetBalance(calendar, startDate.AddDays(1));

            Assert.Equal(calculationResult.CalculatedWorkedHours, result.CalculatedWorkedHours);

            Assert.Equal("26.10.2018, KW 43: +09:00/+08:00", calculationResult.Single().ToString());
        }
Example #10
0
        public void WorkerTest()
        {
            var repository = new LiteClockWorkRepository(_options);
            var newWorker  = new ClockWorker("Mustermann", "Max", new DateTime(1970, 5, 10));

            repository.Save(newWorker);

            var worker = repository.LoadWorker(newWorker.Id);

            newWorker = new ClockWorker("Mustermann", "Moritz", new DateTime(1970, 5, 10))
            {
                Id = newWorker.Id
            };
            repository.Save(newWorker);
            var otherWorker = repository.LoadWorker(newWorker.Id);

            Assert.Equal(worker.Id, otherWorker.Id);
            Assert.NotEqual(worker.GivenName, otherWorker.GivenName);

            var allWorkers = repository.LoadWorkers();

            Assert.Single(allWorkers);
            Assert.Equal(otherWorker, allWorkers.First());
        }
Example #11
0
        public void RealDataTest()
        {
            var worker   = new ClockWorker("Mustermann", "Max", new DateTime(1970, 5, 10));
            var calendar = new ClockWorkUnitCollection(
                worker,
                new ClockWorkUnit(new DateTime(2018, 10, 01, 07, 38, 0), new DateTime(2018, 10, 01, 16, 12, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 02, 07, 33, 0), new DateTime(2018, 10, 02, 17, 00, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 04, 07, 35, 0), new DateTime(2018, 10, 04, 17, 07, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 05, 07, 36, 0), new DateTime(2018, 10, 05, 17, 05, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 08, 06, 58, 0), new DateTime(2018, 10, 08, 15, 35, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 09, 07, 33, 0), new DateTime(2018, 10, 09, 17, 01, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 10, 07, 35, 0), new DateTime(2018, 10, 10, 21, 00, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 11, 08, 30, 0), new DateTime(2018, 10, 11, 21, 00, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 12, 07, 35, 0), new DateTime(2018, 10, 12, 16, 45, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 15, 07, 42, 0), new DateTime(2018, 10, 15, 17, 00, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 16, 07, 38, 0), new DateTime(2018, 10, 16, 15, 42, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 17, 07, 33, 0), new DateTime(2018, 10, 17, 17, 08, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 18, 07, 34, 0), new DateTime(2018, 10, 18, 17, 00, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 19, 07, 35, 0), new DateTime(2018, 10, 19, 17, 11, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 22, 07, 38, 0), new DateTime(2018, 10, 22, 16, 12, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 23, 07, 45, 0), new DateTime(2018, 10, 23, 17, 00, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 24, 00, 00, 0), new DateTime(2018, 10, 24, 00, 00, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 25, 07, 40, 0), new DateTime(2018, 10, 25, 16, 36, 0)),
                new ClockWorkUnit(new DateTime(2018, 10, 26, 07, 32, 0), new DateTime(2018, 10, 26, 17, 02, 0))
                );

            IEffectiveWorkingTimeCalculator calculator = new StsWorkCalculator();

            var calculationResult = calculator.Calculate(calendar);

            string DisplayTime(TimeSpan ts)
            {
                return($"{(ts < TimeSpan.Zero ? "-" : "+")}{(int) Math.Abs(ts.TotalHours):D2}:{Math.Abs(ts.Minutes):D2}");
            }

            void LogResult(CalculationResultCollection r, Func <CalculationResult, string> getPrefix)
            {
                r.ToList().ForEach(p => _output.WriteLine("{0}: balance {1}", getPrefix(p), DisplayTime(p.Overtime)));
            }

            _output.WriteLine($"Calculated working time for calendar from {calendar.First().Start.Date:dd.MM.yyyy} to {calendar.Last().Start.Date:dd.MM.yyyy}");
            _output.WriteLine($"    Regular working hours: {DisplayTime(calculationResult.WorkingHours)}");
            _output.WriteLine($"    Hours accounted for: {DisplayTime(calculationResult.CalculatedWorkedHours)}");
            _output.WriteLine($"    Unaccounted time: {DisplayTime(calculationResult.ExactWorkedHours - calculationResult.CalculatedWorkedHours)}");
            _output.WriteLine($"    Accounted overtime: {DisplayTime(calculationResult.Overtime)}");
            _output.WriteLine("".PadLeft(80, '='));
            _output.WriteLine(string.Empty);

            _output.WriteLine("Output by day:");
            LogResult(calculationResult, p => p.Date.ToString("dd.MM.yyyy"));
            _output.WriteLine("".PadLeft(80, '='));

            Assert.Equal(19, calculationResult.Count);
            Assert.Equal(calculationResult, calculationResult.GroupBy.Day);

            var result = calculationResult.GroupBy.Week;

            _output.WriteLine("Output by week:");
            LogResult(result, p => "KW " + (1 + (p.Date.DayOfYear - 1) / 7));
            _output.WriteLine("".PadLeft(80, '='));
            Assert.Equal(4, result.Count);

            result = calculationResult.GroupBy.Month;
            _output.WriteLine("Output by month:");
            LogResult(result, p => p.Date.ToString("MMMM", new CultureInfo("de-DE")));
            _output.WriteLine("".PadLeft(80, '='));
            Assert.Single(result);

            result = calculationResult.GroupBy.Year;
            _output.WriteLine("Output by year:");
            LogResult(result, p => p.Date.Year.ToString(CultureInfo.InvariantCulture));
            _output.WriteLine("".PadLeft(80, '='));
            Assert.Single(result);
        }
Example #12
0
 public Task <IActionResult> CreateWorker([FromBody] ClockWorker worker)
 {
     worker.Id = 0;
     _repository.Save(worker);
     return(Task.FromResult((IActionResult)Ok(worker)));
 }