# Catatan Temuan Audit, Evaluasi Yuridis, dan Backlog Refactoring
**Tanggal Dokumen**: 08 September 2026  
**Topik Pembahasan**: Evaluasi Selektor Retur Penjualan (9822), Parser Query Filter SQL, Disonansi UI Label, dan Tata Kelola Transaksi Pengiriman Takeaway  
**Target Pembahasan Sesi Berikutnya**: Penyelesaian Konfigurasi UI/Core Transaksi 9822, Standardisasi Serah Terima Fisik Takeaway, dan Mitigasi Risiko Pajak/Akuntansi Lintas Periode.

---

## DAFTAR ISI
1. [Temuan 1: Cacat Parser Operator SQL `<>` di `ComItemQueryService.php`](#1-temuan-1-cacat-parser-operator-sql--di-comitemqueryservicephp)
2. [Temuan 2: Disonansi UI Label Selektor Retur Penjualan (9822)](#2-temuan-2-disonansi-ui-label-selektor-retur-penjualan-9822)
3. [Temuan 3: Debat Pengendalian Internal & Legalitas Transaksi Takeaway](#3-temuan-3-debat-pengendalian-internal--legalitas-transaksi-takeaway)
4. [Temuan 4: Risiko Kepatuhan Pajak & PSAK pada Retur Lintas Periode (> 2,5 Tahun)](#4-temuan-4-risiko-kepatuhan-pajak--psak-pada-retur-lintas-periode--25-tahun)
5. [Temuan 5: Anomali Tipe Data Fallback Atribut di `_processSelectNotaItem.php`](#5-temuan-5-anomali-tipe-data-fallback-atribut-di-_processselectnotaitemphp)
6. [Matriks Status Kode Nyata vs Action Items untuk Diskusi Mendatang](#6-matriks-status-kode-nyata-vs-action-items-untuk-diskusi-mendatang)

---

## 1. Temuan 1: Cacat Parser Operator SQL `<>` di `ComItemQueryService.php`

### A. Deskripsi Masalah & Akar Penyebab
Pada konfigurasi `selectorFilters` transaksi retur penjualan `9822` di `application/modules/penjualan/config/coTransaksiUi.php`:
```php
"selectorFilters" => array(
    "returned=.0",
    "jenis=.5822spd",
    "customers_id=pihakID",
    "trash_4<>.1", // Proteksi agar nota pengantar yang direject tidak dapat ditarik
    "cabang_id=placeID",
),
```

Sebelumnya, metode `parseAndApplyFilters()` pada `application/models/Coms/ComItemQueryService.php` mem-parsing operator string dengan urutan:
`>=`, `<=`, `!=`, `>`, `<`, `=` (tanpa mendeteksi `<>`).

Akibatnya, ketika ekspresi `"trash_4<>.1"` diproses:
* Kode mendeteksi karakter `<` terlebih dahulu.
* Terjadi pemotongan string:
  * Kolom: `trash_4`
  * Operator: `<`
  * Nilai: `>.1`
* Query SQL yang dihasilkan menjadi rusak: `WHERE trash_4 < '>.1'`, sehingga filter proteksi anti-reject tidak berfungsi dan berisiko memunculkan kembali nota yang sudah dibatalkan/direject.

### B. Status Kode Nyata & Rekomendasi Lanjutan
* **Status Saat Ini**: Deteksi operator `<>` telah disisipkan pada baris 162–164 di `ComItemQueryService.php` sebelum operator `<` dan `>`.
* **Kritik Kualitas Arsitektur**:
  Meskipun perbaikan cepat berbasis `strpos()` telah diterapkan, pendekatan *naive string split* tetap rapuh (*fragile parsing*). Jika suatu nilai parameter filter berupa string yang mengandung karakter operator (misalnya deskripsi catatan), pemotongan string akan salah kaprah.
* **Rekomendasi untuk Diskusi**: Standardisasi parsing filter ke pola *Structured Criteria Array* (Key-Operator-Value) atau pemanfaatan *regular expression tokenizer* formal sesuai ISO/IEC 25010.

---

## 2. Temuan 2: Disonansi UI Label Selektor Retur Penjualan (9822)

### A. Deskripsi Masalah
* Pada `application/modules/penjualan/config/coTransaksiUi.php` baris 3612:
  ```php
  "selectorLabel" => "item",
  ```
* **Dampak Operasional**:
  Pada tampilan antarmuka kasir/sales support, panel selektor kiri menampilkan label *"Pilih Item"* atau *"Cari Item"*. Padahal yang dicari dan dimuat sebenarnya adalah **Nomor Dokumen Surat Pengantar/Shipment (`5822SPD`)**.
* Hal ini menimbulkan disonansi kognitif bagi pengguna operasional yang mengira mereka sedang mencari nama/kode fisik barang, bukan nomor surat pengantar penjualan asal.

### B. Rencana Aksi
* Mengubah `"selectorLabel" => "item"` menjadi `"delivery note"` atau `"nota pengiriman / surat jalan (5822SPD)"`.
* Menyesuaikan placeholder input selektor agar secara eksplisit memandu kasir memasukkan nomor nota surat pengantar.

---

## 3. Temuan 3: Debat Pengendalian Internal & Legalitas Transaksi Takeaway

### A. Latar Belakang & Asumsi
* **Solusi Awal**: Menghapus sub-elemen `deliveryDetails` dari opsi pengiriman `2` (Takeaway / Ambil Sendiri) pada `coTransaksiUi.php` untuk `5822` dan `5823` guna menghentikan popup validasi ekspedisi yang menghambat kasir.
* **Pertanyaan / Asumsi Pengguna**:
  *Apakah tidak cukup dengan masih adanya `CUSTOMERS DETAILS`? Tidak perlu data `deliveryDetails` karena barang dibawa sendiri oleh konsumen langsung.*

### B. Analisis Kritis Audit & Hukum Korporasi
1. **Dilema Transaksi Ritel (B2C) vs Transaksi Korporasi (B2B)**:
   * Pada kasir eceran (POS `5823`), konsumen yang membayar di kasir memang individu langsung yang membawa barang.
   * Namun pada *Sales Order* reguler (`5822`), pelanggan mayoritas adalah entitas toko/perusahaan (`CUSTOMERS DETAILS` hanya mencatat nama PT/CV/Toko, alamat kantor, dan NPWP). Entitas badan hukum tidak mengambil barang secara fisik; yang datang ke gudang/toko adalah supir, kenek, atau kurir suruhan.
2. **Kelemahan Pengendalian Internal (ISA 315 & COSO Framework)**:
   * Jika barang bernilai tinggi (misal: 5 unit AC seharga Rp 22,75 juta) diserahkan begitu saja tanpa mencatat identitas penerima fisik, timbul celah sangkalan (*dispute*). Pelanggan dapat mengklaim tidak pernah mengutus orang untuk mengambil barang.
   * Perusahaan tidak memiliki jejak serah terima (*Custody Transfer*), yang merupakan kelemahan signifikan pengamanan aset persediaan (*safeguarding of assets*).
3. **Konsekuensi Hukum Perdata & Pembuktian (KUHPerdata)**:
   * **Pasal 1395 KUHPerdata**: Penyerahan kepada pihak yang tidak memiliki kuasa sah dari pembeli dianggap tidak sah jika disangkal oleh pembeli.
   * **Pasal 1474 jo. Pasal 1865 KUHPerdata**: Penjual menanggung beban pembuktian (*onus of proof*) bahwa barang telah benar-benar diserahkan. Nota yang hanya memuat nama PT tanpa tanda tangan dan identitas pengambil fisik tidak memiliki kekuatan pembuktian sempurna (*volledig bewijs*).
4. **Prinsip Akuntansi PSAK 72 / IFRS 15 (Transfer of Control)**:
   * Pendapatan hanya boleh diakui ketika kendali fisik atas barang telah dialihkan kepada pelanggan (Paragraf 38). Penyerahan tanpa bukti penerimaan sah menimbulkan risiko pembalikan pendapatan (*Revenue Reversal*).

### C. Rekomendasi Solusi Berimbang
1. **UX Tetap Bersih**: Bypass `deliveryDetails` (pemilihan alamat ekspedisi `MdlCustomerAddress`) tetap dipertahankan karena kasir tidak boleh dipaksa memilih rute ekspedisi.
2. **Lapisan Pencatatan B2B**:
   * Untuk transaksi `5822`, sediakan 1 field ringkas opsional: `"Nama Pengambil / No. HP"` (default diisi nama customer jika perorangan, atau nama supir/wakil jika diutus).
   * Pada cetakan fisik Surat Jalan / Tanda Terima Pengambilan Gudang, sediakan kolom tanda tangan basah: *"Diterima / Diambil Oleh (Nama Terang & No. HP)"*.

---

## 4. Temuan 4: Risiko Kepatuhan Pajak & PSAK pada Retur Lintas Periode (> 2,5 Tahun)

### A. Bukti Empiris Tangkapan Layar
* Transaksi `9822` memuat penarikan dokumen surat pengantar `5822SPD.1.17.1` bertanggal **10 Januari 2024** pada sesi operasional **September 2026** (> 2,5 tahun kalender) dengan nilai total **Rp 22.750.000,25**.

### B. Risiko Hukum Perpajakan (UU HPP, PMK 65/2010, PER-03/PJ/2022, Coretax DJP)
* Faktur Pajak Keluaran Januari 2024 telah dilaporkan pada SPT Masa PPN 2024 dan SPT Tahunan Badan 2024 yang telah berstatus *closed audit period*.
* Penerbitan Nota Retur atas transaksi yang melampaui batas tahun buku tanpa rekonsiliasi faktur pajak asal berisiko tinggi **ditolak secara otomatis oleh sistem Coretax DJP**.
* Berdasarkan **Pasal 13 UU KUP**, anomali retur lintas tahun ini memicu penerbitan SP2DK dan potensi sanksi bunga/denda administrasi perpajakan.

### C. Risiko Salah Saji Akuntansi (PSAK 72, PSAK 25, PSAK 14)
1. **Distorsi Laba Rugi Berjalan (PSAK 72 & PSAK 25 / IAS 8)**:
   * Mengurangkan pendapatan penjualan tahun 2026 atas transaksi yang diakui tahun 2024 menyebabkan pendapatan berjalan tersaji terlalu rendah (*Understatement of Revenue*). Retur lintas tahun seharusnya diperlakukan melalui mekanisme koreksi laba ditahan atau persetujuan audit manajemen senior.
2. **Penyajian Persediaan Terlalu Tinggi (PSAK 14 / IAS 2 - Lower of Cost and NRV)**:
   * Memasukkan kembali 5 unit AC Panasonic bekas/lama ke neraca persediaan pada harga perolehan penuh (Rp 4.144.144,14/unit) tanpa mencatat Cadangan Penurunan Nilai Persediaan (*Allowance for Inventory Impairment*) menyebabkan nilai aset di neraca tersaji lebih tinggi dari nilai wajarnya (**Material Overstatement of Assets**).

### D. Rekomendasi Teknis untuk Diskusi
* Menambahkan filter pembatas umur nota pada `selectorFilters` transaksi `9822` (contoh: nota maksimal 30–60 hari kalender dari tanggal transaksi).
* Jika perusahaan memerlukan fitur retur di luar batas waktu normal, wajibkan otorisasi supervisor (*Managerial Override Flag* / level `o_seller_spv` atau `o_finance`) sebelum transaksi dapat diterbitkan.

---

## 5. Temuan 5: Anomali Tipe Data Fallback Atribut di `_processSelectNotaItem.php`

### A. Masalah pada Baris 380–386
```php
$valSource = 0;
if (isset($rows->$src2) && $rows->$src2 !== '') {
    $valSource = $rows->$src2;
} elseif (isset($row->$src2) && $row->$src2 !== '') {
    $valSource = $row->$src2;
}
$tmp[$key2] = makeValue($src2, $tmp, $tmp, $valSource);
```

### B. Dampak & Kelemahan
* Inisialisasi `$valSource = 0` secara *hardcoded* sebelum pengecekan atribut adalah cacat tipe data (*type inconsistency*).
* Untuk kolom non-numerik seperti satuan barang (`satuan` / UOM), fallback berupa integer `0` menyebabkan fungsi perenderan menghasilkan nilai `0` alih-alih mempertahankan representasi semantik string kosong atau `n/a`.

---

## 6. Matriks Status Kode Nyata vs Action Items untuk Diskusi Mendatang

| No | Modul / Berkas | Topik Temuan | Status di Repositori | Agenda Pembahasan / Tindakan Lanjutan |
| :---: | :--- | :--- | :---: | :--- |
| **1** | [ComItemQueryService.php](file:///w:/everest_refaktor/application/models/Coms/ComItemQueryService.php) | Parser operator SQL `<>` | **Sudah Terpasang** | Evaluasi peremajaan parser string ke regex tokenizer agar tahan terhadap karakter spesial. |
| **2** | [coTransaksiUi.php](file:///w:/everest_refaktor/application/modules/penjualan/config/coTransaksiUi.php) (9822) | Label Selektor Retur | **Belum Berubah** (`"item"`) | Ganti label menjadi `"delivery note"` atau `"nota pengiriman / surat jalan"`. |
| **3** | [coTransaksiUi.php](file:///w:/everest_refaktor/application/modules/penjualan/config/coTransaksiUi.php) (9822) | Batas Umur Nota Retur | **Belum Ada** (Masih Bebas) | Tentukan kebijakan rentang waktu maksimal nota asal (misal: 30–60 hari) guna kepatuhan perpajakan Coretax & PSAK 72. |
| **4** | [coTransaksiUi.php](file:///w:/everest_refaktor/application/modules/penjualan/config/coTransaksiUi.php) (5822/5823) | Akuntabilitas Takeaway | `deliveryDetails` dilepas | Tetapkan kebijakan: apakah cukup mengandalkan format tanda tangan fisik pada cetakan nota/surat jalan, atau menambah field pencatatan nama pengambil barang. |
| **5** | [_processSelectNotaItem.php](file:///w:/everest_refaktor/application/modules/penjualan/controllers/_processSelectNotaItem.php) | Fallback tipe data atribut | `$valSource = 0` | Sesuaikan fallback nilai agar kolom teks/satuan tidak jatuh ke angka `0`. |

---
*Dokumen ini disusun untuk merekam seluruh temuan teknis, yuridis, dan akuntansi secara komprehensif sebagai rujukan kerja bersama.*
