129 lines
6.9 KiB
PHP
129 lines
6.9 KiB
PHP
@extends('layouts.app')
|
||
|
||
@section('title', 'Import Pusat Mengundi')
|
||
|
||
@section('content')
|
||
<div class="page-heading">
|
||
<div class="eyebrow">Admin · Setup</div>
|
||
<h1 class="h3 mb-1">Import Pusat Mengundi</h1>
|
||
<p class="text-secondary mb-0">Upload fail XLSX untuk mencipta DUN, Pusat Mengundi, Saluran, dan Kuota secara automatik.</p>
|
||
</div>
|
||
|
||
@include('admin.setup._nav')
|
||
|
||
@if (session('import_errors'))
|
||
<div class="alert alert-warning" role="alert">
|
||
<div class="fw-semibold mb-1">Beberapa baris tidak dapat diimport:</div>
|
||
<ul class="mb-0 small">
|
||
@foreach (session('import_errors') as $err)
|
||
<li>{{ $err }}</li>
|
||
@endforeach
|
||
</ul>
|
||
</div>
|
||
@endif
|
||
|
||
<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">Borang Import</h2>
|
||
|
||
<form method="POST" action="{{ route('admin.setup.import.store') }}" enctype="multipart/form-data">
|
||
@csrf
|
||
|
||
<div class="mb-3">
|
||
<label for="election_id" class="form-label fw-semibold">Pilihan Raya</label>
|
||
<select id="election_id" name="election_id" class="form-select @error('election_id') is-invalid @enderror" required>
|
||
<option value="">Pilih pilihan raya</option>
|
||
@foreach ($elections as $election)
|
||
<option value="{{ $election->id }}" @selected(old('election_id') == $election->id)>
|
||
{{ $election->name }}
|
||
</option>
|
||
@endforeach
|
||
</select>
|
||
@error('election_id')
|
||
<div class="invalid-feedback">{{ $message }}</div>
|
||
@enderror
|
||
</div>
|
||
|
||
<div class="row g-3 mb-3">
|
||
<div class="col-md-4">
|
||
<label for="dun_code" class="form-label fw-semibold">Kod DUN</label>
|
||
<input id="dun_code" type="text" name="dun_code" value="{{ old('dun_code', 'N49') }}"
|
||
class="form-control @error('dun_code') is-invalid @enderror" maxlength="20"
|
||
placeholder="cth: N49" required>
|
||
@error('dun_code')
|
||
<div class="invalid-feedback">{{ $message }}</div>
|
||
@enderror
|
||
</div>
|
||
<div class="col-md-8">
|
||
<label for="dun_name" class="form-label fw-semibold">Nama DUN</label>
|
||
<input id="dun_name" type="text" name="dun_name" value="{{ old('dun_name', 'Kota Iskandar') }}"
|
||
class="form-control @error('dun_name') is-invalid @enderror" maxlength="255"
|
||
placeholder="cth: Kota Iskandar" required>
|
||
@error('dun_name')
|
||
<div class="invalid-feedback">{{ $message }}</div>
|
||
@enderror
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mb-4">
|
||
<label for="file" class="form-label fw-semibold">Fail XLSX Senarai Pusat Mengundi</label>
|
||
<input id="file" type="file" name="file" accept=".xlsx"
|
||
class="form-control @error('file') is-invalid @enderror" required>
|
||
<div class="form-text">Format: .xlsx sahaja, saiz maksimum 10MB.</div>
|
||
@error('file')
|
||
<div class="invalid-feedback">{{ $message }}</div>
|
||
@enderror
|
||
</div>
|
||
|
||
<div class="alert alert-warning py-2 small" role="alert">
|
||
<i class="bi bi-exclamation-triangle me-1"></i>
|
||
<strong>Amaran:</strong> Import akan <strong>menggantikan</strong> semua data Pusat Mengundi, Saluran, dan Kuota sedia ada untuk DUN yang sama. Pastikan fail betul sebelum teruskan.
|
||
</div>
|
||
|
||
<div class="d-flex justify-content-end gap-2 mt-3">
|
||
<a href="{{ route('admin.setup.index') }}" class="btn btn-outline-secondary">Batal</a>
|
||
<button type="submit" class="btn btn-success">
|
||
<i class="bi bi-upload me-1"></i>Import Data
|
||
</button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-12 col-xl-5">
|
||
<div class="content-panel p-3 p-md-4 h-100">
|
||
<h2 class="h5 mb-3">Format Fail XLSX</h2>
|
||
<p class="text-secondary small mb-2">Fail mesti mempunyai lajur mengikut susunan berikut (baris pertama = tajuk):</p>
|
||
<div class="table-responsive">
|
||
<table class="table table-sm table-bordered small">
|
||
<thead class="table-light">
|
||
<tr>
|
||
<th>Lajur</th>
|
||
<th>Nama</th>
|
||
<th>Keterangan</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr><td>A</td><td>SEKOLAH</td><td>Nama Pusat Mengundi</td></tr>
|
||
<tr><td>B</td><td>NAMA PPM</td><td>Nama PPM (simpan sebagai metadata)</td></tr>
|
||
<tr><td>C</td><td>SALURAN</td><td>Bilangan saluran (nombor)</td></tr>
|
||
<tr><td>D–F</td><td>KTM, POLIS, KP</td><td>Dikira automatik dari bilangan saluran</td></tr>
|
||
<tr><td>G</td><td>PPM</td><td>Kuota PPM per pusat (0 atau 1)</td></tr>
|
||
<tr><td>H</td><td>KPDP</td><td>Dikira automatik</td></tr>
|
||
<tr><td>I</td><td>PAPM</td><td>Kuota PAPM per pusat (nombor)</td></tr>
|
||
<tr><td>J</td><td>JKM</td><td>Kuota JKM per pusat</td></tr>
|
||
<tr><td>K</td><td>KKM</td><td>Kuota KKM per pusat</td></tr>
|
||
<tr><td>L</td><td>TAMBAHAN</td><td>Dikira automatik</td></tr>
|
||
<tr><td>M</td><td>NO TELEFON</td><td>Telefon PPM (simpan sebagai metadata)</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<p class="text-secondary small mt-2 mb-0">
|
||
Lajur dengan formula Excel (KTM, POLIS, KP, KPDP, TAMBAHAN) dikira semula secara automatik berdasarkan bilangan saluran — nilai asal dalam fail diabaikan.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
@endsection
|