tambah fungsi upload peserta sebagai hadir

This commit is contained in:
Saufi
2026-05-20 20:10:43 +08:00
parent 154b2c650e
commit 7e4bbca2db
9 changed files with 1109 additions and 34 deletions

View File

@@ -0,0 +1,93 @@
@extends('layouts.admin')
@section('title', 'Edit Peserta — ' . $pp->participant->name)
@section('header', 'Edit Maklumat Peserta')
@section('breadcrumb')
<li class="breadcrumb-item"><a href="{{ route('admin.programs.index') }}">Program</a></li>
<li class="breadcrumb-item"><a href="{{ route('admin.programs.show', $program) }}">{{ Str::limit($program->title, 25) }}</a></li>
<li class="breadcrumb-item"><a href="{{ route('admin.programs.participants.index', $program) }}">Peserta</a></li>
<li class="breadcrumb-item active">Edit</li>
@endsection
@section('content')
<div class="row justify-content-center">
<div class="col-lg-6">
<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-person-gear me-2 text-primary"></i>Kemaskini Maklumat Peserta
</span>
</div>
<div class="card-body">
<form method="POST" action="{{ route('admin.programs.participants.update', [$program, $pp]) }}">
@csrf @method('PUT')
<div class="mb-3">
<label class="form-label fw-medium">Nama Penuh <span class="text-danger">*</span></label>
<input type="text" name="name" class="form-control @error('name') is-invalid @enderror"
value="{{ old('name', $pp->participant->name) }}" required>
@error('name')<div class="invalid-feedback">{{ $message }}</div>@enderror
</div>
<div class="mb-3">
<label class="form-label fw-medium">No. Kad Pengenalan <span class="text-danger">*</span></label>
<input type="text" name="no_kp" class="form-control @error('no_kp') is-invalid @enderror"
value="{{ old('no_kp', $pp->participant->no_kp) }}"
placeholder="12 digit tanpa sempang" required>
@error('no_kp')<div class="invalid-feedback">{{ $message }}</div>@enderror
</div>
<div class="mb-3">
<label class="form-label fw-medium">Emel</label>
<input type="email" name="email" class="form-control @error('email') is-invalid @enderror"
value="{{ old('email', $pp->participant->email) }}"
placeholder="Kosongkan jika tiada">
@error('email')<div class="invalid-feedback">{{ $message }}</div>@enderror
</div>
<div class="mb-3">
<label class="form-label fw-medium">No. Telefon</label>
<input type="text" name="phone" class="form-control @error('phone') is-invalid @enderror"
value="{{ old('phone', $pp->participant->phone) }}"
placeholder="Kosongkan jika tiada">
@error('phone')<div class="invalid-feedback">{{ $message }}</div>@enderror
</div>
<div class="mb-3">
<label class="form-label fw-medium">Jabatan / Agensi</label>
<input type="text" name="agency" class="form-control @error('agency') is-invalid @enderror"
value="{{ old('agency', $pp->participant->agency) }}"
placeholder="Kosongkan jika tiada">
@error('agency')<div class="invalid-feedback">{{ $message }}</div>@enderror
</div>
<div class="mb-4">
<label class="form-label fw-medium">Sesi</label>
<select name="session" class="form-select @error('session') is-invalid @enderror">
<option value=""> Tiada Sesi </option>
<option value="pagi" {{ old('session', $pp->pre_registered_session) === 'pagi' ? 'selected' : '' }}>Pagi</option>
<option value="petang" {{ old('session', $pp->pre_registered_session) === 'petang' ? 'selected' : '' }}>Petang</option>
<option value="full_day" {{ old('session', $pp->pre_registered_session) === 'full_day' ? 'selected' : '' }}>Sehari Penuh</option>
</select>
@error('session')<div class="invalid-feedback">{{ $message }}</div>@enderror
</div>
@foreach($filters as $key => $value)
<input type="hidden" name="{{ $key }}" value="{{ $value }}">
@endforeach
@php $backUrl = route('admin.programs.participants.index', $program) . ($filters ? '?' . http_build_query($filters) : ''); @endphp
<div class="d-flex gap-2">
<button type="submit" class="btn btn-primary">
<i class="bi bi-check-lg me-1"></i> Simpan
</button>
<a href="{{ $backUrl }}" class="btn btn-outline-secondary">Batal</a>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -17,6 +17,30 @@
{{-- Import Result --}}
@if(session('import_result'))
@php $r = session('import_result'); @endphp
{{-- All IC empty offer delete --}}
@if(!empty($r['all_empty_ic']))
<div class="card border-0 shadow-sm mb-4 border-start border-4 border-warning">
<div class="card-body">
<h6 class="fw-semibold mb-2 text-warning">
<i class="bi bi-exclamation-triangle me-2"></i>Semua No. K/P Kosong
</h6>
<p class="small text-muted mb-3">
Fail CSV yang dimuat naik tidak mengandungi sebarang No. K/P yang sah.
Tiada rekod diimport. Adakah anda ingin <strong>memadam semua peserta belum hadir</strong> dalam program ini?
</p>
<form method="POST" action="{{ route('admin.programs.participants.clear', $program) }}">
@csrf @method('DELETE')
<button type="submit" class="btn btn-danger btn-sm"
onclick="return confirm('Padam semua peserta yang belum hadir? Tindakan ini tidak boleh dibatalkan.')">
<i class="bi bi-trash me-1"></i> Padam Peserta Belum Hadir
</button>
<a href="{{ route('admin.programs.participants.import.form', $program) }}"
class="btn btn-outline-secondary btn-sm ms-2">Batal</a>
</form>
</div>
</div>
@else
<div class="card border-0 shadow-sm mb-4 border-start border-4
{{ $r['failed'] > 0 ? 'border-warning' : 'border-success' }}">
<div class="card-body">
@@ -59,6 +83,7 @@
</div>
</div>
@endif
@endif
{{-- Upload Form --}}
<div class="card border-0 shadow-sm">
@@ -79,7 +104,7 @@
@error('csv_file')<div class="invalid-feedback">{{ $message }}</div>@enderror
</div>
<div class="mb-4">
<div class="mb-3">
<label class="form-label fw-medium">Sesi Default</label>
<select name="session" class="form-select">
<option value=""> Ikut Tetapan Program </option>
@@ -90,6 +115,24 @@
<div class="form-text">Sesi yang akan digunakan untuk semua peserta dalam fail ini.</div>
</div>
@if($programEnded)
<div class="mb-4 p-3 bg-warning bg-opacity-10 rounded border border-warning-subtle">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="mark_attendance"
value="1" id="markAttendance">
<label class="form-check-label fw-medium" for="markAttendance">
Tandakan sebagai Data Kehadiran
</label>
</div>
<div class="small text-muted mt-1 ms-4">
<i class="bi bi-info-circle me-1"></i>
Tempoh check-in telah tamat pada <strong>{{ ($program->checkin_end_at ?? $program->end_date->endOfDay())->format('d M Y, H:i') }}</strong>.
Jika ditanda, semua peserta dalam fail ini akan direkodkan sebagai <strong>hadir</strong>.
Peserta sedia ada dalam program akan dikemaskini status kehadirannya.
</div>
</div>
@endif
<button type="submit" class="btn btn-primary w-100">
<i class="bi bi-upload me-2"></i>Mula Import
</button>

View File

@@ -201,6 +201,10 @@
<i class="bi bi-download"></i>
</a>
@endif
<a href="{{ route('admin.programs.participants.edit', [$program, $pp]) . (request()->hasAny(['search','source','status','page']) ? '?' . http_build_query(request()->only(['search','source','status','page'])) : '') }}"
class="btn btn-sm btn-outline-secondary" title="Edit Peserta">
<i class="bi bi-pencil"></i>
</a>
@if($pp->status !== 'checked_in')
<form method="POST"
action="{{ route('admin.programs.participants.destroy', [$program, $pp]) }}"