public function manageEvaluation(User $user, ActivityParameters $activityParams, Log $currentLog, $rulesLogs, $activityStatus) { $evaluation = $this->evaluationRepo->findEvaluationByUserAndActivityParams($user, $activityParams); $isFirstEvaluation = is_null($evaluation); $evaluationType = $activityParams->getEvaluationType(); $ruleScore = null; $ruleScoreMax = null; if ($evaluationType === AbstractEvaluation::TYPE_AUTOMATIC && count($activityParams->getRules()) > 0) { $rule = $activityParams->getRules()->first(); $ruleScore = $rule->getResult(); $ruleScoreMax = $rule->getResultMax(); } if (!$isFirstEvaluation) { $pastEvals = $this->pastEvaluationRepo->findPastEvaluationsByUserAndActivityParams($user, $activityParams); } $nbAttempts = $isFirstEvaluation ? 0 : count($pastEvals); $totalTime = $isFirstEvaluation ? null : $evaluation->getAttemptsDuration(); $pastStatus = $activityStatus === AbstractEvaluation::STATUS_INCOMPLETE || $activityStatus === AbstractEvaluation::STATUS_FAILED ? $activityStatus : AbstractEvaluation::STATUS_UNKNOWN; $previousStatus = $evaluation ? $evaluation->getStatus() : AbstractEvaluation::STATUS_UNKNOWN; if (isset($rulesLogs['rules']) && is_array($rulesLogs['rules'])) { foreach ($rulesLogs['rules'] as $ruleLogs) { $logs = $ruleLogs['logs']; foreach ($logs as $log) { $pastEvalExisted = false; // Checks if this archived log is the same as the log // that triggers the evaluation if ($log->getId() === $currentLog->getId()) { break; } // Checks if the log is already associated to an existing // PastEvaluation if (!$isFirstEvaluation) { foreach ($pastEvals as $pastEval) { if (!is_null($pastEval->getLog()) && $pastEval->getLog()->getId() === $log->getId()) { $pastEvalExisted = true; break; } } } // If the log isn't associated to an existing PastEvaluation if (!$pastEvalExisted) { $logDetails = $log->getDetails(); $duration = isset($logDetails['duration']) ? $logDetails['duration'] : null; $score = isset($logDetails['result']) ? $logDetails['result'] : null; $scoreMin = isset($logDetails['resultMin']) ? $logDetails['resultMin'] : null; $scoreMax = isset($logDetails['resultMax']) ? $logDetails['resultMax'] : null; $pastEval = new PastEvaluation(); $pastEval->setUser($user); $pastEval->setActivityParameters($activityParams); $pastEval->setLog($log); $pastEval->setType($evaluationType); $pastEval->setDate($log->getDateLog()); $pastEval->setNumScore($score); $pastEval->setScoreMin($scoreMin); $pastEval->setScoreMax($scoreMax); $pastEval->setDuration($duration); $pastEval->setStatus($pastStatus); ++$nbAttempts; $totalTime = $this->computeActivityTotalTime($totalTime, $duration); $this->om->persist($pastEval); } } } } // Creates a PastEvaluation for the log that triggers the evaluation $logDetails = $currentLog->getDetails(); $duration = isset($logDetails['duration']) ? $logDetails['duration'] : null; $score = isset($logDetails['result']) ? $logDetails['result'] : null; $scoreMin = isset($logDetails['resultMin']) ? $logDetails['resultMin'] : null; $scoreMax = isset($logDetails['resultMax']) ? $logDetails['resultMax'] : null; $pastEval = new PastEvaluation(); $pastEval->setUser($user); $pastEval->setActivityParameters($activityParams); $pastEval->setLog($currentLog); $pastEval->setType($evaluationType); $pastEval->setDate($currentLog->getDateLog()); $pastEval->setNumScore($score); $pastEval->setScoreMin($scoreMin); $pastEval->setScoreMax($scoreMax); $pastEval->setDuration($duration); if (($activityStatus === AbstractEvaluation::STATUS_COMPLETED || $activityStatus === AbstractEvaluation::STATUS_PASSED) && !is_null($score) && !is_null($ruleScore)) { $realStatus = $this->hasPassingScore($ruleScore, $ruleScoreMax, $score, $scoreMax) ? $activityStatus : AbstractEvaluation::STATUS_FAILED; $pastEval->setStatus($realStatus); } else { $pastEval->setStatus($activityStatus); } ++$nbAttempts; $totalTime = $this->computeActivityTotalTime($totalTime, $duration); $this->om->persist($pastEval); if ($isFirstEvaluation) { $evaluation = new Evaluation(); $evaluation->setUser($user); $evaluation->setActivityParameters($activityParams); $evaluation->setType($evaluationType); $evaluation->setNumScore($score); $evaluation->setScoreMin($scoreMin); $evaluation->setScoreMax($scoreMax); } else { $this->persistBestScore($evaluation, $score, $scoreMin, $scoreMax); } $evaluation->setDate($currentLog->getDateLog()); $evaluation->setAttemptsCount($nbAttempts); $evaluation->setAttemptsDuration($totalTime); $evaluation->setStatus($activityStatus); $evaluation->setLog($currentLog); $this->om->persist($evaluation); $this->om->flush(); if ($activityStatus !== $previousStatus && $evaluation->isTerminated()) { $this->dispatchEvaluation($evaluation); } }