From f038da67350b5716aa15cb8e7ea370231661ac36 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Wed, 14 Jan 2026 10:23:30 +0700 Subject: [PATCH] refactor(cooperation): change relation to task assignment from has many to has one and adjust related logic --- COOPERATION_MODULE.md | 2 +- .../CreateTaskAssignmentAction.php | 4 +-- .../Cooperations/Pages/ViewCooperation.php | 34 +++++++++---------- .../ReportRelationManager.php | 4 +-- .../TaskAssignmentRelationManager.php | 5 +-- app/Models/Cooperation.php | 5 +-- 6 files changed, 28 insertions(+), 26 deletions(-) diff --git a/COOPERATION_MODULE.md b/COOPERATION_MODULE.md index 01d5b4c..d9af000 100644 --- a/COOPERATION_MODULE.md +++ b/COOPERATION_MODULE.md @@ -153,7 +153,7 @@ ### Cooperation - `partnerMedia()`: BelongsToMany - Media yang terlibat dalam kerjasama - `cooperationMedia()`: HasMany - Pivot records dengan status - `cooperationProposals()`: HasMany - Proposal yang diupload media -- `taskAssignments()`: HasMany - Task yang diberikan ke media +- `taskAssignment()`: HasOne - Task yang diberikan ke media ### CooperationMedia (Pivot) **Location**: `app/Models/CooperationMedia.php` diff --git a/app/Filament/Resources/Manage/Cooperations/Actions/Cooperation/CreateTaskAssignmentAction.php b/app/Filament/Resources/Manage/Cooperations/Actions/Cooperation/CreateTaskAssignmentAction.php index 45f87bb..aa40f27 100644 --- a/app/Filament/Resources/Manage/Cooperations/Actions/Cooperation/CreateTaskAssignmentAction.php +++ b/app/Filament/Resources/Manage/Cooperations/Actions/Cooperation/CreateTaskAssignmentAction.php @@ -63,7 +63,7 @@ protected function setUp(): void ]; }) ->action(function (array $data, Cooperation $record): void { - $taskAssignment = $record->taskAssignments()->create([ + $taskAssignment = $record->taskAssignment()->create([ 'start_date' => $data['start_date'], 'end_date' => $data['end_date'], 'task_description' => $data['task_description'], @@ -107,7 +107,7 @@ protected function setUp(): void $user = Auth::user(); return $user && ! $user->hasRole('Perusahaan') - && ! $record->taskAssignments()->exists() + && ! $record->taskAssignment()->exists() && $record->status === CooperationStatus::ASSIGNMENT; }) ->modalWidth(Width::Large); diff --git a/app/Filament/Resources/Manage/Cooperations/Pages/ViewCooperation.php b/app/Filament/Resources/Manage/Cooperations/Pages/ViewCooperation.php index b51ae68..4d6847a 100644 --- a/app/Filament/Resources/Manage/Cooperations/Pages/ViewCooperation.php +++ b/app/Filament/Resources/Manage/Cooperations/Pages/ViewCooperation.php @@ -179,7 +179,7 @@ protected function getProposalReviewDate($record) protected function getTaskStatus($record): string { - if ($record->taskAssignments->isNotEmpty()) { + if ($record->taskAssignment()->exists()) { return 'completed'; } @@ -188,21 +188,19 @@ protected function getTaskStatus($record): string protected function getTaskDate($record) { - $latestTask = $record->taskAssignments->sortByDesc('created_at')->first(); - - return $latestTask?->created_at?->format('d/m/Y H:i'); + return $record->taskAssignment?->created_at?->format('d/m/Y H:i'); } protected function getReportStatus($record): string { - $tasks = $record->taskAssignments; + $task = $record->taskAssignment; - if ($tasks->isEmpty()) { + if (! $task) { return 'pending'; } - $totalReports = $tasks->sum('report_amount'); - $completedReports = $tasks->flatMap->reports->count(); + $totalReports = $task->report_amount; + $completedReports = $task->reports->count(); if ($completedReports >= $totalReports && $totalReports > 0) { return 'completed'; @@ -217,8 +215,7 @@ protected function getReportStatus($record): string protected function getReportDate($record) { - $latestReport = $record->taskAssignments - ->flatMap->reports + $latestReport = $record->taskAssignment?->reports ->sortByDesc('created_at') ->first(); @@ -251,14 +248,17 @@ protected function canMarkAsCompleted(): bool { $record = $this->getRecord(); - // Check if all tasks have required number of reports - foreach ($record->taskAssignments as $task) { - $reportCount = $task->reports()->count(); - if ($reportCount < $task->report_amount) { - return false; - } + $task = $record->taskAssignment; + + if (! $task) { + return false; } - return $record->taskAssignments->isNotEmpty(); + $reportCount = $task->reports()->count(); + if ($reportCount < $task->report_amount) { + return false; + } + + return true; } } diff --git a/app/Filament/Resources/Manage/Cooperations/RelationManagers/ReportRelationManager.php b/app/Filament/Resources/Manage/Cooperations/RelationManagers/ReportRelationManager.php index 372713e..78c8765 100644 --- a/app/Filament/Resources/Manage/Cooperations/RelationManagers/ReportRelationManager.php +++ b/app/Filament/Resources/Manage/Cooperations/RelationManagers/ReportRelationManager.php @@ -123,7 +123,7 @@ public function table(Table $table): Table ->modalWidth(Width::Large) ->modalHeading('Buat Laporan') ->mutateDataUsing(function (array $data): array { - $data['task_assignment_id'] = $this->getOwnerRecord()->taskAssignments()->first()?->id; + $data['task_assignment_id'] = $this->getOwnerRecord()->taskAssignment?->id; return $data; }) @@ -158,7 +158,7 @@ public function table(Table $table): Table return false; } - $taskAssignment = $this->getOwnerRecord()->taskAssignments()->first(); + $taskAssignment = $this->getOwnerRecord()->taskAssignment; if (! $taskAssignment) { return false; diff --git a/app/Filament/Resources/Manage/Cooperations/RelationManagers/TaskAssignmentRelationManager.php b/app/Filament/Resources/Manage/Cooperations/RelationManagers/TaskAssignmentRelationManager.php index 8d2a686..da8ff23 100644 --- a/app/Filament/Resources/Manage/Cooperations/RelationManagers/TaskAssignmentRelationManager.php +++ b/app/Filament/Resources/Manage/Cooperations/RelationManagers/TaskAssignmentRelationManager.php @@ -20,7 +20,7 @@ class TaskAssignmentRelationManager extends RelationManager { - protected static string $relationship = 'taskAssignments'; + protected static string $relationship = 'taskAssignment'; protected static ?string $title = 'Penugasan'; @@ -107,7 +107,8 @@ public function table(Table $table): Table ->visible(function (): bool { $cooperation = $this->getOwnerRecord(); - return $cooperation->proposals()->accepted()->exists(); + return $cooperation->proposals()->accepted()->exists() + && ! $cooperation->taskAssignment()->exists(); }) ->successNotification( Notification::make() diff --git a/app/Models/Cooperation.php b/app/Models/Cooperation.php index b39bf93..33fed35 100644 --- a/app/Models/Cooperation.php +++ b/app/Models/Cooperation.php @@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasManyThrough; +use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\SoftDeletes; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; @@ -68,9 +69,9 @@ public function proposals(): HasMany return $this->hasMany(CooperationProposal::class); } - public function taskAssignments(): HasMany + public function taskAssignment(): HasOne { - return $this->hasMany(TaskAssignment::class); + return $this->hasOne(TaskAssignment::class); } public function cooperationMedia(): HasMany