From 4a81288dfcd361c8e970108e0980b6107e4730b5 Mon Sep 17 00:00:00 2001
From: Felix Di Lenarda <dilenarda@tu-berlin.de>
Date: Mon, 25 Apr 2022 10:49:28 +0200
Subject: [PATCH] Refined 'specificdate'-trigger, so it works and triggers
 'todays'-date. #147

---
 .../lang/de/lifecycletrigger_specificdate.php |  1 +
 .../lang/en/lifecycletrigger_specificdate.php |  1 +
 trigger/specificdate/lib.php                  | 40 ++++++-------------
 3 files changed, 15 insertions(+), 27 deletions(-)

diff --git a/trigger/specificdate/lang/de/lifecycletrigger_specificdate.php b/trigger/specificdate/lang/de/lifecycletrigger_specificdate.php
index 7eab683..7fdc5c5 100644
--- a/trigger/specificdate/lang/de/lifecycletrigger_specificdate.php
+++ b/trigger/specificdate/lang/de/lifecycletrigger_specificdate.php
@@ -27,5 +27,6 @@ $string['privacy:metadata'] = 'Dieses Subplugin speichert keine persönlichen Da
 
 $string['dates'] = 'Daten, an denen der Workflow ausgeführt werden soll.';
 $string['dates_desc'] = 'Ein Datum pro Zeile in dem Format Tag.Monat';
+$string['dates_desc_help'] = 'Ein Datum pro Zeile z.B.: 04.08 , für den 4. August. Wenn Sie das heutige Datum wählen wird es getriggert';
 $string['timelastrun'] = 'Datum, an dem der Trigger zuletzt ausgeführt wurde.';
 $string['dates_not_parseable'] = 'Daten müssen in dem Format Tag.Monat sein!';
diff --git a/trigger/specificdate/lang/en/lifecycletrigger_specificdate.php b/trigger/specificdate/lang/en/lifecycletrigger_specificdate.php
index 9b7113e..574ebe8 100644
--- a/trigger/specificdate/lang/en/lifecycletrigger_specificdate.php
+++ b/trigger/specificdate/lang/en/lifecycletrigger_specificdate.php
@@ -27,5 +27,6 @@ $string['privacy:metadata'] = 'This subplugin does not store any personal data.'
 
 $string['dates'] = 'Dates at which the workflow should run.';
 $string['dates_desc'] = 'Write one date per line with the format Day.Month';
+$string['dates_desc_help'] = 'One date per line for example: 04.08 , for 4th of august. If you are putting todays date it will be triggered';
 $string['timelastrun'] = 'Date when the trigger last run.';
 $string['dates_not_parseable'] = 'Dates must be of the format Day.Month';
diff --git a/trigger/specificdate/lib.php b/trigger/specificdate/lib.php
index 8f8d82a..d0e7769 100644
--- a/trigger/specificdate/lib.php
+++ b/trigger/specificdate/lib.php
@@ -64,38 +64,24 @@ class specificdate extends base_automatic {
      */
     public function get_course_recordset_where($triggerid) {
         $settings = settings_manager::get_settings($triggerid, settings_type::TRIGGER);
-        $lastrun = getdate($settings['timelastrun']);
         $datesraw = $settings['dates'];
         $dates = $this->parse_dates($datesraw);
+        $lastrun = getdate($settings['timelastrun']);
+        $current = time();
+        $today = getdate($current);
 
-        $triggerat = array();
-
-        foreach ($dates as $dateparts) {
-            if ($dateparts['mon'] > $lastrun['mon']) {
-                $date = new DateTime($lastrun['year'].'-'.$dateparts['mon'].'-'.$dateparts['day']);
-            } else if ($dateparts['mon'] === $lastrun['mon']) {
-                if ($dateparts['day'] > $lastrun['day']) {
-                    $date = new DateTime($lastrun['year'].'-'.$dateparts['mon'].'-'.$dateparts['day']);
+        foreach ($dates as $date) {
+            // We want to trigger only if the $date is today.
+            if ($date['mon'] == $today['mon'] && $date['day'] == $today['mday']) {
+                // Now only make sure if $lastrun was today -> don't trigger.
+                if ($lastrun['yday'] == $today['yday'] && $lastrun['year'] == $today['year']) {
+                    continue;
                 } else {
-                    $date = new DateTime(($lastrun['year'] + 1) .'-'.$dateparts['mon'].'-'.$dateparts['day']);
+                    $settings['timelastrun'] = $current;
+                    $trigger = trigger_manager::get_instance($triggerid);
+                    settings_manager::save_settings($triggerid, settings_type::TRIGGER, $trigger->subpluginname, $settings);
+                    return array('true', array());
                 }
-            } else {
-                $date = new DateTime(($lastrun['year'] + 1) .'-'.$dateparts['mon'].'-'.$dateparts['day']);
-            }
-
-            $triggerat[] = $date->getTimestamp();
-        }
-
-        sort($triggerat);
-
-        $current = time();
-
-        foreach ($triggerat as $timestamp) {
-            if ($timestamp < $current) {
-                $settings['timelastrun'] = $current;
-                $trigger = trigger_manager::get_instance($triggerid);
-                settings_manager::save_settings($triggerid, settings_type::TRIGGER, $trigger->subpluginname, $settings);
-                return array('true', array());
             }
         }
         return array('false', array());
-- 
GitLab