diff --git a/app/Http/Controllers/Api/Admin/ApprovalApiController.php b/app/Http/Controllers/Api/Admin/ApprovalApiController.php index 574b0fd2..91b783e6 100644 --- a/app/Http/Controllers/Api/Admin/ApprovalApiController.php +++ b/app/Http/Controllers/Api/Admin/ApprovalApiController.php @@ -180,6 +180,33 @@ public function destroy(int $id): JsonResponse } } + /** + * 영구삭제 (슈퍼관리자 전용) + */ + public function forceDestroy(int $id): JsonResponse + { + if (! auth()->user()->isSuperAdmin()) { + return response()->json([ + 'success' => false, + 'message' => '슈퍼관리자만 영구삭제할 수 있습니다.', + ], 403); + } + + try { + $this->service->forceDeleteApproval($id); + + return response()->json([ + 'success' => true, + 'message' => '결재 문서가 영구삭제되었습니다.', + ]); + } catch (\Throwable $e) { + return response()->json([ + 'success' => false, + 'message' => '영구삭제에 실패했습니다.', + ], 500); + } + } + // ========================================================================= // 워크플로우 // ========================================================================= diff --git a/app/Services/ApprovalService.php b/app/Services/ApprovalService.php index 7fe77405..f9cabe36 100644 --- a/app/Services/ApprovalService.php +++ b/app/Services/ApprovalService.php @@ -23,10 +23,14 @@ class ApprovalService */ public function getMyDrafts(array $filters = [], int $perPage = 15): LengthAwarePaginator { - $userId = auth()->id(); + $user = auth()->user(); - $query = Approval::with(['form', 'steps.approver']) - ->byDrafter($userId); + $query = Approval::with(['form', 'drafter', 'steps.approver']); + + // 슈퍼관리자는 전체 조회, 일반 사용자는 본인 기안만 + if (! $user->isSuperAdmin()) { + $query->byDrafter($user->id); + } $this->applyFilters($query, $filters); @@ -220,6 +224,25 @@ public function deleteApproval(int $id, ?User $user = null): bool return $approval->delete(); } + /** + * 영구삭제 (슈퍼관리자 전용) + */ + public function forceDeleteApproval(int $id): bool + { + $approval = Approval::withTrashed()->with('form')->findOrFail($id); + + // 연동 Leave 정리 + $leave = \App\Models\HR\Leave::where('approval_id', $approval->id)->first(); + if ($leave) { + $leave->update(['deleted_by' => auth()->id()]); + $leave->delete(); + } + + $approval->steps()->withTrashed()->forceDelete(); + + return $approval->forceDelete(); + } + // ========================================================================= // 워크플로우 // ========================================================================= diff --git a/resources/views/approvals/drafts.blade.php b/resources/views/approvals/drafts.blade.php index fb22c513..fd811937 100644 --- a/resources/views/approvals/drafts.blade.php +++ b/resources/views/approvals/drafts.blade.php @@ -392,6 +392,8 @@ class="toss-input-sm" style="padding-left: 32px;"> @push('scripts')