ILIAS  Release_4_2_x_branch Revision 61807
 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 
21  const STATUS_IN_USE = 2;
22  const STATUS_CANCELLED = 5;
23 
31  function __construct($a_id = NULL)
32  {
33  $this->id = (int)$a_id;
34  $this->read();
35  }
36 
41  function getId()
42  {
43  return $this->id;
44  }
45 
50  function setObjectId($a_object_id)
51  {
52  $this->object_id = $a_object_id;
53  }
54 
59  function getObjectId()
60  {
61  return $this->object_id;
62  }
63 
68  function setUserId($a_user_id)
69  {
70  $this->user_id = (int)$a_user_id;
71  }
72 
77  function getUserId()
78  {
79  return $this->user_id;
80  }
81 
86  function setFrom($a_from)
87  {
88  $this->from = (int)$a_from;
89  }
90 
95  function getFrom()
96  {
97  return $this->from;
98  }
99 
104  function setTo($a_to)
105  {
106  $this->to = (int)$a_to;
107  }
108 
113  function getTo()
114  {
115  return $this->to;
116  }
117 
122  function setStatus($a_status)
123  {
124  if($a_status === NULL)
125  {
126  $this->status = NULL;
127  }
128  if($this->isValidStatus((int)$a_status))
129  {
130  $this->status = (int)$a_status;
131  }
132  }
133 
138  function getStatus()
139  {
140  return $this->status;
141  }
142 
148  static function isValidStatus($a_status)
149  {
150  if(in_array($a_status, array(self::STATUS_IN_USE, self::STATUS_CANCELLED)))
151  {
152  return true;
153  }
154  return false;
155  }
156 
160  protected function read()
161  {
162  global $ilDB;
163 
164  if($this->id)
165  {
166  $set = $ilDB->query('SELECT object_id,user_id,date_from,date_to,status'.
167  ' FROM booking_reservation'.
168  ' WHERE booking_reservation_id = '.$ilDB->quote($this->id, 'integer'));
169  $row = $ilDB->fetchAssoc($set);
170  $this->setUserId($row['user_id']);
171  $this->setObjectId($row['object_id']);
172  $this->setFrom($row['date_from']);
173  $this->setTo($row['date_to']);
174  $this->setStatus($row['status']);
175  }
176  }
177 
182  function save()
183  {
184  global $ilDB;
185 
186  if($this->id)
187  {
188  return false;
189  }
190 
191  $this->id = $ilDB->nextId('booking_reservation');
192 
193  return $ilDB->manipulate('INSERT INTO booking_reservation'.
194  ' (booking_reservation_id,user_id,object_id,date_from,date_to,status)'.
195  ' VALUES ('.$ilDB->quote($this->id, 'integer').','.$ilDB->quote($this->getUserId(), 'integer').
196  ','.$ilDB->quote($this->getObjectId(), 'integer').','.$ilDB->quote($this->getFrom(), 'integer').
197  ','.$ilDB->quote($this->getTo(), 'integer').','.$ilDB->quote($this->getStatus(), 'integer').')');
198  }
199 
204  function update()
205  {
206  global $ilDB;
207 
208  if(!$this->id)
209  {
210  return false;
211  }
212 
213  // there can only be 1
214  if($this->getStatus() == self::STATUS_IN_USE)
215  {
216  $ilDB->manipulate('UPDATE booking_reservation'.
217  ' SET status = '.$ilDB->quote(NULL, 'integer').
218  ' WHERE object_id = '.$ilDB->quote($this->getObjectId(), 'integer').
219  ' AND status = '.$ilDB->quote(self::STATUS_IN_USE, 'integer'));
220  }
221 
222  return $ilDB->manipulate('UPDATE booking_reservation'.
223  ' SET object_id = '.$ilDB->quote($this->getObjectId(), 'text').
224  ', user_id = '.$ilDB->quote($this->getUserId(), 'integer').
225  ', date_from = '.$ilDB->quote($this->getFrom(), 'integer').
226  ', date_to = '.$ilDB->quote($this->getTo(), 'integer').
227  ', status = '.$ilDB->quote($this->getStatus(), 'integer').
228  ' WHERE booking_reservation_id = '.$ilDB->quote($this->id, 'integer'));
229  }
230 
235  function delete()
236  {
237  global $ilDB;
238 
239  if($this->id)
240  {
241  return $ilDB->manipulate('DELETE FROM booking_reservation'.
242  ' WHERE booking_reservation_id = '.$ilDB->quote($this->id, 'integer'));
243  }
244  }
245 
254  static function getAvailableObject(array $a_ids, $a_from, $a_to, $a_return_single = true)
255  {
256  global $ilDB;
257 
258  $from = $ilDB->quote($a_from, 'integer');
259  $to = $ilDB->quote($a_to, 'integer');
260 
261  $set = $ilDB->query('SELECT object_id'.
262  ' FROM booking_reservation'.
263  ' WHERE '.$ilDB->in('object_id', $a_ids, '', 'integer').
264  ' AND (status IS NULL OR status <> '.$ilDB->quote(self::STATUS_CANCELLED, 'integer').')'.
265  ' AND ((date_from <= '.$from.' AND date_to >= '.$from.')'.
266  ' OR (date_from <= '.$to.' AND date_to >= '.$to.')'.
267  ' OR (date_from >= '.$from.' AND date_to <= '.$to.'))');
268  $blocked = array();
269  while($row = $ilDB->fetchAssoc($set))
270  {
271  $blocked[] = $row['object_id'];
272  }
273  $available = array_diff($a_ids, $blocked);
274  if(sizeof($available))
275  {
276  if($a_return_single)
277  {
278  return array_shift($available);
279  }
280  else
281  {
282  return $available;
283  }
284  }
285  }
286 
292  static function getCurrentOrUpcomingReservation($a_object_id)
293  {
294  global $ilDB;
295 
296  $now = $ilDB->quote(time(), 'integer');
297 
298  $ilDB->setLimit(1);
299  $set = $ilDB->query('SELECT user_id, status, date_from, date_to'.
300  ' FROM booking_reservation'.
301  ' WHERE ((date_from <= '.$now.' AND date_to >= '.$now.')'.
302  ' OR date_from > '.$now.')'.
303  ' AND status <> '.$ilDB->quote(self::STATUS_CANCELLED, 'integer').
304  ' AND object_id = '.$ilDB->quote($a_object_id, 'integer').
305  ' ORDER BY date_from');
306  $row = $ilDB->fetchAssoc($set);
307  return $row;
308  }
309 
318  static function getList($a_object_ids, $a_limit = 10, $a_offset = 0, array $filter)
319  {
320  global $ilDB;
321 
322  $sql = 'SELECT r.*,o.title'.
323  ' FROM booking_reservation r'.
324  ' JOIN booking_object o ON (o.booking_object_id = r.object_id)';
325 
326  $count_sql = 'SELECT COUNT(*) AS counter'.
327  ' FROM booking_reservation r'.
328  ' JOIN booking_object o ON (o.booking_object_id = r.object_id)';
329 
330  $where = array($ilDB->in('r.object_id', $a_object_ids, '', 'integer'));
331  if($filter['type'])
332  {
333  $where[] = 'type_id = '.$ilDB->quote($filter['type'], 'integer');
334  }
335  if($filter['status'])
336  {
337  if($filter['status'] > 0)
338  {
339  $where[] = 'status = '.$ilDB->quote($filter['status'], 'integer');
340  }
341  else
342  {
343  $where[] = 'status != '.$ilDB->quote(-$filter['status'], 'integer');
344  }
345  }
346  if($filter['from'])
347  {
348  $where[] = 'date_from >= '.$ilDB->quote($filter['from'], 'integer');
349  }
350  if($filter['to'])
351  {
352  $where[] = 'date_to <= '.$ilDB->quote($filter['to'], 'integer');
353  }
354  if(sizeof($where))
355  {
356  $sql .= ' WHERE '.implode(' AND ', $where);
357  $count_sql .= ' WHERE '.implode(' AND ', $where);
358  }
359 
360  $set = $ilDB->query($count_sql);
361  $row = $ilDB->fetchAssoc($set);
362  $counter = $row['counter'];
363 
364  $sql .= ' ORDER BY date_from DESC, booking_reservation_id DESC';
365 
366  $ilDB->setLimit($a_limit, $a_offset);
367  $set = $ilDB->query($sql);
368  while($row = $ilDB->fetchAssoc($set))
369  {
370  $res[] = $row;
371  }
372 
373  return array('data'=>$res, 'counter'=>$counter);
374  }
375 
382  static function changeStatus(array $a_ids, $a_status)
383  {
384  global $ilDB;
385 
386  if(self::isValidStatus($a_status))
387  {
388  return $ilDB->manipulate('UPDATE booking_reservation'.
389  ' SET status = '.$ilDB->quote($a_status, 'integer').
390  ' WHERE '.$ilDB->in('booking_reservation_id', $a_ids, '', 'integer'));
391 
392  }
393  }
394 
395  function getCalendarEntry()
396  {
397  global $ilDB;
398 
399  include_once 'Services/Calendar/classes/class.ilCalendarCategory.php';
400 
401  $set = $ilDB->query("SELECT ce.cal_id FROM cal_entries ce".
402  " JOIN cal_cat_assignments cca ON ce.cal_id = cca.cal_id".
403  " JOIN cal_categories cc ON cca.cat_id = cc.cat_id".
404  " JOIN booking_reservation br ON ce.context_id = br.booking_reservation_id".
405  " WHERE cc.obj_id = ".$ilDB->quote($this->getUserId(),'integer').
406  " AND br.user_id = ".$ilDB->quote($this->getUserId(),'integer').
407  " AND cc.type = ".$ilDB->quote(ilCalendarCategory::TYPE_BOOK,'integer').
408  " AND ce.context_id = ".$ilDB->quote($this->getId(), 'integer'));
409  $row = $ilDB->fetchAssoc($set);
410  return $row["cal_id"];
411  }
412 }
413 
414 ?>