fix: null check budget, cegah duplikasi approval/vote, tambah related_type di votes

This commit is contained in:
2026-04-05 23:22:15 +07:00
parent 4106eae5cf
commit db7c19b249
5 changed files with 54 additions and 26 deletions
-1
View File
@@ -4,7 +4,6 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use App\Models\Activity;
class CashRecord extends Model class CashRecord extends Model
{ {
+1 -1
View File
@@ -10,7 +10,7 @@ class Vote extends Model
{ {
protected $fillable = [ protected $fillable = [
'title', 'description', 'type', 'title', 'description', 'type',
'related_id', 'status', 'deadline', 'created_by', 'related_id', 'related_type', 'status', 'deadline', 'created_by',
]; ];
protected $casts = [ protected $casts = [
+14 -8
View File
@@ -47,25 +47,31 @@ class ActivityObserver
// Threshold budget // Threshold budget
$budget = $activity->budget; $budget = $activity->budget;
if ($budget >= 500_000 && $budget <= 2_000_000) { if ($budget !== null && $budget >= 500_000 && $budget <= 2_000_000) {
Approval::create([ Approval::firstOrCreate(
'model_type' => Activity::class, ['model_type' => Activity::class, 'model_id' => $activity->id],
'model_id' => $activity->id, ['required_approvals' => 1, 'status' => 'pending']
'required_approvals' => 1, );
'status' => 'pending', } elseif ($budget !== null && $budget > 2_000_000) {
]); $exists = Vote::where('related_type', Activity::class)
} elseif ($budget > 2_000_000) { ->where('related_id', $activity->id)
->where('type', 'finance')
->exists();
if (! $exists) {
Vote::create([ Vote::create([
'title' => "Persetujuan Budget Kegiatan: {$activity->title}", 'title' => "Persetujuan Budget Kegiatan: {$activity->title}",
'description' => "Budget kegiatan senilai Rp " . number_format($budget, 0, ',', '.') . " memerlukan persetujuan voting.", 'description' => "Budget kegiatan senilai Rp " . number_format($budget, 0, ',', '.') . " memerlukan persetujuan voting.",
'type' => 'finance', 'type' => 'finance',
'related_id' => $activity->id, 'related_id' => $activity->id,
'related_type' => Activity::class,
'status' => 'open', 'status' => 'open',
'deadline' => now()->addDays(3), 'deadline' => now()->addDays(3),
'created_by' => Auth::id() ?? $activity->created_by, 'created_by' => Auth::id() ?? $activity->created_by,
]); ]);
} }
} }
}
if (in_array($new, ['approved', 'rejected']) && $activity->creator) { if (in_array($new, ['approved', 'rejected']) && $activity->creator) {
NotificationService::send( NotificationService::send(
+1
View File
@@ -45,6 +45,7 @@ class CashRecordObserver
'description' => "Transaksi senilai Rp " . number_format($record->amount, 0, ',', '.') . " memerlukan persetujuan voting.", 'description' => "Transaksi senilai Rp " . number_format($record->amount, 0, ',', '.') . " memerlukan persetujuan voting.",
'type' => 'finance', 'type' => 'finance',
'related_id' => $record->id, 'related_id' => $record->id,
'related_type' => CashRecord::class,
'status' => 'open', 'status' => 'open',
'deadline' => now()->addDays(3), 'deadline' => now()->addDays(3),
'created_by' => Auth::id() ?? $record->created_by, 'created_by' => Auth::id() ?? $record->created_by,
@@ -0,0 +1,22 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('votes', function (Blueprint $table) {
$table->string('related_type')->nullable()->after('related_id');
});
}
public function down(): void
{
Schema::table('votes', function (Blueprint $table) {
$table->dropColumn('related_type');
});
}
};