refactor(cooperation): change relation to task assignment from has many to has one and adjust related logic

This commit is contained in:
Yoga Pangestu 2026-01-14 10:23:30 +07:00
parent 627cd694d7
commit f038da6735
6 changed files with 28 additions and 26 deletions

View File

@ -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`

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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()

View File

@ -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