# 🧩 Peta Arsitektur Proyek ERP Everest

Dokumen ini mendeskripsikan struktur folder, arsitektur dasar HMVC, hierarchy controller, serta cara kerja sistem berbasis metadata di ERP Everest.

---

## 1. Konteks Teknologi & Kompatibilitas
*   **Bahasa Utama:** PHP 5.6 (Dilarang menggunakan fitur PHP modern seperti namespace, spread operator `...`, null coalescing `??`, dll.).
*   **Framework:** CodeIgniter 3.1.8 (CI3) dengan subclass prefix `MY_` (di `application/core/`).
*   **HMVC Extension:** Wiredesignz MX v5.5 (berlokasi di `application/third_party/MX/`).
*   **Database:** MySQL / MariaDB (Query Builder / Binding) + MongoDB (`application/libraries/Mongo_db.php` untuk NoSQL log).

---

## 2. Struktur Folder HMVC Modul
Setiap modul di bawah `application/modules/[nama_modul]/` wajib memiliki struktur berikut:

```
[nama_modul]/
├── config/
│   ├── coTransaksiCore.php    # Registrasi component gates, akun COA, FIFO, & post-processor.
│   ├── coTransaksiUi.php      # Definisi alur otorisasi (steps), pop-up selector, & form validator.
│   ├── coTransaksiLayout.php  # Pengaturan kolom tabel riwayat & template cetak PDF/Excel.
│   └── coTransaksiValues.php  # Rumus aritmatika nilai baris belanja & nilai total header.
└── controllers/
    ├── Modul_Controller.php   # Base controller modul (extends MX_Controller).
    ├── _shoppingCart.php      # Controller pengelola keranjang belanja & penahanan stok (hold).
    ├── _processSelect*.php    # Menangani aksi add, edit, remove baris keranjang belanja.
    ├── _selectorItem.php      # Menampilkan popup pencarian barang / picker modal.
    ├── Create.php             # Membuat draft transaksi (Step 1).
    └── FollowUp.php           # Menangani persetujuan / otorisasi (Step 2 ke atas).
```

---

## 3. Siklus Hidup Transaksi (Application Lifecycle Flow)

Alur aplikasi dari tindakan pengguna di antarmuka (UI) hingga penulisan akhir ke basis data terbagi menjadi 3 Fase Utama:

### Fase A: Draft / Keranjang Belanja (Interaksi UI & Reservasi Stok)
1. **Pemuatan Halaman:** Pengguna membuka UI transaksi (di-handle oleh `Create::index()`). Halaman memuat file `_shoppingCart` untuk merender tabel item belanja dinamis.
2. **Pencarian Barang:** Pengguna mengklik tombol tambah item yang memicu pop-up pencarian barang (`_selectorItem/selectItem`).
3. **Penambahan Item (Add/Edit):** Saat item dipilih, `_processSelect*.php` dipanggil:
   *   Mengurangi kuantitas dari stok bebas (`state = 'active'`).
   *   Memindahkan kuantitas tersebut ke stok cadangan (`state = 'hold'`) dengan User ID aktif sebagai penanda kepemilikan.
   *   Proses penulisan stok wajib menggunakan model **`ComLockerStockDualWrite::pair()`** (untuk produk) atau `MdlLockerStockSupplies` (untuk perlengkapan/supplies).
4. **Reset / Batal Belanja:** Jika keranjang dikosongkan atau halaman ditutup tanpa disimpan, fungsi `reset()` di `_shoppingCart.php` akan mengembalikan kuantitas `hold` ke `active`.

### Fase B: Penyimpanan Dokumen Draft (Step 1)
1. **Pengiriman Form:** Pengguna mengklik tombol "Simpan/Ajukan" (di-handle oleh `Create::save()`).
2. **Validasi & Penulisan DB:**
   *   Sistem memvalidasi baris belanja menggunakan skema validator di `coTransaksiUi.php`.
   *   Satu baris baru ditulis ke tabel header **`transaksi`** dengan field `transaksi_jenis = jenisTr` dan status langkah `step = 1`.
   *   Rincian barang ditulis ke tabel detail **`transaksi_data`**.
   *   Informasi kepemilikan locker stok `hold` diperbarui dari sebelumnya dikunci oleh User ID dipindahkan menjadi dikunci oleh Nomor Dokumen Transaksi (`nomer` & `transaksi_id`).

### Fase C: Otorisasi & Posting Jurnal (Step 2+ / Approved)
1. **Review Dokumen:** Otorisator membuka dokumen di layar verifikasi (`FollowUp::followupPrePreview()`).
2. **Eksekusi Otorisasi:** Saat otorisator menekan tombol "Approve" (`FollowUp::doFollowup()`):
   *   Sistem memproses transaksi database (`trans_start()` / `trans_complete()`).
   *   **Pre-processor** (di `coTransaksiCore.php`) dipanggil untuk menghitung HPP FIFO (misal: `FifoAverageConvertion` / `FifoProdukJadiVarian`).
   *   **Post-processor** dipanggil untuk merilis stok locker `hold` menjadi `moved` (keluar dari sistem) atau `active` di gudang target (jika konversi/mutasi).
   *   **Component Jurnal & Rekening** menulis baris pembukuan double-entry ke jurnal umum (`transaksi_jurnal`) dan buku besar (`rekening_transaksi`).
   *   **Sub-ledger** diperbarui untuk mencatat kartu stok produk/supplies berjalan (`RekeningPembantuProduk`).
   *   Status langkah di tabel `transaksi` diupdate menjadi `step = 2` (atau marked closed).

---

## 4. Alur Eksekusi Transaksi (Peta Pipeline)

Proses pemrosesan data mengikuti alur terpusat (*pipeline*) yang dijalankan saat persetujuan transaksi di `FollowUp::doFollowup()`:

```
                      [FollowUp::doFollowup]
                                │
                                ▼
         [Membaca coTransaksiCore.php -> "components"]
                                │
                                ▼
            [Pre-Processor (Kalkulasi HPP / FIFO)]
                 (misal: FifoAverageConvertion)
                                │
                                ▼
            [Post-Processor (Mutasi / Release Stok)]
                 (misal: LockerStockDualWrite)
                                │
                                ▼
             [Jurnal & Rekening (GL Jurnal & COA)]
                     (ComJurnal, ComRekening)
                                │
                                ▼
            [Sub-Ledger / Buku Besar Pembantu]
                (ComRekeningPembantuProduk)
```

---

## 4. Panduan untuk AI Agent Baru
Saat pertama kali membuka sesi, selalu baca berkas berikut secara berurutan untuk mendapatkan pemahaman kerja yang cepat:
1. [AGENTS.md](AGENTS.md) - Protokol pembagian tugas agen dan aturan dual-write.
2. [KAMUS_TRANSAKSI.md](KAMUS_TRANSAKSI.md) - Kamus referensi kode tipe transaksi (`jenisTr`).
3. [SKEMA_DATABASE_POCKET.md](SKEMA_DATABASE_POCKET.md) - Referensi tabel utama dan aturan sentinel stok.
4. [DAFTAR_MODEL.md](DAFTAR_MODEL.md) - Katalog lengkap 784 model beserta fungsinya.
5. [DAFTAR_HELPER_LIBRARY.md](DAFTAR_HELPER_LIBRARY.md) - Katalog lengkap helper global & library sistem.
