ILIAS  eassessment Revision 61809
 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  $query = "DELETE FROM booking_entry ".
178  "WHERE booking_id = ".$ilDB->quote($this->getId(),'integer');
179  $ilDB->manipulate($query);
180  return true;
181  }
182 
187  protected function read()
188  {
189  global $ilDB;
190 
191  if(!$this->getId())
192  {
193  return false;
194  }
195 
196  $query = "SELECT * FROM booking_entry ".
197  "WHERE booking_id = ".$ilDB->quote($this->getId(),'integer');
198  $res = $ilDB->query($query);
199  while($row = $res->fetchRow(DB_FETCHMODE_ASSOC))
200  {
201  $this->setObjId($row['obj_id']);
202  $this->setDeadlineHours($row['deadline']);
203  $this->setNumberOfBookings($row['num_bookings']);
204  $this->setTargetObjId($row['target_obj_id']);
205  }
206  return true;
207  }
208 
214  public function isOwner($a_user_id = NULL)
215  {
216  global $ilUser;
217 
218  if(!$a_user_id)
219  {
220  $a_user_id = $ilUser->getId();
221  }
222 
223  if($this->getObjId() == $a_user_id)
224  {
225  return true;
226  }
227  return false;
228  }
229 
233  public static function removeObsoleteEntries()
234  {
235  global $ilDB;
236 
237  $set = $ilDB->query('SELECT DISTINCT(context_id) FROM cal_entries e'.
238  ' JOIN cal_cat_assignments a ON (e.cal_id = a.cal_id)'.
239  ' JOIN cal_categories c ON (a.cat_id = c.cat_id) WHERE c.type = '.$ilDB->quote(ilCalendarCategory::TYPE_CH, 'integer'));
240  $used = array();
241  while($row = $ilDB->fetchAssoc($set))
242  {
243  $used[] = $row['context_id'];
244  }
245 
246  return $ilDB->query('DELETE FROM booking_entry WHERE '.$ilDB->in('booking_id', $used, true, 'integer'));
247  }
248 
254  public static function getInstanceByCalendarEntryId($a_id)
255  {
256  include_once 'Services/Calendar/classes/class.ilCalendarEntry.php';
257  $cal_entry = new ilCalendarEntry($a_id);
258  $booking_id = $cal_entry->getContextId();
259  if($booking_id)
260  {
261  return new self($booking_id);
262  }
263  }
264 
272  public static function isBookable(array $a_obj_ids, $a_target_obj_id = NULL)
273  {
274  global $ilDB;
275 
276  if(sizeof($a_obj_ids))
277  {
278  $query = 'SELECT DISTINCT(obj_id) FROM booking_entry'.
279  ' WHERE '.$ilDB->in('obj_id', $a_obj_ids, false, 'integer');
280  if($a_target_obj_id)
281  {
282  $query .= ' AND (target_obj_id = '.$ilDB->quote($a_target_obj_id, 'integer').
283  ' OR target_obj_id IS NULL)';
284  }
285  $set = $ilDB->query($query);
286  $all = array();
287  while($row = $ilDB->fetchAssoc($set))
288  {
289  $all[] = $row['obj_id'];
290  }
291  return $all;
292  }
293  }
294 
300  public function getCurrentNumberOfBookings($a_entry_id)
301  {
302  global $ilDB;
303 
304  $set = $ilDB->query('SELECT COUNT(*) AS counter FROM booking_user'.
305  ' WHERE entry_id = '.$ilDB->quote($a_entry_id, 'integer'));
306  $row = $ilDB->fetchAssoc($set);
307  return (int)$row['counter'];
308  }
309 
315  public function getCurrentBookings($a_entry_id)
316  {
317  global $ilDB;
318 
319  $set = $ilDB->query('SELECT user_id FROM booking_user'.
320  ' WHERE entry_id = '.$ilDB->quote($a_entry_id, 'integer'));
321  $res = array();
322  while($row = $ilDB->fetchAssoc($set))
323  {
324  $res[] = $row['user_id'];
325  }
326  return $res;
327  }
328 
335  public function hasBooked($a_entry_id, $a_user_id = NULL)
336  {
337  global $ilUser, $ilDB;
338 
339  if(!$a_user_id)
340  {
341  $a_user_id = $ilUser->getId();
342  }
343 
344  $set = $ilDB->query('SELECT COUNT(*) AS counter FROM booking_user'.
345  ' WHERE entry_id = '.$ilDB->quote($a_entry_id, 'integer').
346  ' AND user_id = '.$ilDB->quote($a_user_id, 'integer'));
347  $row = $ilDB->fetchAssoc($set);
348  return (bool)$row['counter'];
349  }
350 
357  public function isBookedOut($a_entry_id, $a_check_current_user = false)
358  {
359  global $ilUser;
360 
361  if($this->getNumberOfBookings() == $this->getCurrentNumberOfBookings($a_entry_id))
362  {
363  // check against current user
364  if($a_check_current_user)
365  {
366  if($this->hasBooked($a_entry_id))
367  {
368  return false;
369  }
370  if($ilUser->getId() == $this->getObjId())
371  {
372  return false;
373  }
374  }
375  return true;
376  }
377 
378  $deadline = $this->getDeadlineHours();
379  if($deadline)
380  {
381  include_once 'Services/Calendar/classes/class.ilCalendarEntry.php';
382  $entry = new ilCalendarEntry($a_entry_id);
383  if(time()+$deadline > $entry->getStart()->get(IL_CAL_UNIX))
384  {
385  return true;
386  }
387  }
388  return false;
389  }
390 
396  public function book($a_entry_id, $a_user_id = false)
397  {
398  global $ilUser, $ilDB;
399 
400  if(!$a_user_id)
401  {
402  $a_user_id = $ilUser->getId();
403  }
404 
405  if(!$this->hasBooked($a_entry_id, $a_user_id))
406  {
407  $ilDB->manipulate('INSERT INTO booking_user (entry_id, user_id, tstamp)'.
408  ' VALUES ('.$ilDB->quote($a_entry_id, 'integer').','.
409  $ilDB->quote($a_user_id, 'integer').','.$ilDB->quote(time(), 'integer').')');
410 
411  include_once 'Services/Calendar/classes/class.ilCalendarMailNotification.php';
412  $mail = new ilCalendarMailNotification();
413  $mail->setAppointmentId($a_entry_id);
414  $mail->setRecipients(array($a_user_id));
416  $mail->send();
417  }
418  return true;
419  }
420 
426  public function cancelBooking($a_entry_id, $a_user_id = false)
427  {
428  global $ilUser, $ilDB;
429 
430  if(!$a_user_id)
431  {
432  $a_user_id = $ilUser->getId();
433  }
434 
435  if($this->hasBooked($a_entry_id, $a_user_id))
436  {
437  include_once 'Services/Calendar/classes/class.ilCalendarMailNotification.php';
438  $mail = new ilCalendarMailNotification();
439  $mail->setAppointmentId($a_entry_id);
440  $mail->setRecipients(array($a_user_id));
442  $mail->send();
443 
444  $ilDB->manipulate('DELETE FROM booking_user'.
445  ' WHERE entry_id = '.$ilDB->quote($a_entry_id, 'integer').
446  ' AND user_id = '.$ilDB->quote($a_user_id, 'integer'));
447  }
448  return true;
449  }
450 }
451 
452 ?>