# Fitur Hitung Kas Fisik Harian (IDR) – Koperasi

## Konteks
Bangun fitur **Hitung Kas Fisik Harian Teller** untuk sistem koperasi berbasis:
- Backend: Laravel
- Frontend: React
- Framework: Inertia.js
- Mata uang: Rupiah (IDR)

Fitur ini digunakan teller untuk menghitung uang fisik harian berdasarkan pecahan uang, menyimpan hasilnya per tanggal, dan membandingkannya dengan saldo kas sistem.

---

## Tujuan Fitur
1. Membantu teller menghitung uang fisik dengan cepat dan akurat
2. Menghindari kesalahan manual dalam perhitungan total kas
3. Menyediakan data audit kas harian yang rapi dan dapat ditelusuri
4. Mengetahui selisih antara kas fisik dan kas sistem

---

## Daftar Pecahan Uang (WAJIB)
Gunakan pecahan IDR berikut:
- 1.000
- 2.000
- 5.000
- 10.000
- 20.000
- 50.000
- 100.000

Semua pecahan harus tersedia di UI dan bisa diinput jumlah lembarannya.

---

## Aturan Utama
- Teller **hanya menginput jumlah lembar**, bukan nominal total
- Semua perhitungan dilakukan otomatis oleh sistem
- Data disimpan **per tanggal dan per teller**
- Data yang sudah disubmit **tidak boleh diedit**
- Jika ada selisih, teller **wajib mengisi keterangan**

---

## Struktur Database

### Tabel: cash_counts
Digunakan untuk menyimpan ringkasan hitung kas harian.

Field:
- id
- date (YYYY-MM-DD)
- teller_id
- system_balance (saldo kas menurut sistem)
- physical_total (hasil hitung fisik)
- difference (physical_total - system_balance)
- status (balanced | over | short)
- note (nullable, wajib jika selisih ≠ 0)
- created_at

---

### Tabel: cash_count_details
Digunakan untuk menyimpan detail per pecahan.

Field:
- id
- cash_count_id (FK)
- denomination (integer, contoh: 100000)
- quantity (jumlah lembar)
- subtotal (denomination × quantity)

---

## Alur Kerja Sistem
1. Teller membuka menu **Hitung Kas Harian**
2. Sistem mengambil:
   - tanggal hari ini
   - saldo kas dari sistem
3. Teller menginput jumlah lembar untuk tiap pecahan
4. Sistem:
   - menghitung subtotal per pecahan
   - menghitung total kas fisik
   - menghitung selisih dengan saldo sistem
   - menentukan status:
     - balanced → selisih = 0
     - over → selisih > 0
     - short → selisih < 0
5. Teller submit data
6. Data disimpan dan dikunci

---

## UI Requirements (React + Inertia)
- Tabel input pecahan:
  - Kolom: Pecahan | Jumlah Lembar | Subtotal (auto)
- Total Kas Fisik (auto update)
- Saldo Kas Sistem (read-only)
- Selisih (auto)
- Status (badge)
- Field keterangan (muncul jika selisih ≠ 0)
- Tombol Submit (disabled jika data tidak valid)

---

## Validasi
- Tidak boleh submit jika semua quantity = 0
- Tidak boleh submit jika selisih ≠ 0 dan keterangan kosong
- 1 teller hanya boleh 1 hitung kas per tanggal

---

## Output yang Diharapkan dari AI
- Database migration Laravel
- Eloquent models & relationships
- Controller logic (store & validation)
- React + Inertia page (form hitung kas)
- Auto-calculation logic di frontend
- Status & difference handling

---

## Catatan
Fitur ini harus bersifat **audit-ready**, **tidak bisa dimanipulasi**, dan **mudah digunakan oleh teller non-teknis**.