From bfb821698a842f6a46c9aca1ab1dac4f8ab759c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Fri, 27 Feb 2026 23:41:34 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[approval]=20Phase=202=20=EB=A7=88?= =?UTF-8?q?=EC=9D=B4=EA=B7=B8=EB=A0=88=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - approval_steps: parallel_group, acted_by, approval_type 컬럼 추가 - approvals: recall_reason, parent_doc_id 컬럼 추가 - approval_delegations 테이블 생성 (위임/대결) --- ...phase2_columns_to_approval_steps_table.php | 27 +++++++++++++++ ..._add_phase2_columns_to_approvals_table.php | 25 ++++++++++++++ ...0005_create_approval_delegations_table.php | 34 +++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 database/migrations/2026_02_27_100003_add_phase2_columns_to_approval_steps_table.php create mode 100644 database/migrations/2026_02_27_100004_add_phase2_columns_to_approvals_table.php create mode 100644 database/migrations/2026_02_27_100005_create_approval_delegations_table.php diff --git a/database/migrations/2026_02_27_100003_add_phase2_columns_to_approval_steps_table.php b/database/migrations/2026_02_27_100003_add_phase2_columns_to_approval_steps_table.php new file mode 100644 index 0000000..39db709 --- /dev/null +++ b/database/migrations/2026_02_27_100003_add_phase2_columns_to_approval_steps_table.php @@ -0,0 +1,27 @@ +integer('parallel_group')->nullable()->after('step_type') + ->comment('병렬 그룹 번호'); + $table->foreignId('acted_by')->nullable()->after('approver_id') + ->comment('실제 처리자 (대결)'); + $table->string('approval_type', 20)->default('normal')->after('status') + ->comment('결재 유형: normal/pre_decided/delegated'); + }); + } + + public function down(): void + { + Schema::table('approval_steps', function (Blueprint $table) { + $table->dropColumn(['parallel_group', 'acted_by', 'approval_type']); + }); + } +}; diff --git a/database/migrations/2026_02_27_100004_add_phase2_columns_to_approvals_table.php b/database/migrations/2026_02_27_100004_add_phase2_columns_to_approvals_table.php new file mode 100644 index 0000000..7996a30 --- /dev/null +++ b/database/migrations/2026_02_27_100004_add_phase2_columns_to_approvals_table.php @@ -0,0 +1,25 @@ +text('recall_reason')->nullable()->after('completed_at') + ->comment('회수 사유'); + $table->foreignId('parent_doc_id')->nullable()->after('recall_reason') + ->comment('재기안 원본 문서'); + }); + } + + public function down(): void + { + Schema::table('approvals', function (Blueprint $table) { + $table->dropColumn(['recall_reason', 'parent_doc_id']); + }); + } +}; diff --git a/database/migrations/2026_02_27_100005_create_approval_delegations_table.php b/database/migrations/2026_02_27_100005_create_approval_delegations_table.php new file mode 100644 index 0000000..4ccaf73 --- /dev/null +++ b/database/migrations/2026_02_27_100005_create_approval_delegations_table.php @@ -0,0 +1,34 @@ +id(); + $table->foreignId('tenant_id')->constrained()->onDelete('cascade'); + $table->foreignId('delegator_id')->constrained('users')->comment('위임자'); + $table->foreignId('delegate_id')->constrained('users')->comment('대리인'); + $table->date('start_date')->comment('시작일'); + $table->date('end_date')->comment('종료일'); + $table->json('form_ids')->nullable()->comment('위임 대상 양식 (NULL=전체)'); + $table->boolean('notify_delegator')->default(true)->comment('대결 시 보고'); + $table->boolean('is_active')->default(true); + $table->string('reason', 200)->nullable()->comment('위임 사유'); + $table->foreignId('created_by')->nullable()->constrained('users'); + $table->softDeletes(); + $table->timestamps(); + + $table->index(['tenant_id', 'delegator_id', 'is_active']); + }); + } + + public function down(): void + { + Schema::dropIfExists('approval_delegations'); + } +};