# 📋 Ceklist Implementasi Transaction Concurrency Locker (Modul Finance & Keuangan)

Dokumen ini berisi daftar ceklist teknis untuk mengimplementasikan **Kelompok Pengunci Transaksi (Transaction Concurrency Locker)** berbasis *Composite Key* (`cabang_id` + `jenis_tr` + `booking_number` + `oleh_id`) pada seluruh modul dalam kelompok Keuangan & Akunting di proyek ERP Everest.

---

## 🎯 Standar Alur Operasional (Standard Core Tasks)
Sebelum mengimplementasikan pada masing-masing modul, pastikan 4 langkah standar berikut dipenuhi:
1. **Lock Registration:** Memanggil `MdlLockerTransaksi::execLocker()` saat draf transaksi keuangan dibuka/dibuat.
2. **Fail-Fast Early Validation:** Memanggil `MdlLockerTransaksi::cekLoker()` di bagian paling atas controller (sebelum transaksi database atau pembentukan UI).
3. **Interactive UI Lock Modal:** Menampilkan modal interaktif "Transaksi Terkunci" lengkap dengan data identitas petugas aktif dan tombol *Ambil Alih Transaksi* (`?forceRetakeLock=1`) jika petugas pertama *idle* $\ge 5$ menit.
4. **Lock Release:** Memastikan *lock* dilepas (`jumlah = 0`) setelah transaksi berhasil di-posting atau saat user menekan tombol Batal/Logout.

---

## 🎨 Spesifikasi Tampilan Notifikasi Modal (UX & UI Specification)
Berdasarkan acuan antarmuka *Transaksi Terkunci*, setiap modul wajib merender komponen modal interaktif dengan spesifikasi struktur data sebagai berikut:

* **Elemen Header:** Icon Gembok (Gold Circle) & Judul Utama **"Transaksi Terkunci"**.
* **Pesan Peringatan:** `"Transaksi dengan nomor \"{booking_number}\" sedang diproses oleh pengguna lain di sesi lain. Untuk mencegah bentrok data, Anda tidak dapat memprosesnya bersamaan."`
* **Kartu Detail Petugas Aktif:**
  | Field | Data Source / Variable | Contoh Tampilan |
  | :--- | :--- | :--- |
  | **Petugas Aktif** | `nama_login` + `oleh_id` | **Nurhayati** (ID: 69) |
  | **IP Address** | `ip_address` | 192.168.5.4 |
  | **Perangkat** | `device_info` / `user_agent` | PC / Edge |
  | **Aktif Terakhir** | `dtime_last_active` | 2026-08-14 13:30:45 |

* **Elemen Tombol Aksi (Action Buttons):**
  1. **Tombol "Ambil Alih Transaksi (Petugas Idle)" (`?forceRetakeLock=1`):**
     * Status **Disabled** jika `Aktif Terakhir` $< 5$ menit (disertai indikator timer sisa waktu).
     * Status **Aktif (Enabled)** jika `Aktif Terakhir` $\ge 5$ menit (mengubah `jumlah = 0` dan mengalihkan kunci transaksi).
  2. **Tombol "Kembali ke Daftar Transaksi":** Mengarahkan pengguna kembali ke halaman daftar transaksi modul terkait.

---

## 📑 Ceklist Implementasi Per-Modul

### 1. 💳 Modul `pembayaran` (Pelunasan Hutang Supplier / A/P Settlement)
> **Controller Terdampak:** `application/modules/pembayaran/controllers/Create.php`, `FollowUp.php`, `_shoppingCart.php`, `_processSelectNota.php`

- [x] **Lock Registration (Header):** Inisiasi *lock* draf pelunasan nota supplier dengan Composite Key (`cabang_id` = `my_cabang_id()`, `jenis_tr` = `'pembayaran'`, `booking_number`, `oleh_id` = `my_id()`).
- [x] **Item Checkbox Selector Locker (`_processSelectNota.php`):** Kunci nota supplier saat baris *checkbox* dicentang dengan Composite Key (`cabang_id` = `my_cabang_id()`, `transaksi_id` = `trID`, `state` = `'hold'`) dan dukung *retake lock* jika petugas idle $\ge 5$ menit.
- [x] **Early Validation Check:** Pasang pengecekan awal di `Create::index()` & `FollowUp::index()` sebelum memuat rincian nota hutang supplier.
- [x] **Lock Modal Integration:** Jika dikunci petugas lain di cabang sama, tampilkan Modal "Transaksi Terkunci" + penanganan URL `?forceRetakeLock=1`.
- [x] **Release Lock:** Pastikan *lock* dilepas secara otomatis saat *uncheck* nota, atau saat pembayaran supplier berhasil di-posting ke Jurnal/Bank.

---

### 2. 🧾 Modul `penerimaan` & `penerimaanprojek` (Pelunasan Piutang Customer / A/R Receipt)
> **Controller Terdampak:** `application/modules/penerimaan/controllers/Create.php`, `FollowUp.php`, `_processSelectNota.php`, `application/modules/penerimaanprojek/controllers/Create.php`

- [x] **Lock Registration (Header):** Daftarkan penguncian draf penerimaan piutang customer / project dengan Composite Key (`cabang_id`, `jenis_tr` = `'penerimaan'` / `'penerimaanprojek'`, `booking_number`, `oleh_id`).
- [x] **Item Checkbox Selector Locker (`_processSelectNota.php`):** Kunci nota piutang customer/project saat baris *checkbox* dicentang pada modal selector dengan Composite Key (`cabang_id` = `my_cabang_id()`, `transaksi_id` = `trID`, `state` = `'hold'`) dan dukung *retake lock* jika idle $\ge 5$ menit.
- [x] **Early Validation Check:** Terapkan *fail-fast check* sebelum memuat form alokasi pembayaran piutang dan invoice penjualan.
- [x] **Multi-Branch Isolation Test:** Pastikan `cabang_id` pada Composite Key mencegah pemblokiran keliru (*false collision*) jika nomor booking/nota sama terpakai di cabang lain.
- [x] **Release Lock:** Bersihkan *lock* pasca-posting pelunasan piutang customer atau saat nota di-uncheck.

---

### 3. 💵 Modul `kas` & `pettycast` (Kas Besar & Kas Kecil / Petty Cash)
> **Controller Terdampak:** `application/modules/kas/controllers/Create.php`, `FollowUp.php`, `application/modules/pettycast/controllers/Create.php`

- [x] **Lock Registration:** Kunci draf voucher pengeluaran/penerimaan kas besar dan kas kecil dengan Composite Key (`cabang_id`, `jenis_tr` = `'kas'` / `'pettycast'`, `booking_number`, `oleh_id`).
- [x] **Early Validation Check:** Tambahkan cek locker di awal `kas/Create.php` & `pettycast/Create.php` untuk mendeteksi kasir aktif di cabang yang sama.
- [x] **Lock Modal Integration:** Aktifkan tombol *Ambil Alih Transaksi (Petugas Idle)* jika petugas pertama inaktif $\ge 5$ menit.
- [x] **Release Lock:** Hapus *lock* transaksi setelah voucher kas berhasil disimpan/diterbitkan.

---

### 4. 📝 Modul `biaya` (Pengajuan & Pengesahan Beban Biaya Operasional)
> **Controller Terdampak:** `application/modules/biaya/controllers/Create.php`, `FollowUp.php`, `_processSelectBiaya.php`

- [x] **Lock Registration:** Kunci draf voucher pengajuan biaya operasional menggunakan Composite Key (`cabang_id`, `jenis_tr` = `'biaya'`, `booking_number`, `oleh_id`).
- [x] **Early Validation Check:** Pasang pemeriksaan locker di awal `biaya/Create.php` sebelum memuat rincian akun COA beban biaya.
- [x] **Lock Modal Integration:** Tampilkan modal interaktif "Transaksi Terkunci" dengan opsi *retake* jika *idle* $\ge 5$ menit.
- [x] **Release Lock:** Lepas *lock* transaksi saat pengajuan/pengesahan beban biaya selesai di-posting.

---

### 5. ⚖️ Modul `settlement` (Penyelesaian Uang Muka & Kliring Piutang/Hutang)
> **Controller Terdampak:** `application/modules/settlement/controllers/Create.php`, `FollowUp.php`

- [x] **Lock Registration:** Kunci draf pencocokan/klaim uang muka dan settlement piutang/hutang dengan Composite Key (`cabang_id`, `jenis_tr` = `'settlement'`, `booking_number`, `oleh_id`).
- [x] **Early Validation Check:** Terapkan *fail-fast validation* di `settlement/Create.php` sebelum proses penyesuaian saldo DP dilakukan.
- [x] **Lock Modal Integration:** Dukungan ambil alih *lock* jika petugas finance *idle* $\ge 5$ menit.
- [x] **Release Lock:** Release *lock* setelah proses settlement ter-posting secara permanen.

---

### 6. 📊 Modul `adjustmentjurnal` (Input & Validasi Jurnal Penyesuaian)
> **Controller Terdampak:** `application/modules/adjustmentjurnal/controllers/Create.php`, `FollowUp.php`

- [x] **Lock Registration:** Inisiasi *lock* draf pengentri jurnal penyesuaian akuntansi dengan Composite Key (`cabang_id`, `jenis_tr` = `'adjustmentjurnal'`, `booking_number`, `oleh_id`).
- [x] **Early Validation Check:** Pasang cek locker di awal `adjustmentjurnal/Create.php` sebelum form input baris Debit/Kredit COA ditampilkan.
- [x] **Lock Modal Integration:** Modal "Transaksi Terkunci" dengan verifikasi status *idle* petugas pertama.
- [x] **Release Lock:** Release *lock* setelah entri jurnal dinyatakan balanced (Total Debit == Total Kredit) dan sukses disimpan.
