# Jurnal Pengembangan - Universal Human Participation Analytics

### Modul: `bi_reports` / Universal Human Participation Analytics
**Tanggal:** 2026-07-05  
**Developer:** Antigravity (Agent 7)

---

## 1. Analisis & Masalah
* **Kebutuhan Bisnis:** Tracing (pelacakan) komprehensif atas peran dan keterlibatan entitas manusia (Karyawan, Konsumen, Pemasok) di seluruh lini transaksi ERP secara kronologis (timeline) dan agregasi pivot per modul.
* **Tantangan Teknis:** Database `transaksi` memiliki 390.000+ baris data. Melakukan query join dinamis ke `transaksi_data`, `per_employee`, dan `per_customers` secara real-time saat memuat halaman akan memicu Memory Exhaustion di PHP 5.6 atau degradasi performa database server MariaDB.
* **Standardisasi:** Desain harus mematuhi prinsip evaluasi kinerja **ISO 9001:2015 Klausul 9.1.3** dan log audit akuntabilitas **ISO 27001**.

---

## 2. Solusi & Desain Arsitektur (2-Tier Data Store)
1. **Tier 1 - `trx_human_activity_timeline`**: Menyimpan log flat keterlibatan per transaksi secara terstruktur. Nama produk digabungkan (*pre-aggregated*) saat ETL untuk menghindari query detail transaksi terpisah.
2. **Tier 2 - `trx_human_pivot_cache`**: Menyimpan hitungan akumulasi keterlibatan personil per modul operasional (Sales, Purchase, Finance, Logistics, Production).
3. **Memory-Safe Chunked ETL**: Memproses data transaksi dalam chunk 5.000 baris untuk mencegah konsumsi memori melampaui limit server (512MB).

---

## 3. Berkas yang Diubah / Dibuat

| Tipe Aksi | Jalur File | Peran / Deskripsi |
|:---:|---|---|
| **NEW** | `scratch/setup_human_db.php` | Setup skema tabel `trx_human_activity_timeline` & `trx_human_pivot_cache` |
| **NEW** | `application/models/Human_model.php` | Model database: Chunked ETL & query detail peran modul & timeline filterable |
| **NEW** | `application/controllers/eusvc/HumanApi.php` | REST API endpoints: get_list, module_details, timeline, run_etl |
| **MODIFY** | `bi_reports/index.html` | Mengintegrasikan UI Pivot Table Utama, modal popup per modul, dan slide-over timeline drawer |
| **MODIFY** | `bi_reports/assets/style.css` | Custom CSS modern (backdrop-filter modal, slide-over drawer, timeline item badges) |
| **MODIFY** | `bi_reports/assets/app.js` | JS fetch, DataTable init, Highcharts donut rendering, and drawer filters |

---

## 4. Hasil Pengujian Performa (Verifikasi API)
Query diuji pada database default `san_13mar` (398.126 transaksi operasional):
1. **ETL Run**: Berhasil memproses total **590.681 baris keterlibatan personil** dalam waktu ~20 detik tanpa memory leak.
2. **Level 1 List API (`/get_list`)**: Waktu respon **1,21 ms** (menggunakan cache data).
3. **Screen 2 Role Breakdown API (`/module_details`)**: Waktu respon **248 ms** untuk personil teraktif (Wilson - 62k transaksi).
4. **Screen 3 Timeline API (`/timeline`)**: Waktu respon **150 ms** untuk user teraktif (Wilson - 5 transaksi per halaman render).

---

## 5. Walkthrough Antarmuka (UI Flow)
* **Screen 1**: Menampilkan tabel pivot daftar orang dan hitungan keterlibatan di Sales, Purchase, Finance, Logistics, Production.
* **Screen 2**: Klik jumlah transaksi modul memicu modal yang menampilkan diagram donat persentase peran (misal: Wilson di modul Finance: *actor* = 100%).
* **Screen 3**: Klik nama personil memicu slide-over panel dari kanan yang merinci riwayat transaksi kronologis lengkap dengan list produk (yang sudah ditabelkan agar mudah dibaca), nominal transaksi, dan filter dinamis per modul / tanggal.

---

## 6. Pembaruan Tampilan List Produk & Validasi Nilai Transaksi (Tabel) - 2026-07-06 (Agent 7)
* **Masalah:** 
  1. List produk pada detail aktivitas transaksi berupa teks gabungan satu baris panjang yang dipisahkan koma, membuatnya sulit dibaca.
  2. Nilai transaksi global tidak didukung rincian harga per produk untuk validasi/cross-check apakah akumulasi harga barang sesuai dengan total nilai transaksi.
* **Solusi:**
  1. **Modifikasi Database (ETL & Sync):** Mengubah query agregasi `GROUP_CONCAT` produk di [Human_model.php](file:///w:/new_san_variant/application/models/Human_model.php) pada fungsi `run_human_etl()` dan `sync_incremental()` untuk menyisipkan harga satuan dan total nilai per baris produk dengan format: `Nama Produk (Qty Satuan @ HargaSatuan = TotalNilai)`.
  2. **Parsing di Frontend:** Memperbarui regex pada helper Javascript `formatProductSummaryTable()` di [app.js](file:///w:/new_san_variant/bi_reports/assets/app.js) menjadi `/(.+?)\s*\(([\d\.,]+)\s*([^@)]*)(?:\s*@\s*([\d\.,]+)\s*=\s*([\d\.,]+))?\)/g` untuk mengekstrak Nama Produk, Qty, Satuan, Harga Satuan, dan Total secara dinamis.
  3. **Tabel Validasi 4 Kolom:** Jika data harga tersedia, helper ini merender tabel 4 kolom (`Nama Produk`, `Jumlah`, `Harga Satuan`, `Total`) dengan format mata uang rupiah (`fmtRp()`). Jika data harga tidak ada (misal pada cache transaksi lama), tabel otomatis jatuh kembali (fallback) ke tabel 2 kolom (`Nama Produk`, `Jumlah`).
  4. **Modifikasi Top Products:** Memperbarui pencarian regex di `renderModalTopProducts()` pada [app.js](file:///w:/new_san_variant/bi_reports/assets/app.js) agar satuan/unit dibersihkan dengan benar tanpa terpolusi teks harga.
  5. **Verifikasi Linting:** Dipastikan tidak ada error syntax PHP (`php -l`) pada berkas model.

---

## 7. Penerapan View Database `vw_consolidate_monthly` untuk Data Real-Time - 2026-07-06 (Agent 7)
* **Masalah:** Laporan penjualan di dashboard BI Sales Analytics sebelumnya menggunakan database view `vw_bi_sales_monthly` yang mengambil data dari tabel cache `rugilaba`. Tabel ini hanya terupdate ketika proses **Tutup Buku Bulanan (Monthly Closing)** dilakukan, sehingga bulan berjalan (seperti Juli 2026) tampil sebagai Rp 0 (tidak sinkron dengan menu `Rugilaba/viewPLConsolidatedNew` yang bersifat live).
* **Solusi:** 
  1. **Pembuatan Database View Baru:** Membuat view database `vw_consolidate_monthly` di database default `san_13mar`. View ini menghitung saldo penjualan kotor, return, HPP, efisiensi, jasa kirim, selisih kurs/opname, biaya operasional (COA 6%), dan pendapatan/beban non-operasional langsung dari buku besar/jurnal transaksi (`jurnal`).
  2. **Pembersihan Jurnal Penutup & Saldo Awal:** Menyisipkan filter `jenis != 'Jurnal Penutup'` serta penyaringan `transaksi_no NOT LIKE '1000.%' AND transaksi_no NOT LIKE '1001.%'`. Hal ini krusial untuk memastikan jurnal penutupan tahunan serta saldo awal tahunan (opening balance) tidak merusak akumulasi bulanan riil (terutama saldo penjualan Januari yang sebelumnya menjadi minus akibat jurnal balik saldo awal).
  3. **Pembaruan Kode Model:** Mengubah target kueri di model [MdlRugilaba.php](file:///w:/new_san_variant/application/models/Mdls/MdlRugilaba.php) (fungsi `getSalesMonthly`, `getSalesAllMonthly`, dan `getSalesDistinctYears`) agar mengambil data dari view live `vw_consolidate_monthly` sebagai pengganti `vw_bi_sales_monthly`.
  4. **Hasil Akhir:** Dashboard BI Sales Analytics kini bersifat real-time mengikuti transaksi penjualan yang masuk dan ter-posting ke jurnal, serta selaras dengan perhitungan laporan P&L Consolidated.
