ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilBookingObjectsTableGUI.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 include_once("./Services/Table/classes/class.ilTable2GUI.php");
5 
15 {
19  protected $access;
20 
24  protected $user;
25 
26  protected $ref_id; // [int]
27  protected $pool_id; // [int]
28  protected $has_schedule; // [bool]
29  protected $may_edit; // [bool]
30  protected $may_assign; // [bool]
31  protected $overall_limit; // [int]
32  protected $reservations = array(); // [array]
33  protected $current_bookings; // [int]
34  protected $advmd; // [array]
35  protected $filter; // [array]
36  protected $ui_factory;
37  protected $ui_renderer;
38 
48  public function __construct($a_parent_obj, $a_parent_cmd, $a_ref_id, $a_pool_id, $a_pool_has_schedule, $a_pool_overall_limit)
49  {
50  global $DIC;
51 
52  $this->ctrl = $DIC->ctrl();
53  $this->lng = $DIC->language();
54  $this->access = $DIC->access();
55  $this->user = $DIC->user();
56  $ilCtrl = $DIC->ctrl();
57  $lng = $DIC->language();
58  $ilAccess = $DIC->access();
59  $this->ui_factory = $DIC->ui()->factory();
60  $this->ui_renderer = $DIC->ui()->renderer();
61 
62  $this->ref_id = $a_ref_id;
63  $this->pool_id = $a_pool_id;
64  $this->has_schedule = $a_pool_has_schedule;
65  $this->overall_limit = $a_pool_overall_limit;
66  $this->may_edit = $ilAccess->checkAccess('write', '', $this->ref_id);
67  $this->may_assign = $ilAccess->checkAccess('edit_permission', '', $this->ref_id);
68 
69  $this->advmd = ilObjBookingPool::getAdvancedMDFields($this->ref_id);
70 
71  $this->setId("bkobj");
72 
73  parent::__construct($a_parent_obj, $a_parent_cmd);
74 
75  $this->setTitle($lng->txt("book_objects_list"));
76 
77  // $this->setLimit(9999);
78 
79  $this->addColumn($this->lng->txt("title"), "title");
80 
81  $cols = $this->getSelectableColumns();
82  foreach ($this->getSelectedColumns() as $col) {
83  $this->addColumn($cols[$col]["txt"], $col);
84  }
85 
86  if (!$this->has_schedule) {
87  $this->addColumn($this->lng->txt("available"));
88  }
89 
90  $this->addColumn($this->lng->txt("actions"));
91 
92  $this->setEnableHeader(true);
93  $this->setFormAction($ilCtrl->getFormAction($a_parent_obj, $a_parent_cmd));
94  $this->setRowTemplate("tpl.booking_object_row.html", "Modules/BookingManager");
95 
96  $this->initFilter();
97  $this->getItems();
98  }
99 
105  protected function getAdvMDRecordGUI()
106  {
107  // #16827
108  return $this->record_gui;
109  }
110 
111  public function initFilter()
112  {
113  $lng = $this->lng;
114 
115  // title/description
117  "title",
119  false,
120  $lng->txt("title") . "/" . $lng->txt("description")
121  );
122  $this->filter["title"] = $title->getValue();
123 
124  // #18651
125  if ($this->has_schedule) {
126  // booking period
127  $period = $this->addFilterItemByMetaType(
128  "period",
130  false,
131  $lng->txt("book_period")
132  );
133  $this->filter["period"] = $period->getValue();
134  }
135  }
136 
140  public function getItems()
141  {
143 
144  include_once 'Modules/BookingManager/classes/class.ilBookingObject.php';
145  $data = ilBookingObject::getList($this->pool_id, $this->filter["title"]);
146 
147  include_once 'Modules/BookingManager/classes/class.ilBookingSchedule.php';
148  include_once 'Modules/BookingManager/classes/class.ilBookingReservation.php';
149 
150  // check schedule availability
151  if ($this->has_schedule) {
152  $now = time();
153  $limit = strtotime("+1year");
154  foreach ($data as $idx => $item) {
155  $schedule = new ilBookingSchedule($item["schedule_id"]);
156  $av_from = ($schedule->getAvailabilityFrom() && !$schedule->getAvailabilityFrom()->isNull())
157  ? $schedule->getAvailabilityFrom()->get(IL_CAL_UNIX)
158  : null;
159  $av_to = ($schedule->getAvailabilityTo() && !$schedule->getAvailabilityTo()->isNull())
160  ? strtotime($schedule->getAvailabilityTo()->get(IL_CAL_DATE) . " 23:59:59")
161  : null;
162  if (($av_from && $av_from > $limit)) {
163  unset($data[$idx]);
164  }
165  if ($av_from > $now) {
166  $data[$idx]["not_yet"] = ilDatePresentation::formatDate(new ilDate($av_from, IL_CAL_UNIX));
167  }
168  if ($av_to) {
169  // #18658
170  if (!ilBookingReservation::isObjectAvailableInPeriod($item["booking_object_id"], $schedule, $av_from, $av_to)) {
171  $this->lng->loadLanguageModule("dateplaner");
172  $data[$idx]["full_up"] = $this->lng->txt("cal_booked_out");
173  }
174  }
175  }
176  }
177 
178  foreach ($data as $item) {
179  $item_id = $item["booking_object_id"];
180 
181  // available for given period?
182  if (is_object($this->filter["period"]["from"]) ||
183  is_object($this->filter["period"]["to"])) {
184  $from = is_object($this->filter["period"]["from"])
185  ? strtotime($this->filter["period"]["from"]->get(IL_CAL_DATE) . " 00:00:00")
186  : null;
187  $to = is_object($this->filter["period"]["to"])
188  ? strtotime($this->filter["period"]["to"]->get(IL_CAL_DATE) . " 23:59:59")
189  : null;
190 
191  $bobj = new ilBookingObject($item_id);
192  $schedule = new ilBookingSchedule($bobj->getScheduleId());
193 
194  if (!ilBookingReservation::isObjectAvailableInPeriod($item_id, $schedule, $from, $to)) {
195  unset($data[$idx]);
196  continue;
197  }
198  }
199 
200  // cache reservations
201  $item_rsv = ilBookingReservation::getList(array($item_id), 1000, 0, array());
202  $this->reservations[$item_id] = $item_rsv["data"];
203  }
204 
205  if (!$this->has_schedule &&
206  $this->overall_limit) {
207  $this->current_bookings = 0;
208  foreach ($this->reservations as $obj_rsv) {
209  foreach ($obj_rsv as $item) {
210  if ($item["status"] != ilBookingReservation::STATUS_CANCELLED) {
211  if ($item["user_id"] == $ilUser->getId()) {
212  $this->current_bookings++;
213  }
214  }
215  }
216  }
217 
218  if ($this->current_bookings >= $this->overall_limit) {
219  ilUtil::sendInfo($this->lng->txt("book_overall_limit_warning"));
220  }
221  }
222 
223  if ($this->advmd) {
224  // advanced metadata
225  include_once('Services/AdvancedMetaData/classes/class.ilAdvancedMDRecordGUI.php');
226  $this->record_gui = new ilAdvancedMDRecordGUI(ilAdvancedMDRecordGUI::MODE_FILTER, "book", $this->pool_id, "bobj");
227  $this->record_gui->setTableGUI($this);
228  $this->record_gui->parse();
229 
230  include_once("./Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php");
232  $this->ref_id,
233  "book",
234  "bobj",
235  $this->pool_id,
236  "bobj",
237  $data,
238  "pool_id",
239  "booking_object_id",
240  $this->record_gui->getFilterElements()
241  );
242  }
243 
244  $this->setMaxCount(sizeof($data));
245  $this->setData($data);
246  }
247 
248  public function numericOrdering($a_field)
249  {
250  if (substr($a_field, 0, 3) == "md_") {
251  $md_id = (int) substr($a_field, 3);
252  if ($this->advmd[$md_id]["type"] == ilAdvancedMDFieldDefinition::TYPE_DATE) {
253  return true;
254  }
255  }
256  return false;
257  }
258 
259  public function getSelectableColumns()
260  {
261  $cols = array();
262 
263  $cols["description"] = array(
264  "txt" => $this->lng->txt("description"),
265  "default" => true
266  );
267 
268  foreach ($this->advmd as $field) {
269  $cols["advmd" . $field["id"]] = array(
270  "txt" => $field["title"],
271  "default" => false
272  );
273  }
274 
275  return $cols;
276  }
277 
282  protected function fillRow($a_set)
283  {
284  $lng = $this->lng;
287 
288  $has_booking = false;
289  $booking_possible = true;
290  $assign_possible = true;
291  $has_reservations = false;
292 
293  $selected = $this->getSelectedColumns();
294 
295  $this->tpl->setVariable("TXT_TITLE", $a_set["title"]);
296 
297  if (in_array("description", $selected)) {
298  $this->tpl->setVariable("TXT_DESC", nl2br($a_set["description"]));
299  }
300 
301  if ($a_set["full_up"]) {
302  $this->tpl->setVariable("NOT_YET", $a_set["full_up"]);
303  $booking_possible = false;
304  $assign_possible = false;
305  } elseif ($a_set["not_yet"]) {
306  $this->tpl->setVariable("NOT_YET", $a_set["not_yet"]);
307  }
308 
309  if (!$this->has_schedule) {
310  $cnt = 0;
311  foreach ($this->reservations[$a_set["booking_object_id"]] as $item) {
312  if ($item["status"] != ilBookingReservation::STATUS_CANCELLED) {
313  $cnt++;
314 
315  if ($item["user_id"] == $ilUser->getId()) {
316  $has_booking = true;
317  }
318 
319  $has_reservations = true;
320  }
321  }
322 
323  $this->tpl->setVariable("VALUE_AVAIL", $a_set["nr_items"] - $cnt);
324  $this->tpl->setVariable("VALUE_AVAIL_ALL", $a_set["nr_items"]);
325 
326  if ($a_set["nr_items"] <= $cnt || ($this->overall_limit && $this->current_bookings && $this->current_bookings >= $this->overall_limit)) {
327  $booking_possible = false;
328  }
329  if ($has_booking) {
330  $booking_possible = false;
331  }
332  if ($a_set["nr_items"] <= $cnt) {
333  $assign_possible = false;
334  }
335  } elseif (!$this->may_edit) {
336  foreach ($this->reservations[$a_set["booking_object_id"]] as $item) {
337  if ($item["status"] != ilBookingReservation::STATUS_CANCELLED &&
338  $item["user_id"] == $ilUser->getId()) {
339  $has_booking = true;
340  }
341  }
342  }
343 
344  //Actions
345  $items = array();
346 
347  $ilCtrl->setParameter($this->parent_obj, 'object_id', $a_set['booking_object_id']);
348 
349  if ($booking_possible) {
350  if (is_object($this->filter['period']['from'])) {
351  $ilCtrl->setParameter($this->parent_obj, 'sseed', $this->filter['period']['from']->get(IL_CAL_DATE));
352  }
353 
354  $items[] = $this->ui_factory->button()->shy($lng->txt('book_book'), $ilCtrl->getLinkTarget($this->parent_obj, 'book'));
355 
356  $ilCtrl->setParameter($this->parent_obj, 'sseed', '');
357  }
358 
359  // #16663
360  if (!$this->has_schedule && $has_booking) {
361  if (trim($a_set['post_text']) || $a_set['post_file']) {
362  $items[] = $this->ui_factory->button()->shy($lng->txt('book_post_booking_information'), $ilCtrl->getLinkTarget($this->parent_obj, 'displayPostInfo'));
363  }
364  $items[] = $this->ui_factory->button()->shy($lng->txt('book_set_cancel'), $ilCtrl->getLinkTarget($this->parent_obj, 'rsvConfirmCancelUser'));
365  }
366 
367  if ($this->may_edit || $has_booking) {
368  $ilCtrl->setParameterByClass('ilObjBookingPoolGUI', 'object_id', $a_set['booking_object_id']);
369  $items[] = $this->ui_factory->button()->shy($lng->txt('book_log'), $ilCtrl->getLinkTargetByClass('ilObjBookingPoolGUI', 'log'));
370  $ilCtrl->setParameterByClass('ilObjBookingPoolGUI', 'object_id', '');
371  }
372 
373  // tutors (may_assign) make reservations for members (e.g. of a course)
374  if ($this->may_assign && $assign_possible) {
375 
376  // note: this call is currently super expensive
377  // see #26388, it has been performed even for users without edit permissions before
378  // now the call has been moved here, but still this needs improvement
379  // EDIT: deactivated for now due to performance reasons
380  // if (!empty(ilBookingParticipant::getAssignableParticipants($a_set["booking_object_id"]))) {
381  if (is_object($this->filter['period']['from'])) {
382  $ilCtrl->setParameter(
383  $this->parent_obj,
384  'sseed',
385  $this->filter['period']['from']->get(IL_CAL_DATE)
386  );
387  }
388 
389  $items[] = $this->ui_factory->button()->shy(
390  $lng->txt('book_assign_participant'),
391  $ilCtrl->getLinkTarget($this->parent_obj, 'assignParticipants')
392  );
393 
394  $ilCtrl->setParameter($this->parent_obj, 'sseed', '');
395  //}
396  }
397 
398  if ($a_set['info_file']) {
399  $items[] = $this->ui_factory->button()->shy($lng->txt('book_download_info'), $ilCtrl->getLinkTarget($this->parent_obj, 'deliverInfo'));
400  }
401 
402  if ($this->may_edit) {
403  $items[] = $this->ui_factory->button()->shy($lng->txt('edit'), $ilCtrl->getLinkTarget($this->parent_obj, 'edit'));
404 
405  // #10890
406  if (!$has_reservations) {
407  $items[] = $this->ui_factory->button()->shy($lng->txt('delete'), $ilCtrl->getLinkTarget($this->parent_obj, 'confirmDelete'));
408  }
409  }
410 
411  if ($this->advmd) {
412  foreach ($this->advmd as $item) {
413  $advmd_id = (int) $item["id"];
414 
415  if (!in_array("advmd" . $advmd_id, $selected)) {
416  continue;
417  }
418 
419  $val = " ";
420  if (isset($a_set["md_" . $advmd_id . "_presentation"])) {
421  $pb = $a_set["md_" . $advmd_id . "_presentation"]->getList();
422  if ($pb) {
423  $val = $pb;
424  }
425  }
426 
427  $this->tpl->setCurrentBlock("advmd_bl");
428  $this->tpl->setVariable("ADVMD_VAL", $val);
429  $this->tpl->parseCurrentBlock();
430  }
431  }
432 
433  if (sizeof($items)) {
434  $actions_dropdown = $this->ui_factory->dropdown()->standard($items)->withLabel($this->lng->txt('actions'));
435  $this->tpl->setVariable("ACTION_DROPDOWN", $this->ui_renderer->render($actions_dropdown));
436  }
437  }
438 }
a bookable ressource
static getList($a_pool_id, $a_title=null)
Get list of booking objects for given type.
global $DIC
Definition: saml.php:7
schedule for booking ressource
addFilterItemByMetaType($id, $type=self::FILTER_TEXT, $a_optional=false, $caption=null)
Add filter by standard type.
$from
const IL_CAL_UNIX
static formatDate(ilDateTime $date, $a_skip_day=false, $a_include_wd=false, $include_seconds=false)
Format a date public.
setId($a_val)
Set id.
user()
Definition: user.php:4
__construct($a_parent_obj, $a_parent_cmd, $a_ref_id, $a_pool_id, $a_pool_has_schedule, $a_pool_overall_limit)
Constructor.
global $ilCtrl
Definition: ilias.php:18
setTitle($a_title, $a_icon=0, $a_icon_alt=0)
Set title and title icon.
static sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
getAdvMDRecordGUI()
needed for advmd filter handling
Class ilTable2GUI.
Class for single dates.
$ilUser
Definition: imgupload.php:18
getSelectedColumns()
Get selected columns.
List booking objects (for booking type)
setRowTemplate($a_template, $a_template_dir="")
Set row template.
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
const IL_CAL_DATE
static isObjectAvailableInPeriod($a_obj_id, ilBookingSchedule $a_schedule, $a_from, $a_to)
static getList($a_object_ids, $a_limit=10, $a_offset=0, array $filter)
List all reservations.
addColumn( $a_text, $a_sort_field="", $a_width="", $a_is_checkbox_action_column=false, $a_class="", $a_tooltip="", $a_tooltip_with_html=false)
Add a column to the header.
getItems()
Gather data and build rows.
setEnableHeader($a_enableheader)
Set Enable Header.
setMaxCount($a_max_count)
set max.
static getAdvancedMDFields($a_ref_id)
$cols
Definition: xhr_table.php:11
static queryForRecords($adv_rec_obj_ref_id, $adv_rec_obj_type, $adv_rec_obj_subtype, $a_obj_id, $a_subtype, $a_records, $a_obj_id_key, $a_obj_subid_key, array $a_amet_filter=null)
Query data for given object records.