diff --git a/app/Http/Controllers/ESign/EsignPublicController.php b/app/Http/Controllers/ESign/EsignPublicController.php index 5274804d..c5f960f3 100644 --- a/app/Http/Controllers/ESign/EsignPublicController.php +++ b/app/Http/Controllers/ESign/EsignPublicController.php @@ -64,32 +64,35 @@ public function getContract(string $token): JsonResponse return response()->json(['success' => false, 'message' => '계약을 찾을 수 없습니다.'], 404); } - // 계약 상태 체크: 서명 불가한 상태면 에러 반환 - $statusMessages = [ + // 서명 가능 여부 판별 + $isSignable = in_array($contract->status, ['pending', 'partially_signed']) + && in_array($signer->status, ['notified', 'viewing', 'authenticated']); + + $statusMessage = null; + $unsignableStatuses = [ 'draft' => '아직 발송되지 않은 계약입니다.', 'cancelled' => '취소된 계약입니다.', 'rejected' => '거절된 계약입니다.', - 'completed' => '이미 완료된 계약입니다.', ]; - if (isset($statusMessages[$contract->status])) { - return response()->json(['success' => false, 'message' => $statusMessages[$contract->status]], 400); + if (isset($unsignableStatuses[$contract->status])) { + $statusMessage = $unsignableStatuses[$contract->status]; + } elseif ($signer->status === 'signed') { + $statusMessage = '이미 서명을 완료하였습니다.'; } - // 서명자가 이미 서명 완료한 경우 - if ($signer->status === 'signed') { - return response()->json(['success' => false, 'message' => '이미 서명을 완료하였습니다.'], 400); + // 서명 가능한 상태에서만 감사 로그 기록 + if ($isSignable) { + EsignAuditLog::create([ + 'tenant_id' => $contract->tenant_id, + 'contract_id' => $contract->id, + 'signer_id' => $signer->id, + 'action' => 'viewed', + 'ip_address' => request()->ip(), + 'user_agent' => request()->userAgent(), + 'created_at' => now(), + ]); } - EsignAuditLog::create([ - 'tenant_id' => $contract->tenant_id, - 'contract_id' => $contract->id, - 'signer_id' => $signer->id, - 'action' => 'viewed', - 'ip_address' => request()->ip(), - 'user_agent' => request()->userAgent(), - 'created_at' => now(), - ]); - return response()->json([ 'success' => true, 'data' => [ @@ -101,7 +104,10 @@ public function getContract(string $token): JsonResponse 'role' => $signer->role, 'status' => $signer->status, 'has_stamp' => (bool) $signer->signature_image_path, + 'signed_at' => $signer->signed_at, ], + 'is_signable' => $isSignable, + 'status_message' => $statusMessage, ], ]); } diff --git a/resources/views/esign/sign/sign.blade.php b/resources/views/esign/sign/sign.blade.php index 05b56469..97332bb9 100644 --- a/resources/views/esign/sign/sign.blade.php +++ b/resources/views/esign/sign/sign.blade.php @@ -50,6 +50,10 @@ if (json.success) { setContract(json.data.contract); setSigner(json.data.signer); + // 서명 불가 상태면 에러 표시 + if (!json.data.is_signable && json.data.status_message) { + setError(json.data.status_message); + } } else { setError(json.message); }