From 91a950a8161942ac83ecb3bab0732f5267087de4 Mon Sep 17 00:00:00 2001 From: Saufi Date: Fri, 22 May 2026 10:29:28 +0800 Subject: [PATCH] fungsi delete program --- .../Controllers/Admin/ProgramController.php | 52 +++++++++++++++++-- .../views/admin/programs/show.blade.php | 7 +++ 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/app/Http/Controllers/Admin/ProgramController.php b/src/app/Http/Controllers/Admin/ProgramController.php index 758db8a..5748fc1 100644 --- a/src/app/Http/Controllers/Admin/ProgramController.php +++ b/src/app/Http/Controllers/Admin/ProgramController.php @@ -9,6 +9,8 @@ use App\Models\Program; use App\Services\AuditLogService; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Storage; use Illuminate\View\View; class ProgramController extends Controller @@ -136,13 +138,53 @@ class ProgramController extends Controller { $this->authorize('delete', $program); - if ($program->attendances()->exists()) { - return back()->with('error', 'Program tidak boleh dipadam kerana sudah ada rekod kehadiran.'); - } + // Capture audit data before deletion + $auditData = [ + 'program_title' => $program->title, + 'start_date' => $program->start_date?->toDateString(), + 'end_date' => $program->end_date?->toDateString(), + 'program_created_at' => $program->created_at?->toDateTimeString(), + 'deleted_by' => auth()->user()->name, + ]; + + // Collect file paths before transaction + $certFiles = $program->certificates()->pluck('file_path')->filter()->values()->all(); + $templateFiles = $program->certificateTemplate ? [$program->certificateTemplate->image_path] : []; + $qrFiles = $program->qrCode ? [$program->qrCode->qr_image_path] : []; $title = $program->title; - AuditLogService::log('program.deleted', $program); - $program->delete(); + + AuditLogService::log('program.deleted', $program, [], $auditData); + + DB::transaction(function () use ($program) { + $programId = $program->id; + + DB::table('email_logs')->where('program_id', $programId)->delete(); + + // questionnaire_answers has FK to questionnaire_responses + DB::table('questionnaire_answers') + ->whereIn('questionnaire_response_id', function ($q) use ($programId) { + $q->select('id')->from('questionnaire_responses')->where('program_id', $programId); + }) + ->delete(); + + DB::table('questionnaire_responses')->where('program_id', $programId)->delete(); + DB::table('program_questionnaires')->where('program_id', $programId)->delete(); + DB::table('certificates')->where('program_id', $programId)->delete(); + DB::table('attendances')->where('program_id', $programId)->delete(); + DB::table('program_participants')->where('program_id', $programId)->delete(); + DB::table('certificate_templates')->where('program_id', $programId)->delete(); + DB::table('program_qr_codes')->where('program_id', $programId)->delete(); + + $program->delete(); + }); + + // Delete physical files after transaction + foreach (array_merge($certFiles, $templateFiles, $qrFiles) as $path) { + if ($path) { + Storage::disk('local')->delete($path); + } + } return redirect() ->route('admin.programs.index') diff --git a/src/resources/views/admin/programs/show.blade.php b/src/resources/views/admin/programs/show.blade.php index 9ac9030..7a87a7b 100644 --- a/src/resources/views/admin/programs/show.blade.php +++ b/src/resources/views/admin/programs/show.blade.php @@ -28,6 +28,13 @@ @endif +
+ @csrf @method('DELETE') + +
@endsection