plan implementation 6, 7, 8, 9, 10

This commit is contained in:
2026-02-03 10:50:56 +01:00
parent e8be239c32
commit 0b6c6736ef
16 changed files with 2665 additions and 44 deletions

View File

@@ -4,6 +4,7 @@
namespace App\Http\Controllers;
use App\Http\Requests\Screening\UpdateScreeningRequest;
use App\Models\Category;
use App\Models\Screening;
use Illuminate\Http\RedirectResponse;
@@ -32,14 +33,20 @@ public function show(Screening $screening): Response
{
return Inertia::render('Screening/Show', [
'screening' => $screening,
'questions' => array_values(config('screening.questions')),
]);
}
/**
* Save screening answers and redirect to result.
*/
public function update(Request $request, Screening $screening): RedirectResponse
public function update(UpdateScreeningRequest $request, Screening $screening): RedirectResponse
{
$validated = $request->validated();
$this->saveAnswers($screening, $validated['answers']);
$this->calculateAndUpdateScore($screening, $validated['answers']);
return redirect()->route('screening.result', $screening);
}
@@ -50,7 +57,58 @@ public function result(Screening $screening): Response
{
return Inertia::render('Screening/Result', [
'screening' => $screening,
'categories' => Category::orderBy('sort_order')->get(['id', 'name']),
'passed' => $screening->passed,
'score' => $screening->score,
'totalQuestions' => count(config('screening.questions')),
'categories' => $screening->passed ? Category::orderBy('sort_order')->get(['id', 'name']) : [],
]);
}
/**
* Save screening answers to the database using upsert pattern.
*/
private function saveAnswers(Screening $screening, array $answers): void
{
foreach ($answers as $questionNumber => $value) {
$screening->answers()->updateOrCreate(
[
'screening_id' => $screening->id,
'question_number' => (int) $questionNumber,
],
[
'value' => $value,
]
);
}
}
/**
* Calculate the score and update the screening record.
*/
private function calculateAndUpdateScore(Screening $screening, array $answers): void
{
$score = $this->calculateScore($answers);
$passed = $score >= config('screening.passing_score', 5);
$screening->update([
'score' => $score,
'passed' => $passed,
]);
}
/**
* Calculate the total score from the answers.
*/
private function calculateScore(array $answers): int
{
$score = 0;
foreach ($answers as $value) {
if ($value === 'yes') {
$score++;
}
}
return $score;
}
}