Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
n/a
0 / 0
n/a
0 / 0
CRAP
n/a
0 / 0
ExchangeCapacityscope
n/a
0 / 0
n/a
0 / 0
0
n/a
0 / 0
1<?php
2
3namespace BO\Zmsdb\Query;
4
5class ExchangeCapacityscope extends Base
6{
7    /**
8     * @var String TABLE mysql table reference
9     */
10    const TABLE = 'slot_process';
11
12    /**
13     * Time-series metrics for one scope: booked/planned capacity per day, all dates.
14     */
15    const QUERY_CAPACITY_METRICS_BY_DAY_ALL_DATES = '
16    SELECT
17        `scopeID` as subjectid,
18        CONCAT(year, "-", LPAD(month, 2, 0), "-", LPAD(day, 2, 0)) as date,
19        SUM(slotcount),
20        SUM(intern),
21        SUM(slotbookedminutes),
22        SUM(slotplannedminutes),
23        SUM(slotcount_public),
24        SUM(public),
25        SUM(slotbookedminutes_public),
26        SUM(slotplannedminutes_public)
27    FROM (
28        SELECT s.scopeID, s.year, s.month, s.day, s.intern, s.public, s.slotTimeInMinutes,
29               COUNT(sp.slotID) as slotcount,
30               SUM(CASE WHEN ac.accesslevel = "public" THEN 1 ELSE 0 END) as slotcount_public,
31               (COALESCE(s.intern, 0) * COALESCE(s.slotTimeInMinutes, 0)) as slotplannedminutes,
32               (COUNT(sp.slotID) * COALESCE(s.slotTimeInMinutes, 0)) as slotbookedminutes,
33               (COALESCE(s.public, 0) * COALESCE(s.slotTimeInMinutes, 0)) as slotplannedminutes_public,
34               (SUM(CASE WHEN ac.accesslevel = "public" THEN 1 ELSE 0 END) * COALESCE(s.slotTimeInMinutes, 0)) as slotbookedminutes_public
35        FROM slot AS s
36          LEFT JOIN slot_process as sp USING(slotID)
37          LEFT JOIN buerger b ON sp.processID = b.BuergerID
38          LEFT JOIN apiclient ac ON b.apiClientID = ac.apiClientID
39        WHERE s.`scopeID` = :scopeid AND s.status = "free"
40        GROUP BY s.slotID
41        ) AS innerquery
42    GROUP BY year, month, day
43    ORDER BY date ASC
44    ';
45
46    /**
47     * Time-series metrics for one scope: booked/planned capacity per day, within a date range.
48     */
49    const QUERY_CAPACITY_METRICS_BY_DAY_IN_DATE_RANGE = '
50    SELECT
51        `scopeID` as subjectid,
52        CONCAT(year, "-", LPAD(month, 2, 0), "-", LPAD(day, 2, 0)) as date,
53        SUM(slotcount),
54        SUM(intern),
55        SUM(slotbookedminutes),
56        SUM(slotplannedminutes),
57        SUM(slotcount_public),
58        SUM(public),
59        SUM(slotbookedminutes_public),
60        SUM(slotplannedminutes_public)
61    FROM (
62        SELECT s.scopeID, s.year, s.month, s.day, s.intern, s.public, s.slotTimeInMinutes,
63               COUNT(sp.slotID) as slotcount,
64               SUM(CASE WHEN ac.accesslevel = "public" THEN 1 ELSE 0 END) as slotcount_public,
65               (COALESCE(s.intern, 0) * COALESCE(s.slotTimeInMinutes, 0)) as slotplannedminutes,
66               (COUNT(sp.slotID) * COALESCE(s.slotTimeInMinutes, 0)) as slotbookedminutes,
67               (COALESCE(s.public, 0) * COALESCE(s.slotTimeInMinutes, 0)) as slotplannedminutes_public,
68               (SUM(CASE WHEN ac.accesslevel = "public" THEN 1 ELSE 0 END) * COALESCE(s.slotTimeInMinutes, 0)) as slotbookedminutes_public
69        FROM slot AS s
70          LEFT JOIN slot_process as sp USING(slotID)
71          LEFT JOIN buerger b ON sp.processID = b.BuergerID
72          LEFT JOIN apiclient ac ON b.apiClientID = ac.apiClientID
73        WHERE s.`scopeID` = :scopeid AND s.status = "free"
74          AND CONCAT(s.year, "-", LPAD(s.month, 2, 0), "-", LPAD(s.day, 2, 0))
75              BETWEEN :datestart AND :dateend
76        GROUP BY s.slotID
77        ) AS innerquery
78    GROUP BY year, month, day
79    ORDER BY date ASC
80    ';
81
82    /**
83     * Time-series metrics for one scope: booked/planned capacity per clock hour, within a date range.
84     */
85    const QUERY_CAPACITY_METRICS_BY_HOUR_IN_DATE_RANGE = '
86    SELECT
87        `scopeID` as subjectid,
88        CONCAT(year, "-", LPAD(month, 2, 0), "-", LPAD(day, 2, 0), " ", LPAD(HOUR(`time`), 2, "0"), ":00") as date,
89        SUM(slotcount),
90        SUM(intern),
91        SUM(slotbookedminutes),
92        SUM(slotplannedminutes),
93        SUM(slotcount_public),
94        SUM(public),
95        SUM(slotbookedminutes_public),
96        SUM(slotplannedminutes_public)
97    FROM (
98        SELECT s.scopeID, s.year, s.month, s.day, s.time, s.intern, s.public, s.slotTimeInMinutes,
99               COUNT(sp.slotID) as slotcount,
100               SUM(CASE WHEN ac.accesslevel = "public" THEN 1 ELSE 0 END) as slotcount_public,
101               (COALESCE(s.intern, 0) * COALESCE(s.slotTimeInMinutes, 0)) as slotplannedminutes,
102               (COUNT(sp.slotID) * COALESCE(s.slotTimeInMinutes, 0)) as slotbookedminutes,
103               (COALESCE(s.public, 0) * COALESCE(s.slotTimeInMinutes, 0)) as slotplannedminutes_public,
104               (SUM(CASE WHEN ac.accesslevel = "public" THEN 1 ELSE 0 END) * COALESCE(s.slotTimeInMinutes, 0)) as slotbookedminutes_public
105        FROM slot AS s
106          LEFT JOIN slot_process as sp USING(slotID)
107          LEFT JOIN buerger b ON sp.processID = b.BuergerID
108          LEFT JOIN apiclient ac ON b.apiClientID = ac.apiClientID
109        WHERE s.`scopeID` = :scopeid AND s.status = "free"
110          AND CONCAT(s.year, "-", LPAD(s.month, 2, 0), "-", LPAD(s.day, 2, 0))
111              BETWEEN :datestart AND :dateend
112        GROUP BY s.slotID
113        ) AS innerquery
114    GROUP BY year, month, day, HOUR(`time`)
115    ORDER BY date ASC
116    ';
117
118    /**
119     * Scope picker list: one row per scope with min/max slot dates and description (no capacity numbers).
120     */
121    const QUERY_CAPACITY_REPORT_SCOPE_SUBJECT_LIST = '
122      SELECT
123          scope.`StandortID` as subject,
124          MIN(CONCAT(s.year, "-", LPAD(s.month, 2, 0), "-", LPAD(s.day, 2, 0))) AS periodstart,
125          MAX(CONCAT(s.year, "-", LPAD(s.month, 2, 0), "-", LPAD(s.day, 2, 0))) AS periodend,
126          CONCAT(scope.`Bezeichnung`, " ", scope.`standortinfozeile`) AS description
127      FROM ' . Scope::TABLE . ' AS scope
128        INNER JOIN slot AS s ON s.scopeID = scope.StandortID
129      GROUP BY scope.`StandortID`
130      ORDER BY description ASC
131    ';
132}