Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 85
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
OlzZielsprint
0.00% covered (danger)
0.00%
0 / 85
0.00% covered (danger)
0.00%
0 / 1
90
0.00% covered (danger)
0.00%
0 / 1
 getHtml
0.00% covered (danger)
0.00%
0 / 85
0.00% covered (danger)
0.00%
0 / 1
90
1<?php
2
3namespace Olz\Components\OlzZielsprint;
4
5use Olz\Components\Common\OlzComponent;
6use Olz\Components\Common\OlzEditableText\OlzEditableText;
7
8/** @extends OlzComponent<array<string, mixed>> */
9class OlzZielsprint extends OlzComponent {
10    public function getHtml(mixed $args): string {
11        $out = '';
12
13        $db = $this->dbUtils()->getDb();
14
15        $out .= "<h2>OLZ-Zielsprint-Challenge 2020</h2>";
16
17        // $out .= "<div style='color:rgb(180,0,0); font-weight:bold; text-align:center; font-size:14px;'>In Bearbeitung</div>";
18        $out .= OlzEditableText::render(['snippet_id' => 9]);
19
20        $sql = "
21            SELECT solv_uid, name, date
22            FROM solv_events
23            WHERE
24                date>'2020-03-13'
25                AND date<'2021-01-01'
26                AND kind='foot'
27            ORDER BY date ASC";
28        $res_events = $db->query($sql);
29        $points_by_person = [];
30        // @phpstan-ignore-next-line
31        while ($row_event = $res_events->fetch_assoc()) {
32            // $out .= "<h3>".json_encode($row_event)."</h3>";
33            $event_id = intval($row_event['solv_uid']);
34            $sql = "
35                SELECT person, finish_split
36                FROM solv_results
37                WHERE
38                    event='{$event_id}'
39                    AND finish_split > '0'
40                ORDER BY finish_split ASC";
41            $res_results = $db->query($sql);
42            $last_finish_split = null;
43            $last_actual_points = null;
44            // @phpstan-ignore-next-line
45            for ($points = $res_results->num_rows; $points > 0; $points--) {
46                // @phpstan-ignore-next-line
47                $row_results = $res_results->fetch_assoc();
48                // @phpstan-ignore-next-line
49                $person_id = intval($row_results['person']);
50                // @phpstan-ignore-next-line
51                $finish_split = $row_results['finish_split'];
52                $actual_points = ($last_finish_split === $finish_split)
53                    ? $last_actual_points
54                    : $points;
55                $person_points = $points_by_person[$person_id]
56                    ?? ['points' => 0, 'calculation' => []];
57                $points_by_person[$person_id]['points'] = $person_points['points'] + $actual_points;
58                $points_by_person[$person_id]['calculation'][] = [
59                    'event_name' => $row_event['name'],
60                    'points' => $actual_points,
61                    'finish_split' => $finish_split,
62                    // @phpstan-ignore-next-line
63                    'max_points' => $res_results->num_rows,
64                ];
65                $last_finish_split = $finish_split;
66                $last_actual_points = $actual_points;
67                // $out .= "<div>".json_encode($row_results)."</div>";
68            }
69        }
70        $ranking = [];
71        foreach ($points_by_person as $person_id => $points) {
72            $ranking[] = [
73                'person_id' => $person_id,
74                'points' => $points['points'],
75                'calculation' => $points['calculation'],
76            ];
77        }
78
79        // @phpstan-ignore-next-line
80        usort($ranking, function ($a, $b) {
81            return $b['points'] - $a['points'];
82        });
83
84        $out .= "<table>";
85        $out .= "<tr>";
86        $out .= "<th style='border-bottom: 1px solid black; text-align: right;'>Rang&nbsp;</th>";
87        $out .= "<th style='border-bottom: 1px solid black;'>Name</th>";
88        $out .= "<th style='border-bottom: 1px solid black; text-align: right;'>Punkte</th>";
89        $out .= "</tr>";
90        $last_points = null;
91        $last_actual_rank = 1;
92        for ($index = 0; $index < count($ranking); $index++) {
93            $rank = $index + 1;
94            $ranking_entry = $ranking[$index];
95            $person_id = intval($ranking_entry['person_id']);
96            $points = intval($ranking_entry['points']);
97            $actual_rank = ($last_points === $points)
98                ? $last_actual_rank
99                : $rank;
100            $sql = "
101                SELECT name
102                FROM solv_people
103                WHERE id='{$person_id}'";
104            $res_person = $db->query($sql);
105            // @phpstan-ignore-next-line
106            $row_person = $res_person->fetch_assoc();
107            // @phpstan-ignore-next-line
108            $person_name = $row_person['name'];
109            $calculation = "{$person_name}\\n---\\n";
110            foreach ($ranking_entry['calculation'] as $event_calculation) {
111                $event_name = $event_calculation['event_name'];
112                $event_points = $event_calculation['points'];
113                $event_max_points = $event_calculation['max_points'];
114                $finish_split = $event_calculation['finish_split'];
115                $finish_minutes = floor(intval($finish_split) / 60);
116                $finish_seconds = str_pad(strval(intval($finish_split) % 60), 2, '0');
117                $pretty_finish_split = "{$finish_minutes}:{$finish_seconds}";
118                $calculation .= "{$event_name}{$event_points} / {$event_max_points} ({$pretty_finish_split})\\n";
119            }
120            $bgcolor = ($index % 2 === 0) ? 'rgba(0,0,0,0.1)' : 'rgba(0,0,0,0)';
121            $out .= "<tr style='background-color:{$bgcolor}; cursor:pointer;' onclick='alert(&quot;{$calculation}&quot;)'>";
122            $out .= "<td style='text-align: right;'>{$actual_rank}.&nbsp;</td>";
123            $out .= "<td>{$person_name}</td>";
124            $out .= "<td style='text-align: right;'>{$points}</td>";
125            $out .= "</tr>";
126            $last_points = $points;
127            $last_actual_rank = $actual_rank;
128        }
129        $out .= "</table>";
130
131        return $out;
132    }
133}