From e4cd88136e5d87d22f8ba212fd16c9744f587977 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 24 Feb 2026 11:11:18 +0700 Subject: [PATCH] feat: Implement local scopes for report statuses in the Report model and update the TaskRealizationChart to filter by ApprovalStatus enum. --- app/Filament/Widgets/TaskRealizationChart.php | 10 ++++++---- app/Models/Report.php | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app/Filament/Widgets/TaskRealizationChart.php b/app/Filament/Widgets/TaskRealizationChart.php index 353dc76..4e0c75e 100644 --- a/app/Filament/Widgets/TaskRealizationChart.php +++ b/app/Filament/Widgets/TaskRealizationChart.php @@ -2,6 +2,7 @@ namespace App\Filament\Widgets; +use App\Enums\ApprovalStatus; use App\Models\Report; use BezhanSalleh\FilamentShield\Traits\HasWidgetShield; use Carbon\Carbon; @@ -27,7 +28,7 @@ protected function getData(): array $data = Report::query() ->select( DB::raw('COUNT(*) as count'), - DB::raw('status'), + 'status', DB::raw("DATE_FORMAT(created_at, '%Y-%m') as month") ) ->when($startDate, fn ($q) => $q->whereDate('created_at', '>=', $startDate)) @@ -44,9 +45,10 @@ protected function getData(): array $rejectedData = []; foreach ($months as $month) { - $acceptedData[] = $data->where('month', $month)->accepted()->first()?->count ?? 0; - $pendingData[] = $data->where('month', $month)->pending()->first()?->count ?? 0; - $rejectedData[] = $data->where('month', $month)->rejected()->first()?->count ?? 0; + $monthData = $data->where('month', $month); + $acceptedData[] = $monthData->where('status', ApprovalStatus::ACCEPTED)->first()?->count ?? 0; + $pendingData[] = $monthData->where('status', ApprovalStatus::PENDING)->first()?->count ?? 0; + $rejectedData[] = $monthData->where('status', ApprovalStatus::REJECTED)->first()?->count ?? 0; } return [ diff --git a/app/Models/Report.php b/app/Models/Report.php index 82596b3..cac8282 100644 --- a/app/Models/Report.php +++ b/app/Models/Report.php @@ -3,6 +3,8 @@ namespace App\Models; use App\Enums\ApprovalStatus; +use Illuminate\Database\Eloquent\Attributes\Scope; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -27,6 +29,24 @@ protected function casts(): array ]; } + #[Scope] + protected function accepted(Builder $query): void + { + $query->where('status', ApprovalStatus::ACCEPTED); + } + + #[Scope] + protected function pending(Builder $query): void + { + $query->where('status', ApprovalStatus::PENDING); + } + + #[Scope] + protected function rejected(Builder $query): void + { + $query->where('status', ApprovalStatus::REJECTED); + } + public function mediaTaskAssignment(): BelongsTo { return $this->belongsTo(MediaTaskAssignment::class);