55 Commits

Author SHA1 Message Date
김보곤
3603a06c62 feat: [esign] 완료 알림톡 템플릿 2종 선택 및 버튼 URL 도메인 치환
- 발송 UI에 서명 요청 + 완료 알림톡 템플릿 각각 선택 가능
- 선택한 완료 템플릿명을 DB에 저장하여 서명 완료 시 사용
- 버튼 URL 도메인을 현재 환경의 app.url로 자동 치환 (개발/운영 환경 대응)
2026-02-27 16:29:03 +09:00
김보곤
3c3e0f8141 feat: [esign] 알림톡 템플릿명 환경별 분기 (운영: 원본, 개발: _DEV)
- resolveTemplateName() 헬퍼 메서드 추가 (두 컨트롤러)
- production 환경: 전자계약_서명요청, 전자계약_완료, 전자계약_리마인드
- 개발 환경: 전자계약_서명요청_DEV, 전자계약_완료_DEV, 전자계약_리마인드_DEV
- config('app.url')은 이미 환경별 도메인 자동 사용
2026-02-27 08:15:54 +09:00
김보곤
9676f0409e fix: [esign] 서명 요청/다음 서명자 알림에 역할 기반 분기 적용
- dispatchNotification: 상대방(counterpart)만 알림톡, 본사(creator)는 이메일
- 순차 서명 시 다음 서명자 알림도 동일 역할 기반 분기 적용
- 다음 서명자 알림에서 getKakaotalkChannelId/getTemplateData 헬퍼 활용
- 알림톡 실패 시 이메일 자동 폴백 로직 통일
2026-02-26 23:03:43 +09:00
김보곤
af542c0f41 fix: [esign] 로컬 저장 방식 법인도장이 서명 페이지에서 미표시되는 버그 수정
- store(): GCS뿐 아니라 local_path 도장도 signer에 자동 적용
- getContract(): signer에 도장 없어도 tenant_settings에서 확인하여 has_stamp 반환
- submitSignature(): 기존 계약 creator도 tenant_settings에서 도장 가져와 적용
2026-02-26 11:21:42 +09:00
김보곤
76c60f6a92 fix: [esign] 알림톡 버튼 URL 도메인 치환 제거 (카카오 템플릿 검증 불일치 방지) 2026-02-26 08:37:15 +09:00
김보곤
370d001818 fix: [esign] 알림톡 버튼 URL 도메인을 APP_URL로 치환 (개발/운영 환경 대응) 2026-02-26 08:30:57 +09:00
김보곤
5a299ad20f fix: [esign] 알림톡 버튼 URL의 #{토큰} 변수를 실제 access_token으로 치환 2026-02-26 07:45:24 +09:00
김보곤
2f6e796e3f feat: [esign] 알림톡 템플릿 선택 기능 추가
- 바로빌 승인된 알림톡 템플릿 목록 조회 API 추가
- 서명 요청 발송 시 템플릿 선택 드롭다운 UI 추가
- 템플릿 미리보기 (본문 + 버튼) 표시
- send()에 template_name 파라미터 전달 지원
- 미선택 시 기존 하드코딩 폴백 유지
2026-02-25 22:42:29 +09:00
김보곤
9a7c548246 style: Pint 포맷팅 적용 2026-02-25 11:45:01 +09:00
김보곤
504f59dc99 fix: [esign] 알림톡 버튼 URL을 등록된 템플릿 URL 그대로 사용 (동적 URL 템플릿 불일치 수정) 2026-02-24 18:41:55 +09:00
김보곤
7cf1f20fdb fix: [esign] 알림톡 발송 상세 로깅 추가 및 전달 결과 확인, SMS 폴백 제거 2026-02-24 18:33:37 +09:00
김보곤
cd339ca17a fix: [esign] 법인도장 GCS 미설정 시 로컬 스토리지 폴백 추가 2026-02-24 17:57:14 +09:00
김보곤
e12d0d1607 fix: [barobill] 알림톡 발송 파라미터 구조 전면 수정
- SenderID: 바로빌 계정 ID (barobill_id) 사용
- YellowId: 카카오톡 채널 ID 필수 전달 (기존에 빈값)
- SmsReply: 'N' (대체문자 미발송) 또는 'S' (발송) 명시
- 템플릿 본문: API에서 조회 후 변수 치환 (정확한 포맷 유지)
- getKakaotalkSenderId → getKakaotalkChannelId 이름 변경
- EsignPublicController: 잘못된 필드명(corp_num, is_test_mode) 수정
2026-02-24 10:04:54 +09:00
김보곤
66be684d40 fix: [barobill] 카카오톡 알림톡 SOAP 파라미터 구조 수정
- WSDL 스펙에 맞게 KakaotalkMessage 중첩 구조로 변경
- ReceiverName, ReceiverNum 등을 최상위에서 KakaotalkMessage 내부로 이동
- ReserveDT → SendDT로 파라미터명 수정
- SendATKakaotalkEx에 YellowId 파라미터 추가
- 버튼 배열을 KakaotalkButton 래핑 구조로 변경
- sendATKakaotalks 대량 발송도 WSDL 구조에 맞게 수정
- esign 알림톡 메시지 본문을 등록 템플릿에 맞게 조정
2026-02-24 01:21:08 +09:00
김보곤
6e043b9539 fix: [esign] 알림톡 발신프로필 키(SenderID) 조회 로직 추가
- senderId를 빈 문자열로 보내던 것을 바로빌 채널 목록에서 ChannelId 조회 후 전달
- 바로빌 API 오류 -24005 해결
2026-02-24 00:55:32 +09:00
김보곤
748a9d1807 fix: [esign] 알림톡 발송 실패 수정 (corp_num → biz_no)
- BarobillMember의 실제 컬럼명은 biz_no인데 corp_num으로 접근하여 항상 null
- is_test_mode → server_mode로 수정
- kakaotalk_sender_id → 빈 문자열 (기본 발신프로필 사용)
2026-02-24 00:46:29 +09:00
김보곤
7849c63507 fix:발송 방식 선택 UI 개선 - 이메일/알림톡 선택 가능, 이메일 기본값, 리마인더 발송 방식 모달 추가 2026-02-19 23:55:28 +09:00
김보곤
3724bc4475 fix:알림톡 미설정 시 에러 방지 - 기본 발송을 이메일로 변경, 알림톡 실패 시 이메일 자동 폴백 2026-02-19 23:50:37 +09:00
김보곤
6cf440f349 fix:고객 검색을 TenantProspect(명함 등록 고객)에서 조회하도록 수정
- Tenant 대신 TenantProspect(tenant_prospects 테이블) 사용
- 업체명/사업자번호/대표자명/연락처로 검색
- 필드명 매칭: business_number, contact_phone, contact_email

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 23:44:17 +09:00
김보곤
bcc95ffafa feat:고객 서비스이용 계약서 - 고객 불러오기/계약번호 자동채번/기본값
- 테넌트(고객) 검색 API 추가 (searchTenants)
- 계약번호 자동 채번 API 추가 (CONTRACT-YYYYMMDD-N 형식)
- 고객 서비스이용 계약서 선택 시 "고객 불러오기" 버튼 표시
- 고객 선택 시 상호/사업자등록번호/주소/전화번호 자동 채움
- 총개발비 기본값 20,000,000 / 월구독료 기본값 500,000 자동 세팅
- TenantSearchModal 컴포넌트 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 23:23:06 +09:00
김보곤
eafd81d97a feat:파트너 검색에 포지션(역할) 필드 추가
- searchPartners 역할 필터를 sales만 → sales/manager 모두 포함하도록 확장
- 사용자 역할(영업파트너/상담매니저)을 position 필드로 API 응답에 추가
- handlePartnerSelect에 position 매핑 추가 (key: position, label: 포지션/직책/역할)
- PartnerSearchModal 검색 결과에 position 배지 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 18:07:16 +09:00
김보곤
a7aa2e2cd2 fix:E-Sign 알림톡 certKey 버그 수정 및 발송 상태 추적 기능 추가
- sendATKakaotalkEx() 호출 시 존재하지 않는 certKey 파라미터 제거 (TypeError 버그)
- sendAlimtalk/dispatchNotification 결과 반환 (void → array)
- send/remind 응답에 notification_results 포함
- 감사 로그 metadata에 서명자별 알림 발송 결과 저장
- EsignPublicController 다음 서명자/완료 알림에도 동일 수정 적용
- detail.blade.php: 발송 방식 배지, 서명자 연락처, 알림 오류 배너, 활동 로그 발송 결과 표시
- send.blade.php: 발송 후 알림 실패 시 경고 메시지 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 17:01:14 +09:00
김보곤
bea7bd5987 feat:전자계약 알림톡 발송 방식 선택 기능 추가
- EsignApiController: send_method/sms_fallback 저장, dispatchNotification/sendAlimtalk 메서드 추가
- EsignPublicController: 완료/다음서명자 알림에 알림톡 지원 추가
- EsignContract 모델: send_method, sms_fallback fillable/casts 추가
- send.blade.php: 발송방식 선택 UI (알림톡/이메일/동시), SMS 대체발송, 연락처 확인

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 16:12:41 +09:00
김보곤
70bfccf5fb fix:전자서명 필드 위치 설정/복사 시 field_value 누락 수정
configureFields()와 copyFieldsFromContract()에서 기존 필드를
삭제 후 재생성할 때 field_value를 설정하지 않아 계약서 PDF에
서명자명, 날짜 등 기본값이 빠지는 문제 수정.
buildVariableMap()으로 변수 맵을 구성하여 값을 채우도록 개선.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 13:27:38 +09:00
김보곤
2fdf151c14 fix:영업파트너 검색을 sales 역할 기반으로 변경
- whereHas('salesPartner') → whereHas('userRoles') + role.name='sales'
- 현재 테넌트의 sales 역할을 가진 활성 사용자만 검색

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 11:00:37 +09:00
김보곤
72ce6980a7 fix:영업파트너 모달 높이 고정+스크롤 적용, salesPartner 레코드 보유자만 검색
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 10:55:05 +09:00
김보곤
92c78b353e feat:E-Sign 계약 생성 영업파트너 검색 모달 추가
- EsignApiController에 searchPartners() 검색 API 추가
- SalesPartner 모델 $fillable에 company_name, biz_no, address 추가
- User 모델에 salesPartner() HasOne 관계 추가
- create.blade.php에 PartnerSearchModal 컴포넌트 + 자동채우기 로직 추가
- web.php에 search-partners 라우트 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 10:48:31 +09:00
김보곤
e0e97165b3 feat:계약 필드 에디터에 텍스트 정렬(L/C/R) 설정 기능 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 20:06:32 +09:00
김보곤
c635abc3dd fix:날짜 형식 통일 (Y년 n월 j일) + 날짜 폰트 크기 일관성 확보
- overlayDate: Y-m-d → Y년 n월 j일, 미지정 시 12pt 고정
- buildVariableMap: current_date/expires_at도 동일 형식 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 19:52:14 +09:00
김보곤
843e898f5f fix:E-Sign PDF 폰트 크기 2배 확대, 왼쪽 정렬 기본값, 서명자 매핑 수정
- PdfSignatureService: 자동 폰트 크기 공식 2배(h*0.7→h*1.4), 기본 정렬 C→L
- text_align 필드 추가 (L/C/R 정렬 선택 가능)
- store()/buildVariableMap(): sign_order→role 기반 매핑으로 변경
  (signer_order 1=creator/갑/회사, 2=counterpart/을/파트너)
- template-fields: 가로 정렬 버튼 UI 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 18:07:31 +09:00
김보곤
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
김보곤
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
김보곤
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