diff --git a/migrations/Version20260125191247.php b/migrations/Version20260125191247.php new file mode 100644 index 0000000..224f971 --- /dev/null +++ b/migrations/Version20260125191247.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE quiz_candidate ADD penalty_seconds SMALLINT DEFAULT 0 NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE quiz_candidate DROP penalty_seconds'); + } +} diff --git a/src/Controller/Backoffice/QuizController.php b/src/Controller/Backoffice/QuizController.php index a44ec34..c54c872 100644 --- a/src/Controller/Backoffice/QuizController.php +++ b/src/Controller/Backoffice/QuizController.php @@ -117,4 +117,23 @@ class QuizController extends AbstractController return $this->redirectToRoute('tvdt_backoffice_quiz', ['seasonCode' => $quiz->season->seasonCode, 'quiz' => $quiz->id]); } + + #[IsGranted(SeasonVoter::EDIT, subject: 'quiz')] + #[Route( + '/backoffice/quiz/{quiz}/candidate/{candidate}/modify_penalty', + name: 'tvdt_backoffice_modify_penalty', + requirements: ['quiz' => Requirement::UUID, 'candidate' => Requirement::UUID], + )] + public function modifyPenalty(Quiz $quiz, Candidate $candidate, Request $request): RedirectResponse + { + if (!$request->isMethod('POST')) { + throw new MethodNotAllowedHttpException(['POST']); + } + + $penalty = (int) $request->request->get('penalty'); + + $this->quizCandidateRepository->setPenaltyForCandidate($quiz, $candidate, $penalty); + + return $this->redirectToRoute('tvdt_backoffice_quiz', ['seasonCode' => $quiz->season->seasonCode, 'quiz' => $quiz->id]); + } } diff --git a/src/Dto/Result.php b/src/Dto/Result.php index 0ebb5c2..f8bee43 100644 --- a/src/Dto/Result.php +++ b/src/Dto/Result.php @@ -13,6 +13,7 @@ final readonly class Result public string $name, public int $correct, public float $corrections, + public int $penaltySeconds, public \DateInterval $time, public float $score, ) {} diff --git a/src/Entity/QuizCandidate.php b/src/Entity/QuizCandidate.php index c3054d9..e77fff7 100644 --- a/src/Entity/QuizCandidate.php +++ b/src/Entity/QuizCandidate.php @@ -24,6 +24,9 @@ class QuizCandidate #[ORM\Column] public float $corrections = 0; + #[ORM\Column(type: Types::SMALLINT, options: ['default' => 0])] + public int $penaltySeconds = 0; + #[Gedmo\Timestampable(on: 'create')] #[ORM\Column(type: Types::DATETIMETZ_IMMUTABLE)] public private(set) \DateTimeImmutable $created; diff --git a/src/Repository/QuizCandidateRepository.php b/src/Repository/QuizCandidateRepository.php index d51a289..da50c62 100644 --- a/src/Repository/QuizCandidateRepository.php +++ b/src/Repository/QuizCandidateRepository.php @@ -44,4 +44,15 @@ class QuizCandidateRepository extends ServiceEntityRepository $quizCandidate->corrections = $corrections; $this->getEntityManager()->flush(); } + + public function setPenaltyForCandidate(Quiz $quiz, Candidate $candidate, int $penalty): void + { + $quizCandidate = $this->findOneBy(['candidate' => $candidate, 'quiz' => $quiz]); + if (!$quizCandidate instanceof QuizCandidate) { + throw new \InvalidArgumentException('Quiz candidate not found'); + } + + $quizCandidate->penaltySeconds = $penalty; + $this->getEntityManager()->flush(); + } } diff --git a/src/Repository/QuizRepository.php b/src/Repository/QuizRepository.php index 92d468d..9c4a4e9 100644 --- a/src/Repository/QuizRepository.php +++ b/src/Repository/QuizRepository.php @@ -81,6 +81,7 @@ class QuizRepository extends ServiceEntityRepository c.name, sum(case when a.isRightAnswer = true then 1 else 0 end) as correct, qd.corrections, + qd.penaltySeconds, max(ga.created) as end_time, qd.created as start_time, (sum(case when a.isRightAnswer = true then 1 else 0 end) + qd.corrections) as score @@ -99,6 +100,7 @@ class QuizRepository extends ServiceEntityRepository name: $row['name'], correct: (int) $row['correct'], corrections: $row['corrections'], + penaltySeconds: $row['penaltySeconds'], time: $row['start_time']->diff(new DateTimeImmutable($row['end_time'])), score: $row['score'], ), $result); diff --git a/templates/backoffice/quiz.html.twig b/templates/backoffice/quiz.html.twig index ea19683..4e7cc2e 100644 --- a/templates/backoffice/quiz.html.twig +++ b/templates/backoffice/quiz.html.twig @@ -84,6 +84,7 @@