ILIAS  Release_4_4_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
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  $available = array_diff($a_ids, $blocked);
321  if(sizeof($available))
322  {
323  if($a_return_counter)
324  {
325  foreach($a_ids as $id)
326  {
327  if(!isset($counter[$id]))
328  {
329  $counter[$id] = (int)$nr_map[$id];
330  }
331  }
332  return $counter;
333  }
334  else if($a_return_single)
335  {
336  return array_shift($available);
337  }
338  else
339  {
340  return $available;
341  }
342  }
343  }
344 
345  static function isObjectAvailableNoSchedule($a_obj_id)
346  {
347  global $ilDB;
348 
349  $all = ilBookingObject::getNrOfItemsForObjects(array($a_obj_id));
350  $all = (int)$all[$a_obj_id];
351 
352  $set = $ilDB->query('SELECT COUNT(*) cnt'.
353  ' FROM booking_reservation r'.
354  ' JOIN booking_object o ON (o.booking_object_id = r.object_id)'.
355  ' WHERE (status IS NULL OR status <> '.$ilDB->quote(self::STATUS_CANCELLED, 'integer').')'.
356  ' AND r.object_id = '.$ilDB->quote($a_obj_id, 'integer'));
357  $cnt = $ilDB->fetchAssoc($set);
358  $cnt = (int)$cnt['cnt'];
359 
360  return (bool)($all-$cnt); // #11864
361  }
362 
368  static function getCurrentOrUpcomingReservation($a_object_id)
369  {
370  global $ilDB;
371 
372  $now = $ilDB->quote(time(), 'integer');
373 
374  $ilDB->setLimit(1);
375  $set = $ilDB->query('SELECT user_id, status, date_from, date_to'.
376  ' FROM booking_reservation'.
377  ' WHERE ((date_from <= '.$now.' AND date_to >= '.$now.')'.
378  ' OR date_from > '.$now.')'.
379  ' AND (status <> '.$ilDB->quote(self::STATUS_CANCELLED, 'integer').
380  ' OR STATUS IS NULL) AND object_id = '.$ilDB->quote($a_object_id, 'integer').
381  ' ORDER BY date_from');
382  $row = $ilDB->fetchAssoc($set);
383  return $row;
384  }
385 
386  static function getObjectReservationForUser($a_object_id, $a_user_id)
387  {
388  global $ilDB;
389 
390  $set = $ilDB->query('SELECT booking_reservation_id FROM booking_reservation'.
391  ' WHERE user_id = '.$ilDB->quote($a_user_id, 'integer').
392  ' AND object_id = '.$ilDB->quote($a_object_id, 'integer').
393  ' AND (status <> '.$ilDB->quote(self::STATUS_CANCELLED, 'integer').
394  ' OR STATUS IS NULL)');
395  $row = $ilDB->fetchAssoc($set);
396  return $row['booking_reservation_id'];
397  }
398 
407  static function getList($a_object_ids, $a_limit = 10, $a_offset = 0, array $filter)
408  {
409  global $ilDB;
410 
411  $sql = 'SELECT r.*,o.title'.
412  ' FROM booking_reservation r'.
413  ' JOIN booking_object o ON (o.booking_object_id = r.object_id)';
414 
415  $count_sql = 'SELECT COUNT(*) AS counter'.
416  ' FROM booking_reservation r'.
417  ' JOIN booking_object o ON (o.booking_object_id = r.object_id)';
418 
419  $where = array($ilDB->in('r.object_id', $a_object_ids, '', 'integer'));
420  if($filter['status'])
421  {
422  if($filter['status'] > 0)
423  {
424  $where[] = 'status = '.$ilDB->quote($filter['status'], 'integer');
425  }
426  else
427  {
428  $where[] = '(status != '.$ilDB->quote(-$filter['status'], 'integer').
429  ' OR status IS NULL)';
430  }
431  }
432  if($filter['from'])
433  {
434  $where[] = 'date_from >= '.$ilDB->quote($filter['from'], 'integer');
435  }
436  if($filter['to'])
437  {
438  $where[] = 'date_to <= '.$ilDB->quote($filter['to'], 'integer');
439  }
440  if(sizeof($where))
441  {
442  $sql .= ' WHERE '.implode(' AND ', $where);
443  $count_sql .= ' WHERE '.implode(' AND ', $where);
444  }
445 
446  $set = $ilDB->query($count_sql);
447  $row = $ilDB->fetchAssoc($set);
448  $counter = $row['counter'];
449 
450  $sql .= ' ORDER BY date_from DESC, booking_reservation_id DESC';
451 
452  $ilDB->setLimit($a_limit, $a_offset);
453  $set = $ilDB->query($sql);
454  $res = array();
455  while($row = $ilDB->fetchAssoc($set))
456  {
457  $res[] = $row;
458  }
459 
460  return array('data'=>$res, 'counter'=>$counter);
461  }
462 
472  static function getGroupedList($a_object_ids, $a_limit = 10, $a_offset = 0, array $filter = null, $a_group_id = null)
473  {
474  global $ilDB;
475 
476  $sql = 'SELECT r.*,o.title'.
477  ' FROM booking_reservation r'.
478  ' JOIN booking_object o ON (o.booking_object_id = r.object_id)';
479 
480  $where = array($ilDB->in('r.object_id', $a_object_ids, '', 'integer'));
481  if($filter['status'])
482  {
483  if($filter['status'] > 0)
484  {
485  $where[] = 'status = '.$ilDB->quote($filter['status'], 'integer');
486  }
487  else
488  {
489  $where[] = '(status != '.$ilDB->quote(-$filter['status'], 'integer').
490  ' OR status IS NULL)';
491  }
492  }
493  if($filter['from'])
494  {
495  $where[] = 'date_from >= '.$ilDB->quote($filter['from'], 'integer');
496  }
497  if($filter['to'])
498  {
499  $where[] = 'date_to <= '.$ilDB->quote($filter['to'], 'integer');
500  }
501  if($a_group_id)
502  {
503  $where[] = 'group_id = '.$ilDB->quote(substr($a_group_id, 1), 'integer');
504  }
505  if(sizeof($where))
506  {
507  $sql .= ' WHERE '.implode(' AND ', $where);
508  }
509 
510  $sql .= ' ORDER BY date_from DESC, booking_reservation_id DESC';
511 
512  $set = $ilDB->query($sql);
513  $res = $grps = array();
514  $counter = 0;
515  while($row = $ilDB->fetchAssoc($set))
516  {
517  if($row["group_id"] && !$a_group_id)
518  {
519  if(!isset($grps[$row["group_id"]]))
520  {
521  $grps[$row["group_id"]] = 1;
522  $counter++;
523  }
524  else
525  {
526  $grps[$row["group_id"]]++;
527  }
528  }
529  else
530  {
531  $counter++;
532  }
533 
534  if($a_group_id || ($counter > $a_offset && sizeof($res) < $a_limit))
535  {
536  if($row["group_id"] && !$a_group_id)
537  {
538  $group_id = "g".$row["group_id"];
539  $res[$group_id]["group_id"] = $group_id;
540  $res[$group_id]["details"][] = $row;
541  }
542  else
543  {
544  unset($row["group_id"]);
545  $res[] = $row;
546  }
547  }
548  }
549 
550  foreach($res as $idx => $item)
551  {
552  if(isset($item["details"]))
553  {
554  $res[$idx]["date_from"] = null;
555  $res[$idx]["date_to"] = null;
556 
557  foreach($item["details"] as $detail)
558  {
559  // same for each item
560  $res[$idx]["user_id"] = $detail["user_id"];
561  $res[$idx]["object_id"] = $detail["object_id"];
562  $res[$idx]["title"] = $detail["title"];
563  $res[$idx]["booking_reservation_id"] = $detail["booking_reservation_id"];
564 
565  // min/max period
566  if(!$res[$idx]["date_from"] || $detail["date_from"] < $res[$idx]["date_from"])
567  {
568  $res[$idx]["date_from"] = $detail["date_from"];
569  }
570  if(!$res[$idx]["date_to"] || $detail["date_to"] > $res[$idx]["date_to"])
571  {
572  $res[$idx]["date_to"] = $detail["date_to"];
573  }
574  }
575 
576  if(sizeof($item["details"]) > 1)
577  {
578  $res[$idx]["booking_reservation_id"] = $idx;
579  $res[$idx]["title"] .= " (".sizeof($item["details"]).")";
580  }
581  else
582  {
583  $res[$idx]["status"] = $detail["status"];
584  unset($res[$idx]["group_id"]);
585  }
586  }
587  }
588 
589  return array('data'=>$res, 'counter'=>$counter);
590  }
591 
598  static function changeStatus(array $a_ids, $a_status)
599  {
600  global $ilDB;
601 
602  if(self::isValidStatus($a_status))
603  {
604  return $ilDB->manipulate('UPDATE booking_reservation'.
605  ' SET status = '.$ilDB->quote($a_status, 'integer').
606  ' WHERE '.$ilDB->in('booking_reservation_id', $a_ids, '', 'integer'));
607 
608  }
609  }
610 
611  function getCalendarEntry()
612  {
613  global $ilDB;
614 
615  include_once 'Services/Calendar/classes/class.ilCalendarCategory.php';
616 
617  $set = $ilDB->query("SELECT ce.cal_id FROM cal_entries ce".
618  " JOIN cal_cat_assignments cca ON ce.cal_id = cca.cal_id".
619  " JOIN cal_categories cc ON cca.cat_id = cc.cat_id".
620  " JOIN booking_reservation br ON ce.context_id = br.booking_reservation_id".
621  " WHERE cc.obj_id = ".$ilDB->quote($this->getUserId(),'integer').
622  " AND br.user_id = ".$ilDB->quote($this->getUserId(),'integer').
623  " AND cc.type = ".$ilDB->quote(ilCalendarCategory::TYPE_BOOK,'integer').
624  " AND ce.context_id = ".$ilDB->quote($this->getId(), 'integer'));
625  $row = $ilDB->fetchAssoc($set);
626  return $row["cal_id"];
627  }
628 }
629 
630 ?>