From 6b2769d5062745c3e7ee62b3229062e4dc390339 Mon Sep 17 00:00:00 2001 From: Saufi Date: Wed, 20 May 2026 08:13:36 +0800 Subject: [PATCH] tambah emel masa semak sijil --- .../Public/AttendanceCheckController.php | 32 +++++++++++ .../views/public/semak/result.blade.php | 54 +++++++++++++++++-- src/routes/web.php | 1 + 3 files changed, 83 insertions(+), 4 deletions(-) diff --git a/src/app/Http/Controllers/Public/AttendanceCheckController.php b/src/app/Http/Controllers/Public/AttendanceCheckController.php index c8c3666..b362976 100644 --- a/src/app/Http/Controllers/Public/AttendanceCheckController.php +++ b/src/app/Http/Controllers/Public/AttendanceCheckController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Public; use App\Http\Controllers\Controller; +use App\Jobs\SendCertificateEmailJob; use App\Models\Certificate; use App\Models\Participant; use App\Models\ProgramQrCode; @@ -57,4 +58,35 @@ class AttendanceCheckController extends Controller return view('public.semak.result', compact('program', 'qrCode', 'participant', 'attendance', 'certificate')) ->with('found', (bool) $attendance); } + + public function updateEmail(string $qr_token, Request $request): View + { + $qrCode = ProgramQrCode::where('token', $qr_token)->where('is_active', true)->firstOrFail(); + $program = $qrCode->program; + + $request->validate([ + 'no_kp' => ['required', 'digits:12'], + 'email' => ['required', 'email', 'max:255'], + ], [ + 'email.required' => 'Sila masukkan alamat emel.', + 'email.email' => 'Format emel tidak sah.', + ]); + + $participant = Participant::where('no_kp', $request->no_kp)->firstOrFail(); + $participant->update(['email' => $request->email]); + + $attendance = $participant->attendanceForProgram($program->id); + $certificate = Certificate::where('program_id', $program->id) + ->where('participant_id', $participant->id) + ->first(); + + // Masukkan queue hantar e-sijil jika sijil sudah dijana dan belum dihantar + if ($certificate && $certificate->status === 'generated' && ! $certificate->emailed_at) { + SendCertificateEmailJob::dispatch($certificate); + } + + return view('public.semak.result', compact('program', 'qrCode', 'participant', 'attendance', 'certificate')) + ->with('found', true) + ->with('email_updated', true); + } } diff --git a/src/resources/views/public/semak/result.blade.php b/src/resources/views/public/semak/result.blade.php index 8d40112..1b3522d 100644 --- a/src/resources/views/public/semak/result.blade.php +++ b/src/resources/views/public/semak/result.blade.php @@ -51,6 +51,51 @@ {{-- Certificate status --}} @if($program->isDownloadOpen()) + + @if(! $participant->email) + {{-- Emel belum ada — minta emel sebelum sijil dihantar --}} +
+
+
+ +
+
+
Emel Diperlukan
+
Masukkan emel untuk menerima pautan e-sijil
+
+
+
+ @csrf + +
+ + +
+ Untuk penerimaan e-sijil +
+ @error('email')
{{ $message }}
@enderror +
+ +
+
+ + @else + + {{-- Emel ada (termasuk baru dikemaskini) --}} + @if($email_updated ?? false) +
+ + Emel berjaya dikemaskini. Pautan e-sijil akan dihantar ke + {{ $participant->email }}. +
+ @endif + @if($certificate && $certificate->isGenerated())
@@ -69,12 +114,13 @@ @else
- Link muat turun sijil akan dihantar ke emel anda. - @if($participant->email) - {{ $participant->email }} - @endif + Pautan muat turun sijil akan dihantar ke emel + {{ $participant->email }}.
@endif + + @endif + @else
diff --git a/src/routes/web.php b/src/routes/web.php index f870374..d6523d2 100644 --- a/src/routes/web.php +++ b/src/routes/web.php @@ -118,6 +118,7 @@ Route::middleware('throttle:checkin')->prefix('p')->name('public.')->group(funct Route::post('/{qr_token}/external', [CheckinController::class, 'externalRegister'])->name('checkin.external'); Route::get('/{qr_token}/semak', [AttendanceCheckController::class, 'show'])->name('semak.show'); Route::post('/{qr_token}/semak', [AttendanceCheckController::class, 'check'])->name('semak.check'); + Route::post('/{qr_token}/semak/email', [AttendanceCheckController::class, 'updateEmail'])->name('semak.update-email'); Route::get('/{qr_token}/questionnaire/{participant_uuid}', [QuestionnaireController::class, 'show'])->name('questionnaire.show'); Route::post('/{qr_token}/questionnaire/{participant_uuid}', [QuestionnaireController::class, 'submit'])->name('questionnaire.submit'); });