# Settings Page — Design Spec
**Date:** 2026-04-10
**Status:** Approved

---

## Overview

Tambah halaman `/settings` di Master Data menu (di bawah Users) khusus Super Admin. Halaman ini menjadi satu tempat untuk system-wide config dan dev tools (truncate operational tables saat development mode).

---

## Access Control

- Hanya `is_superadmin === true` yang bisa melihat menu dan mengakses halaman
- Non-superadmin yang akses langsung via URL → redirect ke `/`
- Entry di sidebar `NAV_MASTER` dirender secara conditional berdasarkan `user.is_superadmin`

---

## URL & Navigation

**Route:** `/settings`

**Sidebar entry** (tambah setelah Users di `NAV_MASTER`):
```
Master Data
  ├── Stations     /spbu
  ├── Products     /products
  ├── Users        /users
  └── Settings     /settings   ← baru, icon: ti-settings
```

**Files baru:**
- `frontend/src/app/(dashboard)/settings/page.tsx`
- `frontend/src/app/(dashboard)/settings/settings-client.tsx`

---

## Tab Structure

Halaman menggunakan Tabler `nav-tabs` dengan 2 tab:

### Tab 1 — System

Selalu tersedia (tidak tergantung env mode).

| Control | Deskripsi |
|---------|-----------|
| Maintenance Mode toggle | on/off — mirror dari shortcut di topbar |
| Environment Mode toggle | `development` / `production` |

Kedua control call `PATCH /api/v1/system/settings` yang sudah ada.

### Tab 2 — Developer Tools

- **Hidden** jika `environment_mode !== 'development'`
- Jika user sedang di tab ini lalu env mode di-switch ke `production` → otomatis redirect ke tab System

---

## Developer Tools UI

```
┌─────────────────────────────────────────────────────┐
│ ⚠️  DANGER ZONE — Development Mode Only              │
│  Data yang di-truncate tidak bisa di-recover         │
└─────────────────────────────────────────────────────┘

[🗑 Reset All Operations]   ← tombol merah besar, butuh konfirmasi modal

─────────────────────────────────────────────────────
Grup                    Aksi         Tabel yang ter-truncate
─────────────────────────────────────────────────────
Penjualan              [Truncate]   laporan_shift, penjualan_nozzle
Stock Adjustment       [Truncate]   stock_adjustment, stock_adjustment_item,
                                    stock_adjustment_item_foto
Penebusan &            [Truncate]   penebusan, penebusan_item,
Penerimaan                          penerimaan, penerimaan_item,
                                    penerimaan_foto
Expenses & Penyetoran  [Truncate]   expenses, penyetoran
End-to-End             [Truncate]   end_to_end_cycle
─────────────────────────────────────────────────────
```

**Konfirmasi modal:** Setiap tombol (individual maupun Reset All) membuka modal konfirmasi dengan nama grup yang akan di-truncate. Bukan `window.confirm`.

**Feedback:** Setelah sukses, tampil Tabler alert success dengan jumlah rows yang terhapus.

---

## Backend

### Endpoint Baru

```
POST /api/v1/system/truncate
Auth: superadmin only
Guard: reject 403 jika environment_mode != 'development' (double protection)
```

**Request body:**
```json
{ "group": "penjualan" }
```

**Group values:**
- `"penjualan"`
- `"stock"`
- `"penebusan_penerimaan"`
- `"expenses_penyetoran"`
- `"end_to_end"`
- `"all"`

**Response:**
```json
{ "message": "Truncated successfully", "rows_deleted": 142 }
```

### Urutan Truncate (FK dependency order)

| Group | Urutan DELETE/TRUNCATE |
|-------|------------------------|
| `penjualan` | penjualan_nozzle → laporan_shift |
| `stock` | stock_adjustment_item_foto → stock_adjustment_item → stock_adjustment |
| `penebusan_penerimaan` | penerimaan_foto → penerimaan_item → penerimaan → penebusan_item → penebusan |
| `expenses_penyetoran` | expenses → penyetoran |
| `end_to_end` | end_to_end_cycle |
| `all` | semua grup di atas secara berurutan |

Backend handle urutan ini — frontend hanya kirim `group` string.

### Files yang Diubah/Ditambah

| File | Perubahan |
|------|-----------|
| `backend/app/routers/system.py` | Tambah route `POST /truncate` |
| `backend/app/services/system_service.py` | Tambah `truncate_group(db, group)` |
| `backend/app/schemas/system.py` | Tambah `TruncateRequest`, `TruncateResponse` schema |
| `frontend/src/app/(dashboard)/settings/page.tsx` | Page baru |
| `frontend/src/app/(dashboard)/settings/settings-client.tsx` | Client component dengan tabs |
| `frontend/src/components/ui/sidebar.tsx` | Tambah Settings entry di `NAV_MASTER` |

---

## Out of Scope

- Audit log untuk truncate actions (belum diimplementasikan di project)
- Per-SPBU truncate (selalu truncate semua SPBU sekaligus)
- Tabel master data (users, spbu, products, roles, dll) tidak bisa di-truncate dari sini
