plan implementation 6, 7, 8, 9, 10
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user