First commit
This commit is contained in:
78
database/seeders/CategorySeeder.php
Normal file
78
database/seeders/CategorySeeder.php
Normal 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.');
|
||||
}
|
||||
}
|
||||
17
database/seeders/DatabaseSeeder.php
Normal file
17
database/seeders/DatabaseSeeder.php
Normal 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,
|
||||
]);
|
||||
}
|
||||
}
|
||||
156
database/seeders/KnowledgeItemSeeder.php
Normal file
156
database/seeders/KnowledgeItemSeeder.php
Normal 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.");
|
||||
}
|
||||
}
|
||||
42
database/seeders/UserSeeder.php
Normal file
42
database/seeders/UserSeeder.php
Normal 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!');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user