- TCPDF K_PATH_FONTS를 storage/fonts/tcpdf/로 설정하여 vendor 쓰기 권한 문제 해결
- 사전 생성된 Pretendard 폰트 정의 파일 포함 (런타임 생성 불필요)
- downloadDocument() 에러 로깅 상세화 (trace 포함)
- resolveTemplateName() 헬퍼 메서드 추가 (두 컨트롤러)
- production 환경: 전자계약_서명요청, 전자계약_완료, 전자계약_리마인드
- 개발 환경: 전자계약_서명요청_DEV, 전자계약_완료_DEV, 전자계약_리마인드_DEV
- config('app.url')은 이미 환경별 도메인 자동 사용
- dispatchNotification: 상대방(counterpart)만 알림톡, 본사(creator)는 이메일
- 순차 서명 시 다음 서명자 알림도 동일 역할 기반 분기 적용
- 다음 서명자 알림에서 getKakaotalkChannelId/getTemplateData 헬퍼 활용
- 알림톡 실패 시 이메일 자동 폴백 로직 통일
- sendCompletionAlimtalk: 승인된 '전자계약_완료' 템플릿 조회 후 변수 치환 발송
- 버튼 URL에 PDF 다운로드 링크(/api/document) 포함
- 상대방(counterpart)만 알림톡 발송, 본사(creator)는 이메일 유지
- 알림톡 실패 시 이메일 자동 폴백 처리
- 발송 후 3초 대기하여 전달 결과 확인 로직 추가
- getKakaotalkChannelId, getTemplateData 헬퍼 메서드 추가
- store(): GCS뿐 아니라 local_path 도장도 signer에 자동 적용
- getContract(): signer에 도장 없어도 tenant_settings에서 확인하여 has_stamp 반환
- submitSignature(): 기존 계약 creator도 tenant_settings에서 도장 가져와 적용
- SenderID: 바로빌 계정 ID (barobill_id) 사용
- YellowId: 카카오톡 채널 ID 필수 전달 (기존에 빈값)
- SmsReply: 'N' (대체문자 미발송) 또는 'S' (발송) 명시
- 템플릿 본문: API에서 조회 후 변수 치환 (정확한 포맷 유지)
- getKakaotalkSenderId → getKakaotalkChannelId 이름 변경
- EsignPublicController: 잘못된 필드명(corp_num, is_test_mode) 수정
- WSDL 스펙에 맞게 KakaotalkMessage 중첩 구조로 변경
- ReceiverName, ReceiverNum 등을 최상위에서 KakaotalkMessage 내부로 이동
- ReserveDT → SendDT로 파라미터명 수정
- SendATKakaotalkEx에 YellowId 파라미터 추가
- 버튼 배열을 KakaotalkButton 래핑 구조로 변경
- sendATKakaotalks 대량 발송도 WSDL 구조에 맞게 수정
- esign 알림톡 메시지 본문을 등록 템플릿에 맞게 조정
- 백엔드: submitSignature에 stamp_image(base64) 파라미터 처리 추가
- 프론트: counterpart 역할에 도장 선택 UI 항상 표시
- 프론트: 도장 이미지 업로드(PNG/JPG, 5MB 제한) 및 미리보기 기능
- 기존 Creator 법인도장 흐름은 변경 없음
- Tenant 대신 TenantProspect(tenant_prospects 테이블) 사용
- 업체명/사업자번호/대표자명/연락처로 검색
- 필드명 매칭: business_number, contact_phone, contact_email
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 테넌트(고객) 검색 API 추가 (searchTenants)
- 계약번호 자동 채번 API 추가 (CONTRACT-YYYYMMDD-N 형식)
- 고객 서비스이용 계약서 선택 시 "고객 불러오기" 버튼 표시
- 고객 선택 시 상호/사업자등록번호/주소/전화번호 자동 채움
- 총개발비 기본값 20,000,000 / 월구독료 기본값 500,000 자동 세팅
- TenantSearchModal 컴포넌트 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- searchPartners 역할 필터를 sales만 → sales/manager 모두 포함하도록 확장
- 사용자 역할(영업파트너/상담매니저)을 position 필드로 API 응답에 추가
- handlePartnerSelect에 position 매핑 추가 (key: position, label: 포지션/직책/역할)
- PartnerSearchModal 검색 결과에 position 배지 표시
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
- 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>
configureFields()와 copyFieldsFromContract()에서 기존 필드를
삭제 후 재생성할 때 field_value를 설정하지 않아 계약서 PDF에
서명자명, 날짜 등 기본값이 빠지는 문제 수정.
buildVariableMap()으로 변수 맵을 구성하여 값을 채우도록 개선.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
getContract API가 항상 데이터를 반환하되 is_signable 플래그로
서명 가능 여부를 전달하도록 변경. done 페이지에서 signed/completed
상태의 계약도 정상적으로 정보를 표시할 수 있도록 수정.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- whereHas('salesPartner') → whereHas('userRoles') + role.name='sales'
- 현재 테넌트의 sales 역할을 가진 활성 사용자만 검색
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
- overlayDate: Y-m-d → Y년 n월 j일, 미지정 시 12pt 고정
- buildVariableMap: current_date/expires_at도 동일 형식 적용
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
- storeTemplate() API에서 items를 nullable로 변경하여 빈 템플릿 생성 허용
- signer_count/variables 파라미터 직접 지정 가능하도록 추가
- "새 템플릿" 버튼 클릭 시 CreateTemplateModal 표시 (이름/설명/카테고리/서명자수/PDF)
- 생성 완료 후 필드 에디터(/esign/templates/{id}/fields)로 자동 이동
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
- 대시보드 설정 탭 추가 (법인도장 등록/미리보기/삭제 UI)
- tenant_settings 테이블에 esign/company_stamp 키로 저장
- 새 계약 생성 시 등록된 도장 자동 적용 (creator signer)
- 계약 생성 페이지에서 개별 도장 업로드 UI 제거
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 작성자 자동서명 로직 제거 → 양쪽 모두 서명 과정 필수
- 서명 화면에서 '직접 서명' / '법인도장' 선택 UI 추가
- 도장 선택 시 기존 stamp 이미지로 바로 제출
- getContract API에 has_stamp 필드 추가
- submitSignature에 use_stamp 플래그 처리 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 계약 생성 화면에 법인도장 업로드 UI 추가 (미리보기/삭제)
- store()에서 base64 이미지 디코딩 후 저장, creator signer에 연결
- send()에서 법인도장 있는 작성자 자동 서명 처리 (상대방에게만 이메일 발송)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>