Files
eCert-MBIP/app/Http/Controllers/Admin/ProgramQuestionnaireController.php
Saufi 2f76f94283 feat: questionnaire management (Fasa 6)
- QuestionnaireSetController: full CRUD + publish/archive
- QuestionController: store, update, destroy, reorder
- ProgramQuestionnaireController: attach, confirm, detach
- Public/QuestionnaireController: show form, submit responses, double-submit guard
- Views: admin questionnaire CRUD, program questionnaire assign, public form + thankyou/already

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 20:53:43 +08:00

89 lines
2.8 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Program;
use App\Models\ProgramQuestionnaire;
use App\Models\QuestionnaireSet;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class ProgramQuestionnaireController extends Controller
{
public function show(Program $program): View
{
$pq = $program->questionnaire()->with('questionnaireSet.questions')->first();
$availableSets = QuestionnaireSet::where('status', 'published')
->withCount('questions')
->orderBy('title')
->get();
return view('admin.programs.questionnaire.show', compact('program', 'pq', 'availableSets'));
}
public function attach(Request $request, Program $program): RedirectResponse
{
$data = $request->validate([
'questionnaire_set_id' => 'required|exists:questionnaire_sets,id',
]);
if ($program->questionnaire()->exists()) {
return back()->with('error', 'Program ini sudah ada soalselidik dilampirkan. Tanggalkan dahulu sebelum lampir yang baru.');
}
$set = QuestionnaireSet::findOrFail($data['questionnaire_set_id']);
if ($set->status !== 'published') {
return back()->with('error', 'Hanya soalselidik yang diterbitkan boleh dilampirkan.');
}
ProgramQuestionnaire::create([
'program_id' => $program->id,
'questionnaire_set_id' => $set->id,
'is_confirmed' => false,
]);
return back()->with('success', 'Soalselidik berjaya dilampirkan. Sila sahkan sebelum program bermula.');
}
public function confirm(Request $request, Program $program): RedirectResponse
{
$pq = $program->questionnaire;
if (! $pq) {
return back()->with('error', 'Tiada soalselidik untuk disahkan.');
}
$pq->update([
'is_confirmed' => true,
'confirmed_at' => now(),
'confirmed_by' => auth()->id(),
]);
return back()->with('success', 'Soalselidik telah disahkan untuk program ini.');
}
public function detach(Program $program): RedirectResponse
{
$pq = $program->questionnaire;
if (! $pq) {
return back()->with('error', 'Tiada soalselidik untuk ditanggalkan.');
}
if ($pq->is_confirmed) {
$hasResponses = \App\Models\QuestionnaireResponse::where('program_id', $program->id)->exists();
if ($hasResponses) {
return back()->with('error', 'Soalselidik tidak boleh ditanggalkan kerana sudah ada respons diterima.');
}
}
$pq->delete();
return back()->with('success', 'Soalselidik berjaya ditanggalkan.');
}
}