| 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 | } |