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,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