# Sintesis 04 - Produksi, Distribusi, Pergudangan & BOM

Dokumen ini adalah sintesis dari 16 dokumen sumber (15 blueprint modul + 1 SOP BOM + 1 rencana kerja implementasi) pada workspace `new_san_variant` dengan standar **Single Variant Standard & Dual-Write Rollout**. Seluruh blueprint berstempel **Tanggal Analisis: 2026-07-29** dan berstatus "Completed & Verified". Basis path kode: `C:\xampp\htdocs\new_san_variant\` dengan konvensi modul `application/modules/<nama_modul>/`. Satu dokumen (BOM.md) berada di luar pola blueprint dan bersifat normatif/SOP.

---

## 2. Ringkasan Eksekutif

1. **15 dari 16 dokumen adalah blueprint seragam** dengan anatomi identik: `Identitas Modul` > `Daftar Fungsi & Logika Bisnis` > `Identifikasi Perbedaan dengan Mockup Global` > `Arsitektur Kode Baru` > `Panduan Langkah-demi-Langkah Developer` > `Kesimpulan & Status Eksekusi`. Modul yang tidak punya fitur unik (distribusifg, pindahgudang, requeststok, adjustment, adjustmentjurnal, asetmanagement, openbalance) memiliki tabel "Perbedaan" dengan **2 baris**, sedangkan `produksi`, `produksiproses`, `konversi` memiliki **3 baris**.
2. **Semua modul diklasifikasikan "Transaksi Kompleks"** dan **15 modul mengimplementasikan ulang pola controller yang sama**: 4 file config (`coTransaksiCore.php`, `coTransaksiUi.php`, `coTransaksiLayout.php`, `coTransaksiValues.php`) plus 10-11 controller plus 3 view (`transaksi_modul.php`, `shoppingCart.php`, `printing.php`).
3. **Tiga helper komputasi menjadi tulang punggung seluruh sistem persediaan**: `ComLockerStockDualWrite::pair()` (13 modul), `ComLockerStockSuppliesDualWrite::pair()` (1 modul: `distribusisupplies`), dan `ComFifoProdukJadiVarian` (1 modul: `konversi`). `ComJurnal` ada di **14 dari 15** modul blueprint (tidak ada di `requeststok`).
4. **Terdapat 3 tabel inti persediaan yang disebut konsisten**: `stock_locker` (stok `active` dan `hold`), `stock_locker_variant` (rincian per `variant_id`), serta `transaksi_registry` (audit trail step registrasi, ada di 13 dari 15 modul).
5. **Kode transaksi `jenisTr` berjumlah 30 nilai unik**, dengan satu kolom: `776` dipakai bersama oleh `produksi` dan `produksiproses`. Kode berpola digit-berulang untuk release versus retur (misalnya `3583` release vs `2983` retur, `3683` release vs `9583` retur, `334` release vs `1334` dan `2334` konversi lanjutan).
6. **Model multi-fase produksi (`7761`-`7765`) adalah turunan langsung dari model `776`** - `produksiproses` bukan modul terpisah secara domain, melainkan needasan fase dari `produksi`. Keduanya memakai controller bernama identik (`_processSelectProductAssembling.php`), dibedakan hanya pada method `selectFase()` versus selector generik.
7. **Pola "Lock on Save, Mutate on FollowUp" berlaku seragam**: `Create.php::save()` mengunci stok pada status `hold`, dan `FollowUp.php::doFollowup()` yang melepas atau memutasikan stok, membuat jurnal, dan menulis registry. Pengecualian: `requeststok` secara eksplisit bersifat **non-locking**.
8. **SOP BOM (BOM.md) berada pada level yang berbeda** - ia mengatur master data dan governance (ECO/ECR, RBAC 6 peran, audit trail, scrap factor, cost rollover, status Locked/Open), sementara blueprint mengatur orkestrasi transaksi. **Hanya satu baris di `produksi`** yang menyebut tabel `produksi_bom_detail` secara konkret; tidak ada blueprint yang menyebut ECO, scrap factor, atau cost rollover.
9. **Konsistensi versi sangat tinggi pada 15 blueprint**, namun ada **cacat path yang berulang** pada semua dokumen di bagian penutup: tautan menunjuk `file:///c:/xampp/htdocs/new_san_variant/blueprint_<modul>.md` (root project), sementara dokumen sumber berada di `W:\_md_result\file_md_san\`. `AGENTS_DISTRIBUSIFG.md` justru menunjuk `file:///w:/everest_17jun/...` sehingga ada **workspace berbeda (`everest_17jun` vs `new_san_variant`)**.
10. **Aturan kompatibilitas yang berlaku universal**: PHP 5.6, linting via `C:\xampp\php\php.exe -l`, dan update `docs/uat-checklist.md` - disebut sebagai "Langkah 3" di **15 dari 15 blueprint**, menjadikannya gerbang rilis standar.

---

## 3. Peta Modul Produksi & Distribusi

| Modul | Fokus | Dokumen Sumber |
|:--|:--|:--|
| `produksi` | Assembling dan manufaktur FG dari bahan baku; BOM inherit-or-override; dual-write bahan baku ke FG | `blueprint_produksi.md` |
| `produksiproses` | Multi-phase manufacturing 5 fase, WIP tracking, akumulasi HPP bertahap | `blueprint_produksiproses.md` |
| `distribusifg` | Pengiriman dan serah terima FG ke cabang, Surat Jalan FG, retur | `blueprint_distribusifg.md` |
| `distribusijasa` | Alokasi jasa internal dan konsinyasi antar divisi, tanpa stok fisik | `blueprint_distribusijasa.md` |
| `distribusiproduksi` | Pengeluaran bahan baku ke floor produksi (WIP), retur sisa bahan | `blueprint_distribusiproduksi.md` |
| `distribusisupplies` | Pengeluaran bahan penolong (supplies), identity resolution, cart key khusus | `blueprint_distribusisupplies.md` |
| `pindahgudang` | Transfer stok antar-gudang dan antar-cabang, state in-transit atau hold | `blueprint_pindahgudang.md` |
| `requeststok` | Permintaan stok antar-gudang (non-locking), routing ke `pindahgudang` | `blueprint_requeststok.md` |
| `opname` | Stock take fisik versus sistem, checklist varian, penyesuaian selisih | `blueprint_opname.md` |
| `adjustment` | Penyesuaian stok plus/minus per varian, pilih COA selisih, reval HPP | `blueprint_adjustment.md` |
| `adjustmentjurnal` | Jurnal umum manual, koreksi dan reversal, validasi Debit sama dengan Kredit | `blueprint_adjustmentjurnal.md` |
| `asetmanagement` | Aset tetap: perolehan, depresiasi otomatis, disposal, laba dan rugi | `blueprint_asetmanagement.md` |
| `konversi` | Konversi satuan, repacking, konversi A ke B, FIFO HPP | `blueprint_konversi.md` |
| `openbalance` | Saldo awal sistem, impor batch CLI, equity cut-off go-live | `blueprint_openbalance.md` |
| (SOP) BOM | Governance BOM: ECO, RBAC, audit trail, scrap factor, cost rollover | `BOM.md` |
| (Agenda) Serial Number | Penyelarasan mutasi S/N di gateway `583sc` pada `distribusifg` | `AGENTS_DISTRIBUSIFG.md` |

---

## 4. Manufaktur & Multi-Phase Production

### 4.1 Modul `produksi` - Assembling Sederhana

- **jenisTr:** `776` - *Assembling Produksi (Perakitan & Pengolahan Barang Jadi dari Bahan Baku)*.
- **Pola kompleksitas:** Transaksi Kompleks, digambarkan sebagai "Multi-Variant BOM Inherit-or-Override Engine via `ComProduksiBom`, Assembling Produksi Barang Jadi, Pengurangan Bahan Baku & Supplies Bervarian, Penambahan Stok FG Bervarian, & Dual-Write Stock Locker".
- **Mesin BOM:** `_processSelectProductAssembling.php`. Logikanya menarik formula bahan baku berdasarkan `variant_id` produk jadi dengan pola **Inherit-or-Override**: bila varian memiliki formula khusus di tabel **`produksi_bom_detail`**, formula varian dipakai (override); bila tidak ada, formula parent dengan **`variant_id = 0`** dipakai (inherit). Ini satu-satunya penyebutan nama tabel BOM konkret di seluruh dokumen sumber.
- **Entry:** `Create.php` dengan fungsi `index()`, `preview()`, `save()` - menyusun perintah kerja produksi atau SPK Produksi, mengunci stok bahan baku pada status `hold`, serta menyiapkan alokasi hasil produksi barang jadi bervarian.
- **Eksekusi:** `FollowUp.php::doFollowup()`, 4 langkah berurutan: (1) Stock Deduction BOM item - mengurangi stok bahan baku bervarian `-active` via `ComLockerStockDualWrite::pair()`; (2) Stock Addition FG variant - menambah stok barang jadi bervarian `+active` via `ComLockerStockDualWrite::pair()`; (3) Jurnal Manufaktur via `ComJurnal` - Persediaan Barang Jadi (D) versus Persediaan Bahan Baku (K) dan Beban Assembling; (4) Registry Update ke `transaksi_registry`.
- **Komponen unik:** `_shoppingCart.php` bergelar *Cart Rebalancer Manager* - hanya `produksi` dan `konversi` yang memakai label ini; modul lain cukup "Cart Manager".
- **Cetakan:** `Printing.php` - Cetak SPK dan Lembar Hasil Assembling.

### 4.2 Modul `produksiproses` - Multi-Phase Manufacturing

- **jenisTr (6 nilai, satu segmen hierarkis):**

  | Kode | Fase |
  |:--:|:--|
  | `776` | Master Work Order Produksi Proses |
  | `7761` | Fase 1 - Persiapan & Pemotongan Bahan |
  | `7762` | Fase 2 - Assembling & Pengelasan |
  | `7763` | Fase 3 - Finishing & Coating |
  | `7764` | Fase 4 - Quality Control (QC) & Quality Assurance |
  | `7765` | Fase 5 - Final Packaging & Serah Terima Barang Jadi (FG) |

- **Mesin BOM:** `_processSelectProductAssembling.php::selectFase()` - menarik alokasi komponen BOM bervarian yang **khusus dikonsumsi pada fase produksi aktif** (rentang `7761` sampai `7765`), serta menghitung akumulasi nilai WIP dari fase sebelumnya dan mentransfer nilai HPP bertahap ke fase berikutnya. Inilah perbedaan kunci terhadap `produksi`: resolution tidak hanya berdasarkan `variant_id` tetapi juga **nomor fase**.
- **Entry:** `Create.php::index()`, `preview()`, `save()` mengunci stok bahan baku **fase aktif** pada `stock_locker` **dan** `stock_locker_variant` - satu-satunya blueprint yang secara eksplisit menyebut keduanya sekaligus di fase entry.
- **Eksekusi:** `FollowUp.php::doFollowup()`: (1) **WIP Transfer** - pindah status barang setengah jadi dari fase *N* ke fase *N+1*; (2) **Multi-Phase Dual-Write Rebalancing** - `ComLockerStockDualWrite::pair()` untuk pelepasan stok bahan baku dan akumulasi nilai barang jadi bervarian **pada fase akhir (`7765`)**; (3) **Jurnal Fase Produksi** via `ComJurnal` - Persediaan WIP per-fase (D) versus Bahan Baku (K) dan Beban Operasional Produksi.
- **Akumulasi biaya:** tabel "Perbedaan" menegaskan akumulasi biaya bahan baku, tenaga kerja, dan overhead dari fase awal hingga menjadi HPP Barang Jadi. Metode **FIFO HPP tidak disebut di modul ini** (hanya di `konversi` via `ComFifoProdukJadiVarian`), dan **biaya tenaga kerja atau routing tidak memiliki tabel sendiri** - tidak dispesifikasikan di sumber.
- **Cetakan:** `Printing.php` - Cetak **Kartu Router Produksi / SPK Fase**. Istilah "router" hanya muncul sekali, di sini.
- **Label view:** `ViewDetails.php` - Modal Detail (**Multi-Variant Safe**), sama dengan `distribusifg`, `distribusiproduksi`, `distribusisupplies`, `pindahgudang`, `opname`, dan `konversi`.

### 4.3 Perbandingan langsung `produksi` versus `produksiproses`

| Aspek | `produksi` | `produksiproses` |
|:--|:--|:--|
| Kode inti | `776` (tunggal) | `776` master + `7761`-`7765` |
| Resolusi BOM | `ComProduksiBom`, inherit-or-override per `variant_id` | `selectFase()`, per `variant_id` **plus** nomor fase |
| Akuntansi | Persediaan FG (D) vs BB (K) dan Beban Assembling | Persediaan WIP per-fase (D) vs BB (K) dan Beban Operasional |
| Stok yang dikunci | bahan baku `hold` | bahan baku fase aktif di `stock_locker` + `stock_locker_variant` |
| Output stok | `+active` FG varian | `+active` FG varian **hanya di `7765`** |
| Baris tabel Perbedaan | 3 | 3 |

---

## 5. Distribusi FG / Jasa / Produksi / Supplies

### 5.1 `distribusifg` - Finished Goods (4 jenisTr)

| Kode | Keterangan |
|:--:|:--|
| `583` | Pengiriman / Distribusi Finished Goods (Surat Jalan FG) |
| `585` | Distribusi FG Konsinyasi |
| `983` | Retur Distribusi Finished Goods |
| `773` | Serah Terima FG dari Divisi Produksi |

- **Entry:** `Create.php` - draf pengiriman barang jadi bervarian ke cabang penerima, mengunci stok FG (`hold`) **pada gudang pengirim**.
- **Eksekusi:** `FollowUp.php::doFollowup()` - (1) Dual-Write Stock Release via `ComLockerStockDualWrite::pair()`: `-active` gudang pengirim dan `+active` gudang penerima; (2) Jurnal Distribusi via `ComJurnal`: Persediaan Barang Jadi Cabang (D) versus Persediaan Barang Jadi Pusat (K); (3) log ke `transaksi_registry`.
- **Komponen unik:** **Surat Jalan FG Engine** (penomoran resmi dan cetakan) plus `Printing.php` khusus untuk cetak Surat Jalan FG dengan rincian varian barang.
- **Cross-reference faktual (dari `AGENTS_DISTRIBUSIFG.md`):** gateway **`583sc`** adalah *Complete/Final Step* dari gateway utama **`583`**, berada di file `application/modules/distribusifg/config/coTransaksiCore.php`. Ada bug: kuantitas global berkurang di gudang asal saat Step 3 diselesaikan, tetapi status serial number terkirim tidak di-update menjadi nonaktif (`status = 0`) atau tercatat keluar, karena `$this->sessData['items5_sum']` (sumber pengurangan S/N) kosong akibat tidak adanya extractor di gerbang finalisasi. Solusinya: gunakan atau modifikasi extractor `PreProdukSerialNumberExtractor` agar mendeteksi data scan serial number keluar dari data transaksi reguler (`items9_sum`), lalu memformatnya ke `$this->sessData['items5_sum']`; dan registrasikan extractor tersebut ke dalam array `pre` pada gerbang complete (`583sc`) di `coTransaksiCore.php`. Kepatuhan PHP 5.6: gunakan sintaks array klasik `array()` dan `isset($x) ? $x : $default`.

### 5.2 `distribusijasa` - Alokasi Jasa (2 jenisTr)

| Kode | Keterangan |
|:--:|:--|
| `3461` | Pengeluaran / Alokasi Jasa Internal (Internal Service Issue Voucher) |
| `3465` | Alokasi Jasa Konsinyasi / Subkontrak |

- **Mesin alokasi:** `_processSelectProduct.php` - *Service Allocation Selector*. **Input:** Kode Jasa, Divisi/Cabang Penerima, Nilai Alokasi Jasa. **Logika:** mengalokasikan nilai jasa langsung ke akun perkiraan biaya cabang atau divisi tujuan **tanpa melibatkan persediaan fisik**.
- **Eksekusi:** `FollowUp.php::doFollowup()` - (1) **Service Value Allocation**: update alokasi realisasi biaya divisi pada tabel **`transaksi_values`**; (2) Jurnal Distribusi Jasa via `ComJurnal`: Beban Jasa Divisi Penerima (D) versus Pendapatan atau Biaya Jasa Internal (K); (3) registry.
- **Ciri pembeda:** satu-satunya modul distribusi yang **tidak** memakai `ComLockerStockDualWrite`. Diberi label "**Non-Physical Service Issue Integration**", dan `Pola Kompleksitas`-nya menyebut "Direct COA Service Expense". Constraint: validasi COA cabang atau divisi penerima wajib lolos sebelum disimpan.

### 5.3 `distribusiproduksi` - Bahan Baku ke Floor Produksi (3 jenisTr)

| Kode | Keterangan |
|:--:|:--|
| `3683` | Distribusi / Pengeluaran Bahan Baku ke Produksi |
| `3685` | Distribusi Bahan Baku Konsinyasi |
| `9583` | Retur Sisa Bahan Baku Produksi ke Gudang |

- **Entry:** `Create.php` - draf bukti serah terima bahan baku bervarian ke **lantai produksi**, mengunci `hold` di **gudang utama**.
- **Eksekusi:** (1) `ComLockerStockDualWrite::pair()` mengurangi `-active` di gudang utama dan mengalokasikan stok **WIP floor**; (2) `ComJurnal`: **Barang Dalam Proses / WIP (D)** versus Persediaan Bahan Baku (K); (3) registry.
- **Komponen unik:** **Floor Stock Allocation** - bahan baku yang langsung dibebankan ke akun WIP produksi. Panduan developer menuntut presisi akun Barang Dalam Proses **per varian material**.
- **Pola retur:** `9583` memakai digit depan `9`, konsisten dengan `983` pada `distribusifg`, kecuali `distribusisupplies` yang memakai `2983` dengan prefix `2` (lihat temuan nomor 7 di bagian 10).

### 5.4 `distribusisupplies` - Bahan Penolong (3 jenisTr)

| Kode | Keterangan |
|:--:|:--|
| `3583` | Distribusi / Pengeluaran Supplies (Bon Supplies) |
| `3585` | Distribusi Supplies Konsinyasi |
| `2983` | Retur Pengeluaran Supplies |

- **Ini satu-satunya modul yang tidak memakai `ComLockerStockDualWrite`.** Helper khususnya adalah **`ComLockerStockSuppliesDualWrite::pair()`**.
- **Mesin item:** `_processSelectSupplies.php` dengan fungsi `select()` dan `remove()`. Mekanisme: memetakan identitas item `supplies_id` dan `variant_id` melalui **`resolveRequestItemIdentity()`**, menyusun **cart key format `supplies:{id}:{variant_id}`**, lalu mengeksekusi `ComLockerStockSuppliesDualWrite::pair()`.
- **Eksekusi:** (1) Dual-Write Stock Supplies Release - mengurangi stok active bahan penolong bervarian; (2) `ComJurnal`: **Beban Supplies (D)** versus Persediaan Supplies (K); (3) registry.
- **Nama file cetak:** `Printing.php` - Cetak **Bon** Pengeluaran Supplies (istilah "Bon", bukan "Surat Jalan"). Bandingkan `distribusiproduksi` yang memakai "Bon Pengeluaran Bahan Produksi".

---

## 6. Pergudangan: Pindah Gudang, Request Stok, Adjustment, Opname, Aset Management

### 6.1 `pindahgudang` - Transfer Stok (6 jenisTr, terbanyak di seluruh sistem)

| Kode | Keterangan |
|:--:|:--|
| `587` | Transfer Stok Kirim (Pengiriman Barang Antar-Gudang) |
| `687` | Transfer Stok Terima (Penerimaan Barang Antar-Gudang) |
| `1587` | Transfer Antar-Cabang Kirim |
| `1687` | Transfer Antar-Cabang Terima |
| `5587` | Transfer Supplies Kirim |
| `6687` | Transfer Supplies Terima |

- **Entry:** `Create.php` - form pemilihan **Gudang Asal `gudang_id_asal`** dan **Gudang Tujuan `gudang_id_tujuan`** plus daftar item barang bervarian yang dipindahkan. Dua kolom gudang ini adalah satu-satunya penyebutan nama kolom gudang yang eksplisit di seluruh sumber.
- **Eksekusi `FollowUp.php::doFollowup()` - model state in-transit tiga-kaki:**
  - Pada **Pengiriman** (`587` atau `1587`): kurangi stok **active** gudang asal (`-active`) dan tambahkan stok **transit** (`+hold` atau *in-transit*) via `ComLockerStockDualWrite::pair()`.
  - Pada **Penerimaan** (`687` atau `1687`): kurangi stok transit (`-hold`) dan tambahkan stok **active** gudang tujuan (`+active`) via `ComLockerStockDualWrite::pair()`.
  - **Jurnal Transfer** via `ComJurnal`: Persediaan Dalam Perjalanan atau Persediaan Gudang Tujuan (D) versus Persediaan Gudang Asal (K). Registry update.
- **Aturan kunci:** transaksi kirim **tidak boleh** langsung menambah stok gudang tujuan sebelum dilakukan proses terima (`687` atau `1687`). Inilah makna perbedaan status `hold` (transit) versus `active` (tersedia).
- **Komponen unik:** **Inter-Branch Transit Transfer** via **`viewIncompleteStepAntarCabang()`** - satu-satunya method bernama yang dijelaskan pada `FollowUp.php` di luar `doFollowup()`. Mengelola status transaksi transfer antar-cabang yang membutuhkan konfirmasi terima dari cabang penerima.
- **Catatan kontradiksi:** `Pola Kompleksitas` menyebut "Transfer Supplies via `_processSelectSupplies`", dan `jenisTr` mendaftarkan `5587` serta `6687` (Transfer Supplies), tetapi **file `_processSelectSupplies.php` tidak ada** di struktur controller `pindahgudang`, dan `FollowUp.php` hanya menyebut `ComLockerStockDualWrite::pair()` - bukan `ComLockerStockSuppliesDualWrite` (lihat temuan nomor 2 di bagian 10).

### 6.2 `requeststok` - Permintaan Stok (2 jenisTr)

| Kode | Keterangan |
|:--:|:--|
| `761` | Permintaan Stok Barang (Stock Requisition Order) |
| `763` | Permintaan Transfer Inter-Gudang |

- **Input selector `_processSelectProduct.php`:** Gudang Pemohon (*Destination Warehouse*), Gudang Pemenuh (*Source Warehouse*), Produk ID, **Variant ID**, dan Jumlah Permintaan.
- **Perilaku kunci - Non-Locking Requisition:** menyusun draf permintaan **tanpa mengunci stok fisik** sampai disetujui untuk transfer. Urutan status: **Draft > Approved > Fulfilled**.
- **Integrasi:** `FollowUp.php` meneruskan persetujuan permintaan menjadi **pesanan pengeluaran di modul `pindahgudang`** - otorisasi pengeluaran stok fisik terjadi di modul lain. Konsekuensi: `requeststok` **tidak** memanggil `ComJurnal` maupun `ComLockerStockDualWrite`; satu-satunya yang ia tulis adalah registry. Ini menjadikan `requeststok` satu-satunya blueprint tanpa `ComJurnal`.
- **Komponen unik kedua:** **Inter-Branch Warehouse Routing** - pemetaan gudang sumber dan pemohon antar-cabang secara otomatis.

### 6.3 `opname` - Stock Take (4 jenisTr)

| Kode | Keterangan |
|:--:|:--|
| `1119` | Stock Opname Fisik Gudang (Physical Count Sheet) |
| `2229` | Penyesuaian Selisih Opname Lebih |
| `2228` | Penyesuaian Selisih Opname Kurang |
| `3339` | Stock Opname Nilai & HPP Varian |

- **Mesin hitung:** `_shoppingCart.php::checklistOpname()` dan `checklistOpnameNote()` - mencatat hasil hitungan fisik per barang **dan per varian (`variant_id`)**, membandingkan dengan stok sistem pada **`stock_locker_variant`**, serta menghitung selisih unit secara otomatis. `_shoppingCart.php` di modul ini bergelar "**Checklist Opname Manager**", berbeda dari "Cart Manager" generik dan "Cart Rebalancer Manager" di `produksi` serta `konversi`.
- **Eksekusi:** `ComLockerStockDualWrite::pair()` menyesuaikan `stock_locker` dan `stock_locker_variant` sesuai angka hitungan fisik terbaru; `ComJurnal`: Persediaan Barang (D atau K) versus Selisih Opname (K atau D); registry.
- **Struktur:** punya controller tambahan **`Opname.php` - Specialized Opname Engine**. Modul lain tidak punya padanannya; `asetmanagement` punya `SetupDepresiasi.php` dan `adjustmentjurnal` punya `SyncTool.php`.
- **Klasifikasi:** `2229` (lebih) dan `2228` (kurang) dipisah menjadi dua jenis transaksi berbeda - berbeda dari `adjustment` yang memakai satu kode `999` untuk kedua arah.

### 6.4 `adjustment` - Penyesuaian Stok (1 jenisTr)

| Kode | Keterangan |
|:--:|:--|
| `999` | Adjustment Stok (Penyesuaian Persediaan Barang Bervarian) |

- **Input `Create.php`:** kuantitas **awal**, kuantitas **penyesuaian**, kuantitas **akhir**, dan **alasan adjustment** - empat field yang hanya modul ini yang menyebutkannya eksplisit.
- **COA selector:** `_processSelectRekeningAdjustment.php` dengan fungsi `select()` dan `remove()` - memilih **Akun Perkiraan Selisih Stok** (beban kerugian selisih stok atau pendapatan selisih lebih stok) yang dipasangkan dengan persediaan varian.
- **Eksekusi:** `ComLockerStockDualWrite::pair()` menyesuaikan `stock_locker` dan `stock_locker_variant` dengan aturan **sentinel**: `+active` jika selisih lebih, `-active` jika selisih kurang. `ComJurnal`: Persediaan Barang (D atau K) versus Beban atau Pendapatan Selisih Stok (K atau D). Registry.
- **Istilah kunci:** "**Dual-Write Reval Stock Adjustment**" dan "**Reval HPP Varian**" - menunjukkan penyesuaian HPP per varian, tetapi **tidak ada** `ComFifoProdukJadiVarian` di modul ini (berbeda dengan `konversi`).

### 6.5 `adjustmentjurnal` - Jurnal Umum dan Koreksi (2 jenisTr)

| Kode | Keterangan |
|:--:|:--|
| `9999` | Jurnal Penyesuaian Umum (Manual General Journal Voucher) |
| `9990` | Reversal / Koreksi Entri Jurnal |

- **Engine:** `_processSelectRekeningAdjustment.php` - **nama file identik dengan `adjustment`** tetapi fungsi berbeda. Di sini merupakan *GL Account Matching Engine* yang menerima **COA Debit dan Kredit, Nominal Debit, Nominal Kredit, serta Keterangan Transaksi**, dan memvalidasi **Total Debit - Total Kredit = 0** sebelum voucher disimpan (Trial Balance Balance Checker, secara real-time pada keranjang belanja jurnal).
- **Eksekusi:** **tidak** memakai `ComLockerStockDualWrite`. `ComJurnal` melakukan *Direct Posting* ke buku besar (tabel **`com_jurnal`**); registry. Inilah modul yang menempatkan pembukuan Adjustment Stok (`999`) dan jurnal penyesuaian (`9999`) pada dua jalur kode yang berdekatan - `999` versus `9999` - sehingga berisiko kebingungan prefix.
- **Komponen unik:** **`SyncTool.php` - Ledger Synchronization Tool`**.
- **Batas:** "Multi-Account GL Selector" - pemilihan baris debit dan kredit berpasangan **tanpa batasan jumlah akun**.

### 6.6 `asetmanagement` - Aset Tetap dan Depresiasi (3 jenisTr)

| Kode | Keterangan |
|:--:|:--|
| `421` | Perolehan / Acquisition Aset Tetap |
| `422` | Depresiasi / Penyusutan Rutin Bulanan Aset |
| `424` | Pelepasan / Disposal / Penjualan Aset Tetap |

- **Input depresiasi (`AutoDepresiasi.php` dan `AutoDepresiasiChecker.php`):** Masa Manfaat (Tahun), Metode Depresiasi (**Garis Lurus atau Saldo Menurun**), Nilai Perolehan, dan **Nilai Residu**. **Logika:** Cron atau Scheduler bulanan yang menghitung beban penyusutan aktiva tetap dan menghasilkan entri jurnal bulanan secara otomatis. Catatan: method `doFollowup()` di `FollowUp.php` modul ini tidak memanggil `ComJurnal`; jurnal depresiasi dihasilkan langsung oleh `AutoDepresiasi.php` sesuai Panduan Langkah 2.
- **Selector aset:** `_processSelectAsset.php` - input **Kategori Aset, Kode Inventaris, Lokasi/Penanggung Jawab, dan Harga Perolehan**; mengubah pembelian aktiva menjadi **kartu aset tetap ber-ID unik**.
- **Eksekusi:** (1) Asset Register Linkage - mencatat entri baru di **tabel inventaris aset tetap** (nama tabel literal tidak diberikan di sumber); (2) `ComJurnal`: **Aktiva Tetap (D) versus Kas atau Hutang (K)** untuk perolehan, atau **Beban Depresiasi (D) versus Akumulasi Penyusutan (K)** untuk depresiasi; (3) registry.
- **Komponen unik:** **Asset Disposal and Capital Gain/Loss Calculator** pada `424` - kalkulasi Laba atau Rugi pelepasan aset (Harga Jual versus Nilai Buku Aset).
- **Struktur tambahan:** `SetupDepresiasi.php` - Depreciation Method Setup; `Printing.php` - Cetak Kartu Aset Tetap.

### 6.7 `openbalance` - Saldo Awal Sistem (tanpa `jenisTr` eksplisit)

- **Peran sistem:** Penetapan Saldo Awal (*Cut-off Date Initial Balances*) untuk Go-Live sistem ERP.
- **CLI Batch:** **`CliTransaksi.php`** - *Batch Setup Saldo Awal*. **Input:** file **Excel atau JSON** berisi saldo awal COA, stok barang bervarian, piutang customer, dan hutang supplier. **Logika:** memproses inisialisasi saldo awal secara massal via CLI atau Background Task, menulis entri awal ke **`com_jurnal`**, **`transaksi_values`**, dan Dual-Write Stock Locker (`ComLockerStockDualWrite`).
- **UI:** `Create.php` - form input saldo awal **per-akun perkiraan** (COA balance initialization).
- **Eksekusi:** stok awal barang dan varian ditulis ke `stock_locker` dan `stock_locker_variant` dengan status `+active`; `ComJurnal`: **Modal atau Ekuitas Saldo Awal (K)** versus Aktiva, Persediaan, atau Piutang Saldo Awal (D); registry.
- **Otorisasi:** `Modul_Controller.php` melakukan inisialisasi **session otorisasi administrator atau akuntan** - satu-satunya blueprint yang menyebut kontrol otorisasi di base controller.
- **Bug struktural:** di bagian 2.3, tautan `FollowUp.php` menunjuk `application/modules/pembayaran/controllers/FollowUp.php` (lihat temuan nomor 1 di bagian 10).

---

## 7. Manajemen BOM (SOP & struktur data)

BOM.md adalah dokumen **normatif atau SOP** (*Standar Operasional Prosedur*), bukan blueprint. Standar kepatuhan yang dinyatakan: **ISO 9001:2015 Klausul 7.5 dan 8.5.6** serta **ISO 13485**. Dokumen ini tidak menyertakan nama modul, workspace, atau tanggal analisis.

### 7.1 Kebijakan Relasi dan Status Penguncian

- Relasi **Parent Item atau SKU** terhadap komponen penyusunnya wajib dikendalikan secara ketat untuk menjamin konsistensi kualitas produksi, akurasi pembelian bahan baku, dan validitas laporan keuangan.
- **Status PRODUKSI (`Locked`):** setelah BOM melewati tahap persetujuan, relasi **wajib dikunci total**. Hak akses tim **Produksi dan Purchasing (Pengadaan)** diatur sebagai *Read-Only*. Sistem **wajib menolak** manipulasi data langsung pada BOM aktif.
- **Status PENGEMBANGAN (`Open`):** relasi terbuka hanya berlaku pada lingkungan *sandbox*, produk purwarupa (*prototype*), atau draf revisi baru di bawah kendali tim **R&D atau Teknik**.

### 7.2 Matriks RBAC (6 Peran)

| Peran | Hak Akses BOM Aktif | Hak Akses Draf/Revisi | Otoritas Persetujuan |
|:--|:--|:--|:--|
| R&D / Engineer | Read-Only | Read, Write, **Create** | Mengajukan Perubahan (**ECR**) |
| Engineering Manager | Read-Only | Read, Write, **Edit** | Menyetujui Perubahan (**ECO Approval**) |
| Production / PPIC | Read-Only | Read-Only | Validasi Kebutuhan Lantai Produksi |
| Procurement / Buyer | Read-Only | Read-Only | Validasi Ketersediaan Material Vendor |
| Finance / Costing | Read-Only | Read-Only | Validasi Dampak Biaya (**Cost Rollover**) |
| System Administrator | **Full System Access** | **Full System Access** | Hanya untuk Keperluan Pemeliharaan IT |

Pola ditegakkan: **tidak ada peran non-admin yang bisa Write pada BOM aktif** - seluruh jalur revisi wajib melalui ECO.

### 7.3 Alur ECO Workflow (Engineering Change Order)

1. **[BOM Aktif: Rev A] (LOCKED)**.
2. User memicu **ECR atau Usulan Perubahan** - AUDIT TRAIL LOG: "User X membuat draf perubahan pada Jam Y".
3. **[Buat Duplikat: Rev B] (STATUS: DRAFT / OPEN)** - **Simulasi Biaya dan Scrap Factor**.
4. **Validasi dan Uji Coba Lintas Departemen**.
5. **[Persetujuan ECO oleh Manager]** - AUDIT TRAIL LOG: "Manager Z menyetujui ECO-002 pada Jam Y".
6. **Penerapan Tanggal Efektif / Effectivity Date**.
7. **[Rev A di-Arsip] menjadi [Rev B Menjadi Aktif] (LOCKED)**.

Aturan: perubahan material atau struktur komponen **tidak boleh** langsung *overwrite* data aktif; setiap revisi wajib melalui dokumen ECO dengan perekaman jejak audit otomatis.

### 7.4 Scrap Factor dan Cost Rollover

**Rumus Scrap Factor** (dimuat sebagai persamaan LaTeX pada sumber):

`Kuantitas Kebutuhan Total = Kuantitas Bersih Produk / (1 - Persentase Scrap)`

Contoh angka yang dipakai dokumen: produk membutuhkan Kabel sepanjang **10 Meter**, estimasi sisa potongan terbuang (*scrap*) di lantai fabrikasi **5% (0.05)**, maka kuantitas yang diinput ke BOM adalah `10 / (1 - 0.05)` = **10.53 Meter**.

**Cost Rollover** - dieksekusi setiap kali status **Rev B** bertransisi dari *Draft* menjadi *Active (Locked)*:

1. Sistem membaca **harga satuan terbaru** dari master data material (**Standard atau Moving Average Cost**).
2. Sistem mengalikan harga dengan kuantitas komponen (**termasuk Scrap Factor**).
3. Sistem mengakumulasikan total biaya komponen ditambah **biaya tenaga kerja (*Routing Cost*)** untuk memperbarui **Harga Pokok Produksi (HPP)** produk target secara otomatis.

### 7.5 Struktur Standar Tabel Database BOM dan Log Audit (kolom wajib)

| Kelompok | Nama Kolom | Jenis | Deskripsi | Contoh Parameter |
|:--|:--|:--|:--|:--|
| **Data Utama** | Parent ID | Teks / Kode | ID unik produk target akhir | `PROD-XYZ-01` |
| | Component ID | Teks / Kode | ID unik komponen penyusun | `COMP-RES-10K` |
| | Net Qty | Desimal | Kuantitas bersih yang menempel di produk | `4.00` |
| | Scrap (%) | Desimal | Estimasi kehilangan material | `0.05` (artinya 5%) |
| | Total Qty | Desimal | `Net Qty / (1 - Scrap)` | `4.21` |
| | Satuan (UoM) | Pilihan | Unit pengukuran material | `pcs`, `meter`, `kg` |
| **Kontrol** | Status Relasi | Pilihan | Status penguncian data | `Locked` / `Open` |
| | Versi/Revisi | Teks | Identifikasi siklus iterasi BOM | `Rev B.01` |
| | Tanggal Efektif | Tanggal/Jam | Waktu aktivasi penggunaan BOM di pabrik | `2026-07-01 00:00:00` |
| **Audit Trail** | Diubah Oleh | Teks | Akun pengguna digital yang mengubah data | `budi.engineering` |
| | Waktu Ubah (otomatis) | Timestamp | Tanggal dan jam presis aktivitas modifikasi | `2026-06-26 11:15:00` |
| | Jenis Aksi | Pilihan | Operasi data yang terdeteksi database | `INSERT` / `UPDATE` / `LOCK` |
| | Nilai Lama | Teks/JSON | Data sebelum diubah (untuk kebutuhan *rollback*) | `{"Qty": 4.00}` |
| | Nilai Baru | Teks/JSON | Data setelah diubah | `{"Qty": 4.50}` |
| | Referensi ECO | Teks | Nomor dokumen dasar perubahan, wajib diisi | `ECO-2026-009` |

Total **14 kolom wajib** dalam 3 kelompok: 6 Data Utama, 3 Kontrol, 5 Audit Trail. Perhatikan konsistensi angka pada sumber: `Net Qty 4.00` dengan `Scrap 0.05` menghasilkan `Total Qty 4.21` (4 / 0.95 = 4.2105), dan contoh kabel 10 menghasilkan 10.53 - keduanya memakai pembulatan dua desimal.

### 7.6 Pemetaan Implementasi pada Tiga ERP

| Aspek | Odoo (PLM dan Manufacturing) | SAP (S/4HANA atau ECC) | ERP Kustom (Aplikasi Lokal) |
|:--|:--|:--|:--|
| **Mekanisme Penguncian** | Dokumen **ECO (Engineering Change Order)** di modul **PLM**. Saat ECO dibuat, Odoo otomatis menduplikasi BOM asli menjadi versi *Draft* (v2); BOM versi produksi tetap terkunci (v1) hingga ECO divalidasi ke tahap *Effective* | **ECM (Engineering Change Management)** dengan **Change Number**, transaksi **`CC01`**. Tanpa nomor perubahan yang valid, tabel **`MAST`** (Relasi Material ke BOM) dan **`STPO`** (Item BOM) menolak seluruh perintah modifikasi | Wajib memasukkan **Nomor Dokumen ECO** dan **Alasan Perubahan** melalui **dialog kontrol perubahan terintegrasi** sebelum menyimpan komposisi BOM baru |
| **Pencatatan Audit Trail** | **Chatter Log** di bilah bawah dokumen. Setiap penambahan, penghapusan, atau perubahan baris material dicatat permanen sebagai teks kronologis yang tidak dapat dimanipulasi pengguna maupun administrator | Tabel **CDHDR** (Change Document Header) dan **CDPOS** (Change Document Position). Log audit merekam alamat IP terminal komputer, ID pengguna SAP, nilai mentah hex database lama versus baru, dan alasan penyesuaian fungsional secara forensik | Tabel **`data__history`** dengan `mdl_name = 'MdlProdukKomposisi'` dan `label = 'komposisi'`. Snapshot **`old_content`** dan **`new_content`** ter-*encode* via **`blobEncode`**, menghasilkan diff perubahan bahan (dihapus, ditambah, diubah) yang human-readable beserta referensi ECO dan Alasan Perubahan pada kolom **`new_content_intext`**. Disajikan di tab riwayat **`historiKomposisi`** |

Hanya versi **ERP Kustom** yang menyebut nama kode dan tabel konkret (`data__history`, `MdlProdukKomposisi`, `blobEncode`, `historiKomposisi`), dan itulah yang paling dekat dengan pola `new_san_variant`.

### 7.7 Checklist Audit Kepatuhan (minimal satu kali per kuartal)

1. **Uji Penetrasi Kunci** - coba melakukan perubahan data BOM berstatus *Locked* menggunakan akun staf Produksi atau Gudang; sistem harus memblokir tindakan tersebut dan memunculkan pesan `Error: Access Denied`.
2. **Uji Imutabilitas Log** - fungsi hapus (*Delete/Purge*) pada tabel log *Audit Trail* harus **dimatikan total**, termasuk untuk tingkat pengguna *Super Admin*.
3. **Validasi Konsistensi Biaya** - ambil sampel **5 produk aktif** secara acak, jalankan simulasi *Cost Rollover*, dan pastikan nilai HPP sistem cocok dengan akumulasi harga pembelian riil dari komponen penyusun terbaru.
4. **Verifikasi Scrap** - evaluasi apakah selisih antara stok sistem dengan stok fisik di gudang diakibatkan oleh nilai *Scrap Factor* pada BOM yang terlalu rendah atau terlalu tinggi.

### 7.8 Ketegangan antara BOM.md dan Blueprint `produksi`

| Aspek | BOM.md | `blueprint_produksi.md` |
|:--|:--|:--|
| Tabel relasi | Disyaratkan ada (`Parent ID`, `Component ID`), nama tabel **tidak** ditetapkan | **`produksi_bom_detail`** |
| Varian | **Tidak ada** konsep `variant_id` atau `variant_id = 0` | Inherit-or-Override berbasis `variant_id` |
| Scrap dan Cost | Scrap Factor, Cost Rollover, HPP | **Tidak ada** |
| ECO | Wajib (`ECO-2026-009`, `CC01`, dialog ECO) | **Tidak ada** |
| HPP | Routing Cost ditambah material | Beban Assembling (nilai, tanpa formula) |

Kesenjangan ini nyata: sistem runtime menggunakan `produksi_bom_detail` dan `variant_id`, sedangkan SOP mendefinisikan skema kolom yang tidak memuat `variant_id`, tidak menetapkan nama tabel, dan tidak menyebut override berbasis varian.

---

## 8. Konversi Stok (ringkas)

Rujukan penuh: `blueprint_konversi.md`. Ringkas untuk konteks:

| Kode | Keterangan |
|:--:|:--|
| `334` | Konversi Satuan Barang (Unit Conversion, misalnya Dus ke Pcs) |
| `335` | Repacking / Pengemasan Ulang Produk |
| `1334` | Konversi Produk A ke Produk B |
| `2334` | Konversi Supplies / Bahan Penolong |

- **Dua file engine:** `_processSelectProductConvertion.php` (konversi produk) dan `_processSelectProductConvertionSatuan.php` (faktor rasio satuan). Logika: pengurangan barang asal (sumber) dan pembentukan barang hasil konversi (target), memperhitungkan **faktor konversi unit** dan `variant_id`; mengunci stok barang asal pada status `hold` di `ComLockerStockDualWrite`.
- **Eksekusi (`FollowUp.php::doFollowup()`):** (1) `ComLockerStockDualWrite::pair()` - `-active` barang asal dan `+active` barang hasil konversi secara atomik; (2) **`ComFifoProdukJadiVarian`** - mencatat lot FIFO HPP hasil konversi (FIFO **re-batching**); (3) `ComJurnal` - Persediaan Hasil Konversi (D) versus Persediaan Barang Asal (K); (4) registry.
- **Contoh rasio yang dipakai dokumen:** **1 Dus = 12 Pcs**, dengan HPP proporsional.
- `Create.php` melakukan kalkulasi rasio HPP saat entry. `_shoppingCart.php` bergelar "Cart Rebalancer Manager", sama seperti `produksi`.

---

## 9. Standar & Aturan Konsistensi

### 9.1 Kerangka Modul (homogen di 15 dari 15 blueprint)

```
application/modules/<modul>/
|-- config/
|   |-- coTransaksiCore.php       # aturan bisnis / gateway
|   |-- coTransaksiUi.php         # aturan UI
|   |-- coTransaksiLayout.php     # aturan layout
|   +-- coTransaksiValues.php     # aturan nilai / transaksi_values
|-- controllers/
|   |-- Modul_Controller.php      # base: __construct() load 4 config
|   |-- Create.php                # index(), preview(), save()
|   |-- FollowUp.php              # doFollowup()
|   |-- Transaksi.php             # daftar
|   |-- ActivityReport.php        # laporan
|   |-- History.php               # riwayat
|   |-- Printing.php              # cetak
|   |-- ViewDetails.php           # modal detail
|   |-- _shoppingCart.php         # cart
|   +-- _process*.php             # selector / engine khusus
+-- views/
    |-- transaksi_modul.php
    |-- shoppingCart.php
    +-- printing.php
```

### 9.2 Aturan Eksekusi (pola konsisten)

1. **Lock di Save, Mutate di FollowUp.** Semua modul dengan `Create.php::save()` mengunci stok berstatus `hold`; hanya `FollowUp.php::doFollowup()` yang mengubah `-active` dan `+active`.
2. **Tiga helper wajib.** Setiap mutasi stok memakai `ComLockerStockDualWrite::pair()` (atau `ComLockerStockSuppliesDualWrite::pair()` pada supplies); setiap jurnal lewat `ComJurnal`; setiap eksekusi menulis `transaksi_registry`.
3. **Status stok bermakna:** `hold` berarti terkunci (draf, transit, in-transit, target konversi, bahan yang di-hold); `active` berarti tersedia.
4. **Variant safety:** `variant_id` wajib dipertahankan di semua operasi stok; `ViewDetails.php` diberi label "Multi-Variant Safe" pada 7 modul.
5. **Nominal `jenisTr` selalu didokumentasikan** di bagian 1 tiap blueprint, kecuali `openbalance` yang menggantinya dengan narasi "Peran Sistem".

### 9.3 Aturan Teknis

| Aturan | Nilai | Cakupan |
|:--|:--|:--|
| Target runtime | **PHP 5.6** | 15 dari 15 blueprint |
| Linting | `C:\xampp\php\php.exe -l` | 15 dari 15 blueprint ("Langkah 3") |
| UAT | Update `docs/uat-checklist.md` | 15 dari 15 blueprint ("Langkah 3") |
| Sintaks PHP 5.6 | `array()` klasik; `isset($x) ? $x : $default` | `AGENTS_DISTRIBUSIFG.md` |
| Standar implementasi | "Single Variant Standard & **Dual-Write Rollout**" | Header 15 dari 15 blueprint |
| Workspace | `new_san_variant` | 15 dari 15 blueprint |

### 9.4 Standar Data (dari BOM.md)

- Kepatuhan: **ISO 9001:2015 Klausul 7.5 dan 8.5.6**, serta **ISO 13485**.
- Status relasi: `Locked` atau `Open`; revisi berformat `Rev B.01`; referensi ECO wajib (contoh `ECO-2026-009`).
- Satuan (UoM) yang dicantumkan: `pcs`, `meter`, `kg`.
- Audit kuartalan: 4 uji pada bagian 7.7.

### 9.5 Tabel Inferensi Yok (konsisten di dokumen sumber)

| Tabel | Peran | Dinyatakan di |
|:--|:--|:--|
| `stock_locker` | Stok `active` dan `hold` per gudang | produksi, produksiproses, konversi, opname, adjustment, openbalance |
| `stock_locker_variant` | Rincian stok per `variant_id` | produksiproses, opname, adjustment, openbalance |
| `stock_locker` (transit) | Status `+hold` = in-transit | pindahgudang |
| `transaksi_registry` | Log step registrasi | 13 dari 15 blueprint |
| `transaksi_values` | Alokasi realisasi biaya divisi | distribusijasa, openbalance |
| `com_jurnal` | Buku besar dan jurnal | adjustmentjurnal, openbalance |
| `produksi_bom_detail` | Detail atau formula BOM per varian | produksi |
| `data__history` | Audit trail komposisi | BOM.md |

---

## 10. Temuan Lintas-Dokumen & Kontradiksi

1. **BUG PATH `openbalance` bagian 2.3.** Tautan `FollowUp.php` menunjuk `application/modules/pembayaran/controllers/FollowUp.php` sehingga seharusnya `openbalance`. Ini satu-satunya tautan ke modul yang tidak ada di dokumen mana pun. **Versi yang lebih konsisten adalah struktur bagian 4.1 `openbalance`.**

2. **KONTRADIKSI INTERNAL `pindahgudang`.** `Pola Kompleksitas` menjanjikan "Transfer Supplies via `_processSelectSupplies`" dan `jenisTr` mendaftarkan `5587` serta `6687` (Transfer Supplies), tetapi **file `_processSelectSupplies.php` tidak ada** di struktur controller `pindahgudang`, dan `FollowUp.php` hanya menyebut `ComLockerStockDualWrite::pair()`, bukan `ComLockerStockSuppliesDualWrite`. **Versi yang lebih konsisten adalah definisi bagian 1 dan 2.3** (`ComLockerStockDualWrite`); Transfer Supplies tampaknya warisan dari `distribusisupplies`.

3. **PATH DOKUMEN SALAH (15 dari 15).** Bagian penutup semua blueprint menautkan `file:///c:/xampp/htdocs/new_san_variant/blueprint_<modul>.md`, sedangkan sumber aktual ada di `W:\_md_result\file_md_san\`. Selain itu, **15 blueprint tidak pernah menautkan `dev-jurnal.md`** meski diklaim sudah diterbitkan.

4. **WORKSPACE BERBEDA.** `AGENTS_DISTRIBUSIFG.md` menunjuk `file:///w:/everest_17jun/application/modules/distribusifg/config/coTransaksiCore.php`, sedangkan 15 blueprint menyebut workspace `new_san_variant`. **Versi yang lebih mutakhir adalah `new_san_variant`** (semua blueprint bertanggal 2026-07-29, sementara `AGENTS_DISTRIBUSIFG.md` tidak bertanggal).

5. **CATATAN TEMUAN PADA SUMBER.** `blueprint_pindahgudang.md` baris 57 memuat label `Inter-Branch Transit Transfer (viewIncompleteStepAntarCabang)` yang ditulis dengan satu kata asing yang tidak valid; kata `Conversi` pada `blueprint_konversi.md` baris 12 menyimpang dari ejaan Indonesia "konversi"; dan `blueprint_adjustment.md` bagian 3 baris 54 menyebut "aturan sentinel" tanpa mendefinisikan parameter sentinel-nya.

6. **ATURAN KONSISTENSI TIDAK KONSISTEN.** `produksiproses` mengunci bahan baku fase aktif di `stock_locker` **dan** `stock_locker_variant`, sedangkan `produksi` hanya menyebut "mengunci stok bahan baku (`hold`)". Tidak dijelaskan apakah `produksi` menulis keduanya atau hanya layer generik.

7. **RETUR PREFIX TIDAK SERAGAM.** Prefix `9` dipakai pada `distribusifg` (`983`) dan `distribusiproduksi` (`9583`), tetapi prefix `2` dipakai pada `distribusisupplies` (`2983`). Pola "kode berakhiran 83 untuk release dan 9 untuk retur" berlaku di dua modul serta dilanggar di modul ketiga.

8. **DUAL LOCKER HELPER TIDAK DISERAGAMKAN.** 13 modul memakai `ComLockerStockDualWrite`, satu modul (`distribusisupplies`) memakai `ComLockerStockSuppliesDualWrite`, dan dua modul (`requeststok`, `adjustmentjurnal`) tidak memakai dual-write sama sekali. Tidak ada dokumen yang menjelaskan batas pemisahan kedua helper tersebut.

9. **FIFO TIDAK KONSISTEN.** Hanya `konversi` yang menyebut `ComFifoProdukJadiVarian` untuk lot FIFO HPP. `produksi`, `produksiproses`, `opname` (`3339` - "Opname Nilai & HPP Varian"), dan `adjustment` ("Reval HPP Varian") semuanya menyebut HPP tanpa menyebut mekanisme FIFO yang sama.

10. **TABRakan KODE `jenisTr` `776`.** Dipakai `produksi` ("Assembling Produksi") **dan** `produksiproses` ("Master Work Order Produksi Proses"). Keduanya membuat header Work Order; `produksiproses` menambahkan sub-fase `7761` sampai `7765`.

11. **`ComJurnal` TIDAK UNIFORM.** 14 dari 15 blueprint memanggilnya. `requeststok` tidak, karena non-locking dan handoff ke `pindahgudang`. `openbalance` memanggilnya di `FollowUp.php` sekaligus menulis langsung ke `com_jurnal` via `CliTransaksi.php`, sehingga ada pathway ganda.

12. **KESENJANGAN BOM SOP dan RUNTIME** (detail di bagian 7.8): SOP tidak memuat `variant_id` atau `variant_id = 0`, tidak menetapkan nama tabel, dan tidak menyebut `produksi_bom_detail`; runtime tidak menyebut ECO, scrap factor, cost rollover, atau routing cost.

13. **AUTHORITY TABEL BOM BERDIFERENSI.** SOP menyatakan tabel `MAST` dan `STPO` yang merujuk SAP; ERP Kustom hanya menyebut `data__history`; Odoo nol. Tidak ada tabel runtime `new_san_variant` yang ditetapkan, kecuali implisit `produksi_bom_detail`.

14. **DUPLIKASI NAMA FILE ENGINE.** `_processSelectRekeningAdjustment.php` ada di `adjustment` (pilih COA selisih stok) **dan** `adjustmentjurnal` (GL debit dan kredit plus validasi balance), dengan nama sama dan tanggung jawab berbeda. `_processSelectProduct.php` ada di `distribusijasa` (service allocation) **dan** `requeststok` (variant stock requisition), dengan nama sama dan domain berbeda. Ini dapat diterima secara teknis bila keduanya berada di folder modul berbeda, tetapi nama file saja tidak unik sebagaiidentifier.

15. **STATUS "COMPLETED AND VERIFIED" DILEMPA DOKUMEN.** 15 dari 15 menutup dengan "Pekerjaan Selesai (Completed & Verified)" padahal tidak ada metrik, hasil uji, atau temuan tersisa - namun `AGENTS_DISTRIBUSIFG.md` mendokumentasikan **bug aktif** di `distribusifg` (`583sc`) pada workspace sebelumnya. Status "Verified" tidak dapat dipertahankan lintas-dokumen.

16. **`openbalance` TIDAK PUNYA `jenisTr`.** Seluruh blueprint lain mencantumkan kode numerik di bagian 1; `openbalance` menggantinya dengan narasi "Peran Sistem". Ini membuat modul go-live tidak punya identitas transaksi numerik.

17. **DATE STAMP SERAGAM.** 15 dari 15 bertanggal `2026-07-29`. `BOM.md` tidak bertanggal, namun memakai contoh `ECO-2026-009` serta tanggal `2026-07-01` dan `2026-06-26`. `AGENTS_DISTRIBUSIFG.md` juga tanpa tanggal.

---

## 11. Lampiran: Daftar File Sumber

| Nama File | Ukuran | Topik H1 | Peran |
|:--|--:|:--|:--|
| `blueprint_produksi.md` | 5.272 B (108 baris) | BLUEPRINT CETAK BIRU MODUL: PRODUKSI (MANUFAKTUR & ASSEMBLING) | Blueprint modul `produksi` - assembling FG, BOM inherit-or-override `variant_id`, dual-write bahan baku ke FG (`776`) |
| `blueprint_produksiproses.md` | 5.450 B (112 baris) | BLUEPRINT CETAK BIRU MODUL: PRODUKSI PROSES (MULTI-PHASE MANUFACTURING) | Blueprint modul `produksiproses` - 5 fase (`7761`-`7765`), `selectFase()`, WIP tracking, akumulasi HPP bertahap |
| `blueprint_distribusifg.md` | 4.280 B (103 baris) | BLUEPRINT CETAK BIRU MODUL: DISTRIBUSI FINISHED GOODS (FG) | Blueprint modul `distribusifg` - Surat Jalan FG, transfer stok antar-gudang (`583`/`585`/`983`/`773`), dual-write release |
| `blueprint_distribusijasa.md` | 4.577 B (107 baris) | BLUEPRINT CETAK BIRU MODUL: DISTRIBUSI JASA (SERVICE ALLOCATION & ISSUANCE) | Blueprint modul `distribusijasa` - alokasi jasa internal dan konsinyasi (`3461`/`3465`), tanpa stok fisik, update `transaksi_values` |
| `blueprint_distribusiproduksi.md` | 4.295 B (102 baris) | BLUEPRINT CETAK BIRU MODUL: DISTRIBUSI BAHAN PRODUKSI | Blueprint modul `distribusiproduksi` - Floor Stock Allocation bahan baku ke WIP (`3683`/`3685`/`9583`) |
| `blueprint_distribusisupplies.md` | 4.835 B (107 baris) | BLUEPRINT CETAK BIRU MODUL: DISTRIBUSI SUPPLIES (BAHAN PENOLONG) | Blueprint modul `distribusisupplies` - `ComLockerStockSuppliesDualWrite`, `resolveRequestItemIdentity()`, cart key `supplies:{id}:{variant_id}` (`3583`/`3585`/`2983`) |
| `blueprint_pindahgudang.md` | 4.846 B (107 baris) | BLUEPRINT CETAK BIRU MODUL: PINDAH GUDANG (STOCK TRANSFER) | Blueprint modul `pindahgudang` - 6 jenisTr transfer, state in-transit `hold` ke `active`, `viewIncompleteStepAntarCabang()`, kolom `gudang_id_asal` dan `gudang_id_tujuan` |
| `blueprint_requeststok.md` | 4.594 B (107 baris) | BLUEPRINT CETAK BIRU MODUL: REQUEST STOK (INTER-WAREHOUSE STOCK REQUISITION) | Blueprint modul `requeststok` - Non-Locking Requisition (`761`/`763`), handoff approval ke `pindahgudang` |
| `blueprint_opname.md` | 4.780 B (108 baris) | BLUEPRINT CETAK BIRU MODUL: OPNAME (STOCK OPNAME) | Blueprint modul `opname` - `checklistOpname()` per varian, `stock_locker_variant` versus fisik, 4 jenisTr termasuk `3339` HPP varian |
| `blueprint_adjustment.md` | 4.750 B (105 baris) | BLUEPRINT CETAK BIRU MODUL: ADJUSTMENT (PENYESUAIAN STOK) | Blueprint modul `adjustment` - `999`, COA selisih stok via `_processSelectRekeningAdjustment`, aturan sentinel `+active` dan `-active`, Reval HPP varian |
| `blueprint_adjustmentjurnal.md` | 4.655 B (107 baris) | BLUEPRINT CETAK BIRU MODUL: ADJUSTMENT JURNAL (MANUAL JOURNAL ENTRIES & CORRECTIONS) | Blueprint modul `adjustmentjurnal` - jurnal umum `9999` dan reversal `9990`, GL balance checker (Debit sama dengan Kredit), direct posting `com_jurnal`, `SyncTool.php` |
| `blueprint_asetmanagement.md` | 5.385 B (115 baris) | BLUEPRINT CETAK BIRU MODUL: ASET MANAGEMENT (FIXED ASSETS & DEPRECIATION) | Blueprint modul `asetmanagement` - perolehan `421`, depresiasi `422`, disposal `424`, cron `AutoDepresiasi.php`, Capital Gain/Loss, `_processSelectAsset.php` |
| `BOM.md` | 8.799 B (97 baris) | Standar Operasional Prosedur (SOP) Manajemen Data Bill of Materials (BOM) | **Dokumen normatif atau SOP** - ISO 9001:2015 K7.5 dan 8.5.6 serta ISO 13485; ECO/ECR workflow, RBAC 6 peran, Scrap Factor, Cost Rollover, 14 kolom tabel wajib, pemetaan Odoo/SAP/ERP Kustom, checklist audit kuartalan |
| `AGENTS_DISTRIBUSIFG.md` | 1.356 B (22 baris) | Rencana Kerja: Penyelarasan Mutasi Serial Number - Modul Pengiriman Barang (Delivery Note / DN) | **Dokumen implementasi atau bug-fix** (bukan blueprint) - bug `items5_sum` kosong di gateway `583sc`, solusi `PreProdukSerialNumberExtractor` dari `items9_sum`, workspace `everest_17jun` |
| `blueprint_konversi.md` | 5.436 B (112 baris) | BLUEPRINT CETAK BIRU MODUL: KONVERSI STOK & SATUAN | Blueprint modul `konversi` - konversi satuan, repacking, A ke B, supplies (`334`/`335`/`1334`/`2334`), rasio 1 Dus = 12 Pcs, FIFO `ComFifoProdukJadiVarian` |
| `blueprint_openbalance.md` | 4.685 B (104 baris) | BLUEPRINT CETAK BIRU MODUL: OPEN BALANCE (SALDO AWAL SISTEM) | Blueprint modul `openbalance` - `CliTransaksi.php` impor Excel/JSON massal, equity cut-off go-live, stok awal `+active` per varian, otorisasi admin dan akuntan |

**Total: 16 file, 1.853 baris, 75.377 byte.**
