Refactor: Enforce type safety, fix close deadlock, implement assignee restrictions and notify admin fallbacks
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,20 @@ class TransferService
|
||||
]);
|
||||
}
|
||||
|
||||
if ($newHandlerId !== null) {
|
||||
$handler = User::find($newHandlerId);
|
||||
if (! $handler) {
|
||||
throw ValidationException::withMessages([
|
||||
'new_assignee_id' => __('feedback.user_not_found'),
|
||||
]);
|
||||
}
|
||||
if ($handler->department_id !== $toDepartment->id && $toDepartment->manager_id !== $handler->id) {
|
||||
throw ValidationException::withMessages([
|
||||
'new_assignee_id' => __('feedback.handler_not_in_department'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$fromDepartmentId = $feedback->current_department_id;
|
||||
$fromDepartmentName = $feedback->currentDepartment?->name ?? 'N/A';
|
||||
|
||||
@@ -67,6 +81,12 @@ class TransferService
|
||||
|
||||
if ($manager) {
|
||||
$manager->notify(new \App\Notifications\TicketTransferred($feedback, $log, $sender));
|
||||
} else {
|
||||
// No manager! Notify admins
|
||||
$admins = User::whereHas('roles', fn ($q) => $q->where('name', 'admin'))->get();
|
||||
foreach ($admins as $admin) {
|
||||
$admin->notify(new \App\Notifications\TicketTransferred($feedback, $log, $sender));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user