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) { 제목 기안자 상태 + 구분 확인 완료일 @@ -115,6 +123,7 @@ function renderTable(items, pagination) { ${isUnread ? '' + (item.title || '-') + '' : (item.title || '-')} ${item.drafter?.name || '-'} ${statusBadge(item.status)} + ${resubmitBadge(item)} ${confirmBadge(item)} ${completedAt} `; diff --git a/resources/views/approvals/drafts.blade.php b/resources/views/approvals/drafts.blade.php index 4ef9dcf5..fb22c513 100644 --- a/resources/views/approvals/drafts.blade.php +++ b/resources/views/approvals/drafts.blade.php @@ -439,6 +439,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}`; + }; + let html = `
@@ -447,6 +454,7 @@ function renderTable(items, pagination) { + @@ -465,6 +473,7 @@ function renderTable(items, pagination) { + `; 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.form?.name || '-'} ${statusBadge(item.status)}${resubmitBadge(item)} ${urgent} ${createdAt}
제목 기안자 양식구분 긴급 기안일
${item.title || '-'} ${item.drafter?.name || '-'} ${item.form?.name || '-'}${resubmitBadge(item)} ${urgent} ${draftedAt}