146 lines
3.9 KiB
PHP
146 lines
3.9 KiB
PHP
<?php defined('SYSPATH') or die('No direct access allowed.');
|
|
|
|
/**
|
|
* This class supports Company Rooms
|
|
*
|
|
* @package Membership Database
|
|
* @category Models
|
|
* @author Deon George
|
|
* @copyright (c) 2014 Deon George
|
|
* @license http://dev.leenooks.net/license.html
|
|
*/
|
|
class Model_Rooms extends ORM {
|
|
protected $_belongs_to = array(
|
|
'site'=>array('model'=>'Setup'),
|
|
);
|
|
protected $_has_many = array(
|
|
'dates'=>array('model'=>'Room_Dates','far_key'=>'id','foreign_key'=>'room_id'),
|
|
'children'=>array('model'=>'Room_Children','far_key'=>'id','foreign_key'=>'room_id'),
|
|
);
|
|
|
|
protected $_form = array('id'=>'id','value'=>'name');
|
|
|
|
public function availability_dates($date,$days=0,$code='A') {
|
|
$result = array();
|
|
$x = $date;
|
|
|
|
$date_end = $date+$days*86400;
|
|
$open_dates = $this->site->open_dates($date,$days);
|
|
foreach ($this->dates->where('code','=',$code)->where_startstop($date,$date_end)->find_all() as $o) {
|
|
$x = $date;
|
|
|
|
while ($x<$date_end) {
|
|
if (($o->date_start <= $x AND (is_null($o->date_stop) OR $o->date_stop >= $x))
|
|
OR ($o->date_stop >= $x AND (is_null($o->date_start) OR $o->date_start <= $x))
|
|
OR (is_null($o->date_start) AND is_null($o->date_start))) {
|
|
|
|
$result[$x] = $o->avail(date('w',$x));
|
|
|
|
$x += 86400;
|
|
continue;
|
|
}
|
|
|
|
if (! isset($result[$x]) OR ! $result[$x])
|
|
$result[$x] = 0;
|
|
|
|
$x += 86400;
|
|
}
|
|
}
|
|
|
|
// If we broke out and our date $days hasnt ben evaluated, we are closed
|
|
while ($x<$date_end) {
|
|
if (! isset($result[$x]) OR ! $result[$x])
|
|
$result[$x] = 0;
|
|
|
|
$x += 86400;
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
// 'P' - Permanent
|
|
public function child_list_date($date,$days,$code='P') {
|
|
$result = array();
|
|
$x = $date;
|
|
|
|
// We need to set this, so that unassigned room records are found.
|
|
if (! $this->loaded())
|
|
$this->site_id = Company::instance()->site();
|
|
|
|
$date_end = $date+$days*86400;
|
|
$open_dates = $this->site->open_dates($date,$days);
|
|
foreach ($this->children->where('code','=',$code)->where_startstop($date,$date_end)->find_all() as $o) {
|
|
$x = $date;
|
|
|
|
while ($x<$date_end) {
|
|
// If we havent made the start date yet, we need to advance
|
|
if (! $open_dates[$x]
|
|
OR ($o->date_start > $x AND (is_null($o->date_stop) OR $o->date_stop > $date_end))
|
|
OR ((is_null($o->date_start) OR $o->date_start > $x) AND $o->date_stop > $date_end)) {
|
|
|
|
if (! isset($result[$x]) OR ! $result[$x])
|
|
$result[$x] = array();
|
|
|
|
$x += 86400;
|
|
continue;
|
|
}
|
|
|
|
// Check that this record covers our current date
|
|
if ($o->date_stop < $x AND ! is_null($o->date_stop))
|
|
break;
|
|
|
|
if (! isset($result[$x]))
|
|
$result[$x] = array();
|
|
|
|
if ($o->day(date('w',$x)))
|
|
array_push($result[$x],$o->child);
|
|
|
|
$x += 86400;
|
|
}
|
|
}
|
|
|
|
// If we broke out and our date $days hasnt ben evaluated, we are closed
|
|
while ($x<$date_end) {
|
|
if (! isset($result[$x]) OR ! $result[$x])
|
|
$result[$x] = array();
|
|
|
|
$x += 86400;
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
public function room_availablity($date,$days) {
|
|
// We start with our availablity
|
|
$result = $this->availability_dates($date,$days);
|
|
|
|
// Less Permanents
|
|
foreach ($this->child_list_date($date,$days) as $k => $v)
|
|
$result[$k] -= count($v);
|
|
|
|
// Add Absent
|
|
foreach ($this->child_list_date($date,$days,'a') as $k => $v)
|
|
$result[$k] += count($v);
|
|
|
|
// Less Casuals
|
|
foreach ($this->child_list_date($date,$days,'C') as $k => $v)
|
|
$result[$k] -= count($v);
|
|
|
|
// Less Waitlist
|
|
foreach ($this->child_list_date($date,$days,'W') as $k => $v)
|
|
$result[$k] -= count($v);
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Rooms marked with the internal flag are the actual rooms that children are assigned in
|
|
* but cannot have an enrolment application for (there may be multiple rooms for the program).
|
|
* Thus a non "internal" room should be used for enrolments for the program.
|
|
*/
|
|
public function where_external() {
|
|
return $this->where_open()->where('internal','is',NULL)->or_where('internal','=',0)->where_close();
|
|
}
|
|
}
|
|
?>
|