public function handle_if_time_expired($timestamp, $studentisonline) {
        global $DB;

        $timeclose = $this->get_access_manager($timestamp)->get_end_time($this->attempt);

        if ($timeclose === false || $this->is_preview()) {
            $this->update_timecheckstate(null);
            return; // No time limit
        }
        if ($timestamp < $timeclose) {
            $this->update_timecheckstate($timeclose);
            return; // Time has not yet expired.
        }

        // If the attempt is already overdue, look to see if it should be abandoned ...
        if ($this->attempt->state == self::OVERDUE) {
            $timeoverdue = $timestamp - $timeclose;
            $graceperiod = $this->quizobj->get_quiz()->graceperiod;
            if ($timeoverdue >= $graceperiod) {
                $this->process_abandon($timestamp, $studentisonline);
            } else {
                // Overdue time has not yet expired
                $this->update_timecheckstate($timeclose + $graceperiod);
            }
            return; // ... and we are done.
        }

        if ($this->attempt->state != self::IN_PROGRESS) {
            $this->update_timecheckstate(null);
            return; // Attempt is already in a final state.
        }

        // Otherwise, we were in quiz_attempt::IN_PROGRESS, and time has now expired.
        // Transition to the appropriate state.
        switch ($this->quizobj->get_quiz()->overduehandling) {
            case 'autosubmit':
                $this->process_finish($timestamp, false);
                return;

            case 'graceperiod':
                $this->process_going_overdue($timestamp, $studentisonline);
                return;

            case 'autoabandon':
                $this->process_abandon($timestamp, $studentisonline);
                return;
        }

        // This is an overdue attempt with no overdue handling defined, so just abandon.
        $this->process_abandon($timestamp, $studentisonline);
        return;
    }
public function handle_if_time_expired($timestamp, $studentisonline) {
        global $DB;

        $timeclose = $this->get_access_manager($timestamp)->get_end_time($this->attempt);

        if ($timeclose === false || $this->is_preview()) {
            $this->update_timecheckstate(null);
            return; // No time limit
        }
        if ($timestamp < $timeclose) {
            $this->update_timecheckstate($timeclose);
            return; // Time has not yet expired.
        }

        // If the attempt is already overdue, look to see if it should be abandoned ...
        if ($this->attempt->state == self::OVERDUE) {
            $timeoverdue = $timestamp - $timeclose;
            $graceperiod = $this->quizobj->get_quiz()->graceperiod;
            if ($timeoverdue >= $graceperiod) {
                $this->process_abandon($timestamp, $studentisonline);
            } else {
                // Overdue time has not yet expired
                $this->update_timecheckstate($timeclose + $graceperiod);
            }
            return; // ... and we are done.
        }

        if ($this->attempt->state != self::IN_PROGRESS) {
            $this->update_timecheckstate(null);
            return; // Attempt is already in a final state.
        }

        // Otherwise, we were in quiz_attempt::IN_PROGRESS, and time has now expired.
        // Transition to the appropriate state.
        switch ($this->quizobj->get_quiz()->overduehandling) {
            case 'autosubmit':
                $this->process_finish($timestamp, false);
                return;

            case 'graceperiod':
                $this->process_going_overdue($timestamp, $studentisonline);
                return;

            case 'autoabandon':
                $this->process_abandon($timestamp, $studentisonline);
                return;
        }

        // This is an overdue attempt with no overdue handling defined, so just abandon.
        $this->process_abandon($timestamp, $studentisonline);
        return;
    }
public function handle_if_time_expired ( $ timestamp , $ studentisonline ) { global $ DB ; $ timeclose = $ this -> get_access_manager ( $ timestamp ) -> get_end_time ( $ this -> attempt ) ; if ( $ timeclose === false || $ this -> is_preview ( ) ) { $ this -> update_timecheckstate ( null ) ; return ; // No time limit } if ( $ timestamp < $ timeclose ) { $ this -> update_timecheckstate ( $ timeclose ) ; return ; // Time has not yet expired. } // If the attempt is already overdue, look to see if it should be abandoned ... if ( $ this -> attempt -> state == self :: OVERDUE ) { $ timeoverdue = $ timestamp - $ timeclose ; $ graceperiod = $ this -> quizobj -> get_quiz ( ) -> graceperiod ; if ( $ timeoverdue >= $ graceperiod ) { $ this -> process_abandon ( $ timestamp , $ studentisonline ) ; } else { // Overdue time has not yet expired $ this -> update_timecheckstate ( $ timeclose + $ graceperiod ) ; } return ; // ... and we are done. } if ( $ this -> attempt -> state != self :: IN_PROGRESS ) { $ this -> update_timecheckstate ( null ) ; return ; // Attempt is already in a final state. } // Otherwise, we were in quiz_attempt::IN_PROGRESS, and time has now expired. // Transition to the appropriate state. switch ( $ this -> quizobj -> get_quiz ( ) -> overduehandling ) { case 'autosubmit' : $ this -> process_finish ( $ timestamp , false ) ; return ; case 'graceperiod' : $ this -> process_going_overdue ( $ timestamp , $ studentisonline ) ; return ; case 'autoabandon' : $ this -> process_abandon ( $ timestamp , $ studentisonline ) ; return ; } // This is an overdue attempt with no overdue handling defined, so just abandon. $ this -> process_abandon ( $ timestamp , $ studentisonline ) ; return ; }
Check this attempt, to see if there are any state transitions that should
happen automatically.  This function will update the attempt checkstatetime.
@param int $timestamp the timestamp that should be stored as the modifed
@param bool $studentisonline is the student currently interacting with Moodle?
Check this attempt to see if there are any state transitions that should happen automatically . This function will update the attempt checkstatetime .