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(); } } ?>