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) * 20;
30        $done_hei = \intval($stats['completion'] * 80);
31        $rocket_hei = \intval($stats['completion'] * 80) - 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='done-marker'></div>
39                <div class='rocket test-flaky' style='bottom: {$rocket_hei}px;'>{$rocket}</div>
40                <div class='diff-range'></div>
41                <div class='diff-bar {$stats['diffKind']}' style='height: {$diff_hei}px;'></div>
42                <div class='diff-marker'></div>
43                <div class='elevation'>{$this->getElevationHtml($stats)}</div>
44                <div class='zielsprint'>{$this->getZielsprintHtml($is_before_2026)}</div>
45            </a>
46            ZZZZZZZZZZ;
47    }
48
49    /**
50     * @param OlzElevationStats $stats
51     */
52    public function getElevationHtml(array $stats): string {
53        $pretty_sum_meters = number_format($stats['sumMeters'], 0, ".", "'")."m";
54        $pretty_done = number_format($stats['completion'] * 100, 1, ".", "'")."%";
55        $diff_verb = $stats['diffMeters'] >= 0 ? 'sind' : 'liegen';
56        $diff_particle = $stats['diffMeters'] >= 0 ? 'voraus' : 'zurück';
57        $pretty_diff_meters = number_format(abs($stats['diffMeters']), 0, ".", "'")."m";
58        $pretty_diff_days = number_format(abs($stats['diffDays']), 1, ".", "'")." Tage";
59        return <<<ZZZZZZZZZZ
60            <div class='title'>🏃 Höhenmeter-Challenge ⛰️</div>
61            <div>
62                Ziel mit
63                <span class='done-text'>
64                    {$pretty_sum_meters}
65                </span>
66                zu
67                <span class='done-text'>
68                    {$pretty_done}
69                </span>
70                erreicht.
71
72                Wir {$diff_verb}
73                <span class='diff-meters {$stats['diffKind']}'>
74                    {$pretty_diff_meters}
75                </span>
76                bzw.
77                <span class='diff-days {$stats['diffKind']}'>
78                    {$pretty_diff_days}
79                </span>
80                {$diff_particle}.
81            </div>
82            ZZZZZZZZZZ;
83    }
84
85    public function getZielsprintHtml(bool $is_before_2026): string {
86        $component = new OlzZielsprint();
87        $ranking = $component->getRanking();
88        $out = "<div class='title'>🏁 Zielsprint-Challenge 🏃</div><table>";
89        $medals = [1 => '🥇', 2 => '🥈', 3 => '🥉'];
90        for ($rang = 1; $rang <= 3; $rang++) {
91            $entry = $ranking[$rang - 1] ?? [];
92            $person_name = $is_before_2026 ? '?' : $entry['person_name'] ?? '?';
93            $points = $is_before_2026 ? '0' : $entry['points'] ?? '0';
94            $out .= <<<ZZZZZZZZZZ
95                <tr>
96                    <td>{$medals[$rang]}</td>
97                    <td>{$person_name}</td>
98                    <td>{$points}</td>
99                </tr>
100                ZZZZZZZZZZ;
101        }
102        $out .= "</table>";
103        return $out;
104    }
105}