| Línea 16... |
Línea 16... |
| 16 |
|
16 |
|
| Línea 17... |
Línea 17... |
| 17 |
declare(strict_types=1);
|
17 |
declare(strict_types=1);
|
| Línea 18... |
Línea 18... |
| 18 |
|
18 |
|
| 19 |
namespace core_reportbuilder\local\filters;
|
19 |
namespace core_reportbuilder\local\filters;
|
| 20 |
|
- |
|
| 21 |
use DateTimeImmutable;
|
20 |
|
| - |
|
21 |
use core\{clock, di};
|
| Línea 22... |
Línea 22... |
| 22 |
use lang_string;
|
22 |
use core\lang_string;
|
| 23 |
use MoodleQuickForm;
|
23 |
use core_reportbuilder\local\helpers\database;
|
| 24 |
use core_reportbuilder\local\helpers\database;
|
24 |
use MoodleQuickForm;
|
| 25 |
|
25 |
|
| Línea 68... |
Línea 68... |
| 68 |
public const DATE_BEFORE = 9;
|
68 |
public const DATE_BEFORE = 9;
|
| Línea 69... |
Línea 69... |
| 69 |
|
69 |
|
| 70 |
/** @var int Date after [X relative date unit(s)] */
|
70 |
/** @var int Date after [X relative date unit(s)] */
|
| Línea -... |
Línea 71... |
| - |
|
71 |
public const DATE_AFTER = 10;
|
| - |
|
72 |
|
| - |
|
73 |
/** @var int Relative date unit for a minute */
|
| 71 |
public const DATE_AFTER = 10;
|
74 |
public const DATE_UNIT_MINUTE = 5;
|
| 72 |
|
75 |
|
| Línea 73... |
Línea 76... |
| 73 |
/** @var int Relative date unit for an hour */
|
76 |
/** @var int Relative date unit for an hour */
|
| 74 |
public const DATE_UNIT_HOUR = 0;
|
77 |
public const DATE_UNIT_HOUR = 0;
|
| Línea 109... |
Línea 112... |
| 109 |
}
|
112 |
}
|
| Línea 110... |
Línea 113... |
| 110 |
|
113 |
|
| 111 |
/**
|
114 |
/**
|
| 112 |
* Setup form
|
115 |
* Setup form
|
| - |
|
116 |
*
|
| - |
|
117 |
* Note that we cannot support float inputs in this filter currently, because decimals are not supported when calculating
|
| - |
|
118 |
* relative timeframes according to {@link https://www.php.net/manual/en/datetime.formats.php}
|
| 113 |
*
|
119 |
*
|
| 114 |
* @param MoodleQuickForm $mform
|
120 |
* @param MoodleQuickForm $mform
|
| 115 |
*/
|
121 |
*/
|
| 116 |
public function setup_form(MoodleQuickForm $mform): void {
|
122 |
public function setup_form(MoodleQuickForm $mform): void {
|
| 117 |
// Operator selector.
|
123 |
// Operator selector.
|
| Línea 132... |
Línea 138... |
| 132 |
$mform->hideIf("{$this->name}_value", "{$this->name}_operator", 'in', array_merge($typesnounit, [self::DATE_CURRENT]));
|
138 |
$mform->hideIf("{$this->name}_value", "{$this->name}_operator", 'in', array_merge($typesnounit, [self::DATE_CURRENT]));
|
| Línea 133... |
Línea 139... |
| 133 |
|
139 |
|
| 134 |
// Unit selector for last and next operators.
|
140 |
// Unit selector for last and next operators.
|
| 135 |
$unitlabel = get_string('filterfieldunit', 'core_reportbuilder', $this->get_header());
|
141 |
$unitlabel = get_string('filterfieldunit', 'core_reportbuilder', $this->get_header());
|
| - |
|
142 |
$units = [
|
| 136 |
$units = [
|
143 |
self::DATE_UNIT_MINUTE => get_string('filterdateminutes', 'core_reportbuilder'),
|
| 137 |
self::DATE_UNIT_HOUR => get_string('filterdatehours', 'core_reportbuilder'),
|
144 |
self::DATE_UNIT_HOUR => get_string('filterdatehours', 'core_reportbuilder'),
|
| 138 |
self::DATE_UNIT_DAY => get_string('filterdatedays', 'core_reportbuilder'),
|
145 |
self::DATE_UNIT_DAY => get_string('filterdatedays', 'core_reportbuilder'),
|
| 139 |
self::DATE_UNIT_WEEK => get_string('filterdateweeks', 'core_reportbuilder'),
|
146 |
self::DATE_UNIT_WEEK => get_string('filterdateweeks', 'core_reportbuilder'),
|
| 140 |
self::DATE_UNIT_MONTH => get_string('filterdatemonths', 'core_reportbuilder'),
|
147 |
self::DATE_UNIT_MONTH => get_string('filterdatemonths', 'core_reportbuilder'),
|
| Línea 149... |
Línea 156... |
| 149 |
// Add operator/value/unit group.
|
156 |
// Add operator/value/unit group.
|
| 150 |
$mform->addGroup($elements, "{$this->name}_group", $this->get_header(), '', false)
|
157 |
$mform->addGroup($elements, "{$this->name}_group", $this->get_header(), '', false)
|
| 151 |
->setHiddenLabel(true);
|
158 |
->setHiddenLabel(true);
|
| Línea 152... |
Línea 159... |
| 152 |
|
159 |
|
| 153 |
// Date selectors for range operator.
|
160 |
// Date selectors for range operator.
|
| 154 |
$mform->addElement('date_selector', "{$this->name}_from", get_string('filterdatefrom', 'core_reportbuilder'),
|
161 |
$mform->addElement('date_selector', "{$this->name}_from",
|
| 155 |
['optional' => true]);
|
162 |
get_string('filterfieldfrom', 'core_reportbuilder', $this->get_header()), ['optional' => true]);
|
| 156 |
$mform->setType("{$this->name}_from", PARAM_INT);
|
163 |
$mform->setType("{$this->name}_from", PARAM_INT);
|
| 157 |
$mform->setDefault("{$this->name}_from", 0);
|
164 |
$mform->setDefault("{$this->name}_from", 0);
|
| Línea 158... |
Línea 165... |
| 158 |
$mform->hideIf("{$this->name}_from", "{$this->name}_operator", 'neq', self::DATE_RANGE);
|
165 |
$mform->hideIf("{$this->name}_from", "{$this->name}_operator", 'neq', self::DATE_RANGE);
|
| 159 |
|
166 |
|
| 160 |
$mform->addElement('date_selector', "{$this->name}_to", get_string('filterdateto', 'core_reportbuilder'),
|
167 |
$mform->addElement('date_selector', "{$this->name}_to",
|
| 161 |
['optional' => true]);
|
168 |
get_string('filterfieldto', 'core_reportbuilder', $this->get_header()), ['optional' => true]);
|
| 162 |
$mform->setType("{$this->name}_to", PARAM_INT);
|
169 |
$mform->setType("{$this->name}_to", PARAM_INT);
|
| 163 |
$mform->setDefault("{$this->name}_to", 0);
|
170 |
$mform->setDefault("{$this->name}_to", 0);
|
| Línea 241... |
Línea 248... |
| 241 |
|
248 |
|
| 242 |
break;
|
249 |
break;
|
| 243 |
case self::DATE_PAST:
|
250 |
case self::DATE_PAST:
|
| 244 |
$param = database::generate_param_name();
|
251 |
$param = database::generate_param_name();
|
| 245 |
$sql = "{$fieldsql} < :{$param}";
|
252 |
$sql = "{$fieldsql} < :{$param}";
|
| 246 |
$params[$param] = time();
|
253 |
$params[$param] = di::get(clock::class)->time();
|
| 247 |
break;
|
254 |
break;
|
| 248 |
case self::DATE_FUTURE:
|
255 |
case self::DATE_FUTURE:
|
| 249 |
$param = database::generate_param_name();
|
256 |
$param = database::generate_param_name();
|
| 250 |
$sql = "{$fieldsql} > :{$param}";
|
257 |
$sql = "{$fieldsql} > :{$param}";
|
| 251 |
$params[$param] = time();
|
258 |
$params[$param] = di::get(clock::class)->time();
|
| 252 |
break;
|
259 |
break;
|
| 253 |
default:
|
260 |
default:
|
| 254 |
// Invalid or inactive filter.
|
261 |
// Invalid or inactive filter.
|
| 255 |
return ['', []];
|
262 |
return ['', []];
|
| Línea 266... |
Línea 273... |
| 266 |
* @param int $dateunit One of the ::DATE_UNIT_* constants
|
273 |
* @param int $dateunit One of the ::DATE_UNIT_* constants
|
| 267 |
* @return int[] Timestamps representing the start/end of timeframe
|
274 |
* @return int[] Timestamps representing the start/end of timeframe
|
| 268 |
*/
|
275 |
*/
|
| 269 |
private static function get_relative_timeframe(int $operator, int $dateunitvalue, int $dateunit): array {
|
276 |
private static function get_relative_timeframe(int $operator, int $dateunitvalue, int $dateunit): array {
|
| 270 |
// Initialise start/end time to now.
|
277 |
// Initialise start/end time to now.
|
| 271 |
$datestart = $dateend = new DateTimeImmutable();
|
278 |
$datestart = $dateend = di::get(clock::class)->now();
|
| Línea 272... |
Línea 279... |
| 272 |
|
279 |
|
| - |
|
280 |
switch ($dateunit) {
|
| - |
|
281 |
case self::DATE_UNIT_MINUTE:
|
| - |
|
282 |
if ($operator === self::DATE_CURRENT) {
|
| - |
|
283 |
$hour = (int) $datestart->format('G');
|
| - |
|
284 |
$minute = (int) $datestart->format('i');
|
| - |
|
285 |
$datestart = $datestart->setTime($hour, $minute);
|
| - |
|
286 |
$dateend = $dateend->setTime($hour, $minute, 59);
|
| - |
|
287 |
} else if ($operator === self::DATE_LAST) {
|
| - |
|
288 |
$datestart = $datestart->modify("-{$dateunitvalue} minute");
|
| - |
|
289 |
} else if ($operator === self::DATE_NEXT) {
|
| - |
|
290 |
$dateend = $dateend->modify("+{$dateunitvalue} minute");
|
| - |
|
291 |
}
|
| 273 |
switch ($dateunit) {
|
292 |
break;
|
| 274 |
case self::DATE_UNIT_HOUR:
|
293 |
case self::DATE_UNIT_HOUR:
|
| 275 |
if ($operator === self::DATE_CURRENT) {
|
294 |
if ($operator === self::DATE_CURRENT) {
|
| 276 |
$hour = (int) $datestart->format('G');
|
295 |
$hour = (int) $datestart->format('G');
|
| 277 |
$datestart = $datestart->setTime($hour, 0);
|
296 |
$datestart = $datestart->setTime($hour, 0);
|