fix status hantar emel dan jana sijil
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user