# Insight Baru Proses Bisnis Apotek Siaga

**Tipe:** Aturan bisnis & implikasi desain sistem  
**Sumber:** Catatan proses bisnis dari operasional Apotek Siaga  
**Status:** Published  
**Terakhir diperbarui:** 24 Juli 2026

> Catatan ini melengkapi [`Dokumentasi_Awal_Sistem_Apotek_Siaga.md`](Dokumentasi_Awal_Sistem_Apotek_Siaga.md) §18.  
> **Implementasi istilah & rumus harga saat ini:** gunakan [`pricing-dpb-rules.md`](pricing-dpb-rules.md) (OTC = ecer, REG/VIP = kemasan, margin vs modal satuan, modal agregat titik PBF, total DPB incl. PPN). Dokumen insight ini tetap relevan untuk konteks operasional; bila bentrok terkait detail rumus harga, utamakan `pricing-dpb-rules.md`.

---

## Ringkasan

Tiga insight operasional utama yang memperkuat keputusan desain: stok dan harga **tidak boleh** hanya disimpan sebagai data sederhana di master obat. Sistem perlu membedakan data umum obat, harga beli per faktur/batch, harga jual aktif, histori perubahan harga, batch/expired date, dan supplier/PBF asal barang.

Untuk tahap awal, sistem tetap boleh dibuat sederhana, tetapi **struktur database harus disiapkan** agar mendukung batch, expired date, perubahan harga beli, dan margin harga jual.

**Keputusan alur harga (saat ini):** pencatatan DPB dan penentuan harga jual adalah **dua langkah** — simpan stok/tagihan dulu, lalu review harga di **Manajemen Harga** (antrian harian / modal beda / cari). Shortcut konfirmasi per faktur tetap ada.

---

## 1. Nomor Batch dan Expired Date Sebenarnya Ada di Faktur PBF

### Konteks

Faktur pembelian dari PBF hampir selalu mencantumkan data berikut:

- Nomor batch
- Expired date
- Quantity
- Harga beli
- Nomor faktur
- Nama barang

### Praktik saat ini

Admin belum sempat mencatat nomor batch dan expired date ke Excel. Pencatatan yang berjalan lebih fokus pada **quantity barang masuk**.

### Implikasi ke sistem

| Aspek | Ketentuan |
|-------|-----------|
| Desain form DPB | Field `nomor_batch` dan `tanggal_expired` **wajib tersedia** di form penerimaan barang/DPB |
| Tahap awal | Batch dan expired date **boleh opsional** agar admin tidak langsung terbebani |
| Status data | Sistem dapat memberi status **"data batch belum lengkap"** jika batch/expired belum diisi |
| Adopsi bertahap | Admin perlu dikenalkan dengan pencatatan batch dan expired date karena data tersebut **sudah tersedia di faktur** |

### Aturan bisnis

1. Sistem tetap perlu dirancang untuk mendukung pencatatan batch dan expired date sejak awal.
2. Ketiadaan data batch di Excel saat ini **bukan alasan** untuk mengabaikan field tersebut di sistem.
3. Transisi dari opsional ke wajib dapat dilakukan secara bertahap setelah admin terbiasa.
4. Stok batch dipakai untuk **FEFO / audit stok**, bukan sebagai bobot perhitungan modal harga jual.

---

## 2. Harga Beli Obat Bisa Berubah Sewaktu-waktu

### Konteks

Harga beli obat dari PBF dapat berubah kapan saja. Saat admin menginput faktur barang datang, admin langsung mengecek harga beli terbaru. Jika harga beli naik, **harga jual perlu ditinjau ulang** (bukan otomatis menimpa tanpa review).

Satu obat juga bisa dikirim dari **beberapa PBF**, sehingga harga beli untuk obat yang sama dapat berbeda tergantung:

- Supplier/PBF
- Waktu pembelian
- Faktur

### Persepsi “rata-rata harga” (keputusan desain)

Operasional membandingkan harga **antar PBF**, bukan merata-ratakan semua batch berstok:

| Metode UI | Titik per PBF | Agregat antar PBF |
|-----------|---------------|-------------------|
| **Rata-rata PBF** | Harga modal DPB **terbaru** dari PBF itu | Mean titik PBF |
| **Tertinggi** | Harga modal **tertinggi** historis PBF itu | Max titik PBF |

- Satu PBF = **satu titik** (pengiriman berulang PBF yang sama tidak menambah slot).
- Detail rumus (PPN, markup ×1,015, modal satuan): lihat `pricing-dpb-rules.md` §4.3.

### Implikasi ke sistem

| Aspek | Ketentuan |
|-------|-----------|
| Master obat | Harga beli **tidak boleh** hanya disimpan sebagai satu nilai tetap |
| Level pencatatan | Harga beli dicatat di level **detail pembelian** atau **stok batch** |
| Harga jual | Harga jual aktif di `harga_jual_obat` (global); histori harga beli tetap dari transaksi pembelian |
| Audit trail | Sistem menyimpan **riwayat perubahan harga jual** (`histori_harga_jual_obat`) |
| Alur DPB → harga | Simpan DPB → redirect ke **detail DPB**; review di **Manajemen Harga** (atau shortcut konfirmasi per faktur) |
| Antrian review | Tab `dpb_hari_ini`, `modal_beda` (modal DPB terbaru ≠ modal terhitung aktif), dan `cari` |
| UX / peringatan | Bandingkan harga lama vs baru; jika modal DPB beda dari harga aktif, masuk antrian **Modal beda** |

### Aturan bisnis

1. Setiap transaksi pembelian mencatat harga beli aktual pada faktur tersebut.
2. Perubahan harga beli memicu **evaluasi** harga jual (antrian Manajemen Harga) — bukan update diam-diam di master.
3. Harga beli historis harus dapat dilacak per faktur/batch, bukan ditimpa.
4. Acuan modal untuk harga jual = agregat **titik PBF**, bukan rata-rata tertimbang stok.

---

## 3. Harga Jual VIP Minimal Margin 11%

### Konteks

Harga jual untuk pelanggan VIP memiliki ketentuan **minimal margin 11%**.

### Implikasi ke sistem

| Aspek | Ketentuan |
|-------|-----------|
| Harga jual | Per jenis pelanggan: **OTC** (ecer), **REG**, dan **VIP** (kemasan) di `harga_jual_obat` |
| Validasi margin | Saat modal / harga di-review, cek apakah VIP masih memenuhi margin minimal 11% |
| Peringatan | Jika VIP di bawah margin minimal, sistem **memberi warning** (bukan hard block) |

### Rumus validasi margin VIP

**Keputusan implementasi** (lihat `pricing-dpb-rules.md`):

```
margin_vip = (harga_vip_satuan − harga_modal_satuan) / harga_modal_satuan
warning jika margin_vip < 0.11
```

di mana `harga_vip_satuan = harga_vip / isi_kemasan` dan `harga_modal_satuan` dari **modal agregat titik PBF** (markup ×1,015 ÷ isi).

### Aturan bisnis

1. Margin VIP minimum **11%** berbasis **harga modal satuan** (bukan harga beli paket mentah).
2. Warning margin muncul di **Manajemen Harga** dan konfirmasi harga per faktur (serta sebaiknya saat edit harga VIP / penjualan VIP).
3. Harga OTC dan REG tidak tunduk pada aturan margin 11% ini kecuali ditentukan lain.

---

## Catatan Desain — Pemisahan Data

Insight ini memperkuat keputusan bahwa stok dan harga tidak boleh hanya diperlakukan sebagai data sederhana di master obat. Sistem perlu membedakan:

| Layer data | Contoh field / entitas |
|------------|------------------------|
| Data umum obat | Kode, nama, satuan, kategori (`master_obat`) |
| Harga beli per faktur/batch | `detail_pembelian`, `stok_batch_obat.harga_beli` / `harga_modal` |
| Harga jual aktif | `harga_jual_obat` (OTC / REG / VIP + modal terhitung) |
| Histori perubahan harga | `histori_harga_jual_obat` |
| Batch & expired date | `stok_batch_obat.nomor_batch`, `tanggal_expired` |
| Supplier/PBF asal barang | `pembelian.pbf_id`, `detail_pembelian` |
| Review harga | Manajemen Harga (`/manajemen-harga`) + shortcut `pembelian/{id}/konfirmasi-harga` |

### Prinsip implementasi bertahap

- **Saat ini:** DPB dua langkah; antrian Manajemen Harga; modal titik PBF; warning margin VIP; batch/expired di form DPB.
- **Fase berikutnya:** Batch/expired wajib penuh; UI histori harga jual; validasi margin juga di jalur penjualan VIP.

---

## Relasi dengan Dokumentasi Lain

- [`pricing-dpb-rules.md`](pricing-dpb-rules.md) — sumber kebenaran rumus & alur DPB / harga jual
- [§18.1 Stok Obat Berdasarkan Batch dan Expired Date](Dokumentasi_Awal_Sistem_Apotek_Siaga.md#181-catatan-penting-stok-obat-berdasarkan-batch-dan-expired-date) — skema teknis `stok_batch_obat`
- [§18.2 Logika Transaksi Awal](Dokumentasi_Awal_Sistem_Apotek_Siaga.md#182-logika-transaksi-awal) — efek sistem per peristiwa bisnis

---

## Checklist Validasi Saat Implementasi

- [x] Form DPB memiliki field batch dan expired date
- [ ] Status "data batch belum lengkap" tersedia
- [x] Harga beli disimpan per detail pembelian / stok batch, bukan hanya di master
- [ ] Form DPB menampilkan harga beli sebelumnya vs baru (perbandingan eksplisit di UI)
- [x] Review harga setelah DPB via Manajemen Harga (tab antrian) / shortcut konfirmasi faktur
- [x] Modal agregat = titik per PBF (rata-rata terbaru / tertinggi), bukan bobot stok
- [x] Harga jual OTC, REG, VIP di `harga_jual_obat`
- [x] Validasi/warning margin VIP minimal 11% (basis modal satuan)
- [x] Riwayat perubahan harga jual dapat dilacak (backend `histori_harga_jual_obat`; UI belum)
