protected function persistCompetencyProgress(User $user, Competency $competency) { $progress = new CompetencyProgress(); $progress->setUser($user); $progress->setCompetency($competency); $this->om->persist($progress); return $progress; }
private function computeObjectives(CompetencyProgress $progress) { // only a fully acquired competency can make the objectives progress vary if ($progress->getPercentage() < 100) { return; } $competency = $progress->getCompetency(); $user = $progress->getUser(); // find linked objectives $objectives = $this->objectiveRepo->findByCompetencyAndUser($competency, $user); // remove objectives for which the acquired competency level is insufficient $objectives = array_filter($objectives, function ($objective) use($progress, $competency) { foreach ($objective->getObjectiveCompetencies() as $link) { if ($link->getCompetency() === $competency && $link->getLevel()->getValue() > $progress->getLevel()->getValue()) { return false; } } return true; }); // compute each objective percentage for ($i = 0, $objectiveCount = count($objectives); $i < $objectiveCount; ++$i) { $this->computeUserObjective($objectives[$i], $user); } if ($objectiveCount > 0) { $this->computeUserProgress($user); } }