From 3464787a4cd176799d26af621723542e8838000e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Thu, 5 Mar 2026 13:50:45 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[approval]=20=EB=B0=98=EB=A0=A4=20?= =?UTF-8?q?=EC=9D=B4=EB=A0=A5=20=EA=B4=80=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - rejection_history JSON 컬럼으로 반려 이력 누적 저장 - 재상신 시 반려자, 사유, 일시를 이력에 기록 - 상세 페이지에 반려 이력 섹션 표시 (빨간 테두리) - 수정 페이지에 이전 반려 이력 표시 (주황 배경) --- app/Models/Approvals/Approval.php | 2 ++ app/Services/ApprovalService.php | 17 +++++++++++++++- resources/views/approvals/edit.blade.php | 22 +++++++++++++++++++++ resources/views/approvals/show.blade.php | 25 ++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 1 deletion(-) diff --git a/app/Models/Approvals/Approval.php b/app/Models/Approvals/Approval.php index 00d59515..e2e3c258 100644 --- a/app/Models/Approvals/Approval.php +++ b/app/Models/Approvals/Approval.php @@ -23,6 +23,7 @@ class Approval extends Model 'drafter_read_at' => 'datetime', 'current_step' => 'integer', 'resubmit_count' => 'integer', + 'rejection_history' => 'array', 'is_urgent' => 'boolean', ]; @@ -43,6 +44,7 @@ class Approval extends Model 'drafter_read_at', 'current_step', 'resubmit_count', + 'rejection_history', 'attachments', 'recall_reason', 'parent_doc_id', diff --git a/app/Services/ApprovalService.php b/app/Services/ApprovalService.php index 44a97eda..6f795135 100644 --- a/app/Services/ApprovalService.php +++ b/app/Services/ApprovalService.php @@ -243,9 +243,24 @@ public function submit(int $id): Approval throw new \InvalidArgumentException('결재선을 설정해주세요.'); } - // 반려 후 재상신이면 모든 step 초기화 + 재상신 카운트 증가 + // 반려 후 재상신이면 반려 이력 저장 + 모든 step 초기화 + 재상신 카운트 증가 $isResubmit = $approval->status === Approval::STATUS_REJECTED; if ($isResubmit) { + // 반려 이력 저장 + $rejectedStep = $approval->steps + ->firstWhere('status', ApprovalStep::STATUS_REJECTED); + if ($rejectedStep) { + $history = $approval->rejection_history ?? []; + $history[] = [ + 'round' => $approval->resubmit_count + 1, + 'approver_name' => $rejectedStep->approver_name ?? ($rejectedStep->approver?->name ?? ''), + 'approver_position' => $rejectedStep->approver_position ?? '', + 'comment' => $rejectedStep->comment, + 'rejected_at' => $rejectedStep->acted_at?->format('Y-m-d H:i:s'), + ]; + $approval->rejection_history = $history; + } + $approval->steps()->update([ 'status' => ApprovalStep::STATUS_PENDING, 'comment' => null, diff --git a/resources/views/approvals/edit.blade.php b/resources/views/approvals/edit.blade.php index b0146824..2ea279cf 100644 --- a/resources/views/approvals/edit.blade.php +++ b/resources/views/approvals/edit.blade.php @@ -35,6 +35,28 @@ @endif + {{-- 반려 이력 (재상신 문서인 경우) --}} + @if(!empty($approval->rejection_history)) +
+

+ 이전 반려 이력 + {{ count($approval->rejection_history) }}회 +

+
+ @foreach($approval->rejection_history as $history) +
+
+ {{ $history['round'] ?? '-' }}차 + {{ $history['approver_name'] ?? '' }} + {{ $history['rejected_at'] ?? '' }} +
+

{{ $history['comment'] ?? '' }}

+
+ @endforeach +
+
+ @endif +

문서 내용

diff --git a/resources/views/approvals/show.blade.php b/resources/views/approvals/show.blade.php index 91e93c8f..71506fa6 100644 --- a/resources/views/approvals/show.blade.php +++ b/resources/views/approvals/show.blade.php @@ -92,6 +92,31 @@ class="bg-gray-600 hover:bg-gray-700 text-white px-4 py-2 rounded-lg transition
+ {{-- 반려 이력 --}} + @if(!empty($approval->rejection_history)) +
+

+ 반려 이력 + {{ count($approval->rejection_history) }}회 +

+
+ @foreach($approval->rejection_history as $history) +
+
+ {{ $history['round'] ?? '-' }}차 반려 + {{ $history['approver_name'] ?? '' }} + @if(!empty($history['approver_position'])) + {{ $history['approver_position'] }} + @endif + {{ $history['rejected_at'] ?? '' }} +
+

{{ $history['comment'] ?? '' }}

+
+ @endforeach +
+
+ @endif + {{-- 결재 의견 --}} @php $stepsWithComments = $approval->steps->filter(fn($s) => $s->comment);