|
4 | 4 |
|
5 | 5 | use Chamilo\CoreBundle\Entity\Course;
|
6 | 6 | use Chamilo\CoreBundle\Entity\ResourceLink;
|
| 7 | +use Chamilo\CoreBundle\Entity\TrackEExercise; |
7 | 8 | use Chamilo\CoreBundle\Entity\User;
|
8 | 9 | use Chamilo\CoreBundle\Entity\Session as SessionEntity;
|
9 | 10 | use Chamilo\CoreBundle\ServiceHelper\ThemeHelper;
|
@@ -8796,4 +8797,65 @@ private function getSavedFinalItem()
|
8796 | 8797 |
|
8797 | 8798 | return $document ? $repo->getResourceFileContent($document) : '';
|
8798 | 8799 | }
|
| 8800 | + |
| 8801 | + /** |
| 8802 | + * Recalculates the results for all exercises associated with the learning path (LP) for the given user. |
| 8803 | + */ |
| 8804 | + public function recalculateResultsForLp(int $userId): void |
| 8805 | + { |
| 8806 | + $em = Database::getManager(); |
| 8807 | + $lpItemRepo = $em->getRepository(CLpItem::class); |
| 8808 | + $lpItems = $lpItemRepo->findBy(['lp' => $this->lp_id]); |
| 8809 | + |
| 8810 | + if (empty($lpItems)) { |
| 8811 | + Display::addFlash(Display::return_message(get_lang('No items found'), 'error')); |
| 8812 | + return; |
| 8813 | + } |
| 8814 | + |
| 8815 | + $lpItemIds = array_map(fn($item) => $item->getIid(), $lpItems); |
| 8816 | + $lpItemViewRepo = $em->getRepository(CLpItemView::class); |
| 8817 | + $lpItemViews = $lpItemViewRepo->createQueryBuilder('v') |
| 8818 | + ->where('v.item IN (:lpItemIds)') |
| 8819 | + ->setParameter('lpItemIds', $lpItemIds) |
| 8820 | + ->getQuery() |
| 8821 | + ->getResult(); |
| 8822 | + |
| 8823 | + if (empty($lpItemViews)) { |
| 8824 | + Display::addFlash(Display::return_message(get_lang('No item views found'), 'error')); |
| 8825 | + return; |
| 8826 | + } |
| 8827 | + |
| 8828 | + $lpViewIds = array_map(fn($view) => $view->getIid(), $lpItemViews); |
| 8829 | + $trackEExerciseRepo = $em->getRepository(TrackEExercise::class); |
| 8830 | + $trackExercises = $trackEExerciseRepo->createQueryBuilder('te') |
| 8831 | + ->where('te.origLpId = :lpId') |
| 8832 | + ->andWhere('te.origLpItemId IN (:lpItemIds)') |
| 8833 | + ->andWhere('te.origLpItemViewId IN (:lpViewIds)') |
| 8834 | + ->andWhere('te.user = :userId') |
| 8835 | + ->setParameter('lpId', $this->lp_id) |
| 8836 | + ->setParameter('lpItemIds', $lpItemIds) |
| 8837 | + ->setParameter('lpViewIds', $lpViewIds) |
| 8838 | + ->setParameter('userId', $userId) |
| 8839 | + ->getQuery() |
| 8840 | + ->getResult(); |
| 8841 | + |
| 8842 | + if (empty($trackExercises)) { |
| 8843 | + Display::addFlash(Display::return_message(get_lang('No exercise attempts found'), 'error')); |
| 8844 | + return; |
| 8845 | + } |
| 8846 | + |
| 8847 | + foreach ($trackExercises as $trackExercise) { |
| 8848 | + $exeId = $trackExercise->getExeId(); |
| 8849 | + $exerciseId = $trackExercise->getQuiz()->getIid(); |
| 8850 | + $courseId = $trackExercise->getCourse()->getId(); |
| 8851 | + |
| 8852 | + $result = ExerciseLib::recalculateResult($exeId, $userId, $exerciseId, $courseId); |
| 8853 | + |
| 8854 | + if ($result) { |
| 8855 | + Display::addFlash(Display::return_message(get_lang('Results recalculated'), 'success')); |
| 8856 | + } else { |
| 8857 | + Display::addFlash(Display::return_message(get_lang('Error recalculating results'), 'error')); |
| 8858 | + } |
| 8859 | + } |
| 8860 | + } |
8799 | 8861 | }
|
0 commit comments