From 9094a82f0a4f7bed0a0a2983182f69db6ac0b610 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:15:53 +0900 Subject: [PATCH] =?UTF-8?q?feat:E-Sign=20=EC=84=9C=EB=AA=85=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD/=EB=A6=AC=EB=A7=88=EC=9D=B8=EB=8D=94=20=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=EB=B0=9C=EC=86=A1=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - EsignRequestMail Mailable 클래스 추가 (리마인더 구분 지원) - 이메일 HTML 템플릿 추가 (서명하기 버튼 + 계약 정보) - send()에서 첫 번째 서명자에게 메일 발송 - remind()에서 다음 서명 대상자에게 리마인더 메일 발송 Co-Authored-By: Claude Opus 4.6 --- .../Controllers/ESign/EsignApiController.php | 6 +- app/Mail/EsignRequestMail.php | 47 +++++++++++ .../views/emails/esign/request.blade.php | 79 +++++++++++++++++++ 3 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 app/Mail/EsignRequestMail.php create mode 100644 resources/views/emails/esign/request.blade.php diff --git a/app/Http/Controllers/ESign/EsignApiController.php b/app/Http/Controllers/ESign/EsignApiController.php index 537822d3..32347c8c 100644 --- a/app/Http/Controllers/ESign/EsignApiController.php +++ b/app/Http/Controllers/ESign/EsignApiController.php @@ -3,12 +3,14 @@ namespace App\Http\Controllers\ESign; use App\Http\Controllers\Controller; +use App\Mail\EsignRequestMail; use App\Models\ESign\EsignContract; use App\Models\ESign\EsignSigner; use App\Models\ESign\EsignSignField; use App\Models\ESign\EsignAuditLog; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Mail; use Illuminate\Support\Str; class EsignApiController extends Controller @@ -256,10 +258,11 @@ public function send(Request $request, int $id): JsonResponse 'updated_by' => auth()->id(), ]); - // 첫 번째 서명자 상태 변경 + // 첫 번째 서명자 상태 변경 + 메일 발송 $nextSigner = $contract->signers()->orderBy('sign_order')->first(); if ($nextSigner) { $nextSigner->update(['status' => 'notified']); + Mail::to($nextSigner->email)->send(new EsignRequestMail($contract, $nextSigner)); } EsignAuditLog::create([ @@ -295,6 +298,7 @@ public function remind(Request $request, int $id): JsonResponse if ($nextSigner) { $nextSigner->update(['status' => 'notified']); + Mail::to($nextSigner->email)->send(new EsignRequestMail($contract, $nextSigner, isReminder: true)); } EsignAuditLog::create([ diff --git a/app/Mail/EsignRequestMail.php b/app/Mail/EsignRequestMail.php new file mode 100644 index 00000000..d847256b --- /dev/null +++ b/app/Mail/EsignRequestMail.php @@ -0,0 +1,47 @@ +isReminder ? '[리마인더] ' : ''; + + return new Envelope( + subject: "{$prefix}[SAM] 전자계약 서명 요청 - {$this->contract->title}", + ); + } + + public function content(): Content + { + $signUrl = config('app.url') . '/esign/sign/' . $this->signer->access_token; + + return new Content( + html: 'emails.esign.request', + with: [ + 'contractTitle' => $this->contract->title, + 'signerName' => $this->signer->name, + 'signUrl' => $signUrl, + 'expiresAt' => $this->contract->expires_at?->format('Y-m-d H:i'), + 'isReminder' => $this->isReminder, + ], + ); + } +} diff --git a/resources/views/emails/esign/request.blade.php b/resources/views/emails/esign/request.blade.php new file mode 100644 index 00000000..b3d5a1a5 --- /dev/null +++ b/resources/views/emails/esign/request.blade.php @@ -0,0 +1,79 @@ + + + + + + 전자계약 서명 요청 + + + + + + +
+ + + + + + + + + + + + + +
+

+ @if($isReminder ?? false) + [리마인더] 전자계약 서명 요청 + @else + 전자계약 서명 요청 + @endif +

+
+

안녕하세요, {{ $signerName }}님.

+

+ @if($isReminder ?? false) + 아래 전자계약에 대한 서명이 아직 완료되지 않았습니다.
+ 서명 기한 내에 서명을 완료해 주세요. + @else + 아래 전자계약에 대한 서명이 요청되었습니다.
+ 링크를 클릭하여 서명을 진행해 주세요. + @endif +

+ + + + + +
+

계약 제목

+

{{ $contractTitle }}

+

서명 기한

+

{{ $expiresAt }}

+
+ + + + + +
+ + 서명하기 + +
+ +

+ 위 버튼이 동작하지 않으면 아래 링크를 브라우저에 직접 입력해 주세요:
+ {{ $signUrl }} +

+
+

+ 본 메일은 SAM 전자계약 시스템에서 자동 발송되었습니다. +

+
+
+ +