19declare(strict_types=1);
53 $this->
logger = TestDIC::dic()[
'logging.logger'];
54 $this->
lng = $DIC[
'lng'];
55 $this->
user = $DIC[
'ilUser'];
56 $this->
lng->loadLanguageModule(
'assessment');
57 $this->db =
$DIC->database();
58 $this->obj_data_cache =
$DIC[
'ilObjDataCache'];
60 $this->unfinished_passes = [];
62 $this->test_ending_times = [];
69 $this->test_result_repository = TestDic::dic()[
'results.data.repository'];
74 return 'finish_unfinished_passes';
79 return $this->
lng->txt(
'finish_unfinished_passes');
84 return $this->
lng->txt(
'finish_unfinished_passes_desc');
89 return JobScheduleType::DAILY;
114 $this->
logger->info(
'start inf cronjob...');
119 if (count($this->unfinished_passes) > 0) {
120 $this->
logger->info(
'found ' . count($this->unfinished_passes) .
' unfinished passes starting analyses.');
124 $this->
logger->info(
'No unfinished passes found.');
127 $result->setStatus(JobResult::STATUS_OK);
129 $this->
logger->info(
' ...finishing cronjob.');
137 SELECT tst_active.active_id,
139 tst_active.user_fi usr_id,
140 tst_active.test_fi test_fi,
144 tst_active.submitted test_finished,
145 usr_data.matriculation,
147 tst_active.lastindex,
148 tst_active.last_started_pass last_started
151 ON tst_active.user_fi = usr_data.usr_id
152 WHERE IFNULL(tst_active.last_finished_pass, -1) <> tst_active.last_started_pass
154 $result = $this->db->query($query);
155 while ($row = $this->db->fetchAssoc($result)) {
156 $this->unfinished_passes[] = $row;
157 $this->test_ids[] = $row[
'test_fi'];
163 $query =
'SELECT test_id, obj_fi, ending_time, ending_time_enabled, processing_time, enable_processing_time FROM tst_tests WHERE ' .
164 $this->db->in(
'test_id', $this->test_ids,
false,
'integer');
165 $result = $this->db->query($query);
166 while ($row = $this->db->fetchAssoc($result)) {
167 $this->test_ending_times[$row[
'test_id']] = $row;
169 $this->
logger->info(
'Gathered data for ' . count($this->test_ids) .
' test id(s) => (' . implode(
',', $this->test_ids) .
')');
174 foreach ($this->unfinished_passes as
$data) {
175 $test_id =
$data[
'test_fi'];
176 if (!array_key_exists($test_id, $this->test_ending_times)) {
186 $this->
logger->info(
'Test session with active id ('
187 . $data[
'active_id'] .
') can not be finished by this cron job.');
196 if ($this->test_ending_times[$test_id][
'ending_time_enabled'] !== 1) {
197 $this->
logger->info(
'Test (' . $test_id .
') has no ending time.');
201 $this->
logger->info(
'Test (' . $test_id .
') has ending time ('
202 . $this->test_ending_times[$test_id][
'ending_time'] .
')');
203 $ending_time = $this->test_ending_times[$test_id][
'ending_time'];
204 if ($ending_time >=
$now) {
205 $this->
logger->info(
'Test (' . $test_id .
') ending time ('
206 . $this->test_ending_times[$test_id][
'ending_time']
207 .
') > now (' .
$now .
') is not reached.');
211 $this->
finishPassForUser($active_id, $this->test_ending_times[$test_id][
'obj_fi']);
220 if ($this->test_ending_times[$test_id][
'enable_processing_time'] !== 1) {
221 $this->
logger->info(
'Test (' . $test_id .
') has no processing time.');
225 $this->
logger->info(
'Test (' . $test_id .
') has processing time (' . $this->test_ending_times[$test_id][
'processing_time'] .
')');
226 $obj_id = $this->test_ending_times[$test_id][
'obj_fi'];
229 $this->
logger->info(
'Test object with id (' . $obj_id .
') does not exist.');
233 $test_obj =
new ilObjTest($obj_id,
false);
234 $startingTime = $test_obj->getStartingTimeOfUser($active_id);
235 $max_processing_time = $test_obj->isMaxProcessingTimeReached($startingTime, $active_id);
236 if (!$max_processing_time) {
237 $this->
logger->info(
'Max Processing time not reached for user id ('
238 . $usr_id .
') in test with active id ('
239 . $active_id .
'). Starting time: ' . $startingTime
240 .
' Processing time: ' . $test_obj->getProcessingTime() .
' / '
241 . $test_obj->getProcessingTimeInSeconds() .
's');
245 $this->
logger->info(
'Max Processing time reached for user id ('
246 . $usr_id .
') so test with active id ('
247 . $active_id .
') will be finished.');
248 $this->
finishPassForUser($active_id, $this->test_ending_times[$test_id][
'obj_fi']);
254 $processLocker = $this->processLockerFactory->withContextId((
int) $active_id)->getLocker();
257 $test_session->loadFromDb($active_id);
260 $this->test_result_repository->updateTestAttemptResult(
262 $test_session->getPass(),
270 $this->test_result_repository
271 ))->performFinishTasks($processLocker, StatusOfAttempt::FINISHED_BY_CRONJOB);
272 $this->
logger->info(
'Test session with active id (' . $active_id .
') and obj_id (' . $obj_id .
') is now finished.');
274 $this->
logger->info(
'Test object with id (' . $obj_id .
') does not exist.');
Class ilCronFinishUnfinishedTestPasses.
readonly ilObjectDataCache $obj_data_cache
gatherUsersWithUnfinishedPasses()
getDefaultScheduleValue()
ilTestProcessLockerFactory $processLockerFactory
TestResultRepository $test_result_repository
readonly ilDBInterface $db
finishPassOnProcessingTime(int $test_id, int $usr_id, int $active_id)
getTestsFinishAndProcessingTime()
readonly TestLogger $logger
finishPassForUser($active_id, $obj_id)
finishPassOnEndingTime(int $test_id, int $active_id)
hasAutoActivation()
Is to be activated on "installation", does only work for ILIAS core cron jobs.
static _exists(int $id, bool $reference=false, ?string $type=null)
checks if an object exists in object_data
Class ilTestPassFinishTasks.
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
if(!file_exists('../ilias.ini.php'))