diff --git a/app/Models/CashRecord.php b/app/Models/CashRecord.php index ea1bceb..d1bdf8b 100644 --- a/app/Models/CashRecord.php +++ b/app/Models/CashRecord.php @@ -4,7 +4,6 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; -use App\Models\Activity; class CashRecord extends Model { diff --git a/app/Models/Vote.php b/app/Models/Vote.php index 0a255a3..507ba6c 100644 --- a/app/Models/Vote.php +++ b/app/Models/Vote.php @@ -10,7 +10,7 @@ class Vote extends Model { protected $fillable = [ 'title', 'description', 'type', - 'related_id', 'status', 'deadline', 'created_by', + 'related_id', 'related_type', 'status', 'deadline', 'created_by', ]; protected $casts = [ diff --git a/app/Observers/ActivityObserver.php b/app/Observers/ActivityObserver.php index cc9ee93..67952dc 100644 --- a/app/Observers/ActivityObserver.php +++ b/app/Observers/ActivityObserver.php @@ -47,23 +47,29 @@ class ActivityObserver // 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 ($budget !== null && $budget >= 500_000 && $budget <= 2_000_000) { + Approval::firstOrCreate( + ['model_type' => Activity::class, 'model_id' => $activity->id], + ['required_approvals' => 1, 'status' => 'pending'] + ); + } elseif ($budget !== null && $budget > 2_000_000) { + $exists = Vote::where('related_type', Activity::class) + ->where('related_id', $activity->id) + ->where('type', 'finance') + ->exists(); + + if (! $exists) { + 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, + 'related_type' => Activity::class, + 'status' => 'open', + 'deadline' => now()->addDays(3), + 'created_by' => Auth::id() ?? $activity->created_by, + ]); + } } } diff --git a/app/Observers/CashRecordObserver.php b/app/Observers/CashRecordObserver.php index 0302af8..09427ac 100644 --- a/app/Observers/CashRecordObserver.php +++ b/app/Observers/CashRecordObserver.php @@ -41,13 +41,14 @@ class CashRecordObserver // Threshold: > 2jt → buat voting + notif semua anggota if ($record->amount > 2_000_000) { Vote::create([ - 'title' => "Persetujuan Transaksi: {$record->description}", - 'description' => "Transaksi senilai Rp " . number_format($record->amount, 0, ',', '.') . " memerlukan persetujuan voting.", - 'type' => 'finance', - 'related_id' => $record->id, - 'status' => 'open', - 'deadline' => now()->addDays(3), - 'created_by' => Auth::id() ?? $record->created_by, + 'title' => "Persetujuan Transaksi: {$record->description}", + 'description' => "Transaksi senilai Rp " . number_format($record->amount, 0, ',', '.') . " memerlukan persetujuan voting.", + 'type' => 'finance', + 'related_id' => $record->id, + 'related_type' => CashRecord::class, + 'status' => 'open', + 'deadline' => now()->addDays(3), + 'created_by' => Auth::id() ?? $record->created_by, ]); NotificationService::toRole('ketua', diff --git a/database/migrations/2026_04_05_162107_add_related_type_to_votes_table.php b/database/migrations/2026_04_05_162107_add_related_type_to_votes_table.php new file mode 100644 index 0000000..7a842ac --- /dev/null +++ b/database/migrations/2026_04_05_162107_add_related_type_to_votes_table.php @@ -0,0 +1,22 @@ +string('related_type')->nullable()->after('related_id'); + }); + } + + public function down(): void + { + Schema::table('votes', function (Blueprint $table) { + $table->dropColumn('related_type'); + }); + } +};