# Persegi — Sistem Manajemen Organisasi Pemuda Desa

Sistem web production-ready untuk **Organisasi Pemuda Desa Persegi**, berlokasi di Desa Karangdadap, Kecamatan Kalibagor, Kabupaten Banyumas.

---

## Teknologi

| Layer | Stack |
|---|---|
| Backend | Laravel 13 |
| Admin Panel | Filament 5.x |
| Authorization | Filament Shield + Spatie Permission |
| Database | MySQL |
| Frontend Publik | Blade |
| Realtime | Livewire |

---

## Struktur Direktori

```
app/
├── Filament/
│   ├── Resources/          # Admin panel resources
│   │   ├── Activities/     # Manajemen kegiatan
│   │   ├── Approvals/      # Multi-approval
│   │   ├── Audits/         # Audit internal
│   │   ├── CashCategories/ # Kategori kas
│   │   ├── CashRecords/    # Transaksi kas
│   │   ├── ContactMessages/# Pesan dari publik
│   │   ├── Divisions/      # Divisi organisasi
│   │   ├── Posts/          # Konten publik
│   │   ├── Users/          # Manajemen anggota
│   │   └── Votes/          # Sistem voting
│   └── Widgets/
│       ├── StatsOverview.php       # Widget dashboard utama
│       ├── CashStatsWidget.php     # Widget statistik kas (halaman transaksi)
│       └── ActivityLogWidget.php   # Widget log aktivitas
├── Models/
│   ├── User.php            # Anggota / pengguna sistem
│   ├── Division.php        # Divisi organisasi
│   ├── Activity.php        # Kegiatan
│   ├── CashRecord.php      # Transaksi kas
│   ├── CashCategory.php    # Kategori kas (pemasukan/pengeluaran)
│   ├── Vote.php            # Voting
│   ├── VoteItem.php        # Pilihan suara per user
│   ├── Approval.php        # Multi-approval
│   ├── ApprovalItem.php    # Keputusan per approver
│   ├── Audit.php           # Temuan audit
│   ├── AuditResponse.php   # Respons atas temuan audit
│   ├── MemberStatusLog.php # Riwayat perubahan status anggota
│   ├── ActivityLog.php     # Log global semua aksi
│   ├── Post.php            # Artikel/berita publik
│   └── ContactMessage.php  # Pesan kontak dari publik
└── Observers/
    ├── CashRecordObserver.php
    ├── ActivityObserver.php
    └── UserObserver.php
```

---

## Role & Hak Akses

| Role | Deskripsi |
|---|---|
| `super_admin` | Full akses, bisa override semua, semua aksi di-log |
| `ketua` | Approval kegiatan, verifikasi kas, lihat semua data |
| `bendahara` | Input & kelola transaksi kas |
| `pengurus` | Submit kegiatan ke pending |
| `anggota` | Akses terbatas, lihat data sendiri |
| `auditor` | Read-only + bisa buat temuan audit |

---

## Fitur & Use Case

### 1. Manajemen Anggota

**Aktor:** ketua, pengurus, super_admin

| Use Case | Deskripsi |
|---|---|
| Tambah anggota | Input data: nama, telepon, alamat, divisi, status |
| Ubah status anggota | Aktif → Nonaktif wajib isi `inactive_reason` |
| Lihat riwayat status | Semua perubahan status tercatat di `member_status_logs` |
| Filter per divisi | Anggota bisa difilter berdasarkan divisi |

**Business rule:**
- Hanya ketua, pengurus, super_admin yang bisa ubah status
- Setiap perubahan status otomatis dicatat ke `member_status_logs` via Observer

---

### 2. Struktur Organisasi (Divisi)

**Aktor:** ketua, super_admin

| Use Case | Deskripsi |
|---|---|
| Kelola divisi | CRUD divisi organisasi |
| Lihat anggota per divisi | Relasi one-to-many ke User |

---

### 3. Kegiatan

**Aktor:** pengurus (buat), ketua (approve), semua (lihat)

| Use Case | Deskripsi |
|---|---|
| Buat kegiatan | Status awal: `draft` |
| Submit ke review | `draft` → `pending` (oleh pengurus) |
| Approve/Tolak | `pending` → `approved` / `rejected` (oleh ketua) |
| Tandai selesai | Wajib isi `executed_at` + `execution_notes` |
| Kelola peserta | Many-to-many anggota ↔ kegiatan |

**Workflow status:**
```
draft → pending → approved → (executed_at diisi)
                → rejected
```

---

### 4. Keuangan (Kas)

**Aktor:** bendahara (input), ketua & super_admin (verifikasi & lihat)

| Use Case | Deskripsi |
|---|---|
| Input transaksi | Bendahara input pemasukan/pengeluaran |
| Verifikasi transaksi | Ketua/super_admin verifikasi, setelah itu data terkunci |
| Lihat statistik kas | Widget di halaman transaksi: total saldo, pemasukan/pengeluaran bulan ini, saldo bulan lalu |
| Filter transaksi | Filter per kategori, tanggal, status verifikasi |

**Business rule:**
- Setelah `verified_at` terisi, data tidak bisa diubah/dihapus
- Threshold keuangan:
  - < Rp 500.000 → bendahara saja
  - Rp 500.000 – Rp 2.000.000 → butuh persetujuan ketua
  - > Rp 2.000.000 → multi-approval atau voting

---

### 5. Voting

**Aktor:** semua role (sesuai permission)

| Use Case | Deskripsi |
|---|---|
| Buat voting | Tipe: `activity`, `finance`, `general` |
| Beri suara | Pilihan: `approve`, `reject`, `abstain` |
| Tutup voting | Status: `open` → `closed` |
| Lihat hasil | Mayoritas >50% untuk lolos |

---

### 6. Multi-Approval

**Aktor:** role yang ditentukan per approval

| Use Case | Deskripsi |
|---|---|
| Buat approval | Tentukan jumlah approval yang dibutuhkan |
| Beri keputusan | Tiap approver bisa approve/reject + catatan |
| Cek status | Lolos jika jumlah approve terpenuhi |

---

### 7. Audit Internal

**Aktor:** auditor (buat temuan), pengurus/ketua (respons)

| Use Case | Deskripsi |
|---|---|
| Buat temuan | Tipe: `warning` / `critical`, bisa terkait model apapun |
| Respons temuan | Pihak terkait bisa balas temuan audit |
| Pantau status | Auditor bisa track status penyelesaian |

---

### 8. Konten Publik

**Aktor:** pengurus, ketua, super_admin

| Use Case | Deskripsi |
|---|---|
| Buat artikel/berita | Post dengan status `draft` / `published` |
| Website publik | Halaman publik berbasis Blade untuk masyarakat |
| Pesan kontak | Masyarakat bisa kirim pesan, admin bisa lihat & balas |

---

### 9. Dashboard

Widget yang tampil di halaman utama admin:

| Widget | Isi |
|---|---|
| StatsOverview | Anggota aktif, total kas, kegiatan berjalan, kegiatan pending |
| ActivityLogWidget | Log aktivitas terbaru di sistem |

Widget khusus halaman transaksi:

| Widget | Isi |
|---|---|
| CashStatsWidget | Total saldo, pemasukan bulan ini, pengeluaran bulan ini, saldo bulan lalu |

---

## Log & Audit Trail

Semua aksi penting otomatis dicatat via Observer:

| Event | Dicatat di |
|---|---|
| Perubahan status anggota | `member_status_logs` |
| Transaksi kas baru | `activity_logs` |
| Verifikasi kas | `activity_logs` |
| Approval kegiatan | `activity_logs` |
| Eksekusi kegiatan | `activity_logs` |

---

## Keamanan

- Setiap resource dilindungi Laravel Policy
- Permission granular dikelola via Filament Shield
- Fitur impersonate: super_admin bisa login sebagai user lain (untuk debugging/support)
- Input divalidasi di semua form

---

## Instalasi

```bash
composer install
cp .env.example .env
php artisan key:generate
php artisan migrate --seed
php artisan shield:generate --all
php artisan shield:super-admin --user=1
```

Akses admin panel: `/dashboard`
