ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilEmployeeTalkAppointmentGUI.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
31 
38 {
39  public const EDIT_MODE_APPOINTMENT = 'appointment';
40  public const EDIT_MODE_SERIES = 'series';
41  public const EDIT_MODE = 'edit-mode';
42 
48  private ilTabsGUI $tabs;
50 
59  public function __construct(
60  ilGlobalTemplateInterface $template,
61  ilLanguage $language,
62  ilCtrl $controlFlow,
63  HttpServices $http,
64  Refinery $refinery,
65  ilTabsGUI $tabs,
66  ilObjEmployeeTalk $talk
67  ) {
68  $this->template = $template;
69  $this->language = $language;
70  $this->controlFlow = $controlFlow;
71  $this->http = $http;
72  $this->refinery = $refinery;
73  $this->tabs = $tabs;
74  $this->talk = $talk;
75 
76  $this->language->loadLanguageModule('cal');
77  }
78 
79  public function executeCommand(): void
80  {
81  $cmd = $this->controlFlow->getCmd(ControlFlowCommand::DEFAULT);
82  if ($this->http->wrapper()->query()->has('ref_id')) {
83  $ref_id = $this->http->wrapper()->query()->retrieve(
84  'ref_id',
85  $this->refinery->kindlyTo()->int()
86  );
87  } else {
89  'No ref_id found'
90  );
91  }
92 
93  $backClass = strtolower(ilObjEmployeeTalkGUI::class);
94  $this->controlFlow->setParameterByClass($backClass, 'ref_id', $ref_id);
95  $this->tabs->setBackTarget($this->language->txt('back'), $this->controlFlow->getLinkTargetByClass(strtolower(ilObjEmployeeTalkGUI::class), ControlFlowCommand::DEFAULT));
96 
97  switch ($this->editMode()) {
98  case self::EDIT_MODE_SERIES:
99  $this->executeSeriesCommand($cmd);
100  break;
101  case self::EDIT_MODE_APPOINTMENT:
102  $this->executeAppointmentCommand($cmd);
103  break;
104  default:
105  $this->controlFlow->redirectByClass(strtolower(ilObjEmployeeTalkGUI::class), ControlFlowCommand::DEFAULT);
106  break;
107  }
108  }
109 
110  private function executeSeriesCommand(string $cmd): bool
111  {
112  $this->template->setTitle($this->language->txt('etal_date_series_edit'));
113 
114  switch ($cmd) {
115  case ControlFlowCommand::UPDATE_INDEX:
116  $this->editSeries();
117  return true;
118  case ControlFlowCommand::UPDATE:
119  $this->updateSeries();
120  return true;
121  }
122 
123  return false;
124  }
125 
126  private function executeAppointmentCommand(string $cmd): bool
127  {
128  $this->template->setTitle($this->language->txt('etal_date_appointment_edit'));
129 
130  switch ($cmd) {
131  case ControlFlowCommand::UPDATE_INDEX:
132  $this->editAppointment();
133  return true;
134  case ControlFlowCommand::UPDATE:
135  $this->updateAppointment();
136  return true;
137  }
138 
139  return false;
140  }
141 
142  private function editSeries(): void
143  {
144  if (($dates_string = $this->getPendingTalkDates()) !== '') {
145  $message = $this->language->txt('pending_talks_warning');
146  $this->template->setOnScreenMessage('info', $message . $dates_string);
147  }
148  $form = $this->initSeriesEditForm($this->talk->getData());
149 
150  $this->template->setContent($form->getHTML());
151  }
152 
153  protected function getPendingTalkDates(): string
154  {
155  $parent = $this->talk->getParent();
156  $talks = $this->getPendingTalksInSeries($parent);
157 
158  usort($talks, function (ilObjEmployeeTalk $a, ilObjEmployeeTalk $b) {
159  $a = $a->getData()->getStartDate()->getUnixTime();
160  $b = $b->getData()->getStartDate()->getUnixTime();
161  if ($a === $b) {
162  return 0;
163  }
164  return $a < $b ? -1 : 1;
165  });
166 
167  $dates = '';
170  foreach ($talks as $talk) {
171  $dates .= "</br>" . ilDatePresentation::formatDate($talk->getData()->getStartDate());
172  }
174  return $dates;
175  }
176 
177  private function updateSeries(): void
178  {
179  $form = $this->initSeriesEditForm();
180  if ($form->checkInput()) {
181  $reoccurrence = $this->loadRecurrenceSettings($form);
182  $parent = $this->talk->getParent();
183  $old_talks = $this->getPendingTalksInSeries($parent);
184  $this->createRecurringTalks($form, $reoccurrence, $parent);
185  $this->deleteTalks($old_talks);
186 
187  $this->template->setOnScreenMessage('success', $this->language->txt('saved_successfully'), true);
188  }
189 
190  $this->controlFlow->redirectToURL(
191  $this->controlFlow->getLinkTargetByClass(
192  strtolower(ilEmployeeTalkMyStaffListGUI::class),
193  ControlFlowCommand::UPDATE_INDEX
195  );
196  }
197 
198  private function initTalkEditForm(?EmployeeTalk $employeeTalk = null): ilPropertyFormGUI
199  {
200  $form = new ilPropertyFormGUI();
202  $form->setFormAction($this->controlFlow->getFormActionByClass(
203  strtolower(self::class)
204  ) . $editMode);
205 
206  $header = new ilFormSectionHeaderGUI();
207  $header->setTitle($this->language->txt('appointment'));
208  $form->addItem($header);
209 
210  $dur = new ilDateDurationInputGUI($this->language->txt('cal_fullday'), 'event');
211  $dur->setRequired(true);
212  $dur->setShowTime(true);
213 
214  if ($employeeTalk !== null) {
215  $dur->enableToggleFullTime(
216  $this->language->txt('cal_fullday_title'),
217  $employeeTalk->isAllDay()
218  );
219 
220  $dur->setStart($employeeTalk->getStartDate());
221  $dur->setEnd($employeeTalk->getEndDate());
222  }
223 
224  $form->addItem($dur);
225  $form->addCommandButton(ControlFlowCommand::UPDATE, $this->language->txt('save'), 'etal_date_save');
226 
227  return $form;
228  }
229 
230  private function initSeriesEditForm(?EmployeeTalk $employeeTalk = null): ilPropertyFormGUI
231  {
232  $form = new ilPropertyFormGUI();
234  $form->setFormAction($this->controlFlow->getFormActionByClass(
235  strtolower(self::class)
236  ) . $editMode);
237 
238  $header = new ilFormSectionHeaderGUI();
239  $header->setTitle($this->language->txt('appointments'));
240  $form->addItem($header);
241 
242  $dur = new ilDateDurationInputGUI($this->language->txt('cal_fullday'), 'event');
243  $dur->setRequired(true);
244  $dur->setShowTime(true);
245 
246  if ($employeeTalk !== null) {
247  $dur->enableToggleFullTime(
248  $this->language->txt('cal_fullday_title'),
249  $employeeTalk->isAllDay()
250  );
251 
252  $dur->setStart($employeeTalk->getStartDate());
253  $dur->setEnd($employeeTalk->getEndDate());
254  }
255 
256  $form->addItem($dur);
257 
258  // Recurrence
259  $cal = new ilRecurrenceInputGUI($this->language->txt('cal_recurrences'), "frequence");
260  $event = new ilCalendarRecurrence();
261 
262  $cal->allowUnlimitedRecurrences(false);
263  $cal->setRecurrence($event);
264 
265  $form->addItem($cal);
266  $form->addCommandButton(ControlFlowCommand::UPDATE, $this->language->txt('save'), 'etal_series_save');
267 
268  return $form;
269  }
270 
271  private function editAppointment(): void
272  {
273  $form = $this->initTalkEditForm($this->talk->getData());
274 
275  $this->template->setContent($form->getHTML());
276  }
277 
278  private function updateAppointment(): void
279  {
280  $form = $this->initTalkEditForm();
281  $form->setValuesByPost();
282  if ($form->checkInput()) {
286  $dateTimeInput = $form->getItemByPostVar('event');
287  $tgl = $form->getInput('event')['tgl'] ?? 0;
288  ['start' => $start, 'end' => $end] = $dateTimeInput->getValue();
289  if (intval($tgl)) {
290  $start_date = new ilDate($start, IL_CAL_UNIX);
291  $end_date = new ilDate($end, IL_CAL_UNIX);
292  } else {
293  $start_date = new ilDateTime($start, IL_CAL_UNIX, ilTimeZone::UTC);
294  $end_date = new ilDateTime($end, IL_CAL_UNIX, ilTimeZone::UTC);
295  }
296 
297  $data = $this->talk->getData();
298  $data->setAllDay(boolval(intval($tgl)));
299  $data->setStartDate($start_date);
300  $data->setEndDate($end_date);
301  $data->setStandalone(true);
302 
303  $this->talk->setData($data);
304  $this->talk->update();
305 
306  $this->sendNotification([$this->talk]);
307 
308  $this->template->setOnScreenMessage('success', $this->language->txt('saved_successfully'), true);
309  }
310 
311 
312  $this->controlFlow->redirectToURL(
313  $this->controlFlow->getLinkTargetByClass(
314  strtolower(self::class),
315  ControlFlowCommand::UPDATE_INDEX
317  );
318  }
319 
323  private function sendNotification(array $talks): void
324  {
325  if (count($talks) === 0) {
326  return;
327  }
328 
329  $firstTalk = $talks[0];
330  $talk_title = $firstTalk->getTitle();
331  $superior = new ilObjUser($firstTalk->getOwner());
332  $employee = new ilObjUser($firstTalk->getData()->getEmployee());
333  $superiorName = $superior->getFullname();
334 
335  $dates = array_map(
336  fn (ilObjEmployeeTalk $t) => $t->getData()->getStartDate(),
337  $talks
338  );
339  usort($dates, function (ilDateTime $a, ilDateTime $b) {
340  $a = $a->getUnixTime();
341  $b = $b->getUnixTime();
342  if ($a === $b) {
343  return 0;
344  }
345  return $a < $b ? -1 : 1;
346  });
347 
348  $add_time = $firstTalk->getData()->isAllDay() ? 0 : 1;
349  $format = ilCalendarUtil::getUserDateFormat($add_time, true);
350  $timezone = $employee->getTimeZone();
351  $dates = array_map(function (ilDateTime $d) use ($add_time, $format, $timezone) {
352  return $d->get(IL_CAL_FKT_DATE, $format, $timezone);
353  }, $dates);
354 
356  $firstTalk->getRefId(),
357  $talk_title,
358  $firstTalk->getDescription(),
359  $firstTalk->getData()->getLocation(),
360  'notification_talks_subject_update',
361  'notification_talks_updated',
362  $superiorName,
363  $dates
364  );
365 
366  $vCalSender = new EmployeeTalkEmailNotificationService(
367  $message,
368  $talk_title,
369  $employee,
370  $superior,
371  VCalendarFactory::getInstanceFromTalks($firstTalk->getParent())
372  );
373 
374  $vCalSender->send();
375  }
376 
377  private function editMode(): string
378  {
379  $mode = '';
380  if ($this->http->wrapper()->query()->has(self::EDIT_MODE)) {
381  $mode = $this->http->wrapper()->query()->retrieve(
382  self::EDIT_MODE,
383  $this->refinery->kindlyTo()->string()
384  );
385  }
386  if ($mode === self::EDIT_MODE_SERIES || $mode === self::EDIT_MODE_APPOINTMENT) {
387  return $mode;
388  }
389  return 'invalid';
390  }
391 
392  private function getEditModeParameter(string $mode): string
393  {
394  return '&' . ilEmployeeTalkAppointmentGUI::EDIT_MODE . '=' . $mode;
395  }
396 
404  {
405  $rec = new ilCalendarRecurrence();
406 
407  switch ($form->getInput('frequence')) {
409  $rec->setFrequenceType($form->getInput('frequence'));
410  $rec->setInterval((int) $form->getInput('count_DAILY'));
411  break;
412 
414  $rec->setFrequenceType($form->getInput('frequence'));
415  $rec->setInterval((int) $form->getInput('count_WEEKLY'));
416  if (is_array($form->getInput('byday_WEEKLY'))) {
417  $rec->setBYDAY(ilUtil::stripSlashes(implode(',', $form->getInput('byday_WEEKLY'))));
418  }
419  break;
420 
422  $rec->setFrequenceType($form->getInput('frequence'));
423  $rec->setInterval((int) $form->getInput('count_MONTHLY'));
424  switch ((int) $form->getInput('subtype_MONTHLY')) {
425  case 0:
426  // nothing to do;
427  break;
428 
429  case 1:
430  switch ((int) $form->getInput('monthly_byday_day')) {
431  case 8:
432  // Weekday
433  $rec->setBYSETPOS($form->getInput('monthly_byday_num'));
434  $rec->setBYDAY('MO,TU,WE,TH,FR');
435  break;
436 
437  case 9:
438  // Day of month
439  $rec->setBYMONTHDAY($form->getInput('monthly_byday_num'));
440  break;
441 
442  default:
443  $rec->setBYDAY(($form->getInput('monthly_byday_num') . $form->getInput('monthly_byday_day')));
444  break;
445  }
446  break;
447 
448  case 2:
449  $rec->setBYMONTHDAY($form->getInput('monthly_bymonthday'));
450  break;
451  }
452  break;
453 
455  $rec->setFrequenceType($form->getInput('frequence'));
456  $rec->setInterval((int) $form->getInput('count_YEARLY'));
457  switch ((int) $form->getInput('subtype_YEARLY')) {
458  case 0:
459  // nothing to do;
460  break;
461 
462  case 1:
463  $rec->setBYMONTH($form->getInput('yearly_bymonth_byday'));
464  $rec->setBYDAY(($form->getInput('yearly_byday_num') . $form->getInput('yearly_byday')));
465  break;
466 
467  case 2:
468  $rec->setBYMONTH($form->getInput('yearly_bymonth_by_monthday'));
469  $rec->setBYMONTHDAY($form->getInput('yearly_bymonthday'));
470  break;
471  }
472  break;
473  }
474 
475  // UNTIL
476  switch ((int) $form->getInput('until_type')) {
477  case 1:
478  $rec->setFrequenceUntilDate(null);
479  // nothing to do
480  break;
481 
482  case 2:
483  $rec->setFrequenceUntilDate(null);
484  $rec->setFrequenceUntilCount((int) $form->getInput('count'));
485  break;
486 
487  case 3:
488  $frequence = $form->getItemByPostVar('frequence');
489  $end = $frequence->getRecurrence()->getFrequenceUntilDate();
490  $rec->setFrequenceUntilCount(0);
491  $rec->setFrequenceUntilDate($end);
492  break;
493  }
494 
495  return $rec;
496  }
497 
507  private function createRecurringTalks(ilPropertyFormGUI $form, ilCalendarRecurrence $recurrence, ilObjEmployeeTalkSeries $series): bool
508  {
509  $data = $this->loadEtalkData($form);
510 
511  $firstAppointment = new EmployeeTalkPeriod(
512  $data->getStartDate(),
513  $data->getEndDate(),
514  $data->isAllDay()
515  );
516  $calc = new ilCalendarRecurrenceCalculator($firstAppointment, $recurrence);
517 
518  $periodStart = clone $data->getStartDate();
519 
520  $periodEnd = clone $data->getStartDate();
521  $periodEnd->increment(IL_CAL_YEAR, 5);
522  $dateIterator = $calc->calculateDateList($periodStart, $periodEnd);
523 
524  $periodDiff = $data->getEndDate()->get(IL_CAL_UNIX) -
525  $data->getStartDate()->get(IL_CAL_UNIX);
526 
527  $talkSession = new ilObjEmployeeTalk();
528  $talkSession->setTitle($this->talk->getTitle());
529  $talkSession->setDescription($this->talk->getLongDescription());
530  $talkSession->setType(ilObjEmployeeTalk::TYPE);
531  $talkSession->setOwner($series->getOwner());
532  $talkSession->create();
533 
534  $talkSession->createReference();
535  $talkSession->putInTree($series->getRefId());
536 
537  $data->setObjectId($talkSession->getId());
538  $talkSession->setData($data);
539  $talkSession->update();
540 
541  $talks = [];
542  $talks[] = $talkSession;
543 
544  if (!$recurrence->getFrequenceType()) {
545  $this->sendNotification($talks);
546  return true;
547  }
548 
549  // Remove start date
550  $dateIterator->removeByDAY($periodStart);
551  $dateIterator->rewind();
552 
556  foreach ($dateIterator as $date) {
557  $cloneObject = $talkSession->cloneObject($series->getRefId());
558  $cloneData = $cloneObject->getData();
559 
560  $cloneData->setStartDate($date);
561  $endDate = $date->get(IL_CAL_UNIX) + $periodDiff;
562  if ($cloneData->isAllDay()) {
563  $cloneData->setEndDate(new ilDate($endDate, IL_CAL_UNIX));
564  } else {
565  $cloneData->setEndDate(new ilDateTime($endDate, IL_CAL_UNIX, ilTimeZone::UTC));
566  }
567  $cloneObject->setData($cloneData);
568  $cloneObject->update();
569 
570  $cloneObject->setOwner($series->getOwner());
571  $cloneObject->updateOwner();
572 
573  $talks[] = $cloneObject;
574  }
575 
576  $this->sendNotification($talks);
577 
578  return true;
579  }
580 
584  private function getPendingTalksInSeries(ilObjEmployeeTalkSeries $series): array
585  {
586  $talks = [];
587  $subItems = $series->getSubItems()['_all'];
588 
589  foreach ($subItems as $subItem) {
590  if ($subItem['type'] === 'etal') {
591  $refId = intval($subItem['ref_id']);
592  $talk = new ilObjEmployeeTalk($refId, true);
593  $talk_data = $talk->getData();
594  if ($talk_data->isStandalone() || $talk_data->isCompleted()) {
595  continue;
596  }
597  $talks[] = $talk;
598  }
599  }
600 
601  return $talks;
602  }
603 
607  private function deleteTalks(array $talks): void
608  {
609  foreach ($talks as $talk) {
610  $talk->delete();
611  }
612  }
613 
614  private function loadEtalkData(ilPropertyFormGUI $form): EmployeeTalk
615  {
616  $data = $this->talk->getData();
617  $tgl = $form->getInput('event')['tgl'] ?? 0;
618 
622  $dateTimeInput = $form->getItemByPostVar('event');
623  ['start' => $start, 'end' => $end] = $dateTimeInput->getValue();
624  if (intval($tgl)) {
625  $start_date = new ilDate($start, IL_CAL_UNIX);
626  $end_date = new ilDate($end, IL_CAL_UNIX);
627  } else {
628  $start_date = new ilDateTime($start, IL_CAL_UNIX, ilTimeZone::UTC);
629  $end_date = new ilDateTime($end, IL_CAL_UNIX, ilTimeZone::UTC);
630  }
631 
632  return new EmployeeTalk(
633  -1,
634  $start_date,
635  $end_date,
636  boolval(intval($tgl)),
637  '',
638  $data->getLocation(),
639  $data->getEmployee(),
640  false,
641  false,
642  $data->getTemplateId()
643  );
644  }
645 }
get(int $a_format, string $a_format_str='', string $a_tz='')
get formatted date
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getItemByPostVar(string $a_post_var)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getPendingTalksInSeries(ilObjEmployeeTalkSeries $series)
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false)
__construct(ilGlobalTemplateInterface $template, ilLanguage $language, ilCtrl $controlFlow, HttpServices $http, Refinery $refinery, ilTabsGUI $tabs, ilObjEmployeeTalk $talk)
ilEmployeeTalkAppointmentGUI constructor.
$refId
Definition: xapitoken.php:58
const IL_CAL_UNIX
static getUserDateFormat(int $a_add_time=0, bool $a_for_parsing=false)
Parse current user setting into date/time format.
getInput(string $a_post_var, bool $ensureValidation=true)
Returns the input of an item, if item provides getInput method and as fallback the value of the HTTP-...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getFrequenceType()
Get Frequence type of recurrence.
loadRecurrenceSettings(ilPropertyFormGUI $form)
load recurrence settings
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$ref_id
Definition: ltiauth.php:67
static http()
Fetches the global http state from ILIAS.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
const IL_CAL_FKT_DATE
$format
Definition: metadata.php:235
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
initSeriesEditForm(?EmployeeTalk $employeeTalk=null)
setRequired(bool $a_required)
getSubItems(bool $a_admin_panel_enabled=false, bool $a_include_side_block=false, int $a_get_single=0, ilContainerUserFilter $container_user_filter=null)
Class ilEmployeeTalkAppointmentGUI.
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
initTalkEditForm(?EmployeeTalk $employeeTalk=null)
$message
Definition: xapiexit.php:32
static setUseRelativeDates(bool $a_status)
set use relative dates
for($i=6; $i< 13; $i++) for($i=1; $i< 13; $i++) $d
Definition: date.php:296
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
const IL_CAL_YEAR