Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 47
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 / 47
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 / 15
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_done = number_format($stats['completion'] * 100, 1, ".", "'")."%";
53        $diff_verb = $stats['diffMeters'] >= 0 ? 'sind' : 'liegen';
54        $diff_particle = $stats['diffMeters'] >= 0 ? 'voraus' : 'zurück';
55        $pretty_diff_meters = number_format(abs($stats['diffMeters']), 0, ".", "'")."m";
56        $pretty_diff_days = number_format(abs($stats['diffDays']), 1, ".", "'")." Tage";
57        return <<<ZZZZZZZZZZ
58            <div class='title'>🏃 Höhenmeter-Challenge ⛰️</div>
59            <div>
60                Ziel zu <span class='done-text'>{$pretty_done}</span> erreicht.
61
62                Wir {$diff_verb}
63                <span class='diff-meters {$stats['diffKind']}'>
64                    {$pretty_diff_meters}
65                </span>
66                bzw.
67                <span class='diff-days {$stats['diffKind']}'>
68                    {$pretty_diff_days}
69                </span>
70                {$diff_particle}.
71            </div>
72            ZZZZZZZZZZ;
73    }
74
75    public function getZielsprintHtml(bool $is_before_2026): string {
76        $component = new OlzZielsprint();
77        $ranking = $component->getRanking();
78        $out = "<div class='title'>🏁 Zielsprint-Challenge 🏃</div><table>";
79        $medals = [1 => '🥇', 2 => '🥈', 3 => '🥉'];
80        for ($rang = 1; $rang <= 3; $rang++) {
81            $entry = $ranking[$rang - 1] ?? [];
82            $person_name = $is_before_2026 ? '?' : $entry['person_name'] ?? '?';
83            $points = $is_before_2026 ? '0' : $entry['points'] ?? '0';
84            $out .= <<<ZZZZZZZZZZ
85                <tr>
86                    <td>{$medals[$rang]}</td>
87                    <td>{$person_name}</td>
88                    <td>{$points}</td>
89                </tr>
90                ZZZZZZZZZZ;
91        }
92        $out .= "</table>";
93        return $out;
94    }
95}