Refactor: Enforce type safety, fix close deadlock, implement assignee restrictions and notify admin fallbacks
Some checks failed
Tests / PHP 8.3 (push) Has been cancelled
Tests / PHP 8.4 (push) Has been cancelled
Tests / PHP 8.5 (push) Has been cancelled

This commit is contained in:
2026-05-20 10:42:30 +00:00
parent 44a7f53deb
commit fc9158b928
16 changed files with 409 additions and 10 deletions

View File

@@ -23,9 +23,12 @@ class ClosingService
throw new HttpException(403, __('feedback.close_permission_denied'));
}
if ($actor->hasRole('manager') && ! $actor->hasRole('admin')) {
$managedDeptIds = Department::where('manager_id', $actor->id)->pluck('id');
if (! $managedDeptIds->contains($feedback->current_department_id)) {
if (! $actor->hasRole('admin')) {
$managedDeptIds = Department::where('manager_id', $actor->id)->pluck('id')->toArray();
$actorDeptId = $actor->department_id;
$allowedDeptIds = array_filter(array_merge([$actorDeptId], $managedDeptIds));
if (! in_array($feedback->current_department_id, $allowedDeptIds)) {
throw new HttpException(403, __('feedback.close_department_only'));
}
}
@@ -68,13 +71,26 @@ class ClosingService
protected function notifyStakeholders(Feedback $feedback, User $actor): void
{
$notifiedUserIds = [];
if ($feedback->assignedTo) {
$feedback->assignedTo->notify(new \App\Notifications\TicketClosed($feedback, $actor));
$notifiedUserIds[] = $feedback->assignedTo->id;
}
$department = $feedback->currentDepartment;
if ($department && $department->manager && $department->manager->id !== ($feedback->assignedTo?->id ?? null)) {
$department->manager->notify(new \App\Notifications\TicketClosed($feedback, $actor));
if ($department && $department->manager) {
if (! in_array($department->manager->id, $notifiedUserIds)) {
$department->manager->notify(new \App\Notifications\TicketClosed($feedback, $actor));
}
} else {
// No manager! Notify admins
$admins = User::whereHas('roles', fn ($q) => $q->where('name', 'admin'))->get();
foreach ($admins as $admin) {
if (! in_array($admin->id, $notifiedUserIds)) {
$admin->notify(new \App\Notifications\TicketClosed($feedback, $actor));
}
}
}
}
}