feat: add percentage loyalti setting mode

This commit is contained in:
efrilm
2026-10-02 14:19:12 +07:00
parent d3e3ea6b08
commit b372821b23
13 changed files with 193 additions and 36 deletions
+19 -5
View File
@@ -197,20 +197,28 @@ Disimpan di `outlet_settings` (key–value, sudah ada).
| Key | Tipe | Default | Arti |
|---|---|---|---|
| `loyalty.point.enabled` | bool | `false` | Outlet memberi EnakPoint |
| `loyalty.point.earn_per_amount` | int (Rp) | `100` | Setiap kelipatan nominal ini… |
| `loyalty.point.earn_mode` | `PER_AMOUNT` / `PERCENTAGE` | `PER_AMOUNT` | Cara menghitung earning |
| `loyalty.point.earn_per_amount` | int (Rp) | `100` | `PER_AMOUNT`: setiap kelipatan nominal ini… |
| `loyalty.point.earn_value` | int | `1` | …mendapat sekian EnakPoint |
| `loyalty.point.earn_percent` | desimal (0–100, maks. 2 angka desimal) | `1` | `PERCENTAGE`: sekian persen dari basis menjadi EnakPoint |
| `loyalty.point.min_order_amount` | int (Rp) | `0` | Basis minimal agar dapat EnakPoint |
| `loyalty.point.max_per_order` | int, nullable | kosong | Batas atas EnakPoint per order |
| `loyalty.coin.enabled` | bool | `false` | Outlet memberi EnakCoin |
| `loyalty.coin.earn_mode` | `PER_AMOUNT` / `PERCENTAGE` | `PER_AMOUNT` | |
| `loyalty.coin.earn_per_amount` | int (Rp) | `25000` | |
| `loyalty.coin.earn_value` | int | `1` | |
| `loyalty.coin.earn_percent` | desimal (0–100, maks. 2 angka desimal) | `1` | |
| `loyalty.coin.min_order_amount` | int (Rp) | `0` | |
| `loyalty.coin.max_per_order` | int, nullable | kosong | |
Dengan nilai EnakPoint default Rp 1, default earning 1 EnakPoint per Rp 100 setara
**cashback 1%**. Dashboard selalu menampilkan persentase cashback efektif di samping
setting ini: `earn_value × nilai EnakPoint / earn_per_amount`. Tujuannya supaya owner
tidak salah mengira skala.
setting ini: `earn_value × nilai EnakPoint / earn_per_amount`, atau pada mode
`PERCENTAGE`: `earn_percent × nilai EnakPoint`. Tujuannya supaya owner tidak salah
mengira skala.
Setting mode yang sedang tidak dipakai tetap tersimpan, sehingga berpindah mode tidak
menghapus nilai mode sebelumnya.
**Pembayaran EnakPoint.** Hanya ada untuk EnakPoint, tidak ada padanannya untuk
EnakCoin.
@@ -226,7 +234,8 @@ EnakCoin.
```
basis = subtotal − discount_amount − dibayar_dengan_enakpoint
jumlah = 0 jika basis < min_order_amount
jumlah = floor(basis / earn_per_amount) × earn_value
jumlah = floor(basis / earn_per_amount) × earn_value mode PER_AMOUNT
jumlah = floor(basis × earn_percent / 100) mode PERCENTAGE
jumlah = min(jumlah, max_per_order) jika max_per_order diisi
```
@@ -240,7 +249,12 @@ jumlah = min(jumlah, max_per_order) jika max_per_order diisi
EnakPoint** dan **3 EnakCoin**. Jika Rp 20.000 dari order itu dibayar dengan EnakPoint,
basisnya menjadi Rp 67.500, sehingga customer mendapat 675 EnakPoint dan 2 EnakCoin.
Validasi: `earn_per_amount > 0`, `earn_value ≥ 0`, `min_order_amount ≥ 0`,
Pada mode `PERCENTAGE`, `earn_percent` adalah persen dari basis yang menjadi
**jumlah** EnakPoint/EnakCoin (bukan nilai rupiahnya): 2,5% dari basis Rp 87.500
menghasilkan 2.187 EnakPoint.
Validasi: `earn_per_amount > 0`, `earn_value ≥ 0`, `0 ≤ earn_percent ≤ 100` dengan
paling banyak dua angka desimal, `min_order_amount ≥ 0`,
`max_per_order ≥ 0`, `0 ≤ max_payment_percent ≤ 100`. Hanya role Admin/Manager yang
bisa mengubah.