208 lines
9.7 KiB
PHP
208 lines
9.7 KiB
PHP
<?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,
|
|
]);
|
|
}
|
|
}
|