aboutsummaryrefslogtreecommitdiff
path: root/lib/models/calendar/CalendarDate.class.php
diff options
context:
space:
mode:
authorPhilipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de>2024-09-24 10:53:31 +0200
committerPhilipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de>2024-09-24 10:53:31 +0200
commit4459dd7917f4d1c34f40bb68f0e991e9c3d53e4c (patch)
tree5c07151ae61276d334e88f6309c30d439a85c12e /lib/models/calendar/CalendarDate.class.php
parentda0022e5c1abbf9825ae76debaabdff7e8623bb4 (diff)
parent97a188592c679890a25c37ab78463add76a52ff7 (diff)
Merge branch 'main' into issue-3911issue-3911
Diffstat (limited to 'lib/models/calendar/CalendarDate.class.php')
-rw-r--r--lib/models/calendar/CalendarDate.class.php946
1 files changed, 0 insertions, 946 deletions
diff --git a/lib/models/calendar/CalendarDate.class.php b/lib/models/calendar/CalendarDate.class.php
deleted file mode 100644
index e9269c6..0000000
--- a/lib/models/calendar/CalendarDate.class.php
+++ /dev/null
@@ -1,946 +0,0 @@
-<?php
-/**
- * CalendarDate.class.php - Model class for calendar dates.
- *
- * CalendarDate represents a date in the personal calendar.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * @author Peter Thienel <thienel@data-quest.de>
- * @author Moritz Strohm <strohm@data-quest.de>
- * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2
- * @category Stud.IP
- * @since 3.2
- *
- * @property string id database column
- * @property string author_id database column
- * @property string editor_id database column
- * @property string unique_id database column
- * @property string begin database column
- * @property string end database column
- * @property string title database column
- * @property string description database column
- * @property string access database column
- * @property string user_category database column
- * @property string category database column
- * @property string location database column
- * @property string interval database column
- * @property string offset database column
- * @property string days database column
- * @property string month database column
- * @property string day_offset database column
- * @property string repetition_type database column
- * @property string number_of_dates database column
- * @property string repetition_end database column
- * @property string mkdate database column
- * @property string chdate database column
- * @property string import_date database column
- */
-class CalendarDate extends SimpleORMap implements PrivacyObject
-{
- /**
- * NEVER_ENDING represents the value of the repetition_end field for
- * a date that never ends. The value is the result of computing
- * 2 ^ 31 - 1.
- *
- * NOTE: This constant must be changed long before 2038-01-19 03:14:07 UTC
- * or else dates that should end at some specific point in time may end
- * never.
- */
- public const NEVER_ENDING = 2147483647;
-
- protected static function configure($config = [])
- {
- $config['db_table'] = 'calendar_dates';
-
- $config['belongs_to']['author'] = [
- 'class_name' => User::class,
- 'foreign_key' => 'author_id',
- ];
- $config['belongs_to']['editor'] = [
- 'class_name' => User::class,
- 'foreign_key' => 'editor_id',
- ];
- $config['has_many']['calendars'] = [
- 'class_name' => CalendarDateAssignment::class,
- 'assoc_foreign_key' => 'calendar_date_id',
- 'on_store' => 'store',
- 'on_delete' => 'delete'
- ];
- $config['has_many']['exceptions'] = [
- 'class_name' => CalendarDateException::class,
- 'assoc_foreign_key' => 'calendar_date_id',
- 'on_store' => 'store',
- 'on_delete' => 'delete'
- ];
-
- $config['default_values']['interval'] = 0;
- $config['default_values']['offset'] = 0;
-
- $config['registered_callbacks']['before_store'][] = 'calculateExpiration';
- $config['registered_callbacks']['after_store'][] = 'cbSendDateModificationMail';
- $config['registered_callbacks']['before_store'][] = 'cbGenerateUniqueId';
-
- parent::configure($config);
-
- }
-
- public static function garbageCollect()
- {
- DBManager::get()->query(
- 'DELETE `calendar_dates`
- FROM `calendar_date_assignments`
- LEFT JOIN `calendar_dates` ON (`calendar_dates`.`id` = `calendar_date_assignments`.`calendar_date_id`)
- WHERE `range_id` IS NULL'
- );
- }
-
- /**
- * @deprecated
- */
- public function getDefaultValue($field)
- {
- if ($field == 'begin') {
- return time();
- }
- if ($field == 'end' && $this->content['begin']) {
- return $this->content['begin'] + 3600;
- }
- return parent::getDefaultValue($field);
- }
-
- public function cbSendDateModificationMail()
- {
- $template_factory = new Flexi_TemplateFactory($GLOBALS['STUDIP_BASE_PATH'] . '/locale/');
-
- foreach ($this->calendars as $calendar) {
- if ($calendar->range_id === $this->editor_id) {
- //The editor shall not get a mail about the changes they just made.
- continue;
- }
- if (!$calendar->user) {
- //Wrong range or not a user.
- continue;
- }
- setTempLanguage($calendar->range_id);
-
- $lang_path = getUserLanguagePath($calendar->range_id);
- $template = $template_factory->open($lang_path . '/LC_MAILS/date_changed.php');
- $template->set_attribute('date', $this);
- $template->set_attribute('receiver', $calendar->user);
- $template->set_attribute('receiver_date_assignment', $calendar);
- $mail_text = $template->render();
- Message::send(
- '____%system%____',
- [$calendar->user->username],
- sprintf(_('Terminänderung durch %s'), $this->editor->getFullName()),
- $mail_text
- );
-
- restoreLanguage();
- }
- }
-
- /**
- * Generates an unique id if it isn't present.
- * @return void
- */
- public function cbGenerateUniqueId()
- {
- if (!$this->unique_id) {
- $this->unique_id = 'Stud.IP-' . $this->id . '@' . ($_SERVER['SERVER_NAME'] ?? '');
- }
- }
-
- /**
- * TODO
- *
- * @param string $range_id
- * @return bool
- */
- public function isVisible(string $range_id)
- {
- if (CalendarDateAssignment::exists([$range_id, $this->id])) {
- //Users may see the dates in their calendar:
- return true;
- }
-
- $assignments = CalendarDateAssignment::findByCalendar_date_id($this->id);
- foreach ($assignments as $assignment) {
- if ($assignment->course instanceof Course) {
- if ($assignment->course->isCalendarReadable($range_id)) {
- return true;
- }
- } elseif ($assignment->user instanceof User) {
- if ($assignment->user->isCalendarReadable($range_id)) {
- return true;
- }
- }
- }
-
- //In case the date is not in a calendar of the user or a course
- //where the user has access to, it is only visible when it is public.
- return $this->access === 'PUBLIC';
- }
-
-
- public function isWritable(string $range_id)
- {
- if (CalendarDateAssignment::exists([$range_id, $this->id])) {
- //The date is in the calendar of the user/course
- //and therefore, the user or course administrator (tutor, dozent)
- //may change the date.
- return true;
- }
- //In case $range_id is a User-ID, a check has to be made if the calendar
- //date is bound to a course and the user has at least "tutor" permissions
- //in the course.
- if (User::exists($range_id)) {
- $writable_via_course = false;
- $assignments = CalendarDateAssignment::findByCalendar_date_id($this->id);
- foreach ($assignments as $assignment) {
- if (Course::exists($assignment->range_id)
- && $GLOBALS['perm']->have_studip_perm('tutor', $assignment->range_id, $range_id)) {
- $writable_via_course = true;
- break;
- }
- }
- if ($writable_via_course) {
- return true;
- }
- }
-
- //Check contacts: Has the contact of the user that is represented by
- //$range_id write permissions to all the calendars of all the users that
- //are assigned to the date?
-
- $contacts_with_write_permissions = Contact::countBySql(
- "JOIN `calendar_date_assignments` cda
- ON `contact`.`user_id` = cda.`range_id`
- WHERE `contact`.`owner_id` = :current_range_id
- AND `contact`.`calendar_permissions` = 'WRITE'
- AND cda.`calendar_date_id` = :calendar_date_id
- AND cda.`range_id` <> :current_range_id",
- [
- 'calendar_date_id' => $this->id,
- 'current_range_id' => $range_id
- ]
- );
- $other_participant_count = CalendarDateAssignment::countBySql(
- "`calendar_date_id` = :calendar_date_id
- AND `range_id` <> :current_range_id",
- [
- 'calendar_date_id' => $this->id,
- 'current_range_id' => $range_id
- ]
- );
-
- if ($contacts_with_write_permissions === $other_participant_count) {
- //The user represented by $range_id has write permissions to all
- //calendars of all the other users that are assigned to the date.
- return true;
- }
-
- //NOTE: CALENDAR_GRANT_ALL_INSERT MUST NOT be regarded here, because it only
- //defines the behavior when inserting calendar dates and not when modifying them.
-
- //In case it is a course date, we must check if the user has write
- //permissions from the course:
- $course_assignments = CalendarDateAssignment::findBySql(
- "JOIN `seminare`
- ON `calendar_date_assignments`.`range_id` = `seminare`.`seminar_id`
- WHERE `calendar_date_id` = :calendar_date_id",
- ['calendar_date_id' => $this->id]
- );
- foreach ($course_assignments as $course_assignment) {
- if ($course_assignment->course->isCalendarWritable($range_id)) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Determines whether the date spans over one whole day. This means that the date takes
- * place on one day from 0:00:00 to 23:59:59.
- *
- * @return bool True, if the date spans over the whole day, false otherwise.
- */
- public function isWholeDay() : bool
- {
- $begin = new DateTime();
- $begin->setTimestamp($this->begin);
- $end = new DateTime();
- $end->setTimestamp($this->end);
-
- if ($begin->format('Ymd') !== $end->format('Ymd')) {
- //Beginning and end are on different days.
- return false;
- }
- //If the beginning is on midnight and the end is one second before midnight of the next day,
- //the date spans over the whole day.
- return $begin->format('His') === '000000'
- && $end->format('His') === '235959';
- }
-
-
- /**
- * Calculates the value of the "expire" column in case the CalendarDate object
- * has a repetition defined.
- *
- * @return void
- */
- public function calculateExpiration()
- {
- if (!in_array($this->repetition_type, ['DAILY', 'WEEKLY', 'MONTHLY', 'YEARLY'])) {
- //No repetition. Nothing to do.
- return;
- }
- if ($this->number_of_dates > 1) {
- //There is a certain amount of repetitions, so that the expiration date
- //has to be calculated by that.
- $expiration = new DateTime();
- $expiration->setTimestamp($this->begin);
- $interval_str = '';
- if ($this->repetition_type === 'DAILY') {
- $interval_str = sprintf('P%dD', ((int) $this->number_of_dates - 1) * $this->interval);
- } elseif ($this->repetition_type === 'WEEKLY') {
- $days_length = mb_strlen($this->days);
- if ($days_length > 0) {
- $wday = $expiration->format('N');
- // set next weekday as first repetition
- $expiration->modify($this->getWeekdayName());
-
- $rep_offset = ($this->number_of_dates - 1) % $days_length;
-
- $rep_count = $this->number_of_dates - 1;
-
- $days_offset = floor($rep_count / $days_length) * 7 *
- $this->interval + $rep_offset - 1;
- $interval_str = sprintf('P%dD', $days_offset);
- } else {
- $interval_str = sprintf('P%dW', ($this->number_of_dates - 1) * $this->interval);
- }
- } elseif ($this->repetition_type === 'MONTHLY') {
- $interval_str = sprintf('P%dM', ($this->number_of_dates - 1) * $this->interval);
- } elseif ($this->repetition_type === 'YEARLY') {
- $interval_str = sprintf('P%dY', ($this->number_of_dates - 1) * $this->interval);
- }
- try {
- $interval = new DateInterval($interval_str);
- $expiration->add($interval);
- $expiration->setTime(23, 59, 59);
- $this->repetition_end = $expiration->getTimestamp();
- } catch (Exception $e) {
- //Nothing to do.
- }
- } elseif (!$this->repetition_end) {
- //No expiration date is specified.
- //This would mean that the event "never" expires.
- $this->repetition_end = self::NEVER_ENDING;
- }
- }
-
-
- /**
- *
- * Returns the DateInterval for the repetition of this calendar date.
- *
- * @return DateInterval|null The DateInterval for this calendar date or null
- * in case the date has no repetition.
- * @throws Exception In case a DateInterval cannot be constructed.
- */
- public function getRepetitionInterval() : ?DateInterval
- {
- if ($this->repetition_type === 'DAILY') {
- return new DateInterval(sprintf('P%uD', $this->interval));
- } elseif ($this->repetition_type === 'WORKDAYS') {
- return new DateInterval('P1W');
- } elseif ($this->repetition_type === 'WEEKLY') {
- return new DateInterval(sprintf('P%uW', $this->interval));
- } elseif ($this->repetition_type === 'MONTHLY') {
- return new DateInterval(sprintf('P%uM', $this->interval));
- } elseif ($this->repetition_type === 'YEARLY') {
- return new DateInterval(sprintf('P%uY', $this->interval));
- }
- //No repetition: no interval.
- return null;
- }
-
-
- public function getRepetitionOffset() : ?DateInterval
- {
- if (!$this->offset) {
- return null;
- }
-
- if ($this->repetition_type === 'MONTHLY') {
- if ($this->days_offset) {
- return new DateInterval(sprintf('P%1$uM%2$uD', $this->offset, $this->days_offset));
- } else {
- return new DateInterval(sprintf('P%uM', $this->offset));
- }
- } elseif ($this->repetition_type === 'YEARLY') {
- return new DateInterval(sprintf('P%uM', $this->offset));
- }
- return null;
- }
-
-
- /**
- * Export available data of a given user into a storage object
- * (an instance of the StoredUserData class) for that user.
- *
- * @param StoredUserData $storage object to store data into
- */
- public static function exportUserData(StoredUserData $storage)
- {
- $sorm = self::findThru($storage->user_id, [
- 'thru_table' => 'calendar_date_assignments',
- 'thru_key' => 'range_id',
- 'thru_assoc_key' => 'event_id',
- 'assoc_foreign_key' => 'event_id',
- ]);
- if ($sorm) {
- $field_data = [];
- foreach ($sorm as $row) {
- $field_data[] = $row->toRawArray();
- }
- if ($field_data) {
- $storage->addTabularData(_('Kalendereinträge'), 'calendar_dates', $field_data);
- }
- }
- }
-
-
- /**
- * This is a helper method to set all the fields for date repetition to an empty string.
- *
- * @return void
- */
- public function clearRepetitionFields()
- {
- $this->repetition_type = '';
- $this->interval = '';
- $this->offset = '';
- $this->days = '';
- $this->month = '';
- $this->number_of_dates = '1';
- $this->repetition_end = '';
- }
-
- public function getAccessAsString() : string
- {
- if ($this->access === 'PUBLIC') {
- return _('Öffentlich');
- } elseif ($this->access === 'PRIVATE') {
- return _('Privat');
- } elseif ($this->access === 'CONFIDENTIAL') {
- return _('Vertraulich');
- } else {
- return _('Keine Angabe');
- }
- }
-
- public function getRepetitionAsString() : string
- {
- require_once 'lib/dates.inc.php';
-
- $repetition_string = '';
-
- if ($this->repetition_type === 'SINGLE') {
- $repetition_string = _('Keine Wiederholung');
- } elseif ($this->repetition_type === 'DAILY') {
- if ($this->interval > 0) {
- if ($this->interval == '1') {
- //Each day
- if ($this->number_of_dates > 1) {
- $repetition_string = sprintf(
- _('Täglich (%u Termine)'),
- $this->number_of_dates
- );
- } elseif ($this->repetition_end < CalendarDate::NEVER_ENDING) {
- $repetition_string = sprintf(
- _('Täglich bis zum %1$s'),
- date('d.m.Y', $this->repetition_end)
- );
- } else {
- $repetition_string = _('Täglich ohne Begrenzung');
- }
- } else {
- //Every %u day
- if ($this->number_of_dates > 1) {
- $repetition_string = sprintf(
- _('Jeden %1$u. Tag (%2$u Termine)'),
- $this->interval,
- $this->number_of_dates
- );
- } elseif ($this->repetition_end < self::NEVER_ENDING) {
- $repetition_string = sprintf(
- _('Jeden %1$u. Tag bis zum %2$s'),
- $this->interval,
- date('d.m.Y', $this->repetition_end)
- );
- } else {
- $repetition_string = sprintf(
- _('Jeden %u. Tag ohne Begrenzung'),
- $this->interval
- );
- }
- }
- }
- } elseif ($this->repetition_type === 'WEEKLY') {
- $weekday_string = '';
- if (strlen($this->days) > 1) {
- //Multiple days
- $days = [];
- foreach (str_split($this->days) as $day_number) {
- if ($day_number == '7') {
- $day_number = '0';
- }
- $days[] = getWeekday($day_number, false);
- }
- $all_but_last_day = array_slice($days, 0, -1);
- $weekday_string = sprintf(
- _('%1$s und %2$s'),
- implode(', ', $all_but_last_day),
- end($days)
- );
- } else {
- //One day
- $weekday_string = getWeekday($this->days[0], false);
- }
- if ($this->interval == '1') {
- //Each week
- if ($this->number_of_dates > 1) {
- $repetition_string = sprintf(
- ngettext('Einmal am folgenden %s', 'Jeden %1$s (%2$u Termine)', $this->number_of_dates - 1),
- $weekday_string,
- $this->number_of_dates
- );
- } elseif ($this->repetition_end < self::NEVER_ENDING) {
- $repetition_string = sprintf(
- _('Jeden %1$s bis zum %2$s'),
- $weekday_string,
- date('d.m.Y', $this->repetition_end)
- );
- } else {
- $repetition_string = sprintf(
- _('Jeden %s ohne Begrenzung'),
- $weekday_string
- );
- }
- } else {
- //Every %u week
- if ($this->number_of_dates > 1) {
- $repetition_string = sprintf(
- _('Jeden %1$u. %2$s (%3$u Termine)'),
- $this->interval,
- $weekday_string,
- $this->number_of_dates
- );
- } elseif ($this->repetition_end < self::NEVER_ENDING) {
- $repetition_string = sprintf(
- _('Jeden %1$u. %2$s bis zum %3$s'),
- $this->interval,
- $weekday_string,
- date('d.m.Y', $this->repetition_end)
- );
- } else {
- $repetition_string = sprintf(
- _('Jeden %1$u. %2$s ohne Begrenzung'),
- $this->interval,
- $weekday_string
- );
- }
- }
- } elseif ($this->repetition_type === 'MONTHLY') {
- if ($this->interval == '1') {
- //Each month
- if ($this->days) {
- if ($this->offset < 0) {
- //Repetition on one specific day of week in the last week.
- $repetition_string = sprintf(
- _('Jeden Monat am letzten %s'),
- getWeekday($this->days, false)
- );
- } else {
- //Repetition on one specific day of week in a specific week.
- $repetition_string = sprintf(
- _('Jeden Monat am %1$u. %2$s'),
- $this->offset,
- getWeekday($this->days, false)
- );
- }
- } else {
- //Repetition on one specific day of month.
- $repetition_string = sprintf(
- _('Jeden Monat am %u. Tag'),
- $this->offset
- );
- }
- } else {
- //Every %u month
- if ($this->days) {
- if ($this->offset < 0) {
- //Repetition on one specific day of week on the last week.
- $repetition_string = sprintf(
- _('Jeden %1$u. Monat am letzten %2$s'),
- $this->interval,
- getWeekday($this->days, false)
- );
- } else {
- //Repetition on one specific day of week in a specific week.
- $repetition_string = sprintf(
- _('Jeden %1$u. Monat am %2$u. %3$s'),
- $this->interval,
- $this->offset,
- getWeekday($this->days, false)
- );
- }
- } else {
- //Repetition on one specific day of month.
- $repetition_string = sprintf(
- _('Jeden %1$u. Monat am %2$u.'),
- $this->interval,
- $this->offset
- );
- }
- }
- } elseif ($this->repetition_type === 'YEARLY') {
- if ($this->interval == '1') {
- //Each year
- if ($this->days) {
- //Repetition on one specific day of week in a specific week
- //in a specific month.
- if ($this->offset < 0) {
- if ($this->number_of_dates > 1) {
- $repetition_string = sprintf(
- _('Jedes Jahr im %1$s am letzten %2$s (%3$u Termine)'),
- getMonthName($this->month, false),
- getWeekday($this->days, false),
- $this->number_of_dates
- );
- } elseif ($this->repetition_end < self::NEVER_ENDING) {
- $repetition_string = sprintf(
- _('Jedes Jahr im %1$s am letzten %2$s bis zum %3$s'),
- getMonthName($this->month, false),
- getWeekday($this->days, false),
- date('d.m.Y', $this->repetition_end)
- );
- } else {
- $repetition_string = sprintf(
- _('Jedes Jahr im %1$s am letzten %2$s ohne Begrenzung'),
- getMonthName($this->month, false),
- getWeekday($this->days, false)
- );
- }
- } else {
- if ($this->number_of_dates > 1) {
- $repetition_string = sprintf(
- _('Jedes Jahr im %1$s am %2$u. %3$s (%4$u Termine'),
- getMonthName($this->month, false),
- $this->offset,
- getWeekday($this->days, false),
- $this->number_of_dates
- );
- } elseif ($this->repetition_end < self::NEVER_ENDING) {
- $repetition_string = sprintf(
- _('Jedes Jahr im %1$s am %2$u. %3$s bis zum %4$s'),
- getMonthName($this->month, false),
- $this->offset,
- getWeekday($this->days, false),
- date('d.m.Y', $this->repetition_end)
- );
- } else {
- $repetition_string = sprintf(
- _('Jedes Jahr im %1$s am %2$u. %3$s ohne Begrenzung'),
- getMonthName($this->month, false),
- $this->offset,
- getWeekday($this->days, false)
- );
- }
- }
- } else {
- //Repetition on one specific day of month.
- if ($this->number_of_dates > 1) {
- $repetition_string = sprintf(
- _('Jedes Jahr am %1$u. %2$s (%3$u Termine)'),
- $this->offset,
- getMonthName($this->month, false),
- $this->number_of_dates
- );
- } elseif ($this->repetition_end < self::NEVER_ENDING) {
- $repetition_string = sprintf(
- _('Jedes Jahr am %1$u. %2$s bis zum %3$s'),
- $this->offset,
- getMonthName($this->month, false),
- date('d.m.Y', $this->repetition_end)
- );
- } else {
- $repetition_string = sprintf(
- _('Jedes Jahr am %1$u. %2$s ohne Begrenzung'),
- $this->offset,
- getMonthName($this->month, false)
- );
- }
- }
- } else {
- //Every %u years
- if ($this->days) {
- //Repetition on one specific day of week in a specific week
- //in a specific month.
- if ($this->offset < 0) {
- if ($this->number_of_dates > 1) {
- $repetition_string = sprintf(
- _('Jedes %1$u. Jahr im %2$s am letzten %3$s (%4$u Termine)'),
- $this->interval,
- getMonthName($this->month, false),
- getWeekday($this->days, false),
- $this->number_of_dates
- );
- } elseif ($this->repetition_end < self::NEVER_ENDING) {
- $repetition_string = sprintf(
- _('Jedes %1$u. Jahr im %2$s am letzten %3$s bis zum %4$s'),
- $this->interval,
- getMonthName($this->month, false),
- getWeekday($this->days, false),
- date('d.m.Y', $this->repetition_end)
- );
- } else {
- $repetition_string = sprintf(
- _('Jedes %1$u. Jahr im %2$s am letzten %3$s ohne Begrenzung'),
- $this->interval,
- getMonthName($this->month, false),
- getWeekday($this->days, false)
- );
- }
- } else {
- if ($this->number_of_dates > 1) {
- $repetition_string = sprintf(
- _('Jedes %1$u. Jahr im %2$s am %3$u. %4$s (%5$u Termine)'),
- $this->interval,
- getMonthName($this->month, false),
- $this->offset,
- getWeekday($this->days, false),
- $this->number_of_dates
- );
- } elseif ($this->repetition_end < self::NEVER_ENDING) {
- $repetition_string = sprintf(
- _('Jedes %1$u. Jahr im %2$s am %3$u. %4$s bis zum %5$s'),
- $this->interval,
- getMonthName($this->month, false),
- $this->offset,
- getWeekday($this->days, false),
- date('d.m.Y', $this->repetition_end)
- );
- } else {
- $repetition_string = sprintf(
- _('Jedes %1$u. Jahr im %2$s am %3$u. %4$s ohne Begrenzung'),
- $this->interval,
- getMonthName($this->month, false),
- $this->offset,
- getWeekday($this->days, false)
- );
- }
- }
- } else {
- //Repetition on one specific day of month.
- if ($this->number_of_dates > 1) {
- $repetition_string = sprintf(
- _('Jedes %1$u. Jahr am %2$u. %3$s (%4$u Termine)'),
- $this->interval,
- $this->offset,
- getMonthName($this->month, false),
- $this->number_of_dates
- );
- } elseif ($this->repetition_end < self::NEVER_ENDING) {
- $repetition_string = sprintf(
- _('Jedes %1$u. Jahr am %2$u. %3$s bis zum %4$s'),
- $this->interval,
- $this->offset,
- getMonthName($this->month, false),
- date('d.m.Y', $this->repetition_end)
- );
- } else {
- $repetition_string = sprintf(
- _('Jedes %1$u. Jahr am %2$u. %3$s ohne Begrenzung'),
- $this->interval,
- $this->offset,
- getMonthName($this->month, false)
- );
- }
- }
- }
- }
-
- return $repetition_string;
- }
-
-
- /**
- * Creates the HTML for creating a repetition input Vue component instance
- * and fills it with the values from the model.
- *
- * @param string $element_name The name of the element.
- *
- * @return string The HTML code for creating the repetition input vue instance.
- */
- public function getRepetitionInputHtml(string $element_name = 'repetition') : string
- {
- $repetition_end_type = '';
- $repetition_end_date = '';
- $repetition_dow = '[]';
- $repetition_dow_week = '';
-
- if ($this->isNew()) {
- $repetition_end_date = htmlReady(date('d.m.Y', $this->end));
- $repetition_dow = sprintf('["%s"]', date('N', $this->begin));
- $repetition_dow_week = '1';
- } else {
-
- if ($this->repetition_end && intval($this->repetition_end) !== self::NEVER_ENDING) {
- $repetition_end_date = htmlReady(date('d.m.Y', $this->repetition_end));
- } else {
- //Provide a good default value in case the user wants to enable or change the repetition:
- $repetition_end_date = htmlReady(date('d.m.Y', $this->end));
- }
- if ($this->days) {
- $repetition_dow = json_encode(str_split($this->days));
- $repetition_dow_week = $this->offset;
- } else {
- //The days field is not in use. Use the day of the beginning as a good default.
- $repetition_dow = sprintf('["%s"]', date('N', $this->begin));
- //Also set repetition_dow_week to 1 as a good default in case the user
- //switches to the monthly repetition type where a specific day of week
- //is selected instead of a specific day of month:
- $repetition_dow_week = '1';
- }
-
- if ($this->number_of_dates > 1) {
- $repetition_end_type = 'end_count';
- } elseif ($this->repetition_end && intval($this->repetition_end) !== self::NEVER_ENDING) {
- //The end date is at some certain date and not on the virtual "never" date.
- $repetition_end_type = 'end_date';
- }
- }
-
- $attributes = [
- 'name' => $element_name,
- 'default_date' => $this->begin,
- 'repetition_type' => $this->isNew() ? '' : $this->repetition_type,
- 'repetition_interval' => $this->isNew() ? '1' : $this->interval,
- ':repetition_dow' => $repetition_dow,
- ':repetition_dow_week' => $repetition_dow_week,
- ':repetition_month' => $this->isNew() ? date('m', $this->begin) : $this->month,
- ':repetition_month_type' => $this->isNew() ? "'dom'" : ($this->days ? "'dow'" : "'dom'"),
- ':repetition_dom' => $this->isNew() ? date('d', $this->begin) : $this->offset,
- ':repetition_end_type' => sprintf("'%s'", $repetition_end_type),
- ':number_of_dates' => $this->isNew() ? '1' : $this->number_of_dates,
- ':repetition_end_date' => sprintf("'%s'", $repetition_end_date)
- ];
- return sprintf('<repetition-input %s></repetition-input>', arrayToHtmlAttributes($attributes));
- }
-
- public function getCategoryAsString() : string
- {
- if ($this->user_category) {
- return $this->user_category;
- }
- return $GLOBALS['PERS_TERMIN_KAT'][$this->category]['name'] ?? '';
- }
-
- /**
- * Returns the textual ordinal for the offset of a weekday from property offset
- * or an empty string if offset is not set.
- *
- * @return string The textual ordinal.
- */
- public function getOrdinalName(): string
- {
- if (mb_strlen($this->offset)) {
- $ordinal_array = [
- '1' => 'first',
- '2' => 'second',
- '3' => 'third',
- '4' => 'fourth',
- '5' => 'fifth',
- '-1' => 'last'
- ];
- return $ordinal_array[$this->offset];
- }
- return '';
- }
-
- /**
- * Returns the short name of first weekday from property days or an
- * empty string if days is not set.
- *
- * @param $offset int Offset of days.
- * @return string Short name of weekday.
- */
- public function getWeekdayName(int $offset = 0): string
- {
- if (mb_strlen($this->days)) {
- $wdays = [
- '1' => 'mon',
- '2' => 'tue',
- '3' => 'wed',
- '4' => 'thu',
- '5' => 'fri',
- '6' => 'sat',
- '7' => 'sun'
- ];
- return $wdays[substr($this->days, $offset, 1)];
- }
- return '';
- }
-
- /**
- * Returns a string representation of the access field.
- *
- * @return string A localised string of the access field.
- */
- public function getVisibilityAsString() : string
- {
- if ($this->access === 'PUBLIC') {
- return _('Öffentlich');
- } elseif ($this->access === 'CONFIDENTIAL') {
- return _('Vertraulich');
- } else {
- return _('Privat');
- }
- }
-
- /**
- * Returns the names of the participants of the date. This also includes courses
- * to which the date is assigned.
- *
- * @param string $user_id The user for which to generate the participant array.
- * The user with that ID is excluded from that list.
- * @return array A list with the names of the participants of the date.
- */
- public function getParticipantsAsStringArray(string $user_id = '') : array
- {
- $participant_strings = [];
- foreach ($this->calendars as $calendar) {
- if ($calendar->range_id === $user_id) {
- //Exclude the user for which to generate the list.
- continue;
- }
- if ($calendar->course instanceof Course) {
- $participant_strings[] = $calendar->course->getFullName();
- } elseif ($calendar->user instanceof User) {
- $participant_strings[] = $calendar->user->getFullName();
- }
- }
-
- asort($participant_strings);
-
- return $participant_strings;
- }
-}