diff --git a/app/Http/Controllers/Api/Admin/ApprovalApiController.php b/app/Http/Controllers/Api/Admin/ApprovalApiController.php index 91b783e6..cdb31ce9 100644 --- a/app/Http/Controllers/Api/Admin/ApprovalApiController.php +++ b/app/Http/Controllers/Api/Admin/ApprovalApiController.php @@ -200,9 +200,12 @@ public function forceDestroy(int $id): JsonResponse 'message' => '결재 문서가 영구삭제되었습니다.', ]); } catch (\Throwable $e) { + report($e); + return response()->json([ 'success' => false, 'message' => '영구삭제에 실패했습니다.', + 'error' => config('app.debug') ? $e->getMessage() : null, ], 500); } } diff --git a/app/Services/ApprovalService.php b/app/Services/ApprovalService.php index f9cabe36..eec5f6ba 100644 --- a/app/Services/ApprovalService.php +++ b/app/Services/ApprovalService.php @@ -231,16 +231,29 @@ 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(); - } + return DB::transaction(function () use ($approval) { + // 연동 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(); + // 첨부파일 정리 (files 테이블) + \App\Models\File::where('document_id', $approval->id) + ->where('document_type', 'approval') + ->update(['deleted_by' => auth()->id(), 'deleted_at' => now()]); - return $approval->forceDelete(); + // 하위 문서 참조 해제 + Approval::withTrashed() + ->where('parent_doc_id', $approval->id) + ->update(['parent_doc_id' => null]); + + // 결재 단계 삭제 + $approval->steps()->forceDelete(); + + return $approval->forceDelete(); + }); } // =========================================================================