tambah emel masa semak sijil
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
namespace App\Http\Controllers\Public;
|
namespace App\Http\Controllers\Public;
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Jobs\SendCertificateEmailJob;
|
||||||
use App\Models\Certificate;
|
use App\Models\Certificate;
|
||||||
use App\Models\Participant;
|
use App\Models\Participant;
|
||||||
use App\Models\ProgramQrCode;
|
use App\Models\ProgramQrCode;
|
||||||
@@ -57,4 +58,35 @@ class AttendanceCheckController extends Controller
|
|||||||
return view('public.semak.result', compact('program', 'qrCode', 'participant', 'attendance', 'certificate'))
|
return view('public.semak.result', compact('program', 'qrCode', 'participant', 'attendance', 'certificate'))
|
||||||
->with('found', (bool) $attendance);
|
->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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,51 @@
|
|||||||
|
|
||||||
{{-- Certificate status --}}
|
{{-- Certificate status --}}
|
||||||
@if($program->isDownloadOpen())
|
@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())
|
@if($certificate && $certificate->isGenerated())
|
||||||
<div class="checkin-card card p-4 text-center">
|
<div class="checkin-card card p-4 text-center">
|
||||||
<i class="bi bi-award-fill text-warning fs-1 mb-2"></i>
|
<i class="bi bi-award-fill text-warning fs-1 mb-2"></i>
|
||||||
@@ -69,12 +114,13 @@
|
|||||||
@else
|
@else
|
||||||
<div class="alert alert-info text-center small">
|
<div class="alert alert-info text-center small">
|
||||||
<i class="bi bi-envelope-fill me-2"></i>
|
<i class="bi bi-envelope-fill me-2"></i>
|
||||||
Link muat turun sijil akan dihantar ke emel anda.
|
Pautan muat turun sijil akan dihantar ke emel
|
||||||
@if($participant->email)
|
<strong>{{ $participant->email }}</strong>.
|
||||||
<strong>{{ $participant->email }}</strong>
|
|
||||||
@endif
|
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
|
@endif
|
||||||
|
|
||||||
@else
|
@else
|
||||||
<div class="alert alert-secondary text-center small">
|
<div class="alert alert-secondary text-center small">
|
||||||
<i class="bi bi-clock me-2"></i>
|
<i class="bi bi-clock me-2"></i>
|
||||||
|
|||||||
@@ -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::post('/{qr_token}/external', [CheckinController::class, 'externalRegister'])->name('checkin.external');
|
||||||
Route::get('/{qr_token}/semak', [AttendanceCheckController::class, 'show'])->name('semak.show');
|
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', [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::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');
|
Route::post('/{qr_token}/questionnaire/{participant_uuid}', [QuestionnaireController::class, 'submit'])->name('questionnaire.submit');
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user