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

---

## 1. IDENTITAS MODUL

- **Nama Modul:** `pembelian`
- **Pola Kompleksitas:** **Transaksi Kompleks** (Pembelian Barang Lokal, Variant Purchase Entry, Multi-Supplier Pricing, Cost Allocation via `_processSelectProductException`, Dual-Write Stock Locker Entry, Hutang Dagang & Uang Muka).
- **Jenis Transaksi (`jenisTr`):**
  - `461` : Pembelian Lokal Reguler / Purchase Order (Faktur Pembelian)
  - `466` : Uang Muka Pembelian
  - `489` : Pelunasan Hutang Pembelian
  - `961` : Retur Pembelian (Purchase Return with Stock Deduction)
  - `1961`: Retur Pembelian Non-Stok
  - `463` : Pembelian Indent / Order Varian
  - `1463`: Pembelian Indent Non-Stok
  - `460` : Pembelian Tunai (Direct Cash Purchase)
  - `487` : Biaya Angkut / Alokasi Biaya Pembelian
  - `1763`: Pembelian Komposit
  - `3463`: Pembelian Konsinyasi

---

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

### 2.1 Base Controller & Configuration

#### [Modul_Controller.php](file:///c:/xampp/htdocs/new_san_variant/application/modules/pembelian/controllers/Modul_Controller.php)
- **Fungsi `__construct()`**:
  - *Input*: `URI segment(4)` -> `$this->jenisTr`, `URI segment(1)` -> `$this->modul`.
  - *Validasi*: Session login & user access right (`he_access_right`).
  - *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 & Exception Handling)

#### [Create.php](file:///c:/xampp/htdocs/new_san_variant/application/modules/pembelian/controllers/Create.php)
- **Fungsi `index()`**: Form Step 1 pencarian supplier (`pihakID`), nomor faktur supplier, & item barang bervarian.
- **Fungsi `preview()`**: Step 2 preview rincian nota pembelian, PPN, alokasi biaya pengiriman, & HPP Awal.
- **Fungsi `save()`**: Menyimpan draf pembelian ke `transaksi`, `transaksi_data`, `transaksi_values`, `transaksi_registry`.

#### [_processSelectProductException.php](file:///c:/xampp/htdocs/new_san_variant/application/modules/pembelian/controllers/_processSelectProductException.php)
- **Fungsi Custom Exception**:
  - *Logic*: Menangani selisih harga barang, alokasi biaya angkut per-item varian, dan penyesuaian diskon khusus dari supplier.

---

### 2.3 Executing & FollowUp Approval

#### [FollowUp.php](file:///c:/xampp/htdocs/new_san_variant/application/modules/pembelian/controllers/FollowUp.php)
- **Fungsi `doFollowup()`** *(Core Execution Purchase)*:
  - *Input*: `POST` ID transaksi pembelian + approval status.
  - *Query & Models*:
    1. **Status Update**: State `transaksi` -> `completed`.
    2. **Jurnal Otomatis**: Memanggil `ComJurnal` untuk pencatatan Persediaan Barang (D), PPN Masukan (D), dan Hutang Dagang / Kas (K).
    3. **Dual-Write Stock Entry**: Memanggil `ComLockerStockDualWrite::pair()` untuk menambah stok barang (`+active`) pada `stock_locker` dan `stock_locker_variant` (dengan sentinel `variant_id=1` bila `variant_id=0`).
    4. **FIFO Entry**: Memanggil `ComFifoProdukJadi` / `ComFifoProdukJadiVarian` untuk mencatat batch stok baru & HPP per varian.
    5. **Registry Update**: Log step registrasi di `transaksi_registry`.

---

### 2.4 Cart & Selector Processors

#### [_shoppingCart.php](file:///c:/xampp/htdocs/new_san_variant/application/modules/pembelian/controllers/_shoppingCart.php)
- **Fungsi `reset()`**: Mengosongkan cart & melepaskan hold stok temporary via `ComLockerStockDualWrite::pair()`.
- **Fungsi `recordItemColumn()`, `recordPairedItem()`**: AJAX updates harga beli & varian terpilih.

---

## 3. IDENTIFIKASI PERBEDAAN DENGAN MOCKUP GLOBAL

| No | Komponen / Fitur Unik | Deskripsi & Perbedaannya dengan Mockup Standar |
|:--:|:----------------------|:------------------------------------------------|
| 1 | **Product Exception Processor (`_processSelectProductException.php`)** | Sub-controller khusus untuk alokasi biaya pengiriman (freight-in) dan selisih harga barang ke HPP varian produk. |
| 2 | **Batch HPP & FIFO Dual-Write Integration** | Menggunakan `ComFifoProdukJadiVarian` untuk mencatat lot/batch penerimaan barang bervarian dan menetapkan nilai HPP per unit. |
| 3 | **Sentinel Dual-Write Stock Purchase Entry** | Penambahan stok fisik ke `stock_locker` dan `stock_locker_variant` secara simultan via `ComLockerStockDualWrite`. |

---

## 4. ARSITEKTUR KODE BARU (THE BLUEPRINT)

### 4.1 Struktur Controller Baru

```
application/modules/pembelian/
├── config/
│   ├── coTransaksiCore.php
│   ├── coTransaksiUi.php
│   ├── coTransaksiLayout.php
│   └── coTransaksiValues.php
├── controllers/
│   ├── Modul_Controller.php       # Base controller
│   ├── Create.php                 # Form Purchase Order / Pembelian
│   ├── FollowUp.php               # Approval & Reception Execution
│   ├── Transaksi.php              # Purchase Order List
│   ├── ActivityReport.php         # Laporan Pembelian
│   ├── History.php                # Riwayat Pembelian
│   ├── Printing.php               # Cetak PO & Bukti Penerimaan
│   ├── ViewDetails.php            # Modal Detail Pembelian (Multi-Variant Safe)
│   ├── _processSelectProductException.php # Freight & Price Exception Engine
│   ├── _shoppingCart.php          # Cart Manager
│   └── _processSelectProduct.php   # Product & Variant Selector
└── views/
    ├── transaksi_modul.php
    ├── shoppingCart.php
    └── printing.php
```

---

### 4.2 Panduan Langkah-demi-Langkah Developer

1. **Langkah 1: Terapkan Dual-Write Stock Entry (`ComLockerStockDualWrite`)**
   - Gunakan `ComLockerStockDualWrite::pair()` untuk menambah stok `active` di `stock_locker` dan `stock_locker_variant`.

2. **Langkah 2: Sinkronisasi Model Batch FIFO Varian (`ComFifoProdukJadiVarian`)**
   - Daftarkan `ComFifoProdukJadiVarian` pada `coTransaksiCore.php` agar setiap pembelian varian mencatat batch HPP yang presisi.

3. **Langkah 3: Alokasi Biaya Pengiriman (`_processSelectProductException`)**
   - Memastikan kalkulasi alokasi biaya angkut terbagi proporsional ke HPP masing-masing varian barang.

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

---

### 5. KESIMPULAN & STATUS EKSEKUSI

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