2026-04-05 07:01:14 +07:00
|
|
|
|
# Persegi — Sistem Manajemen Organisasi Pemuda
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-05 07:01:14 +07:00
|
|
|
|
Sistem web production-ready untuk manajemen internal organisasi pemuda.
|
2026-04-05 06:21:16 +07:00
|
|
|
|
|
2026-04-03 08:51:47 +07:00
|
|
|
|
---
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-03 08:51:47 +07:00
|
|
|
|
## Teknologi
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-03 08:51:47 +07:00
|
|
|
|
| Layer | Stack |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| Backend | Laravel 13 |
|
|
|
|
|
|
| Admin Panel | Filament 5.x |
|
|
|
|
|
|
| Authorization | Filament Shield + Spatie Permission |
|
2026-04-03 12:03:40 +07:00
|
|
|
|
| Database | MySQL / MariaDB |
|
|
|
|
|
|
| Frontend Publik | Blade + Tailwind CSS |
|
2026-04-03 08:51:47 +07:00
|
|
|
|
| Realtime | Livewire |
|
2026-04-05 06:21:16 +07:00
|
|
|
|
| Queue | Supervisor (database driver) |
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-03 08:51:47 +07:00
|
|
|
|
---
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-03 08:51:47 +07:00
|
|
|
|
## Struktur Direktori
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-03 08:51:47 +07:00
|
|
|
|
```
|
|
|
|
|
|
app/
|
|
|
|
|
|
├── Filament/
|
2026-04-03 12:03:40 +07:00
|
|
|
|
│ ├── Resources/
|
2026-04-05 06:21:16 +07:00
|
|
|
|
│ │ ├── 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
|
2026-04-03 08:51:47 +07:00
|
|
|
|
│ └── Widgets/
|
|
|
|
|
|
│ ├── StatsOverview.php # Widget dashboard utama
|
2026-04-03 12:03:40 +07:00
|
|
|
|
│ ├── CashStatsWidget.php # Widget statistik kas
|
2026-04-03 08:51:47 +07:00
|
|
|
|
│ └── ActivityLogWidget.php # Widget log aktivitas
|
|
|
|
|
|
├── Models/
|
2026-04-05 06:21:16 +07:00
|
|
|
|
│ ├── User.php, Division.php
|
|
|
|
|
|
│ ├── Activity.php, MemberStatusLog.php, ActivityLog.php
|
|
|
|
|
|
│ ├── MemberDue.php, MemberPoint.php
|
2026-04-03 12:03:40 +07:00
|
|
|
|
│ ├── CashRecord.php, CashCategory.php
|
|
|
|
|
|
│ ├── Vote.php, VoteItem.php
|
|
|
|
|
|
│ ├── Approval.php, ApprovalItem.php
|
|
|
|
|
|
│ ├── Audit.php, AuditResponse.php
|
2026-04-05 06:21:16 +07:00
|
|
|
|
│ └── Post.php, ContactMessage.php
|
2026-04-03 08:51:47 +07:00
|
|
|
|
└── Observers/
|
2026-04-03 12:03:40 +07:00
|
|
|
|
├── UserObserver.php # Log perubahan status anggota
|
2026-04-05 06:21:16 +07:00
|
|
|
|
├── 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
|
2026-04-03 08:51:47 +07:00
|
|
|
|
```
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-03 08:51:47 +07:00
|
|
|
|
---
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-03 08:51:47 +07:00
|
|
|
|
## Role & Hak Akses
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-03 08:51:47 +07:00
|
|
|
|
| Role | Deskripsi |
|
|
|
|
|
|
|---|---|
|
2026-04-05 06:21:16 +07:00
|
|
|
|
| `super_admin` | Full akses via gate, semua aksi di-log |
|
2026-04-03 08:51:47 +07:00
|
|
|
|
| `ketua` | Approval kegiatan, verifikasi kas, lihat semua data |
|
2026-04-05 06:21:16 +07:00
|
|
|
|
| `bendahara` | Input & kelola transaksi kas dan iuran |
|
2026-04-03 08:51:47 +07:00
|
|
|
|
| `pengurus` | Submit kegiatan ke pending |
|
2026-04-05 06:21:16 +07:00
|
|
|
|
| `anggota` | Akses terbatas, bisa voting dan buat artikel |
|
|
|
|
|
|
| `auditor` | Read-only semua + bisa buat temuan audit |
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-03 08:51:47 +07:00
|
|
|
|
---
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-03 12:03:40 +07:00
|
|
|
|
## Fitur
|
2026-04-03 08:51:47 +07:00
|
|
|
|
|
2026-04-03 12:03:40 +07:00
|
|
|
|
### Keuangan (Kas)
|
2026-04-03 08:51:47 +07:00
|
|
|
|
|
2026-04-03 12:03:40 +07:00
|
|
|
|
Threshold otomatis saat transaksi dibuat:
|
2026-04-03 08:51:47 +07:00
|
|
|
|
|
2026-04-03 12:03:40 +07:00
|
|
|
|
| Jumlah | Alur |
|
2026-04-03 08:51:47 +07:00
|
|
|
|
|---|---|
|
2026-04-03 12:03:40 +07:00
|
|
|
|
| < 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% |
|
2026-04-03 08:51:47 +07:00
|
|
|
|
|
2026-04-03 12:03:40 +07:00
|
|
|
|
- Transaksi yang belum diverifikasi tidak masuk ke total kas
|
|
|
|
|
|
- Setelah `verified_at` terisi, data terkunci (tidak bisa diubah/dihapus)
|
2026-04-05 06:21:16 +07:00
|
|
|
|
|
|
|
|
|
|
### Iuran Anggota
|
|
|
|
|
|
|
|
|
|
|
|
- Satu iuran per anggota per periode (format `YYYY-MM`)
|
|
|
|
|
|
- Unique constraint `(user_id, period)` mencegah duplikasi
|
2026-04-03 08:51:47 +07:00
|
|
|
|
|
2026-04-03 12:03:40 +07:00
|
|
|
|
### Kegiatan
|
2026-04-03 08:51:47 +07:00
|
|
|
|
|
2026-04-03 03:50:40 +07:00
|
|
|
|
```
|
2026-04-03 08:51:47 +07:00
|
|
|
|
draft → pending → approved → (executed_at diisi)
|
|
|
|
|
|
→ rejected
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-05 06:21:16 +07:00
|
|
|
|
- Draft hanya terlihat oleh kreator dan `super_admin`
|
|
|
|
|
|
|
2026-04-03 12:03:40 +07:00
|
|
|
|
### Voting
|
2026-04-03 08:51:47 +07:00
|
|
|
|
|
2026-04-03 12:03:40 +07:00
|
|
|
|
- Semua user bisa melihat dan memberi suara
|
|
|
|
|
|
- Tipe: `activity`, `finance`, `general`
|
|
|
|
|
|
- Notifikasi ke semua user saat voting baru dibuat
|
|
|
|
|
|
- Mayoritas >50% untuk lolos
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-05 06:21:16 +07:00
|
|
|
|
### Sistem Poin
|
|
|
|
|
|
|
|
|
|
|
|
| Event | Poin |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| Hadir kegiatan | +10 |
|
|
|
|
|
|
| Artikel dipublish | +5 |
|
|
|
|
|
|
|
|
|
|
|
|
- Duplikasi dicegah via `firstOrCreate` dengan key `(user_id, source_type, source_id)`
|
|
|
|
|
|
|
2026-04-03 12:03:40 +07:00
|
|
|
|
### Notifikasi
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-03 12:03:40 +07:00
|
|
|
|
- Database notifications via Filament
|
|
|
|
|
|
- Polling otomatis setiap 30 detik
|
|
|
|
|
|
- Queue diproses via Supervisor
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-03 12:03:40 +07:00
|
|
|
|
### Konten Publik
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-05 06:21:16 +07:00
|
|
|
|
- Website publik berbasis Blade
|
2026-04-03 12:03:40 +07:00
|
|
|
|
- Artikel/berita, halaman kegiatan, form kontak
|
|
|
|
|
|
- Link ke website publik tersedia di sidebar admin
|
2026-04-03 08:51:47 +07:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Log & Audit Trail
|
|
|
|
|
|
|
|
|
|
|
|
| Event | Dicatat di |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| Perubahan status anggota | `member_status_logs` |
|
2026-04-03 12:03:40 +07:00
|
|
|
|
| Transaksi kas baru/verifikasi | `activity_logs` |
|
|
|
|
|
|
| Approval/eksekusi kegiatan | `activity_logs` |
|
2026-04-03 08:51:47 +07:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Instalasi
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
composer install
|
|
|
|
|
|
cp .env.example .env
|
|
|
|
|
|
php artisan key:generate
|
|
|
|
|
|
php artisan migrate --seed
|
2026-04-05 06:21:16 +07:00
|
|
|
|
php artisan shield:generate --panel=admin --all -n
|
|
|
|
|
|
php artisan db:seed --class=PermissionSeeder --force
|
2026-04-03 08:51:47 +07:00
|
|
|
|
php artisan shield:super-admin --user=1
|
|
|
|
|
|
```
|
2026-04-03 03:50:40 +07:00
|
|
|
|
|
2026-04-03 08:51:47 +07:00
|
|
|
|
Akses admin panel: `/dashboard`
|
2026-04-03 12:03:40 +07:00
|
|
|
|
|
|
|
|
|
|
### 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
|
2026-04-05 06:21:16 +07:00
|
|
|
|
php artisan migrate
|
|
|
|
|
|
php artisan shield:generate --panel=admin --all -n
|
|
|
|
|
|
php artisan db:seed --class=PermissionSeeder --force
|
2026-04-03 12:03:40 +07:00
|
|
|
|
php artisan permission:cache-reset
|
2026-04-05 06:21:16 +07:00
|
|
|
|
php artisan filament:optimize-clear
|
2026-04-04 06:21:27 +07:00
|
|
|
|
php artisan filament:optimize
|
2026-04-05 06:21:16 +07:00
|
|
|
|
php artisan config:cache
|
|
|
|
|
|
php artisan route:cache
|
2026-04-03 12:03:40 +07:00
|
|
|
|
```
|