Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 74 |
|
0.00% |
0 / 3 |
CRAP | |
0.00% |
0 / 1 |
OlzTermineDeadlinesTile | |
0.00% |
0 / 74 |
|
0.00% |
0 / 3 |
156 | |
0.00% |
0 / 1 |
getRelevance | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
getHtml | |
0.00% |
0 / 33 |
|
0.00% |
0 / 1 |
30 | |||
getDeadlineHtml | |
0.00% |
0 / 40 |
|
0.00% |
0 / 1 |
42 |
1 | <?php |
2 | |
3 | // ============================================================================= |
4 | // Zeigt eine Startseiten-Kachel mit den nächsten Meldeschlüssen an. |
5 | // ============================================================================= |
6 | |
7 | namespace Olz\Startseite\Components\OlzTermineDeadlinesTile; |
8 | |
9 | use Olz\Entity\Users\User; |
10 | use Olz\Startseite\Components\AbstractOlzTile\AbstractOlzTile; |
11 | |
12 | class OlzTermineDeadlinesTile extends AbstractOlzTile { |
13 | private string $in_three_days; |
14 | private string $in_one_week; |
15 | private string $in_two_weeks; |
16 | |
17 | public function getRelevance(?User $user): float { |
18 | return 0.75; |
19 | } |
20 | |
21 | public function getHtml(mixed $args): string { |
22 | $db = $this->dbUtils()->getDb(); |
23 | $date_utils = $this->dateUtils(); |
24 | $today = $date_utils->getIsoToday(); |
25 | $now = $date_utils->getIsoNow(); |
26 | $plus_three_days = \DateInterval::createFromDateString("+3 days"); |
27 | $plus_one_week = \DateInterval::createFromDateString("+7 days"); |
28 | $plus_two_weeks = \DateInterval::createFromDateString("+14 days"); |
29 | $this->in_three_days = (new \DateTime($today))->add($plus_three_days)->format('Y-m-d'); |
30 | $this->in_one_week = (new \DateTime($today))->add($plus_one_week)->format('Y-m-d'); |
31 | $this->in_two_weeks = (new \DateTime($today))->add($plus_two_weeks)->format('Y-m-d'); |
32 | |
33 | $out = "<h3>Meldeschlüsse</h3>"; |
34 | |
35 | $res = $db->query(<<<ZZZZZZZZZZ |
36 | SELECT |
37 | DATE(t.deadline) as deadline, |
38 | t.start_date as date, |
39 | t.title as title, |
40 | t.id as id, |
41 | t.image_ids as image_ids |
42 | FROM termine t |
43 | WHERE |
44 | t.deadline IS NOT NULL |
45 | AND t.deadline >= '{$now}' |
46 | AND t.deadline <= '{$this->in_two_weeks}' |
47 | AND t.on_off = '1' |
48 | ORDER BY deadline ASC |
49 | ZZZZZZZZZZ); |
50 | // @phpstan-ignore-next-line |
51 | if ($res->num_rows > 0) { |
52 | $out .= "<ul class='links'>"; |
53 | // @phpstan-ignore-next-line |
54 | while ($row = $res->fetch_assoc()) { |
55 | $out .= $this->getDeadlineHtml($row); |
56 | } |
57 | $out .= "</ul>"; |
58 | } else { |
59 | $out .= "<br /><center><i>Keine Meldeschlüsse in den nächsten drei Wochen</i></center>"; |
60 | } |
61 | |
62 | // Outlook |
63 | $res = $db->query(<<<ZZZZZZZZZZ |
64 | SELECT |
65 | DATE(t.deadline) as deadline, |
66 | t.start_date as date, |
67 | t.title as title, |
68 | t.id as id, |
69 | t.image_ids as image_ids |
70 | FROM termine t |
71 | WHERE |
72 | t.deadline IS NOT NULL |
73 | AND t.deadline > '{$this->in_two_weeks}' |
74 | AND t.should_promote != '0' |
75 | AND t.image_ids IS NOT NULL |
76 | AND t.image_ids != '[]' |
77 | AND t.on_off = '1' |
78 | ORDER BY deadline ASC |
79 | LIMIT 7 |
80 | ZZZZZZZZZZ); |
81 | // @phpstan-ignore-next-line |
82 | if ($res->num_rows > 0) { |
83 | $out .= "<hr/>"; |
84 | $out .= "<ul class='links'>"; |
85 | // @phpstan-ignore-next-line |
86 | while ($row = $res->fetch_assoc()) { |
87 | $out .= $this->getDeadlineHtml($row); |
88 | } |
89 | $out .= "</ul>"; |
90 | } |
91 | return $out; |
92 | } |
93 | |
94 | /** |
95 | * @param array<string, mixed> $row |
96 | */ |
97 | protected function getDeadlineHtml(array $row): string { |
98 | $code_href = $this->envUtils()->getCodeHref(); |
99 | |
100 | $id = $row['id']; |
101 | $deadline = $this->dateUtils()->compactDate($row['deadline']); |
102 | $date = $this->dateUtils()->compactDate($row['date']); |
103 | $title = $row['title']; |
104 | $urgency = 'full'; |
105 | if ($row['deadline'] <= $this->in_three_days) { |
106 | $urgency = 'empty'; |
107 | } elseif ($row['deadline'] <= $this->in_one_week) { |
108 | $urgency = 'mid'; |
109 | } |
110 | $image_ids = json_decode($row['image_ids'], true); |
111 | $image_id = count($image_ids ?? []) > 0 ? $image_ids[0] : null; |
112 | $icon_color = $image_id ? '_white' : ''; |
113 | $icon_basename = "termine_type_meldeschluss_{$urgency}{$icon_color}_20.svg"; |
114 | $icon = "{$code_href}assets/icns/{$icon_basename}"; |
115 | $icon_img = "<img src='{$icon}' alt='' class='link-icon'>"; |
116 | if ($image_id) { |
117 | $image = $this->imageUtils()->olzImage( |
118 | 'termine', |
119 | $id, |
120 | $image_id, |
121 | 128, |
122 | null, |
123 | ' class="noborder"' |
124 | ); |
125 | return <<<ZZZZZZZZZZ |
126 | <li class='flex deadline-image min-two-lines'> |
127 | <a href='{$code_href}termine/{$id}?von=startseite'> |
128 | <div class='overlay'> |
129 | {$icon_img} |
130 | <span class='date'>{$deadline}</span> |
131 | <span class='title'>Für {$title} vom {$date}</span> |
132 | </div> |
133 | <div class='blurry-image'>{$image}</div> |
134 | <div class='sharp-image'>{$image}</div> |
135 | </a> |
136 | </li> |
137 | ZZZZZZZZZZ; |
138 | } |
139 | return <<<ZZZZZZZZZZ |
140 | <li class='flex'> |
141 | {$icon_img} |
142 | <a href='{$code_href}termine/{$id}?von=startseite'> |
143 | <b>{$deadline}</b>: Für {$title} vom {$date} |
144 | </a> |
145 | </li> |
146 | ZZZZZZZZZZ; |
147 | } |
148 | } |