ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilBookingReservation.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
13 {
14  protected $id; // int
15  protected $object_id; // int
16  protected $user_id; // int
17  protected $from; // timestamp
18  protected $to; // timestamp
19  protected $status; // status
20  protected $group_id; // int
21 
22  const STATUS_IN_USE = 2;
23  const STATUS_CANCELLED = 5;
24 
32  function __construct($a_id = NULL)
33  {
34  $this->id = (int)$a_id;
35  $this->read();
36  }
37 
42  function getId()
43  {
44  return $this->id;
45  }
46 
51  function setObjectId($a_object_id)
52  {
53  $this->object_id = $a_object_id;
54  }
55 
60  function getObjectId()
61  {
62  return $this->object_id;
63  }
64 
69  function setUserId($a_user_id)
70  {
71  $this->user_id = (int)$a_user_id;
72  }
73 
78  function getUserId()
79  {
80  return $this->user_id;
81  }
82 
87  function setFrom($a_from)
88  {
89  $this->from = (int)$a_from;
90  }
91 
96  function getFrom()
97  {
98  return $this->from;
99  }
100 
105  function setTo($a_to)
106  {
107  $this->to = (int)$a_to;
108  }
109 
114  function getTo()
115  {
116  return $this->to;
117  }
118 
123  function setStatus($a_status)
124  {
125  if($a_status === NULL)
126  {
127  $this->status = NULL;
128  }
129  if($this->isValidStatus((int)$a_status))
130  {
131  $this->status = (int)$a_status;
132  }
133  }
134 
139  function getStatus()
140  {
141  return $this->status;
142  }
143 
149  static function isValidStatus($a_status)
150  {
151  if(in_array($a_status, array(self::STATUS_IN_USE, self::STATUS_CANCELLED)))
152  {
153  return true;
154  }
155  return false;
156  }
157 
162  function setGroupId($a_group_id)
163  {
164  $this->group_id = $a_group_id;
165  }
166 
171  function getGroupId()
172  {
173  return $this->group_id;
174  }
175 
179  protected function read()
180  {
181  global $ilDB;
182 
183  if($this->id)
184  {
185  $set = $ilDB->query('SELECT *'.
186  ' FROM booking_reservation'.
187  ' WHERE booking_reservation_id = '.$ilDB->quote($this->id, 'integer'));
188  $row = $ilDB->fetchAssoc($set);
189  $this->setUserId($row['user_id']);
190  $this->setObjectId($row['object_id']);
191  $this->setFrom($row['date_from']);
192  $this->setTo($row['date_to']);
193  $this->setStatus($row['status']);
194  $this->setGroupId($row['group_id']);
195  }
196  }
197 
202  function save()
203  {
204  global $ilDB;
205 
206  if($this->id)
207  {
208  return false;
209  }
210 
211  $this->id = $ilDB->nextId('booking_reservation');
212 
213  return $ilDB->manipulate('INSERT INTO booking_reservation'.
214  ' (booking_reservation_id,user_id,object_id,date_from,date_to,status,group_id)'.
215  ' VALUES ('.$ilDB->quote($this->id, 'integer').
216  ','.$ilDB->quote($this->getUserId(), 'integer').
217  ','.$ilDB->quote($this->getObjectId(), 'integer').
218  ','.$ilDB->quote($this->getFrom(), 'integer').
219  ','.$ilDB->quote($this->getTo(), 'integer').
220  ','.$ilDB->quote($this->getStatus(), 'integer').
221  ','.$ilDB->quote($this->getGroupId(), 'integer').')');
222  }
223 
228  function update()
229  {
230  global $ilDB;
231 
232  if(!$this->id)
233  {
234  return false;
235  }
236 
237  /* there can only be 1
238  if($this->getStatus() == self::STATUS_IN_USE)
239  {
240  $ilDB->manipulate('UPDATE booking_reservation'.
241  ' SET status = '.$ilDB->quote(NULL, 'integer').
242  ' WHERE object_id = '.$ilDB->quote($this->getObjectId(), 'integer').
243  ' AND status = '.$ilDB->quote(self::STATUS_IN_USE, 'integer'));
244  }
245  */
246 
247  return $ilDB->manipulate('UPDATE booking_reservation'.
248  ' SET object_id = '.$ilDB->quote($this->getObjectId(), 'text').
249  ', user_id = '.$ilDB->quote($this->getUserId(), 'integer').
250  ', date_from = '.$ilDB->quote($this->getFrom(), 'integer').
251  ', date_to = '.$ilDB->quote($this->getTo(), 'integer').
252  ', status = '.$ilDB->quote($this->getStatus(), 'integer').
253  ', group_id = '.$ilDB->quote($this->getGroupId(), 'integer').
254  ' WHERE booking_reservation_id = '.$ilDB->quote($this->id, 'integer'));
255  }
256 
261  function delete()
262  {
263  global $ilDB;
264 
265  if($this->id)
266  {
267  return $ilDB->manipulate('DELETE FROM booking_reservation'.
268  ' WHERE booking_reservation_id = '.$ilDB->quote($this->id, 'integer'));
269  }
270  }
271 
276  public static function getNewGroupId()
277  {
278  global $ilDB;
279 
280  return $ilDB->nextId('booking_reservation_group');
281  }
282 
291  static function getAvailableObject(array $a_ids, $a_from, $a_to, $a_return_single = true, $a_return_counter = false)
292  {
293  global $ilDB;
294 
295  $nr_map = ilBookingObject::getNrOfItemsForObjects($a_ids);
296 
297  $from = $ilDB->quote($a_from, 'integer');
298  $to = $ilDB->quote($a_to, 'integer');
299 
300  $set = $ilDB->query('SELECT count(*) cnt, object_id'.
301  ' FROM booking_reservation'.
302  ' WHERE '.$ilDB->in('object_id', $a_ids, '', 'integer').
303  ' AND (status IS NULL OR status <> '.$ilDB->quote(self::STATUS_CANCELLED, 'integer').')'.
304  ' AND ((date_from <= '.$from.' AND date_to >= '.$from.')'.
305  ' OR (date_from <= '.$to.' AND date_to >= '.$to.')'.
306  ' OR (date_from >= '.$from.' AND date_to <= '.$to.'))'.
307  ' GROUP BY object_id');
308  $blocked = $counter = array();
309  while($row = $ilDB->fetchAssoc($set))
310  {
311  if($row['cnt'] >= $nr_map[$row['object_id']])
312  {
313  $blocked[] = $row['object_id'];
314  }
315  else if($a_return_counter)
316  {
317  $counter[$row['object_id']] = (int)$nr_map[$row['object_id']]-(int)$row['cnt'];
318  }
319  }
320 
321  // #17868 - validate against schedule availability
322  foreach($a_ids as $obj_id)
323  {
324  $bobj = new ilBookingObject($obj_id);
325  if($bobj->getScheduleId())
326  {
327  include_once "Modules/BookingManager/classes/class.ilBookingSchedule.php";
328  $schedule = new ilBookingSchedule($bobj->getScheduleId());
329 
330  $av_from = ($schedule->getAvailabilityFrom() && !$schedule->getAvailabilityFrom()->isNull())
331  ? $schedule->getAvailabilityFrom()->get(IL_CAL_UNIX)
332  : null;
333  $av_to = ($schedule->getAvailabilityTo() && !$schedule->getAvailabilityTo()->isNull())
334  ? strtotime($schedule->getAvailabilityTo()->get(IL_CAL_DATE)." 23:59:59")
335  : null;
336 
337  if(($av_from && $a_from < $av_from) ||
338  ($av_to && $a_to > $av_to))
339  {
340  $blocked[] = $obj_id;
341  unset($counter[$obj_id]);
342  }
343  }
344  }
345 
346  $available = array_diff($a_ids, $blocked);
347  if(sizeof($available))
348  {
349  if($a_return_counter)
350  {
351  foreach($a_ids as $id)
352  {
353  if(!isset($counter[$id]))
354  {
355  $counter[$id] = (int)$nr_map[$id];
356  }
357  }
358  return $counter;
359  }
360  else if($a_return_single)
361  {
362  return array_shift($available);
363  }
364  else
365  {
366  return $available;
367  }
368  }
369  }
370 
371  static function isObjectAvailableInPeriod($a_obj_id, ilBookingSchedule $a_schedule, $a_from, $a_to)
372  {
373  global $ilDB;
374 
375  if(!$a_from)
376  {
377  $a_from = time();
378  }
379  if(!$a_to)
380  {
381  $a_to = strtotime("+1year", $a_from);
382  }
383 
384  if($a_from > $a_to)
385  {
386  return;
387  }
388 
389  $from = $ilDB->quote($a_from, 'integer');
390  $to = $ilDB->quote($a_to, 'integer');
391 
392  // all bookings in period
393  $set = $ilDB->query('SELECT count(*) cnt'.
394  ' FROM booking_reservation'.
395  ' WHERE object_id = '.$ilDB->quote($a_obj_id, 'integer').
396  ' AND (status IS NULL OR status <> '.$ilDB->quote(self::STATUS_CANCELLED, 'integer').')'.
397  ' AND ((date_from <= '.$from.' AND date_to >= '.$from.')'.
398  ' OR (date_from <= '.$to.' AND date_to >= '.$to.')'.
399  ' OR (date_from >= '.$from.' AND date_to <= '.$to.'))');
400  $row = $ilDB->fetchAssoc($set);
401  $booked_in_period = $row["cnt"];
402 
403  $per_slot = ilBookingObject::getNrOfItemsForObjects(array($a_obj_id));
404  $per_slot = $per_slot[$a_obj_id];
405 
406  // max available nr of items per (week)day
407  $schedule_slots = array();
408  $definition = $a_schedule->getDefinition();
409  $map = array_flip(array("su", "mo", "tu", "we", "th", "fr", "sa"));
410  foreach($definition as $day => $day_slots)
411  {
412  $schedule_slots[$map[$day]] = $day_slots;
413  }
414 
415  $av_from = ($a_schedule->getAvailabilityFrom() && !$a_schedule->getAvailabilityFrom()->isNull())
416  ? $a_schedule->getAvailabilityFrom()->get(IL_CAL_UNIX)
417  : null;
418  $av_to = ($a_schedule->getAvailabilityTo() && !$a_schedule->getAvailabilityTo()->isNull())
419  ? strtotime($a_schedule->getAvailabilityTo()->get(IL_CAL_DATE)." 23:59:59")
420  : null;
421 
422  // sum up max available items in period per (week)day
423  $available_in_period = 0;
424  $loop = 0;
425  while($a_from < $a_to &&
426  ++$loop < 1000)
427  {
428  // any slots for current weekday?
429  $day_slots = $schedule_slots[date("w", $a_from)];
430  if($day_slots)
431  {
432  foreach($day_slots as $slot)
433  {
434  // convert slot to current datetime
435  $slot = explode("-", $slot);
436  $slot_from = strtotime(date("Y-m-d", $a_from)." ".$slot[0]);
437  $slot_to = strtotime(date("Y-m-d", $a_from)." ".$slot[1]);
438 
439  // slot has to be in the future and part of schedule availability
440  if($slot_to > time() &&
441  $slot_from >= $av_from &&
442  $slot_to <= $av_to)
443  {
444  $available_in_period += $per_slot;
445  }
446  }
447  }
448 
449  $a_from += (60*60*24);
450  }
451 
452  return (bool)($available_in_period-$booked_in_period);
453  }
454 
455  static function isObjectAvailableNoSchedule($a_obj_id)
456  {
457  global $ilDB;
458 
460  $all = (int)$all[$a_obj_id];
461 
462  $set = $ilDB->query('SELECT COUNT(*) cnt'.
463  ' FROM booking_reservation r'.
464  ' JOIN booking_object o ON (o.booking_object_id = r.object_id)'.
465  ' WHERE (status IS NULL OR status <> '.$ilDB->quote(self::STATUS_CANCELLED, 'integer').')'.
466  ' AND r.object_id = '.$ilDB->quote($a_obj_id, 'integer'));
467  $cnt = $ilDB->fetchAssoc($set);
468  $cnt = (int)$cnt['cnt'];
469 
470  return (bool)($all-$cnt); // #11864
471  }
472 
478  static function getCurrentOrUpcomingReservation($a_object_id)
479  {
480  global $ilDB;
481 
482  $now = $ilDB->quote(time(), 'integer');
483 
484  $ilDB->setLimit(1);
485  $set = $ilDB->query('SELECT user_id, status, date_from, date_to'.
486  ' FROM booking_reservation'.
487  ' WHERE ((date_from <= '.$now.' AND date_to >= '.$now.')'.
488  ' OR date_from > '.$now.')'.
489  ' AND (status <> '.$ilDB->quote(self::STATUS_CANCELLED, 'integer').
490  ' OR STATUS IS NULL) AND object_id = '.$ilDB->quote($a_object_id, 'integer').
491  ' ORDER BY date_from');
492  $row = $ilDB->fetchAssoc($set);
493  return $row;
494  }
495 
496  static function getObjectReservationForUser($a_object_id, $a_user_id, $a_multi = false)
497  {
498  global $ilDB;
499 
500  $set = $ilDB->query('SELECT booking_reservation_id FROM booking_reservation'.
501  ' WHERE user_id = '.$ilDB->quote($a_user_id, 'integer').
502  ' AND object_id = '.$ilDB->quote($a_object_id, 'integer').
503  ' AND (status <> '.$ilDB->quote(self::STATUS_CANCELLED, 'integer').
504  ' OR STATUS IS NULL)');
505  if(!$a_multi)
506  {
507  $row = $ilDB->fetchAssoc($set);
508  return $row['booking_reservation_id'];
509  }
510  else
511  {
512  $res = array();
513  while($row = $ilDB->fetchAssoc($set))
514  {
515  $res[] = $row['booking_reservation_id'];
516  }
517  return $res;
518  }
519  }
520 
529  static function getList($a_object_ids, $a_limit = 10, $a_offset = 0, array $filter)
530  {
531  global $ilDB;
532 
533  $sql = 'SELECT r.*,o.title'.
534  ' FROM booking_reservation r'.
535  ' JOIN booking_object o ON (o.booking_object_id = r.object_id)';
536 
537  $count_sql = 'SELECT COUNT(*) AS counter'.
538  ' FROM booking_reservation r'.
539  ' JOIN booking_object o ON (o.booking_object_id = r.object_id)';
540 
541  $where = array($ilDB->in('r.object_id', $a_object_ids, '', 'integer'));
542  if($filter['status'])
543  {
544  if($filter['status'] > 0)
545  {
546  $where[] = 'status = '.$ilDB->quote($filter['status'], 'integer');
547  }
548  else
549  {
550  $where[] = '(status != '.$ilDB->quote(-$filter['status'], 'integer').
551  ' OR status IS NULL)';
552  }
553  }
554  if($filter['from'])
555  {
556  $where[] = 'date_from >= '.$ilDB->quote($filter['from'], 'integer');
557  }
558  if($filter['to'])
559  {
560  $where[] = 'date_to <= '.$ilDB->quote($filter['to'], 'integer');
561  }
562  if(sizeof($where))
563  {
564  $sql .= ' WHERE '.implode(' AND ', $where);
565  $count_sql .= ' WHERE '.implode(' AND ', $where);
566  }
567 
568  $set = $ilDB->query($count_sql);
569  $row = $ilDB->fetchAssoc($set);
570  $counter = $row['counter'];
571 
572  $sql .= ' ORDER BY date_from DESC, booking_reservation_id DESC';
573 
574  $ilDB->setLimit($a_limit, $a_offset);
575  $set = $ilDB->query($sql);
576  $res = array();
577  while($row = $ilDB->fetchAssoc($set))
578  {
579  $res[] = $row;
580  }
581 
582  return array('data'=>$res, 'counter'=>$counter);
583  }
584 
596  static function getListByDate($a_has_schedule, array $a_object_ids, array $filter = null)
597  {
598  global $ilDB;
599 
600  $res = array();
601 
602  $sql = 'SELECT r.*, o.title'.
603  ' FROM booking_reservation r'.
604  ' JOIN booking_object o ON (o.booking_object_id = r.object_id)';
605 
606  $where = array($ilDB->in('object_id', $a_object_ids, '', 'integer'));
607  if($filter['status'])
608  {
609  if($filter['status'] > 0)
610  {
611  $where[] = 'status = '.$ilDB->quote($filter['status'], 'integer');
612  }
613  else
614  {
615  $where[] = '(status != '.$ilDB->quote(-$filter['status'], 'integer').
616  ' OR status IS NULL)';
617  }
618  }
619  if($filter['title'])
620  {
621  $where[] = '('.$ilDB->like('title', 'text', '%'.$filter['title'].'%').
622  ' OR '.$ilDB->like('description', 'text', '%'.$filter['title'].'%').')';
623  }
624  if($a_has_schedule)
625  {
626  if($filter['from'])
627  {
628  $where[] = 'date_from >= '.$ilDB->quote($filter['from'], 'integer');
629  }
630  if($filter['to'])
631  {
632  $where[] = 'date_to <= '.$ilDB->quote($filter['to'], 'integer');
633  }
634  if(!$filter['past'])
635  {
636  $where[] = 'date_to > '.$ilDB->quote(time(), 'integer');
637  }
638  }
639  if($filter['user_id']) // #16584
640  {
641  $where[] = 'user_id = '.$ilDB->quote($filter['user_id'], 'integer');
642  }
643  /*
644  if($a_group_id)
645  {
646  $where[] = 'group_id = '.$ilDB->quote(substr($a_group_id, 1), 'integer');
647  }
648  */
649  if(sizeof($where))
650  {
651  $sql .= ' WHERE '.implode(' AND ', $where);
652  }
653 
654  if($a_has_schedule)
655  {
656  $sql .= ' ORDER BY date_from DESC';
657  }
658  else
659  {
660  // #16155 - could be cancelled and re-booked
661  $sql .= ' ORDER BY status';
662  }
663 
664  $set = $ilDB->query($sql);
665  while($row = $ilDB->fetchAssoc($set))
666  {
667  $obj_id = $row["object_id"];
668  $user_id = $row["user_id"];
669 
670  if($a_has_schedule)
671  {
672  $slot = $row["date_from"]."_".$row["date_to"];
673  $idx = $obj_id."_".$user_id."_".$slot;
674  }
675  else
676  {
677  $idx = $obj_id."_".$user_id;
678  }
679 
680  if($a_has_schedule && $filter["slot"])
681  {
682  $slot_idx = date("w", $row["date_from"])."_".date("H:i", $row["date_from"]).
683  "-".date("H:i", $row["date_to"]+1);
684  if($filter["slot"] != $slot_idx)
685  {
686  continue;
687  }
688  }
689 
690  if(!isset($res[$idx]))
691  {
693 
694  $res[$idx] = array(
695  "object_id" => $obj_id
696  ,"title" => $row["title"]
697  ,"user_id" => $user_id
698  ,"counter" => 1
699  ,"user_name" => $uname["lastname"].", ".$uname["firstname"] // #17862
700  );
701 
702  if($a_has_schedule)
703  {
704  $res[$idx]["booking_reservation_id"] = $idx;
705  $res[$idx]["date"] = date("Y-m-d", $row["date_from"]);
706  $res[$idx]["slot"] = date("H:i", $row["date_from"])." - ".
707  date("H:i", $row["date_to"]+1);
708  $res[$idx]["week"] = date("W", $row["date_from"]);
709  $res[$idx]["weekday"] = date("w", $row["date_from"]);
710  $res[$idx]["can_be_cancelled"] = ($row["status"] != self::STATUS_CANCELLED &&
711  $row["date_from"] > time());
712  $res[$idx]["_sortdate"] = $row["date_from"];
713  }
714  else
715  {
716  $res[$idx]["booking_reservation_id"] = $row["booking_reservation_id"];
717  $res[$idx]["status"] = $row["status"];
718  $res[$idx]["can_be_cancelled"] = ($row["status"] != self::STATUS_CANCELLED);
719  }
720  }
721  else
722  {
723  $res[$idx]["counter"]++;
724  }
725  }
726 
727  return $res;
728  }
729 
736  public static function getUserFilter(array $a_object_ids)
737  {
738  global $ilDB;
739 
740  $res = array();
741 
742  $sql = "SELECT ud.usr_id,ud.lastname,ud.firstname,ud.login".
743  " FROM usr_data ud ".
744  " LEFT JOIN booking_reservation r ON (r.user_id = ud.usr_id)".
745  " WHERE ud.usr_id <> ".$ilDB->quote(ANONYMOUS_USER_ID, "integer").
746  " AND ".$ilDB->in("r.object_id", $a_object_ids, "", "integer").
747  " ORDER BY ud.lastname,ud.firstname";
748  $set = $ilDB->query($sql);
749  while($row = $ilDB->fetchAssoc($set))
750  {
751  $res[$row["usr_id"]] = $row["lastname"].", ".$row["firstname"].
752  " (".$row["login"].")";
753  }
754 
755  return $res;
756  }
757 
767  /*
768  static function getGroupedList($a_object_ids, $a_limit = 10, $a_offset = 0, array $filter = null, $a_group_id = null)
769  {
770  global $ilDB;
771 
772  // CURRENTLY UNUSED!!!
773  return;
774 
775  // find matching groups / reservations
776 
777  $sql = 'SELECT booking_reservation_id, group_id'.
778  ' FROM booking_reservation';
779 
780  $where = array($ilDB->in('object_id', $a_object_ids, '', 'integer'));
781  if($filter['status'])
782  {
783  if($filter['status'] > 0)
784  {
785  $where[] = 'status = '.$ilDB->quote($filter['status'], 'integer');
786  }
787  else
788  {
789  $where[] = '(status != '.$ilDB->quote(-$filter['status'], 'integer').
790  ' OR status IS NULL)';
791  }
792  }
793  if($filter['from'])
794  {
795  $where[] = 'date_from >= '.$ilDB->quote($filter['from'], 'integer');
796  }
797  if($filter['to'])
798  {
799  $where[] = 'date_to <= '.$ilDB->quote($filter['to'], 'integer');
800  }
801  if($filter['user_id'])
802  {
803  $where[] = 'user_id = '.$ilDB->quote($filter['user_id'], 'integer');
804  }
805  if($a_group_id)
806  {
807  $where[] = 'group_id = '.$ilDB->quote(substr($a_group_id, 1), 'integer');
808  }
809  if(sizeof($where))
810  {
811  $sql .= ' WHERE '.implode(' AND ', $where);
812  }
813 
814  $grp_ids = $rsv_ids = array();
815  $set = $ilDB->query($sql);
816  while($row = $ilDB->fetchAssoc($set))
817  {
818  if($row["group_id"])
819  {
820  $grp_ids[] = $row["group_id"];
821  }
822  else
823  {
824  $rsv_ids[] = $row["booking_reservation_id"];
825  }
826  }
827 
828  $res = array();
829 
830  // get complete groups (and/or reservations)
831 
832  if($grp_ids || $rsv_ids)
833  {
834  $grp_ids = array_unique($grp_ids);
835 
836  // if result is on last page, reduce limit to entries on last page
837  $max_page = sizeof($grp_ids)+sizeof($rsv_ids);
838  $max_page = min($a_limit, $max_page-$a_offset);
839 
840  $sql = 'SELECT r.*,o.title'.
841  ' FROM booking_reservation r'.
842  ' JOIN booking_object o ON (o.booking_object_id = r.object_id)';
843 
844  $where = array();
845  if($grp_ids)
846  {
847  $where[] = $ilDB->in('group_id', $grp_ids, '', 'integer');
848  }
849  if($rsv_ids)
850  {
851  $where[] = $ilDB->in('booking_reservation_id', $rsv_ids, '', 'integer');
852  }
853 
854  $sql .= ' WHERE ('.implode(' OR ', $where).')'.
855  ' ORDER BY date_from DESC, booking_reservation_id DESC';
856 
857  $set = $ilDB->query($sql);
858  $grps = array();
859  $counter = 0;
860  while($row = $ilDB->fetchAssoc($set))
861  {
862  if($row["group_id"] && !$a_group_id)
863  {
864  if(!isset($grps[$row["group_id"]]))
865  {
866  $grps[$row["group_id"]] = 1;
867  $counter++;
868  }
869  else
870  {
871  $grps[$row["group_id"]]++;
872  }
873  }
874  else
875  {
876  $counter++;
877  }
878 
879  if($a_group_id ||
880  ($counter > $a_offset &&
881  (sizeof($res) < $max_page ||
882  // if group is current page we have to get all group entries, regardless of booking period
883  ($row["group_id"] && isset($res["g".$row["group_id"]])))))
884  {
885  if($row["group_id"] && !$a_group_id)
886  {
887  $group_id = "g".$row["group_id"];
888  $res[$group_id]["group_id"] = $group_id;
889  $res[$group_id]["details"][] = $row;
890  }
891  else
892  {
893  unset($row["group_id"]);
894  $res[] = $row;
895  }
896  }
897  }
898  }
899 
900  include_once('./Services/Calendar/classes/class.ilCalendarUtil.php');
901 
902  foreach($res as $idx => $item)
903  {
904  if(isset($item["details"]))
905  {
906  $res[$idx]["date_from"] = null;
907  $res[$idx]["date_to"] = null;
908 
909  $weekdays = $week_counter = array();
910  $recur = $last = 0;
911 
912  foreach($item["details"] as $detail)
913  {
914  // same for each item
915  $res[$idx]["user_id"] = $detail["user_id"];
916  $res[$idx]["object_id"] = $detail["object_id"];
917  $res[$idx]["title"] = $detail["title"];
918  $res[$idx]["booking_reservation_id"] = $detail["booking_reservation_id"];
919 
920  // recurrence/weekdays
921  $sortkey = date("wHi", $detail["date_from"])."_".date("wHi", $detail["date_to"]);
922  $weekdays[$sortkey] = ilCalendarUtil::_numericDayToString(date("w", $detail["date_from"]), false).
923  ", ".date("H:i", $detail["date_from"]).
924  " - ".date("H:i", $detail["date_to"]);
925 
926  if($detail["status"] != self::STATUS_CANCELLED)
927  {
928  $week_counter[$sortkey][date("WHi", $detail["date_from"])."_".date("WHi", $detail["date_to"])]++;
929  }
930  else if(!isset($week_counter[$sortkey][date("WHi", $detail["date_from"])."_".date("WHi", $detail["date_to"])]))
931  {
932  $week_counter[$sortkey][date("WHi", $detail["date_from"])."_".date("WHi", $detail["date_to"])] = 0;
933  }
934 
935  if($last && $last-$detail["date_to"] > $recur)
936  {
937  $recur = $last-$detail["date_to"];
938  }
939 
940  // min/max period
941  if(!$res[$idx]["date_from"] || $detail["date_from"] < $res[$idx]["date_from"])
942  {
943  $res[$idx]["date_from"] = $detail["date_from"];
944  }
945  if(!$res[$idx]["date_to"] || $detail["date_to"] > $res[$idx]["date_to"])
946  {
947  $res[$idx]["date_to"] = $detail["date_to"];
948  }
949 
950  $last = $detail["date_to"];
951  }
952 
953  if(sizeof($item["details"]) > 1)
954  {
955  $weekdays = array_unique($weekdays);
956  ksort($weekdays);
957 
958  foreach($weekdays as $week_id => $weekday)
959  {
960  $min = min($week_counter[$week_id]);
961  $max = max($week_counter[$week_id]);
962  if($min == $max)
963  {
964  $weekdays[$week_id] .= " (".$min.")";
965  }
966  else
967  {
968  $weekdays[$week_id] .= " (".$min."-".$max.")";
969  }
970  }
971 
972 
973  $res[$idx]["weekdays"] = array_values($weekdays);
974  if($recur)
975  {
976  if(date("YW", $res[$idx]["date_to"]) != date("YW", $res[$idx]["date_from"]))
977  {
978  $recur = ceil(($recur/(60*60*24))/7);
979  }
980  else
981  {
982  $recur = 0;
983  }
984  }
985  $res[$idx]["recurrence"] = (int)$recur;
986 
987  $res[$idx]["booking_reservation_id"] = $idx;
988  $res[$idx]["title"] .= " (".sizeof($item["details"]).")";
989 
990  }
991  else
992  {
993  // undo grouping
994  $res[$idx] = array_pop($item["details"]);
995  unset($res[$idx]["group_id"]);
996  }
997  }
998  }
999 
1000  $res = ilUtil::sortArray($res, "date_from", "desc", true);
1001 
1002  return array('data'=>$res, 'counter'=>$counter);
1003  }
1004  */
1005 
1012  static function changeStatus(array $a_ids, $a_status)
1013  {
1014  global $ilDB;
1015 
1016  if(self::isValidStatus($a_status))
1017  {
1018  return $ilDB->manipulate('UPDATE booking_reservation'.
1019  ' SET status = '.$ilDB->quote($a_status, 'integer').
1020  ' WHERE '.$ilDB->in('booking_reservation_id', $a_ids, '', 'integer'));
1021 
1022  }
1023  }
1024 
1025  function getCalendarEntry()
1026  {
1027  global $ilDB;
1028 
1029  include_once 'Services/Calendar/classes/class.ilCalendarCategory.php';
1030 
1031  $set = $ilDB->query("SELECT ce.cal_id FROM cal_entries ce".
1032  " JOIN cal_cat_assignments cca ON ce.cal_id = cca.cal_id".
1033  " JOIN cal_categories cc ON cca.cat_id = cc.cat_id".
1034  " JOIN booking_reservation br ON ce.context_id = br.booking_reservation_id".
1035  " WHERE cc.obj_id = ".$ilDB->quote($this->getUserId(),'integer').
1036  " AND br.user_id = ".$ilDB->quote($this->getUserId(),'integer').
1037  " AND cc.type = ".$ilDB->quote(ilCalendarCategory::TYPE_BOOK,'integer').
1038  " AND ce.context_id = ".$ilDB->quote($this->getId(), 'integer'));
1039  $row = $ilDB->fetchAssoc($set);
1040  return $row["cal_id"];
1041  }
1042 
1052  public static function getCancelDetails($a_obj_id, $a_user_id, $a_from, $a_to)
1053  {
1054  global $ilDB;
1055 
1056  $res = array();
1057 
1058  $sql = "SELECT booking_reservation_id".
1059  " FROM booking_reservation".
1060  " WHERE object_id = ".$ilDB->quote($a_obj_id, "integer").
1061  " AND user_id = ".$ilDB->quote($a_user_id, "integer").
1062  " AND date_from = ".$ilDB->quote($a_from, "integer").
1063  " AND date_to = ".$ilDB->quote($a_to, "integer").
1064  " AND (status IS NULL".
1065  " OR status <> ".$ilDB->quote(self::STATUS_CANCELLED, "integer").")";
1066  $set = $ilDB->query($sql);
1067  while($row = $ilDB->fetchAssoc($set))
1068  {
1069  $res[] = $row["booking_reservation_id"];
1070  }
1071 
1072  return $res;
1073  }
1074 }
1075 
1076 ?>
File written to
static _lookupName($a_user_id)
lookup user name
a bookable ressource
setStatus($a_status)
Set booking status.
setGroupId($a_group_id)
Set group id.
static isObjectAvailableNoSchedule($a_obj_id)
static getUserFilter(array $a_object_ids)
Get all users who have reservations for object(s)
static getNewGroupId()
Get next group id.
getAvailabilityFrom()
Get availability start.
setFrom($a_from)
Set booking from date.
schedule for booking ressource
getAvailabilityTo()
Get availability end.
getStatus()
Get booking status.
const IL_CAL_UNIX
static getListByDate($a_has_schedule, array $a_object_ids, array $filter=null)
List all reservations by date.
getFrom()
Get booking from date.
$counter
static getNrOfItemsForObjects(array $a_obj_ids)
Get nr of available items.
static isValidStatus($a_status)
Check if given status is valid.
static getObjectReservationForUser($a_object_id, $a_user_id, $a_multi=false)
date( 'd-M-Y', $objPHPExcel->getProperties() ->getCreated())
getDefinition()
Get definition.
setObjectId($a_object_id)
Set object id.
static getCurrentOrUpcomingReservation($a_object_id)
Get details about object reservation.
Create styles array
The data for the language used.
static getAvailableObject(array $a_ids, $a_from, $a_to, $a_return_single=true, $a_return_counter=false)
Check if any of given objects are bookable.
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.
global $ilDB
setUserId($a_user_id)
Set booking user id.
save()
Create new entry in db.
static getCancelDetails($a_obj_id, $a_user_id, $a_from, $a_to)
Get reservation ids from aggregated id for cancellation.
Add data(end) time
Method that wraps PHPs time in order to allow simulations with the workflow.
static changeStatus(array $a_ids, $a_status)
List all reservations.
__construct($a_id=NULL)
Constructor.
getUserId()
Get booking user id.
getTo()
Get booking to date.
setTo($a_to)
Set booking to date.