From 837fe4266394701b8a10865e617bc48f892d4f54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Thu, 12 Feb 2026 16:10:16 +0900 Subject: [PATCH] =?UTF-8?q?feat:E-Sign=20=EB=A6=AC=EB=A7=88=EC=9D=B8?= =?UTF-8?q?=EB=8D=94=20=EB=B0=9C=EC=86=A1=20=EB=9D=BC=EC=9A=B0=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=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 detail.blade.php에서 호출하는 remind 엔드포인트가 누락되어 있었음. POST /esign/contracts/{id}/remind 라우트 추가, EsignApiController::remind() 메서드 구현 (상태 변경 + 감사 로그). Co-Authored-By: Claude Opus 4.6 --- .../Controllers/ESign/EsignApiController.php | 43 +++++++++++++++++++ routes/web.php | 1 + 2 files changed, 44 insertions(+) diff --git a/app/Http/Controllers/ESign/EsignApiController.php b/app/Http/Controllers/ESign/EsignApiController.php index 4912fe03..537822d3 100644 --- a/app/Http/Controllers/ESign/EsignApiController.php +++ b/app/Http/Controllers/ESign/EsignApiController.php @@ -275,6 +275,49 @@ public function send(Request $request, int $id): JsonResponse return response()->json(['success' => true, 'message' => '서명 요청이 발송되었습니다.']); } + /** + * 리마인더 발송 + */ + public function remind(Request $request, int $id): JsonResponse + { + $tenantId = session('selected_tenant_id', 1); + $contract = EsignContract::forTenant($tenantId)->with('signers')->findOrFail($id); + + if (! in_array($contract->status, ['pending', 'partially_signed'])) { + return response()->json(['success' => false, 'message' => '리마인더를 발송할 수 없는 상태입니다.'], 422); + } + + // 다음 서명 대상자 찾기 + $nextSigner = $contract->signers() + ->whereIn('status', ['waiting', 'notified']) + ->orderBy('sign_order') + ->first(); + + if ($nextSigner) { + $nextSigner->update(['status' => 'notified']); + } + + EsignAuditLog::create([ + 'tenant_id' => $tenantId, + 'contract_id' => $contract->id, + 'action' => 'reminded', + 'ip_address' => $request->ip(), + 'user_agent' => $request->userAgent(), + 'metadata' => [ + 'reminded_by' => auth()->id(), + 'target_signer_id' => $nextSigner?->id, + ], + 'created_at' => now(), + ]); + + return response()->json([ + 'success' => true, + 'message' => $nextSigner + ? "{$nextSigner->name}에게 리마인더가 발송되었습니다." + : '리마인더가 기록되었습니다.', + ]); + } + /** * PDF 다운로드 */ diff --git a/routes/web.php b/routes/web.php index 63c9f5d1..6e254d2e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1411,6 +1411,7 @@ Route::post('/{id}/cancel', [EsignApiController::class, 'cancel'])->whereNumber('id')->name('cancel'); Route::post('/{id}/fields', [EsignApiController::class, 'configureFields'])->whereNumber('id')->name('fields'); Route::post('/{id}/send', [EsignApiController::class, 'send'])->whereNumber('id')->name('send'); + Route::post('/{id}/remind', [EsignApiController::class, 'remind'])->whereNumber('id')->name('remind'); Route::get('/{id}/download', [EsignApiController::class, 'download'])->whereNumber('id')->name('download'); }); });