Recursively check recurring date ranges (#185)

This commit is contained in:
Dmitrii Metelkin 2018-08-15 12:48:38 +10:00 committed by Mark Nelson
parent d0bca80d35
commit 4ac9615514

View file

@ -133,7 +133,6 @@ class element extends \mod_customcert\element {
$mform->setType('numranges', PARAM_INT); $mform->setType('numranges', PARAM_INT);
for ($i = 0; $i < $maxranges; $i++) { for ($i = 0; $i < $maxranges; $i++) {
$datarange = array();
$mform->addElement('static', $mform->addElement('static',
$this->build_element_name('group', $i), $this->build_element_name('group', $i),
@ -433,15 +432,18 @@ class element extends \mod_customcert\element {
$outputstring = ''; $outputstring = '';
foreach ($this->get_decoded_data()->dateranges as $key => $range) { foreach ($this->get_decoded_data()->dateranges as $key => $range) {
if (!empty($range->recurring)) { if ($this->is_date_in_range($date, $range)) {
$range = $this->build_recurring_daterange($range);
}
if ($date >= $range->startdate && $date <= $range->enddate) {
$rangematched = $range; $rangematched = $range;
$outputstring = $range->datestring; $outputstring = $range->datestring;
break; break;
} }
if (!empty($range->recurring)) {
if ($rangematched = $this->get_matched_recurring_range($date, $range)) {
$outputstring = $rangematched->datestring;
break;
}
}
} }
if (empty($outputstring) && !empty($this->get_decoded_data()->fallbackstring)) { if (empty($outputstring) && !empty($this->get_decoded_data()->fallbackstring)) {
@ -452,24 +454,39 @@ class element extends \mod_customcert\element {
} }
/** /**
* Build a recurring daterange by updating start and end dates if required. * Check if the provided date is in the date range.
* *
* @param int $date Unix timestamp date to check.
* @param \stdClass $range Range object. * @param \stdClass $range Range object.
* *
* @return \stdClass * @return bool
*/ */
protected function build_recurring_daterange(\stdClass $range) { protected function is_date_in_range($date, \stdClass $range) {
if ($range->enddate < time()) { return ($date >= $range->startdate && $date <= $range->enddate);
}
/**
* Get recurring date range matched provided date.
*
* @param int $date Unix timestamp date to check.
* @param \stdClass $range Range object.
*
* @return \stdClass || null
*/
protected function get_matched_recurring_range($date, \stdClass $range) {
while ($range->enddate < time()) {
$startyear = date('Y', $range->startdate) + 1; // Max recurring period is 12 months. $startyear = date('Y', $range->startdate) + 1; // Max recurring period is 12 months.
$endyear = date('Y', $range->enddate) + 1; // Max recurring period is 12 months. $endyear = date('Y', $range->enddate) + 1; // Max recurring period is 12 months.
$range->startdate = strtotime(date('d.m.', $range->startdate) . $startyear); $range->startdate = strtotime(date('d.m.', $range->startdate) . $startyear);
$range->enddate = strtotime(date('d.m.', $range->enddate) . $endyear); $range->enddate = strtotime(date('d.m.', $range->enddate) . $endyear);
$range = $this->build_recurring_daterange($range); if ($this->is_date_in_range($date, $range)) {
return $range;
}
} }
return $range; return null;
} }
/** /**