Files

188 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Persegi — Sistem Manajemen Organisasi Pemuda
Sistem web production-ready untuk manajemen internal organisasi pemuda.
---
## Teknologi
| Layer | Stack |
|---|---|
| Backend | Laravel 13 |
| Admin Panel | Filament 5.x |
| Authorization | Filament Shield + Spatie Permission |
| Database | MySQL / MariaDB |
| Frontend Publik | Blade + Tailwind CSS |
| Realtime | Livewire |
| Queue | Supervisor (database driver) |
---
## Struktur Direktori
```
app/
├── Filament/
│ ├── Resources/
│ │ ├── Activities/ # Manajemen kegiatan
│ │ ├── Approvals/ # Multi-approval
│ │ ├── Audits/ # Audit internal
│ │ ├── CashCategories/ # Kategori kas
│ │ ├── CashRecords/ # Transaksi kas
│ │ ├── ContactMessages/ # Pesan dari publik
│ │ ├── Divisions/ # Divisi organisasi
│ │ ├── MemberDues/ # Iuran anggota
│ │ ├── MemberPoints/ # Poin anggota
│ │ ├── Posts/ # Konten publik
│ │ ├── Users/ # Manajemen anggota
│ │ └── Votes/ # Sistem voting
│ └── Widgets/
│ ├── StatsOverview.php # Widget dashboard utama
│ ├── CashStatsWidget.php # Widget statistik kas
│ └── ActivityLogWidget.php # Widget log aktivitas
├── Models/
│ ├── User.php, Division.php
│ ├── Activity.php, MemberStatusLog.php, ActivityLog.php
│ ├── MemberDue.php, MemberPoint.php
│ ├── CashRecord.php, CashCategory.php
│ ├── Vote.php, VoteItem.php
│ ├── Approval.php, ApprovalItem.php
│ ├── Audit.php, AuditResponse.php
│ └── Post.php, ContactMessage.php
└── Observers/
├── UserObserver.php # Log perubahan status anggota
├── ActivityObserver.php # Log approval & eksekusi kegiatan
├── CashRecordObserver.php # Log + threshold approval/voting otomatis
├── VoteObserver.php # Notifikasi voting baru ke semua user
└── PostObserver.php # Poin +5 saat artikel dipublish
```
---
## Role & Hak Akses
| Role | Deskripsi |
|---|---|
| `super_admin` | Full akses via gate, semua aksi di-log |
| `ketua` | Approval kegiatan, verifikasi kas, lihat semua data |
| `bendahara` | Input & kelola transaksi kas dan iuran |
| `pengurus` | Submit kegiatan ke pending |
| `anggota` | Akses terbatas, bisa voting dan buat artikel |
| `auditor` | Read-only semua + bisa buat temuan audit |
---
## Fitur
### Keuangan (Kas)
Threshold otomatis saat transaksi dibuat:
| Jumlah | Alur |
|---|---|
| < Rp 500.000 | Langsung bisa diverifikasi |
| Rp 500.000 Rp 2.000.000 | Notifikasi ke ketua → perlu approval ketua |
| > Rp 2.000.000 | Voting dibuat otomatis → perlu mayoritas >50% |
- Transaksi yang belum diverifikasi tidak masuk ke total kas
- Setelah `verified_at` terisi, data terkunci (tidak bisa diubah/dihapus)
### Iuran Anggota
- Satu iuran per anggota per periode (format `YYYY-MM`)
- Unique constraint `(user_id, period)` mencegah duplikasi
### Kegiatan
```
draft → pending → approved → (executed_at diisi)
→ rejected
```
- Draft hanya terlihat oleh kreator dan `super_admin`
### Voting
- Semua user bisa melihat dan memberi suara
- Tipe: `activity`, `finance`, `general`
- Notifikasi ke semua user saat voting baru dibuat
- Mayoritas >50% untuk lolos
### Sistem Poin
| Event | Poin |
|---|---|
| Hadir kegiatan | +10 |
| Artikel dipublish | +5 |
- Duplikasi dicegah via `firstOrCreate` dengan key `(user_id, source_type, source_id)`
### Notifikasi
- Database notifications via Filament
- Polling otomatis setiap 30 detik
- Queue diproses via Supervisor
### Konten Publik
- Website publik berbasis Blade
- Artikel/berita, halaman kegiatan, form kontak
- Link ke website publik tersedia di sidebar admin
---
## Log & Audit Trail
| Event | Dicatat di |
|---|---|
| Perubahan status anggota | `member_status_logs` |
| Transaksi kas baru/verifikasi | `activity_logs` |
| Approval/eksekusi kegiatan | `activity_logs` |
---
## Instalasi
```bash
composer install
cp .env.example .env
php artisan key:generate
php artisan migrate --seed
php artisan shield:generate --panel=admin --all -n
php artisan db:seed --class=PermissionSeeder --force
php artisan shield:super-admin --user=1
```
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 migrate
php artisan shield:generate --panel=admin --all -n
php artisan db:seed --class=PermissionSeeder --force
php artisan permission:cache-reset
php artisan filament:optimize-clear
php artisan filament:optimize
php artisan config:cache
php artisan route:cache
```