# 📘 AGENTIC BLUEPRINT: MODUL KONVERSI STOK (CI3 HMVC - INTEGRASI MODEL BASE ERP)

> **PETUNJUK UNTUK AI AGENT / VS CODE EXTENSION:**
> 1. ERP ini MENGGUNAKAN MODEL BASE TERPUSAT: `MdlTransaksi` (Header) dan `MdlTransaksiData` (Detail). DILARANG menulis query insert/update manual ke database.
> 2. Tugas utama Anda adalah menyusun konfigurasi array data (payload) konversi stok, lalu mengeksekusinya via Model Base tersebut.
> 3. Patuhi aturan kompatibilitas PHP 5.6, arsitektur CodeIgniter 3, dan aturan bisnis legacy di bawah ini.

---

## 1. ALUR KERJA UTAMA (WORKFLOW)

```mermaid
graph TD
    A[Pilih Produk Non-Varian] --> B[Masuk ke Keranjang Sementara]
    B --> C[Input Jumlah Stok & Pilih Varian Target]
    C --> D{Produk Sudah Varian?}
    D -- Belum --> E[Redirect: Menu Edit Produk / Switch ke Varian]
    E --> F[Kembali ke Keranjang]
    D -- Sudah --> F[Simpan Request Konversi]
    F --> G[Status: Pending Approval]
    G --> H[Approval Konversi Stok]
    H --> I[Stok Berpindah & Status: Approved]
```

---

## 2. ATURAN INTEGRASI MODEL BASE ERP (MODEL RE-USE DESIGN)

AI Agent wajib memuat (*load*) dan menggunakan Model Base bawaan ERP berikut untuk melakukan penyimpanan transaksi:

*   **Model Header**: `$this->load->model('MdlTransaksi');`
*   **Model Detail**: `$this->load->model('MdlTransaksiData');`

### 2.1 Pola Pengisian Data Konversi Stok
Proses konversi stok ini memanfaatkan fungsi bawaan transaksi internal (mirip *Stock Adjustment/Mutasi*) dengan ketentuan pengisian kolom sebagai berikut:
*   `kode_transaksi` / `jenis_transaksi` = `'KONVERSI_STOK'`
*   `status` = `'PENDING'` (Saat Request) dan `'APPROVED'` (Saat Approval)

### 2.2 Struktur Payload Double-Entry untuk MdlTransaksiData
Setiap item di dalam keranjang sementara wajib dipecah menjadi sepasang larik detail (*double-entry items*):
1.  **Larik Item Pengurangan (Asal)**:
    *   `id_produk` = ID Produk Non-Varian Asal
    *   `qty` = Nilai minus dari kuantitas yang diajukan (Contoh: `-50.0000`)
2.  **Larik Item Penambahan (Tujuan)**:
    *   `id_produk` = ID Varian Produk Tujuan
    *   `qty` = Nilai plus dari kuantitas yang diajukan (Contoh: `50.0000`)

---

## 3. ATURAN BISNIS LEGACY (BUSINESS CONTROLS)

*   **[SoD-01] Pemisahan Tugas**: Validasi di tingkat Controller bahwa pengguna yang sedang login saat menekan tombol *Approve* (`approved_by`) **TIDAK BOLEH SAMA** dengan pengguna yang membuat dokumen awal (`requested_by` / `created_by`).
*   **[INV-01] Larangan Negative Stock**: Sebelum memicu proses *Approval*, panggil fungsi pengecekan stok dari Model Persediaan Base Anda untuk memastikan sisa stok riil produk non-varian tidak lebih kecil dari jumlah kuantitas yang akan dikurangi.
*   **[L-04] Ketepatan Tipe Data**: Semua nilai kuantitas wajib dilemparkan sebagai tipe data string angka presisi (untuk mendukung tipe database `DECIMAL`). Jangan gunakan operasi matematik bawaan `float` PHP 5.6 demi mencegah pembulatan tidak akurat.

---

## 4. PANDUAN IMPLEMENTASI CONTROLLER UNTUK AI AGENT

Gunakan cuplikan struktur kode di bawah ini sebagai acuan utama bagi AI Agent dalam merangkai interaksi fungsi *Controller* menuju Model Base ERP Anda:

```php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Stock_conversion extends MX_Controller {

    public function __construct() {
        parent::__construct();
        // Load Model Base ERP bawaan sistem
        \(this->load->model('MdlTransaksi');\)this->load->model('MdlTransaksiData');
    }

    /**
     * Menyimpan Request Konversi ke Model Base Transaksi
     */
    public function save_request() {
        \(cart_session =\)this->session->userdata('conversion_cart');
        \(user_id =\)this->session->userdata('user_id');
        \(warehouse_id =\)this->input->post('warehouse_id');

        // 1. Susun Data Header sesuai konfigurasi MdlTransaksi
        \$data_header = array(
            'jenis_transaksi' => 'KONVERSI_STOK',
            'id_gudang'       => \$warehouse_id,
            'status'          => 'PENDING',
            'created_by'      => \$user_id
        );

        // Eksekusi insert header via Model Base ERP
        \$id_transaksi = \(this->MdlTransaksi->insert_data(\)data_header);

        if (\$id_transaksi) {
            // 2. Susun Data Detail (Double-Entry) untuk MdlTransaksiData [L-04]
            foreach (\(cart_session as\)item) {
                
                // DATA MINUS (Mengurangi Produk Non-Varian)
                \$detail_minus = array(
                    'id_transaksi' => \$id_transaksi,
                    'id_produk'    => \$item['product_id_asal'],
                    'qty'          => (string)(\$item['qty_convert'] * -1), // Nilai MINUS
                    'hpp'          => \$item['hpp']
                );
                \(this->MdlTransaksiData->insert_detail(\)detail_minus);

                // DATA PLUS (Menambah ke Produk Varian Tujuan)
                \$detail_plus = array(
                    'id_transaksi' => \$id_transaksi,
                    'id_produk'    => \$item['variant_product_id_tujuan'], // Mengarah ke ID Produk Varian tujuan
                    'qty'          => (string)\$item['qty_convert'],              // Nilai PLUS
                    'hpp'          => \$item['hpp']
                );
                \(this->MdlTransaksiData->insert_detail(\)detail_plus);
            }
            
            \$this->session->set_flashdata('success', 'Request konversi stok berhasil disimpan.');
            redirect('stock_conversion/list_request');
        }
    }
}
```
