fix status hantar emel dan jana sijil

This commit is contained in:
Saufi
2026-05-20 10:20:59 +08:00
parent 899507070c
commit 7027651dd7
12 changed files with 240 additions and 141 deletions

View File

@@ -5,7 +5,7 @@
@section('content')
{{-- Stats Row 1 --}}
{{-- Stats Row --}}
<div class="row g-3 mb-4">
<div class="col-sm-6 col-xl-3">
<div class="card stat-card h-100">
@@ -56,78 +56,25 @@
<div class="card stat-card h-100">
<div class="card-body d-flex align-items-center gap-3">
<div class="stat-icon bg-info bg-opacity-10">
<i class="bi bi-clipboard2-check-fill text-info"></i>
<i class="bi bi-envelope-fill text-info"></i>
</div>
<div>
<div class="text-muted small">Soalselidik Dijawab</div>
<div class="fs-3 fw-bold">{{ $stats['total_responses'] }}</div>
@if($stats['emails_pending'] > 0)
<div class="text-warning small"><i class="bi bi-envelope-fill me-1"></i>{{ $stats['emails_pending'] }} emel tertunda</div>
@else
<div class="text-muted small">Tiada emel tertunda</div>
@endif
</div>
</div>
</div>
</div>
</div>
{{-- Email & Download Status --}}
<div class="row g-3 mb-4">
<div class="col-12">
<div class="card border-0 shadow-sm">
<div class="card-header bg-white border-bottom py-3">
<span class="fw-semibold"><i class="bi bi-envelope-fill me-2 text-primary"></i>Status Penghantaran E-Sijil</span>
</div>
<div class="card-body">
<div class="row g-3">
<div class="col-6 col-md-3">
<div class="d-flex align-items-center gap-3 p-3 rounded-3 bg-secondary bg-opacity-10">
<div class="flex-shrink-0">
<i class="bi bi-hourglass-split text-secondary fs-3"></i>
</div>
<div>
<div class="text-muted small">Dalam Antrian</div>
<div class="fs-3 fw-bold lh-1">{{ $stats['emails_pending'] }}</div>
<div class="text-muted" style="font-size:.7rem;">menunggu / sedang cuba</div>
</div>
</div>
</div>
<div class="col-6 col-md-3">
<div class="d-flex align-items-center gap-3 p-3 rounded-3 bg-success bg-opacity-10">
<div class="flex-shrink-0">
<i class="bi bi-envelope-check-fill text-success fs-3"></i>
</div>
<div>
<div class="text-muted small">Berjaya Dihantar</div>
<div class="fs-3 fw-bold lh-1">{{ $stats['emails_sent'] }}</div>
<div class="text-muted" style="font-size:.7rem;">emel e-sijil</div>
</div>
</div>
</div>
<div class="col-6 col-md-3">
<div class="d-flex align-items-center gap-3 p-3 rounded-3 bg-danger bg-opacity-10">
<div class="flex-shrink-0">
<i class="bi bi-envelope-x-fill text-danger fs-3"></i>
</div>
<div>
<div class="text-muted small">Gagal Dihantar</div>
<div class="fs-3 fw-bold lh-1">{{ $stats['emails_failed'] }}</div>
<div class="text-muted" style="font-size:.7rem;">semua percubaan gagal</div>
</div>
</div>
</div>
<div class="col-6 col-md-3">
<div class="d-flex align-items-center gap-3 p-3 rounded-3 bg-warning bg-opacity-10">
<div class="flex-shrink-0">
<i class="bi bi-download text-warning fs-3"></i>
</div>
<div>
<div class="text-muted small">Sijil Dimuat Turun</div>
<div class="fs-3 fw-bold lh-1">{{ $stats['downloaded_certs'] }}</div>
<div class="text-muted" style="font-size:.7rem;">{{ $stats['total_download_count'] }} kali klik pautan</div>
</div>
</div>
<div class="text-muted small">E-Sijil Dihantar</div>
<div class="fs-3 fw-bold">{{ $stats['emails_sent'] }}</div>
<div class="d-flex gap-2 flex-wrap mt-1">
@if($stats['emails_pending'] > 0)
<span class="badge bg-warning-subtle text-warning border border-warning-subtle" style="font-size:.65rem;">
<i class="bi bi-clock me-1"></i>{{ $stats['emails_pending'] }} belum dihantar
</span>
@endif
@if($stats['emails_failed'] > 0)
<span class="badge bg-danger-subtle text-danger border border-danger-subtle" style="font-size:.65rem;">
<i class="bi bi-x-circle me-1"></i>{{ $stats['emails_failed'] }} gagal
</span>
@endif
@if($stats['emails_pending'] === 0 && $stats['emails_failed'] === 0)
<span class="text-muted" style="font-size:.7rem;">Semua selesai</span>
@endif
</div>
</div>
</div>

View File

@@ -45,7 +45,7 @@
@csrf
<button class="btn btn-primary"
onclick="return confirm('Jana sijil untuk semua peserta hadir?')">
<i class="bi bi-gear me-1"></i> Jana Semua Sijil
<i class="bi bi-gear me-1"></i> Jana E-Sijil
</button>
</form>
@@ -117,7 +117,7 @@
<tr>
<td colspan="6" class="text-center py-5 text-muted">
<i class="bi bi-award d-block fs-1 mb-3 opacity-25"></i>
Belum ada sijil dijana. Klik "Jana Semua Sijil" untuk mula.
Belum ada sijil dijana. Klik "Jana E-Sijil" untuk mula.
</td>
</tr>
@endforelse

View File

@@ -107,9 +107,8 @@
<tbody>
@foreach($programParticipants as $i => $pp)
@php
$p = $pp->participant;
$cert = $certificates[$pp->participant_id] ?? null;
$emailLog = $cert ? ($emailLogs[$cert->id] ?? null) : null;
$p = $pp->participant;
$cert = $certificates[$pp->participant_id] ?? null;
@endphp
<tr>
<td class="text-muted small">{{ $programParticipants->firstItem() + $i }}</td>
@@ -168,23 +167,21 @@
@endif
{{-- Emel --}}
@if($emailLog)
@if($emailLog->status === 'sent')
<div class="text-success mt-1" style="font-size:.7rem;">
<i class="bi bi-envelope-check me-1"></i>Emel Dihantar
</div>
@elseif($emailLog->status === 'failed')
<div class="text-danger mt-1" style="font-size:.7rem;">
<i class="bi bi-envelope-x me-1"></i>Emel Gagal
</div>
@elseif($emailLog->status === 'pending')
<div class="text-warning mt-1" style="font-size:.7rem;">
<i class="bi bi-hourglass-split me-1"></i>Dalam Antrian
</div>
@endif
@elseif($cert->isGenerated())
@if($pp->status_sent_emel === 'sent')
<div class="text-success mt-1" style="font-size:.7rem;">
<i class="bi bi-envelope-check me-1"></i>Emel Dihantar
</div>
@elseif($pp->status_sent_emel === 'failed')
<div class="text-danger mt-1" style="font-size:.7rem;">
<i class="bi bi-envelope-x me-1"></i>Emel Gagal
</div>
@elseif($pp->status_sent_emel === 'pending')
<div class="text-warning mt-1" style="font-size:.7rem;">
<i class="bi bi-hourglass-split me-1"></i>Dalam Antrian
</div>
@elseif($cert && $cert->isGenerated() && ! $cert->emailed_at)
<div class="text-muted mt-1" style="font-size:.7rem;">
<i class="bi bi-envelope me-1"></i>Belum Dihantar
<i class="bi bi-clock me-1"></i>Belum Dihantar
</div>
@endif
@@ -197,16 +194,24 @@
@endif
</td>
<td class="text-end">
@if($pp->status !== 'checked_in')
<form method="POST"
action="{{ route('admin.programs.participants.destroy', [$program, $pp]) }}"
onsubmit="return confirm('Keluarkan peserta {{ $p->name }} daripada program?')">
@csrf @method('DELETE')
<button class="btn btn-sm btn-outline-danger" title="Keluarkan">
<i class="bi bi-person-dash"></i>
</button>
</form>
@endif
<div class="d-flex justify-content-end gap-1">
@if($cert && $cert->isGenerated())
<a href="{{ route('admin.programs.certificates.download', [$program, $cert]) }}"
class="btn btn-sm btn-outline-primary" title="Muat Turun Sijil">
<i class="bi bi-download"></i>
</a>
@endif
@if($pp->status !== 'checked_in')
<form method="POST"
action="{{ route('admin.programs.participants.destroy', [$program, $pp]) }}"
onsubmit="return confirm('Keluarkan peserta {{ $p->name }} daripada program?')">
@csrf @method('DELETE')
<button class="btn btn-sm btn-outline-danger" title="Keluarkan">
<i class="bi bi-person-dash"></i>
</button>
</form>
@endif
</div>
</td>
</tr>
@endforeach

View File

@@ -107,6 +107,60 @@
</div>
</div>
{{-- Status Penghantaran E-Sijil --}}
<div class="card border-0 shadow-sm mb-4">
<div class="card-header bg-white border-bottom py-3 d-flex justify-content-between align-items-center">
<span class="fw-semibold"><i class="bi bi-envelope-fill me-2 text-primary"></i>Status Penghantaran E-Sijil</span>
@if($stats['emails_sent'] + $stats['emails_pending'] + $stats['emails_failed'] === 0)
<span class="badge bg-secondary-subtle text-secondary border border-secondary-subtle">Belum Dihantar</span>
@endif
</div>
<div class="card-body py-3">
<div class="row g-3">
<div class="col-6 col-md-3">
<div class="d-flex align-items-center gap-3 p-3 rounded-3 bg-secondary bg-opacity-10">
<i class="bi bi-clock text-secondary fs-3 flex-shrink-0"></i>
<div>
<div class="text-muted small">Belum Dihantar</div>
<div class="fs-3 fw-bold lh-1">{{ $stats['emails_pending'] }}</div>
<div class="text-muted" style="font-size:.7rem;">sijil sedia, emel belum hantar</div>
</div>
</div>
</div>
<div class="col-6 col-md-3">
<div class="d-flex align-items-center gap-3 p-3 rounded-3 bg-success bg-opacity-10">
<i class="bi bi-envelope-check-fill text-success fs-3 flex-shrink-0"></i>
<div>
<div class="text-muted small">Berjaya Dihantar</div>
<div class="fs-3 fw-bold lh-1">{{ $stats['emails_sent'] }}</div>
<div class="text-muted" style="font-size:.7rem;">emel e-sijil</div>
</div>
</div>
</div>
<div class="col-6 col-md-3">
<div class="d-flex align-items-center gap-3 p-3 rounded-3 bg-danger bg-opacity-10">
<i class="bi bi-envelope-x-fill text-danger fs-3 flex-shrink-0"></i>
<div>
<div class="text-muted small">Gagal Dihantar</div>
<div class="fs-3 fw-bold lh-1">{{ $stats['emails_failed'] }}</div>
<div class="text-muted" style="font-size:.7rem;">semua percubaan gagal</div>
</div>
</div>
</div>
<div class="col-6 col-md-3">
<div class="d-flex align-items-center gap-3 p-3 rounded-3 bg-warning bg-opacity-10">
<i class="bi bi-download text-warning fs-3 flex-shrink-0"></i>
<div>
<div class="text-muted small">Sijil Dimuat Turun</div>
<div class="fs-3 fw-bold lh-1">{{ $stats['downloaded_certificates'] }}</div>
<div class="text-muted" style="font-size:.7rem;">{{ $stats['total_downloads'] }} kali klik pautan</div>
</div>
</div>
</div>
</div>
</div>
</div>
{{-- Tab Navigation --}}
<ul class="nav nav-tabs mb-0" id="programTabs">
<li class="nav-item">
@@ -148,10 +202,17 @@
{{ $stats['walk_in'] }} walk-in
</span>
</div>
<div class="d-flex gap-2">
<div class="d-flex gap-2 flex-wrap">
<a href="{{ route('admin.programs.participants.import.form', $program) }}" class="btn btn-sm btn-outline-secondary">
<i class="bi bi-upload me-1"></i> Import CSV
</a>
<form method="POST" action="{{ route('admin.programs.certificates.generate-all', $program) }}" class="d-inline">
@csrf
<button class="btn btn-sm btn-outline-warning"
onclick="return confirm('Jana e-sijil untuk semua peserta yang hadir?')">
<i class="bi bi-gear me-1"></i> Jana E-Sijil
</button>
</form>
<a href="{{ route('admin.programs.participants.create', $program) }}" class="btn btn-sm btn-primary">
<i class="bi bi-person-plus me-1"></i> Tambah Peserta
</a>