feat: [approval] 결재관리 삭제 권한 기능 추가

- 관리자/슈퍼관리자 모든 상태 결재 문서 삭제 가능
- 일반 사용자는 기존대로 draft + 본인 기안만 삭제
- 진행 중 문서 삭제 시 휴가 연동 취소 처리
- 삭제 API 403 권한 검증 추가
- 상세 페이지 삭제 버튼 + 2중 확인 다이얼로그
This commit is contained in:
김보곤
2026-03-03 07:35:59 +09:00
parent 420b80e45a
commit 3216bb98bc
4 changed files with 103 additions and 8 deletions

View File

@@ -175,18 +175,24 @@ public function updateApproval(int $id, array $data): Approval
}
/**
* 삭제 (draft만)
* 삭제 (일반: draft만 / 관리자: 모든 상태)
*/
public function deleteApproval(int $id): bool
public function deleteApproval(int $id, ?User $user = null): bool
{
$approval = Approval::findOrFail($id);
$approval = Approval::with('form')->findOrFail($id);
$user = $user ?? auth()->user();
if (! $approval->isDeletable()) {
throw new \InvalidArgumentException('삭제할 수 없는 상태입니다.');
if (! $approval->isDeletableBy($user)) {
throw new \InvalidArgumentException('삭제 권한이 없습니다.');
}
// 진행 중/보류 문서 삭제 시 연동 후처리 (휴가 등)
if (in_array($approval->status, [Approval::STATUS_PENDING, Approval::STATUS_ON_HOLD])) {
$this->handleApprovalDeleted($approval);
}
$approval->steps()->delete();
$approval->update(['deleted_by' => auth()->id()]);
$approval->update(['deleted_by' => $user->id]);
return $approval->delete();
}
@@ -738,6 +744,24 @@ private function handleApprovalRejected(Approval $approval, string $comment): vo
}
}
/**
* 결재 삭제 시 연동 처리 (휴가 등)
*/
private function handleApprovalDeleted(Approval $approval): void
{
if (! $approval->form || $approval->form->code !== 'leave') {
return;
}
$leave = \App\Models\HR\Leave::where('approval_id', $approval->id)->first();
if ($leave && in_array($leave->status, ['pending', 'approved'])) {
$leave->update([
'status' => 'cancelled',
'updated_by' => auth()->id(),
]);
}
}
/**
* 결재 회수 시 연동 처리 (휴가 등)
*/