Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 49
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
OlzAnniversaryTile
0.00% covered (danger)
0.00%
0 / 49
0.00% covered (danger)
0.00%
0 / 4
110
0.00% covered (danger)
0.00%
0 / 1
 getRelevance
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
6
 getHtml
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
2
 getElevationHtml
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 1
12
 getZielsprintHtml
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2
3// =============================================================================
4// Zeigt eine Startseiten-Kachel mit manuell eingegebenem Inhalt an.
5// =============================================================================
6
7namespace Olz\Startseite\Components\OlzAnniversaryTile;
8
9use Olz\Anniversary\Components\OlzAnniversaryRocket\OlzAnniversaryRocket;
10use Olz\Anniversary\Utils\AnniversaryUtils;
11use Olz\Components\OlzZielsprint\OlzZielsprint;
12use Olz\Entity\Users\User;
13use Olz\Startseite\Components\AbstractOlzTile\AbstractOlzTile;
14
15/**
16 * @phpstan-import-type OlzElevationStats from AnniversaryUtils
17 */
18class OlzAnniversaryTile extends AbstractOlzTile {
19    public function getRelevance(?User $user): float {
20        return ((bool) $user) ? 0.91 : 0.01;
21    }
22
23    public function getHtml(mixed $args): string {
24        $is_before_2026 = intval($this->dateUtils()->getCurrentDateInFormat('Y')) < 2026;
25        $code_href = $this->envUtils()->getCodeHref();
26
27        $stats = $this->anniversaryUtils()->getElevationStats();
28
29        $diff_hei = log10(abs($stats['diffDays']) + 1) * 40;
30        $done_hei = \intval($stats['completion'] * 160);
31        $rocket_hei = \intval($stats['completion'] * 160) - 30;
32        $rocket = OlzAnniversaryRocket::render();
33        return <<<ZZZZZZZZZZ
34            <a href='{$code_href}2026' class='anniversary-container'>
35                <h3 class='anniversary-h3'>🥳 20 Jahre OL Zimmerberg</h3>
36                <div class='done-range'></div>
37                <div class='done-bar' style='height: {$done_hei}px;'></div>
38                <div class='rocket test-flaky' style='bottom: {$rocket_hei}px;'>{$rocket}</div>
39                <div class='diff-range'></div>
40                <div class='diff-bar {$stats['diffKind']}' style='height: {$diff_hei}px;'></div>
41                <div class='diff-marker'></div>
42                <div class='elevation'>{$this->getElevationHtml($stats)}</div>
43                <div class='zielsprint'>{$this->getZielsprintHtml($is_before_2026)}</div>
44            </a>
45            ZZZZZZZZZZ;
46    }
47
48    /**
49     * @param OlzElevationStats $stats
50     */
51    public function getElevationHtml(array $stats): string {
52        $pretty_sum_meters = number_format($stats['sumMeters'], 0, ".", "'")."m";
53        $pretty_done = number_format($stats['completion'] * 100, 1, ".", "'")."%";
54        $diff_verb = $stats['diffMeters'] >= 0 ? 'sind' : 'liegen';
55        $diff_particle = $stats['diffMeters'] >= 0 ? 'voraus' : 'zurück';
56        $pretty_diff_meters = number_format(abs($stats['diffMeters']), 0, ".", "'")."m";
57        $pretty_diff_days = number_format(abs($stats['diffDays']), 1, ".", "'")." Tage";
58        return <<<ZZZZZZZZZZ
59            <div class='title'>🏃 Höhenmeter-Challenge ⛰️</div>
60            <div>
61                Ziel mit
62                <span class='done-text'>
63                    {$pretty_sum_meters}
64                </span>
65                zu
66                <span class='done-text'>
67                    {$pretty_done}
68                </span>
69                erreicht.
70
71                Wir {$diff_verb}
72                <span class='diff-meters {$stats['diffKind']}'>
73                    {$pretty_diff_meters}
74                </span>
75                bzw.
76                <span class='diff-days {$stats['diffKind']}'>
77                    {$pretty_diff_days}
78                </span>
79                {$diff_particle}.
80            </div>
81            ZZZZZZZZZZ;
82    }
83
84    public function getZielsprintHtml(bool $is_before_2026): string {
85        $component = new OlzZielsprint();
86        $ranking = $component->getRanking();
87        $out = "<div class='title'>🏁 Zielsprint-Challenge 🏃</div><table>";
88        $medals = [1 => '🥇', 2 => '🥈', 3 => '🥉'];
89        for ($rang = 1; $rang <= 3; $rang++) {
90            $entry = $ranking[$rang - 1] ?? [];
91            $person_name = $is_before_2026 ? '?' : $entry['person_name'] ?? '?';
92            $points = $is_before_2026 ? '0' : $entry['points'] ?? '0';
93            $out .= <<<ZZZZZZZZZZ
94                <tr>
95                    <td>{$medals[$rang]}</td>
96                    <td>{$person_name}</td>
97                    <td>{$points}</td>
98                </tr>
99                ZZZZZZZZZZ;
100        }
101        $out .= "</table>";
102        return $out;
103    }
104}