# BLUEPRINT CETAK BIRU MODUL: PENJUALAN PROJECT
**Modul:** `penjualanproject`  
**Workspace:** `new_san_variant`  
**Standard:** Single Variant Standard & Dual-Write Rollout  
**Tanggal Analisis:** 2026-07-29  

---

## 1. IDENTITAS MODUL

- **Nama Modul:** `penjualanproject`
- **Pola Kompleksitas:** **Transaksi Kompleks** (Kontrak Penjualan Projek, Termijn / Progress Billing, Multi-Variant Item Assignment, Direct Expense Allocation via `_processSelectBiaya`, `_projectItemEditor`, & Multi-Step Approval Workflows).
- **Jenis Transaksi (`jenisTr`):**
  - `588` : Penjualan Project / Kontrak Pekerjaan & Pengadaan Project
  - `1784`: Penjualan Project Komposit

---

## 2. DAFTAR FUNGSI & LOGIKA BISNIS (REVERSE ENGINEERING)

### 2.1 Base Controller & Configuration

#### [Modul_Controller.php](file:///c:/xampp/htdocs/new_san_variant/application/modules/penjualanproject/controllers/Modul_Controller.php)
- **Fungsi `__construct()`**:
  - *Input*: `URI segment(4)` -> `$this->jenisTr`, `URI segment(1)` -> `$this->modul`.
  - *Validasi*: User session login & access rights.
  - *Config Loaded*: `coTransaksiUi`, `coTransaksiCore`, `coTransaksiLayout`, `coTransaksiValues`.
  - *State Mapping*: `$this->mongoTableList` (`transaksi`, `transaksi_values`, `transaksi_data`, `transaksi_data_values`, `transaksi_sign`, `transaksi_extstep`, `transaksi_registry`).

---

### 2.2 Entry Transaksi (Create & Project Item Editor)

#### [Create.php](file:///c:/xampp/htdocs/new_san_variant/application/modules/penjualanproject/controllers/Create.php)
- **Fungsi `index()`**: Form Step 1 input header project (Customer, Nilai Kontrak, Lokasi Project, Target Selesai).
- **Fungsi `preview()`**: Step 2 preview rincian RAB (Rencana Anggaran Biaya), Alokasi Material/Varian Produk, & Jurnal Proyek.
- **Fungsi `save()`**: Save draft kontrak project ke DB `transaksi`, `transaksi_data`, `transaksi_values`, `transaksi_registry`.

#### [_projectItemEditor.php](file:///c:/xampp/htdocs/new_san_variant/application/modules/penjualanproject/controllers/_projectItemEditor.php)
- **Fungsi Custom Project**:
  - *Input*: AJAX payload item rincian pekerjaan / material.
  - *Logic*: Memungkinkan pengubahan harga, volume, serta alokasi varian barang secara terpisah per sub-pekerjaan project.

---

### 2.3 Executing & FollowUp Approval

#### [FollowUp.php](file:///c:/xampp/htdocs/new_san_variant/application/modules/penjualanproject/controllers/FollowUp.php)
- **Fungsi `doFollowup()`** *(Core Execution Project)*:
  - *Input*: `POST` ID transaksi project + approval status.
  - *Query & Models*:
    1. **Status Update**: State `transaksi` -> `completed` / `in-progress`.
    2. **Jurnal Project**: Memanggil `ComJurnal` untuk mencatat Jurnal Piutang Proyek, Pendapatan Kontrak, dan HPP Proyek.
    3. **Dual-Write Stock Release**: Memanggil `ComLockerStockDualWrite::pair()` untuk stok material & varian barang yang dialokasikan langsung dari gudang project.
    4. **Registry Update**: Log step registrasi di `transaksi_registry`.

---

### 2.4 Cart & Expense Processors

#### [_processSelectBiaya.php](file:///c:/xampp/htdocs/new_san_variant/application/modules/penjualanproject/controllers/_processSelectBiaya.php)
- **Fungsi `select()`, `remove()`, `updateValues()`**: Mengelola alokasi biaya operasional langsung project (misal: biaya sewa alat, jasa subkontraktor, biaya transportasi).

#### [_shoppingCart.php](file:///c:/xampp/htdocs/new_san_variant/application/modules/penjualanproject/controllers/_shoppingCart.php)
- **Fungsi `reset()`**: Mengosongkan cart project & melepaskan hold stok material project via `ComLockerStockDualWrite::pair()`.

---

## 3. IDENTIFIKASI PERBEDAAN DENGAN MOCKUP GLOBAL

| No | Komponen / Fitur Unik | Deskripsi & Perbedaannya dengan Mockup Standar |
|:--:|:----------------------|:------------------------------------------------|
| 1 | **Project Item Editor (`_projectItemEditor.php`)** | Sub-controller khusus untuk mengedit RAB (Rencana Anggaran Biaya) & alokasi material per-tahapan pekerjaan project. |
| 2 | **Direct Cost Allocation (`_processSelectBiaya.php`)** | Mengakomodasi pengeluaran biaya langsung (non-stok/jasa) yang dibebankan langsung ke HPP Project. |
| 3 | **Dual-Write Stock Material Project** | Sinkronisasi alokasi material bervarian dari gudang ke project via `ComLockerStockDualWrite`. |

---

## 4. ARSITEKTUR KODE BARU (THE BLUEPRINT)

### 4.1 Struktur Controller Baru

```
application/modules/penjualanproject/
├── config/
│   ├── coTransaksiCore.php
│   ├── coTransaksiUi.php
│   ├── coTransaksiLayout.php
│   └── coTransaksiValues.php
├── controllers/
│   ├── Modul_Controller.php       # Base controller
│   ├── Create.php                 # Form Kontrak Project
│   ├── FollowUp.php               # Approval & Execution Project
│   ├── Transaksi.php              # Project Contract List
│   ├── ActivityReport.php         # Laporan Activity Project
│   ├── History.php                # Riwayat Proyek
│   ├── Printing.php               # Cetak Kontrak & SPK
│   ├── ViewDetails.php            # Modal Detail Proyek (Multi-Variant Safe)
│   ├── _projectItemEditor.php     # RAB & Item Editor Engine
│   ├── _processSelectBiaya.php    # Expense Allocation Processor
│   ├── _shoppingCart.php          # Cart Manager
│   └── _processSelectProduct.php   # Material Product Selector
└── views/
    ├── transaksi_modul.php
    ├── shoppingCart.php
    └── printing.php
```

---

### 4.2 Panduan Langkah-demi-Langkah Developer

1. **Langkah 1: Sinkronisasi RAB & Material Variant (`_projectItemEditor.php`)**
   - Memastikan `_projectItemEditor` dapat memetakan `variant_id` material dengan presisi.

2. **Langkah 2: Terapkan Dual-Write Stock Material Project (`ComLockerStockDualWrite`)**
   - Gunakan `ComLockerStockDualWrite::pair()` untuk mengunci dan melepaskan stok material project.

3. **Langkah 3: Formulasi Jurnal HPP & Biaya Langsung Proyek (`FollowUp.php`)**
   - Memastikan penggabungan HPP Material bervarian dan Biaya Langsung (`_processSelectBiaya`) tercatat rapi di `ComJurnal`.

4. **Langkah 4: Verifikasi PHP 5.6 & Update Checklist**
   - Lakukan test linting `C:\xampp\php\php.exe -l` dan update `docs/uat-checklist.md`.

---

### 5. KESIMPULAN & STATUS EKSEKUSI

- 🟢 **Pekerjaan Selesai (Completed & Verified)**:
  1. Blueprint modul `penjualanproject` diselesaikan.
  2. File [blueprint_penjualanproject.md](file:///c:/xampp/htdocs/new_san_variant/blueprint_penjualanproject.md) dan `dev-jurnal.md` diterbitkan.
