# Dokumentasi Workflow Human & Teknis Modul Pembelian (FG Purchasing - 466)

Dokumen ini memetakan alur kerja pengguna nyata (*Workflow Human*) dari hulu ke hilir yang disinkronkan dengan detail operasional sistem dan database (FIFO, Locker Stok, Akuntansi) pada modul **Pembelian Produk Jadi (Finished Goods Purchasing - 466)**.

---

## 1. Diagram Alir Workflow (Mermaid)

```mermaid
flowchart TD
    subgraph Langkah 1: Inisiasi (Staff Purchasing)
        A[Buka Form Create/466] -->|Input Item & Kuantitas| B(Proses Selector Item & Harga)
        B -->|Klik Simpan| C[Pre-Purchase Order: 466r]
        C -->|Cetak Draf PO| D[Pratinjau Fisik PO]
    end

    subgraph Langkah 2: Otorisasi (Supervisor Purchasing)
        D --> E[Buka List Antrean FollowUp]
        E -->|Checklist Detail Barang| F{Apakah Sesuai?}
        F -->|Tidak| F1[Edit Items / Revert]
        F -->|Ya: Approved PO| G[Purchase Order Resmi: 466]
    end

    subgraph Langkah 3: Logistik Gudang (Staff Gudang)
        G --> H[Barang Vendor Tiba di Gudang]
        H -->|Buka Detail Approval| I[Input Jumlah Fisik yang Diterima]
        I -->|Klik Receive & Make GRN| J[Goods Received Note: 467]
        J -->|Dual-Write Stok| K[(Stok Bertambah Riil)]
        J -->|FIFO Register| L[(HPP FIFO Tercatat)]
    end

    subgraph Langkah 4: Penyelesaian Finansial (Staff Finance & Tax)
        K & L --> M[Terima Invoice & Faktur Pajak Vendor]
        M -->|Otorisasi PPN Masukan| N[Realisasi PPN Masukan: 111]
        N -->|Jurnal Akuntansi AP| O[(Hutang Dagang Resmi Terbentuk)]
    end

    F1 -.->|Kembali ke Draf| A
```

---

## 2. Rincian Langkah Operasional (Langkah-Demi-Langkah)

### 📌 Langkah 1: Pengajuan Pre-Purchase Order (Draf Awal)
Langkah pertama dimulai oleh Staff Purchasing untuk menyusun draf rencana pembelian barang ke vendor.

*   **Aktor**: Staff Purchasing (Wewenang kelompok pengguna: `c_purchasing`).
*   **Interaksi UI Pengguna**:
    1.  Membuka halaman pembuatan transaksi di URL `pembelian/Create/index/466`.
    2.  Memilih nama Supplier (`pihakID`) dan Cabang/Gudang penerima (`placeID` / `gudangID`).
    3.  Mencari item produk. Sistem memanggil controller `_selectorItem/selectItem` menggunakan model `MdlProdukPerSupplier` untuk membatasi hanya menampilkan barang-barang yang terasosiasi dengan supplier terpilih.
    4.  Memasukkan jumlah beli. Sistem memicu endpoint `_processSelectProduct/select` secara dinamis untuk mengambil harga beli default berdasarkan histori harga di model `MdlHargaProdukPerSupplier`.
    5.  Menekan tombol **"Simpan"** (memicu POST URL `pembelian/Create/save/466`).
*   **Logika Sistem & Database**:
    *   Sistem menghitung nilai PPN berdasarkan formula di `coTransaksiCore`: `ppn = (ppnFactor * harga) / 100`.
    *   Sistem menghitung total tagihan bersih (`grand_total = nett`).
    *   Sistem membuat record transaksi baru di tabel `transaksi` dengan tipe `466r` (Pre-Purchase Order) dan status awal `status = 0` (Langkah 1).
    *   Sistem menyimpan snapshot data inputan ke dalam tabel `transaksi_registry` pada kolom `main` dan `tableIn_master` menggunakan encoding `blobEncode()` (serialized + base64).
*   **Dampak pada Persediaan**: **0% (Tidak ada perubahan stok maupun booking stok)**.

---

### 📌 Langkah 2: Persetujuan Menjadi Purchase Order Resmi
Langkah kedua adalah otorisasi tingkat supervisor untuk memastikan harga dan jumlah barang telah disetujui perusahaan sebelum dikirim ke vendor.

*   **Aktor**: Supervisor / Manajer Pembelian (Wewenang kelompok pengguna: `c_purchasing_adm`).
*   **Interaksi UI Pengguna**:
    1.  Membuka halaman antrean approval `/pembelian/Transaksi/index/466`.
    2.  Supervisor dapat meninjau rincian barang melalui halaman `/pembelian/ViewDetails/nomer/466/466r...`.
    3.  *(Opsional)* Jika ada perubahan jumlah/harga negosiasi baru, Supervisor mengklik tombol edit yang mengarah ke `FollowUp/updateItems` untuk mengubah item secara langsung melalui `doUpdateApproval`.
    4.  Menekan tombol **"Approve PO"** (memicu POST ke `/pembelian/FollowUp/doFollowup/466/[transaksi_id]/2/1`).
*   **Logika Sistem & Database**:
    *   Sistem memperbarui kolom `status` pada tabel `transaksi` dari `0` menjadi `1` (menandakan dokumen telah naik ke Langkah 2/PO Resmi).
    *   Sistem merekam tanda tangan persetujuan ke dalam tabel `transaksi_sign`.
    *   Sistem memperbarui snapshot data terbaru di `transaksi_registry`.
*   **Dampak pada Persediaan**: **0% (Tidak ada perubahan stok fisik)**. Dokumen PO kini resmi dicetak dan dikirim ke vendor.

---

### 📌 Langkah 3: Penerimaan Barang & Pembuatan GRN
Langkah ketiga terjadi di area logistik saat truk vendor tiba membawa barang fisik ke gudang perusahaan.

*   **Aktor**: Staff Gudang / Logistik (Wewenang kelompok pengguna: `c_gudang`).
*   **Interaksi UI Pengguna**:
    1.  Membuka halaman antrean penerimaan PO aktif di menu FollowUp.
    2.  Membuka dialog approval `/pembelian/FollowUp/followupPreview/466/[transaksi_id]/3/2`.
    3.  Memeriksa fisik barang dan memasukkan kuantitas yang benar-benar diterima pada kolom input "Jumlah Diterima" (*received quantity*).
    4.  Menekan tombol **"receive & make GRN"**.
*   **Logika Sistem & Database**:
    *   Sistem memproses antrean HPP barang masuk menggunakan komponen **`FifoProdukJadiVarian`** & **`FifoProdukJadi`** untuk mencatat harga pokok di tabel antrean FIFO.
    *   Sistem membuat dokumen transaksi baru dengan tipe `467` (**Goods Received Note** / GRN) yang terelasi secara otomatis ke PO induknya melalui kolom `reference_nomer` dan `reference_id`.
    *   Sistem memanggil kelas `ComLockerStockDualWrite::pair()` untuk memperbarui persediaan riil barang di gudang tersebut (menambah jumlah aktif di tabel `stock_locker` dan `stock_locker_variant`).
    *   **Jurnal Akuntansi Otomatis**: Debet *Persediaan Barang Jadi* dan Kredit *Hutang yang Belum Ditagih (Unbilled AP)*.
*   **Dampak pada Persediaan**: **100% (+Stok bertambah aktif secara riil)**.

---

### 📌 Langkah 4: Realisasi Pajak Masukan (Penyelesaian Finansial)
Langkah terakhir untuk mencatat kewajiban hutang dagang secara resmi setelah invoice fisik dan faktur pajak diterima dari vendor.

*   **Aktor**: Staff Finance / Pajak (Wewenang kelompok pengguna: `c_finance`).
*   **Interaksi UI Pengguna**:
    1.  Membuka berkas GRN aktif di menu FollowUp Finance.
    2.  Membuka dialog approval `/pembelian/FollowUp/followupPreview/466/[transaksi_id]/4/3`.
    3.  Memasukkan nomor seri faktur pajak masukan yang diterima dari vendor.
    4.  Menekan tombol **"Approve PPN Masukan"**.
*   **Logika Sistem & Database**:
    *   Sistem mengeksekusi `preProcessor` langkah `467` &rarr; `111` yang tercatat di `coTransaksiCore.php`:
        *   Sistem memicu komponen **`LockerValue`** untuk mencatat nilai PPN Masukan (`ppn in`) ke status aktif di loker nilai.
        *   Sistem memicu komponen **`LockerValue`** kedua untuk mencatat nilai kewajiban hutang dagang (`piutang pembelian`) sebesar total tagihan dikurangi PPN.
    *   Sistem mengubah status transaksi utama menjadi final (`status = 3` / Langkah 4).
    *   **Jurnal Akuntansi Otomatis**: 
        *   Debet *Hutang yang Belum Ditagih (Unbilled AP)*
        *   Debet *PPN Masukan (PPN In)*
        *   Kredit *Hutang Dagang Resmi (Account Payable)*
*   **Dampak Finansial**: Transaksi pembelian dinyatakan ditutup secara logistik dan akuntansi, dan masuk ke antrean jadwal pembayaran kas/bank (*Account Payable Payment*).
