1<?php 2/* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */ 3 4require_once "./Services/Object/classes/class.ilObjectGUI.php"; 5 6/** 7* Class ilObjBookingPoolGUI 8* 9* @author Jörg Lützenkirchen <luetzenkirchen@leifos.com> 10* @version $Id$ 11* 12* @ilCtrl_Calls ilObjBookingPoolGUI: ilPermissionGUI, ilBookingObjectGUI 13* @ilCtrl_Calls ilObjBookingPoolGUI: ilBookingScheduleGUI, ilInfoScreenGUI, ilPublicUserProfileGUI 14* @ilCtrl_Calls ilObjBookingPoolGUI: ilCommonActionDispatcherGUI, ilObjectCopyGUI, ilObjectMetaDataGUI 15* @ilCtrl_Calls ilObjBookingPoolGUI: ilBookingParticipantGUI 16* @ilCtrl_IsCalledBy ilObjBookingPoolGUI: ilRepositoryGUI, ilAdministrationGUI 17*/ 18class ilObjBookingPoolGUI extends ilObjectGUI 19{ 20 /** 21 * @var ilTabsGUI 22 */ 23 protected $tabs; 24 25 /** 26 * @var ilNavigationHistory 27 */ 28 protected $nav_history; 29 30 /** 31 * @var ilHelpGUI 32 */ 33 protected $help; 34 35 /** 36 * @var int 37 */ 38 protected $user_id_to_book; // user who is getting the reservation 39 40 /** 41 * @var int 42 */ 43 protected $user_id_assigner; // user who performs the reservation.(self/another) 44 45 /** 46 * Constructor 47 * 48 */ 49 public function __construct($a_data, $a_id, $a_call_by_reference, $a_prepare_output = true) 50 { 51 global $DIC; 52 53 $this->tpl = $DIC["tpl"]; 54 $this->tabs = $DIC->tabs(); 55 $this->nav_history = $DIC["ilNavigationHistory"]; 56 $this->help = $DIC["ilHelp"]; 57 $this->ctrl = $DIC->ctrl(); 58 $this->lng = $DIC->language(); 59 $this->type = "book"; 60 parent::__construct($a_data, $a_id, $a_call_by_reference, $a_prepare_output); 61 $this->lng->loadLanguageModule("book"); 62 63 $this->user_profile_id = (int) $_GET["user_id"]; 64 $this->book_obj_id = (int) $_REQUEST['object_id']; 65 $this->seed = ilUtil::stripSlashes($_GET['seed']); 66 $this->sseed = ilUtil::stripSlashes($_GET['sseed']); 67 $this->reservation_id = ilUtil::stripSlashes($_GET["reservation_id"]); 68 $this->profile_user_id = (int) $_GET['user_id']; 69 70 $this->user_id_assigner = $this->user->getId(); 71 if ($_GET['bkusr']) { 72 $this->user_id_to_book = (int) $_GET['bkusr']; 73 } else { 74 $this->user_id_to_book = $this->user_id_assigner; // by default user books his own booking objects. 75 } 76 77 if ((int) $_REQUEST['object_id'] > 0 && ilBookingObject::lookupPoolId((int) $_REQUEST['object_id']) != $this->object->getId()) { 78 throw new ilException("Booking Object ID does not match Booking Pool."); 79 } 80 } 81 82 /** 83 * @return bool 84 * @throws ilCtrlException 85 * @throws ilObjectException 86 */ 87 public function executeCommand() 88 { 89 $tpl = $this->tpl; 90 $ilTabs = $this->tabs; 91 $ilNavigationHistory = $this->nav_history; 92 $ilUser = $this->user; 93 94 $next_class = $this->ctrl->getNextClass($this); 95 $cmd = $this->ctrl->getCmd(); 96 97 if (!$next_class && $cmd == 'render') { 98 if ($ilUser->getId() != ANONYMOUS_USER_ID) { 99 $this->ctrl->setCmdClass('ilBookingObjectGUI'); 100 $next_class = $this->ctrl->getNextClass($this); 101 } else { 102 $this->ctrl->redirect($this, "infoscreen"); 103 } 104 } 105 106 if (substr($cmd, 0, 4) == 'book') { 107 $next_class = ''; 108 } 109 110 $ilNavigationHistory->addItem( 111 $this->ref_id, 112 "./goto.php?target=book_" . $this->ref_id, 113 "book" 114 ); 115 116 $this->prepareOutput(); 117 118 switch ($next_class) { 119 case 'ilpermissiongui': 120 $this->checkPermission('edit_permission'); 121 $this->tabs_gui->setTabActive('perm_settings'); 122 include_once("Services/AccessControl/classes/class.ilPermissionGUI.php"); 123 $perm_gui = new ilPermissionGUI($this); 124 $ret = &$this->ctrl->forwardCommand($perm_gui); 125 break; 126 127 case 'ilbookingobjectgui': 128 if (!$this->checkPermissionBool('read') && $this->checkPermissionBool('visible')) { 129 $this->ctrl->redirect($this, "infoScreen"); 130 } 131 $this->checkPermission('read'); 132 $this->tabs_gui->setTabActive('render'); 133 include_once("Modules/BookingManager/classes/class.ilBookingObjectGUI.php"); 134 $object_gui = new ilBookingObjectGUI($this); 135 $ret = &$this->ctrl->forwardCommand($object_gui); 136 break; 137 138 case 'ilbookingschedulegui': 139 $this->checkPermission('write'); 140 $this->tabs_gui->setTabActive('schedules'); 141 include_once("Modules/BookingManager/classes/class.ilBookingScheduleGUI.php"); 142 $schedule_gui = new ilBookingScheduleGUI($this); 143 $ret = &$this->ctrl->forwardCommand($schedule_gui); 144 break; 145 146 case 'ilpublicuserprofilegui': 147 $this->checkPermission('read'); 148 $ilTabs->clearTargets(); 149 include_once("Services/User/classes/class.ilPublicUserProfileGUI.php"); 150 $profile = new ilPublicUserProfileGUI($this->user_profile_id); 151 $profile->setBackUrl($this->ctrl->getLinkTarget($this, 'log')); 152 $ret = $this->ctrl->forwardCommand($profile); 153 $tpl->setContent($ret); 154 break; 155 156 case 'ilinfoscreengui': 157 $this->checkPermission('visible'); 158 $this->infoScreen(); 159 break; 160 161 case "ilcommonactiondispatchergui": 162 $this->checkPermission('read'); 163 include_once("Services/Object/classes/class.ilCommonActionDispatcherGUI.php"); 164 $gui = ilCommonActionDispatcherGUI::getInstanceFromAjaxCall(); 165 $this->ctrl->forwardCommand($gui); 166 break; 167 168 case "ilobjectcopygui": 169 $this->checkPermission('copy'); 170 include_once "./Services/Object/classes/class.ilObjectCopyGUI.php"; 171 $cp = new ilObjectCopyGUI($this); 172 $cp->setType("book"); 173 $this->ctrl->forwardCommand($cp); 174 break; 175 176 case 'ilobjectmetadatagui': 177 $this->checkPermission('write'); 178 $this->tabs_gui->setTabActive('meta_data'); 179 include_once 'Services/Object/classes/class.ilObjectMetaDataGUI.php'; 180 $md_gui = new ilObjectMetaDataGUI($this->object, 'bobj'); 181 $this->ctrl->forwardCommand($md_gui); 182 break; 183 184 case 'ilbookingparticipantgui': 185 $this->checkPermission('write'); 186 $this->tabs_gui->setTabActive('participants'); 187 include_once("Modules/BookingManager/classes/class.ilBookingParticipantGUI.php"); 188 $object_gui = new ilBookingParticipantGUI($this); 189 $this->ctrl->forwardCommand($object_gui); 190 break; 191 192 default: 193 if (!in_array($cmd, ["create", "save", "infoScreen"])) { 194 $this->checkPermission('read'); 195 } 196 $cmd = $this->ctrl->getCmd(); 197 $cmd .= 'Object'; 198 $this->$cmd(); 199 break; 200 } 201 202 $this->addHeaderAction(); 203 return true; 204 } 205 206 protected function initCreationForms($a_new_type) 207 { 208 $forms = parent::initCreationForms($a_new_type); 209 unset($forms[self::CFORM_IMPORT]); 210 211 return $forms; 212 } 213 214 protected function afterSave(ilObject $a_new_object) 215 { 216 $a_new_object->setOffline(true); 217 $a_new_object->update(); 218 219 // always send a message 220 ilUtil::sendSuccess($this->lng->txt("book_pool_added"), true); 221 $this->ctrl->setParameter($this, "ref_id", $a_new_object->getRefId()); 222 $this->ctrl->redirect($this, "edit"); 223 } 224 225 public function editObject() 226 { 227 $this->showNoScheduleMessage(); 228 return parent::editObject(); 229 } 230 231 /** 232 * Show no schedule message 233 * 234 * @param 235 * @return 236 */ 237 public function showNoScheduleMessage() 238 { 239 // if we have no schedules yet - show info 240 include_once "Modules/BookingManager/classes/class.ilBookingSchedule.php"; 241 if ($this->object->getScheduleType() != ilObjBookingPool::TYPE_NO_SCHEDULE && 242 !sizeof(ilBookingSchedule::getList($this->object->getId()))) { 243 ilUtil::sendInfo($this->lng->txt("book_schedule_warning_edit")); 244 } 245 } 246 247 248 protected function initEditCustomForm(ilPropertyFormGUI $a_form) 249 { 250 $obj_service = $this->getObjectService(); 251 252 $online = new ilCheckboxInputGUI($this->lng->txt("online"), "online"); 253 $a_form->addItem($online); 254 255 $type = new ilRadioGroupInputGUI($this->lng->txt("book_schedule_type"), "stype"); 256 $type->setRequired(true); 257 $a_form->addItem($type); 258 259 // #14478 260 include_once "Modules/BookingManager/classes/class.ilBookingObject.php"; 261 if (sizeof(ilBookingObject::getList($this->object->getId()))) { 262 $type->setDisabled(true); 263 } 264 265 $fixed = new ilRadioOption($this->lng->txt("book_schedule_type_fixed"), ilObjBookingPool::TYPE_FIX_SCHEDULE); 266 $fixed->setInfo($this->lng->txt("book_schedule_type_fixed_info")); 267 $type->addOption($fixed); 268 269 #23637 270 //period 271 $period = new ilNumberInputGUI($this->lng->txt("book_reservation_filter_period"), "period"); 272 $period->setInfo($this->lng->txt("book_reservation_filter_period_info")); 273 $period->setSuffix($this->lng->txt("days")); 274 $period->setSize(3); 275 $period->setMinValue(0); 276 $fixed->addSubItem($period); 277 278 // reminder 279 $rmd = new ilCheckboxInputGUI($this->lng->txt("book_reminder_setting"), "rmd"); 280 $rmd->setChecked($this->object->getReminderStatus()); 281 $fixed->addSubItem($rmd); 282 283 $rmd_day = new ilNumberInputGUI($this->lng->txt("book_reminder_day"), "rmd_day"); 284 $rmd_day->setRequired(true); 285 $rmd_day->setInfo($this->lng->txt("book_reminder_day_info")); 286 $rmd_day->setSize(3); 287 $rmd_day->setSuffix($this->lng->txt("book_reminder_days")); 288 $rmd_day->setValue(max($this->object->getReminderDay(), 1)); 289 $rmd_day->setMinValue(1); 290 $rmd->addSubItem($rmd_day); 291 292 $none = new ilRadioOption($this->lng->txt("book_schedule_type_none"), ilObjBookingPool::TYPE_NO_SCHEDULE); 293 $none->setInfo($this->lng->txt("book_schedule_type_none_info")); 294 $type->addOption($none); 295 296 $limit = new ilNumberInputGUI($this->lng->txt("book_overall_limit"), "limit"); 297 $limit->setSize(4); 298 $limit->setMinValue(1); 299 $limit->setInfo($this->lng->txt("book_overall_limit_info")); 300 $none->addSubItem($limit); 301 302 $public = new ilCheckboxInputGUI($this->lng->txt("book_public_log"), "public"); 303 $public->setInfo($this->lng->txt("book_public_log_info")); 304 $a_form->addItem($public); 305 306 // presentation 307 $pres = new ilFormSectionHeaderGUI(); 308 $pres->setTitle($this->lng->txt('obj_presentation')); 309 $a_form->addItem($pres); 310 311 // tile image 312 $obj_service->commonSettings()->legacyForm($a_form, $this->object)->addTileImage(); 313 314 // additional features 315 $feat = new ilFormSectionHeaderGUI(); 316 $feat->setTitle($this->lng->txt('obj_features')); 317 $a_form->addItem($feat); 318 } 319 320 protected function getEditFormCustomValues(array &$a_values) 321 { 322 $a_values["online"] = !$this->object->isOffline(); 323 $a_values["public"] = $this->object->hasPublicLog(); 324 $a_values["stype"] = $this->object->getScheduleType(); 325 $a_values["limit"] = $this->object->getOverallLimit(); 326 $a_values["period"] = $this->object->getReservationFilterPeriod(); 327 $a_values["rmd"] = $this->object->getReminderStatus(); 328 $a_values["rmd_day"] = $this->object->getReminderDay(); 329 } 330 331 protected function updateCustom(ilPropertyFormGUI $a_form) 332 { 333 $obj_service = $this->getObjectService(); 334 335 $this->object->setOffline(!$a_form->getInput('online')); 336 $this->object->setReminderStatus($a_form->getInput('rmd')); 337 $this->object->setReminderDay($a_form->getInput('rmd_day')); 338 $this->object->setPublicLog($a_form->getInput('public')); 339 $this->object->setScheduleType($a_form->getInput('stype')); 340 $this->object->setOverallLimit($a_form->getInput('limit') ? $a_form->getInput('limit') : null); 341 $this->object->setReservationFilterPeriod(strlen($a_form->getInput('period')) ? (int) $a_form->getInput('period') : null); 342 343 // tile image 344 $obj_service->commonSettings()->legacyForm($a_form, $this->object)->saveTileImage(); 345 346 include_once './Services/Container/classes/class.ilContainer.php'; 347 include_once './Services/Object/classes/class.ilObjectServiceSettingsGUI.php'; 348 ilObjectServiceSettingsGUI::updateServiceSettingsForm( 349 $this->object->getId(), 350 $a_form, 351 array(ilObjectServiceSettingsGUI::CUSTOM_METADATA) 352 ); 353 } 354 355 public function addExternalEditFormCustom(ilPropertyFormGUI $a_form) 356 { 357 include_once './Services/Container/classes/class.ilContainer.php'; 358 include_once './Services/Object/classes/class.ilObjectServiceSettingsGUI.php'; 359 ilObjectServiceSettingsGUI::initServiceSettingsForm( 360 $this->object->getId(), 361 $a_form, 362 array(ilObjectServiceSettingsGUI::CUSTOM_METADATA) 363 ); 364 } 365 366 /** 367 * get tabs 368 */ 369 public function setTabs() 370 { 371 $ilHelp = $this->help; 372 $ilUser = $this->user; 373 374 if (in_array($this->ctrl->getCmd(), array("create", "save")) && !$this->ctrl->getNextClass()) { 375 return; 376 } 377 378 $ilHelp->setScreenIdComponent("book"); 379 380 if ($this->checkPermissionBool('read')) { 381 if ($ilUser->getId() != ANONYMOUS_USER_ID) { 382 $this->tabs_gui->addTab( 383 "render", 384 $this->lng->txt("book_booking_types"), 385 $this->ctrl->getLinkTarget($this, "render") 386 ); 387 } 388 389 $this->tabs_gui->addTab( 390 "info", 391 $this->lng->txt("info_short"), 392 $this->ctrl->getLinkTarget($this, "infoscreen") 393 ); 394 395 if ($ilUser->getId() != ANONYMOUS_USER_ID || $this->object->hasPublicLog()) { 396 $this->tabs_gui->addTab( 397 "log", 398 $this->lng->txt("book_log"), 399 $this->ctrl->getLinkTarget($this, "log") 400 ); 401 } 402 } 403 404 if ($this->checkPermissionBool('write')) { 405 if ($this->object->getScheduleType() != ilObjBookingPool::TYPE_NO_SCHEDULE) { 406 $this->tabs_gui->addTab( 407 "schedules", 408 $this->lng->txt("book_schedules"), 409 $this->ctrl->getLinkTargetByClass("ilbookingschedulegui", "render") 410 ); 411 } 412 413 $this->tabs_gui->addTab( 414 "settings", 415 $this->lng->txt("settings"), 416 $this->ctrl->getLinkTarget($this, "edit") 417 ); 418 419 // meta data 420 include_once "Services/Object/classes/class.ilObjectMetaDataGUI.php"; 421 $mdgui = new ilObjectMetaDataGUI($this->object, "bobj"); 422 $mdtab = $mdgui->getTab(); 423 if ($mdtab) { 424 $this->tabs_gui->addTarget( 425 "meta_data", 426 $mdtab, 427 "", 428 "ilobjectmetadatagui" 429 ); 430 } 431 } 432 433 if ($this->checkPermissionBool('write')) { 434 $this->tabs_gui->addTab( 435 "participants", 436 $this->lng->txt("participants"), 437 $this->ctrl->getLinkTargetByClass("ilbookingparticipantgui", "render") 438 ); 439 } 440 441 if ($this->checkPermissionBool('edit_permission')) { 442 $this->tabs_gui->addTab( 443 "perm_settings", 444 $this->lng->txt("perm_settings"), 445 $this->ctrl->getLinkTargetByClass("ilpermissiongui", "perm") 446 ); 447 } 448 } 449 450 protected function setHelpId($a_id) 451 { 452 $ilHelp = $this->help; 453 454 $object_subtype = ($this->object->getScheduleType() == ilObjBookingPool::TYPE_FIX_SCHEDULE) 455 ? '-schedule' 456 : '-nonschedule'; 457 458 $ilHelp->setScreenIdComponent('book'); 459 $ilHelp->setScreenId('object' . $object_subtype); 460 $ilHelp->setSubScreenId($a_id); 461 } 462 463 /** 464 * First step in booking process 465 */ 466 public function bookObject() 467 { 468 $tpl = $this->tpl; 469 470 $this->tabs_gui->clearTargets(); 471 $this->tabs_gui->setBackTarget($this->lng->txt('book_back_to_list'), $this->ctrl->getLinkTarget($this, 'render')); 472 473 $this->setHelpId("book"); 474 475 include_once 'Modules/BookingManager/classes/class.ilBookingObject.php'; 476 $obj = new ilBookingObject((int) $_GET['object_id']); 477 478 $this->lng->loadLanguageModule("dateplaner"); 479 $this->ctrl->setParameter($this, 'object_id', $obj->getId()); 480 481 if ($this->user_id_to_book != $this->user_id_assigner) { 482 $this->ctrl->setParameter($this, 'bkusr', $this->user_id_to_book); 483 } 484 485 if ($this->object->getScheduleType() == ilObjBookingPool::TYPE_FIX_SCHEDULE) { 486 include_once 'Modules/BookingManager/classes/class.ilBookingSchedule.php'; 487 $schedule = new ilBookingSchedule($obj->getScheduleId()); 488 489 $tpl->setContent($this->renderSlots($schedule, array($obj->getId()), $obj->getTitle())); 490 } else { 491 include_once("./Services/Utilities/classes/class.ilConfirmationGUI.php"); 492 $cgui = new ilConfirmationGUI(); 493 $cgui->setHeaderText($this->lng->txt("book_confirm_booking_no_schedule")); 494 495 $cgui->setFormAction($this->ctrl->getFormAction($this)); 496 $cgui->setCancel($this->lng->txt("cancel"), "render"); 497 $cgui->setConfirm($this->lng->txt("confirm"), "confirmedBooking"); 498 499 $cgui->addItem("object_id", $obj->getId(), $obj->getTitle()); 500 501 if ($_GET['part_view'] == ilBookingParticipantGUI::PARTICIPANT_VIEW) { 502 $cgui->addHiddenItem("part_view", ilBookingParticipantGUI::PARTICIPANT_VIEW); 503 } 504 505 $tpl->setContent($cgui->getHTML()); 506 } 507 } 508 509 protected function renderSlots(ilBookingSchedule $schedule, array $object_ids, $title) 510 { 511 $ilUser = $this->user; 512 513 // fix 514 if (!$schedule->getRaster()) { 515 $mytpl = new ilTemplate('tpl.booking_reservation_fix.html', true, true, 'Modules/BookingManager'); 516 517 $mytpl->setVariable('FORM_ACTION', $this->ctrl->getFormAction($this)); 518 $mytpl->setVariable('TXT_TITLE', $this->lng->txt('book_reservation_title')); 519 $mytpl->setVariable('TXT_INFO', $this->lng->txt('book_reservation_fix_info')); 520 $mytpl->setVariable('TXT_OBJECT', $title); 521 $mytpl->setVariable('TXT_CMD_BOOK', $this->lng->txt('book_confirm_booking')); 522 $mytpl->setVariable('TXT_CMD_CANCEL', $this->lng->txt('cancel')); 523 524 include_once 'Services/Calendar/classes/class.ilCalendarUserSettings.php'; 525 526 $user_settings = ilCalendarUserSettings::_getInstanceByUserId($ilUser->getId()); 527 528 $morning_aggr = $user_settings->getDayStart(); 529 $evening_aggr = $user_settings->getDayEnd(); 530 $hours = array(); 531 for ($i = $morning_aggr;$i <= $evening_aggr;$i++) { 532 switch ($user_settings->getTimeFormat()) { 533 case ilCalendarSettings::TIME_FORMAT_24: 534 if ($morning_aggr > 0 && $i == $morning_aggr) { 535 $hours[$i] = sprintf('%02d:00', 0) . "-"; 536 } 537 $hours[$i] .= sprintf('%02d:00', $i); 538 if ($evening_aggr < 23 && $i == $evening_aggr) { 539 $hours[$i] .= "-" . sprintf('%02d:00', 23); 540 } 541 break; 542 543 case ilCalendarSettings::TIME_FORMAT_12: 544 if ($morning_aggr > 0 && $i == $morning_aggr) { 545 $hours[$i] = date('h a', mktime(0, 0, 0, 1, 1, 2000)) . "-"; 546 } 547 $hours[$i] .= date('h a', mktime($i, 0, 0, 1, 1, 2000)); 548 if ($evening_aggr < 23 && $i == $evening_aggr) { 549 $hours[$i] .= "-" . date('h a', mktime(23, 0, 0, 1, 1, 2000)); 550 } 551 break; 552 } 553 } 554 555 if ($this->seed != "") { 556 $find_first_open = false; 557 $seed = new ilDate($this->seed, IL_CAL_DATE); 558 } else { 559 $find_first_open = true; 560 $seed = ($this->sseed != "") 561 ? new ilDate($this->sseed, IL_CAL_DATE) 562 : new ilDate(time(), IL_CAL_UNIX); 563 } 564 565 include_once 'Services/Calendar/classes/class.ilCalendarUtil.php'; 566 include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php'; 567 $week_start = $user_settings->getWeekStart(); 568 569 if (!$find_first_open) { 570 $dates = array(); 571 $this->buildDatesBySchedule($week_start, $hours, $schedule, $object_ids, $seed, $dates); 572 } else { 573 $dates = array(); 574 575 //loop for 1 week 576 $has_open_slot = $this->buildDatesBySchedule($week_start, $hours, $schedule, $object_ids, $seed, $dates); 577 578 // find first open slot 579 if (!$has_open_slot) { 580 // 1 year is limit for search 581 $limit = clone($seed); 582 $limit->increment(ilDate::YEAR, 1); 583 $limit = $limit->get(IL_CAL_UNIX); 584 585 while (!$has_open_slot && $seed->get(IL_CAL_UNIX) < $limit) { 586 $seed->increment(ilDate::WEEK, 1); 587 588 $dates = array(); 589 $has_open_slot = $this->buildDatesBySchedule($week_start, $hours, $schedule, $object_ids, $seed, $dates); 590 } 591 } 592 } 593 594 include_once 'Services/Calendar/classes/class.ilCalendarHeaderNavigationGUI.php'; 595 $navigation = new ilCalendarHeaderNavigationGUI($this, $seed, ilDateTime::WEEK, 'book'); 596 $mytpl->setVariable('NAVIGATION', $navigation->getHTML()); 597 598 foreach (ilCalendarUtil::_buildWeekDayList($seed, $week_start)->get() as $date) { 599 $date_info = $date->get(IL_CAL_FKT_GETDATE, '', 'UTC'); 600 601 $mytpl->setCurrentBlock('weekdays'); 602 $mytpl->setVariable('TXT_WEEKDAY', ilCalendarUtil:: _numericDayToString($date_info['wday'])); 603 $mytpl->setVariable('TXT_DATE', $date_info['mday'] . ' ' . ilCalendarUtil:: _numericMonthToString($date_info['mon'])); 604 $mytpl->parseCurrentBlock(); 605 } 606 607 include_once 'Services/Calendar/classes/class.ilCalendarAppointmentColors.php'; 608 include_once 'Services/Calendar/classes/class.ilCalendarUtil.php'; 609 $color = array(); 610 $all = ilCalendarAppointmentColors::_getColorsByType('crs'); 611 for ($loop = 0; $loop < 7; $loop++) { 612 $col = $all[$loop]; 613 $fnt = ilCalendarUtil::calculateFontColor($col); 614 $color[$loop + 1] = 'border-bottom: 1px solid ' . $col . '; background-color: ' . $col . '; color: ' . $fnt; 615 } 616 617 $counter = 0; 618 foreach ($dates as $hour => $days) { 619 $caption = $days; 620 $caption = array_shift($caption); 621 622 for ($loop = 1; $loop < 8; $loop++) { 623 if (!isset($days[$loop])) { 624 $mytpl->setCurrentBlock('dates'); 625 $mytpl->setVariable('DUMMY', ' '); 626 $mytpl->parseCurrentBlock(); 627 } else { 628 if (isset($days[$loop]['captions'])) { 629 foreach ($days[$loop]['captions'] as $slot_id => $slot_caption) { 630 $mytpl->setCurrentBlock('choice'); 631 $mytpl->setVariable('TXT_DATE', $slot_caption); 632 $mytpl->setVariable('VALUE_DATE', $slot_id); 633 $mytpl->setVariable('DATE_COLOR', $color[$loop]); 634 $mytpl->setVariable( 635 'TXT_AVAILABLE', 636 sprintf( 637 $this->lng->txt('book_reservation_available'), 638 $days[$loop]['available'][$slot_id] 639 ) 640 ); 641 $mytpl->parseCurrentBlock(); 642 } 643 644 $mytpl->setCurrentBlock('dates'); 645 $mytpl->setVariable('DUMMY', ''); 646 $mytpl->parseCurrentBlock(); 647 } elseif (isset($days[$loop]['in_slot'])) { 648 $mytpl->setCurrentBlock('dates'); 649 $mytpl->setVariable('DATE_COLOR', $color[$loop]); 650 $mytpl->parseCurrentBlock(); 651 } else { 652 $mytpl->setCurrentBlock('dates'); 653 $mytpl->setVariable('DUMMY', ' '); 654 $mytpl->parseCurrentBlock(); 655 } 656 } 657 } 658 659 $mytpl->setCurrentBlock('slots'); 660 $mytpl->setVariable('TXT_HOUR', $caption); 661 if ($counter % 2) { 662 $mytpl->setVariable('CSS_ROW', 'tblrow1'); 663 } else { 664 $mytpl->setVariable('CSS_ROW', 'tblrow2'); 665 } 666 $mytpl->parseCurrentBlock(); 667 668 $counter++; 669 } 670 } 671 // flexible 672 else { 673 // :TODO: inactive for now 674 } 675 676 return $mytpl->get(); 677 } 678 679 protected function buildDatesBySchedule($week_start, array $hours, $schedule, array $object_ids, $seed, array &$dates) 680 { 681 $ilUser = $this->user; 682 683 include_once 'Services/Calendar/classes/class.ilCalendarUserSettings.php'; 684 $user_settings = ilCalendarUserSettings::_getInstanceByUserId($ilUser->getId()); 685 686 $map = array('mo', 'tu', 'we', 'th', 'fr', 'sa', 'su'); 687 $definition = $schedule->getDefinition(); 688 689 $av_from = ($schedule->getAvailabilityFrom() && !$schedule->getAvailabilityFrom()->isNull()) 690 ? $schedule->getAvailabilityFrom()->get(IL_CAL_DATE) 691 : null; 692 $av_to = ($schedule->getAvailabilityTo() && !$schedule->getAvailabilityTo()->isNull()) 693 ? $schedule->getAvailabilityTo()->get(IL_CAL_DATE) 694 : null; 695 696 $has_open_slot = false; 697 foreach (ilCalendarUtil::_buildWeekDayList($seed, $week_start)->get() as $date) { 698 $date_info = $date->get(IL_CAL_FKT_GETDATE, '', 'UTC'); 699 700 #24045 and #24936 701 if ($av_from || $av_to) { 702 $today = $date->get(IL_CAL_DATE); 703 704 if ($av_from && $av_from > $today) { 705 continue; 706 } 707 708 if ($av_to && $av_to < $today) { 709 continue; 710 } 711 } 712 713 $slots = array(); 714 if (isset($definition[$map[$date_info['isoday'] - 1]])) { 715 $slots = array(); 716 foreach ($definition[$map[$date_info['isoday'] - 1]] as $slot) { 717 $slot = explode('-', $slot); 718 $slots[] = array('from' => str_replace(':', '', $slot[0]), 719 'to' => str_replace(':', '', $slot[1])); 720 } 721 } 722 723 $last = array_pop(array_keys($hours)); 724 $slot_captions = array(); 725 foreach ($hours as $hour => $period) { 726 $dates[$hour][0] = $period; 727 728 $period = explode("-", $period); 729 730 // #13738 731 if ($user_settings->getTimeFormat() == ilCalendarSettings::TIME_FORMAT_12) { 732 $period[0] = date("H", strtotime($period[0])); 733 if (sizeof($period) == 2) { 734 $period[1] = date("H", strtotime($period[1])); 735 } 736 } 737 738 if (sizeof($period) == 1) { 739 $period_from = (int) substr($period[0], 0, 2) . "00"; 740 $period_to = (int) substr($period[0], 0, 2) . "59"; 741 } else { 742 $period_from = (int) substr($period[0], 0, 2) . "00"; 743 $period_to = (int) substr($period[1], 0, 2) . "59"; 744 } 745 746 $column = $date_info['isoday']; 747 if (!$week_start) { 748 if ($column < 7) { 749 $column++; 750 } else { 751 $column = 1; 752 } 753 } 754 755 if (sizeof($slots)) { 756 $in = false; 757 foreach ($slots as $slot) { 758 $slot_from = mktime(substr($slot['from'], 0, 2), substr($slot['from'], 2, 2), 0, $date_info["mon"], $date_info["mday"], $date_info["year"]); 759 $slot_to = mktime(substr($slot['to'], 0, 2), substr($slot['to'], 2, 2), 0, $date_info["mon"], $date_info["mday"], $date_info["year"]); 760 761 // always single object, we can sum up 762 $nr_available = (array) ilBookingReservation::getAvailableObject($object_ids, $slot_from, $slot_to - 1, false, true); 763 764 // any objects available? 765 if (!array_sum($nr_available)) { 766 continue; 767 } 768 769 // check deadline 770 if ($schedule->getDeadline() >= 0) { 771 // 0-n hours before slots begins 772 if ($slot_from < (time() + $schedule->getDeadline() * 60 * 60)) { 773 continue; 774 } 775 } else { 776 // running slots can be booked, only ended slots are invalid 777 if ($slot_to < time()) { 778 continue; 779 } 780 } 781 782 // is slot active in current hour? 783 if ((int) $slot['from'] < $period_to && (int) $slot['to'] > $period_from) { 784 $from = ilDatePresentation::formatDate(new ilDateTime($slot_from, IL_CAL_UNIX)); 785 $from = array_pop(explode(' ', $from)); 786 $to = ilDatePresentation::formatDate(new ilDateTime($slot_to, IL_CAL_UNIX)); 787 $to = array_pop(explode(' ', $to)); 788 789 // show caption (first hour) of slot 790 $id = $slot_from . '_' . $slot_to; 791 if (!in_array($id, $slot_captions)) { 792 $dates[$hour][$column]['captions'][$id] = $from . '-' . $to; 793 $dates[$hour][$column]['available'][$id] = array_sum($nr_available); 794 $slot_captions[] = $id; 795 } 796 797 $in = true; 798 } 799 } 800 // (any) active slot 801 if ($in) { 802 $has_open_slot = true; 803 $dates[$hour][$column]['in_slot'] = $in; 804 } 805 } 806 } 807 } 808 809 return $has_open_slot; 810 } 811 812 /** 813 * Book object - either of type or specific - for given dates 814 */ 815 public function confirmedBookingObject() 816 { 817 $ilUser = $this->user; 818 819 include_once 'Modules/BookingManager/classes/class.ilBookingObject.php'; 820 include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php'; 821 822 $success = false; 823 $rsv_ids = array(); 824 825 if ($this->object->getScheduleType() == ilObjBookingPool::TYPE_NO_SCHEDULE) { 826 if ($this->book_obj_id > 0) { 827 $object_id = $this->book_obj_id; 828 if ($object_id) { 829 if (ilBookingReservation::isObjectAvailableNoSchedule($object_id) && 830 !ilBookingReservation::getObjectReservationForUser($object_id, $this->user_id_to_book)) { // #18304 831 $rsv_ids[] = $this->processBooking($object_id); 832 $success = $object_id; 833 } else { 834 // #11852 835 ilUtil::sendFailure($this->lng->txt('book_reservation_failed_overbooked'), true); 836 $this->ctrl->redirect($this, 'render'); 837 } 838 } 839 } 840 } else { 841 if (!isset($_POST['date'])) { 842 ilUtil::sendFailure($this->lng->txt('select_one')); 843 return $this->bookObject(); 844 } 845 846 // single object reservation(s) 847 if ($this->book_obj_id > 0) { 848 $confirm = array(); 849 850 $object_id = $this->book_obj_id; 851 if ($object_id) { 852 $group_id = null; 853 $nr = ilBookingObject::getNrOfItemsForObjects(array($object_id)); 854 // needed for recurrence 855 $group_id = ilBookingReservation::getNewGroupId(); 856 foreach ($_POST['date'] as $date) { 857 $fromto = explode('_', $date); 858 $fromto[1]--; 859 860 $counter = ilBookingReservation::getAvailableObject(array($object_id), $fromto[0], $fromto[1], false, true); 861 $counter = $counter[$object_id]; 862 if ($counter) { 863 // needed for recurrence 864 $confirm[$object_id . "_" . $fromto[0] . "_" . ($fromto[1] + 1)] = $counter; 865 } 866 } 867 } 868 869 if (sizeof($confirm)) { 870 return $this->confirmBookingNumbers($confirm, $group_id); 871 } 872 } 873 } 874 875 if ($success) { 876 $this->saveParticipant(); 877 $this->handleBookingSuccess($success, $rsv_ids); 878 } else { 879 ilUtil::sendFailure($this->lng->txt('book_reservation_failed'), true); 880 $this->ctrl->redirect($this, 'book'); 881 } 882 } 883 884 protected function handleBookingSuccess($a_obj_id, array $a_rsv_ids = null) 885 { 886 ilUtil::sendSuccess($this->lng->txt('book_reservation_confirmed'), true); 887 888 // show post booking information? 889 include_once 'Modules/BookingManager/classes/class.ilBookingObject.php'; 890 $obj = new ilBookingObject($a_obj_id); 891 $pfile = $obj->getPostFile(); 892 $ptext = $obj->getPostText(); 893 if (trim($ptext) || $pfile) { 894 if (sizeof($a_rsv_ids)) { 895 $this->ctrl->setParameterByClass('ilbookingobjectgui', 'rsv_ids', implode(";", $a_rsv_ids)); 896 } 897 $this->ctrl->setParameterByClass('ilbookingobjectgui', 'object_id', $obj->getId()); 898 $this->ctrl->redirectByClass('ilbookingobjectgui', 'displayPostInfo'); 899 } else { 900 if ($_POST['part_view'] == ilBookingParticipantGUI::PARTICIPANT_VIEW) { 901 $this->ctrl->redirectByClass('ilbookingparticipantgui', 'render'); 902 } else { 903 $this->ctrl->redirect($this, 'render'); 904 } 905 } 906 } 907 908 protected function initBookingNumbersForm(array $a_objects_counter, $a_group_id, $a_reload = false) 909 { 910 include_once 'Services/Form/classes/class.ilPropertyFormGUI.php'; 911 $form = new ilPropertyFormGUI(); 912 $form->setFormAction($this->ctrl->getFormAction($this, "confirmedBooking")); 913 $form->setTitle($this->lng->txt("book_confirm_booking_schedule_number_of_objects")); 914 $form->setDescription($this->lng->txt("book_confirm_booking_schedule_number_of_objects_info")); 915 916 include_once 'Modules/BookingManager/classes/class.ilBookingObject.php'; 917 $section = false; 918 $min_date = null; 919 foreach ($a_objects_counter as $id => $counter) { 920 $id = explode("_", $id); 921 $book_id = $id[0] . "_" . $id[1] . "_" . $id[2] . "_" . $counter; 922 923 $obj = new ilBookingObject($id[0]); 924 925 if (!$section) { 926 $section = new ilFormSectionHeaderGUI(); 927 $section->setTitle($obj->getTitle()); 928 $form->addItem($section); 929 930 $section = true; 931 } 932 933 $period = /* $this->lng->txt("book_period").": ". */ 934 ilDatePresentation::formatPeriod( 935 new ilDateTime($id[1], IL_CAL_UNIX), 936 new ilDateTime($id[2], IL_CAL_UNIX) 937 ); 938 939 $nr_field = new ilNumberInputGUI($period, "conf_nr__" . $book_id); 940 $nr_field->setValue(1); 941 $nr_field->setSize(3); 942 $nr_field->setMaxValue($counter); 943 $nr_field->setMinValue($counter ? 1 : 0); 944 $nr_field->setRequired(true); 945 $form->addItem($nr_field); 946 947 if (!$min_date || $id[1] < $min_date) { 948 $min_date = $id[1]; 949 } 950 } 951 952 // recurrence 953 $this->lng->loadLanguageModule("dateplaner"); 954 $rec_mode = new ilSelectInputGUI($this->lng->txt("cal_recurrences"), "recm"); 955 $rec_mode->setRequired(true); 956 $rec_mode->setOptions(array( 957 "-1" => $this->lng->txt("cal_no_recurrence"), 958 1 => $this->lng->txt("cal_weekly"), 959 2 => $this->lng->txt("r_14"), 960 4 => $this->lng->txt("r_4_weeks") 961 )); 962 $form->addItem($rec_mode); 963 964 $rec_end = new ilDateTimeInputGUI($this->lng->txt("cal_repeat_until"), "rece"); 965 $rec_end->setRequired(true); 966 $rec_mode->addSubItem($rec_end); 967 968 if (!$a_reload) { 969 // show date only if active recurrence 970 $rec_mode->setHideSubForm(true, '>= 1'); 971 972 if ($min_date) { 973 $rec_end->setDate(new ilDateTime($min_date, IL_CAL_UNIX)); 974 } 975 } else { 976 // recurrence may not be changed on reload 977 $rec_mode->setDisabled(true); 978 $rec_end->setDisabled(true); 979 } 980 981 if ($a_group_id) { 982 $grp = new ilHiddenInputGUI("grp_id"); 983 $grp->setValue($a_group_id); 984 $form->addItem($grp); 985 } 986 987 if ($this->user_id_assigner != $this->user_id_to_book) { 988 $usr = new ilHiddenInputGUI("bkusr"); 989 $usr->setValue($this->user_id_to_book); 990 $form->addItem($usr); 991 } 992 993 $form->addCommandButton("confirmedBookingNumbers", $this->lng->txt("confirm")); 994 $form->addCommandButton("render", $this->lng->txt("cancel")); 995 996 return $form; 997 } 998 999 public function confirmBookingNumbers(array $a_objects_counter, $a_group_id, ilPropertyFormGUI $a_form = null) 1000 { 1001 $tpl = $this->tpl; 1002 1003 $this->tabs_gui->clearTargets(); 1004 $this->tabs_gui->setBackTarget($this->lng->txt('book_back_to_list'), $this->ctrl->getLinkTarget($this, 'render')); 1005 1006 if (!$a_form) { 1007 $a_form = $this->initBookingNumbersForm($a_objects_counter, $a_group_id); 1008 } 1009 1010 $tpl->setContent($a_form->getHTML()); 1011 } 1012 1013 protected function addDaysDate($a_date, $a_days) 1014 { 1015 $date = date_parse($a_date); 1016 $stamp = mktime(0, 0, 1, $date["month"], $date["day"] + $a_days, $date["year"]); 1017 return date("Y-m-d", $stamp); 1018 } 1019 1020 protected function addDaysStamp($a_stamp, $a_days) 1021 { 1022 $date = getDate($a_stamp); 1023 return mktime( 1024 $date["hours"], 1025 $date["minutes"], 1026 $date["seconds"], 1027 $date["mon"], 1028 $date["mday"] + $a_days, 1029 $date["year"] 1030 ); 1031 } 1032 1033 public function confirmedBookingNumbersObject() 1034 { 1035 include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php'; 1036 include_once 'Modules/BookingManager/classes/class.ilBookingObject.php'; 1037 1038 //get the user who will get the booking. 1039 if ($_POST['bkusr']) { 1040 $this->user_id_to_book = (int) $_POST['bkusr']; 1041 } 1042 1043 // convert post data to initial form config 1044 $counter = array(); 1045 $current_first = $obj_id = null; 1046 foreach (array_keys($_POST) as $id) { 1047 if (substr($id, 0, 9) == "conf_nr__") { 1048 $id = explode("_", substr($id, 9)); 1049 $counter[$id[0] . "_" . $id[1] . "_" . $id[2]] = (int) $id[3]; 1050 if (!$current_first) { 1051 $current_first = date("Y-m-d", $id[1]); 1052 } 1053 } 1054 } 1055 1056 // recurrence 1057 1058 // checkInput() has not been called yet, so we have to improvise 1059 include_once 'Services/Calendar/classes/class.ilCalendarUtil.php'; 1060 $end = ilCalendarUtil::parseIncomingDate($_POST["rece"], null); 1061 1062 if ((int) $_POST["recm"] > 0 && $end && $current_first) { 1063 ksort($counter); 1064 $end = $end->get(IL_CAL_DATE); 1065 $cycle = (int) $_POST["recm"] * 7; 1066 $cut = 0; 1067 $org = $counter; 1068 while ($cut < 1000 && $this->addDaysDate($current_first, $cycle) <= $end) { 1069 $cut++; 1070 $current_first = null; 1071 foreach ($org as $item_id => $max) { 1072 $parts = explode("_", $item_id); 1073 $obj_id = $parts[0]; 1074 1075 $from = $this->addDaysStamp($parts[1], $cycle * $cut); 1076 $to = $this->addDaysStamp($parts[2], $cycle * $cut); 1077 1078 $new_item_id = $obj_id . "_" . $from . "_" . $to; 1079 1080 // form reload because of validation errors 1081 if (!isset($counter[$new_item_id]) && date("Y-m-d", $to) <= $end) { 1082 // get max available for added dates 1083 $new_max = ilBookingReservation::getAvailableObject(array($obj_id), $from, $to - 1, false, true); 1084 $new_max = (int) $new_max[$obj_id]; 1085 1086 $counter[$new_item_id] = $new_max; 1087 1088 if (!$current_first) { 1089 $current_first = date("Y-m-d", $from); 1090 } 1091 1092 // clone input 1093 $_POST["conf_nr__" . $new_item_id . "_" . $new_max] = $_POST["conf_nr__" . $item_id . "_" . $max]; 1094 } 1095 } 1096 } 1097 } 1098 1099 $group_id = $_POST["grp_id"]; 1100 1101 $form = $this->initBookingNumbersForm($counter, $group_id, true); 1102 if ($form->checkInput()) { 1103 $success = false; 1104 $rsv_ids = array(); 1105 foreach ($counter as $id => $all_nr) { 1106 $book_nr = $form->getInput("conf_nr__" . $id . "_" . $all_nr); 1107 $parts = explode("_", $id); 1108 $obj_id = $parts[0]; 1109 $from = $parts[1]; 1110 $to = $parts[2] - 1; 1111 1112 // get currently available slots 1113 $counter = ilBookingReservation::getAvailableObject(array($obj_id), $from, $to, false, true); 1114 $counter = $counter[$obj_id]; 1115 if ($counter) { 1116 // we can only book what is left 1117 $book_nr = min($book_nr, $counter); 1118 for ($loop = 0; $loop < $book_nr; $loop++) { 1119 $rsv_ids[] = $this->processBooking($obj_id, $from, $to, $group_id); 1120 $success = $obj_id; 1121 } 1122 } 1123 } 1124 if ($success) { 1125 $this->saveParticipant(); 1126 $this->handleBookingSuccess($success, $rsv_ids); 1127 } else { 1128 ilUtil::sendFailure($this->lng->txt('book_reservation_failed'), true); 1129 $this->ctrl->redirect($this, 'render'); 1130 } 1131 } else { 1132 // ilDateTimeInputGUI does NOT add hidden values on disabled! 1133 1134 $rece_array = explode(".", $_POST['rece']); 1135 1136 $rece_day = str_pad($rece_array[0], 2, "0", STR_PAD_LEFT); 1137 $rece_month = str_pad($rece_array[1], 2, "0", STR_PAD_LEFT); 1138 $rece_year = $rece_array[2]; 1139 1140 // ilDateTimeInputGUI will choke on POST array format 1141 $_POST["rece"] = null; 1142 1143 $form->setValuesByPost(); 1144 1145 $rece_date = new ilDate($rece_year . "-" . $rece_month . "-" . $rece_day, IL_CAL_DATE); 1146 1147 $form->getItemByPostVar("rece")->setDate($rece_date); 1148 $form->getItemByPostVar("recm")->setHideSubForm($_POST["recm"] < 1); 1149 1150 $hidden_date = new ilHiddenInputGUI("rece"); 1151 $hidden_date->setValue($rece_date); 1152 $form->addItem($hidden_date); 1153 1154 return $this->confirmBookingNumbers($counter, $group_id, $form); 1155 } 1156 } 1157 1158 /** 1159 * Book object for date 1160 * 1161 * @param int $a_object_id 1162 * @param int $a_from timestamp 1163 * @param int $a_to timestamp 1164 * @param int $a_group_id 1165 * @return int 1166 */ 1167 public function processBooking($a_object_id, $a_from = null, $a_to = null, $a_group_id = null) 1168 { 1169 // #11995 1170 $this->checkPermission('read'); 1171 1172 include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php'; 1173 $reservation = new ilBookingReservation(); 1174 $reservation->setObjectId($a_object_id); 1175 $reservation->setUserId($this->user_id_to_book); 1176 $reservation->setAssignerId($this->user_id_assigner); 1177 $reservation->setFrom($a_from); 1178 $reservation->setTo($a_to); 1179 $reservation->setGroupId($a_group_id); 1180 $reservation->save(); 1181 1182 if ($a_from) { 1183 $this->lng->loadLanguageModule('dateplaner'); 1184 include_once 'Services/Calendar/classes/class.ilCalendarUtil.php'; 1185 include_once 'Services/Calendar/classes/class.ilCalendarCategory.php'; 1186 $def_cat = ilCalendarUtil::initDefaultCalendarByType(ilCalendarCategory::TYPE_BOOK, $this->user_id_to_book, $this->lng->txt('cal_ch_personal_book'), true); 1187 1188 include_once 'Modules/BookingManager/classes/class.ilBookingObject.php'; 1189 $object = new ilBookingObject($a_object_id); 1190 1191 include_once 'Services/Calendar/classes/class.ilCalendarEntry.php'; 1192 $entry = new ilCalendarEntry; 1193 $entry->setStart(new ilDateTime($a_from, IL_CAL_UNIX)); 1194 $entry->setEnd(new ilDateTime($a_to, IL_CAL_UNIX)); 1195 $entry->setTitle($this->lng->txt('book_cal_entry') . ' ' . $object->getTitle()); 1196 $entry->setContextId($reservation->getId()); 1197 $entry->save(); 1198 1199 include_once 'Services/Calendar/classes/class.ilCalendarCategoryAssignments.php'; 1200 $assignment = new ilCalendarCategoryAssignments($entry->getEntryId()); 1201 $assignment->addAssignment($def_cat->getCategoryId()); 1202 } 1203 1204 return $reservation->getId(); 1205 } 1206 1207 /** 1208 * List reservations 1209 */ 1210 public function logObject() 1211 { 1212 $tpl = $this->tpl; 1213 1214 $this->tabs_gui->setTabActive('log'); 1215 1216 $show_all = ($this->checkPermissionBool('write') || $this->object->hasPublicLog()); 1217 1218 $filter = null; 1219 if ($this->book_obj_id > 0) { 1220 $filter["object"] = $this->book_obj_id; 1221 } 1222 1223 // coming from participants tab to cancel reservations. 1224 if ($_GET['user_id']) { 1225 $filter["user_id"] = (int) $_GET['user_id']; 1226 } 1227 1228 include_once 'Modules/BookingManager/classes/class.ilBookingReservationsTableGUI.php'; 1229 $table = new ilBookingReservationsTableGUI( 1230 $this, 1231 'log', 1232 $this->ref_id, 1233 $this->object->getId(), 1234 $show_all, 1235 ($this->object->getScheduleType() != ilObjBookingPool::TYPE_NO_SCHEDULE), 1236 $filter 1237 ); 1238 $tpl->setContent($table->getHTML()); 1239 } 1240 1241 public function logDetailsObject() 1242 { 1243 $tpl = $this->tpl; 1244 1245 $this->tabs_gui->clearTargets(); 1246 $this->tabs_gui->setBackTarget( 1247 $this->lng->txt("back"), 1248 $this->ctrl->getLinkTarget($this, "log") 1249 ); 1250 1251 $show_all = ($this->checkPermissionBool('write') || $this->object->hasPublicLog()); 1252 1253 $filter = null; 1254 if ($this->book_obj_id > 0) { 1255 $filter["object"] = $this->book_obj_id; 1256 } 1257 1258 include_once 'Modules/BookingManager/classes/class.ilBookingReservationsTableGUI.php'; 1259 $table = new ilBookingReservationsTableGUI( 1260 $this, 1261 'log', 1262 $this->ref_id, 1263 $this->object->getId(), 1264 $show_all, 1265 ($this->object->getScheduleType() != ilObjBookingPool::TYPE_NO_SCHEDULE), 1266 $filter, 1267 $this->reservation_id 1268 ); 1269 $tpl->setContent($table->getHTML()); 1270 } 1271 1272 /** 1273 * Change status of given reservations 1274 */ 1275 public function changeStatusObject() 1276 { 1277 $this->tabs_gui->setTabActive('log'); 1278 1279 if (!$_POST['reservation_id']) { 1280 ilUtil::sendFailure($this->lng->txt('select_one')); 1281 return $this->logObject(); 1282 } 1283 1284 if ($this->checkPermissionBool('write')) { 1285 include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php'; 1286 ilBookingReservation::changeStatus($_POST['reservation_id'], (int) $_POST['tstatus']); 1287 } 1288 1289 ilUtil::sendSuccess($this->lng->txt('settings_saved'), true); 1290 return $this->ctrl->redirect($this, 'log'); 1291 } 1292 1293 /** 1294 * Apply filter from reservations table gui 1295 */ 1296 public function applyLogFilterObject() 1297 { 1298 $show_all = ($this->checkPermissionBool('write') || $this->object->hasPublicLog()); 1299 1300 include_once 'Modules/BookingManager/classes/class.ilBookingReservationsTableGUI.php'; 1301 $table = new ilBookingReservationsTableGUI( 1302 $this, 1303 'log', 1304 $this->ref_id, 1305 $this->object->getId(), 1306 $show_all, 1307 ($this->object->getScheduleType() != ilObjBookingPool::TYPE_NO_SCHEDULE) 1308 ); 1309 $table->resetOffset(); 1310 $table->writeFilterToSession(); 1311 $this->logObject(); 1312 } 1313 1314 /** 1315 * Reset filter in reservations table gui 1316 */ 1317 public function resetLogFilterObject() 1318 { 1319 $show_all = ($this->checkPermissionBool('write') || $this->object->hasPublicLog()); 1320 1321 include_once 'Modules/BookingManager/classes/class.ilBookingReservationsTableGUI.php'; 1322 $table = new ilBookingReservationsTableGUI( 1323 $this, 1324 'log', 1325 $this->ref_id, 1326 $this->object->getId(), 1327 $show_all, 1328 ($this->object->getScheduleType() != ilObjBookingPool::TYPE_NO_SCHEDULE) 1329 ); 1330 $table->resetOffset(); 1331 $table->resetFilter(); 1332 $this->logObject(); 1333 } 1334 1335 public static function _goto($a_target) 1336 { 1337 global $DIC; 1338 1339 $ilAccess = $DIC->access(); 1340 $lng = $DIC->language(); 1341 1342 if ($ilAccess->checkAccess("read", "", $a_target)) { 1343 ilObjectGUI::_gotoRepositoryNode($a_target, "render"); 1344 } elseif ($ilAccess->checkAccess("read", "", ROOT_FOLDER_ID)) { 1345 ilUtil::sendFailure(sprintf( 1346 $lng->txt("msg_no_perm_read_item"), 1347 ilObject::_lookupTitle(ilObject::_lookupObjId($a_target)) 1348 ), true); 1349 ilObjectGUI::_gotoRepositoryRoot(); 1350 } 1351 } 1352 1353 /** 1354 * this one is called from the info button in the repository 1355 * not very nice to set cmdClass/Cmd manually, if everything 1356 * works through ilCtrl in the future this may be changed 1357 */ 1358 public function infoScreenObject() 1359 { 1360 $this->ctrl->setCmd("showSummary"); 1361 $this->ctrl->setCmdClass("ilinfoscreengui"); 1362 $this->infoScreen(); 1363 } 1364 1365 public function infoScreen() 1366 { 1367 $ilCtrl = $this->ctrl; 1368 1369 $this->tabs_gui->setTabActive('info'); 1370 1371 $this->checkPermission("visible"); 1372 1373 include_once("./Services/InfoScreen/classes/class.ilInfoScreenGUI.php"); 1374 $info = new ilInfoScreenGUI($this); 1375 1376 $info->enablePrivateNotes(); 1377 1378 if ($this->checkPermissionBool("read")) { 1379 $info->enableNews(); 1380 } 1381 1382 // no news editing for files, just notifications 1383 $info->enableNewsEditing(false); 1384 if ($this->checkPermissionBool("write")) { 1385 $news_set = new ilSetting("news"); 1386 $enable_internal_rss = $news_set->get("enable_rss_for_internal"); 1387 1388 if ($enable_internal_rss) { 1389 $info->setBlockProperty("news", "settings", true); 1390 $info->setBlockProperty("news", "public_notifications_option", true); 1391 } 1392 } 1393 1394 // forward the command 1395 if ($ilCtrl->getNextClass() == "ilinfoscreengui") { 1396 $ilCtrl->forwardCommand($info); 1397 } else { 1398 return $ilCtrl->getHTML($info); 1399 } 1400 } 1401 1402 protected function getLogReservationIds() 1403 { 1404 if ($_POST["mrsv"]) { 1405 return $_POST["mrsv"]; 1406 } elseif ($this->reservation_id > 0) { 1407 return array($this->reservation_id); 1408 } 1409 } 1410 1411 public function rsvConfirmCancelObject() 1412 { 1413 $ilCtrl = $this->ctrl; 1414 $lng = $this->lng; 1415 $tpl = $this->tpl; 1416 $ilUser = $this->user; 1417 1418 $ids = $this->getLogReservationIds(); 1419 if (!is_array($ids) || !sizeof($ids)) { 1420 $this->ctrl->redirect($this, 'log'); 1421 } 1422 1423 include_once 'Modules/BookingManager/classes/class.ilBookingObject.php'; 1424 include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php'; 1425 1426 $max = array(); 1427 foreach ($ids as $idx => $id) { 1428 if (!is_numeric($id)) { 1429 list($obj_id, $user_id, $from, $to) = explode("_", $id); 1430 1431 $valid_ids = array(); 1432 foreach (ilBookingObject::getList($this->object->getId()) as $item) { 1433 $valid_ids[$item["booking_object_id"]] = $item["title"]; 1434 } 1435 1436 if (($this->checkPermissionBool("write") || $user_id == $ilUser->getId()) && 1437 $from > time() && 1438 in_array($obj_id, array_keys($valid_ids))) { 1439 $rsv_ids = ilBookingReservation::getCancelDetails($obj_id, $user_id, $from, $to); 1440 if (!sizeof($rsv_ids)) { 1441 unset($ids[$idx]); 1442 } 1443 if (sizeof($rsv_ids) > 1) { 1444 $max[$id] = sizeof($rsv_ids); 1445 $ids[$idx] = $rsv_ids; 1446 } else { 1447 // only 1 in group? treat as normal reservation 1448 $ids[$idx] = array_shift($rsv_ids); 1449 } 1450 } else { 1451 unset($ids[$idx]); 1452 } 1453 } 1454 } 1455 1456 if (!is_array($ids) || !sizeof($ids)) { 1457 $this->ctrl->redirect($this, 'log'); 1458 } 1459 1460 // show form instead 1461 if (sizeof($max) && max($max) > 1) { 1462 return $this->rsvConfirmCancelAggregationObject($ids); 1463 } 1464 1465 $this->tabs_gui->clearTargets(); 1466 $this->tabs_gui->setBackTarget( 1467 $lng->txt("back"), 1468 $ilCtrl->getLinkTarget($this, "log") 1469 ); 1470 1471 $this->setHelpId("cancel_booking"); 1472 1473 include_once 'Services/Utilities/classes/class.ilConfirmationGUI.php'; 1474 $conf = new ilConfirmationGUI(); 1475 $conf->setFormAction($ilCtrl->getFormAction($this, 'rsvCancel')); 1476 $conf->setHeaderText($lng->txt('book_confirm_cancel')); 1477 $conf->setConfirm($lng->txt('book_set_cancel'), 'rsvCancel'); 1478 $conf->setCancel($lng->txt('cancel'), 'log'); 1479 1480 foreach ($ids as $id) { 1481 $rsv = new ilBookingReservation($id); 1482 $obj = new ilBookingObject($rsv->getObjectId()); 1483 1484 $details = $obj->getTitle(); 1485 if ($this->object->getScheduleType() != ilObjBookingPool::TYPE_NO_SCHEDULE) { 1486 $details .= ", " . ilDatePresentation::formatPeriod( 1487 new ilDateTime($rsv->getFrom(), IL_CAL_UNIX), 1488 new ilDateTime($rsv->getTo() + 1, IL_CAL_UNIX) 1489 ); 1490 } 1491 1492 $conf->addItem('rsv_id[]', $id, $details); 1493 } 1494 1495 $tpl->setContent($conf->getHTML()); 1496 } 1497 1498 public function rsvConfirmCancelAggregationForm($a_ids) 1499 { 1500 include_once 'Services/Form/classes/class.ilPropertyFormGUI.php'; 1501 $form = new ilPropertyFormGUI(); 1502 $form->setFormAction($this->ctrl->getFormAction($this, "rsvCancel")); 1503 $form->setTitle($this->lng->txt("book_confirm_cancel_aggregation")); 1504 1505 include_once 'Modules/BookingManager/classes/class.ilBookingObject.php'; 1506 include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php'; 1507 1508 ilDatePresentation::setUseRelativeDates(false); 1509 1510 foreach ($a_ids as $idx => $ids) { 1511 if (is_array($ids)) { 1512 $first = $ids; 1513 $first = array_shift($first); 1514 } else { 1515 $first = $ids; 1516 } 1517 1518 $rsv = new ilBookingReservation($first); 1519 $obj = new ilBookingObject($rsv->getObjectId()); 1520 1521 $caption = $obj->getTitle() . ", " . ilDatePresentation::formatPeriod( 1522 new ilDateTime($rsv->getFrom(), IL_CAL_UNIX), 1523 new ilDateTime($rsv->getTo() + 1, IL_CAL_UNIX) 1524 ); 1525 1526 // #17869 1527 if (is_array($ids)) { 1528 $caption .= " (" . sizeof($ids) . ")"; 1529 } 1530 1531 $item = new ilNumberInputGUI($caption, "rsv_id_" . $idx); 1532 $item->setRequired(true); 1533 $item->setMinValue(0); 1534 $item->setSize(4); 1535 $form->addItem($item); 1536 1537 if (is_array($ids)) { 1538 $item->setMaxValue(sizeof($ids)); 1539 1540 foreach ($ids as $id) { 1541 $hidden = new ilHiddenInputGUI("rsv_aggr[" . $idx . "][]"); 1542 $hidden->setValue($id); 1543 $form->addItem($hidden); 1544 } 1545 } else { 1546 $item->setMaxValue(1); 1547 1548 $hidden = new ilHiddenInputGUI("rsv_aggr[" . $idx . "]"); 1549 $hidden->setValue($ids); 1550 $form->addItem($hidden); 1551 } 1552 1553 if ($_POST["rsv_id_" . $idx]) { 1554 $item->setValue((int) $_POST["rsv_id_" . $idx]); 1555 } 1556 } 1557 1558 $form->addCommandButton("rsvCancel", $this->lng->txt("confirm")); 1559 $form->addCommandButton("log", $this->lng->txt("cancel")); 1560 1561 return $form; 1562 } 1563 1564 public function rsvConfirmCancelAggregationObject(array $a_ids = null) 1565 { 1566 $tpl = $this->tpl; 1567 $ilCtrl = $this->ctrl; 1568 $lng = $this->lng; 1569 1570 $this->tabs_gui->clearTargets(); 1571 $this->tabs_gui->setBackTarget( 1572 $lng->txt("back"), 1573 $ilCtrl->getLinkTarget($this, "log") 1574 ); 1575 1576 $this->setHelpId("cancel_booking"); 1577 1578 // #13511 1579 ilUtil::sendQuestion($lng->txt("book_confirm_cancel")); 1580 1581 $form = $this->rsvConfirmCancelAggregationForm($a_ids); 1582 1583 $tpl->setContent($form->getHTML()); 1584 } 1585 1586 public function rsvCancelObject() 1587 { 1588 $ilUser = $this->user; 1589 $tpl = $this->tpl; 1590 $lng = $this->lng; 1591 $ilCtrl = $this->ctrl; 1592 1593 $ids = $_POST["rsv_id"]; 1594 1595 // parse aggregation form 1596 if ($_POST["rsv_aggr"]) { 1597 $form = $this->rsvConfirmCancelAggregationForm($_POST["rsv_aggr"]); 1598 if (!$form->checkInput()) { 1599 $this->tabs_gui->clearTargets(); 1600 $this->tabs_gui->setBackTarget( 1601 $lng->txt("back"), 1602 $ilCtrl->getLinkTarget($this, "log") 1603 ); 1604 1605 return $tpl->setContent($form->getHTML()); 1606 } 1607 1608 $ids = array(); 1609 foreach ($_POST["rsv_aggr"] as $idx => $aggr_ids) { 1610 $max = (int) $_POST["rsv_id_" . $idx]; 1611 if ($max) { 1612 if (!is_array($aggr_ids)) { 1613 $ids[] = $aggr_ids; 1614 } else { 1615 $aggr_ids = array_slice($aggr_ids, 0, $max); 1616 $ids = array_merge($ids, $aggr_ids); 1617 } 1618 } 1619 } 1620 } 1621 1622 if ($ids) { 1623 include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php'; 1624 foreach ($ids as $id) { 1625 $obj = new ilBookingReservation($id); 1626 1627 if (!$this->checkPermissionBool("write") && $obj->getUserId() != $ilUser->getId()) { 1628 ilUtil::sendFailure($this->lng->txt('permission_denied'), true); 1629 $this->ctrl->redirect($this, 'log'); 1630 } 1631 1632 $obj->setStatus(ilBookingReservation::STATUS_CANCELLED); 1633 $obj->update(); 1634 1635 if ($this->object->getScheduleType() != ilObjBookingPool::TYPE_NO_SCHEDULE) { 1636 // remove user calendar entry (#11086) 1637 $cal_entry_id = $obj->getCalendarEntry(); 1638 if ($cal_entry_id) { 1639 include_once 'Services/Calendar/classes/class.ilCalendarEntry.php'; 1640 $entry = new ilCalendarEntry($cal_entry_id); 1641 $entry->delete(); 1642 } 1643 } 1644 } 1645 } 1646 1647 ilUtil::sendSuccess($this->lng->txt('settings_saved')); 1648 $this->logObject(); 1649 } 1650 1651 public function rsvConfirmDeleteObject() 1652 { 1653 global $DIC; 1654 if (!$this->checkPermissionBool("write")) { 1655 ilUtil::sendFailure($this->lng->txt('permission_denied'), true); 1656 $this->ctrl->redirect($this, 'log'); 1657 } 1658 1659 $this->tabs_gui->clearTargets(); 1660 $this->tabs_gui->setBackTarget( 1661 $this->lng->txt("back"), 1662 $this->ctrl->getLinkTarget($this, "log") 1663 ); 1664 1665 include_once 'Services/Utilities/classes/class.ilConfirmationGUI.php'; 1666 $conf = new ilConfirmationGUI(); 1667 $conf->setFormAction($this->ctrl->getFormAction($this, 'rsvDelete')); 1668 $conf->setHeaderText($this->lng->txt('book_confirm_delete')); 1669 $conf->setConfirm($this->lng->txt('book_set_delete'), 'rsvDelete'); 1670 $conf->setCancel($this->lng->txt('cancel'), 'log'); 1671 1672 list($obj_id, $user_id, $from, $to) = explode("_", $DIC->http()->request()->getQueryParams()['reservation_id']); 1673 $ids = ilBookingReservation::getCancelDetails($obj_id, $user_id, $from, $to); 1674 $rsv = new ilBookingReservation($ids[0]); 1675 $obj = new ilBookingObject($rsv->getObjectId()); 1676 1677 $details = sprintf($this->lng->txt('X_reservations_of'), count($ids)) . ' ' . $obj->getTitle(); 1678 if ($this->object->getScheduleType() != ilObjBookingPool::TYPE_NO_SCHEDULE) { 1679 $details .= ", " . ilDatePresentation::formatPeriod( 1680 new ilDateTime($rsv->getFrom(), IL_CAL_UNIX), 1681 new ilDateTime($rsv->getTo() + 1, IL_CAL_UNIX) 1682 ); 1683 } 1684 1685 $conf->addItem('rsv_ids', implode(',', $ids), $details); 1686 $this->tpl->setContent($conf->getHTML()); 1687 } 1688 1689 public function rsvDeleteObject() 1690 { 1691 global $DIC; 1692 $get = $DIC->http()->request()->getParsedBody()['rsv_ids']; 1693 if ($get) { 1694 include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php'; 1695 foreach (explode(',', $get) as $id) { 1696 $res = new ilBookingReservation($id); 1697 $obj = new ilBookingObject($res->getObjectId()); 1698 if ($obj->getPoolId() != $this->object->getId() || !$this->checkPermissionBool("write")) { 1699 ilUtil::sendFailure($this->lng->txt('permission_denied'), true); 1700 $this->ctrl->redirect($this, 'log'); 1701 } 1702 if ($this->object->getScheduleType() != ilObjBookingPool::TYPE_NO_SCHEDULE) { 1703 $cal_entry_id = $res->getCalendarEntry(); 1704 if ($cal_entry_id) { 1705 include_once 'Services/Calendar/classes/class.ilCalendarEntry.php'; 1706 $entry = new ilCalendarEntry($cal_entry_id); 1707 $entry->delete(); 1708 } 1709 } 1710 $res->delete(); 1711 } 1712 } 1713 1714 ilUtil::sendSuccess($this->lng->txt('reservation_deleted')); 1715 $this->logObject(); 1716 } 1717 1718 public function rsvInUseObject() 1719 { 1720 $this->checkPermission("write"); 1721 1722 $ids = $this->getLogReservationIds(); 1723 if ($ids) { 1724 include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php'; 1725 foreach ($ids as $id) { 1726 $obj = new ilBookingReservation($id); 1727 $obj->setStatus(ilBookingReservation::STATUS_IN_USE); 1728 $obj->update(); 1729 } 1730 } 1731 1732 ilUtil::sendSuccess($this->lng->txt('settings_saved')); 1733 $this->logObject(); 1734 } 1735 1736 public function rsvNotInUseObject() 1737 { 1738 $this->checkPermission("write"); 1739 1740 $ids = $this->getLogReservationIds(); 1741 if ($ids) { 1742 include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php'; 1743 foreach ($ids as $id) { 1744 $obj = new ilBookingReservation($id); 1745 $obj->setStatus(null); 1746 $obj->update(); 1747 } 1748 } 1749 1750 ilUtil::sendSuccess($this->lng->txt('settings_saved')); 1751 $this->logObject(); 1752 } 1753 1754 public function showProfileObject() 1755 { 1756 $tpl = $this->tpl; 1757 $ilCtrl = $this->ctrl; 1758 1759 $this->tabs_gui->clearTargets(); 1760 1761 $user_id = $this->profile_user_id; 1762 1763 include_once 'Services/User/classes/class.ilPublicUserProfileGUI.php'; 1764 $profile = new ilPublicUserProfileGUI($user_id); 1765 $profile->setBackUrl($this->ctrl->getLinkTarget($this, 'log')); 1766 $tpl->setContent($ilCtrl->getHTML($profile)); 1767 } 1768 1769 public function addLocatorItems() 1770 { 1771 $ilLocator = $this->locator; 1772 1773 if (is_object($this->object)) { 1774 $ilLocator->addItem($this->object->getTitle(), $this->ctrl->getLinkTarget($this, "render"), "", $this->object->getRefId()); 1775 } 1776 } 1777 1778 /** 1779 * @inheritdoc 1780 */ 1781 protected function initHeaderAction($a_sub_type = null, $a_sub_id = null) 1782 { 1783 $access = $this->access; 1784 $user = $this->user; 1785 $ctrl = $this->ctrl; 1786 $lng = $this->lng; 1787 1788 $lng->loadLanguageModule("noti"); 1789 1790 $lg = parent::initHeaderAction($a_sub_type, $a_sub_id); 1791 1792 if ($lg && $access->checkAccess("read", "", $this->ref_id)) { 1793 // notification 1794 if (true) { 1795 if (!ilNotification::hasNotification(ilNotification::TYPE_BOOK, $user->getId(), $this->object->getId())) { 1796 $lg->addHeaderIcon( 1797 "not_icon", 1798 ilUtil::getImagePath("notification_off.svg"), 1799 $lng->txt("noti_notification_deactivated") 1800 ); 1801 1802 $ctrl->setParameter($this, "ntf", 1); 1803 $caption = "noti_activate_notification"; 1804 } else { 1805 $lg->addHeaderIcon( 1806 "not_icon", 1807 ilUtil::getImagePath("notification_on.svg"), 1808 $lng->txt("noti_notification_activated") 1809 ); 1810 1811 $ctrl->setParameter($this, "ntf", 0); 1812 $caption = "noti_deactivate_notification"; 1813 } 1814 1815 $lg->addCustomCommand( 1816 $ctrl->getLinkTarget($this, "saveNotification"), 1817 $caption 1818 ); 1819 1820 $ctrl->setParameter($this, "ntf", ""); 1821 } 1822 } 1823 1824 return $lg; 1825 } 1826 1827 /** 1828 * Save notification 1829 */ 1830 public function saveNotificationObject() 1831 { 1832 $ctrl = $this->ctrl; 1833 $user = $this->user; 1834 1835 1836 switch ($_GET["ntf"]) { 1837 case 0: 1838 ilNotification::setNotification(ilNotification::TYPE_BOOK, $user->getId(), $this->object->getId(), false); 1839 break; 1840 1841 case 1: 1842 ilNotification::setNotification(ilNotification::TYPE_BOOK, $user->getId(), $this->object->getId(), true); 1843 break; 1844 } 1845 $ctrl->redirect($this, "render"); 1846 } 1847 /* 1848 * save booking participant. 1849 */ 1850 protected function saveParticipant() 1851 { 1852 include_once("./Modules/BookingManager/classes/class.ilBookingParticipant.php"); 1853 $participant = new ilBookingParticipant($this->user_id_to_book, $this->object->getId()); 1854 } 1855 1856 /** 1857 * Create reservations for a bunch of booking pool participants. 1858 */ 1859 public function bookMultipleParticipantsObject() 1860 { 1861 if ($_POST["mass"]) { 1862 $participants = $_POST["mass"]; 1863 } else { 1864 $this->ctrl->redirectByClass('ilbookingobjectgui', 'render'); 1865 } 1866 1867 $this->tabs->clearTargets(); 1868 $this->ctrl->setParameterByClass('ilbookingobjectgui', 'object_id', $this->book_obj_id); 1869 $this->tabs->setBackTarget($this->lng->txt("back"), $this->ctrl->getLinkTargetByClass('ilbookingobjectgui', 'assignparticipants')); 1870 $this->ctrl->setParameterByClass('ilbookingobjectgui', 'object_id', ''); 1871 1872 $conf = new ilConfirmationGUI(); 1873 $conf->setFormAction($this->ctrl->getFormAction($this)); 1874 1875 //add user list as items. 1876 foreach ($participants as $id) { 1877 $name = ilObjUser::_lookupFullname($id); 1878 $conf->addItem("participants[]", $id, $name); 1879 } 1880 1881 $available = ilBookingReservation::numAvailableFromObjectNoSchedule($this->book_obj_id); 1882 if (sizeof($participants) > $available) { 1883 $obj = new ilBookingObject($this->book_obj_id); 1884 $conf->setHeaderText( 1885 sprintf( 1886 $this->lng->txt('book_limit_objects_available'), 1887 sizeof($participants), 1888 $obj->getTitle(), 1889 $available 1890 ) 1891 ); 1892 } else { 1893 $conf->setHeaderText($this->lng->txt('book_confirm_booking_no_schedule')); 1894 $conf->addHiddenItem("object_id", $this->book_obj_id); 1895 $conf->setConfirm($this->lng->txt("assign"), "saveMultipleBookings"); 1896 } 1897 1898 $conf->setCancel($this->lng->txt("cancel"), 'redirectToList'); 1899 $this->tpl->setContent($conf->getHTML()); 1900 } 1901 1902 public function redirectToListObject() 1903 { 1904 $this->ctrl->setParameterByClass('ilbookingobjectgui', 'object_id', $this->book_obj_id); 1905 $this->ctrl->redirectByClass('ilbookingobjectgui', 'assignParticipants'); 1906 } 1907 1908 /** 1909 * Save multiple users reservations for one booking pool object. 1910 * //TODO check if object/user exist in the DB, 1911 */ 1912 public function saveMultipleBookingsObject() 1913 { 1914 if ($_POST["participants"] && $_POST['object_id']) { 1915 $participants = $_POST["participants"]; 1916 $this->book_obj_id = $_POST['object_id']; 1917 } else { 1918 $this->ctrl->redirectByClass('ilbookingobjectgui', 'render'); 1919 } 1920 $rsv_ids = array(); 1921 foreach ($participants as $id) { 1922 $this->user_id_to_book = $id; 1923 $rsv_ids[] = $this->processBooking($this->book_obj_id); 1924 } 1925 1926 if (sizeof($rsv_ids)) { 1927 ilUtil::sendSuccess("booking_multiple_succesfully"); 1928 $this->ctrl->redirectByClass('ilbookingobjectgui', 'render'); 1929 } else { 1930 ilUtil::sendFailure($this->lng->txt('book_reservation_failed_overbooked'), true); 1931 $this->ctrl->redirect($this, 'render'); 1932 } 1933 } 1934} 1935