wasChanged('status')) { $old = $activity->getOriginal('status'); $new = $activity->status; // Validasi workflow: draft→pending, pending→approved/rejected $allowed = [ 'draft' => ['pending'], 'pending' => ['approved', 'rejected'], ]; if (isset($allowed[$old]) && ! in_array($new, $allowed[$old])) { Notification::make()->title('Transisi tidak diizinkan') ->body("Status tidak bisa diubah dari {$old} ke {$new}.") ->danger()->send(); $activity->status = $old; return; } ActivityLog::create([ 'user_id' => Auth::id(), 'action' => 'status_changed', 'model_type' => Activity::class, 'model_id' => $activity->id, 'description' => "Status kegiatan '{$activity->title}' diubah dari {$old} menjadi {$new}", ]); if ($new === 'pending') { NotificationService::toRole('ketua', 'Kegiatan Menunggu Persetujuan', "Kegiatan \"{$activity->title}\" diajukan untuk disetujui.", 'warning', route('filament.admin.resources.activities.edit', $activity)); // Threshold budget $budget = $activity->budget; if ($budget >= 500_000 && $budget <= 2_000_000) { Approval::create([ 'model_type' => Activity::class, 'model_id' => $activity->id, 'required_approvals' => 1, 'status' => 'pending', ]); } elseif ($budget > 2_000_000) { Vote::create([ 'title' => "Persetujuan Budget Kegiatan: {$activity->title}", 'description' => "Budget kegiatan senilai Rp " . number_format($budget, 0, ',', '.') . " memerlukan persetujuan voting.", 'type' => 'finance', 'related_id' => $activity->id, 'status' => 'open', 'deadline' => now()->addDays(3), 'created_by' => Auth::id() ?? $activity->created_by, ]); } } if (in_array($new, ['approved', 'rejected']) && $activity->creator) { NotificationService::send( $activity->creator, $new === 'approved' ? 'Kegiatan Disetujui' : 'Kegiatan Ditolak', "Kegiatan \"{$activity->title}\" telah " . ($new === 'approved' ? 'disetujui.' : 'ditolak.'), $new === 'approved' ? 'success' : 'danger', route('filament.admin.resources.activities.edit', $activity) ); } } } public function created(Activity $activity): void { ActivityLog::create([ 'user_id' => Auth::id(), 'action' => 'created', 'model_type' => Activity::class, 'model_id' => $activity->id, 'description' => "Kegiatan baru dibuat: {$activity->title}", ]); } }