Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
21 / 21
100.00% covered (success)
100.00%
1 / 1
CRAP
100.00% covered (success)
100.00%
1 / 1
AnniversaryUtils
100.00% covered (success)
100.00%
21 / 21
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
1 / 1
 getElevationStats
100.00% covered (success)
100.00%
21 / 21
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2
3namespace Olz\Anniversary\Utils;
4
5use Olz\Utils\WithUtilsTrait;
6
7/**
8 * @phpstan-type OlzElevationStats array{
9 *   completion: float,
10 *   diffMeters: float,
11 *   diffDays: float,
12 *   diffKind: 'ahead'|'behind',
13 * }
14 */
15class AnniversaryUtils {
16    use WithUtilsTrait;
17
18    /** @return OlzElevationStats */
19    public function getElevationStats() {
20        $db = $this->dbUtils()->getDb();
21
22        $is_before_2026 = intval($this->dateUtils()->getCurrentDateInFormat('Y')) < 2026;
23        $goal_meters_per_day = 4478;
24        $year_start_secs = 1735689600; // 2025-01-01 00:00:00
25        $now_secs = $is_before_2026 ? $year_start_secs : strtotime($this->dateUtils()->getIsoNow());
26        $goal_elevation = ($now_secs - $year_start_secs) * $goal_meters_per_day / 86400;
27        $sql = <<<'ZZZZZZZZZZ'
28                SELECT SUM(elevation_meters) as sum_elevation
29                FROM anniversary_runs
30                WHERE
31                    run_at >= '2026-01-01'
32                    AND run_at <= '2026-12-31'
33            ZZZZZZZZZZ;
34        $res_sum_elevation = $db->query($sql);
35        $this->generalUtils()->checkNotBool($res_sum_elevation, "Query error: {$sql}");
36        $sum_elevation = floatval($res_sum_elevation->fetch_assoc()['sum_elevation'] ?? 0);
37
38        $completion = $sum_elevation / ($goal_meters_per_day * 356);
39        $diff_meters = $sum_elevation - $goal_elevation;
40        $diff_days = $diff_meters / $goal_meters_per_day;
41        $diff_kind = $diff_days >= 0 ? 'ahead' : 'behind';
42
43        return [
44            'completion' => $completion,
45            'diffMeters' => $diff_meters,
46            'diffDays' => $diff_days,
47            'diffKind' => $diff_kind,
48        ];
49    }
50}