Commit Graph

31 Commits

Author SHA1 Message Date
김보곤
d5283099c4 feat:새 템플릿 생성 기능 추가 (CreateTemplateModal)
- storeTemplate() API에서 items를 nullable로 변경하여 빈 템플릿 생성 허용
- signer_count/variables 파라미터 직접 지정 가능하도록 추가
- "새 템플릿" 버튼 클릭 시 CreateTemplateModal 표시 (이름/설명/카테고리/서명자수/PDF)
- 생성 완료 후 필드 에디터(/esign/templates/{id}/fields)로 자동 이동

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 17:40:41 +09:00
김보곤
259c07e880 feat:템플릿 기반 계약서 자동 생성 시스템
- store()에서 template_id 있으면 필드 자동 생성 (서버 사이드)
- create.blade.php 변수 입력 UX 개선 (시스템/커스텀 변수 구분)
- 바로 발송 버튼 추가 (템플릿 선택 시)
- fields.blade.php URL 파라미터 기반 auto-apply 제거
- PdfSignatureService NanumGothic 한글 폰트 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 17:07:59 +09:00
김보곤
40a9b26861 refactor:법인도장 저장소를 GCS로 변경 (로컬/서버 환경 무관)
- 업로드: base64 → 임시파일 → GCS 업로드
- 조회: GCS signed URL 반환 (60분 유효)
- 삭제: GCS 객체 삭제 + tenant_settings 삭제
- 계약 생성 시: GCS에서 다운로드 → 로컬 저장 → signer에 설정
- tenant_settings 값: image_path → gcs_object로 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 16:48:18 +09:00
김보곤
0d00d1c67f fix:법인도장 이미지를 base64 data URL로 반환 (local disk 404 해결)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 16:46:11 +09:00
김보곤
fe9716ff17 fix:법인도장 업로드를 base64 방식으로 변경 (PHP upload_max_filesize 제한 우회)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 16:44:12 +09:00
김보곤
e8d494a081 feat:법인도장 대시보드 등록 + 새 계약 자동 적용
- 대시보드 설정 탭 추가 (법인도장 등록/미리보기/삭제 UI)
- tenant_settings 테이블에 esign/company_stamp 키로 저장
- 새 계약 생성 시 등록된 도장 자동 적용 (creator signer)
- 계약 생성 페이지에서 개별 도장 업로드 UI 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 16:26:28 +09:00
김보곤
24c6927b56 feat:E-Sign 작성자 서명/도장 선택 기능 (자동서명 제거)
- 작성자 자동서명 로직 제거 → 양쪽 모두 서명 과정 필수
- 서명 화면에서 '직접 서명' / '법인도장' 선택 UI 추가
- 도장 선택 시 기존 stamp 이미지로 바로 제출
- getContract API에 has_stamp 필드 추가
- submitSignature에 use_stamp 플래그 처리 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 15:02:26 +09:00
김보곤
0c47d7b996 feat:E-Sign 법인도장(Corporate Seal) 등록 및 자동 서명 기능
- 계약 생성 화면에 법인도장 업로드 UI 추가 (미리보기/삭제)
- store()에서 base64 이미지 디코딩 후 저장, creator signer에 연결
- send()에서 법인도장 있는 작성자 자동 서명 처리 (상대방에게만 이메일 발송)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:36:11 +09:00
김보곤
165ccf843e feat:E-Sign DOCX 업로드 시 PDF 자동 변환 (LibreOffice)
Word(.docx/.doc) 파일 업로드 시 서버에서 LibreOffice headless로 PDF 자동 변환.
계약 생성, PDF 업로드, 템플릿 PDF 교체 3개 엔드포인트에 적용.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 10:11:14 +09:00
김보곤
5ffabed6b4 feat:E-Sign 템플릿 변수 자동채움 시스템 구현
- 시스템 변수 (서명자명, 이메일, 계약제목, 날짜 등) 자동 해석
- 커스텀 변수 정의/관리 (템플릿별 계약금액, 기간 등)
- 템플릿 필드 에디터: 변수 관리 + 필드-변수 바인딩 UI
- 계약 생성 폼: 템플릿 변수 입력 섹션 추가
- 계약 필드 에디터: 변수 연결 정보 표시
- PdfSignatureService: font_size 반영 렌더링

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 10:11:14 +09:00
김보곤
b206eeeb2d feat:E-Sign 필드 에디터에 폰트 크기 속성 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 10:11:14 +09:00
김보곤
f83a62b479 feat:템플릿 비주얼 필드 에디터 추가
PDF 위에서 드래그앤드롭으로 템플릿 필드를 편집하는 기능 구현:
- template-fields.blade.php 뷰 생성 (fields.blade.php 기반, signer_order 사용)
- updateTemplateItems API 추가 (필드 일괄 저장)
- 템플릿 카드/모달에 필드 편집 링크 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 10:11:14 +09:00
김보곤
a464cf40de feat:템플릿 편집 모달 확장 (PDF 관리 + 서식 필드 관리)
백엔드:
- uploadTemplatePdf: 템플릿 PDF 업로드/교체 API
- removeTemplatePdf: 템플릿 PDF 제거 API
- destroyTemplateItem: 개별 필드 아이템 삭제 API (signer_count 자동 재계산)
- updateTemplate 응답에 items 관계 포함

프론트엔드:
- 모달 폭 420px → 680px 확장
- 3개 탭 구성: 기본 정보 / PDF 파일 / 서식 필드
- PDF 탭: 현재 파일 정보, 다운로드, 교체, 제거 기능
- 서식 필드 탭: 필드 목록 테이블 (유형/라벨/서명자/페이지/위치/필수), 개별 삭제
- 편집 시 상세 데이터(items 포함) 로드

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 10:11:14 +09:00
김보곤
36654d9992 feat:계약 휴지통 기능 (소프트 삭제/복구/영구삭제)
백엔드:
- destroy를 SoftDelete 방식으로 변경 (deleted_at + deleted_by 기록)
- trashed: 휴지통 목록 조회 API 추가
- restore: 선택 복구 API 추가
- forceDestroy: 영구 삭제 API 추가 (파일+관련 레코드 완전 삭제)
- 라우트 3개 추가 (trashed, restore, force-destroy)

프론트엔드:
- 대시보드에 탭 UI 추가 (계약 목록 / 휴지통)
- 휴지통 탭: 삭제된 계약 목록, 삭제일 표시
- 선택 복구(파란색) / 영구삭제(빨간색) 버튼
- 휴지통 건수 뱃지 표시
- 삭제 시 메시지를 "휴지통으로 이동"으로 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 10:11:14 +09:00
김보곤
2dea60de23 feat:계약 대시보드 선택 삭제 기능 추가
- EsignApiController에 destroy 메서드 추가 (복수 삭제 지원)
- 관련 파일(PDF, 서명이미지) 및 레코드(서명자, 필드, 감사로그) 일괄 삭제
- 서명 진행 중(pending, partially_signed) 계약은 삭제 차단
- DELETE /esign/contracts/destroy 라우트 추가
- 대시보드에 체크박스 전체/개별 선택 + 삭제 버튼 UI 추가
- 삭제 전 confirm 확인 다이얼로그

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 10:11:14 +09:00
김보곤
8f7a441900 feat:서명 완료 시 계약서 이메일 발송 및 감사 로그 추가
- EsignCompletedMail Mailable 생성 (완료 알림 + PDF 다운로드 링크)
- completed.blade.php 이메일 뷰 템플릿 생성 (초록색 테마)
- submitSignature에 contract_completed 감사 로그 추가
- 모든 서명자에게 완료 이메일 발송 + completion_email_sent 감사 로그
- 이메일 발송 실패 시 try-catch로 계약 완료 보호

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 10:11:14 +09:00
김보곤
f050be52fe feat:E-Sign 템플릿에 PDF 파일 포함 기능 추가
- 모델: EsignFieldTemplate fillable에 file 컬럼 추가
- storeTemplate: include_pdf + contract_id로 계약 PDF를 템플릿으로 복사
- store(계약 생성): template_id로 템플릿 PDF 자동 복사 (사용자 업로드 우선)
- duplicateTemplate: 복제 시 PDF 파일도 복사
- 템플릿 PDF 다운로드 엔드포인트 추가
- SaveTemplateModal: "현재 PDF 파일 포함" 체크박스 추가
- create: 템플릿 카드에 PDF 뱃지, PDF 자동 사용 안내
- templates: 템플릿 카드에 PDF 파일명 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 10:11:14 +09:00
김보곤
9b119fa7c9 fix:템플릿 선택 시 PDF 파일 필수 해제 및 후속 업로드 지원
- create: 템플릿 선택 시 PDF required 제거, 안내 메시지 표시
- fields: PDF 없는 계약 시 업로드 UI 표시
- API: uploadPdf 엔드포인트 추가 (POST /{id}/upload-pdf)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:05:28 +09:00
김보곤
fd5d052cb7 feat:PDF 서명 오버레이 합성 기능 구현
- PdfSignatureService 신규 생성 (FPDI+TCPDF 기반 PDF 합성)
- submitSignature에서 모든 서명 완료 시 자동 PDF 합성 호출
- downloadDocument에서 서명 완료 PDF 우선 제공
- setasign/fpdi, tecnickcom/tcpdf 패키지 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 19:42:08 +09:00
김보곤
ec43fe1991 feat:E-Sign 템플릿 관리 시스템 Phase 2 구현
- 템플릿 관리 전용 페이지 (카드 그리드, 검색/필터, 편집/복제/삭제)
- API: showTemplate, updateTemplate, duplicateTemplate 추가
- indexTemplates에 category/search 필터 추가
- 계약 생성 시 템플릿 선택 UI 추가
- 필드 에디터에서 URL 파라미터 template_id 자동 적용
- EsignFieldTemplate 모델에 category 필드 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:55:06 +09:00
김보곤
79c23f3337 feat:E-Sign 필드 템플릿 저장/불러오기 및 계약 간 복사 기능
- EsignFieldTemplate, EsignFieldTemplateItem 모델 추가
- EsignApiController에 템플릿 CRUD + 적용/복사 메서드 5개 추가
- web.php에 템플릿 라우트 5개 추가
- fields.blade.php에 템플릿 드롭다운 메뉴 + 모달 3개 추가
  (SaveTemplate, LoadTemplate, CopyFromContract)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:02:31 +09:00
김보곤
4f25e0e4a1 fix:서명 완료 후 다음 서명자 자동 알림 발송 추가
- submitSignature: 첫 번째 서명자 완료 시 다음 서명자에게 자동 이메일 발송
- send: sign_order_type이 parallel이면 모든 서명자에게 동시 발송

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 16:46:57 +09:00
김보곤
df237140a3 fix:E-Sign 서명 페이지 Blade/JSX 충돌 수정 및 내부 API 전환
- sign.blade.php: style={{}} → STYLES 상수로 Blade {{ }} 파싱 충돌 해결
- sign.blade.php, done.blade.php: 외부 API 호출 → MNG 내부 엔드포인트로 변경
- EsignPublicController: submitSignature, rejectContract, downloadDocument 추가
- routes/web.php: submit, reject, document API 라우트 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 16:38:21 +09:00
김보곤
45e6afb862 feat:E-Sign 서명 인증을 MNG 자체 API로 전환
기존: 브라우저 → 외부 API 서버(api.codebridge-x.com) 호출
변경: 브라우저 → MNG 자체 엔드포인트(/esign/sign/{token}/api/*) 호출

- EsignPublicController에 getContract/sendOtp/verifyOtp API 추가
- auth.blade.php에서 외부 API 호출을 MNG 자체 API로 변경
- EsignOtpMail Mailable + 이메일 템플릿 추가
- CSRF 예외에 esign/sign/*/api/* 추가
- 로컬/서버 환경 모두에서 동작

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 16:26:28 +09:00
김보곤
9094a82f0a feat:E-Sign 서명 요청/리마인더 메일 발송 구현
- EsignRequestMail Mailable 클래스 추가 (리마인더 구분 지원)
- 이메일 HTML 템플릿 추가 (서명하기 버튼 + 계약 정보)
- send()에서 첫 번째 서명자에게 메일 발송
- remind()에서 다음 서명 대상자에게 리마인더 메일 발송

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 16:15:53 +09:00
김보곤
837fe42663 feat:E-Sign 리마인더 발송 라우트 및 컨트롤러 추가
detail.blade.php에서 호출하는 remind 엔드포인트가 누락되어 있었음.
POST /esign/contracts/{id}/remind 라우트 추가,
EsignApiController::remind() 메서드 구현 (상태 변경 + 감사 로그).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 16:10:16 +09:00
김보곤
4ff7bab2bb fix:EsignSignField 생성 시 tenant_id 누락 수정
configureFields()에서 서명 필드 생성 시 tenant_id 추가,
모델 $fillable에도 tenant_id 추가.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 16:04:56 +09:00
김보곤
376e1bf57e fix:EsignAuditLog 생성 시 tenant_id 누락 수정
모델 $fillable에 tenant_id 추가, 컨트롤러의 감사 로그 생성 3곳
(contract_created, contract_cancelled, sign_request_sent) 모두
tenant_id를 포함하도록 수정.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 15:56:41 +09:00
김보곤
e0e6c71701 feat:전자계약 문서 페이지 추가 (8개 탭 기반 기술 문서)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 13:23:56 +09:00
김보곤
279a15bf0d refactor:E-Sign 외부 API 호출을 MNG 내부 라우트로 전환
- Finance 패턴과 동일하게 MNG 직접 DB 접근 방식으로 변경
- MNG 모델 4개 추가: EsignContract, EsignSigner, EsignSignField, EsignAuditLog
- EsignApiController 추가: stats, index, show, store, cancel, configureFields, send, download
- 모든 뷰(dashboard, create, detail, fields, send)에서 외부 API URL 제거
- 기존 X-API-Key/Bearer 인증 대신 MNG 세션 인증(CSRF) 사용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 10:24:09 +09:00
김보곤
3281788536 feat:E-Sign 전자계약 서명 솔루션 MNG 프론트엔드 구현
- 컨트롤러 2개 (EsignController, EsignPublicController)
- 뷰 8개 (dashboard, create, detail, fields, send, sign/auth, sign/sign, sign/done)
- React 하이브리드 방식 (기존 Finance 패턴)
- 라우트 추가 (인증 esign/* + 공개 esign/sign/*)
- PDF.js 기반 서명 위치 설정
- signature_pad 기반 전자서명 입력
- OTP 본인인증 플로우

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 07:02:48 +09:00