tambah emel masa semak sijil

This commit is contained in:
Saufi
2026-05-20 08:13:36 +08:00
parent 7ef5092933
commit 6b2769d506
3 changed files with 83 additions and 4 deletions

View File

@@ -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);
}
}

View File

@@ -51,6 +51,51 @@
{{-- Certificate status --}}
@if($program->isDownloadOpen())
@if(! $participant->email)
{{-- Emel belum ada minta emel sebelum sijil dihantar --}}
<div class="checkin-card card p-4 mb-3">
<div class="d-flex align-items-center gap-3 mb-3">
<div class="rounded-circle bg-warning bg-opacity-10 d-flex align-items-center justify-content-center flex-shrink-0"
style="width:44px;height:44px;">
<i class="bi bi-envelope-exclamation-fill text-warning fs-5"></i>
</div>
<div>
<div class="fw-semibold">Emel Diperlukan</div>
<div class="text-muted small">Masukkan emel untuk menerima pautan e-sijil</div>
</div>
</div>
<form method="POST" action="{{ route('public.semak.update-email', $qrCode->token) }}">
@csrf
<input type="hidden" name="no_kp" value="{{ $participant->no_kp }}">
<div class="mb-3">
<label class="form-label fw-medium small">Alamat Emel <span class="text-danger">*</span></label>
<input type="email" name="email"
class="form-control @error('email') is-invalid @enderror"
placeholder="nama@email.com"
value="{{ old('email') }}" autocomplete="email" required>
<div class="form-text">
<i class="bi bi-info-circle me-1"></i>Untuk penerimaan e-sijil
</div>
@error('email')<div class="invalid-feedback">{{ $message }}</div>@enderror
</div>
<button type="submit" class="btn btn-primary w-100">
<i class="bi bi-envelope-check me-2"></i>Kemaskini & Hantar E-Sijil
</button>
</form>
</div>
@else
{{-- Emel ada (termasuk baru dikemaskini) --}}
@if($email_updated ?? false)
<div class="alert alert-success small mb-3">
<i class="bi bi-check-circle-fill me-2"></i>
Emel berjaya dikemaskini. Pautan e-sijil akan dihantar ke
<strong>{{ $participant->email }}</strong>.
</div>
@endif
@if($certificate && $certificate->isGenerated())
<div class="checkin-card card p-4 text-center">
<i class="bi bi-award-fill text-warning fs-1 mb-2"></i>
@@ -69,12 +114,13 @@
@else
<div class="alert alert-info text-center small">
<i class="bi bi-envelope-fill me-2"></i>
Link muat turun sijil akan dihantar ke emel anda.
@if($participant->email)
<strong>{{ $participant->email }}</strong>
@endif
Pautan muat turun sijil akan dihantar ke emel
<strong>{{ $participant->email }}</strong>.
</div>
@endif
@endif
@else
<div class="alert alert-secondary text-center small">
<i class="bi bi-clock me-2"></i>

View File

@@ -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');
});