first
This commit is contained in:
36
resources/views/admin/ratemas-upload.blade.php
Normal file
36
resources/views/admin/ratemas-upload.blade.php
Normal file
@@ -0,0 +1,36 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<main class="page">
|
||||
<h1>Upload RateMas</h1>
|
||||
<p class="subtitle">Upload fail CSV atau XML tahunan. Fail asal tidak disimpan selepas data dimasukkan.</p>
|
||||
|
||||
@if (session('status'))
|
||||
<div class="notice">{{ session('status') }}</div>
|
||||
@endif
|
||||
|
||||
@if ($errors->any())
|
||||
<div class="error">{{ $errors->first() }}</div>
|
||||
@endif
|
||||
|
||||
<form method="POST" action="{{ route('admin.ratemas-upload.store') }}" enctype="multipart/form-data">
|
||||
@csrf
|
||||
|
||||
<label for="year">Tahun RateMas</label>
|
||||
<input id="year" type="number" name="year" min="1900" max="2100" value="{{ old('year', date('Y')) }}" required>
|
||||
|
||||
<label for="file">Fail CSV atau XML</label>
|
||||
<input id="file" type="file" name="file" accept=".csv,.txt,.xml,text/csv,text/plain,application/xml,text/xml" required>
|
||||
|
||||
<div class="checkbox-row">
|
||||
<input id="replace_existing" type="checkbox" name="replace_existing" value="1" @checked(old('replace_existing'))>
|
||||
<label for="replace_existing">Ganti data jika table tahun ini sudah wujud</label>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button type="submit">Upload & Import</button>
|
||||
<a class="button secondary" href="{{ route('tables.index') }}">Kembali</a>
|
||||
</div>
|
||||
</form>
|
||||
</main>
|
||||
@endsection
|
||||
20
resources/views/auth/login.blade.php
Normal file
20
resources/views/auth/login.blade.php
Normal file
@@ -0,0 +1,20 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<main class="page">
|
||||
<h2>LOGIN</h2>
|
||||
|
||||
@error('username')
|
||||
<div class="error">{{ $message }}</div>
|
||||
@enderror
|
||||
|
||||
<form method="POST" action="{{ route('login.store') }}">
|
||||
@csrf
|
||||
|
||||
<input type="text" name="username" value="{{ old('username') }}" placeholder="Username" required autofocus>
|
||||
<input type="password" name="password" placeholder="Password" required>
|
||||
|
||||
<button type="submit">LOGIN</button>
|
||||
</form>
|
||||
</main>
|
||||
@endsection
|
||||
64
resources/views/layouts/app.blade.php
Normal file
64
resources/views/layouts/app.blade.php
Normal file
@@ -0,0 +1,64 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ms">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{ $title ?? config('app.name') }}</title>
|
||||
<style>
|
||||
* { box-sizing: border-box; font-family: Arial, Helvetica, sans-serif; }
|
||||
body { margin: 0; min-height: 100vh; background: #f4f5f7; color: #1f2933; }
|
||||
.shell { min-height: 100vh; display: grid; grid-template-rows: auto 1fr; }
|
||||
.topbar { height: 58px; background: #1f2933; color: #fff; display: flex; align-items: center; justify-content: space-between; padding: 0 clamp(16px, 4vw, 44px); }
|
||||
.brand { font-weight: 700; letter-spacing: 0; }
|
||||
.topbar-actions { display: flex; align-items: center; gap: 18px; }
|
||||
.topbar-link { color: #fff; font-size: 14px; font-weight: 700; text-decoration: none; }
|
||||
.content { display: grid; place-items: start center; padding: clamp(28px, 7vw, 72px) 16px; }
|
||||
.page { width: min(760px, 100%); background: #fff; padding: clamp(22px, 4vw, 36px); border-radius: 8px; border: 1px solid #d8dde3; box-shadow: 0 12px 30px rgba(31, 41, 51, 0.08); }
|
||||
h1, h2 { margin: 0 0 8px; }
|
||||
.subtitle { margin: 0 0 24px; color: #5f6b7a; font-size: 14px; }
|
||||
label { display: block; font-size: 13px; font-weight: 700; margin-bottom: 7px; }
|
||||
input, select { width: 100%; padding: 12px; margin-bottom: 16px; border: 1px solid #b8c0cc; border-radius: 6px; background: #fff; color: #1f2933; font-size: 15px; }
|
||||
input:focus, select:focus { outline: 3px solid rgba(37, 99, 235, 0.16); border-color: #2563eb; }
|
||||
button, .button { display: inline-block; padding: 11px 16px; border: 0; background: #1f2933; color: #fff; text-decoration: none; cursor: pointer; border-radius: 6px; font-size: 14px; font-weight: 700; }
|
||||
.button.secondary, button.secondary { background: #eef2f6; color: #1f2933; }
|
||||
.form-grid { display: grid; grid-template-columns: 1fr 180px; gap: 16px; align-items: end; }
|
||||
.actions { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
|
||||
.notice { background: #eef7ed; border: 1px solid #a9d3a5; color: #214f23; padding: 12px; border-radius: 6px; margin-bottom: 16px; font-size: 14px; }
|
||||
.checkbox-row { display: flex; gap: 8px; align-items: center; margin-bottom: 16px; }
|
||||
.checkbox-row input { width: auto; margin: 0; }
|
||||
.checkbox-row label { margin: 0; font-weight: 400; }
|
||||
.error { color: #b00020; margin-bottom: 12px; font-size: 14px; }
|
||||
.logout-form { margin: 0; }
|
||||
.logout-form button { background: transparent; padding: 8px 0; font-weight: 700; }
|
||||
@media (max-width: 640px) {
|
||||
.topbar { height: auto; min-height: 58px; align-items: flex-start; padding-top: 14px; padding-bottom: 14px; gap: 12px; }
|
||||
.topbar-actions { gap: 12px; flex-wrap: wrap; justify-content: flex-end; }
|
||||
.form-grid { grid-template-columns: 1fr; gap: 0; }
|
||||
}
|
||||
</style>
|
||||
@stack('styles')
|
||||
</head>
|
||||
<body>
|
||||
<div class="shell">
|
||||
<header class="topbar">
|
||||
<div class="brand">{{ config('app.name') }}</div>
|
||||
@auth
|
||||
<div class="topbar-actions">
|
||||
<a class="topbar-link" href="{{ route('tables.index') }}">Carian</a>
|
||||
@if (auth()->user()->isAdmin())
|
||||
<a class="topbar-link" href="{{ route('admin.ratemas-upload.create') }}">Upload RateMas</a>
|
||||
@endif
|
||||
<form class="logout-form" method="POST" action="{{ route('logout') }}">
|
||||
@csrf
|
||||
<button type="submit">Logout</button>
|
||||
</form>
|
||||
</div>
|
||||
@endauth
|
||||
</header>
|
||||
|
||||
<div class="content">
|
||||
@yield('content')
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
35
resources/views/ratemas/index.blade.php
Normal file
35
resources/views/ratemas/index.blade.php
Normal file
@@ -0,0 +1,35 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<main class="page">
|
||||
<h1>Carian Akaun</h1>
|
||||
<p class="subtitle">Masukkan no akaun dan pilih tahun RateMas untuk membuka rekod cetakan.</p>
|
||||
|
||||
@if ($errors->any())
|
||||
<div class="error">{{ $errors->first() }}</div>
|
||||
@endif
|
||||
|
||||
<form method="GET" action="{{ route('ratemas.lookup') }}">
|
||||
<div class="form-grid">
|
||||
<div>
|
||||
<label for="noakaun">No Akaun</label>
|
||||
<input id="noakaun" type="text" name="noakaun" value="{{ old('noakaun', request('noakaun')) }}" placeholder="Contoh: A010100001" required autofocus>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label for="year">Tahun</label>
|
||||
<select id="year" name="year" required>
|
||||
@foreach ($tables as $table => $label)
|
||||
@php($year = substr($table, 0, 4))
|
||||
<option value="{{ $year }}" @selected(old('year', request('year', '2013')) === $year)>{{ $year }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button type="submit">Cari Rekod</button>
|
||||
</div>
|
||||
</form>
|
||||
</main>
|
||||
@endsection
|
||||
17
resources/views/ratemas/search.blade.php
Normal file
17
resources/views/ratemas/search.blade.php
Normal file
@@ -0,0 +1,17 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<main class="page">
|
||||
<h1>Carian Akaun</h1>
|
||||
<p class="subtitle">{{ $title }}</p>
|
||||
|
||||
<form method="GET" action="{{ route('ratemas.show', $table) }}">
|
||||
<label for="noakaun">No Akaun</label>
|
||||
<input type="text" name="noakaun" value="{{ old('noakaun') }}" placeholder="Masukkan No Akaun" required autofocus>
|
||||
<div class="actions">
|
||||
<button type="submit">Cari Rekod</button>
|
||||
<a class="button secondary" href="{{ route('tables.index') }}">Kembali</a>
|
||||
</div>
|
||||
</form>
|
||||
</main>
|
||||
@endsection
|
||||
168
resources/views/ratemas/show.blade.php
Normal file
168
resources/views/ratemas/show.blade.php
Normal file
@@ -0,0 +1,168 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ms">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{ $title }}</title>
|
||||
|
||||
<style>
|
||||
* { box-sizing: border-box; font-family: Arial, Helvetica, sans-serif; }
|
||||
body { background: #e5e5e5; margin: 0; padding: 20px; }
|
||||
.a4 { width: 210mm; min-height: 297mm; background: #fff; margin: auto; padding: 25mm 18mm; }
|
||||
.title { font-size: 18px; font-weight: bold; text-decoration: underline; margin-bottom: 5px; }
|
||||
table { width: 100%; border-collapse: collapse; margin-bottom: 18px; }
|
||||
td { padding: 4px 6px; vertical-align: middle; font-size: 12px; }
|
||||
.label { width: 180px; }
|
||||
.colon { width: 15px; text-align: center; }
|
||||
.box { border: 0 solid #555; font-weight: bold; padding: 4px 8px; }
|
||||
.section { background: #d9d9d9; text-align: center; font-weight: bold; text-decoration: underline; padding: 4px; margin: 12px 0 9px; font-size: 13px; }
|
||||
.right-label { width: 140px; }
|
||||
.amount { font-weight: bold; }
|
||||
.amountf { font-weight: bold; text-align: right; }
|
||||
.total-baki { font-size: 12px; font-weight: bold; text-align: right; padding-top: 5px; padding-bottom: 3px; border-top: 1px solid black; border-bottom: 0 double black; }
|
||||
.total-line { font-size: 12px; font-weight: bold; text-align: right; padding-top: 5px; padding-bottom: 3px; border-top: 1px solid black; border-bottom: 3px double black; }
|
||||
.jkk { display: flex; justify-content: space-between; gap: 12px; align-items: center; padding: 5px 0; text-decoration: none; font-size: 14px; margin: 8px 0; }
|
||||
.jkk-actions, .year-nav, .year-jump { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
|
||||
.jkk a, .jkk button, .jkk select { padding: 6px 10px; cursor: pointer; font-size: 13px; }
|
||||
.jkk a[aria-disabled="true"] button { cursor: not-allowed; opacity: .45; }
|
||||
.jkk form { margin: 0; }
|
||||
.jkk select { border: 1px solid #777; background: #fff; }
|
||||
.spx { width: 240px; }
|
||||
p { font-size: 11px; }
|
||||
@media print {
|
||||
body { background: white; padding: 0; }
|
||||
.a4 { width: 100%; min-height: auto; margin: 0; padding: 15mm; box-shadow: none; }
|
||||
.jkk { display: none; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@php
|
||||
$money = fn ($value) => number_format((float) ($value ?? 0), 2);
|
||||
@endphp
|
||||
|
||||
<div class="a4">
|
||||
<div class="title">{{ $title }}</div>
|
||||
|
||||
<div class="jkk">
|
||||
<div class="jkk-actions">
|
||||
<a href="{{ route('tables.index', ['noakaun' => $noakaun, 'year' => $currentYear]) }}"><button type="button">Kembali ke Search</button></a>
|
||||
<button type="button" onclick="window.print()">Cetak</button>
|
||||
</div>
|
||||
|
||||
<div class="year-nav">
|
||||
@if ($previousYear)
|
||||
<a href="{{ route('ratemas.show', ['table' => $previousYear.'_ratemas', 'noakaun' => $noakaun]) }}"><button type="button">Prev {{ $previousYear }}</button></a>
|
||||
@else
|
||||
<a aria-disabled="true"><button type="button" disabled>Prev</button></a>
|
||||
@endif
|
||||
|
||||
<form class="year-jump" method="GET" action="{{ route('ratemas.lookup') }}">
|
||||
<input type="hidden" name="noakaun" value="{{ $noakaun }}">
|
||||
<select name="year" aria-label="Pilih tahun">
|
||||
@foreach ($years as $year)
|
||||
<option value="{{ $year }}" @selected($year === $currentYear)>{{ $year }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
<button type="submit">Pergi</button>
|
||||
</form>
|
||||
|
||||
@if ($nextYear)
|
||||
<a href="{{ route('ratemas.show', ['table' => $nextYear.'_ratemas', 'noakaun' => $noakaun]) }}"><button type="button">Next {{ $nextYear }}</button></a>
|
||||
@else
|
||||
<a aria-disabled="true"><button type="button" disabled>Next</button></a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td class="label">No Akaun</td>
|
||||
<td class="colon">:</td>
|
||||
<td class="box">{{ $record->no_akaun }}</td>
|
||||
<td style="width:20px;"></td>
|
||||
<td class="right-label">No Akaun lama</td>
|
||||
<td class="colon">:</td>
|
||||
<td class="box">{{ $record->no_akaun_lama }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="section">MAKLUMAT PEMILIK</div>
|
||||
|
||||
<table>
|
||||
<tr><td class="label">Nama Pemilik</td><td class="colon">:</td><td colspan="5" class="box">{{ $record->nama_pemilik }}</td></tr>
|
||||
<tr><td class="label">Alamat Pos 1</td><td class="colon">:</td><td colspan="5" class="box">{{ $record->alamatpos_1 }}</td></tr>
|
||||
<tr><td class="label">Alamat Pos 2</td><td class="colon">:</td><td colspan="5" class="box">{{ $record->alamatpos_2 }}</td></tr>
|
||||
<tr><td class="label">Alamat Pos 3</td><td class="colon">:</td><td colspan="5" class="box">{{ $record->alamatpos_3 }}</td></tr>
|
||||
<tr>
|
||||
<td class="label">IC No</td><td class="colon">:</td><td class="box">{{ $record->ic_no }}</td>
|
||||
<td style="width:20px;"></td>
|
||||
<td class="right-label">Old IC No</td><td class="colon">:</td><td class="box">{{ $record->old_ic_no }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">Pelanggan</td><td class="colon">:</td><td class="box">{{ $record->bangsa }}</td>
|
||||
<td></td>
|
||||
<td class="right-label">Warganegara</td><td class="colon">:</td><td class="box">{{ $record->warganegara }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="section">KETERANGAN HARTA</div>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td class="label">No Lot / Petak</td><td class="colon">:</td><td class="box">{{ $record->nolot }}</td>
|
||||
<td style="width:20px;"></td>
|
||||
<td class="right-label">No DHM</td><td class="colon">:</td><td class="box">{{ $record->nogeran }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">Jenis Tanah</td><td class="colon">:</td><td class="box">{{ $record->kegunaan }}</td>
|
||||
<td></td>
|
||||
<td class="right-label">Mukim</td><td class="colon">:</td><td class="box">{{ $record->mukim }}</td>
|
||||
</tr>
|
||||
<tr><td class="label">No Bangunan</td><td class="colon">:</td><td colspan="5" class="box">{{ $record->no_bangunan }}</td></tr>
|
||||
<tr><td class="label">Lokasi Harta 1</td><td class="colon">:</td><td colspan="5" class="box">{{ $record->lokasiharta_1 }}</td></tr>
|
||||
<tr><td class="label">Lokasi Harta 2</td><td class="colon">:</td><td colspan="5" class="box">{{ $record->lokasiharta_2 }}</td></tr>
|
||||
<tr><td class="label">Kawasan</td><td class="colon">:</td><td colspan="5" class="box">{{ $record->kawasan }}</td></tr>
|
||||
<tr><td class="label">Jenis Bangunan</td><td class="colon">:</td><td colspan="5" class="box">{{ $record->jenisbangunan }}</td></tr>
|
||||
</table>
|
||||
|
||||
<div class="section">NILAIAN HARTA</div>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td class="label">New Taksiran</td><td class="colon">:</td><td>RM</td><td class="amount">{{ $money($record->new_taksiran) }}</td>
|
||||
<td></td>
|
||||
<td class="right-label">New Kadar (%)</td><td class="colon">:</td><td class="amount">{{ $record->kadar }} %</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">Cukai 1/2 Tahun</td><td class="colon">:</td><td>RM</td><td class="amount">{{ $money($record->cukai_setengahtahun) }}</td>
|
||||
<td></td>
|
||||
<td class="right-label">Kuatkuasa</td><td class="colon">:</td><td class="amount">{{ $record->tarikh_kuatkuasa }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">Old Taksiran</td><td class="colon">:</td><td>RM</td><td class="amount">{{ $money($record->old_taksiran) }}</td>
|
||||
<td></td>
|
||||
<td class="right-label">Old Kadar (%)</td><td class="colon">:</td><td class="amount">{{ $record->old_kadar }} %</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="section">MAKLUMAT TUNGGAKAN</div>
|
||||
|
||||
<table>
|
||||
<tr><td class="label">Tunggakan Cukai</td><td class="colon">:</td><td>RM</td><td class="amountf">{{ $money($record->tunggakan_cukai) }}</td><td class="spx"></td></tr>
|
||||
<tr><td class="label">Cukai Semasa 1</td><td class="colon">:</td><td>RM</td><td class="amountf">{{ $money($record->cukai_semasa_1) }}</td><td class="spx"></td></tr>
|
||||
<tr><td class="label">Cukai Semasa 2</td><td class="colon">:</td><td>RM</td><td class="amountf">{{ $money($record->cukai_semasa_2) }}</td><td class="spx"></td></tr>
|
||||
<tr><td class="label">Pelarasan</td><td class="colon">:</td><td>RM</td><td class="amountf">{{ $money($record->pelarasan_cukai) }}</td><td class="spx"></td></tr>
|
||||
<tr><td class="label">Bayaran Cukai Diterima</td><td class="colon">:</td><td>RM</td><td class="amountf">{{ $money($record->bayaran_cukai_diterima) }}</td><td class="spx"></td></tr>
|
||||
<tr><td class="label">Baki Cukai</td><td class="colon">:</td><td>RM</td><td class="total-baki amountf">{{ $money($record->baki_cukai) }}</td><td class="spx"></td></tr>
|
||||
<tr><td class="label">Baki Najis</td><td class="colon">:</td><td>RM</td><td class="amountf">{{ $money($record->baki_najis) }}</td><td class="spx"></td></tr>
|
||||
<tr><td class="label">Baki Notis</td><td class="colon">:</td><td>RM</td><td class="amountf">{{ $money($record->baki_notis) }}</td><td class="spx"></td></tr>
|
||||
<tr><td class="label">Baki Waran</td><td class="colon">:</td><td>RM</td><td class="amountf">{{ $money($record->baki_waran) }}</td><td class="spx"></td></tr>
|
||||
<tr><td class="label">Jumlah Baki</td><td class="colon">:</td><td>RM</td><td class="total-line amountf">{{ $money($record->jumlah_baki) }}</td><td class="spx"></td></tr>
|
||||
</table>
|
||||
<p><strong>Note:</strong> Maklumat ini sebagai rujukan, pengesahan harus melalui AVO kawasan</p>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
176
resources/views/welcome.blade.php
Normal file
176
resources/views/welcome.blade.php
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user