diff --git a/app/Models/Approvals/Approval.php b/app/Models/Approvals/Approval.php index a563e743..00d59515 100644 --- a/app/Models/Approvals/Approval.php +++ b/app/Models/Approvals/Approval.php @@ -22,6 +22,7 @@ class Approval extends Model 'completed_at' => 'datetime', 'drafter_read_at' => 'datetime', 'current_step' => 'integer', + 'resubmit_count' => 'integer', 'is_urgent' => 'boolean', ]; @@ -41,6 +42,7 @@ class Approval extends Model 'completed_at', 'drafter_read_at', 'current_step', + 'resubmit_count', 'attachments', 'recall_reason', 'parent_doc_id', @@ -52,6 +54,7 @@ class Approval extends Model protected $attributes = [ 'status' => 'draft', 'current_step' => 0, + 'resubmit_count' => 0, 'is_urgent' => false, ]; diff --git a/app/Services/ApprovalService.php b/app/Services/ApprovalService.php index 0da70582..44a97eda 100644 --- a/app/Services/ApprovalService.php +++ b/app/Services/ApprovalService.php @@ -243,8 +243,9 @@ public function submit(int $id): Approval throw new \InvalidArgumentException('결재선을 설정해주세요.'); } - // 반려 후 재상신이면 모든 step 초기화 - if ($approval->status === Approval::STATUS_REJECTED) { + // 반려 후 재상신이면 모든 step 초기화 + 재상신 카운트 증가 + $isResubmit = $approval->status === Approval::STATUS_REJECTED; + if ($isResubmit) { $approval->steps()->update([ 'status' => ApprovalStep::STATUS_PENDING, 'comment' => null, @@ -256,6 +257,7 @@ public function submit(int $id): Approval 'status' => Approval::STATUS_PENDING, 'drafted_at' => now(), 'current_step' => 1, + 'resubmit_count' => $isResubmit ? $approval->resubmit_count + 1 : $approval->resubmit_count, 'updated_by' => auth()->id(), ]); diff --git a/resources/views/approvals/completed.blade.php b/resources/views/approvals/completed.blade.php index 04530f73..92881697 100644 --- a/resources/views/approvals/completed.blade.php +++ b/resources/views/approvals/completed.blade.php @@ -82,6 +82,13 @@ function renderTable(items, pagination) { return map[status] || status; }; + const resubmitBadge = (item) => { + const count = item.resubmit_count || 0; + if (count === 0) return '-'; + const label = count === 1 ? '재상신' : `재상신(${count}차)`; + return `${label}`; + }; + const confirmBadge = (item) => { const isMyDraft = item.drafter_id === currentUserId; if (!isMyDraft) return '-'; @@ -99,6 +106,7 @@ function renderTable(items, pagination) {
| 제목 | 양식 | 상태 | +구분 | 긴급 | 작성일 | @@ -465,6 +473,7 @@ function renderTable(items, pagination) {${item.title || '-'} | ${item.form?.name || '-'} | ${statusBadge(item.status)} | +${resubmitBadge(item)} | ${urgent} | ${createdAt} | `; diff --git a/resources/views/approvals/pending.blade.php b/resources/views/approvals/pending.blade.php index 8d10f5f5..b18bfc07 100644 --- a/resources/views/approvals/pending.blade.php +++ b/resources/views/approvals/pending.blade.php @@ -71,12 +71,20 @@ function renderTable(items, pagination) {제목 | 기안자 | 양식 | +구분 | 긴급 | 기안일 | `; + const resubmitBadge = (item) => { + const count = item.resubmit_count || 0; + if (count === 0) return '-'; + const label = count === 1 ? '재상신' : `재상신(${count}차)`; + return `${label}`; + }; + items.forEach(item => { const draftedAt = item.drafted_at ? new Date(item.drafted_at).toLocaleDateString('ko-KR') : '-'; const urgent = item.is_urgent ? '긴급' : ''; @@ -86,6 +94,7 @@ function renderTable(items, pagination) {${item.title || '-'} | ${item.drafter?.name || '-'} | ${item.form?.name || '-'} | +${resubmitBadge(item)} | ${urgent} | ${draftedAt} | `;
|---|