# 📋 PT. Everest - ERP Web - Modul Opname

Aturan spesifik untuk pengembangan dan validasi modul `opname` PT. Everest.

---

## 1. Kode Transaksi (`jenisTr`)
*   **`1119`**: Stok Opname Produk Pusat (Complete/Final).
*   **`1119r` / `1119ro`**: Status Draft & Review (Pusat).
*   **`2229`**: Stok Opname Produk Cabang (Complete/Final).
*   **`2229r` / `2229ro`**: Status Draft & Review (Cabang).

---

## 2. Aturan Coding Khusus Opname

### 2.1 Pengecekan Kunci Transaksi Gantung (Sebelum Opname)
*   Sebelum memulai proses opname, sistem **WAJIB** mengecek dan memastikan tidak ada transaksi gantung (mutasi yang belum diselesaikan) di cabang/gudang yang bersangkutan.
*   Pengecekan dilakukan dengan memanggil `$this->opname_model->callTransaksiBeforeOpname()` atau library terkait. Jika ditemukan transaksi gantung, proses opname **harus diblokir**.

### 2.2 Valuasi HPP FIFO/Average & Jurnal Akuntansi
*   Selisih opname (`qty_opname` - `stok_sistem`) wajib dinilai berdasarkan HPP riil menggunakan library/komponen `FifoAverageOpname`.
*   **Penjurnalan Otomatis (Step 3 - Complete):**
    *   **Selisih Kurang (Loss/Kerugian):**
        *   Debet: `7020020` (Kerugian/Beban Selisih Persediaan)
        *   Kredit: `1010030030` (Persediaan Produk)
    *   **Selisih Lebih (Profit/Laba):**
        *   Debet: `1010030030` (Persediaan Produk)
        *   Kredit: `7010150` (Laba lain-lain / Selisih Persediaan)

### 2.3 Penanganan Serial Number (S/N) Otomatis
*   Jika produk memiliki serial number dan terjadi **selisih lebih** tanpa input scanner manual (misal via upload Excel), sistem **WAJIB** men-generate **System Serial Number** secara otomatis (disimpan pada `produk_serial_number_2`).
*   Format Auto-Generate System Serial:
    `[Tanggal_PO]:[Urutan_PO]:[Urutan_GRN]:[Urutan_GRN_PO]:[ID_Produk]:[Urutan_Serial_Baru]:[Kode_Part]`

### 2.4 Validasi Sesi & Integritas Main Elements
*   Selama transisi antar-langkah (Step 1 -> Step 2 -> Step 3) di `FollowUp.php` atau `__FollowUp.php`, array `main_elements` **WAJIB** dipertahankan dengan menyalinnya dari session lama ke session baru:
    ```php
    "main_elements" => isset($_SESSION[$oldCode]['main_elements']) ? $_SESSION[$oldCode]['main_elements'] : array(),
    ```
