ILIAS  release_4-3 Revision
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilBookingEntry.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
14 {
15  private $id = 0;
16  private $obj_id = 0;
17 
18  private $deadline = 0;
19  private $num_bookings = 1;
20  private $target_obj_id = NULL;
21 
22 
26  public function __construct($a_booking_id = 0)
27  {
28  $this->setId($a_booking_id);
29  if($this->getId())
30  {
31  $this->read();
32  }
33  }
34 
40  protected function setId($a_id)
41  {
42  $this->id = (int)$a_id;
43  }
44 
49  public function getId()
50  {
51  return $this->id;
52  }
53 
59  public function setObjId($a_id)
60  {
61  $this->obj_id = (int)$a_id;
62  }
63 
68  public function getObjId()
69  {
70  return $this->obj_id;
71  }
72 
78  public function setDeadlineHours($a_hours)
79  {
80  $this->deadline = (int)$a_hours;
81  }
82 
87  public function getDeadlineHours()
88  {
89  return $this->deadline;
90  }
91 
97  public function setNumberOfBookings($a_num)
98  {
99  $this->num_bookings = (int)$a_num;
100  }
101 
106  public function getNumberOfBookings()
107  {
108  return $this->num_bookings;
109  }
110 
116  public function setTargetObjId($a_obj_id)
117  {
118  $this->target_obj_id = (int)$a_obj_id;
119  }
120 
125  public function getTargetObjId()
126  {
127  return $this->target_obj_id;
128  }
129 
134  public function save()
135  {
136  global $ilDB;
137 
138  $this->setId($ilDB->nextId('booking_entry'));
139  $query = 'INSERT INTO booking_entry (booking_id,obj_id,deadline,num_bookings,target_obj_id) '.
140  "VALUES ( ".
141  $ilDB->quote($this->getId(),'integer').', '.
142  $ilDB->quote($this->getObjId(),'integer').', '.
143  $ilDB->quote($this->getDeadlineHours(),'integer').', '.
144  $ilDB->quote($this->getNumberOfBookings(),'integer').','.
145  $ilDB->quote($this->getTargetObjId(),'integer').
146  ") ";
147  $ilDB->manipulate($query);
148  return true;
149  }
150 
155  public function update()
156  {
157  if(!$this->getId())
158  {
159  return false;
160  }
161 
162  $query = "UPDATE booking_entry SET ".
163  "SET obj_id = ".$ilDB->quote($this->getObjId(),'integer').", ".
164  " deadline = ".$ilDB->quote($this->getDeadlineHours(),'integer').", ".
165  " target_obj_id = ".$ilDB->quote($this->getTargetObjId(),'integer').", ".
166  " num_bookings = ".$ilDB->quote($this->getNumberOfBookings(),'integer');
167  $ilDB->manipulate($query);
168  return true;
169  }
170 
175  public function delete()
176  {
177  global $ilDB;
178 
179  $query = "DELETE FROM booking_entry ".
180  "WHERE booking_id = ".$ilDB->quote($this->getId(),'integer');
181  $ilDB->manipulate($query);
182  return true;
183  }
184 
189  protected function read()
190  {
191  global $ilDB;
192 
193  if(!$this->getId())
194  {
195  return false;
196  }
197 
198  $query = "SELECT * FROM booking_entry ".
199  "WHERE booking_id = ".$ilDB->quote($this->getId(),'integer');
200  $res = $ilDB->query($query);
201  while($row = $res->fetchRow(DB_FETCHMODE_ASSOC))
202  {
203  $this->setObjId($row['obj_id']);
204  $this->setDeadlineHours($row['deadline']);
205  $this->setNumberOfBookings($row['num_bookings']);
206  $this->setTargetObjId($row['target_obj_id']);
207  }
208  return true;
209  }
210 
216  public function isOwner($a_user_id = NULL)
217  {
218  global $ilUser;
219 
220  if(!$a_user_id)
221  {
222  $a_user_id = $ilUser->getId();
223  }
224 
225  if($this->getObjId() == $a_user_id)
226  {
227  return true;
228  }
229  return false;
230  }
231 
235  public static function removeObsoleteEntries()
236  {
237  global $ilDB;
238 
239  $set = $ilDB->query('SELECT DISTINCT(context_id) FROM cal_entries e'.
240  ' JOIN cal_cat_assignments a ON (e.cal_id = a.cal_id)'.
241  ' JOIN cal_categories c ON (a.cat_id = c.cat_id) WHERE c.type = '.$ilDB->quote(ilCalendarCategory::TYPE_CH, 'integer'));
242  $used = array();
243  while($row = $ilDB->fetchAssoc($set))
244  {
245  $used[] = $row['context_id'];
246  }
247 
248  return $ilDB->query('DELETE FROM booking_entry WHERE '.$ilDB->in('booking_id', $used, true, 'integer'));
249  }
250 
256  public static function getInstanceByCalendarEntryId($a_id)
257  {
258  include_once 'Services/Calendar/classes/class.ilCalendarEntry.php';
259  $cal_entry = new ilCalendarEntry($a_id);
260  $booking_id = $cal_entry->getContextId();
261  if($booking_id)
262  {
263  return new self($booking_id);
264  }
265  }
266 
274  public static function isBookable(array $a_obj_ids, $a_target_obj_id = NULL)
275  {
276  global $ilDB;
277 
278  if(sizeof($a_obj_ids))
279  {
280  $query = 'SELECT DISTINCT(obj_id) FROM booking_entry'.
281  ' WHERE '.$ilDB->in('obj_id', $a_obj_ids, false, 'integer');
282  if($a_target_obj_id)
283  {
284  $query .= ' AND (target_obj_id = '.$ilDB->quote($a_target_obj_id, 'integer').
285  ' OR target_obj_id IS NULL)';
286  }
287  $set = $ilDB->query($query);
288  $all = array();
289  while($row = $ilDB->fetchAssoc($set))
290  {
291  $all[] = $row['obj_id'];
292  }
293  return $all;
294  }
295  }
296 
302  public function getCurrentNumberOfBookings($a_entry_id)
303  {
304  global $ilDB;
305 
306  $set = $ilDB->query('SELECT COUNT(*) AS counter FROM booking_user'.
307  ' WHERE entry_id = '.$ilDB->quote($a_entry_id, 'integer'));
308  $row = $ilDB->fetchAssoc($set);
309  return (int)$row['counter'];
310  }
311 
317  public function getCurrentBookings($a_entry_id)
318  {
319  global $ilDB;
320 
321  $set = $ilDB->query('SELECT user_id FROM booking_user'.
322  ' WHERE entry_id = '.$ilDB->quote($a_entry_id, 'integer'));
323  $res = array();
324  while($row = $ilDB->fetchAssoc($set))
325  {
326  $res[] = $row['user_id'];
327  }
328  return $res;
329  }
330 
337  public function hasBooked($a_entry_id, $a_user_id = NULL)
338  {
339  global $ilUser, $ilDB;
340 
341  if(!$a_user_id)
342  {
343  $a_user_id = $ilUser->getId();
344  }
345 
346  $set = $ilDB->query('SELECT COUNT(*) AS counter FROM booking_user'.
347  ' WHERE entry_id = '.$ilDB->quote($a_entry_id, 'integer').
348  ' AND user_id = '.$ilDB->quote($a_user_id, 'integer'));
349  $row = $ilDB->fetchAssoc($set);
350  return (bool)$row['counter'];
351  }
352 
359  public function isBookedOut($a_entry_id, $a_check_current_user = false)
360  {
361  global $ilUser;
362 
363  if($this->getNumberOfBookings() == $this->getCurrentNumberOfBookings($a_entry_id))
364  {
365  // check against current user
366  if($a_check_current_user)
367  {
368  if($this->hasBooked($a_entry_id))
369  {
370  return false;
371  }
372  if($ilUser->getId() == $this->getObjId())
373  {
374  return false;
375  }
376  }
377  return true;
378  }
379 
380  $deadline = $this->getDeadlineHours();
381  if($deadline)
382  {
383  include_once 'Services/Calendar/classes/class.ilCalendarEntry.php';
384  $entry = new ilCalendarEntry($a_entry_id);
385  if(time()+($deadline*60*60) > $entry->getStart()->get(IL_CAL_UNIX))
386  {
387  return true;
388  }
389  }
390  return false;
391  }
392 
398  public function book($a_entry_id, $a_user_id = false)
399  {
400  global $ilUser, $ilDB;
401 
402  if(!$a_user_id)
403  {
404  $a_user_id = $ilUser->getId();
405  }
406 
407  if(!$this->hasBooked($a_entry_id, $a_user_id))
408  {
409  $ilDB->manipulate('INSERT INTO booking_user (entry_id, user_id, tstamp)'.
410  ' VALUES ('.$ilDB->quote($a_entry_id, 'integer').','.
411  $ilDB->quote($a_user_id, 'integer').','.$ilDB->quote(time(), 'integer').')');
412 
413  include_once 'Services/Calendar/classes/class.ilCalendarMailNotification.php';
414  $mail = new ilCalendarMailNotification();
415  $mail->setAppointmentId($a_entry_id);
416  $mail->setRecipients(array($a_user_id));
418  $mail->send();
419  }
420  return true;
421  }
422 
428  public function cancelBooking($a_entry_id, $a_user_id = false)
429  {
430  global $ilUser, $ilDB;
431 
432  if(!$a_user_id)
433  {
434  $a_user_id = $ilUser->getId();
435  }
436 
437  if($this->hasBooked($a_entry_id, $a_user_id))
438  {
439  include_once 'Services/Calendar/classes/class.ilCalendarMailNotification.php';
440  $mail = new ilCalendarMailNotification();
441  $mail->setAppointmentId($a_entry_id);
442  $mail->setRecipients(array($a_user_id));
444  $mail->send();
445 
446  $ilDB->manipulate('DELETE FROM booking_user'.
447  ' WHERE entry_id = '.$ilDB->quote($a_entry_id, 'integer').
448  ' AND user_id = '.$ilDB->quote($a_user_id, 'integer'));
449  }
450  return true;
451  }
452 }
453 
454 ?>