This commit is contained in:
Saufi
2026-06-03 08:51:22 +08:00
commit a14d43fe34
347 changed files with 38197 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
@extends('layouts.app')
@section('title', 'Kehadiran PPM')
@section('content')
<div class="page-heading">
<div class="eyebrow">PPM</div>
<h1 class="h3 mb-1">Rekod Kehadiran</h1>
<p class="text-secondary mb-0">Pilih Pusat Mengundi jagaan untuk merekod kehadiran hari mengundi.</p>
</div>
<div class="row g-3">
@forelse ($pusats as $pusat)
@php($summary = $summaryService->totalsForPusat($pusat))
<div class="col-12 col-lg-6">
<div class="content-panel p-3 p-md-4 h-100">
<div class="d-flex justify-content-between gap-3">
<div>
<h2 class="h5 mb-1">{{ $pusat->code }} - {{ $pusat->name }}</h2>
<div class="text-secondary small">{{ $pusat->election?->name }}</div>
</div>
<span class="badge {{ $pusat->election?->settings?->is_attendance_active ? 'text-bg-success' : 'text-bg-secondary' }}">
{{ $pusat->election?->settings?->is_attendance_active ? 'Aktif' : 'Belum aktif' }}
</span>
</div>
<div class="row g-2 mt-3">
<div class="col-6 col-md-3"><div class="small text-secondary">Staf</div><div class="fw-bold">{{ $summary['total_staff'] }}</div></div>
<div class="col-6 col-md-3"><div class="small text-secondary">Hadir</div><div class="fw-bold text-success">{{ $summary['present'] }}</div></div>
<div class="col-6 col-md-3"><div class="small text-secondary">Tidak hadir</div><div class="fw-bold text-danger">{{ $summary['absent'] }}</div></div>
<div class="col-6 col-md-3"><div class="small text-secondary">Belum rekod</div><div class="fw-bold text-warning">{{ $summary['not_recorded'] }}</div></div>
</div>
<div class="mt-3">
<a class="btn btn-primary" href="{{ route('ppm.attendance.show', $pusat) }}">
<i class="bi bi-clipboard-check me-1"></i>Rekod Kehadiran
</a>
</div>
</div>
</div>
@empty
<div class="col-12">
<div class="content-panel p-4 text-center text-secondary">Tiada Pusat Mengundi ditetapkan kepada akaun PPM ini.</div>
</div>
@endforelse
</div>
@endsection

View File

@@ -0,0 +1,92 @@
@extends('layouts.app')
@section('title', 'Rekod Kehadiran')
@section('content')
<div class="page-heading">
<div class="eyebrow">PPM</div>
<div class="d-flex justify-content-between flex-column flex-lg-row gap-3">
<div>
<h1 class="h3 mb-1">Rekod Kehadiran</h1>
<p class="text-secondary mb-0">{{ $pusat->code }} - {{ $pusat->name }}</p>
</div>
<div><a class="btn btn-outline-secondary" href="{{ route('ppm.attendance.index') }}">Kembali</a></div>
</div>
</div>
<div class="row g-3 mb-4">
@foreach ([
['label' => 'Staf', 'value' => $summary['total_staff'], 'tone' => 'primary'],
['label' => 'Hadir', 'value' => $summary['present'], 'tone' => 'success'],
['label' => 'Tidak hadir', 'value' => $summary['absent'], 'tone' => 'danger'],
['label' => 'Belum rekod', 'value' => $summary['not_recorded'], 'tone' => 'warning'],
] as $card)
<div class="col-6 col-xl-3">
<div class="stat-card h-100">
<div class="text-secondary small">{{ $card['label'] }}</div>
<div class="fs-3 fw-bold mt-2 text-{{ $card['tone'] }}">{{ $card['value'] }}</div>
</div>
</div>
@endforeach
</div>
@if (! $pusat->election?->settings?->is_attendance_active)
<div class="alert alert-warning">
Modul kehadiran belum diaktifkan untuk pilihanraya ini.
</div>
@endif
<form method="POST" action="{{ route('ppm.attendance.store', $pusat) }}">
@csrf
<div class="content-panel p-0 overflow-hidden">
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead>
<tr>
<th>Staf</th>
<th>Jawatan</th>
<th>Saluran</th>
<th>Status</th>
<th>Masa Check-in</th>
<th>Catatan</th>
</tr>
</thead>
<tbody>
@forelse ($assignments as $assignment)
@php($attendance = $assignment->attendance)
<tr>
<td>
<div class="fw-semibold">{{ $assignment->application?->name ?: $assignment->user?->name ?: 'Tanpa nama' }}</div>
<div class="small text-secondary">{{ $assignment->application?->ic_number ?: $assignment->user?->email ?: '-' }}</div>
</td>
<td>{{ $assignment->position?->code }}</td>
<td>{{ $assignment->saluranMengundi?->number ?: '-' }}</td>
<td style="min-width: 160px;">
<select class="form-select form-select-sm" name="attendance[{{ $assignment->id }}][status]">
@foreach (['not_recorded' => 'Belum rekod', 'present' => 'Hadir', 'absent' => 'Tidak hadir'] as $value => $label)
<option value="{{ $value }}" @selected(old("attendance.{$assignment->id}.status", $attendance?->status ?? 'not_recorded') === $value)>{{ $label }}</option>
@endforeach
</select>
</td>
<td style="min-width: 190px;">
<input class="form-control form-control-sm" type="datetime-local" name="attendance[{{ $assignment->id }}][check_in_time]" value="{{ old("attendance.{$assignment->id}.check_in_time", $attendance?->check_in_time?->format('Y-m-d\TH:i')) }}">
</td>
<td style="min-width: 220px;">
<input class="form-control form-control-sm" name="attendance[{{ $assignment->id }}][note]" value="{{ old("attendance.{$assignment->id}.note", $attendance?->note) }}">
</td>
</tr>
@empty
<tr><td colspan="6" class="text-center text-secondary py-4">Tiada staf aktif untuk Pusat Mengundi ini.</td></tr>
@endforelse
</tbody>
</table>
</div>
</div>
<div class="d-flex justify-content-end mt-3">
<button class="btn btn-primary" type="submit" @disabled(! $pusat->election?->settings?->is_attendance_active)>
<i class="bi bi-save me-1"></i>Simpan Kehadiran
</button>
</div>
</form>
@endsection