ILIAS  release_8 Revision v8.24
class.ilEmployeeTalkAppointmentGUI.php
Go to the documentation of this file.
1<?php
2
3declare(strict_types=1);
4
21use ILIAS\HTTP\Services as HttpServices;
22use ILIAS\Refinery\Factory as Refinery;
31
38{
39 public const EDIT_MODE_APPOINTMENT = 'appointment';
40 public const EDIT_MODE_SERIES = 'series';
41 public const EDIT_MODE = 'edit-mode';
42
46 private HttpServices $http;
47 private Refinery $refinery;
50
59 public function __construct(
63 HttpServices $http,
64 Refinery $refinery,
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()) {
99 $this->executeSeriesCommand($cmd);
100 break;
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;
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}
Builds data types.
Definition: Factory.php:21
Class Services.
Definition: Services.php:38
const IL_CAL_UNIX
const IL_CAL_YEAR
const IL_CAL_FKT_DATE
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...
getFrequenceType()
Get Frequence type of recurrence.
static getUserDateFormat(int $a_add_time=0, bool $a_for_parsing=false)
Parse current user setting into date/time format.
getSubItems(bool $a_admin_panel_enabled=false, bool $a_include_side_block=false, int $a_get_single=0, ilContainerUserFilter $container_user_filter=null)
Class ilCtrl provides processing control methods.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
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)
@classDescription Date and time handling
Class for single dates.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilEmployeeTalkAppointmentGUI.
getPendingTalksInSeries(ilObjEmployeeTalkSeries $series)
initSeriesEditForm(?EmployeeTalk $employeeTalk=null)
loadRecurrenceSettings(ilPropertyFormGUI $form)
load recurrence settings
__construct(ilGlobalTemplateInterface $template, ilLanguage $language, ilCtrl $controlFlow, HttpServices $http, Refinery $refinery, ilTabsGUI $tabs, ilObjEmployeeTalk $talk)
ilEmployeeTalkAppointmentGUI constructor.
initTalkEditForm(?EmployeeTalk $employeeTalk=null)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
language handling
User class.
delete()
delete object or referenced object (in the case of a referenced object, object data is only deleted i...
This class represents a property form user interface.
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-...
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="")
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...
$ref_id
Definition: ltiauth.php:67
$format
Definition: metadata.php:235
static http()
Fetches the global http state from ILIAS.
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
$message
Definition: xapiexit.php:32
$refId
Definition: xapitoken.php:58