Element_OphTrOperationbooking_Operation::getFirmCalendarForMonth PHP Méthode

getFirmCalendarForMonth() public méthode

public getFirmCalendarForMonth ( $firm, $timestamp, Element_OphTrOperationbooking_ScheduleOperation $schedule_options = null ) : array
$firm
$timestamp
$schedule_options Element_OphTrOperationbooking_ScheduleOperation
Résultat array
    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);
    }