First commit

This commit is contained in:
Saufi
2026-05-18 08:56:23 +08:00
commit fd3d3a4d2b
147 changed files with 22099 additions and 0 deletions

View File

@@ -0,0 +1,78 @@
<?php
namespace Database\Seeders;
use App\Models\Category;
use Illuminate\Database\Seeder;
class CategorySeeder extends Seeder
{
/**
* Kategori awal mengikut keperluan sistem.
* Kategori boleh ditambah, diubah, atau dinyahaktifkan
* melalui admin panel tanpa perlu ubah code.
*/
public function run(): void
{
$categories = [
[
'name' => 'Pelesenan',
'slug' => 'pelesenan',
'description' => 'Maklumat berkaitan lesen perniagaan, lesen premis, dan kelulusan berkaitan.',
'color' => '#3b82f6', // biru
'sort_order' => 1,
],
[
'name' => 'Cukai',
'slug' => 'cukai',
'description' => 'Maklumat berkaitan cukai taksiran, cukai pintu, dan bayaran berkaitan harta.',
'color' => '#10b981', // hijau
'sort_order' => 2,
],
[
'name' => 'WiFi Johor',
'slug' => 'wifi-johor',
'description' => 'Maklumat dan panduan penggunaan WiFi Johor di kawasan awam.',
'color' => '#6366f1', // ungu
'sort_order' => 3,
],
[
'name' => 'Permohonan Permit Sementara',
'slug' => 'permohonan-permit-sementara',
'description' => 'Maklumat berkaitan permit sementara untuk aktiviti, acara, atau pembinaan.',
'color' => '#f59e0b', // kuning
'sort_order' => 4,
],
[
'name' => 'Penguatkuasaan',
'slug' => 'penguatkuasaan',
'description' => 'Maklumat berkaitan tindakan penguatkuasaan, kompaun, dan prosedur aduan.',
'color' => '#ef4444', // merah
'sort_order' => 5,
],
[
'name' => 'Sewaan Gerai Majlis',
'slug' => 'sewaan-gerai-majlis',
'description' => 'Maklumat berkaitan sewaan gerai, premis, dan kemudahan majlis.',
'color' => '#14b8a6', // teal
'sort_order' => 6,
],
[
'name' => 'Lain-lain',
'slug' => 'lain-lain',
'description' => 'Soalan umum dan maklumat yang tidak termasuk dalam kategori khusus.',
'color' => '#6b7280', // kelabu
'sort_order' => 99,
],
];
foreach ($categories as $data) {
Category::updateOrCreate(
['slug' => $data['slug']],
array_merge($data, ['is_active' => true])
);
}
$this->command->info('✓ ' . count($categories) . ' kategori berjaya dibuat/dikemaskini.');
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call([
UserSeeder::class,
CategorySeeder::class,
KnowledgeItemSeeder::class,
]);
}
}

View File

@@ -0,0 +1,156 @@
<?php
namespace Database\Seeders;
use App\Models\Category;
use App\Models\KnowledgeItem;
use Illuminate\Database\Seeder;
class KnowledgeItemSeeder extends Seeder
{
/**
* Sample FAQ untuk development dan demo awal.
* Data ini bukan fakta sebenar untuk tujuan ujian sahaja.
*/
public function run(): void
{
$items = [
// ── Pelesenan ─────────────────────────────────────────────────
[
'category_slug' => 'pelesenan',
'item_type' => KnowledgeItem::TYPE_FAQ,
'title' => 'Apakah dokumen yang diperlukan untuk memohon lesen perniagaan baru?',
'content' => "Untuk memohon lesen perniagaan baru, pemohon perlu menyediakan dokumen berikut:\n\n" .
"1. Salinan kad pengenalan pemohon (MyKad)\n" .
"2. Borang permohonan yang telah dilengkapkan\n" .
"3. Salinan geran tanah atau perjanjian sewaan premis\n" .
"4. Pelan lantai premis perniagaan\n" .
"5. Sijil pendaftaran perniagaan (SSM)\n" .
"6. Gambar premis dari dalam dan luar\n\n" .
"Sila hubungi Bahagian Pelesenan untuk maklumat lanjut.",
'tags' => ['lesen', 'perniagaan', 'permohonan', 'dokumen'],
'is_active' => true,
],
[
'category_slug' => 'pelesenan',
'item_type' => KnowledgeItem::TYPE_FAQ,
'title' => 'Berapa lama masa yang diperlukan untuk kelulusan lesen perniagaan?',
'content' => "Proses kelulusan lesen perniagaan biasanya mengambil masa 14 hingga 30 hari bekerja " .
"bergantung kepada jenis lesen dan kelengkapan dokumen yang dikemukakan.\n\n" .
"Pemohon boleh semak status permohonan melalui kaunter Bahagian Pelesenan atau " .
"menghubungi talian hotline kami.",
'tags' => ['lesen', 'tempoh', 'kelulusan'],
'is_active' => true,
],
// ── Cukai ─────────────────────────────────────────────────────
[
'category_slug' => 'cukai',
'item_type' => KnowledgeItem::TYPE_FAQ,
'title' => 'Bila tarikh akhir pembayaran cukai taksiran?',
'content' => "Cukai taksiran perlu dibayar dalam dua penggal:\n\n" .
"• Penggal pertama: 28 Februari setiap tahun\n" .
"• Penggal kedua: 31 Ogos setiap tahun\n\n" .
"Bayaran lewat akan dikenakan denda atau caj penalti. " .
"Pembayaran boleh dibuat di kaunter, atas talian, atau melalui bank.",
'tags' => ['cukai', 'taksiran', 'tarikh', 'bayaran'],
'is_active' => true,
],
// ── WiFi Johor ────────────────────────────────────────────────
[
'category_slug' => 'wifi-johor',
'item_type' => KnowledgeItem::TYPE_FAQ,
'title' => 'Bagaimana cara untuk sambung ke WiFi Johor?',
'content' => "Cara menyambung ke WiFi Johor:\n\n" .
"1. Hidupkan WiFi pada peranti anda\n" .
"2. Pilih rangkaian 'WiFi Johor' atau 'WiFiJohor'\n" .
"3. Buka pelayar web — halaman log masuk akan muncul\n" .
"4. Daftar menggunakan nombor telefon atau e-mel\n" .
"5. Masukkan OTP yang diterima\n" .
"6. Anda kini boleh menggunakan internet percuma\n\n" .
"WiFi Johor tersedia di taman awam, perpustakaan, dan bangunan kerajaan terpilih.",
'tags' => ['wifi', 'johor', 'internet', 'sambung'],
'is_active' => true,
],
// ── Penguatkuasaan ────────────────────────────────────────────
[
'category_slug' => 'penguatkuasaan',
'item_type' => KnowledgeItem::TYPE_FAQ,
'title' => 'Bagaimana cara untuk membuat aduan berkaitan penguatkuasaan?',
'content' => "Aduan berkaitan penguatkuasaan boleh dibuat melalui cara berikut:\n\n" .
"1. Kaunter aduan di Jabatan Penguatkuasaan\n" .
"2. Hotline: 07-XXX XXXX (Isnin-Jumaat, 8pagi-5ptg)\n" .
"3. E-mel: penguatkuasaan@majlis.gov.my\n" .
"4. Sistem aduan atas talian\n\n" .
"Sertakan maklumat berikut dalam aduan:\n" .
"• Nama dan nombor telefon pengadu\n" .
"• Lokasi kejadian\n" .
"• Tarikh dan masa kejadian\n" .
"• Penerangan ringkas masalah",
'tags' => ['aduan', 'penguatkuasaan', 'prosedur'],
'is_active' => true,
],
// ── Sewaan Gerai ──────────────────────────────────────────────
[
'category_slug' => 'sewaan-gerai-majlis',
'item_type' => KnowledgeItem::TYPE_FAQ,
'title' => 'Apakah syarat untuk menyewa gerai majlis?',
'content' => "Syarat-syarat untuk menyewa gerai majlis:\n\n" .
"1. Pemohon mestilah warganegara Malaysia\n" .
"2. Berumur 18 tahun ke atas\n" .
"3. Tiada tunggakan dengan pihak majlis\n" .
"4. Mempunyai lesen perniagaan yang sah (jika berniaga)\n" .
"5. Menandatangani perjanjian sewaan\n\n" .
"Kadar sewa bergantung kepada lokasi dan jenis gerai. " .
"Sila rujuk jadual kadar sewa yang terkini di kaunter.",
'tags' => ['gerai', 'sewa', 'syarat', 'permohonan'],
'is_active' => true,
],
// ── Lain-lain ─────────────────────────────────────────────────
[
'category_slug' => 'lain-lain',
'item_type' => KnowledgeItem::TYPE_FAQ,
'title' => 'Apakah waktu operasi pejabat majlis?',
'content' => "Waktu operasi pejabat majlis adalah seperti berikut:\n\n" .
"• Isnin Khamis: 8:00 pagi 5:00 petang\n" .
"• Jumaat: 8:00 pagi 12:00 tengah hari (tutup 12:15 2:45 ptg)\n" .
"• Sabtu, Ahad, dan Cuti Umum: Tutup\n\n" .
"Perkhidmatan kaunter ditutup 15 minit sebelum masa tutup pejabat.",
'tags' => ['waktu', 'operasi', 'pejabat', 'jadual'],
'is_active' => true,
],
];
$count = 0;
foreach ($items as $data) {
$slug = $data['category_slug'];
unset($data['category_slug']);
$category = Category::where('slug', $slug)->first();
if (!$category) {
$this->command->warn(" Kategori '{$slug}' tidak dijumpai. Skip.");
continue;
}
KnowledgeItem::updateOrCreate(
[
'category_id' => $category->id,
'title' => $data['title'],
],
array_merge($data, [
'category_id' => $category->id,
'language' => 'ms',
'is_public' => true,
])
);
$count++;
}
$this->command->info("{$count} knowledge items (sample FAQ) berjaya dibuat.");
}
}

View File

@@ -0,0 +1,42 @@
<?php
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
class UserSeeder extends Seeder
{
/**
* Buat pengguna awal untuk development.
* JANGAN guna kata laluan ini dalam production.
*/
public function run(): void
{
// Admin
User::updateOrCreate(
['email' => 'admin@example.com'],
[
'name' => 'Admin Sistem',
'password' => Hash::make('password'),
'role' => User::ROLE_ADMIN,
]
);
// Staff
User::updateOrCreate(
['email' => 'staff@example.com'],
[
'name' => 'Kakitangan',
'password' => Hash::make('password'),
'role' => User::ROLE_STAFF,
]
);
$this->command->info('✓ 2 pengguna awal berjaya dibuat.');
$this->command->warn(' Admin: admin@example.com / password');
$this->command->warn(' Staff: staff@example.com / password');
$this->command->warn(' TUKAR KATA LALUAN SEBELUM DEPLOY KE PRODUCTION!');
}
}