first
This commit is contained in:
22
resources/views/admin/management/_nav.blade.php
Normal file
22
resources/views/admin/management/_nav.blade.php
Normal 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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
|
||||
77
resources/views/admin/management/applications/edit.blade.php
Normal file
77
resources/views/admin/management/applications/edit.blade.php
Normal 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
|
||||
@@ -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
|
||||
89
resources/views/admin/management/assignments/edit.blade.php
Normal file
89
resources/views/admin/management/assignments/edit.blade.php
Normal 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
|
||||
79
resources/views/admin/management/assignments/index.blade.php
Normal file
79
resources/views/admin/management/assignments/index.blade.php
Normal 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
|
||||
53
resources/views/admin/management/index.blade.php
Normal file
53
resources/views/admin/management/index.blade.php
Normal 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
|
||||
78
resources/views/admin/management/penempatan/pindah.blade.php
Normal file
78
resources/views/admin/management/penempatan/pindah.blade.php
Normal 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
|
||||
146
resources/views/admin/management/penempatan/show.blade.php
Normal file
146
resources/views/admin/management/penempatan/show.blade.php
Normal 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
|
||||
@@ -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
|
||||
91
resources/views/admin/management/wheelchairs/index.blade.php
Normal file
91
resources/views/admin/management/wheelchairs/index.blade.php
Normal 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
|
||||
232
resources/views/admin/management/wheelchairs/show.blade.php
Normal file
232
resources/views/admin/management/wheelchairs/show.blade.php
Normal 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
|
||||
Reference in New Issue
Block a user