Skip to content
Snippets Groups Projects
Commit e04e5b8f authored by Peter Thienel's avatar Peter Thienel Committed by Jan-Hendrik Willms
Browse files

Resolve "iCal Export zeigt Terminserie an, die schon abgelaufen ist"

Closes #3953

Merge request studip/studip!2843
parent 06838d79
No related branches found
No related tags found
No related merge requests found
...@@ -55,7 +55,7 @@ class ICalendarExport ...@@ -55,7 +55,7 @@ class ICalendarExport
(`calendar_dates`.`begin` <= :end (`calendar_dates`.`begin` <= :end
AND `calendar_dates`.`end` >= :begin) AND `calendar_dates`.`end` >= :begin)
OR (`calendar_dates`.`repetition_type` != 'SINGLE' OR (`calendar_dates`.`repetition_type` != 'SINGLE'
AND (`calendar_dates`.`repetition_end` >= :end AND (`calendar_dates`.`repetition_end` >= :begin
OR `calendar_dates`.`repetition_end` = 0) OR `calendar_dates`.`repetition_end` = 0)
AND `calendar_dates`.`begin` < :end))", AND `calendar_dates`.`begin` < :end))",
[ [
...@@ -263,7 +263,7 @@ class ICalendarExport ...@@ -263,7 +263,7 @@ class ICalendarExport
case 'DUE': case 'DUE':
case 'RECURRENCE-ID': case 'RECURRENCE-ID':
if (array_key_exists('VALUE', $params)) { if (array_key_exists('VALUE', $params)) {
if ($params['VALUE'] == 'DATE') { if ($params['VALUE'] === 'DATE') {
$value = $this->_exportDate($value); $value = $this->_exportDate($value);
} else { } else {
$value = $this->_exportDateTime($value); $value = $this->_exportDateTime($value);
...@@ -276,12 +276,12 @@ class ICalendarExport ...@@ -276,12 +276,12 @@ class ICalendarExport
break; break;
case 'EXDATE': case 'EXDATE':
if (array_key_exists('VALUE', $params)) { if (array_key_exists('VALUE', $params) && $params['VALUE'] === 'DATE') {
$value = $this->exportExDate($value); $value = $this->exportExDate($value);
} else { } else {
$value = $this->exportExDateTime($value); $value = $this->exportExDateTime($value, $exdate_time);
$params_str = ';TZID=Europe/Berlin';
} }
$params_str = ';TZID=Europe/Berlin';
break; break;
// Integer fields // Integer fields
...@@ -315,7 +315,7 @@ class ICalendarExport ...@@ -315,7 +315,7 @@ class ICalendarExport
// Recursion fields // Recursion fields
case 'EXRULE': case 'EXRULE':
case 'RRULE': case 'RRULE':
if ($value['type'] !== 'SINGLE') { if ($value['type'] !== 'SINGLE' && $value['type'] !== '') {
$value = $this->_exportRecurrence($value); $value = $this->_exportRecurrence($value);
} }
break; break;
...@@ -404,7 +404,7 @@ class ICalendarExport ...@@ -404,7 +404,7 @@ class ICalendarExport
$value['offset'] = '-1'; $value['offset'] = '-1';
} }
if ($value['count']) { if ($value['count'] > 1) {
unset($value['expire']); unset($value['expire']);
} }
...@@ -415,7 +415,7 @@ class ICalendarExport ...@@ -415,7 +415,7 @@ class ICalendarExport
$rrule[] = 'FREQ=' . $r_value; $rrule[] = 'FREQ=' . $r_value;
break; break;
case 'expire': case 'expire':
if ($r_value < CalendarDate::NEVER_ENDING) if ($r_value)
$rrule[] = 'UNTIL=' . $this->_exportDateTime($r_value, true); $rrule[] = 'UNTIL=' . $this->_exportDateTime($r_value, true);
break; break;
case 'interval': case 'interval':
...@@ -447,7 +447,9 @@ class ICalendarExport ...@@ -447,7 +447,9 @@ class ICalendarExport
$rrule[] = 'BYMONTH=' . $r_value; $rrule[] = 'BYMONTH=' . $r_value;
break; break;
case 'count': case 'count':
$rrule[] = 'COUNT=' . $r_value; if ($r_value > 1) {
$rrule[] = 'COUNT=' . $r_value;
}
break; break;
} }
} }
...@@ -478,35 +480,40 @@ class ICalendarExport ...@@ -478,35 +480,40 @@ class ICalendarExport
return implode(',', $wdays); return implode(',', $wdays);
} }
/** /**
* Formats dates of exception. * Formats dates of exception.
* *
* @param string $value Unix timestamps as csv list. * @param string $value Date values (Y-m-d) as csv list.
* @return string The formatted Exceptions. * @return string The formatted Exceptions.
*/ */
public function exportExDate(string $value): string public function exportExDate(string $value): string
{ {
$exdates = []; $ex_dates = [];
$date_times = explode(',', $value); $dates = explode(',', $value);
foreach ($date_times as $date_time) { foreach ($dates as $date) {
$exdates[] = $this->_exportDate($date_time); $ex_datetime = $date . ' 12:00:00';
$ex_date = DateTime::createFromFormat('Y-m-d H:i:s', $ex_datetime);
$ex_dates[] = $this->_exportDate($ex_date->getTimestamp());
} }
return implode(',', $exdates);
return implode(',', $ex_dates);
} }
/** /**
* Formats date times of exception. * Formats date times of exception.
* *
* @param string $value Unix timestamps as csv list. * @param string $value Date values (Y-m-d) as csv list.
* @param int $begin Start date of event as unix timestamp.
* @return string The formatted Exceptions. * @return string The formatted Exceptions.
*/ */
public function exportExDateTime(string $value): string public function exportExDateTime(string $value, int $begin): string
{ {
$ex_dates = []; $ex_dates = [];
$ex_date_times = explode(',', $value); $dates = explode(',', $value);
foreach ($ex_date_times as $ex_date_time) { foreach ($dates as $date) {
$date_time = new DateTime(); $ex_datetime = $date . date(' H:i:s', $begin);
$date_time->setTimestamp($ex_date_time); $date_time = DateTime::createFromFormat('Y-m-d H:i:s', $ex_datetime);
$ex_dates[] = $date_time->format('Ymd\THis'); $ex_dates[] = $date_time->format('Ymd\THis');
} }
return implode(',', $ex_dates); return implode(',', $ex_dates);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment