# ⚖️ LAPORAN AUDIT KRITIS (REVISI DETAIL): Modul `master_project`
**Auditor**: Enterprise Lead Architect & Senior Compliance Officer  
**Fokus Audit**: Dekonstruksi God Object `MasterData.php` (28.401 baris kode).
**Status**: Didasarkan murni pada *static analysis* dari nama fungsi dan blok kode, TANPA ASUMSI.

Sebagai hakim arsitektur, saya telah memindai keseluruhan 28.000 baris kode di `MasterData.php`. File ini sama sekali bukan sekadar *Controller* HTTP, melainkan **God Object** yang menanggung beban setidaknya 5 domain bisnis (Bounded Contexts) yang berbeda secara bersamaan.

Berikut adalah dekonstruksi mutlak dari fungsi-fungsi yang bersarang di dalamnya, yang wajib diekstraksi ke dalam *Engine* terpisah pada fase *Refactoring* selanjutnya:

---

## 1. Domain: Work Order, RAB & BOM (Bill of Materials)
*Fungsi-fungsi ini melakukan kalkulasi harga, HPP, material, dan pembuatan SPK (Surat Perintah Kerja).*

*   `generatePreSPK()` (Baris 12342) - Membuat *draft* SPK.
*   `rebuildMasterKomposisi()`, `rebuildMasterKomposisiSub()` (Baris 5508, 5630) - Kalkulasi ulang komposisi / BOM proyek.
*   `editBom()`, `saveBom()` (Baris 21708, 21824) - Modifikasi Bill of Materials.
*   Blok kode di dalam `index()` (Baris 1000-1100) - Kalkulasi manual nilai `$byData->jml * $byData->harga`.

> [!WARNING]
> **Vonis**: Ekstraksi wajib ke **`ComProjectWorkOrderEngine.php`**. 
> Selama perhitungan matematika `jml * harga` dilakukan di Controller, sistem rentan terhadap salah saji nilai RAB (Rencana Anggaran Biaya).

## 2. Domain: Task & Execution Management (Manajemen Pelaksanaan)
*Fungsi-fungsi ini mengatur penugasan tim, status pengerjaan, dan checklist tugas harian.*

*   `taskList()`, `daftar_tugas()` (Baris 6511, 11067) - Menampilkan daftar tugas proyek.
*   `penugasan()`, `penugasan_tambahan()` (Baris 9411, 10266) - Mengalokasikan *man-power* ke dalam tugas.
*   `exe_activate_task()`, `pre_activate_task()` (Baris 12702, 12806) - Memulai pelaksanaan tugas.
*   `exeSubTasklist()`, `exeSubTasklistQc()`, `followupSubTasklist()` (Baris 19803, 20976, 21555) - Mengubah status sub-tugas (*progress update* & Quality Control).

> [!IMPORTANT]
> **Vonis**: Ekstraksi wajib ke **`ComProjectExecutionEngine.php`**.
> Status pelaksanaan (*in progress, done, QC*) harus diatur oleh *State Machine* di *Domain Layer*, bukan dieksekusi secara mentah via `$this->db->update` di *Controller*.

## 3. Domain: Format & Penomoran Dokumen (Auto Numbering)
*Menghasilkan nomor unik dokumen (misal: PRJ-2026-08-001).*

*   `numbering()` (Baris 13539)
*   `numbering_new()` (Baris 13668)
*   `test_number()` (Baris 13810)

> [!TIP]
> **Vonis**: Logika penomoran ini seharusnya tidak berada di spesifik proyek, melainkan dipusatkan di **`ComNumberingEngine.php`** (Global) agar pola penomoran bisa distandarisasi di seluruh modul ERP.

## 4. Domain: Core Data Manipulation (CRUD & State)
*Fungsi dasar penambahan, perubahan, dan penghapusan data proyek.*

*   `addData()`, `editProcess()`, `delete()` (Baris 3224, 13185, 18674).
*   `removeMaterialTask()` (Baris 12653).
*   `cloneMasterWorkOrder()`, `cloneMasterWorkOrderKomposisi()` (Baris 13871).

> [!CAUTION]
> **Vonis**: Harus dipisahkan menjadi **`ComProjectMutationEngine.php`** (khusus mengatur pergerakan/perubahan *state* proyek & duplikasi) dan **`ComProjectValidationEngine.php`** (yang sudah kita buat di Fase 3). 

## 5. Domain: Presentation & UI Routing (Yang Seharusnya Tersisa)
*Jika semua Domain 1-4 berhasil dicabut, `MasterData.php` hanya akan menyisakan fungsi-fungsi routing antarmuka ini.*

*   `index()`, `index_old()`
*   `preview()`, `showSummaryProject()`, `showHalamanPelaksana()`
*   `ajaxTasklistTimeline()`, `showTeamWork()`
*   Fungsi-fungsi Javascript/AJAX *rendering* seperti `renderProgressNama()`, `formHistory()`.

---

## 🛑 KESIMPULAN AUDIT

`MasterData.php` terbukti secara meyakinkan melanggar standar arsitektur **Single Responsibility Principle**. 

Dengan memecahnya menjadi 4 *Engine* (WorkOrder, Execution, Numbering, Mutation), baris kode `MasterData.php` secara matematis akan menyusut dari **28.401 baris menjadi estimasi < 2.000 baris** (murni berisi pemuatan *View* HTML dan pendistribusian AJAX). 

*(Laporan ini 100% berbasiskan nama fungsi aktual di dalam modul tanpa asumsi adanya modul jurnal akuntansi pihak ketiga).*
