Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
90.00% covered (success)
90.00%
36 / 40
80.00% covered (warning)
80.00%
4 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
CalculateDayOff
90.00% covered (success)
90.00%
36 / 40
80.00% covered (warning)
80.00%
4 / 5
12.14
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 calculateDayOffByYear
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
3
 calculateEaster
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 writeDayOffListUntilYear
60.00% covered (warning)
60.00%
6 / 10
0.00% covered (danger)
0.00%
0 / 1
6.60
 readDayoffList
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace BO\Zmsdb\Helper;
4
5class CalculateDayOff
6{
7    private \DateTime $dateTime;
8
9    protected $dayOffList = [
10        'Y-01-01' => 'Neujahr',
11        'Y-03-08' => 'Internationaler Frauentag',
12        'E-2'    => 'Karfreitag',
13        'E+0'    => 'Ostersonntag',
14        'E+1'    => 'Ostermontag',
15        'Y-05-01' => 'Maifeiertag',
16        'E+39'   => 'Christi Himmelfahrt',
17        'E+50'   => 'Pfingstmontag',
18        'Y-10-03' => 'Tag der Deutschen Einheit',
19        #'Y-12-24' => 'Heiligabend',
20        'Y-12-25' => '1. Weihnachtstag',
21        'Y-12-26' => '2. Weihnachtstag',
22        #'Y-12-31' => 'Silvester'
23    ];
24
25    protected $dateEaster;
26
27    protected $dateFormat = 'Y-m-d';
28
29    protected $verbose = false;
30
31    protected $targetYear;
32
33    public function __construct($targetYear, $verbose = false)
34    {
35        $this->dateTime = new \DateTime('now', new \DateTimeZone('Europe/Berlin'));
36        $this->targetYear = $targetYear;
37        $this->verbose = $verbose;
38    }
39
40    protected function calculateDayOffByYear($year)
41    {
42        $collection = new \BO\Zmsentities\Collection\DayoffList();
43        $dateEaster = $this->calculateEaster($year);
44        foreach ($this->dayOffList as $dateExpr => $description) {
45            if (strpos($dateExpr, 'E') === 0) {
46                $dateExpr = ltrim($dateExpr, 'E');
47                $dtCurr = clone $dateEaster;
48                $date = $dtCurr->modify($dateExpr . ' day')->format($this->dateFormat);
49                $entity = new \BO\Zmsentities\Dayoff([
50                    'name' => $description,
51                    'date' => (new \DateTimeImmutable($date))->getTimestamp()
52                ]);
53            } else {
54                $date = $dateEaster->format($dateExpr);
55                $entity = new \BO\Zmsentities\Dayoff([
56                    'name' => $description,
57                    'date' => (new \DateTimeImmutable($date))->getTimestamp()
58                ]);
59            }
60            $collection->addEntity($entity);
61        }
62        return $collection;
63    }
64
65    protected function calculateEaster($year)
66    {
67        $date = clone $this->dateTime;
68        if ($year) {
69            $date = $date->setDate($year, $date->format('m'), $date->format('d'));
70        }
71        $easterDate = \easter_date($date->format('Y'));
72
73        return $date->setTimestamp($easterDate);
74    }
75
76    public function writeDayOffListUntilYear($commit = false, $fromnow = false)
77    {
78        $query = new \BO\Zmsdb\DayOff();
79        $list = $this->readDayoffList($query, $this->targetYear);
80
81        if ($fromnow) {
82            for ($loopYear = $this->dateTime->format('Y'); $loopYear < $this->targetYear; $loopYear++) {
83                $collection = $this->readDayoffList($query, $loopYear);
84                $list->addList($collection);
85            }
86        }
87        if ($commit) {
88            $query->writeCommonDayoffsByYear($list, null, false);
89        }
90        if ($this->verbose) {
91            return $list->sortByCustomKey('date');
92        }
93    }
94
95    protected function readDayoffList($query, $year)
96    {
97        $collection = $query->readCommonByYear($year);
98        $newDayOffList = $this->calculateDayOffByYear($year);
99        $collection = $collection->withNew($newDayOffList);
100        return $collection;
101    }
102}