public function getFirmCalendarForMonth($firm, $timestamp, $schedule_options = null)
{
$sessions = array();
$year = date('Y', $timestamp);
$month = date('m', $timestamp);
$rtt_date = $this->getRTTBreach();
$criteria = new CDbCriteria();
$criteria->compare('firm_id', $firm->id);
$criteria->compare('available', 1);
$criteria->addSearchCondition('date', "{$year}-{$month}-%", false);
$criteria->order = 'date asc';
$days = array();
$sessiondata = array();
foreach (OphTrOperationbooking_Operation_Session::model()->findAll($criteria) as $session) {
$day = date('D', strtotime($session->date));
$sessiondata[$session->date][] = $session;
$days[$day][] = $session->date;
}
$sessions = array();
foreach ($days as $day => $dates) {
for ($i = 1; $i <= date('t', mktime(0, 0, 0, $month, 1, $year)); ++$i) {
if (date('D', mktime(0, 0, 0, $month, $i, $year)) == $day) {
$date = "{$year}-{$month}-" . str_pad($i, 2, '0', STR_PAD_LEFT);
if (in_array($date, $dates) && (Yii::app()->user->checkAccess('Super schedule operation') || !Yii::app()->params['future_scheduling_limit'] || $date <= date('Y-m-d', strtotime('+' . Yii::app()->params['future_scheduling_limit'])))) {
$open = $full = 0;
$status = '';
if (strtotime($date) < strtotime(date('Y-m-d'))) {
$status = 'inthepast';
} else {
$hasFreeProcedures = false;
foreach ($sessiondata[$date] as $session) {
// Check if at least one session has enough allocated max_procedures to allow the booking
if (!$session->operationBookable($this)) {
continue;
}
$hasFreeProcedures = true;
if ($session->availableMinutes >= $this->total_duration) {
++$open;
} else {
++$full;
}
}
if (!$schedule_options->isPatientAvailable($date)) {
$status = 'patient-unavailable';
} elseif (!$hasFreeProcedures) {
$status = 'full';
} elseif ($full == count($sessiondata[$date])) {
$status = 'full';
} elseif ($full > 0 and $open > 0) {
$status = 'limited';
} elseif ($open == count($sessiondata[$date])) {
$status = 'available';
}
}
if ($rtt_date && $date >= $rtt_date) {
$status .= ' outside_rtt';
}
} else {
$status = 'closed';
}
$sessions[$day][$date] = array('status' => $status);
}
}
}
return $this->fixCalendarDateOrdering($sessions);
}