first commit
This commit is contained in:
51
database/seeders/AppSettingsSeeder.php
Normal file
51
database/seeders/AppSettingsSeeder.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\AppSetting;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class AppSettingsSeeder extends Seeder
|
||||
{
|
||||
public function run(): void
|
||||
{
|
||||
$settings = [
|
||||
[
|
||||
'key' => 'default_cut_off_day',
|
||||
'value' => '1',
|
||||
'type' => 'integer',
|
||||
'group' => 'kitaran',
|
||||
'label' => 'Hari tarikh tutup lalai',
|
||||
'description' => 'Hari bulan tarikh tutup serahan lalai (cth: 1).',
|
||||
],
|
||||
[
|
||||
'key' => 'default_cut_off_month',
|
||||
'value' => '12',
|
||||
'type' => 'integer',
|
||||
'group' => 'kitaran',
|
||||
'label' => 'Bulan tarikh tutup lalai',
|
||||
'description' => 'Bulan tarikh tutup serahan lalai (cth: 12 = Disember). Pembaharuan lesen pada/sebelum 1 Disember.',
|
||||
],
|
||||
[
|
||||
'key' => 'reminder_email_enabled',
|
||||
'value' => '0',
|
||||
'type' => 'boolean',
|
||||
'group' => 'peringatan',
|
||||
'label' => 'Hantar peringatan emel',
|
||||
'description' => 'Aktifkan penghantaran peringatan emel (perlu konfigurasi SMTP).',
|
||||
],
|
||||
[
|
||||
'key' => 'max_upload_size_kb',
|
||||
'value' => '20480',
|
||||
'type' => 'integer',
|
||||
'group' => 'dokumen',
|
||||
'label' => 'Saiz maksimum muat naik (KB)',
|
||||
'description' => 'Had saiz fail PDF yang boleh dimuat naik dalam KB.',
|
||||
],
|
||||
];
|
||||
|
||||
foreach ($settings as $s) {
|
||||
AppSetting::firstOrCreate(['key' => $s['key']], $s);
|
||||
}
|
||||
}
|
||||
}
|
||||
207
database/seeders/ChecklistTemplateSeeder.php
Normal file
207
database/seeders/ChecklistTemplateSeeder.php
Normal file
@@ -0,0 +1,207 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\ChecklistFormula;
|
||||
use App\Models\ChecklistItem;
|
||||
use App\Models\ChecklistScope;
|
||||
use App\Models\ChecklistSection;
|
||||
use App\Models\ChecklistTemplate;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
/**
|
||||
* Menyemai templat senarai semak awal berdasarkan dokumen MBIP.
|
||||
*
|
||||
* PENTING: Struktur ini hanya benih awal. Reka bentuk pangkalan data adalah
|
||||
* dinamik — JPP boleh menambah/membuang seksyen, skop, item & formula kemudian
|
||||
* melalui "Pembina Templat Senarai Semak" tanpa perubahan kod.
|
||||
*/
|
||||
class ChecklistTemplateSeeder extends Seeder
|
||||
{
|
||||
public function run(): void
|
||||
{
|
||||
$template = ChecklistTemplate::firstOrCreate(
|
||||
['name' => 'Templat Senarai Semak Kemampanan Pusat Data MBIP'],
|
||||
['version' => '1.0', 'is_active' => true, 'description' => 'Templat asas pelaporan jejak karbon pusat data MBIP.']
|
||||
);
|
||||
|
||||
// Elak pendua jika seeder dijalankan semula.
|
||||
if ($template->sections()->exists()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$tCO2e = 'tCO2e';
|
||||
|
||||
// ============================================================
|
||||
// SEKSYEN A — Anggaran Jumlah Pelepasan Karbon
|
||||
// ============================================================
|
||||
$secA = $this->section($template, 'A', 'Anggaran Jumlah Pelepasan Karbon Oleh Pusat Data', 1, true,
|
||||
'Jumlah Anggaran GHG Inventori Pusat Data sebagai asas / Baseline Jejak Karbon Tahun.');
|
||||
|
||||
$skop1 = $this->scope($secA, 'SKOP1', 'Skop 1 — Pelepasan Langsung', 1,
|
||||
'Pembakaran bahan api fosil ketika operasi (arang batu, LPG, dll); penggunaan bahan api kenderaan (petrol); pelepasan fugitive daripada penyaman udara/HVAC/chiller, SF6 dalam GIS dan sistem pemadaman kebakaran.');
|
||||
$this->item($secA, 'A.1.i', 'SKOP1', 'Jumlah pelepasan Skop 1', 'number', $tCO2e, 1, true, $skop1->id,
|
||||
'Jumlah keseluruhan pelepasan langsung (Skop 1) dalam tCO2e.');
|
||||
|
||||
$skop2 = $this->scope($secA, 'SKOP2', 'Skop 2 — Tenaga Dibeli', 2,
|
||||
'Pelepasan daripada jumlah penggunaan elektrik dalam bangunan & kemudahan pusat data (mengambil kira operasi dan kapasiti penjanaan elektrik komponen IT); penggunaan kenderaan elektrik ketika operasi.');
|
||||
$this->item($secA, 'A.1.ii', 'SKOP2', 'Jumlah pelepasan Skop 2', 'number', $tCO2e, 2, true, $skop2->id,
|
||||
'Jumlah keseluruhan pelepasan tenaga dibeli (Skop 2) dalam tCO2e.');
|
||||
|
||||
$skop3 = $this->scope($secA, 'SKOP3', 'Skop 3 — Pelepasan Tidak Langsung Lain', 3,
|
||||
'Sisa pepejal dilupuskan di luar kawasan; pembakaran bahan api kenderaan pekerja pergi/balik kerja; jumlah karbon daripada bahan binaan / embodied carbon.');
|
||||
$this->item($secA, 'A.1.iii', 'SKOP3', 'Jumlah pelepasan Skop 3', 'number', $tCO2e, 3, true, $skop3->id,
|
||||
'Jumlah keseluruhan pelepasan tidak langsung lain (Skop 3) dalam tCO2e.');
|
||||
|
||||
ChecklistFormula::create([
|
||||
'checklist_template_id' => $template->id,
|
||||
'checklist_section_id' => $secA->id,
|
||||
'result_token' => 'A',
|
||||
'label' => 'A — Jumlah Pelepasan Karbon (Skop 1 + Skop 2 + Skop 3)',
|
||||
'expression' => 'SKOP1 + SKOP2 + SKOP3',
|
||||
'unit' => $tCO2e,
|
||||
'order' => 1,
|
||||
]);
|
||||
|
||||
// ============================================================
|
||||
// SEKSYEN B — Mekanisme Pengurangan Karbon
|
||||
// ============================================================
|
||||
$secB = $this->section($template, 'B', 'Mekanisme Pengurangan Karbon', 2, true);
|
||||
$this->item($secB, '2(i)', 'EE', 'Jumlah karbon penggunaan kecekapan tenaga / EE', 'number', $tCO2e, 1, true, null,
|
||||
'Contoh: LED, inverter penghawa dingin, audit tenaga, dll.');
|
||||
$this->item($secB, '2(ii)', 'RE', 'Jumlah karbon penggunaan tenaga boleh diperbaharui / RE', 'number', $tCO2e, 2, true, null,
|
||||
'Contoh: solar, hidro, biomas, dll.');
|
||||
|
||||
ChecklistFormula::create([
|
||||
'checklist_template_id' => $template->id,
|
||||
'checklist_section_id' => $secB->id,
|
||||
'result_token' => 'B',
|
||||
'label' => 'B — Jumlah Pengurangan Karbon (2(i) + 2(ii))',
|
||||
'expression' => 'EE + RE',
|
||||
'unit' => $tCO2e,
|
||||
'order' => 2,
|
||||
]);
|
||||
|
||||
// ============================================================
|
||||
// SEKSYEN C — Anggaran Jumlah Baki Karbon
|
||||
// ============================================================
|
||||
$secC = $this->section($template, 'C', 'Anggaran Jumlah Baki Karbon', 3, true,
|
||||
'Jumlah anggaran baki GHG / residual emissions.');
|
||||
// Item dikira automatik (tiada input perunding).
|
||||
$this->item($secC, '3', 'C_RES', 'Jumlah anggaran baki GHG / residual emissions', 'calculated', $tCO2e, 1, false, null,
|
||||
'Dikira automatik: C = A - B.', true, 'A - B');
|
||||
|
||||
ChecklistFormula::create([
|
||||
'checklist_template_id' => $template->id,
|
||||
'checklist_section_id' => $secC->id,
|
||||
'result_token' => 'C',
|
||||
'label' => 'C — Baki Karbon (A - B)',
|
||||
'expression' => 'A - B',
|
||||
'unit' => $tCO2e,
|
||||
'order' => 3,
|
||||
]);
|
||||
|
||||
// ============================================================
|
||||
// SEKSYEN D — Anggaran Jumlah Bersih Karbon
|
||||
// ============================================================
|
||||
$secD = $this->section($template, 'D', 'Anggaran Jumlah Bersih Karbon', 4, true);
|
||||
$this->item($secD, '4(i)', 'D4I', 'Jumlah karbon melalui inisiatif (kredit karbon, CSR, mRECs)', 'number', $tCO2e, 1, true, null,
|
||||
'Nyatakan tahun inisiatif dalam catatan perunding.');
|
||||
$this->item($secD, '4(ii)', 'D4II', 'Jumlah anggaran pengurangan GHG melalui mekanisme dalam Seksyen B', 'number', $tCO2e, 2, true, null);
|
||||
|
||||
ChecklistFormula::create([
|
||||
'checklist_template_id' => $template->id,
|
||||
'checklist_section_id' => $secD->id,
|
||||
'result_token' => 'D',
|
||||
'label' => 'D — Jumlah Bersih Karbon (A - 4(i) - 4(ii))',
|
||||
'expression' => 'A - D4I - D4II',
|
||||
'unit' => $tCO2e,
|
||||
'order' => 4,
|
||||
]);
|
||||
|
||||
// ============================================================
|
||||
// SEKSYEN E — Peratus Pengurangan GHG
|
||||
// ============================================================
|
||||
$secE = $this->section($template, 'E', 'Peratus Pengurangan GHG Pusat Data', 5, true,
|
||||
'E = D / A x 100. Termasuk perlindungan pembahagian dengan sifar.');
|
||||
$this->item($secE, '5', 'E_PCT', 'Peratus pengurangan GHG', 'calculated', '%', 1, false, null,
|
||||
'Dikira automatik: E = D / A x 100.', true, 'D / A * 100');
|
||||
|
||||
ChecklistFormula::create([
|
||||
'checklist_template_id' => $template->id,
|
||||
'checklist_section_id' => $secE->id,
|
||||
'result_token' => 'E',
|
||||
'label' => 'E — Peratus Pengurangan GHG (D / A x 100)',
|
||||
'expression' => 'D / A * 100',
|
||||
'unit' => '%',
|
||||
'guard_div_zero' => true,
|
||||
'order' => 5,
|
||||
]);
|
||||
|
||||
// ============================================================
|
||||
// SEKSYEN LAIN-LAIN — Tiada formula
|
||||
// ============================================================
|
||||
$secLain = $this->section($template, 'LAIN', 'Lain-lain Perkara', 6, false);
|
||||
$this->item($secLain, 'L.1', null, 'Penyertaan sijil bangunan hijau & rating diterima', 'select', null, 1, false, null,
|
||||
'Pilih sijil bangunan hijau jika ada.', false, null,
|
||||
['GBI', 'GreenRE', 'LEED', 'Greenmark', 'Lain-lain', 'Tiada']);
|
||||
$this->item($secLain, 'L.2', null, 'Sasaran pengurangan GHG pusat data secara keseluruhan (jika ada)', 'textarea', null, 2, false, null);
|
||||
$this->item($secLain, 'L.3', null, 'Jumlah pelepasan karbon daripada Business as Usual / BAU untuk 2030', 'number', $tCO2e, 3, false, null);
|
||||
$this->item($secLain, 'L.4', null, 'Jumlah pengurangan karbon melalui Counter Measure / CM untuk 2030', 'number', $tCO2e, 4, false, null);
|
||||
}
|
||||
|
||||
protected function section(ChecklistTemplate $t, string $code, string $title, int $order, bool $formula, ?string $desc = null): ChecklistSection
|
||||
{
|
||||
return ChecklistSection::create([
|
||||
'checklist_template_id' => $t->id,
|
||||
'code' => $code,
|
||||
'title' => $title,
|
||||
'description' => $desc,
|
||||
'order' => $order,
|
||||
'is_formula_enabled' => $formula,
|
||||
]);
|
||||
}
|
||||
|
||||
protected function scope(ChecklistSection $s, string $code, string $title, int $order, ?string $desc = null): ChecklistScope
|
||||
{
|
||||
return ChecklistScope::create([
|
||||
'checklist_section_id' => $s->id,
|
||||
'code' => $code,
|
||||
'title' => $title,
|
||||
'description' => $desc,
|
||||
'order' => $order,
|
||||
]);
|
||||
}
|
||||
|
||||
protected function item(
|
||||
ChecklistSection $s,
|
||||
string $code,
|
||||
?string $token,
|
||||
string $label,
|
||||
string $inputType,
|
||||
?string $unit,
|
||||
int $order,
|
||||
bool $required,
|
||||
?int $scopeId = null,
|
||||
?string $desc = null,
|
||||
bool $calculated = false,
|
||||
?string $formula = null,
|
||||
?array $options = null,
|
||||
): ChecklistItem {
|
||||
return ChecklistItem::create([
|
||||
'checklist_section_id' => $s->id,
|
||||
'checklist_scope_id' => $scopeId,
|
||||
'code' => $code,
|
||||
'formula_token' => $token,
|
||||
'label' => $label,
|
||||
'description' => $desc,
|
||||
'input_type' => $inputType,
|
||||
'options' => $options,
|
||||
'unit' => $unit,
|
||||
'is_required' => $required,
|
||||
'is_calculated' => $calculated,
|
||||
'formula' => $formula,
|
||||
'order' => $order,
|
||||
]);
|
||||
}
|
||||
}
|
||||
19
database/seeders/DatabaseSeeder.php
Normal file
19
database/seeders/DatabaseSeeder.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class DatabaseSeeder extends Seeder
|
||||
{
|
||||
public function run(): void
|
||||
{
|
||||
$this->call([
|
||||
RolesAndPermissionsSeeder::class,
|
||||
UserSeeder::class,
|
||||
AppSettingsSeeder::class,
|
||||
ChecklistTemplateSeeder::class,
|
||||
DemoDataSeeder::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
73
database/seeders/DemoDataSeeder.php
Normal file
73
database/seeders/DemoDataSeeder.php
Normal file
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\ChecklistTemplate;
|
||||
use App\Models\Consultant;
|
||||
use App\Models\DataCentre;
|
||||
use App\Models\DataCentreConsultantAssignment;
|
||||
use App\Models\ReportingCycle;
|
||||
use App\Models\User;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class DemoDataSeeder extends Seeder
|
||||
{
|
||||
public function run(): void
|
||||
{
|
||||
$consultant = Consultant::where('emel', 'perunding@example.com')->first();
|
||||
$officer = User::where('email', 'pegawai@mbip.gov.my')->first();
|
||||
$template = ChecklistTemplate::activeTemplate();
|
||||
|
||||
if (! $consultant) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Pusat data contoh.
|
||||
$dataCentres = [
|
||||
['nama_pusat_data' => 'Pusat Data Iskandar 1', 'tajuk_permohonan' => 'Permohonan Lesen Pusat Data Hyperscale Iskandar', 'lokasi_pusat_data' => 'Nusajaya', 'it_load' => 50.00, 'keluasan_tapak' => 12.50],
|
||||
['nama_pusat_data' => 'Pusat Data Tebrau Tech Park', 'tajuk_permohonan' => 'Permohonan Lesen Pusat Data Tebrau', 'lokasi_pusat_data' => 'Tebrau', 'it_load' => 30.00, 'keluasan_tapak' => 8.20],
|
||||
['nama_pusat_data' => 'Pusat Data Pasir Gudang', 'tajuk_permohonan' => 'Permohonan Lesen Pusat Data Industri', 'lokasi_pusat_data' => 'Pasir Gudang', 'it_load' => 20.00, 'keluasan_tapak' => 5.00],
|
||||
];
|
||||
|
||||
foreach ($dataCentres as $data) {
|
||||
$dc = DataCentre::firstOrCreate(
|
||||
['nama_pusat_data' => $data['nama_pusat_data']],
|
||||
array_merge($data, [
|
||||
'alamat' => $data['lokasi_pusat_data'].', Johor',
|
||||
'status' => 'aktif',
|
||||
])
|
||||
);
|
||||
|
||||
// Tugaskan perunding aktif jika belum ada.
|
||||
if (! $dc->current_consultant_id) {
|
||||
$dc->update(['current_consultant_id' => $consultant->id]);
|
||||
DataCentreConsultantAssignment::firstOrCreate(
|
||||
['data_centre_id' => $dc->id, 'consultant_id' => $consultant->id, 'is_active' => true],
|
||||
[
|
||||
'start_date' => Carbon::create(2026, 1, 1),
|
||||
'reason' => 'Penugasan awal perunding.',
|
||||
'assigned_by' => $officer?->id,
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Kitaran pelaporan contoh: pembaharuan 2028 => pelaporan 2026.
|
||||
foreach ([2027, 2028] as $renewalYear) {
|
||||
$reportingYear = ReportingCycle::reportingYearFor($renewalYear);
|
||||
ReportingCycle::firstOrCreate(
|
||||
['renewal_year' => $renewalYear],
|
||||
[
|
||||
'reporting_year' => $reportingYear,
|
||||
'period_start' => Carbon::create($reportingYear, 1, 1),
|
||||
'period_end' => Carbon::create($reportingYear, 12, 31),
|
||||
'cut_off_date' => Carbon::create($renewalYear - 1, 12, 1),
|
||||
'licence_period_year' => 1,
|
||||
'checklist_template_id' => $template?->id,
|
||||
'status' => $renewalYear === 2028 ? 'aktif' : 'tutup',
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
80
database/seeders/RolesAndPermissionsSeeder.php
Normal file
80
database/seeders/RolesAndPermissionsSeeder.php
Normal file
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Spatie\Permission\Models\Permission;
|
||||
use Spatie\Permission\Models\Role;
|
||||
use Spatie\Permission\PermissionRegistrar;
|
||||
|
||||
class RolesAndPermissionsSeeder extends Seeder
|
||||
{
|
||||
/** Senarai kebenaran sistem => label Bahasa Melayu. */
|
||||
public const PERMISSIONS = [
|
||||
'pengguna.urus' => 'Urus pengguna sistem',
|
||||
'perunding.urus' => 'Urus perunding',
|
||||
'pusat_data.urus' => 'Urus pusat data',
|
||||
'tugasan.urus' => 'Urus penugasan perunding',
|
||||
'kitaran.urus' => 'Urus kitaran pelaporan/pembaharuan',
|
||||
'templat.urus' => 'Urus templat senarai semak',
|
||||
'serahan.lihat_semua' => 'Lihat semua serahan',
|
||||
'serahan.semak' => 'Semak serahan (status, ulasan, pembetulan, penugasan pegawai)',
|
||||
'serahan.kunci' => 'Kunci/buka kunci serahan',
|
||||
'serahan.hardcopy' => 'Tanda penerimaan dokumen salinan keras',
|
||||
'serahan.urus_sendiri' => 'Urus serahan sendiri (perunding)',
|
||||
'laporan.lihat' => 'Lihat laporan & statistik',
|
||||
'peringatan.lihat' => 'Lihat senarai peringatan/belum serah',
|
||||
'komen.cipta' => 'Hantar komen/perbualan',
|
||||
'komen.padam' => 'Padam (soft delete) komen — pentadbir sahaja',
|
||||
'tetapan.urus' => 'Urus tetapan aplikasi',
|
||||
];
|
||||
|
||||
public const ROLES = [
|
||||
'Super Admin' => '*',
|
||||
'JPP Admin' => [
|
||||
'pengguna.urus', 'perunding.urus', 'pusat_data.urus', 'tugasan.urus',
|
||||
'kitaran.urus', 'templat.urus', 'serahan.lihat_semua', 'serahan.semak',
|
||||
'serahan.kunci', 'serahan.hardcopy', 'laporan.lihat', 'peringatan.lihat',
|
||||
'komen.cipta', 'komen.padam', 'tetapan.urus',
|
||||
],
|
||||
'Pegawai JPP' => [
|
||||
'perunding.urus', 'pusat_data.urus', 'tugasan.urus', 'kitaran.urus',
|
||||
'serahan.lihat_semua', 'serahan.semak', 'serahan.kunci', 'serahan.hardcopy',
|
||||
'laporan.lihat', 'peringatan.lihat', 'komen.cipta',
|
||||
],
|
||||
'Penolong Pegawai' => [
|
||||
'pusat_data.urus', 'serahan.lihat_semua', 'serahan.semak', 'serahan.hardcopy',
|
||||
'laporan.lihat', 'peringatan.lihat', 'komen.cipta',
|
||||
],
|
||||
'Kerani' => [
|
||||
'serahan.lihat_semua', 'serahan.hardcopy', 'peringatan.lihat', 'komen.cipta',
|
||||
],
|
||||
'Perunding' => [
|
||||
'serahan.urus_sendiri', 'komen.cipta',
|
||||
],
|
||||
];
|
||||
|
||||
public function run(): void
|
||||
{
|
||||
app(PermissionRegistrar::class)->forgetCachedPermissions();
|
||||
|
||||
$guard = 'web';
|
||||
|
||||
foreach (self::PERMISSIONS as $name => $label) {
|
||||
Permission::firstOrCreate(['name' => $name, 'guard_name' => $guard]);
|
||||
}
|
||||
|
||||
foreach (self::ROLES as $roleName => $perms) {
|
||||
$role = Role::firstOrCreate(['name' => $roleName, 'guard_name' => $guard]);
|
||||
|
||||
if ($perms === '*') {
|
||||
$role->syncPermissions(Permission::where('guard_name', $guard)->get());
|
||||
} else {
|
||||
$role->syncPermissions($perms);
|
||||
}
|
||||
}
|
||||
|
||||
app(PermissionRegistrar::class)->forgetCachedPermissions();
|
||||
}
|
||||
}
|
||||
61
database/seeders/UserSeeder.php
Normal file
61
database/seeders/UserSeeder.php
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\Consultant;
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class UserSeeder extends Seeder
|
||||
{
|
||||
public function run(): void
|
||||
{
|
||||
$users = [
|
||||
['name' => 'Super Admin', 'email' => 'superadmin@mbip.gov.my', 'role' => 'Super Admin', 'jawatan' => 'Pentadbir Sistem'],
|
||||
['name' => 'JPP Admin', 'email' => 'jppadmin@mbip.gov.my', 'role' => 'JPP Admin', 'jawatan' => 'Pentadbir JPP'],
|
||||
['name' => 'Pegawai JPP', 'email' => 'pegawai@mbip.gov.my', 'role' => 'Pegawai JPP', 'jawatan' => 'Pegawai Perancang Bandar'],
|
||||
['name' => 'Penolong Pegawai JPP', 'email' => 'penolong@mbip.gov.my', 'role' => 'Penolong Pegawai', 'jawatan' => 'Penolong Pegawai Perancang Bandar'],
|
||||
['name' => 'Kerani JPP', 'email' => 'kerani@mbip.gov.my', 'role' => 'Kerani', 'jawatan' => 'Pembantu Tadbir'],
|
||||
];
|
||||
|
||||
foreach ($users as $data) {
|
||||
$user = User::firstOrCreate(
|
||||
['email' => $data['email']],
|
||||
[
|
||||
'name' => $data['name'],
|
||||
'password' => Hash::make('password'),
|
||||
'jawatan' => $data['jawatan'],
|
||||
'is_active' => true,
|
||||
'email_verified_at' => now(),
|
||||
]
|
||||
);
|
||||
$user->syncRoles([$data['role']]);
|
||||
}
|
||||
|
||||
// Akaun perunding contoh + profil perunding berkait.
|
||||
$perundingUser = User::firstOrCreate(
|
||||
['email' => 'perunding@example.com'],
|
||||
[
|
||||
'name' => 'Perunding Contoh Sdn Bhd',
|
||||
'password' => Hash::make('password'),
|
||||
'jawatan' => 'Perunding Alam Sekitar',
|
||||
'is_active' => true,
|
||||
'email_verified_at' => now(),
|
||||
]
|
||||
);
|
||||
$perundingUser->syncRoles(['Perunding']);
|
||||
|
||||
Consultant::firstOrCreate(
|
||||
['emel' => 'perunding@example.com'],
|
||||
[
|
||||
'user_id' => $perundingUser->id,
|
||||
'nama_perunding' => 'Perunding Contoh Sdn Bhd',
|
||||
'no_pendaftaran_syarikat' => '202301000123 (1234567-A)',
|
||||
'alamat' => 'No. 1, Jalan Hijau, 81200 Johor Bahru, Johor',
|
||||
'telefon' => '07-1234567',
|
||||
'aktif' => true,
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user