diff --git a/lang/en/reportbuilder.php b/lang/en/reportbuilder.php index 2ba2d394d87..e8fafff1d20 100644 --- a/lang/en/reportbuilder.php +++ b/lang/en/reportbuilder.php @@ -122,6 +122,7 @@ $string['errorsourceinvalid'] = 'Could not find valid report source'; $string['errorsourceunavailable'] = 'Report source is not available'; $string['filteradded'] = 'Added filter \'{$a}\''; $string['filtercontains'] = 'Contains'; +$string['filterdateafter'] = 'After'; $string['filterdatebefore'] = 'Before'; $string['filterdatecurrent'] = 'Current'; $string['filterdatedays'] = 'day(s)'; diff --git a/reportbuilder/classes/local/filters/date.php b/reportbuilder/classes/local/filters/date.php index f0330069dc4..56618679651 100644 --- a/reportbuilder/classes/local/filters/date.php +++ b/reportbuilder/classes/local/filters/date.php @@ -67,6 +67,9 @@ class date extends base { /** @var int Date before [X relative date unit(s)] */ public const DATE_BEFORE = 9; + /** @var int Date after [X relative date unit(s)] */ + public const DATE_AFTER = 10; + /** @var int Relative date unit for an hour */ public const DATE_UNIT_HOUR = 0; @@ -94,6 +97,7 @@ class date extends base { self::DATE_EMPTY => new lang_string('filterisempty', 'core_reportbuilder'), self::DATE_RANGE => new lang_string('filterrange', 'core_reportbuilder'), self::DATE_BEFORE => new lang_string('filterdatebefore', 'core_reportbuilder'), + self::DATE_AFTER => new lang_string('filterdateafter', 'core_reportbuilder'), self::DATE_LAST => new lang_string('filterdatelast', 'core_reportbuilder'), self::DATE_CURRENT => new lang_string('filterdatecurrent', 'core_reportbuilder'), self::DATE_NEXT => new lang_string('filterdatenext', 'core_reportbuilder'), @@ -209,6 +213,13 @@ class date extends base { $sql = "{$fieldsql} < :{$param}"; $params[$param] = self::get_relative_timeframe(self::DATE_LAST, $dateunitvalue, $dateunit)[0]; break; + case self::DATE_AFTER: + $param = database::generate_param_name(); + + // We can use the end date of the "Next" operator as the start date here. + $sql = "{$fieldsql} > :{$param}"; + $params[$param] = self::get_relative_timeframe(self::DATE_NEXT, $dateunitvalue, $dateunit)[1]; + break; // Relative helper method can handle these three cases. case self::DATE_LAST: case self::DATE_CURRENT: diff --git a/reportbuilder/tests/local/filters/date_test.php b/reportbuilder/tests/local/filters/date_test.php index 42aff80f26f..9a9b40480ad 100644 --- a/reportbuilder/tests/local/filters/date_test.php +++ b/reportbuilder/tests/local/filters/date_test.php @@ -232,6 +232,17 @@ class date_test extends advanced_testcase { 'Before two months' => [date::DATE_BEFORE, 2, date::DATE_UNIT_MONTH, '-15 week'], 'Before two years' => [date::DATE_BEFORE, 2, date::DATE_UNIT_YEAR, '-30 month'], + 'After hour' => [date::DATE_AFTER, 1, date::DATE_UNIT_HOUR, '+90 minute'], + 'After day' => [date::DATE_AFTER, 1, date::DATE_UNIT_DAY, '+25 hour'], + 'After week' => [date::DATE_AFTER, 1, date::DATE_UNIT_WEEK, '+10 day'], + 'After month' => [date::DATE_AFTER, 1, date::DATE_UNIT_MONTH, '+7 week'], + 'After year' => [date::DATE_AFTER, 1, date::DATE_UNIT_YEAR, '+15 month'], + 'After two hours' => [date::DATE_AFTER, 2, date::DATE_UNIT_HOUR, '+150 minute'], + 'After two days' => [date::DATE_AFTER, 2, date::DATE_UNIT_DAY, '+50 hour'], + 'After two weeks' => [date::DATE_AFTER, 2, date::DATE_UNIT_WEEK, '+20 day'], + 'After two months' => [date::DATE_AFTER, 2, date::DATE_UNIT_MONTH, '+15 week'], + 'After two years' => [date::DATE_AFTER, 2, date::DATE_UNIT_YEAR, '+30 month'], + 'Last hour' => [date::DATE_LAST, 1, date::DATE_UNIT_HOUR, '-30 minute'], 'Last day' => [date::DATE_LAST, 1, date::DATE_UNIT_DAY, '-6 hour'], 'Last week' => [date::DATE_LAST, 1, date::DATE_UNIT_WEEK, '-3 day'],