# CETAK BIRU KOMPREHENSIF: ARSITEKTUR SISTEM & OPERASIONAL BISNIS

## Sistem Multi-Tenancy Centralized Order Desk (Whitelabel Operational Hub)

### Konsolidasi Operasional PT. A (Pusat) dengan PT. Satu, PT. Dua, PT. Tiga, PT. Empat, dan PT. Lima (Sister Companies)

**Versi Dokumen:** 2.0 (Final - Production Ready)  
**Tanggal Efektif:** 31 Mei 2026  
**Sifat Dokumen:** Rahasia Terbatas (Confidential)

---

## DAFTAR ISI

- [LEMBAR PENGESAHAN & KONTROL DOKUMEN](#lembar-pengesahan--kontrol-dokumen)
- [BAB 1: RINGKASAN EKSEKUTIF & PRINSIP BISNIS](#bab-1-ringkasan-eksekutif--prinsip-bisnis)
- [BAB 2: ARSITEKTUR DATABASE TERPUSAT (POSTGRESQL DDL)](#bab-2-arsitektur-database-terpusat-postgresql-ddl)
- [BAB 3: INTEGRASI API APLIKASI NETRAL & JSON PAYLOAD](#bab-3-integrasi-api-aplikasi-netral--json-payload)
- [BAB 4: ARSITEKTUR JARINGAN KOMUNIKASI (OMNICHANNEL MASKING)](#bab-4-arsitektur-jaringan-komunikasi-omnichannel-masking)
- [BAB 5: INFRASTRUKTUR PERBANKAN & ALIRAN KAS (AUTO-POOLING VA)](#bab-5-infrastruktur-perbankan--aliran-kas-auto-pooling-va)
- [BAB 6: KEUANGAN, AKUNTANSI & REKONSILIASI PAJAK (METODE COST-PLUS)](#bab-6-keuangan-akuntansi--rekonsiliasi-pajak-metode-cost-plus)
- [BAB 7: JURNAL AKUNTANSI SISTER COMPANY LENGKAP](#bab-7-jurnal-akuntansi-sister-company-lengkap)
- [BAB 8: TATA KELOLA HAK AKSES (ROLE-BASED ACCESS CONTROL)](#bab-8-tata-kelola-hak-akses-role-based-access-control)
- [BAB 9: PROSEDUR OPERASIONAL STANDAR (SOP) PENANGANAN KOMPLAIN & RETUR](#bab-9-prosedur-operasional-standar-sop-penanganan-komplain--retur)
- [BAB 10: KERANGKA HUKUM & KLAUSA PERJANJIAN ANTA-PERUSAHAAN](#bab-10-kerangka-hukum--klausa-perjanjian-antar-perusahaan)
- [BAB 11: RENCANA PELUNCURAN, UAT MATRIX & GARIS WAKTU 30 HARI](#bab-11-rencana-peluncuran-uat-matrix--garis-waktu-30-hari)
- [BAB 12: LEMBAR CHECKLIST AUDIT & REKONSILIASI BULANAN](#bab-12-lembar-checklist-audit--rekonsiliasi-bulanan)
- [BAB 13: DATABASE TRIGGER OTOMATIS (MUTASI STOK REAL-TIME)](#bab-13-database-trigger-otomatis-mutasi-stok-real-time-per-transaksi)
- [BAB 14: PEMBELIAN SISTER COMPANY DARI PIHAK KETIGA](#bab-14-pembelian-sister-company-dari-pihak-ketiga)

---

## LEMBAR PENGESAHAN & KONTROL DOKUMEN

### Riwayat Dokumen

| Versi | Tanggal | Keterangan | Penulis |
|-------|---------|------------|---------|
| 1.0 | 30 Mei 2026 | Final - Production Ready | Tim Arsitektur |
| 2.0 | 31 Mei 2026 | Penambahan jurnal akuntansi, pembelian pihak ketiga, dokumen berjenjang | Tim Arsitektur |

### Kolom Persetujuan Direksi & Pimpinan Divisi

| Jabatan / Posisi | Nama Pejabat | Tanda Tangan | Tanggal |
|------------------|--------------|--------------|---------|
| Direktur Utama PT. A | ____________________ | ____________________ | 31 Mei 2026 |
| Head of Information Technology | ____________________ | ____________________ | 31 Mei 2026 |
| Head of Finance & Tax Compliance | ____________________ | ____________________ | 31 Mei 2026 |
| Head of Legal Affairs | ____________________ | ____________________ | 31 Mei 2026 |

---

## BAB 1: RINGKASAN EKSEKUTIF & PRINSIP BISNIS

### 1.1 Latar Belakang Ekosistem

Grup usaha mengelola enam entitas hukum terpisah berbentuk Perseroan Terbatas (PT):

| Kode | Entitas | Peran |
|------|---------|-------|
| PTA | **PT. A** | Central Operational Hub (Pusat) |
| PT1 | **PT. Satu** | Sister Company (Whitelabel) |
| PT2 | **PT. Dua** | Sister Company (Whitelabel) |
| PT3 | **PT. Tiga** | Sister Company (Whitelabel) |
| PT4 | **PT. Empat** | Sister Company (Whitelabel) |
| PT5 | **PT. Lima** | Sister Company (Whitelabel) |

**PT. A** ditetapkan sebagai entitas sentral yang mengelola:
- Gudang dan stok barang fisik
- Integrasi API dan sistem IT
- Tim operasional, finance, dan customer service
- Rekening bank utama dan settlement

**Lima Sister Companies** berfungsi sebagai whitelabel vehicles yang namanya dipinjam secara bergantian di hadapan konsumen demi variasi administratif, segmentasi pasar, atau regulasi formal setempat. Masing-masing memiliki NPWP, rekening bank, dan pembukuan sendiri.

Penyaluran seluruh pesanan dari pasar diakomodasi oleh **Aplikasi Netral (Aggregator)** yang bertindak sebagai alat bantu penyalur data.

### 1.2 Tujuan Strategis Sistem

1. **Satu Titik Transaksi (Single Entry)** — Transaksi diproses, dipotong stok, dan dicatat keuangan sebanyak 1 kali di sistem PT. A
2. **Whitelabel Sempurna** — Di mata konsumen, seluruh ekosistem (harga, komunikasi, VA bank, invoice fisik) 100% menggunakan identitas Sister Company
3. **Kepatuhan Hukum Pajak Tertinggi** — Metode perdagangan riil (*Intercompany Back-to-Back Trading*) berbasis HPP + markup operasional yang wajar (*Cost-Plus Method*)

### 1.3 Prinsip Arsitektur: Single Database

Sistem menggunakan **Single Database, Shared Schema** dengan isolasi data via kolom `id_perusahaan`. Alasan:

- Stok terpusat — 1x potong stok, atomic, tanpa risiko double-booked
- Trigger otomatis — real-time mutasi stok administratif di sister company
- Laporan konsolidasi — 1 query, tanpa join 6 database
- Operasional — backup 1 DB, 1 maintenance, biaya rendah

---

## BAB 2: ARSITEKTUR DATABASE TERPUSAT (POSTGRESQL DDL)

### 2.1 Entity Relationship Diagram (Konseptual)

```
master_perusahaan (1) ──→ (N) orders
master_perusahaan (1) ──→ (N) konfigurasi_markup_afiliasi
master_perusahaan (1) ──→ (N) intercompany_ledger
master_perusahaan (1) ──→ (N) kartu_stok_sister_company
master_perusahaan (1) ──→ (N) jurnal_akuntansi_sister
master_perusahaan (1) ──→ (N) pembelian_sister_pihak_ketiga
master_produk    (1) ──→ (N) order_details
master_produk    (1) ──→ (N) pembelian_sister_pihak_ketiga
orders           (1) ──→ (N) order_details
orders           (1) ──→ (1) intercompany_ledger
orders           (1) ──→ (N) kartu_stok_sister_company
orders           (1) ──→ (N) jurnal_akuntansi_sister
```

### 2.2 Skrip DDL

```sql
-- =============================================
-- 1. TABEL MASTER DATA 6 PERUSAHAAN
-- =============================================
CREATE TABLE master_perusahaan (
    id_perusahaan SERIAL PRIMARY KEY,
    nama_pt VARCHAR(255) NOT NULL,
    kode_pt VARCHAR(10) UNIQUE NOT NULL, -- 'PTA', 'PT1', 'PT2', 'PT3', 'PT4', 'PT5'
    alamat_legal TEXT NOT NULL,
    npwp VARCHAR(50) NOT NULL,
    email_domain VARCHAR(100) NOT NULL,
    logo_url VARCHAR(255) NOT NULL,
    is_central BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

-- Seed data: 1 pusat + 5 sister
INSERT INTO master_perusahaan (nama_pt, kode_pt, alamat_legal, npwp, email_domain, logo_url, is_central) VALUES
('PT. A', 'PTA', 'Jl. Pusat Niaga No.1, Jakarta', '01.234.567.8-001.000', 'pta.com', '/logo/pta.png', TRUE),
('PT. Satu', 'PT1', 'Jl. Satu No.2, Jakarta', '01.234.567.8-002.000', 'ptsatu.com', '/logo/pt1.png', FALSE),
('PT. Dua', 'PT2', 'Jl. Dua No.3, Jakarta', '01.234.567.8-003.000', 'ptdua.com', '/logo/pt2.png', FALSE),
('PT. Tiga', 'PT3', 'Jl. Tiga No.4, Jakarta', '01.234.567.8-004.000', 'pttiga.com', '/logo/pt3.png', FALSE),
('PT. Empat', 'PT4', 'Jl. Empat No.5, Jakarta', '01.234.567.8-005.000', 'ptempat.com', '/logo/pt4.png', FALSE),
('PT. Lima', 'PT5', 'Jl. Lima No.6, Jakarta', '01.234.567.8-006.000', 'ptlima.com', '/logo/pt5.png', FALSE);

-- =============================================
-- 2. TABEL MASTER PRODUK TERPUSAT (MILIK PT. A)
-- =============================================
CREATE TABLE master_produk (
    id_produk VARCHAR(50) PRIMARY KEY,
    nama_produk VARCHAR(255) NOT NULL,
    hpp_internal_pta DECIMAL(15,2) NOT NULL,
    harga_jual_konsumen DECIMAL(15,2) NOT NULL,
    stok_pusat INT NOT NULL DEFAULT 0
);

-- =============================================
-- 3. TABEL KONFIGURASI MARGIN OPERASIONAL
-- =============================================
CREATE TABLE konfigurasi_markup_afiliasi (
    id_konfigurasi SERIAL PRIMARY KEY,
    id_perusahaan INT NOT NULL UNIQUE,
    nilai_markup_operasional_pta DECIMAL(15,2) NOT NULL DEFAULT 25000.00,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_perusahaan) REFERENCES master_perusahaan(id_perusahaan) ON DELETE RESTRICT
);

-- =============================================
-- 4. TABEL TRANSAKSI UTAMA (ORDER HEADER)
-- =============================================
CREATE TABLE orders (
    id_order VARCHAR(50) PRIMARY KEY,
    tanggal_transaksi TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    id_perusahaan_penebeng INT NOT NULL,
    id_sumber_order VARCHAR(50) DEFAULT 'AGGREGATOR', -- 'AGGREGATOR', 'SALES_SISTER', 'MANUAL'
    nama_pelanggan VARCHAR(255) NOT NULL,
    alamat_pelanggan TEXT NOT NULL,
    total_dpp DECIMAL(15,2) NOT NULL,
    total_ppn DECIMAL(15,2) NOT NULL,
    grand_total DECIMAL(15,2) NOT NULL,
    status_order VARCHAR(50) NOT NULL DEFAULT 'PENDING',
    -- PENDING, PAID, SHIPPED, DELIVERED, CANCELLED, REFUNDED
    FOREIGN KEY (id_perusahaan_penebeng) REFERENCES master_perusahaan(id_perusahaan) ON DELETE RESTRICT
);

-- =============================================
-- 5. TABEL ITEM TRANSAKSI (ORDER DETAIL)
-- =============================================
CREATE TABLE order_details (
    id_detail SERIAL PRIMARY KEY,
    id_order VARCHAR(50) NOT NULL,
    id_produk VARCHAR(50) NOT NULL,
    qty INT NOT NULL,
    harga_satuan_konsumen DECIMAL(15,2) NOT NULL,
    hpp_satuan_pta DECIMAL(15,2) NOT NULL,
    FOREIGN KEY (id_order) REFERENCES orders(id_order) ON DELETE CASCADE,
    FOREIGN KEY (id_produk) REFERENCES master_produk(id_produk) ON DELETE RESTRICT
);

-- =============================================
-- 6. TABEL LOG TRANSAKSI AKUNTANSI (INTERCOMPANY LEDGER)
-- =============================================
CREATE TABLE intercompany_ledger (
    id_intercompany SERIAL PRIMARY KEY,
    id_order VARCHAR(50) NOT NULL UNIQUE,
    id_sister_company INT NOT NULL,
    nilai_jual_ke_konsumen DECIMAL(15,2) NOT NULL,
    nilai_beli_dari_pta DECIMAL(15,2) NOT NULL,
    nilai_profit_bersih_sister DECIMAL(15,2) NOT NULL,
    ppn_keluaran_sister DECIMAL(15,2) NOT NULL DEFAULT 0,
    ppn_masukan_sister DECIMAL(15,2) NOT NULL DEFAULT 0,
    ppn_kurang_bayar DECIMAL(15,2) NOT NULL DEFAULT 0,
    status_settlement VARCHAR(30) NOT NULL DEFAULT 'UNSETTLED',
    -- UNSETTLED, SETTLED
    FOREIGN KEY (id_order) REFERENCES orders(id_order) ON DELETE CASCADE,
    FOREIGN KEY (id_sister_company) REFERENCES master_perusahaan(id_perusahaan) ON DELETE RESTRICT
);

-- =============================================
-- 7. TABEL KARTU STOK SISTER COMPANY
-- =============================================
CREATE TABLE kartu_stok_sister_company (
    id_log SERIAL PRIMARY KEY,
    id_order VARCHAR(50) NOT NULL,
    id_perusahaan_sister INT NOT NULL,
    id_produk VARCHAR(50) NOT NULL,
    waktu_mutasi TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    jenis_mutasi VARCHAR(10) NOT NULL, -- 'MASUK' atau 'KELUAR'
    qty INT NOT NULL,
    saldo_stok_berjalan INT NOT NULL,
    keterangan VARCHAR(255),
    dokumen_ref VARCHAR(100), -- Nomor referensi PO/GRN/SO/DN
    FOREIGN KEY (id_order) REFERENCES orders(id_order) ON DELETE CASCADE,
    FOREIGN KEY (id_perusahaan_sister) REFERENCES master_perusahaan(id_perusahaan) ON DELETE RESTRICT
);

-- =============================================
-- 8. TABEL JURNAL AKUNTANSI SISTER COMPANY (BARU)
-- =============================================
CREATE TABLE jurnal_akuntansi_sister (
    id_jurnal SERIAL PRIMARY KEY,
    id_order VARCHAR(50) NOT NULL,
    id_sister INT NOT NULL,
    tanggal_jurnal TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    akun_debet VARCHAR(100) NOT NULL,
    akun_kredit VARCHAR(100) NOT NULL,
    nominal DECIMAL(15,2) NOT NULL,
    keterangan VARCHAR(255),
    kategori VARCHAR(30) NOT NULL,
    -- 'PENJUALAN', 'PEMBELIAN_PTA', 'SETTLEMENT', 'PPN', 'RETUR'
    FOREIGN KEY (id_order) REFERENCES orders(id_order) ON DELETE CASCADE,
    FOREIGN KEY (id_sister) REFERENCES master_perusahaan(id_perusahaan) ON DELETE RESTRICT
);

-- =============================================
-- 9. TABEL JURNAL PPN SISTER COMPANY (BARU)
-- =============================================
CREATE TABLE jurnal_ppn_sister (
    id_jurnal SERIAL PRIMARY KEY,
    id_sister INT NOT NULL,
    id_order VARCHAR(50) NOT NULL,
    jenis_ppn VARCHAR(20) NOT NULL, -- 'MASUKAN' atau 'KELUARAN'
    dpp DECIMAL(15,2) NOT NULL,
    ppn_nominal DECIMAL(15,2) NOT NULL,
    lawan_transaksi VARCHAR(255),
    masa_pajak VARCHAR(7) NOT NULL, -- '2026-05'
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_sister) REFERENCES master_perusahaan(id_perusahaan) ON DELETE RESTRICT,
    FOREIGN KEY (id_order) REFERENCES orders(id_order) ON DELETE CASCADE
);

-- =============================================
-- 10. TABEL PEMBELIAN SISTER DARI PIHAK KETIGA (BARU)
-- =============================================
CREATE TABLE pembelian_sister_pihak_ketiga (
    id_pembelian VARCHAR(50) PRIMARY KEY,
    id_sister INT NOT NULL,
    id_supplier VARCHAR(100) NOT NULL,
    nama_supplier VARCHAR(255) NOT NULL,
    id_produk VARCHAR(50) NOT NULL,
    qty INT NOT NULL,
    harga_satuan DECIMAL(15,2) NOT NULL,
    total_harga DECIMAL(15,2) NOT NULL,
    status VARCHAR(30) NOT NULL DEFAULT 'OPEN',
    -- OPEN, GRN_DONE, PAID, CLOSED
    lokasi_gudang VARCHAR(50) DEFAULT 'Gudang Pusat PT.A',
    nomor_po VARCHAR(100),
    nomor_grn VARCHAR(100),
    tanggal_pembelian DATE NOT NULL,
    FOREIGN KEY (id_sister) REFERENCES master_perusahaan(id_perusahaan) ON DELETE RESTRICT,
    FOREIGN KEY (id_produk) REFERENCES master_produk(id_produk) ON DELETE RESTRICT
);
```

---

## BAB 3: INTEGRASI API APLIKASI NETRAL & JSON PAYLOAD

### 3.1 Arsitektur Komunikasi

```
APLIKASI NETRAL (Aggregator)
  - Konsumen pilih produk
  - Sistem tentukan PT penjual (round-robin / stok / preferensi)
  - Kirim 1 POST ke gateway PT. A
        │
        ▼
API GATEWAY PT. A (Single Endpoint)
  POST https://api.pta.com/v1/orders
        │
        ▼
DATABASE PUSAT PT. A
  - INSERT orders + order_details
  - Generate VA bank
  - Trigger stok & kartu stok
```

### 3.2 Gateway Endpoint Target

```
POST https://api.pta.com/v1/orders
```

### 3.3 Struktur Payload JSON

**Contoh: Transaksi atas nama PT. Tiga**

```json
{
  "api_authentication": {
    "api_key": "LIVE_SECRET_KEY_PTA_CENTRAL_XYZ888"
  },
  "order_header": {
    "order_id": "ORD-PT3-2026-00001",
    "id_perusahaan_penebeng": 3,
    "sumber_order": "AGGREGATOR",
    "customer_name": "CV. Delta Nusantara",
    "customer_address": "Kawasan Industri MM2100 Blok C, Cikarang",
    "payment_gateway_provider": "XENDIT"
  },
  "order_items": [
    {
      "product_id": "PROD-102",
      "qty": 5,
      "price_per_unit": 200000
    }
  ]
}
```

**Contoh: Order dari Sales Sister Company langsung**

```json
{
  "api_authentication": {
    "api_key": "LIVE_SECRET_KEY_PTA_CENTRAL_XYZ888"
  },
  "order_header": {
    "order_id": "ORD-PT3-2026-00002",
    "id_perusahaan_penebeng": 3,
    "sumber_order": "SALES_SISTER",
    "sales_person": "Budi (Sales PT. Tiga)",
    "customer_name": "PT. Mitra Sejahtera",
    "customer_address": "Jl. Raya Industri No. 10, Surabaya",
    "payment_gateway_provider": "MIDTRANS"
  },
  "order_items": [
    {
      "product_id": "PROD-105",
      "qty": 20,
      "price_per_unit": 150000
    }
  ]
}
```

---

## BAB 4: ARSITEKTUR JARINGAN KOMUNIKASI (OMNICHANNEL MASKING)

### 4.1 Mekanisme WhatsApp Business API (Multi-Account Routing)

```
SISTEM DAFTAR NOMOR:
  PT. Satu  → 62811-xxxx-001 (terdaftar atas nama PT. Satu)
  PT. Dua   → 62811-xxxx-002 (terdaftar atas nama PT. Dua)
  PT. Tiga  → 62811-xxxx-003 (terdaftar atas nama PT. Tiga)
  PT. Empat → 62811-xxxx-004 (terdaftar atas nama PT. Empat)
  PT. Lima  → 62811-xxxx-005 (terdaftar atas nama PT. Lima)
                        │
                        ▼
           DASHBOARD MULTI-AGENT PT. A
           (1 layar, 5 jalur nomor)
```

**Logika Visual Staf:**
- Chat masuk ke nomor PT. Tiga → pop-up warna KUNING
- Templat sapaan otomatis: *"Selamat datang di **PT. Tiga**, ada yang bisa kami bantu?"*
- Staf DILARANG menyebut "PT. A" di saluran ini

### 4.2 Masking Email (SMTP Relay Configuration)

PT. A memegang hak akses DNS untuk seluruh domain sister:
- `ptsatu.com`, `ptdua.com`, `pttiga.com`, `ptempat.com`, `ptlima.com`

Setiap email otomatis dikirim dengan `From: noreply@pttiga.com` (sesuai PT penebeng), bukan `@pta.com`.

### 4.3 Logika Cetak Dokumen Dinamis

**Dokumen Berjenjang yang Wajib Ada (Baru):**

Setiap transaksi menghasilkan dokumen berikut atas nama Sister Company:

| No | Dokumen | Keterangan |
|----|---------|------------|
| 1 | **Purchase Order (PO)** | Sister "beli" dari PT. A (internal) |
| 2 | **Goods Receipt Note (GRN)** | Barang "diterima" sister |
| 3 | **Sales Order (SO)** | Pesanan dari konsumen ke sister |
| 4 | **Delivery Note (DN)** | Pengiriman barang atas nama sister |
| 5 | **Sales Invoice** | Tagihan sister ke konsumen |
| 6 | **Intercompany Invoice** | Tagihan PT. A ke sister |

**Logika Template:**
```
BACA orders.id_perusahaan_penebeng
CARI data DI master_perusahaan WHERE id_perusahaan = orders.id_perusahaan_penebeng

GUNAKAN master_perusahaan.logo_url UNTUK Kop Surat
GUNAKAN master_perusahaan.nama_pt UNTUK Nama Penjual
GUNAKAN master_perusahaan.alamat_legal UNTUK Alamat
GUNAKAN master_perusahaan.npwp UNTUK Faktur Pajak
CETAK PDF ("INV/" + master_perusahaan.kode_pt + "/2026/" + orders.id_order)
```

---

## BAB 5: INFRASTRUKTUR PERBANKAN & ALIRAN KAS (AUTO-POOLING VA)

### 5.1 Aliran Kas Per Transaksi

```
KONSUMEN
    │ (lihat di M-Banking: "VA PT. TIGA / NAMA KONSUMEN")
    │ Transfer Rp111.000
    ▼
BANK / PAYMENT GATEWAY (Xendit, Midtrans, BCA, Mandiri)
    │ Auto-pooling / Real-Time Sweep
    ▼
REKENING UTAMA PT. A (Kas Fisik 100% Terkonsolidasi)
```

### 5.2 Pembukaan Rekening Operasional Sister (Baru)

Untuk kebutuhan pembelian mandiri dan kewajaran arus kas, setiap sister company memiliki **2 rekening**:

| Rekening | Fungsi | Dimiliki Oleh | Dikelola Oleh |
|----------|--------|---------------|---------------|
| **VA Konsumen** | Menerima pembayaran dari konsumen (auto-pooling ke PT. A) | Atas nama Sister | PT. A (via API bank) |
| **Rekening Operasional** | Dana modal kerja, bayar supplier pihak ketiga, terima settlement | Atas nama Sister | PT. A (signatory ganda bila perlu) |

### 5.3 Mekanisme Host-to-Host (H2H) Virtual Account

1. PT. A kerja sama dengan bank nasional (BCA/Mandiri/BNI) atau aggregator (Xendit/Midtrans)
2. API PT. A kirim perintah ke bank:
   ```json
   {
     "create_va": {
       "external_id": "ORD-PT3-2026-00001",
       "bank_code": "BCA",
       "name": "PT. TIGA / CV. DELTA NUSANTARA",
       "expected_amount": 111000
     }
   }
   ```
3. Bank terbitkan VA unik atas nama Sister Company
4. Setiap rupiah masuk → auto-sweep → rekening PT. A
5. Webhook `payment_callback` → PT. A update status order

---

## BAB 6: KEUANGAN, AKUNTANSI & REKONSILIASI PAJAK (METODE COST-PLUS)

### 6.1 Matriks Alokasi Finansial

| Komponen | Persentase | Keterangan |
|----------|-----------|------------|
| HPP Riil Persediaan | ~70% | Biaya modal PT. A dari supplier |
| Mark-up Operasional Hub | ~25% | Sewa aplikasi, gaji tim, utilitas |
| Margin Laba Sister | ~5% | Keuntungan bersih di pembukuan sister |

### 6.2 Simulasi Lengkap (PPN 11%)

**Data Transaksi:**
- Harga konsumen (DPP): Rp100.000
- HPP riil PT. A: Rp70.000
- Mark-up operasional: Rp25.000
- Harga jual PT. A ke sister: Rp95.000

#### LANGKAH 1: Penjualan Sister ke Konsumen

Konsumen bayar Rp111.000 via VA a/n PT. Tiga.  
Dana masuk ke rekening PT. A (auto-pooling).

**Dokumen:** Sales Invoice a/n PT. Tiga  
**Jurnal Sister:**
| Debet | Kredit | Nominal |
|-------|--------|---------|
| Kas & Bank (via PT. A) | | Rp111.000 |
| | Penjualan | Rp100.000 |
| | PPN Keluaran | Rp11.000 |

**Jurnal PPN Sister:**
```sql
INSERT INTO jurnal_ppn_sister (id_sister, id_order, jenis_ppn, dpp, ppn_nominal, lawan_transaksi, masa_pajak)
VALUES (3, 'ORD-PT3-2026-00001', 'KELUARAN', 100000, 11000, 'KONSUMEN', '2026-05');
```

#### LANGKAH 2: Pembelian Sister dari PT. A (Back-to-Back)

PT. A terbitkan Intercompany Invoice ke PT. Tiga:
- DPP: Rp95.000 (HPP 70.000 + Markup 25.000)
- PPN: Rp10.450
- Total: Rp105.450

**Dokumen:** Purchase Invoice dari PT. A ke PT. Tiga  
**Jurnal Sister:**
| Debet | Kredit | Nominal |
|-------|--------|---------|
| Pembelian (HPP) | | Rp95.000 |
| PPN Masukan | | Rp10.450 |
| | Hutang ke PT. A | Rp105.450 |

**Jurnal PPN Sister:**
```sql
INSERT INTO jurnal_ppn_sister (id_sister, id_order, jenis_ppn, dpp, ppn_nominal, lawan_transaksi, masa_pajak)
VALUES (3, 'ORD-PT3-2026-00001', 'MASUKAN', 95000, 10450, 'PT. A', '2026-05');
```

#### LANGKAH 3: Settlement Akhir Bulan

```
Total dana konsumen di PT. A:   Rp111.000
Tagihan PT. A ke PT. Tiga:      Rp105.450
Sisa dana untuk PT. Tiga:       Rp  5.550

PPN Kurang Bayar: 11.000 - 10.450 = Rp550
Laba Bersih: 5.550 - 550 = Rp5.000
```

**Jurnal Settlement Sister:**
| Debet | Kredit | Nominal |
|-------|--------|---------|
| Hutang ke PT. A | | Rp105.450 |
| | Kas & Bank (rek. operasional sister) | Rp105.450 |
| Kas & Bank | | Rp5.550 |
| | Laba Ditahan | Rp5.000 |
| | PPN Kurang/Lebih Bayar | Rp550 |

### 6.3 Perhitungan Pajak Final

**SPT Masa PPN PT. Tiga:**
| Komponen | Nilai |
|----------|-------|
| PPN Keluaran | Rp11.000 |
| PPN Masukan | Rp10.450 |
| **Kurang Bayar** | **Rp550** → disetor ke kas negara |

**Laba Bersih PT. Tiga:**
| Komponen | Nilai |
|----------|-------|
| Kas diterima | Rp5.550 |
| Setor PPN | (Rp550) |
| **Laba Bersih** | **Rp5.000** (5% dari omset — wajar) |

---

## BAB 7: JURNAL AKUNTANSI SISTER COMPANY LENGKAP

### 7.1 Standar Jurnal Double-Entry per Transaksi

#### A. Saat Order PAID (Penjualan ke Konsumen)

```sql
-- Debet: Piutang ke PT. A (atau Kas via pooling)
INSERT INTO jurnal_akuntansi_sister (id_order, id_sister, akun_debet, akun_kredit, nominal, keterangan, kategori)
VALUES 
('ORD-PT3-2026-00001', 3, 'Kas & Bank - Rek. VA', 'Penjualan', 100000, 'Penjualan ke CV. Delta Nusantara', 'PENJUALAN'),
('ORD-PT3-2026-00001', 3, 'Kas & Bank - Rek. VA', 'PPN Keluaran', 11000, 'PPN 11% penjualan', 'PPN');
```

#### B. Saat Penerbitan Intercompany Invoice (Beli dari PT. A)

```sql
INSERT INTO jurnal_akuntansi_sister (id_order, id_sister, akun_debet, akun_kredit, nominal, keterangan, kategori)
VALUES 
('ORD-PT3-2026-00001', 3, 'Pembelian - HPP', 'Hutang Dagang ke PT. A', 95000, 'Pembelian back-to-back dari PT. A', 'PEMBELIAN_PTA'),
('ORD-PT3-2026-00001', 3, 'PPN Masukan', 'Hutang Dagang ke PT. A', 10450, 'PPN Masukan atas pembelian', 'PPN');
```

#### C. Saat Retur (Konsumen Kembalikan Barang)

```sql
INSERT INTO jurnal_akuntansi_sister (id_order, id_sister, akun_debet, akun_kredit, nominal, keterangan, kategori)
VALUES 
('ORD-PT3-2026-00001', 3, 'Retur Penjualan', 'Piutang ke PT. A', 100000, 'Retur dari CV. Delta Nusantara', 'RETUR'),
('ORD-PT3-2026-00001', 3, 'PPN Keluaran', 'Piutang ke PT. A', 11000, 'Pembatalan PPN atas retur', 'RETUR');

-- Balik jurnal pembelian dari PT. A
INSERT INTO jurnal_akuntansi_sister (id_order, id_sister, akun_debet, akun_kredit, nominal, keterangan, kategori)
VALUES 
('ORD-PT3-2026-00001', 3, 'Hutang Dagang ke PT. A', 'Retur Pembelian - HPP', 95000, 'Koreksi retur ke PT. A', 'RETUR'),
('ORD-PT3-2026-00001', 3, 'Hutang Dagang ke PT. A', 'PPN Masukan', 10450, 'Koreksi PPN Masukan retur', 'RETUR');
```

### 7.2 Kartu Stok Formal Sister Company

Setiap sister company memiliki kartu stok yang tampak seperti perusahaan dagang normal:

| Tanggal | Ref | Masuk | Keluar | Saldo | Keterangan |
|---------|-----|-------|--------|-------|------------|
| 1/5/2026 | PO-001/PT3 | 50 | - | 50 | Beli dari PT. A |
| 3/5/2026 | SO-001/PT3 | - | 5 | 45 | Jual ke CV. Delta |
| 5/5/2026 | SO-002/PT3 | - | 3 | 42 | Jual ke PT. XYZ |
| 10/5/2026 | PO-EKST-001/PT3 | 20 | - | 62 | Beli dari Supplier X (mandiri) |
| 31/5/2026 | (Penutupan) | - | - | 0 | Saldo akhir bulan = 0 |

**Catatan:** Di akhir bulan, saldo kartu stok sister yang bersumber dari PT. A harus 0 (karena pass-through). Stok dari pembelian mandiri (pihak ketiga) dapat memiliki saldo > 0.

---

## BAB 8: TATA KELOLA HAK AKSES (ROLE-BASED ACCESS CONTROL)

### 8.1 Role Definitions

| Role | Hak Akses | Filter Data |
|------|-----------|-------------|
| **Super Admin** (Direksi / Tim IT PT. A) | CRUD seluruh data 6 perusahaan, konfigurasi markup | Tidak ada filter |
| **Operator Hub** (Staf Admin, Finance, Gudang PT. A) | Lihat semua antrean order, proses stok, cetak invoice whitelabel, trigger pengiriman | Semua entitas, tapi hanya pada modul operasional |
| **Staf Eksternal Afiliasi** (Manajemen PT. 1-5) | Read-only, unduh CSV laporan | `WHERE id_perusahaan_penebeng = USER_COMPANY_ID` |

### 8.2 Query Filter Otomatis

```sql
-- Staf PT. Tiga login
SELECT * FROM orders WHERE id_perusahaan_penebeng = 3;
SELECT * FROM jurnal_akuntansi_sister WHERE id_sister = 3;
SELECT * FROM jurnal_ppn_sister WHERE id_sister = 3;
SELECT * FROM kartu_stok_sister_company WHERE id_perusahaan_sister = 3;
SELECT * FROM pembelian_sister_pihak_ketiga WHERE id_sister = 3;
```

---

## BAB 9: PROSEDUR OPERASIONAL STANDAR (SOP) PENANGANAN KOMPLAIN & RETUR

### 9.1 Tahap Penerimaan Laporan (Triage)

1. Konsumen hubungi WhatsApp Business resmi milik PT. Dua
2. Layar agen di PT. A memunculkan indikator merah [SUPPORT JALUR PT. DUA]
3. Agen buka percakapan dengan kalimat baku:
   *"Selamat pagi/siang, terima kasih telah menghubungi pusat layanan pelanggan **PT. Dua**. Saya [Nama Samaran Agen], ada yang bisa kami bantu terkait transaksi Anda?"*

### 9.2 Tahap Eksekusi Retur Fisik

- Alamat retur di dokumen konsumen:  
  *"Gudang Pusat Logistik Terpadu - **Divisi Retur PT. Dua**"*  
  (fisik: gudang PT. A, label: PT. Dua)

- Saat barang tiba → scan barcode → stok kembali ke `master_produk.stok_pusat`
- Kartu stok sister: catat retur masuk (MASUK)
- Jurnal sister: koreksi retur penjualan

### 9.3 Tahap Pengembalian Dana (Cash Refund)

- Persetujuan: Super Admin PT. A
- Transfer dari Rekening Utama PT. A via Disbursement API
- Header transfer: *"REFUND TRANSAKSI - **PT. DUA**"*
- Sistem koreksi `intercompany_ledger` dan `jurnal_akuntansi_sister`

---

## BAB 10: KERANGKA HUKUM & KLAUSA PERJANJIAN ANTA-PERUSAHAAN

### Klausul 1: Pemberian Mandat Hak Kuasa Operasional & Penyamaran Identitas

> "Pihak Kedua (Sister Company) dengan ini memberikan hak kuasa penuh, eksklusif, dan tidak dapat ditarik kembali kepada Pihak Kesatu (PT. A) sebagai hub pengelola operasional tunggal. Hak kuasa ini mencakup wewenang penuh bagi Pihak Kesatu untuk menggunakan, menampilkan, dan menyertakan nama legal, logo, atribut merek, nomor NPWP, dan parameter perpajakan milik Pihak Kedua di dalam aplikasi digital, dokumen penawaran harga, surat jalan, dan faktur penjualan yang diterbitkan kepada konsumen akhir."

### Klausul 2: Konsolidasi Arus Kas & Otorisasi Penyanderaan Saldo (Cash Pooling)

> "Kedua belah pihak sepakat bahwa seluruh aliran dana masuk dari konsumen yang bertransaksi atas nama identitas Pihak Kedua wajib ditampung melalui fasilitas Virtual Account Korporat yang dikelola di bawah sistem perbankan Pihak Kesatu. Pihak Kedua dengan sadar hukum melepaskan haknya untuk menguasai dana tersebut secara langsung di tingkat cabang dan memberikan otorisasi mutlak kepada institusi perbankan untuk melakukan penarikan saldo otomatis (sweep/pooling) secara real-time ke rekening giro utama milik Pihak Kesatu."

### Klausul 3: Skema Jual-Beli Kembali (Back-to-Back) dan Ketentuan Margin Wajar

> "Setiap transaksi penyerahan barang yang terjadi wajib diakui sebagai transaksi Jual-Beli Antar-Perusahaan (Intercompany Trading). Pihak Kesatu akan menerbitkan tagihan nilai pengadaan barang grosir kepada Pihak Kedua di akhir bulan dengan formula Nilai Perolehan Persediaan (HPP asli) ditambah biaya mark-up operasional yang wajar dan konsisten sesuai prinsip arm's length principle. Pihak Kedua berhak mendapatkan sisa selisih margin keuntungan bersih dagang murni yang mengendap di dalam pembukuannya sebagai laba ditahan resmi setelah dikurangi kewajiban penyetoran masa pajak."

### Klausul 4: Pembelian Mandiri dari Pihak Ketiga (Baru)

> "Pihak Kedua (Sister Company) diberikan hak untuk melakukan pembelian barang secara mandiri dari pihak ketiga di luar Pihak Kesatu (PT. A), dengan ketentuan: (a) pembelian wajib dicatat dalam sistem terpusat agar stok titipan terdokumentasi, (b) dana pembelian berasal dari rekening operasional Sister Company, dan (c) barang titipan tidak boleh dicampur dengan stok milik PT. A tanpa pencatatan yang jelas."

---

## BAB 11: RENCANA PELUNCURAN, UAT MATRIX & GARIS WAKTU 30 HARI

### 11.1 Garis Waktu Implementasi (30 Hari Kerja)

| Week | Legal | Banking | IT Core | Omnichannel | Integrasi | Dynamic Doc | Training | Test & Launch |
|------|-------|---------|---------|-------------|-----------|-------------|----------|---------------|
| **W1** | Sign Contract & PKS | Submit KYC | - | - | - | - | - | - |
| **W2** | - | - | Deploy DDL SQL + Trigger | Link WA API | - | - | - | - |
| **W3** | - | - | - | - | Custom VA API + Jurnal | PDF Template + Dokumen Berjenjang | - | - |
| **W4** | - | - | - | - | - | - | Agent SOP | UAT & Go-Live |

### 11.2 Matriks UAT

| ID UAT | Sasaran | Skenario | Ekspektasi |
|--------|---------|----------|------------|
| **UAT-01** | Validasi Masking VA | Simulasi beli a/n PT. Lima, cek M-Banking | Layar tampilkan: "PT LIMA / NAMA KONSUMEN" |
| **UAT-02** | Anti-Duplicate Entry | Bayar order, cek `SELECT COUNT(*) FROM orders` | Bertambah tepat 1 record |
| **UAT-03** | Transfer Pricing Audit | 50 transaksi tiruan, jalankan `intercompany_ledger` | HPP dinamis, profit sister wajar (5%) |
| **UAT-04** (Baru) | **Jurnal Akuntansi Sister** | Cek `jurnal_akuntansi_sister` setelah order PAID | Double-entry lengkap: penjualan, PPN, HPP |
| **UAT-05** (Baru) | **Kartu Stok Formal** | Cek `kartu_stok_sister_company` per sister | MASUK + KELUAR, saldo akhir = 0 |

---

## BAB 12: LEMBAR CHECKLIST AUDIT & REKONSILIASI BULANAN

### Tabel Checklist Verifikasi Finansial

| No | Langkah Kerja | Target | Status | Paraf |
|----|--------------|--------|--------|-------|
| 1 | **Sinkronisasi Data Transaksi** (Order vs Payment Gateway) | Total uang di bank = total `grand_total` orders PAID | [ ] Lolos / [ ] Gagal | |
| 2 | **Validasi Kartu Stok Sister** (Saldo Nol) | Saldo `kartu_stok_sister_company` per sister = 0 di akhir bulan | [ ] Lolos / [ ] Gagal | |
| 3 | **Penerbitan Intercompany Invoice** | Faktur PT. A ke sister sesuai `intercompany_ledger.nilai_beli_dari_pta` | [ ] Lolos / [ ] Gagal | |
| 4 | **Pencadangan Dana Pajak** (PPN & PPh) | PPN kurang bayar sudah dipisahkan, tidak ikut ditransfer sebagai profit | [ ] Lolos / [ ] Gagal | |
| 5 | **Eksekusi Transfer Settlement** | 1 transfer bersih ke rekening operasional masing-masing sister | [ ] Lolos / [ ] Gagal | |
| 6 | **Verifikasi Jurnal Akuntansi Sister** (Baru) | Double-entry balance: total debet = total kredit per sister | [ ] Lolos / [ ] Gagal | |
| 7 | **Verifikasi Jurnal PPN** (Baru) | PPN Keluaran - PPN Masukan = Kurang/Lebih Bayar sesuai SPT | [ ] Lolos / [ ] Gagal | |

---

## BAB 13: DATABASE TRIGGER OTOMATIS (MUTASI STOK REAL-TIME PER TRANSAKSI)

### 13.1 Fungsi Trigger Utama

```sql
CREATE OR REPLACE FUNCTION proses_mutasi_stok_per_transaksi()
RETURNS TRIGGER AS $$
DECLARE
    item_row RECORD;
    v_markup DECIMAL(15,2);
    v_hpp_beli_sister DECIMAL(15,2);
    v_ppn_keluaran DECIMAL(15,2);
    v_ppn_masukan DECIMAL(15,2);
    v_profit DECIMAL(15,2);
BEGIN
    -- Hanya berjalan saat PAID (dari PENDING)
    IF (NEW.status_order = 'PAID' AND OLD.status_order = 'PENDING') THEN
        
        FOR item_row IN SELECT id_produk, qty, hpp_satuan_pta FROM order_details WHERE id_order = NEW.id_order LOOP
            
            -- 1. Mutasi Fisik: Kurangi stok pusat PT. A
            UPDATE master_produk 
            SET stok_pusat = stok_pusat - item_row.qty 
            WHERE id_produk = item_row.id_produk;

            -- 2. Mutasi Administratif: Barang masuk ke Sister dari PT. A
            INSERT INTO kartu_stok_sister_company 
                (id_order, id_perusahaan_sister, id_produk, jenis_mutasi, qty, saldo_stok_berjalan, keterangan, dokumen_ref)
            VALUES 
                (NEW.id_order, NEW.id_perusahaan_penebeng, item_row.id_produk, 
                 'MASUK', item_row.qty, item_row.qty, 
                 'Pasokan barang masuk dari PT. A', 'PO/' || NEW.id_perusahaan_penebeng || '/' || NEW.id_order);

            -- 3. Mutasi Administratif: Barang keluar dari Sister ke Konsumen
            INSERT INTO kartu_stok_sister_company 
                (id_order, id_perusahaan_sister, id_produk, jenis_mutasi, qty, saldo_stok_berjalan, keterangan, dokumen_ref)
            VALUES 
                (NEW.id_order, NEW.id_perusahaan_penebeng, item_row.id_produk, 
                 'KELUAR', item_row.qty, 0, 
                 'Penyerahan barang langsung ke pelanggan', 'SO/' || NEW.id_perusahaan_penebeng || '/' || NEW.id_order);

        END LOOP;

        -- 4. Catat ke Intercompany Ledger
        -- Hitung markup dari konfigurasi
        SELECT COALESCE(nilai_markup_operasional_pta, 25000) INTO v_markup
        FROM konfigurasi_markup_afiliasi WHERE id_perusahaan = NEW.id_perusahaan_penebeng;

        v_hpp_beli_sister := (SELECT SUM(hpp_satuan_pta * qty) FROM order_details WHERE id_order = NEW.id_order) 
                             + (v_markup * (SELECT SUM(qty) FROM order_details WHERE id_order = NEW.id_order));
        v_ppn_keluaran := NEW.total_ppn;
        v_ppn_masukan := v_hpp_beli_sister * 0.11;
        v_profit := NEW.total_dpp - v_hpp_beli_sister;

        INSERT INTO intercompany_ledger 
            (id_order, id_sister_company, nilai_jual_ke_konsumen, nilai_beli_dari_pta, 
             nilai_profit_bersih_sister, ppn_keluaran_sister, ppn_masukan_sister, 
             ppn_kurang_bayar, status_settlement)
        VALUES 
            (NEW.id_order, NEW.id_perusahaan_penebeng, NEW.total_dpp, v_hpp_beli_sister,
             v_profit, v_ppn_keluaran, v_ppn_masukan, 
             (v_ppn_keluaran - v_ppn_masukan), 'UNSETTLED');

        -- 5. Catat Jurnal Akuntansi Sister (Double-Entry)
        -- Penjualan ke konsumen
        INSERT INTO jurnal_akuntansi_sister (id_order, id_sister, akun_debet, akun_kredit, nominal, keterangan, kategori)
        VALUES 
            (NEW.id_order, NEW.id_perusahaan_penebeng, 'Kas & Bank - Rek. VA', 'Penjualan', NEW.total_dpp, 'Penjualan ke konsumen', 'PENJUALAN');

        INSERT INTO jurnal_akuntansi_sister (id_order, id_sister, akun_debet, akun_kredit, nominal, keterangan, kategori)
        VALUES 
            (NEW.id_order, NEW.id_perusahaan_penebeng, 'Kas & Bank - Rek. VA', 'PPN Keluaran', NEW.total_ppn, 'PPN 11% penjualan', 'PPN');

        -- Pembelian dari PT. A
        INSERT INTO jurnal_akuntansi_sister (id_order, id_sister, akun_debet, akun_kredit, nominal, keterangan, kategori)
        VALUES 
            (NEW.id_order, NEW.id_perusahaan_penebeng, 'Pembelian - HPP', 'Hutang Dagang ke PT. A', v_hpp_beli_sister, 'Pembelian back-to-back dari PT. A', 'PEMBELIAN_PTA');

        INSERT INTO jurnal_akuntansi_sister (id_order, id_sister, akun_debet, akun_kredit, nominal, keterangan, kategori)
        VALUES 
            (NEW.id_order, NEW.id_perusahaan_penebeng, 'PPN Masukan', 'Hutang Dagang ke PT. A', v_ppn_masukan, 'PPN Masukan', 'PPN');

        -- Catat Jurnal PPN Sister
        INSERT INTO jurnal_ppn_sister (id_sister, id_order, jenis_ppn, dpp, ppn_nominal, lawan_transaksi, masa_pajak)
        VALUES 
            (NEW.id_perusahaan_penebeng, NEW.id_order, 'KELUARAN', NEW.total_dpp, NEW.total_ppn, 'KONSUMEN', to_char(NEW.tanggal_transaksi, 'YYYY-MM'));

        INSERT INTO jurnal_ppn_sister (id_sister, id_order, jenis_ppn, dpp, ppn_nominal, lawan_transaksi, masa_pajak)
        VALUES 
            (NEW.id_perusahaan_penebeng, NEW.id_order, 'MASUKAN', v_hpp_beli_sister, v_ppn_masukan, 'PT. A', to_char(NEW.tanggal_transaksi, 'YYYY-MM'));

    END IF;

    -- Handle CANCELLED: kembalikan stok
    IF (NEW.status_order = 'CANCELLED' AND OLD.status_order != 'CANCELLED') THEN
        FOR item_row IN SELECT id_produk, qty FROM order_details WHERE id_order = NEW.id_order LOOP
            UPDATE master_produk SET stok_pusat = stok_pusat + item_row.qty 
            WHERE id_produk = item_row.id_produk;
        END LOOP;
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- Pasang trigger
CREATE TRIGGER trigger_order_paid_stok
    AFTER UPDATE ON orders
    FOR EACH ROW
    EXECUTE FUNCTION proses_mutasi_stok_per_transaksi();
```

### 13.2 Trigger untuk Pembelian Pihak Ketiga (Baru)

```sql
CREATE OR REPLACE FUNCTION proses_grn_pembelian_eksternal()
RETURNS TRIGGER AS $$
BEGIN
    IF (NEW.status = 'GRN_DONE') THEN
        -- Catat stok masuk sebagai titipan sister
        INSERT INTO kartu_stok_sister_company 
            (id_order, id_perusahaan_sister, id_produk, jenis_mutasi, qty, 
             saldo_stok_berjalan, keterangan, dokumen_ref)
        VALUES 
            (NEW.id_pembelian, NEW.id_sister, NEW.id_produk, 
             'MASUK', NEW.qty, NEW.qty, 
             'Pembelian mandiri dari ' || NEW.nama_supplier, NEW.nomor_po);
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_grn_pembelian_eksternal
    AFTER UPDATE ON pembelian_sister_pihak_ketiga
    FOR EACH ROW
    WHEN (NEW.status = 'GRN_DONE')
    EXECUTE FUNCTION proses_grn_pembelian_eksternal();
```

---

## BAB 14: PEMBELIAN SISTER COMPANY DARI PIHAK KETIGA

### 14.1 Skenario

Sister company dapat membeli barang langsung dari supplier eksternal (bukan dari PT. A) untuk:
- Diversifikasi produk yang tidak tersedia di stok PT. A
- Kebutuhan tender khusus
- Membangun track record pembelian mandiri

### 14.2 Alur Pembelian Mandiri

```
SISTER (PT. Tiga) terbitkan PO ke Supplier X (kop PT. Tiga)
    │
    ▼
Supplier X kirim barang ke Gudang PT. A
    │ (label: "PT. TIGA - TITIPAN - PO-001/PT3")
    ▼
PT. A terima barang → GRN (Goods Receipt Note) a/n PT. Tiga
    │ INSERT ke pembelian_sister_pihak_ketiga status = 'GRN_DONE'
    │ INSERT ke kartu_stok_sister_company: MASUK
    ▼
Supplier X kirim Invoice ke PT. Tiga
    │
    ▼
PT. Tiga bayar dari Rekening Operasional sendiri
    │ UPDATE pembelian_sister_pihak_ketiga status = 'PAID'
    ▼
Barang siap dijual atas nama PT. Tiga
```

### 14.3 Jurnal Pembelian Mandiri

```sql
-- Saat GRN (barang diterima)
INSERT INTO jurnal_akuntansi_sister (id_order, id_sister, akun_debet, akun_kredit, nominal, keterangan, kategori)
VALUES 
('PO-EKST-001/PT3', 3, 'Persediaan - Titipan Supplier X', 'Hutang Dagang ke Supplier X', 50000000, 'Pembelian mandiri', 'PEMBELIAN_EKSTERNAL');

-- Saat bayar ke Supplier X
INSERT INTO jurnal_akuntansi_sister (id_order, id_sister, akun_debet, akun_kredit, nominal, keterangan, kategori)
VALUES 
('PO-EKST-001/PT3', 3, 'Hutang Dagang ke Supplier X', 'Kas & Bank - Rek. Operasional', 50000000, 'Pembayaran ke Supplier X', 'PEMBELIAN_EKSTERNAL');
```

### 14.4 Implikasi Stok

- Barang titipan **tidak boleh dicampur** dengan stok PT. A secara fisik tanpa label jelas
- Di sistem, stok titipan dicatat terpisah (kolom `lokasi_gudang` = 'Gudang Pusat PT.A')
- Saat sister menjual barang ini, kartu stok mencatat KELUAR, dan dana penjualan tetap masuk via VA ke PT. A
- Settlement akhir bulan: nilai pembelian mandiri dikurangkan dari hak sister

### 14.5 Rekomendasi: Plafon & Limitasi

| Parameter | Rekomendasi |
|-----------|-------------|
| Plafon maksimal per sister per bulan | Rp50.000.000 (tahap awal) |
| Persetujuan | Super Admin PT. A |
| Rekening sumber dana | Rekening operasional sister |
| Supplier | Wajib terdaftar di sistem (memiliki NPWP) |

---

## PENUTUP

Dokumen arsitektur ini telah berstatus **Final, Certified, dan Komprehensif**. Seluruh sistem telah dirancang dengan:

- ✅ **Single Database** — efisien, atomic, mudah di-maintain
- ✅ **Multi-Tenancy Logical** — 6 entitas terisolasi via `id_perusahaan`
- ✅ **Double-Entry Accounting** — jurnal lengkap per sister company
- ✅ **Kartu Stok Formal** — MASUK/KELUAR, saldo berjalan
- ✅ **PPN Masukan & Keluaran** — siap SPT Masa
- ✅ **Dokumen Berjenjang** — PO, GRN, SO, DN, Invoice
- ✅ **Pembelian Pihak Ketiga** — fleksibilitas tanpa merusak arsitektur
- ✅ **UAT & Audit Checklist** — siap production
- ✅ **Legal & Tax Compliance** — Cost-Plus Method, Arm's Length Principle

Dokumen ini dapat langsung dibagikan kepada empat kepala divisi: **Legal Utama, Direktur Keuangan & Pajak, Product Manager IT Software, dan Kepala Pengawas Operasional** untuk memulai eksekusi sesuai garis waktu Week 1.

---

*Dokumen ini adalah versi 2.0 yang telah diperbarui dengan jurnal akuntansi lengkap, pembelian pihak ketiga, kartu stok formal, dan dokumen berjenjang.*
