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,22 @@
<div class="content-panel mb-4 p-2">
<div class="d-flex flex-wrap gap-2">
<a class="btn btn-sm {{ request()->routeIs('admin.management.index') ? 'btn-primary' : 'btn-outline-primary' }}" href="{{ route('admin.management.index') }}">
<i class="bi bi-grid me-1"></i>Ringkasan
</a>
<a class="btn btn-sm {{ request()->routeIs('admin.management.applications.*') ? 'btn-primary' : 'btn-outline-primary' }}" href="{{ route('admin.management.applications.index') }}">
<i class="bi bi-file-earmark-person me-1"></i>Permohonan
</a>
<a class="btn btn-sm {{ request()->routeIs('admin.management.assignments.*') ? 'btn-primary' : 'btn-outline-primary' }}" href="{{ route('admin.management.assignments.index') }}">
<i class="bi bi-person-lines-fill me-1"></i>Tugasan
</a>
<a class="btn btn-sm {{ request()->routeIs('admin.management.penempatan.*') ? 'btn-primary' : 'btn-outline-primary' }}" href="{{ route('admin.dashboard') }}">
<i class="bi bi-people-fill me-1"></i>Penempatan
</a>
<a class="btn btn-sm {{ request()->routeIs('admin.management.representatives.*') ? 'btn-primary' : 'btn-outline-primary' }}" href="{{ route('admin.management.representatives.index') }}">
<i class="bi bi-building-check me-1"></i>Wakil Agensi
</a>
<a class="btn btn-sm {{ request()->routeIs('admin.management.wheelchairs.*') ? 'btn-primary' : 'btn-outline-primary' }}" href="{{ route('admin.management.wheelchairs.index') }}">
<i class="bi bi-universal-access me-1"></i>Kerusi Roda
</a>
</div>
</div>

View File

@@ -0,0 +1,48 @@
<div class="row g-3">
<div class="col-md-6">
<label class="form-label" for="assign_position_id">Jawatan</label>
<select class="form-select" id="assign_position_id" name="position_id" required>
@foreach ($positions as $position)
<option value="{{ $position->id }}" @selected(old('position_id', $application->approved_position_id ?: $application->requested_position_id) == $position->id)>{{ $position->code }} - {{ $position->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-6">
<label class="form-label" for="assign_pusat_mengundi_id">Pusat Mengundi</label>
<select class="form-select" id="assign_pusat_mengundi_id" name="pusat_mengundi_id" required>
@foreach ($pusats as $pusat)
<option value="{{ $pusat->id }}" @selected(old('pusat_mengundi_id', $application->pusat_mengundi_id) == $pusat->id)>{{ $pusat->code }} - {{ $pusat->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-6">
<label class="form-label" for="assign_saluran_mengundi_id">Saluran</label>
<select class="form-select" id="assign_saluran_mengundi_id" name="saluran_mengundi_id">
<option value="">Pusat level / ikut KTM</option>
@foreach ($salurans as $saluran)
<option value="{{ $saluran->id }}" @selected(old('saluran_mengundi_id', $application->staffAssignments->first()?->saluran_mengundi_id) == $saluran->id)>{{ $saluran->pusatMengundi?->code }} - Saluran {{ $saluran->number }}</option>
@endforeach
</select>
</div>
<div class="col-md-6">
<label class="form-label" for="reports_to_assignment_id">KTM Ketua</label>
<select class="form-select" id="reports_to_assignment_id" name="reports_to_assignment_id">
<option value="">Tiada</option>
@foreach ($ktmAssignments as $ktm)
<option value="{{ $ktm->id }}" @selected(old('reports_to_assignment_id', $application->selected_ktm_assignment_id) == $ktm->id)>{{ $ktm->user?->name ?? 'KTM' }} - {{ $ktm->pusatMengundi?->code }} / Saluran {{ $ktm->saluranMengundi?->number }}</option>
@endforeach
</select>
</div>
<div class="col-md-6">
<label class="form-label" for="assign_status">Status Tugasan</label>
<select class="form-select" id="assign_status" name="status">
@foreach (['active', 'inactive', 'replaced', 'cancelled'] as $status)
<option value="{{ $status }}">{{ $status }}</option>
@endforeach
</select>
</div>
<div class="col-12">
<label class="form-label" for="assign_note">Catatan</label>
<textarea class="form-control" id="assign_note" name="note" rows="2" placeholder="Wajib selepas tempoh pendaftaran ditutup">{{ old('note') }}</textarea>
</div>
</div>

View File

@@ -0,0 +1,86 @@
@php($isEdit = $application->exists)
<div class="row g-3">
@unless($isEdit)
<div class="col-md-6">
<label class="form-label" for="election_id">Pilihanraya</label>
<select class="form-select" id="election_id" name="election_id" required>
@foreach ($elections as $election)
<option value="{{ $election->id }}" @selected(old('election_id', $application->election_id) == $election->id)>{{ $election->name }}</option>
@endforeach
</select>
</div>
@endunless
<div class="col-md-6">
<label class="form-label" for="pusat_mengundi_id">Pusat Mengundi</label>
<select class="form-select" id="pusat_mengundi_id" name="pusat_mengundi_id" required>
@foreach ($pusats as $pusat)
<option value="{{ $pusat->id }}" @selected(old('pusat_mengundi_id', $application->pusat_mengundi_id) == $pusat->id)>{{ $pusat->code }} - {{ $pusat->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-6">
<label class="form-label" for="requested_position_id">Jawatan Dipohon</label>
<select class="form-select" id="requested_position_id" name="requested_position_id" required>
@foreach ($positions as $position)
<option value="{{ $position->id }}" @selected(old('requested_position_id', $application->requested_position_id) == $position->id)>{{ $position->code }} - {{ $position->name }}</option>
@endforeach
</select>
</div>
@if($isEdit)
<div class="col-md-6">
<label class="form-label" for="approved_position_id">Jawatan Diluluskan</label>
<select class="form-select" id="approved_position_id" name="approved_position_id">
<option value="">Belum diluluskan</option>
@foreach ($positions as $position)
<option value="{{ $position->id }}" @selected(old('approved_position_id', $application->approved_position_id) == $position->id)>{{ $position->code }} - {{ $position->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-6">
<label class="form-label" for="status">Status</label>
<select class="form-select" id="status" name="status" required>
@foreach (['draft', 'submitted', 'under_ppm_review', 'approved', 'rejected', 'assigned', 'cancelled'] as $status)
<option value="{{ $status }}" @selected(old('status', $application->status) === $status)>{{ str_replace('_', ' ', $status) }}</option>
@endforeach
</select>
</div>
@endif
<div class="col-md-6">
<label class="form-label" for="name">Nama</label>
<input class="form-control" id="name" name="name" value="{{ old('name', $application->name) }}" required>
</div>
<div class="col-md-6">
<label class="form-label" for="ic_number">No. IC</label>
<input class="form-control" id="ic_number" name="ic_number" value="{{ old('ic_number', $application->ic_number) }}" maxlength="12" required>
</div>
<div class="col-md-6">
<label class="form-label" for="phone_number">Telefon</label>
<input class="form-control" id="phone_number" name="phone_number" value="{{ old('phone_number', $application->phone_number) }}" required>
</div>
<div class="col-md-6">
<label class="form-label" for="email">Email</label>
<input class="form-control" id="email" name="email" type="email" value="{{ old('email', $application->email) }}">
</div>
<div class="col-12">
<label class="form-label" for="address">Alamat</label>
<textarea class="form-control" id="address" name="address" rows="2">{{ old('address', $application->address) }}</textarea>
</div>
<div class="col-md-6">
<label class="form-label" for="bank_name">Bank</label>
<input class="form-control" id="bank_name" name="bank_name" value="{{ old('bank_name', $application->bank_name) }}">
</div>
<div class="col-md-6">
<label class="form-label" for="bank_account_number">No. Akaun Bank</label>
<input class="form-control" id="bank_account_number" name="bank_account_number" value="{{ old('bank_account_number', $application->bank_account_number) }}">
</div>
<div class="col-12">
<label class="form-label" for="note">Catatan</label>
<textarea class="form-control" id="note" name="note" rows="2" placeholder="Wajib selepas tempoh pendaftaran ditutup">{{ old('note') }}</textarea>
</div>
</div>

View File

@@ -0,0 +1,24 @@
@extends('layouts.app')
@section('title', 'Manual Entry')
@section('content')
<div class="page-heading">
<div class="eyebrow">Admin</div>
<h1 class="h3 mb-1">Manual Entry Permohonan</h1>
<p class="text-secondary mb-0">Rekod yang dimasukkan Admin tidak menghantar email permintaan butiran bank.</p>
</div>
@include('admin.management._nav')
<div class="content-panel p-3 p-md-4">
<form method="POST" action="{{ route('admin.management.applications.store') }}">
@csrf
@include('admin.management.applications._form')
<div class="d-flex justify-content-end gap-2 mt-4">
<a class="btn btn-outline-secondary" href="{{ route('admin.management.applications.index') }}">Batal</a>
<button class="btn btn-primary" type="submit"><i class="bi bi-save me-1"></i>Simpan</button>
</div>
</form>
</div>
@endsection

View File

@@ -0,0 +1,77 @@
@extends('layouts.app')
@section('title', 'Edit Permohonan')
@section('content')
<div class="page-heading">
<div class="eyebrow">Admin</div>
<div class="d-flex justify-content-between flex-column flex-lg-row gap-3">
<div>
<h1 class="h3 mb-1">Edit Permohonan</h1>
<p class="text-secondary mb-0">{{ $application->name }} · {{ $application->public_uuid }}</p>
</div>
</div>
</div>
@include('admin.management._nav')
<div class="row g-3">
<div class="col-12 col-xl-7">
<div class="content-panel p-3 p-md-4">
<h2 class="h5 mb-3">Maklumat Pemohon</h2>
<form method="POST" action="{{ route('admin.management.applications.update', $application->public_uuid) }}">
@csrf
@method('PATCH')
@include('admin.management.applications._form')
<div class="d-flex justify-content-end gap-2 mt-4">
<a class="btn btn-outline-secondary" href="{{ route('admin.management.applications.index') }}">Kembali</a>
<button class="btn btn-primary" type="submit"><i class="bi bi-save me-1"></i>Kemas Kini</button>
</div>
</form>
</div>
</div>
<div class="col-12 col-xl-5">
<div class="content-panel p-3 p-md-4">
<h2 class="h5 mb-3">Direct Assignment</h2>
<form method="POST" action="{{ route('admin.management.applications.assign', $application->public_uuid) }}">
@csrf
@include('admin.management.applications._assignment_form')
<div class="d-flex justify-content-end mt-4">
<button class="btn btn-primary" type="submit"><i class="bi bi-person-check me-1"></i>Assign</button>
</div>
</form>
</div>
<div class="content-panel p-3 p-md-4 mt-3">
<h2 class="h6 mb-3">Sejarah Status</h2>
<div class="list-group list-group-flush">
@forelse ($application->statusHistories->sortByDesc('created_at') as $history)
<div class="list-group-item px-0">
<div class="fw-semibold">{{ $history->from_status ?: '-' }} {{ $history->to_status }}</div>
<div class="text-secondary small">{{ $history->created_at?->format('d/m/Y H:i') }} · {{ $history->note ?: '-' }}</div>
</div>
@empty
<div class="text-secondary">Tiada sejarah.</div>
@endforelse
</div>
</div>
<div class="content-panel p-3 p-md-4 mt-3">
<h2 class="h6 mb-3">Dokumen</h2>
@forelse ($application->documents as $document)
<div class="d-flex justify-content-between align-items-center border-bottom py-2">
<div>
<div class="fw-semibold">{{ str_replace('_', ' ', $document->document_type) }}</div>
<div class="small text-secondary">{{ $document->original_name }}</div>
</div>
<a class="btn btn-sm btn-outline-primary" href="{{ route('admin.documents.download', $document) }}">
<i class="bi bi-download me-1"></i>Muat turun
</a>
</div>
@empty
<div class="text-secondary">Tiada dokumen dimuat naik.</div>
@endforelse
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,87 @@
@extends('layouts.app')
@section('title', 'Senarai Permohonan')
@section('content')
<div class="page-heading">
<div class="eyebrow">Admin</div>
<div class="d-flex justify-content-between flex-column flex-lg-row gap-3">
<div>
<h1 class="h3 mb-1">Senarai Permohonan</h1>
<p class="text-secondary mb-0">Paparan global untuk semakan, edit, dan direct assignment.</p>
</div>
<div><a class="btn btn-primary" href="{{ route('admin.management.applications.create') }}"><i class="bi bi-plus-circle me-1"></i>Manual Entry</a></div>
</div>
</div>
@include('admin.management._nav')
<div class="content-panel p-3 mb-3">
<form class="row g-2" method="GET">
<div class="col-12 col-md-3"><input class="form-control" name="q" value="{{ $filters['q'] ?? '' }}" placeholder="Cari nama / IC / email"></div>
<div class="col-6 col-md-3">
<select class="form-select" name="status">
<option value="">Semua status</option>
@foreach (['submitted', 'under_ppm_review', 'approved', 'assigned', 'rejected', 'cancelled'] as $status)
<option value="{{ $status }}" @selected(($filters['status'] ?? '') === $status)>{{ str_replace('_', ' ', $status) }}</option>
@endforeach
</select>
</div>
<div class="col-6 col-md-3">
<select class="form-select" name="pusat_mengundi_id">
<option value="">Semua pusat</option>
@foreach ($pusats as $pusat)
<option value="{{ $pusat->id }}" @selected(($filters['pusat_mengundi_id'] ?? '') == $pusat->id)>{{ $pusat->code }} - {{ $pusat->name }}</option>
@endforeach
</select>
</div>
<div class="col-6 col-md-2">
<select class="form-select" name="position_id">
<option value="">Semua jawatan</option>
@foreach ($positions as $position)
<option value="{{ $position->id }}" @selected(($filters['position_id'] ?? '') == $position->id)>{{ $position->code }}</option>
@endforeach
</select>
</div>
<div class="col-6 col-md-1"><button class="btn btn-outline-primary w-100" type="submit"><i class="bi bi-search"></i></button></div>
</form>
</div>
<div class="content-panel p-0 overflow-hidden">
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead>
<tr>
<x-sort-th column="name" label="Nama" />
<th>Pusat</th>
<th>Jawatan</th>
<x-sort-th column="status" label="Status" />
<th>Sumber</th>
<x-sort-th column="created_at" label="Tarikh" />
<th class="text-end no-sort">Tindakan</th>
</tr>
</thead>
<tbody>
@forelse ($applications as $application)
<tr>
<td>
<div class="fw-semibold">{{ $application->name }}</div>
<div class="text-secondary small">{{ $application->ic_number }} · {{ $application->email ?: '-' }}</div>
</td>
<td>{{ $application->pusatMengundi?->code }}<div class="small text-secondary">{{ $application->pusatMengundi?->name }}</div></td>
<td>{{ $application->approvedPosition?->code ?: $application->requestedPosition?->code }}</td>
<td><span class="badge text-bg-secondary">{{ str_replace('_', ' ', $application->status) }}</span></td>
<td>{{ $application->source }}</td>
<td class="small text-secondary">{{ $application->created_at?->format('d/m/Y') }}</td>
<td class="text-end"><a class="btn btn-sm btn-outline-primary" href="{{ route('admin.management.applications.edit', $application->public_uuid) }}">Edit</a></td>
</tr>
@empty
<tr><td colspan="7" class="text-center text-secondary py-4">Tiada permohonan dijumpai.</td></tr>
@endforelse
</tbody>
</table>
</div>
</div>
<div class="mt-3">{{ $applications->links() }}</div>
@endsection

View File

@@ -0,0 +1,89 @@
@extends('layouts.app')
@section('title', 'Edit Tugasan')
@section('content')
<div class="page-heading">
<div class="eyebrow">Admin</div>
<h1 class="h3 mb-1">Edit Tugasan</h1>
<p class="text-secondary mb-0">{{ $assignment->application?->name ?: $assignment->user?->name ?: 'Tugasan staf' }}</p>
</div>
@include('admin.management._nav')
<div class="row g-3">
<div class="col-12 col-xl-7">
<div class="content-panel p-3 p-md-4">
<form method="POST" action="{{ route('admin.management.assignments.update', $assignment) }}">
@csrf
@method('PATCH')
<div class="row g-3">
<div class="col-md-6">
<label class="form-label" for="position_id">Jawatan</label>
<select class="form-select" id="position_id" name="position_id" required>
@foreach ($positions as $position)
<option value="{{ $position->id }}" @selected(old('position_id', $assignment->position_id) == $position->id)>{{ $position->code }} - {{ $position->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-6">
<label class="form-label" for="pusat_mengundi_id">Pusat Mengundi</label>
<select class="form-select" id="pusat_mengundi_id" name="pusat_mengundi_id" required>
@foreach ($pusats as $pusat)
<option value="{{ $pusat->id }}" @selected(old('pusat_mengundi_id', $assignment->pusat_mengundi_id) == $pusat->id)>{{ $pusat->code }} - {{ $pusat->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-6">
<label class="form-label" for="saluran_mengundi_id">Saluran</label>
<select class="form-select" id="saluran_mengundi_id" name="saluran_mengundi_id">
<option value="">Pusat level / ikut KTM</option>
@foreach ($salurans as $saluran)
<option value="{{ $saluran->id }}" @selected(old('saluran_mengundi_id', $assignment->saluran_mengundi_id) == $saluran->id)>{{ $saluran->pusatMengundi?->code }} - Saluran {{ $saluran->number }}</option>
@endforeach
</select>
</div>
<div class="col-md-6">
<label class="form-label" for="reports_to_assignment_id">KTM Ketua</label>
<select class="form-select" id="reports_to_assignment_id" name="reports_to_assignment_id">
<option value="">Tiada</option>
@foreach ($ktmAssignments as $ktm)
<option value="{{ $ktm->id }}" @selected(old('reports_to_assignment_id', $assignment->reports_to_assignment_id) == $ktm->id)>{{ $ktm->user?->name ?? 'KTM' }} - {{ $ktm->pusatMengundi?->code }} / Saluran {{ $ktm->saluranMengundi?->number }}</option>
@endforeach
</select>
</div>
<div class="col-md-6">
<label class="form-label" for="status">Status</label>
<select class="form-select" id="status" name="status" required>
@foreach (['active', 'inactive', 'replaced', 'cancelled'] as $status)
<option value="{{ $status }}" @selected(old('status', $assignment->status) === $status)>{{ $status }}</option>
@endforeach
</select>
</div>
<div class="col-12">
<label class="form-label" for="note">Catatan</label>
<textarea class="form-control" id="note" name="note" rows="2" placeholder="Wajib selepas tempoh pendaftaran ditutup">{{ old('note') }}</textarea>
</div>
</div>
<div class="d-flex justify-content-end gap-2 mt-4">
<a class="btn btn-outline-secondary" href="{{ route('admin.management.assignments.index') }}">Kembali</a>
<button class="btn btn-primary" type="submit"><i class="bi bi-save me-1"></i>Kemas Kini</button>
</div>
</form>
</div>
</div>
<div class="col-12 col-xl-5">
<div class="content-panel p-3 p-md-4">
<h2 class="h6 mb-3">Sejarah Tugasan</h2>
@forelse ($assignment->histories->sortByDesc('created_at') as $history)
<div class="border-bottom py-2">
<div class="small text-secondary">{{ $history->created_at?->format('d/m/Y H:i') }}</div>
<div>{{ $history->note ?: '-' }}</div>
</div>
@empty
<div class="text-secondary">Tiada sejarah.</div>
@endforelse
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,79 @@
@extends('layouts.app')
@section('title', 'Senarai Tugasan')
@section('content')
<div class="page-heading">
<div class="eyebrow">Admin</div>
<h1 class="h3 mb-1">Senarai Tugasan Staf</h1>
<p class="text-secondary mb-0">Semak dan ubah penempatan staf secara langsung.</p>
</div>
@include('admin.management._nav')
<div class="content-panel p-3 mb-3">
<form class="row g-2" method="GET">
<div class="col-12 col-md-4">
<select class="form-select" name="pusat_mengundi_id">
<option value="">Semua pusat</option>
@foreach ($pusats as $pusat)
<option value="{{ $pusat->id }}" @selected(($filters['pusat_mengundi_id'] ?? '') == $pusat->id)>{{ $pusat->code }} - {{ $pusat->name }}</option>
@endforeach
</select>
</div>
<div class="col-6 col-md-3">
<select class="form-select" name="position_id">
<option value="">Semua jawatan</option>
@foreach ($positions as $position)
<option value="{{ $position->id }}" @selected(($filters['position_id'] ?? '') == $position->id)>{{ $position->code }}</option>
@endforeach
</select>
</div>
<div class="col-6 col-md-3">
<select class="form-select" name="status">
<option value="">Semua status</option>
@foreach (['active', 'inactive', 'replaced', 'cancelled'] as $status)
<option value="{{ $status }}" @selected(($filters['status'] ?? '') === $status)>{{ $status }}</option>
@endforeach
</select>
</div>
<div class="col-12 col-md-2"><button class="btn btn-outline-primary w-100" type="submit"><i class="bi bi-funnel me-1"></i>Tapis</button></div>
</form>
</div>
<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>Pusat / Saluran</th>
<th>KTM Ketua</th>
<x-sort-th column="status" label="Status" />
<th class="text-end no-sort">Tindakan</th>
</tr>
</thead>
<tbody>
@forelse ($assignments as $assignment)
<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->pusatMengundi?->code }}<div class="small text-secondary">{{ $assignment->saluranMengundi ? 'Saluran '.$assignment->saluranMengundi->number : 'Pusat level' }}</div></td>
<td>{{ $assignment->reportsTo?->user?->name ?: '-' }}</td>
<td><span class="badge text-bg-secondary">{{ $assignment->status }}</span></td>
<td class="text-end"><a class="btn btn-sm btn-outline-primary" href="{{ route('admin.management.assignments.edit', $assignment) }}">Edit</a></td>
</tr>
@empty
<tr><td colspan="6" class="text-center text-secondary py-4">Tiada tugasan dijumpai.</td></tr>
@endforelse
</tbody>
</table>
</div>
</div>
<div class="mt-3">{{ $assignments->links() }}</div>
@endsection

View File

@@ -0,0 +1,53 @@
@extends('layouts.app')
@section('title', 'Pengurusan Admin')
@section('content')
<div class="page-heading">
<div class="eyebrow">Admin</div>
<div class="d-flex justify-content-between flex-column flex-lg-row gap-3">
<div>
<h1 class="h3 mb-1">Pengurusan Admin</h1>
<p class="text-secondary mb-0">Senarai global, manual entry, direct assignment, wakil agensi, dan catatan perubahan selepas pendaftaran tutup.</p>
</div>
</div>
</div>
@include('admin.management._nav')
<div class="row g-3">
@foreach ([
['label' => 'Permohonan', 'value' => $counts['applications'], 'icon' => 'bi-file-earmark-person', 'tone' => 'primary'],
['label' => 'Assigned', 'value' => $counts['assigned'], 'icon' => 'bi-person-check', 'tone' => 'success'],
['label' => 'Tugasan aktif', 'value' => $counts['staffAssignments'], 'icon' => 'bi-person-lines-fill', 'tone' => 'info'],
['label' => 'Wakil agensi', 'value' => $counts['representatives'], 'icon' => 'bi-building-check', 'tone' => 'secondary'],
['label' => 'Dokumen tidak lengkap', 'value' => $counts['missingDocuments'], 'icon' => 'bi-file-earmark-x', 'tone' => 'danger'],
['label' => 'Bank tidak lengkap', 'value' => $counts['incompleteBank'], 'icon' => 'bi-bank', 'tone' => 'warning'],
['label' => 'Kerusi roda', 'value' => $counts['wheelchairAllocated'], 'icon' => 'bi-universal-access', 'tone' => 'primary'],
['label' => 'Belum dipulang', 'value' => $counts['wheelchairOutstanding'], 'icon' => 'bi-arrow-return-left', 'tone' => 'warning'],
] as $card)
<div class="col-12 col-sm-6 col-xl-3">
<div class="stat-card h-100">
<div class="d-flex justify-content-between gap-3">
<div>
<div class="text-secondary small">{{ $card['label'] }}</div>
<div class="fs-3 fw-bold mt-2">{{ $card['value'] }}</div>
</div>
<span class="stat-icon text-bg-{{ $card['tone'] }}"><i class="bi {{ $card['icon'] }}"></i></span>
</div>
</div>
</div>
@endforeach
</div>
<div class="content-panel mt-4 p-3 p-md-4">
<h2 class="h5 mb-3">Tindakan</h2>
<div class="row g-2">
<div class="col-12 col-md-6 col-xl-3"><a class="btn btn-outline-primary w-100 text-start" href="{{ route('admin.management.applications.create') }}"><i class="bi bi-plus-circle me-2"></i>Manual Entry</a></div>
<div class="col-12 col-md-6 col-xl-3"><a class="btn btn-outline-primary w-100 text-start" href="{{ route('admin.management.applications.index') }}"><i class="bi bi-search me-2"></i>Senarai Permohonan</a></div>
<div class="col-12 col-md-6 col-xl-3"><a class="btn btn-outline-primary w-100 text-start" href="{{ route('admin.management.assignments.index') }}"><i class="bi bi-person-lines-fill me-2"></i>Senarai Tugasan</a></div>
<div class="col-12 col-md-6 col-xl-3"><a class="btn btn-outline-primary w-100 text-start" href="{{ route('admin.management.representatives.index') }}"><i class="bi bi-building-check me-2"></i>Wakil Agensi</a></div>
<div class="col-12 col-md-6 col-xl-3"><a class="btn btn-outline-primary w-100 text-start" href="{{ route('admin.management.wheelchairs.index') }}"><i class="bi bi-universal-access me-2"></i>Kerusi Roda</a></div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,78 @@
@extends('layouts.app')
@section('title', 'Pindah Petugas')
@section('content')
<div class="page-heading">
<div class="eyebrow">Admin · <a href="{{ route('admin.management.penempatan.show', $pusat) }}">{{ $pusat->name }}</a></div>
<h1 class="h3 mb-0">Pindah Petugas</h1>
</div>
@include('admin.management._nav')
<div class="row g-3">
<div class="col-12 col-xl-5">
{{-- Maklumat petugas semasa --}}
<div class="content-panel p-3 p-md-4 mb-3">
<h2 class="h6 fw-semibold text-secondary mb-3">Maklumat Petugas Semasa</h2>
<dl class="row mb-0">
<dt class="col-5 text-secondary small">Nama</dt>
<dd class="col-7">{{ $assignment->application?->name ?? $assignment->user?->name ?? '-' }}</dd>
<dt class="col-5 text-secondary small">No. KP</dt>
<dd class="col-7 small">{{ $assignment->application?->ic_number ?? '-' }}</dd>
<dt class="col-5 text-secondary small">Jawatan</dt>
<dd class="col-7"><span class="badge text-bg-primary">{{ $assignment->position?->code }}</span></dd>
<dt class="col-5 text-secondary small">Pusat Semasa</dt>
<dd class="col-7">{{ $pusat->code }} {{ $pusat->name }}</dd>
<dt class="col-5 text-secondary small">Saluran Semasa</dt>
<dd class="col-7">{{ $assignment->saluranMengundi ? 'Saluran '.$assignment->saluranMengundi->number : 'Peringkat Pusat' }}</dd>
</dl>
</div>
{{-- Form pindah --}}
<div class="content-panel p-3 p-md-4">
<h2 class="h6 fw-semibold mb-3">Pindah ke Lokasi Baru</h2>
<form method="POST" action="{{ route('admin.management.penempatan.pindah', [$pusat, $assignment]) }}">
@csrf
<div class="mb-3">
<label class="form-label fw-semibold" for="pusat_mengundi_id">Pusat Mengundi Baru</label>
<select id="pusat_mengundi_id" name="pusat_mengundi_id"
class="form-select @error('pusat_mengundi_id') is-invalid @enderror"
required data-tom-select>
@foreach ($pusats as $p)
<option value="{{ $p->id }}" @selected($p->id === $pusat->id)>
{{ $p->code }} {{ $p->name }}
@if ($p->election) ({{ $p->election->name }}) @endif
</option>
@endforeach
</select>
@error('pusat_mengundi_id') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
<div class="mb-4">
<label class="form-label fw-semibold" for="saluran_mengundi_id">Saluran (pilihan)</label>
<select id="saluran_mengundi_id" name="saluran_mengundi_id"
class="form-select @error('saluran_mengundi_id') is-invalid @enderror">
<option value="">Peringkat Pusat (Saluran 0)</option>
@foreach ($salurans as $saluran)
<option value="{{ $saluran->id }}" @selected($saluran->id === $assignment->saluran_mengundi_id)>
Saluran {{ $saluran->number }}
@if ($saluran->name) {{ $saluran->name }} @endif
</option>
@endforeach
</select>
<div class="form-text">Senarai saluran akan dikemaskini apabila pusat baru dipilih.</div>
@error('saluran_mengundi_id') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
<div class="d-flex justify-content-end gap-2">
<a href="{{ route('admin.management.penempatan.show', $pusat) }}" class="btn btn-outline-secondary">Batal</a>
<button type="submit" class="btn btn-primary">
<i class="bi bi-arrow-left-right me-1"></i>Sahkan Pindah
</button>
</div>
</form>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,146 @@
@extends('layouts.app')
@section('title', 'Penempatan — ' . $pusat->name)
@section('content')
<div class="page-heading">
<div class="eyebrow">Admin · <a href="{{ route('admin.dashboard') }}">Dashboard</a></div>
<div class="d-flex justify-content-between flex-column flex-lg-row gap-3">
<div>
<h1 class="h3 mb-1">Penempatan Petugas</h1>
<p class="text-secondary mb-0">
{{ $pusat->code }} {{ $pusat->name }}
@if ($pusat->dun) · DUN {{ $pusat->dun->code }} @endif
@if ($ppm) · PPM: {{ $ppm->application?->name }} @endif
</p>
</div>
<div class="d-flex gap-2 align-items-start">
<a href="{{ route('admin.dashboard') }}" class="btn btn-outline-secondary">Kembali</a>
<a href="{{ route('admin.management.applications.index', ['pusat_mengundi_id' => $pusat->id]) }}"
class="btn btn-outline-primary">
<i class="bi bi-file-earmark-person me-1"></i>Permohonan Pusat Ini
</a>
</div>
</div>
</div>
@include('admin.management._nav')
@forelse ($sections as $section)
<div class="content-panel p-0 overflow-hidden mb-4">
{{-- Section header --}}
<div class="p-3 border-bottom d-flex justify-content-between align-items-center">
<h2 class="h6 mb-0 fw-semibold">
@if ($section['saluran'])
<i class="bi bi-signpost me-2 text-primary"></i>{{ $section['label'] }}
<span class="text-secondary fw-normal small ms-2">{{ $section['saluran']->voter_count ?? 0 }} pengundi</span>
@else
<i class="bi bi-building me-2 text-secondary"></i>{{ $section['label'] }}
@endif
</h2>
@php
$sectionFilled = $section['entries']->sum(fn($e) => $e['assignments']->count());
$sectionQuota = $section['entries']->sum(fn($e) => $e['quota']->quota);
$sectionVacant = $section['entries']->sum(fn($e) => $e['vacant']);
@endphp
<span class="badge {{ $sectionVacant > 0 ? 'text-bg-warning' : 'text-bg-success' }}">
{{ $sectionFilled }} / {{ $sectionQuota }} diisi
</span>
</div>
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead class="table-light">
<tr>
<th>Jawatan</th>
<th>Nama Petugas</th>
<th>No. KP</th>
<th>Telefon</th>
<th>Bank</th>
<th>No. Akaun</th>
<th class="text-end">Tindakan</th>
</tr>
</thead>
<tbody>
@forelse ($section['entries'] as $entry)
{{-- Filled slots --}}
@foreach ($entry['assignments'] as $assignment)
<tr>
@if ($loop->first)
<td rowspan="{{ $entry['assignments']->count() + $entry['vacant'] }}"
class="fw-semibold align-top pt-3">
{{ $entry['position']?->code }}
<div class="small text-secondary fw-normal">{{ $entry['position']?->name }}</div>
<div class="small text-secondary">Kuota: {{ $entry['quota']->quota }}</div>
</td>
@endif
@php $app = $assignment->application; @endphp
<td>
<div class="fw-semibold">{{ $app?->name ?? $assignment->user?->name ?? 'Tanpa nama' }}</div>
<span class="badge text-bg-success small">Aktif</span>
</td>
<td class="small text-secondary">{{ $app?->ic_number ?? '-' }}</td>
<td class="small text-secondary">{{ $app?->phone_number ?? '-' }}</td>
<td class="small">{{ $app?->bank_name ?? '-' }}</td>
<td class="small text-secondary">
{{ $app?->bank_account_number ? \App\Support\SensitiveData::maskAccount($app->bank_account_number) : '-' }}
</td>
<td class="text-end">
<a href="{{ route('admin.management.penempatan.pindah.form', [$pusat, $assignment]) }}"
class="btn btn-sm btn-outline-secondary">
<i class="bi bi-arrow-left-right"></i> Pindah
</a>
<form method="POST"
action="{{ route('admin.management.penempatan.lepas', [$pusat, $assignment]) }}"
class="d-inline"
onsubmit="return confirm('Lepaskan {{ addslashes($app?->name ?? 'petugas') }} dari tugasan ini?')">
@csrf
<button class="btn btn-sm btn-outline-danger">
<i class="bi bi-person-dash"></i> Lepas
</button>
</form>
</td>
</tr>
@endforeach
{{-- Vacant slots --}}
@for ($i = 0; $i < $entry['vacant']; $i++)
<tr class="table-warning">
@if ($entry['assignments']->isEmpty() && $i === 0)
<td rowspan="{{ $entry['vacant'] }}"
class="fw-semibold align-top pt-3">
{{ $entry['position']?->code }}
<div class="small text-secondary fw-normal">{{ $entry['position']?->name }}</div>
<div class="small text-secondary">Kuota: {{ $entry['quota']->quota }}</div>
</td>
@endif
<td colspan="5" class="text-secondary fst-italic small"> Slot kosong </td>
<td class="text-end">
<a href="{{ route('admin.management.applications.index', [
'pusat_mengundi_id' => $pusat->id,
'position_id' => $entry['position']?->id,
'status' => 'approved',
]) }}"
class="btn btn-sm btn-success">
<i class="bi bi-person-plus me-1"></i>Assign
</a>
</td>
</tr>
@endfor
@empty
<tr>
<td colspan="7" class="text-center text-secondary py-3">Tiada kuota ditetapkan untuk bahagian ini.</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
@empty
<div class="content-panel p-4 text-center text-secondary">
<i class="bi bi-info-circle fs-3 d-block mb-2"></i>
Tiada kuota ditetapkan untuk pusat ini. <a href="{{ route('admin.setup.pusat.saluran.index', $pusat) }}">Tetapkan kuota</a>.
</div>
@endforelse
@endsection

View File

@@ -0,0 +1,96 @@
@extends('layouts.app')
@section('title', 'Wakil Agensi')
@section('content')
<div class="page-heading">
<div class="eyebrow">Admin</div>
<h1 class="h3 mb-1">Wakil Polis, KKM dan JKM</h1>
<p class="text-secondary mb-0">Kemasukan manual wakil agensi untuk Pusat Mengundi dan Saluran.</p>
</div>
@include('admin.management._nav')
<div class="content-panel p-3 p-md-4 mb-4">
<h2 class="h5 mb-3">Tambah Wakil</h2>
<form method="POST" action="{{ route('admin.management.representatives.store') }}">
@csrf
<div class="row g-3">
<div class="col-md-3">
<label class="form-label" for="type">Jenis</label>
<select class="form-select" id="type" name="type" required>
<option value="police">Polis Pengiring</option>
<option value="kkm">Wakil KKM</option>
<option value="jkm">Wakil JKM</option>
</select>
</div>
<div class="col-md-3">
<label class="form-label" for="election_id">Pilihanraya</label>
<select class="form-select" id="election_id" name="election_id" required>
@foreach ($elections as $election)
<option value="{{ $election->id }}">{{ $election->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-3">
<label class="form-label" for="pusat_mengundi_id">Pusat</label>
<select class="form-select" id="pusat_mengundi_id" name="pusat_mengundi_id" required>
@foreach ($pusats as $pusat)
<option value="{{ $pusat->id }}">{{ $pusat->code }} - {{ $pusat->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-3">
<label class="form-label" for="saluran_mengundi_id">Saluran Polis</label>
<select class="form-select" id="saluran_mengundi_id" name="saluran_mengundi_id">
<option value="">Tiada / Pusat level</option>
@foreach ($salurans as $saluran)
<option value="{{ $saluran->id }}">{{ $saluran->pusatMengundi?->code }} - Saluran {{ $saluran->number }}</option>
@endforeach
</select>
</div>
<div class="col-md-4"><label class="form-label" for="name">Nama</label><input class="form-control" id="name" name="name" required></div>
<div class="col-md-4"><label class="form-label" for="ic_number">No. IC</label><input class="form-control" id="ic_number" name="ic_number" maxlength="12"></div>
<div class="col-md-4"><label class="form-label" for="phone_number">Telefon</label><input class="form-control" id="phone_number" name="phone_number"></div>
<div class="col-md-4"><label class="form-label" for="rank">Pangkat Polis</label><input class="form-control" id="rank" name="rank"></div>
<div class="col-md-4"><label class="form-label" for="station">Balai Polis</label><input class="form-control" id="station" name="station"></div>
<div class="col-md-4"><label class="form-label" for="agency">Agensi</label><input class="form-control" id="agency" name="agency"></div>
<div class="col-md-6"><label class="form-label" for="notes">Nota Operasi</label><textarea class="form-control" id="notes" name="notes" rows="2"></textarea></div>
<div class="col-md-6"><label class="form-label" for="note">Catatan Admin</label><textarea class="form-control" id="note" name="note" rows="2" placeholder="Wajib selepas tempoh pendaftaran ditutup"></textarea></div>
</div>
<div class="d-flex justify-content-end mt-3"><button class="btn btn-primary" type="submit"><i class="bi bi-save me-1"></i>Simpan</button></div>
</form>
</div>
@foreach ([['title' => 'Polis Pengiring', 'items' => $policeEscorts, 'type' => 'police'], ['title' => 'Wakil KKM', 'items' => $kkmRepresentatives, 'type' => 'kkm'], ['title' => 'Wakil JKM', 'items' => $jkmRepresentatives, 'type' => 'jkm']] as $section)
<div class="content-panel p-0 overflow-hidden mb-4">
<div class="p-3 border-bottom fw-semibold">{{ $section['title'] }}</div>
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead><tr><th>Nama</th><th>Pusat</th><th>Telefon</th><th>Nota</th><th class="text-end no-sort">Tindakan</th></tr></thead>
<tbody>
@forelse ($section['items'] as $item)
<tr>
<td>{{ $item->name }}<div class="small text-secondary">{{ $item->ic_number ?: '-' }}</div></td>
<td>{{ $item->pusatMengundi?->code }} @if($section['type'] === 'police' && $item->saluranMengundi) · Saluran {{ $item->saluranMengundi->number }} @endif</td>
<td>{{ $item->phone_number ?: '-' }}</td>
<td>{{ $item->notes ?: '-' }}</td>
<td class="text-end">
<form method="POST" action="{{ route('admin.management.representatives.destroy', [$section['type'], $item->id]) }}" onsubmit="return confirm('Padam rekod ini?')">
@csrf
@method('DELETE')
<input type="hidden" name="note" value="Dipadam oleh Admin.">
<button class="btn btn-sm btn-outline-danger" type="submit"><i class="bi bi-trash"></i></button>
</form>
</td>
</tr>
@empty
<tr><td colspan="5" class="text-center text-secondary py-4">Tiada rekod.</td></tr>
@endforelse
</tbody>
</table>
</div>
<div class="p-3">{{ $section['items']->links() }}</div>
</div>
@endforeach
@endsection

View File

@@ -0,0 +1,91 @@
@extends('layouts.app')
@section('title', 'Kerusi Roda')
@section('content')
<div class="page-heading">
<div class="eyebrow">Admin</div>
<div class="d-flex justify-content-between flex-column flex-lg-row gap-3">
<div>
<h1 class="h3 mb-1">Pengurusan Kerusi Roda</h1>
<p class="text-secondary mb-0">Peruntukan, rekod ambil, rekod pulang, keadaan, dan catatan kerusi roda.</p>
</div>
</div>
</div>
@include('admin.management._nav')
<div class="content-panel p-3 p-md-4 mb-4">
<h2 class="h5 mb-3">Tetapkan Peruntukan</h2>
<form method="POST" action="{{ route('admin.management.wheelchairs.store') }}">
@csrf
<div class="row g-3">
<div class="col-md-3">
<label class="form-label" for="election_id">Pilihanraya</label>
<select class="form-select" id="election_id" name="election_id" required>
@foreach ($elections as $election)
<option value="{{ $election->id }}">{{ $election->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-5">
<label class="form-label" for="pusat_mengundi_id">Pusat Mengundi</label>
<select class="form-select" id="pusat_mengundi_id" name="pusat_mengundi_id" required>
@foreach ($pusats as $pusat)
<option value="{{ $pusat->id }}">{{ $pusat->code }} - {{ $pusat->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-2">
<label class="form-label" for="allocated_quantity">Jumlah</label>
<input class="form-control" id="allocated_quantity" name="allocated_quantity" type="number" min="0" value="0" required>
</div>
<div class="col-md-2 d-flex align-items-end">
<button class="btn btn-primary w-100" type="submit"><i class="bi bi-save me-1"></i>Simpan</button>
</div>
<div class="col-12">
<label class="form-label" for="notes">Nota</label>
<textarea class="form-control" id="notes" name="notes" rows="2"></textarea>
</div>
</div>
</form>
</div>
<div class="content-panel p-0 overflow-hidden">
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead>
<tr>
<th>Pusat Mengundi</th>
<th>Peruntukan</th>
<th>Diambil</th>
<th>Dipulang</th>
<th>Belum Dipulang</th>
<th>Baki Boleh Diambil</th>
<th class="text-end no-sort">Tindakan</th>
</tr>
</thead>
<tbody>
@forelse ($allocations as $allocation)
<tr>
<td>
<div class="fw-semibold">{{ $allocation->pusatMengundi?->code }} - {{ $allocation->pusatMengundi?->name }}</div>
<div class="small text-secondary">{{ $allocation->election?->name }}</div>
</td>
<td>{{ $allocation->allocated_quantity }}</td>
<td>{{ $service->takenQuantity($allocation) }}</td>
<td>{{ $service->returnedQuantity($allocation) }}</td>
<td><span class="badge text-bg-warning">{{ $service->outstandingQuantity($allocation) }}</span></td>
<td><span class="badge text-bg-success">{{ $service->availableQuantity($allocation) }}</span></td>
<td class="text-end"><a class="btn btn-sm btn-outline-primary" href="{{ route('admin.management.wheelchairs.show', $allocation) }}">Urus</a></td>
</tr>
@empty
<tr><td colspan="7" class="text-center text-secondary py-4">Tiada peruntukan kerusi roda.</td></tr>
@endforelse
</tbody>
</table>
</div>
</div>
<div class="mt-3">{{ $allocations->links() }}</div>
@endsection

View File

@@ -0,0 +1,232 @@
@extends('layouts.app')
@section('title', 'Rekod Kerusi Roda')
@section('content')
<div class="page-heading">
<div class="eyebrow">Admin</div>
<div class="d-flex justify-content-between flex-column flex-lg-row gap-3">
<div>
<h1 class="h3 mb-1">Rekod Kerusi Roda</h1>
<p class="text-secondary mb-0">{{ $allocation->pusatMengundi?->code }} {{ $allocation->pusatMengundi?->name }}</p>
</div>
<div><a class="btn btn-outline-secondary" href="{{ route('admin.management.wheelchairs.index') }}">Kembali</a></div>
</div>
</div>
@include('admin.management._nav')
@php
$taken = $service->takenQuantity($allocation);
$returned = $service->returnedQuantity($allocation);
$outstanding = $service->outstandingQuantity($allocation);
$available = $service->availableQuantity($allocation);
@endphp
<div class="row g-3 mb-4">
@foreach ([
['label' => 'Peruntukan', 'value' => $allocation->allocated_quantity, 'tone' => 'primary'],
['label' => 'Diambil', 'value' => $taken, 'tone' => 'info'],
['label' => 'Dipulang', 'value' => $returned, 'tone' => 'success'],
['label' => 'Belum dipulang', 'value' => $outstanding, 'tone' => 'warning'],
['label' => 'Baki boleh diambil','value' => $available, 'tone' => 'secondary'],
] as $card)
<div class="col-12 col-sm-6 col-xl">
<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>
<div class="row g-3">
{{-- Kiri: 3 panel borang --}}
<div class="col-12 col-xl-5">
{{-- Kemaskini Peruntukan --}}
<div class="content-panel p-3 p-md-4 mb-3">
<h2 class="h5 mb-3">Kemaskini Peruntukan</h2>
<form method="POST" action="{{ route('admin.management.wheelchairs.update', $allocation) }}">
@csrf @method('PATCH')
<input type="hidden" name="election_id" value="{{ $allocation->election_id }}">
<input type="hidden" name="pusat_mengundi_id" value="{{ $allocation->pusat_mengundi_id }}">
<div class="mb-3">
<label class="form-label" for="allocated_quantity">Jumlah Peruntukan</label>
<input class="form-control @error('allocated_quantity') is-invalid @enderror"
id="allocated_quantity" name="allocated_quantity" type="number" min="{{ $outstanding }}"
value="{{ old('allocated_quantity', $allocation->allocated_quantity) }}" required>
<div class="form-text">Minimum {{ $outstanding }} (kerusi belum dipulang).</div>
@error('allocated_quantity') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
<div class="mb-3">
<label class="form-label" for="notes">Nota</label>
<textarea class="form-control" id="notes" name="notes" rows="2">{{ old('notes', $allocation->notes) }}</textarea>
</div>
<div class="d-flex justify-content-end">
<button class="btn btn-primary" type="submit"><i class="bi bi-save me-1"></i>Simpan</button>
</div>
</form>
</div>
{{-- Rekod Ambil --}}
<div class="content-panel p-3 p-md-4 mb-3 border-start border-4 border-info">
<h2 class="h5 mb-1">Rekod Ambil</h2>
<p class="text-secondary small mb-3">Baki boleh diambil: <strong class="text-info">{{ $available }}</strong></p>
@if ($available === 0)
<div class="alert alert-secondary py-2 mb-0">Tiada baki kerusi roda untuk diambil.</div>
@else
<form method="POST" action="{{ route('admin.management.wheelchairs.ambil', $allocation) }}">
@csrf
<div class="row g-3">
<div class="col-md-6">
<label class="form-label" for="taken_quantity">Jumlah Ambil</label>
<input class="form-control @error('quantity') is-invalid @enderror"
id="taken_quantity" name="quantity" type="number" min="1" max="{{ $available }}"
value="{{ old('quantity') }}" required>
<div class="form-text">Maks: {{ $available }}</div>
@error('quantity') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
<div class="col-md-6">
<label class="form-label" for="taken_at">Masa Ambil</label>
<input class="form-control @error('taken_at') is-invalid @enderror"
id="taken_at" name="taken_at" type="datetime-local"
value="{{ old('taken_at', now()->format('Y-m-d\TH:i')) }}">
@error('taken_at') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
<div class="col-12">
<label class="form-label" for="taken_by_name">Diambil Oleh <span class="text-danger">*</span></label>
<input class="form-control @error('taken_by_name') is-invalid @enderror"
id="taken_by_name" name="taken_by_name"
value="{{ old('taken_by_name') }}" required>
@error('taken_by_name') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
<div class="col-12">
<label class="form-label" for="taken_notes">Nota</label>
<textarea class="form-control" id="taken_notes" name="notes" rows="2">{{ old('notes') }}</textarea>
</div>
</div>
<div class="d-flex justify-content-end mt-3">
<button class="btn btn-info text-white" type="submit"><i class="bi bi-box-arrow-up-right me-1"></i>Rekod Ambil</button>
</div>
</form>
@endif
</div>
{{-- Rekod Pulang --}}
<div class="content-panel p-3 p-md-4 border-start border-4 border-success">
<h2 class="h5 mb-1">Rekod Pulang</h2>
<p class="text-secondary small mb-3">Belum dipulang: <strong class="text-warning">{{ $outstanding }}</strong></p>
@if ($outstanding === 0)
<div class="alert alert-secondary py-2 mb-0">Tiada kerusi roda yang perlu dipulangkan.</div>
@else
<form method="POST" action="{{ route('admin.management.wheelchairs.pulang', $allocation) }}">
@csrf
<div class="row g-3">
<div class="col-md-6">
<label class="form-label" for="return_quantity">Jumlah Pulang</label>
<input class="form-control @error('quantity') is-invalid @enderror"
id="return_quantity" name="quantity" type="number" min="1" max="{{ $outstanding }}"
value="{{ old('quantity') }}" required>
<div class="form-text">Maks: {{ $outstanding }}</div>
@error('quantity') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
<div class="col-md-6">
<label class="form-label" for="returned_at">Masa Pulang</label>
<input class="form-control @error('returned_at') is-invalid @enderror"
id="returned_at" name="returned_at" type="datetime-local"
value="{{ old('returned_at', now()->format('Y-m-d\TH:i')) }}">
@error('returned_at') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
<div class="col-12">
<label class="form-label" for="returned_by_name">Dipulang Oleh <span class="text-danger">*</span></label>
<input class="form-control @error('returned_by_name') is-invalid @enderror"
id="returned_by_name" name="returned_by_name"
value="{{ old('returned_by_name') }}" required>
@error('returned_by_name') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
<div class="col-md-12">
<label class="form-label" for="return_condition">Keadaan <span class="text-danger">*</span></label>
<select class="form-select @error('return_condition') is-invalid @enderror"
id="return_condition" name="return_condition" required>
<option value="">Pilih keadaan</option>
<option value="baik" @selected(old('return_condition') === 'baik')>Baik</option>
<option value="rosak" @selected(old('return_condition') === 'rosak')>Rosak</option>
</select>
@error('return_condition') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
<div class="col-12">
<label class="form-label" for="return_notes">Nota</label>
<textarea class="form-control" id="return_notes" name="notes" rows="2">{{ old('notes') }}</textarea>
</div>
</div>
<div class="d-flex justify-content-end mt-3">
<button class="btn btn-success" type="submit"><i class="bi bi-box-arrow-in-down-left me-1"></i>Rekod Pulang</button>
</div>
</form>
@endif
</div>
</div>
{{-- Kanan: Sejarah transaksi --}}
<div class="col-12 col-xl-7">
<div class="content-panel p-0 overflow-hidden">
<div class="p-3 border-bottom fw-semibold">Sejarah Transaksi</div>
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead>
<tr>
<th>Jenis</th>
<th>Jml</th>
<th>Masa</th>
<th>Nama</th>
<th>Keadaan</th>
<th>Direkod Oleh</th>
<th>Nota</th>
</tr>
</thead>
<tbody>
@forelse ($allocation->transactions->sortByDesc('created_at') as $tx)
<tr>
<td>
@if ($tx->transaction_type === 'taken')
<span class="badge text-bg-info">Ambil</span>
@else
<span class="badge text-bg-success">Pulang</span>
@endif
</td>
<td class="fw-semibold">{{ $tx->quantity }}</td>
<td class="small">
{{ ($tx->taken_at ?? $tx->returned_at)?->format('d/m/Y H:i') ?? '-' }}
</td>
<td class="small">
@if ($tx->transaction_type === 'taken')
{{ $tx->taken_by_name ?: '-' }}
@else
{{ $tx->returned_by_name ?: '-' }}
@endif
</td>
<td>
@if ($tx->transaction_type === 'returned' && $tx->return_condition)
<span class="badge {{ $tx->return_condition === 'baik' ? 'text-bg-success' : 'text-bg-danger' }}">
{{ ucfirst($tx->return_condition) }}
</span>
@else
<span class="text-secondary"></span>
@endif
</td>
<td class="small text-secondary">{{ $tx->recordedBy?->name ?: '-' }}</td>
<td class="small text-secondary">{{ $tx->notes ?: '-' }}</td>
</tr>
@empty
<tr><td colspan="7" class="text-center text-secondary py-4">Tiada transaksi direkodkan.</td></tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
</div>
@endsection