'datetime', 'terminee_a' => 'datetime', ]; /** @return BelongsTo */ public function quiz(): BelongsTo { return $this->belongsTo(Quiz::class); } /** @return BelongsTo */ public function questionCourante(): BelongsTo { return $this->belongsTo(QuestionQuiz::class, 'question_quiz_courante_id'); } /** @return HasMany */ public function reponses(): HasMany { return $this->hasMany(ReponseQuiz::class); } /** * Passe à la question suivante du quiz (dans l'ordre), ou termine la * session s'il n'y en a plus. Idempotent : rejouable sans effet si déjà * terminée. */ public function passerALaQuestionSuivante(): void { if ($this->statut === self::TERMINEE) { return; } $questions = $this->quiz->questions; $indiceActuel = $this->question_quiz_courante_id ? $questions->search(fn ($q) => $q->id === $this->question_quiz_courante_id) : -1; $suivante = $questions->get($indiceActuel + 1); if ($suivante) { $this->forceFill(['statut' => self::EN_COURS, 'question_quiz_courante_id' => $suivante->id])->save(); } else { $this->terminer(); } } public function terminer(): void { if ($this->statut !== self::TERMINEE) { $this->forceFill(['statut' => self::TERMINEE, 'terminee_a' => now()])->save(); } } /** * Décompte des réponses à la question en cours, pour le panneau du * prof : combien d'élèves ont déjà répondu, combien ont juste. * * @return array{repondu: int, correctes: int} */ public function decompteQuestionCourante(): array { if (! $this->question_quiz_courante_id) { return ['repondu' => 0, 'correctes' => 0]; } $reponses = $this->reponses->where('question_quiz_id', $this->question_quiz_courante_id); return ['repondu' => $reponses->count(), 'correctes' => $reponses->where('correcte', true)->count()]; } }