ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
class.ilEmployeeTalkAppointmentGUI.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
30 
37 {
38  public const EDIT_MODE_APPOINTMENT = 'appointment';
39  public const EDIT_MODE_SERIES = 'series';
40  public const EDIT_MODE = 'edit-mode';
41 
47  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  NotificationHandlerInterface $notif_handler,
67  ilObjEmployeeTalk $talk
68  ) {
69  $this->template = $template;
70  $this->language = $language;
71  $this->controlFlow = $controlFlow;
72  $this->http = $http;
73  $this->refinery = $refinery;
74  $this->tabs = $tabs;
75  $this->notif_handler = $notif_handler;
76  $this->talk = $talk;
77 
78  $this->language->loadLanguageModule('cal');
79  }
80 
81  public function executeCommand(): void
82  {
83  $cmd = $this->controlFlow->getCmd(ControlFlowCommand::DEFAULT);
84  if ($this->http->wrapper()->query()->has('ref_id')) {
85  $ref_id = $this->http->wrapper()->query()->retrieve(
86  'ref_id',
87  $this->refinery->kindlyTo()->int()
88  );
89  } else {
91  'No ref_id found'
92  );
93  }
94 
95  $backClass = strtolower(ilObjEmployeeTalkGUI::class);
96  $this->controlFlow->setParameterByClass($backClass, 'ref_id', $ref_id);
97  $this->tabs->setBackTarget(
98  $this->language->txt('back'),
99  $this->controlFlow->getLinkTargetByClass(strtolower(ilObjEmployeeTalkGUI::class), ControlFlowCommand::UPDATE)
100  );
101 
102  switch ($this->editMode()) {
103  case self::EDIT_MODE_SERIES:
104  $this->executeSeriesCommand($cmd);
105  break;
106  case self::EDIT_MODE_APPOINTMENT:
107  $this->executeAppointmentCommand($cmd);
108  break;
109  default:
110  $this->controlFlow->redirectByClass(strtolower(ilObjEmployeeTalkGUI::class), ControlFlowCommand::UPDATE);
111  break;
112  }
113  }
114 
115  private function executeSeriesCommand(string $cmd): bool
116  {
117  $this->template->setTitle($this->language->txt('etal_date_series_edit'));
118 
119  switch ($cmd) {
120  case ControlFlowCommand::UPDATE_INDEX:
121  $this->editSeries();
122  return true;
123  case ControlFlowCommand::UPDATE:
124  $this->updateSeries();
125  return true;
126  }
127 
128  return false;
129  }
130 
131  private function executeAppointmentCommand(string $cmd): bool
132  {
133  $this->template->setTitle($this->language->txt('etal_date_appointment_edit'));
134 
135  switch ($cmd) {
136  case ControlFlowCommand::UPDATE_INDEX:
137  $this->editAppointment();
138  return true;
139  case ControlFlowCommand::UPDATE:
140  $this->updateAppointment();
141  return true;
142  }
143 
144  return false;
145  }
146 
147  private function editSeries(): void
148  {
149  if (($dates_string = $this->getPendingTalkDates()) !== '') {
150  $message = $this->language->txt('pending_talks_warning');
151  $this->template->setOnScreenMessage('info', $message . $dates_string);
152  }
153  $form = $this->initSeriesEditForm($this->talk->getData());
154 
155  $this->template->setContent($form->getHTML());
156  }
157 
158  protected function getPendingTalkDates(): string
159  {
160  $parent = $this->talk->getParent();
161  $talks = $this->getPendingTalksInSeries($parent);
162 
163  usort($talks, function (ilObjEmployeeTalk $a, ilObjEmployeeTalk $b) {
164  $a = $a->getData()->getStartDate()->getUnixTime();
165  $b = $b->getData()->getStartDate()->getUnixTime();
166  if ($a === $b) {
167  return 0;
168  }
169  return $a < $b ? -1 : 1;
170  });
171 
172  $dates = '';
175  foreach ($talks as $talk) {
176  $dates .= "</br>" . ilDatePresentation::formatDate($talk->getData()->getStartDate());
177  }
179  return $dates;
180  }
181 
182  private function updateSeries(): void
183  {
184  $form = $this->initSeriesEditForm();
185  if ($form->checkInput()) {
186  $reoccurrence = $this->loadRecurrenceSettings($form);
187  $parent = $this->talk->getParent();
188  $old_talks = $this->getPendingTalksInSeries($parent);
189  $this->createRecurringTalks($form, $reoccurrence, $parent);
190  $this->deleteTalks($old_talks);
191 
192  $this->template->setOnScreenMessage('success', $this->language->txt('saved_successfully'), true);
193  }
194 
195  $this->controlFlow->redirectToURL(
196  $this->controlFlow->getLinkTargetByClass(
197  strtolower(ilEmployeeTalkMyStaffListGUI::class),
198  ControlFlowCommand::UPDATE_INDEX
200  );
201  }
202 
203  private function initTalkEditForm(?EmployeeTalk $employeeTalk = null): ilPropertyFormGUI
204  {
205  $form = new ilPropertyFormGUI();
207  $form->setFormAction($this->controlFlow->getFormActionByClass(
208  strtolower(self::class)
209  ) . $editMode);
210 
211  $header = new ilFormSectionHeaderGUI();
212  $header->setTitle($this->language->txt('appointment'));
213  $form->addItem($header);
214 
215  $dur = new ilDateDurationInputGUI($this->language->txt('cal_fullday'), 'event');
216  $dur->setRequired(true);
217  $dur->setShowTime(true);
218 
219  if ($employeeTalk !== null) {
220  $dur->enableToggleFullTime(
221  $this->language->txt('cal_fullday_title'),
222  $employeeTalk->isAllDay()
223  );
224 
225  $dur->setStart($employeeTalk->getStartDate());
226  $dur->setEnd($employeeTalk->getEndDate());
227  }
228 
229  $form->addItem($dur);
230  $form->addCommandButton(ControlFlowCommand::UPDATE, $this->language->txt('save'), 'etal_date_save');
231 
232  return $form;
233  }
234 
235  private function initSeriesEditForm(?EmployeeTalk $employeeTalk = null): ilPropertyFormGUI
236  {
237  $form = new ilPropertyFormGUI();
239  $form->setFormAction($this->controlFlow->getFormActionByClass(
240  strtolower(self::class)
241  ) . $editMode);
242 
243  $header = new ilFormSectionHeaderGUI();
244  $header->setTitle($this->language->txt('appointments'));
245  $form->addItem($header);
246 
247  $dur = new ilDateDurationInputGUI($this->language->txt('cal_fullday'), 'event');
248  $dur->setRequired(true);
249  $dur->setShowTime(true);
250 
251  if ($employeeTalk !== null) {
252  $dur->enableToggleFullTime(
253  $this->language->txt('cal_fullday_title'),
254  $employeeTalk->isAllDay()
255  );
256 
257  $dur->setStart($employeeTalk->getStartDate());
258  $dur->setEnd($employeeTalk->getEndDate());
259  }
260 
261  $form->addItem($dur);
262 
263  // Recurrence
264  $cal = new ilRecurrenceInputGUI($this->language->txt('cal_recurrences'), "frequence");
265  $event = new ilCalendarRecurrence();
266 
267  $cal->allowUnlimitedRecurrences(false);
268  $cal->setRecurrence($event);
269 
270  $form->addItem($cal);
271  $form->addCommandButton(ControlFlowCommand::UPDATE, $this->language->txt('save'), 'etal_series_save');
272 
273  return $form;
274  }
275 
276  private function editAppointment(): void
277  {
278  $form = $this->initTalkEditForm($this->talk->getData());
279 
280  $this->template->setContent($form->getHTML());
281  }
282 
283  private function updateAppointment(): void
284  {
285  $form = $this->initTalkEditForm();
286  $form->setValuesByPost();
287  if ($form->checkInput()) {
291  $dateTimeInput = $form->getItemByPostVar('event');
292  $tgl = $form->getInput('event')['tgl'] ?? 0;
293  ['start' => $start, 'end' => $end] = $dateTimeInput->getValue();
294  if (intval($tgl)) {
295  $start_date = new ilDate($start, IL_CAL_UNIX);
296  $end_date = new ilDate($end, IL_CAL_UNIX);
297  } else {
298  $start_date = new ilDateTime($start, IL_CAL_UNIX, ilTimeZone::UTC);
299  $end_date = new ilDateTime($end, IL_CAL_UNIX, ilTimeZone::UTC);
300  }
301 
302  $data = $this->talk->getData();
303  $data->setAllDay(boolval(intval($tgl)));
304  $data->setStartDate($start_date);
305  $data->setEndDate($end_date);
306  $data->setStandalone(true);
307 
308  $this->talk->setData($data);
309  $this->talk->update();
310 
311  $this->sendNotification($this->talk);
312 
313  $this->template->setOnScreenMessage('success', $this->language->txt('saved_successfully'), true);
314  }
315 
316 
317  $this->controlFlow->redirectToURL(
318  $this->controlFlow->getLinkTargetByClass(
319  strtolower(self::class),
320  ControlFlowCommand::UPDATE_INDEX
322  );
323  }
324 
325  private function sendNotification(ilObjEmployeeTalk ...$talks): void
326  {
327  $this->notif_handler->send(NotificationType::UPDATE, ...$talks);
328  }
329 
330  private function editMode(): string
331  {
332  $mode = '';
333  if ($this->http->wrapper()->query()->has(self::EDIT_MODE)) {
334  $mode = $this->http->wrapper()->query()->retrieve(
335  self::EDIT_MODE,
336  $this->refinery->kindlyTo()->string()
337  );
338  }
339  if ($mode === self::EDIT_MODE_SERIES || $mode === self::EDIT_MODE_APPOINTMENT) {
340  return $mode;
341  }
342  return 'invalid';
343  }
344 
345  private function getEditModeParameter(string $mode): string
346  {
347  return '&' . ilEmployeeTalkAppointmentGUI::EDIT_MODE . '=' . $mode;
348  }
349 
357  {
358  $rec = new ilCalendarRecurrence();
359 
360  switch ($form->getInput('frequence')) {
362  $rec->setFrequenceType($form->getInput('frequence'));
363  $rec->setInterval((int) $form->getInput('count_DAILY'));
364  break;
365 
367  $rec->setFrequenceType($form->getInput('frequence'));
368  $rec->setInterval((int) $form->getInput('count_WEEKLY'));
369  if (is_array($form->getInput('byday_WEEKLY'))) {
370  $rec->setBYDAY(ilUtil::stripSlashes(implode(',', $form->getInput('byday_WEEKLY'))));
371  }
372  break;
373 
375  $rec->setFrequenceType($form->getInput('frequence'));
376  $rec->setInterval((int) $form->getInput('count_MONTHLY'));
377  switch ((int) $form->getInput('subtype_MONTHLY')) {
378  case 0:
379  // nothing to do;
380  break;
381 
382  case 1:
383  switch ((int) $form->getInput('monthly_byday_day')) {
384  case 8:
385  // Weekday
386  $rec->setBYSETPOS($form->getInput('monthly_byday_num'));
387  $rec->setBYDAY('MO,TU,WE,TH,FR');
388  break;
389 
390  case 9:
391  // Day of month
392  $rec->setBYMONTHDAY($form->getInput('monthly_byday_num'));
393  break;
394 
395  default:
396  $rec->setBYDAY(($form->getInput('monthly_byday_num') . $form->getInput('monthly_byday_day')));
397  break;
398  }
399  break;
400 
401  case 2:
402  $rec->setBYMONTHDAY($form->getInput('monthly_bymonthday'));
403  break;
404  }
405  break;
406 
408  $rec->setFrequenceType($form->getInput('frequence'));
409  $rec->setInterval((int) $form->getInput('count_YEARLY'));
410  switch ((int) $form->getInput('subtype_YEARLY')) {
411  case 0:
412  // nothing to do;
413  break;
414 
415  case 1:
416  $rec->setBYMONTH($form->getInput('yearly_bymonth_byday'));
417  $rec->setBYDAY(($form->getInput('yearly_byday_num') . $form->getInput('yearly_byday')));
418  break;
419 
420  case 2:
421  $rec->setBYMONTH($form->getInput('yearly_bymonth_by_monthday'));
422  $rec->setBYMONTHDAY($form->getInput('yearly_bymonthday'));
423  break;
424  }
425  break;
426  }
427 
428  // UNTIL
429  switch ((int) $form->getInput('until_type')) {
430  case 1:
431  $rec->setFrequenceUntilDate(null);
432  // nothing to do
433  break;
434 
435  case 2:
436  $rec->setFrequenceUntilDate(null);
437  $rec->setFrequenceUntilCount((int) $form->getInput('count'));
438  break;
439 
440  case 3:
441  $frequence = $form->getItemByPostVar('frequence');
442  $end = $frequence->getRecurrence()->getFrequenceUntilDate();
443  $rec->setFrequenceUntilCount(0);
444  $rec->setFrequenceUntilDate($end);
445  break;
446  }
447 
448  return $rec;
449  }
450 
460  private function createRecurringTalks(ilPropertyFormGUI $form, ilCalendarRecurrence $recurrence, ilObjEmployeeTalkSeries $series): bool
461  {
462  $data = $this->loadEtalkData($form);
463 
464  $firstAppointment = new EmployeeTalkPeriod(
465  $data->getStartDate(),
466  $data->getEndDate(),
467  $data->isAllDay()
468  );
469  $calc = new ilCalendarRecurrenceCalculator($firstAppointment, $recurrence);
470 
471  $periodStart = clone $data->getStartDate();
472 
473  $periodEnd = clone $data->getStartDate();
474  $periodEnd->increment(IL_CAL_YEAR, 5);
475  $dateIterator = $calc->calculateDateList($periodStart, $periodEnd);
476 
477  $periodDiff = $data->getEndDate()->get(IL_CAL_UNIX) -
478  $data->getStartDate()->get(IL_CAL_UNIX);
479 
480  $talkSession = new ilObjEmployeeTalk();
481  $talkSession->setTitle($this->talk->getTitle());
482  $talkSession->setDescription($this->talk->getLongDescription());
483  $talkSession->setType(ilObjEmployeeTalk::TYPE);
484  $talkSession->setOwner($series->getOwner());
485  $talkSession->create();
486 
487  $talkSession->createReference();
488  $talkSession->putInTree($series->getRefId());
489 
490  $data->setObjectId($talkSession->getId());
491  $talkSession->setData($data);
492  $talkSession->update();
493 
494  $talks = [];
495  $talks[] = $talkSession;
496 
497  if (!$recurrence->getFrequenceType()) {
498  $this->sendNotification(...$talks);
499  return true;
500  }
501 
502  // Remove start date
503  $dateIterator->removeByDAY($periodStart);
504  $dateIterator->rewind();
505 
509  foreach ($dateIterator as $date) {
510  $cloneObject = $talkSession->cloneObject($series->getRefId());
511  $cloneData = $cloneObject->getData();
512 
513  $cloneData->setStartDate($date);
514  $endDate = $date->get(IL_CAL_UNIX) + $periodDiff;
515  if ($cloneData->isAllDay()) {
516  $cloneData->setEndDate(new ilDate($endDate, IL_CAL_UNIX));
517  } else {
518  $cloneData->setEndDate(new ilDateTime($endDate, IL_CAL_UNIX, ilTimeZone::UTC));
519  }
520  $cloneObject->setData($cloneData);
521  $cloneObject->update();
522 
523  $cloneObject->setOwner($series->getOwner());
524  $cloneObject->updateOwner();
525 
526  $talks[] = $cloneObject;
527  }
528 
529  $this->sendNotification(...$talks);
530 
531  return true;
532  }
533 
537  private function getPendingTalksInSeries(ilObjEmployeeTalkSeries $series): array
538  {
539  $talks = [];
540  $subItems = $series->getSubItems()['_all'];
541 
542  foreach ($subItems as $subItem) {
543  if ($subItem['type'] === 'etal') {
544  $refId = intval($subItem['ref_id']);
545  $talk = new ilObjEmployeeTalk($refId, true);
546  $talk_data = $talk->getData();
547  if ($talk_data->isStandalone() || $talk_data->isCompleted()) {
548  continue;
549  }
550  $talks[] = $talk;
551  }
552  }
553 
554  return $talks;
555  }
556 
560  private function deleteTalks(array $talks): void
561  {
562  foreach ($talks as $talk) {
563  $talk->delete();
564  }
565  }
566 
567  private function loadEtalkData(ilPropertyFormGUI $form): EmployeeTalk
568  {
569  $data = $this->talk->getData();
570  $tgl = $form->getInput('event')['tgl'] ?? 0;
571 
575  $dateTimeInput = $form->getItemByPostVar('event');
576  ['start' => $start, 'end' => $end] = $dateTimeInput->getValue();
577  if (intval($tgl)) {
578  $start_date = new ilDate($start, IL_CAL_UNIX);
579  $end_date = new ilDate($end, IL_CAL_UNIX);
580  } else {
581  $start_date = new ilDateTime($start, IL_CAL_UNIX, ilTimeZone::UTC);
582  $end_date = new ilDateTime($end, IL_CAL_UNIX, ilTimeZone::UTC);
583  }
584 
585  return new EmployeeTalk(
586  -1,
587  $start_date,
588  $end_date,
589  boolval(intval($tgl)),
590  '',
591  $data->getLocation(),
592  $data->getEmployee(),
593  false,
594  false,
595  $data->getTemplateId()
596  );
597  }
598 }
static array static setUseRelativeDates(bool $a_status)
set use relative dates
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false, ilObjUser $user=null,)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getItemByPostVar(string $a_post_var)
__construct(ilGlobalTemplateInterface $template, ilLanguage $language, ilCtrl $controlFlow, HttpServices $http, Refinery $refinery, ilTabsGUI $tabs, NotificationHandlerInterface $notif_handler, ilObjEmployeeTalk $talk)
ilEmployeeTalkAppointmentGUI constructor.
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)
$refId
Definition: xapitoken.php:56
const IL_CAL_UNIX
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-...
getFrequenceType()
Get Frequence type of recurrence.
loadRecurrenceSettings(ilPropertyFormGUI $form)
load recurrence settings
$ref_id
Definition: ltiauth.php:66
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...
sendNotification(ilObjEmployeeTalk ... $talks)
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...
initSeriesEditForm(?EmployeeTalk $employeeTalk=null)
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)
language()
description: > Example for rendring a language glyph.
Definition: language.php:25
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
const IL_CAL_YEAR