docs: update README.md

This commit is contained in:
2026-04-03 12:03:40 +07:00
parent 31756a9022
commit 64c5614191
3 changed files with 74 additions and 156 deletions
+72 -156
View File
@@ -11,9 +11,10 @@ Sistem web production-ready untuk **Organisasi Pemuda Desa Persegi**, berlokasi
| Backend | Laravel 13 | | Backend | Laravel 13 |
| Admin Panel | Filament 5.x | | Admin Panel | Filament 5.x |
| Authorization | Filament Shield + Spatie Permission | | Authorization | Filament Shield + Spatie Permission |
| Database | MySQL | | Database | MySQL / MariaDB |
| Frontend Publik | Blade | | Frontend Publik | Blade + Tailwind CSS |
| Realtime | Livewire | | Realtime | Livewire |
| Queue | Supervisor |
--- ---
@@ -22,7 +23,7 @@ Sistem web production-ready untuk **Organisasi Pemuda Desa Persegi**, berlokasi
``` ```
app/ app/
├── Filament/ ├── Filament/
│ ├── Resources/ # Admin panel resources │ ├── Resources/
│ │ ├── Activities/ # Manajemen kegiatan │ │ ├── Activities/ # Manajemen kegiatan
│ │ ├── Approvals/ # Multi-approval │ │ ├── Approvals/ # Multi-approval
│ │ ├── Audits/ # Audit internal │ │ ├── Audits/ # Audit internal
@@ -35,28 +36,21 @@ app/
│ │ └── Votes/ # Sistem voting │ │ └── Votes/ # Sistem voting
│ └── Widgets/ │ └── Widgets/
│ ├── StatsOverview.php # Widget dashboard utama │ ├── StatsOverview.php # Widget dashboard utama
│ ├── CashStatsWidget.php # Widget statistik kas (halaman transaksi) │ ├── CashStatsWidget.php # Widget statistik kas
│ └── ActivityLogWidget.php # Widget log aktivitas │ └── ActivityLogWidget.php # Widget log aktivitas
├── Models/ ├── Models/
│ ├── User.php # Anggota / pengguna sistem │ ├── User.php, Division.php, Activity.php
│ ├── Division.php # Divisi organisasi │ ├── CashRecord.php, CashCategory.php
│ ├── Activity.php # Kegiatan │ ├── Vote.php, VoteItem.php
│ ├── CashRecord.php # Transaksi kas │ ├── Approval.php, ApprovalItem.php
│ ├── CashCategory.php # Kategori kas (pemasukan/pengeluaran) │ ├── Audit.php, AuditResponse.php
│ ├── Vote.php # Voting │ ├── MemberStatusLog.php, ActivityLog.php
│ ├── VoteItem.php # Pilihan suara per user │ ├── Post.php, ContactMessage.php
│ ├── 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/ └── Observers/
├── CashRecordObserver.php ├── CashRecordObserver.php # Log + threshold approval/voting
├── ActivityObserver.php ├── ActivityObserver.php # Log approval & eksekusi kegiatan
── UserObserver.php ── UserObserver.php # Log perubahan status anggota
└── VoteObserver.php # Notifikasi voting baru ke semua user
``` ```
--- ---
@@ -65,171 +59,66 @@ app/
| Role | Deskripsi | | Role | Deskripsi |
|---|---| |---|---|
| `super_admin` | Full akses, bisa override semua, semua aksi di-log | | `super_admin` | Full akses, override semua, semua aksi di-log |
| `ketua` | Approval kegiatan, verifikasi kas, lihat semua data | | `ketua` | Approval kegiatan, verifikasi kas, lihat semua data |
| `bendahara` | Input & kelola transaksi kas | | `bendahara` | Input & kelola transaksi kas |
| `pengurus` | Submit kegiatan ke pending | | `pengurus` | Submit kegiatan ke pending |
| `anggota` | Akses terbatas, lihat data sendiri | | `anggota` | Akses terbatas, bisa voting |
| `auditor` | Read-only + bisa buat temuan audit | | `auditor` | Read-only + bisa buat temuan audit |
--- ---
## Fitur & Use Case ## Fitur
### 1. Manajemen Anggota ### Keuangan (Kas)
**Aktor:** ketua, pengurus, super_admin Threshold otomatis saat transaksi dibuat:
| Use Case | Deskripsi | | Jumlah | Alur |
|---|---| |---|---|
| Tambah anggota | Input data: nama, telepon, alamat, divisi, status | | < Rp 500.000 | Langsung bisa diverifikasi |
| Ubah status anggota | Aktif → Nonaktif wajib isi `inactive_reason` | | Rp 500.000 Rp 2.000.000 | Notifikasi ke ketua → perlu approval ketua |
| Lihat riwayat status | Semua perubahan status tercatat di `member_status_logs` | | > Rp 2.000.000 | Voting dibuat otomatis → perlu mayoritas >50% |
| Filter per divisi | Anggota bisa difilter berdasarkan divisi |
**Business rule:** - Transaksi yang belum diverifikasi tidak masuk ke total kas
- Hanya ketua, pengurus, super_admin yang bisa ubah status - Setelah `verified_at` terisi, data terkunci (tidak bisa diubah/dihapus)
- Setiap perubahan status otomatis dicatat ke `member_status_logs` via Observer - Widget statistik kas tampil di halaman transaksi: total saldo, pemasukan/pengeluaran bulan ini, saldo bulan lalu
--- ### Kegiatan
### 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) draft → pending → approved → (executed_at diisi)
→ rejected → rejected
``` ```
--- ### Voting
### 4. Keuangan (Kas) - Semua user bisa melihat dan memberi suara
- Tipe: `activity`, `finance`, `general`
- Notifikasi ke semua user saat voting baru dibuat
- Mayoritas >50% untuk lolos
**Aktor:** bendahara (input), ketua & super_admin (verifikasi & lihat) ### Notifikasi
| Use Case | Deskripsi | - Database notifications via Filament
|---|---| - Polling otomatis setiap 30 detik
| Input transaksi | Bendahara input pemasukan/pengeluaran | - Queue diproses via Supervisor
| 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:** ### Konten Publik
- 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
--- - Website publik berbasis Blade (font: Roboto + Playfair Display)
- Artikel/berita, halaman kegiatan, form kontak
### 5. Voting - Link ke website publik tersedia di sidebar admin
**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 ## Log & Audit Trail
Semua aksi penting otomatis dicatat via Observer:
| Event | Dicatat di | | Event | Dicatat di |
|---|---| |---|---|
| Perubahan status anggota | `member_status_logs` | | Perubahan status anggota | `member_status_logs` |
| Transaksi kas baru | `activity_logs` | | Transaksi kas baru/verifikasi | `activity_logs` |
| Verifikasi kas | `activity_logs` | | Approval/eksekusi kegiatan | `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
--- ---
@@ -240,8 +129,35 @@ composer install
cp .env.example .env cp .env.example .env
php artisan key:generate php artisan key:generate
php artisan migrate --seed php artisan migrate --seed
php artisan shield:generate --all php artisan shield:generate --panel=admin
php artisan shield:super-admin --user=1 php artisan shield:super-admin --user=1
``` ```
Akses admin panel: `/dashboard` Akses admin panel: `/dashboard`
### Queue Worker (Supervisor)
```ini
[program:persegi-worker]
command=php /path/to/project/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=$USER
redirect_stderr=true
stdout_logfile=/var/log/persegi-worker.log
```
```bash
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start persegi-worker
```
### Production
```bash
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan permission:cache-reset
```
@@ -33,6 +33,8 @@ class AdminPanelProvider extends PanelProvider
->colors([ ->colors([
'primary' => Color::Amber, 'primary' => Color::Amber,
]) ])
->resourceCreatePageRedirect('index')
->resourceEditPageRedirect('index')
->databaseNotifications() ->databaseNotifications()
->databaseNotificationsPolling('30s') ->databaseNotificationsPolling('30s')
->discoverResources(in: app_path('Filament/Resources'), for: 'App\Filament\Resources') ->discoverResources(in: app_path('Filament/Resources'), for: 'App\Filament\Resources')
Binary file not shown.

Before

Width:  |  Height:  |  Size: 0 B

After

Width:  |  Height:  |  Size: 3.0 KiB