ILIAS  eassessment Revision 61809
 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 
253  static function getAvailableObject(array $a_ids, $a_from, $a_to)
254  {
255  global $ilDB;
256 
257  $from = $ilDB->quote($a_from, 'integer');
258  $to = $ilDB->quote($a_to, 'integer');
259 
260  $set = $ilDB->query('SELECT object_id'.
261  ' FROM booking_reservation'.
262  ' WHERE '.$ilDB->in('object_id', $a_ids, '', 'integer').
263  ' AND (status IS NULL OR status <> '.$ilDB->quote(self::STATUS_CANCELLED, 'integer').')'.
264  ' AND ((date_from <= '.$from.' AND date_to >= '.$from.')'.
265  ' OR (date_from <= '.$to.' AND date_to >= '.$to.')'.
266  ' OR (date_from >= '.$from.' AND date_to <= '.$to.'))');
267  $blocked = array();
268  while($row = $ilDB->fetchAssoc($set))
269  {
270  $blocked[] = $row['object_id'];
271  }
272  $available = array_diff($a_ids, $blocked);
273  if(sizeof($available))
274  {
275  return array_shift($available);
276  }
277  }
278 
284  static function getCurrentOrUpcomingReservation($a_object_id)
285  {
286  global $ilDB;
287 
288  $now = $ilDB->quote(time(), 'integer');
289 
290  $ilDB->setLimit(1);
291  $set = $ilDB->query('SELECT user_id, status, date_from, date_to'.
292  ' FROM booking_reservation'.
293  ' WHERE ((date_from <= '.$now.' AND date_to >= '.$now.')'.
294  ' OR date_from > '.$now.')'.
295  ' AND status <> '.$ilDB->quote(self::STATUS_CANCELLED, 'integer').
296  ' AND object_id = '.$ilDB->quote($a_object_id, 'integer').
297  ' ORDER BY date_from');
298  $row = $ilDB->fetchAssoc($set);
299  return $row;
300  }
301 
310  static function getList($a_object_ids, $a_limit = 10, $a_offset = 0, array $filter)
311  {
312  global $ilDB;
313 
314  $sql = 'SELECT r.*,o.title'.
315  ' FROM booking_reservation r'.
316  ' JOIN booking_object o ON (o.booking_object_id = r.object_id)';
317 
318  $count_sql = 'SELECT COUNT(*) AS counter'.
319  ' FROM booking_reservation r'.
320  ' JOIN booking_object o ON (o.booking_object_id = r.object_id)';
321 
322  $where = array($ilDB->in('r.object_id', $a_object_ids, '', 'integer'));
323  if($filter['type'])
324  {
325  $where[] = 'type_id = '.$ilDB->quote($filter['type'], 'integer');
326  }
327  if($filter['status'])
328  {
329  if($filter['status'] > 0)
330  {
331  $where[] = 'status = '.$ilDB->quote($filter['status'], 'integer');
332  }
333  else
334  {
335  $where[] = 'status != '.$ilDB->quote(-$filter['status'], 'integer');
336  }
337  }
338  if($filter['from'])
339  {
340  $where[] = 'date_from >= '.$ilDB->quote($filter['from'], 'integer');
341  }
342  if($filter['to'])
343  {
344  $where[] = 'date_to <= '.$ilDB->quote($filter['to'], 'integer');
345  }
346  if(sizeof($where))
347  {
348  $sql .= ' WHERE '.implode(' AND ', $where);
349  $count_sql .= ' WHERE '.implode(' AND ', $where);
350  }
351 
352  $set = $ilDB->query($count_sql);
353  $row = $ilDB->fetchAssoc($set);
354  $counter = $row['counter'];
355 
356  $sql .= ' ORDER BY date_from DESC, booking_reservation_id DESC';
357 
358  $ilDB->setLimit($a_limit, $a_offset);
359  $set = $ilDB->query($sql);
360  while($row = $ilDB->fetchAssoc($set))
361  {
362  $res[] = $row;
363  }
364 
365  return array('data'=>$res, 'counter'=>$counter);
366  }
367 
374  static function changeStatus(array $a_ids, $a_status)
375  {
376  global $ilDB;
377 
378  if(self::isValidStatus($a_status))
379  {
380  return $ilDB->manipulate('UPDATE booking_reservation'.
381  ' SET status = '.$ilDB->quote($a_status, 'integer').
382  ' WHERE '.$ilDB->in('booking_reservation_id', $a_ids, '', 'integer'));
383 
384  }
385  }
386 }
387 
388 ?>