기존: 브라우저 → 외부 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>
- EsignRequestMail Mailable 클래스 추가 (리마인더 구분 지원)
- 이메일 HTML 템플릿 추가 (서명하기 버튼 + 계약 정보)
- send()에서 첫 번째 서명자에게 메일 발송
- remind()에서 다음 서명 대상자에게 리마인더 메일 발송
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
모델 $fillable에 tenant_id 추가, 컨트롤러의 감사 로그 생성 3곳
(contract_created, contract_cancelled, sign_request_sent) 모두
tenant_id를 포함하도록 수정.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Input 컴포넌트가 App 내부에 정의되어 매 리렌더마다
새 컴포넌트로 인식 → DOM 재생성 → IME 조합 끊김 발생.
Input을 App 바깥으로 이동하여 안정적인 컴포넌트 참조 유지.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- OTP 개념 설명 (택배 보관함 비유)
- 왜 필요한지 쉬운 설명
- 시각적 단계별 가이드 (6자리 입력 UI 포함)
- 주의사항 친절한 안내
- FAQ에 "코드가 안 올 때" 항목 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DocumentTemplateApiController: 이미지 업로드 API 파일저장소 연동
- 양식 편집: 미리보기 모달 개선
- 문서 편집: UI 개선
- 빌드 에셋 업데이트
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 기본정보(bf_) 자동 backfill: show/print/edit 진입 시 bf_ 레코드 없으면 작업지시서 원본에서 resolve 후 저장
- 중간검사 DATA row 수를 section items → workOrderItems 기준으로 변경
- 종합판정: overall_result 없을 때 row_judgment에서 합격/불합격 자동 계산 fallback
- 섹션 이미지: asset() → API 스토리지 URL 변환 (api.sam.kr/storage/tenants/...)
다른 메뉴가 현재 URL에 정확히 매칭될 때 prefix 매칭을
비활성화하여, 형제 메뉴가 동시에 활성화되는 문제 해결.
예: /esign/create 접속 시 /esign 메뉴가 함께 활성화되던 문제.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 새 파일: resources/views/partials/react-cdn.blade.php
- 모든 React 페이지에서 중복된 CDN 스크립트를 @include('partials.react-cdn')로 대체
- 30개 파일 업데이트 (finance, juil, system, sales)
- 유지보수성 향상: CDN 버전 변경 시 한 곳만 수정
- 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>
- 컨트롤러 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>
- Web Audio API rawAnalyser를 오디오 체인에 삽입 (compressor 이전, 원본 신호 분석)
- Spectral Centroid + VAD 기반 100ms 간격 실시간 화자 분류 엔진 구현
- 500ms 윈도우 다수결 투표로 화자 안정성 확보
- 수동 화자 선택 버튼 제거 → 자동 감지 인디케이터로 대체
- 최대 4명까지 자동 화자 프로필 등록 및 speakers 동기화
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- V2: 리전별 엔드포인트 사용 ({location}-speech.googleapis.com)
- V2 폴링도 리전별 엔드포인트 사용
- Google 화자분리가 1명만 인식 시 Gemini AI가 대화 패턴 분석하여 화자 재분배
- Gemini 프롬프트: 맥락/호칭/질문-답변/어투 변화 기반 화자 분리
- 사용량 로깅에 engine 구분 (v1+gemini, v2+gemini 등)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
V2 에러: configMask → 제거 (V2 REST API 자동 추론), 전체 snake_case 적용
V1 에러: audioChannelCount=2 추가 (원본 스트림이 스테레오 WebM)
V2 파싱: speaker_tag/start_offset 등 snake_case 필드명도 처리
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DynamicsCompressor가 모든 화자의 음량을 동일하게 압축하여
화자 음성 특성이 파괴되는 문제 해결:
- MediaRecorder 1 (처리된 스트림): 실시간 Web Speech API용
- MediaRecorder 2 (원본 스트림): GCS 업로드 → 화자분리용
- 원본 오디오가 화자 음성 특성을 보존하여 분리 정확도 향상
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 프론트엔드: Web Audio API 전처리 파이프라인 (GainNode + DynamicsCompressor + AnalyserNode)
- 프론트엔드: VU 미터 실시간 레벨 표시 + 마이크 감도 슬라이더 (0.5x~3.0x)
- 프론트엔드: getUserMedia constraints 강화 + MediaRecorder 128kbps Opus
- 백엔드: Google STT V2 API + Chirp 2 모델 batchRecognize 메서드 추가
- 백엔드: V2→V1 자동 폴백 래퍼 (speechToTextWithDiarizationAuto)
- 백엔드: Speech Adaptation 도메인 용어 힌트 (블라인드/스크린 등 22개)
- 백엔드: V2 SentencePiece 토큰 자동 감지 분기 처리
- 설정: config/services.php에 google.location 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- ▁(U+2581) 문자를 _(U+005F)와 별도로 처리
- SentencePiece 토큰 결합 로직 추가 (joinSentencePieceTokens)
- ▁로 시작하는 토큰: 새 단어 → 공백 추가
- ▁없는 토큰: 이전 단어에 직접 붙임
- cleanSttText에서 ▁→공백 변환 추가
- 프론트엔드에서도 ▁ 문자 정제 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 대화 기록 탭에서 텍스트, 화자 변경, 세그먼트 삭제 가능
- 편집/저장/취소 버튼을 탭 바에 배치
- 자동 높이 조절 textarea 컴포넌트 추가
- 녹음 중에는 편집 버튼 숨김
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- GoogleCloudService: 단어 내부/앞뒤 _ 모두 제거 + cleanSttText 헬퍼
- MeetingMinuteService: 세그먼트 저장 시 _ 제거
- 프론트엔드: 대화기록/스크립트 탭 표시 시에도 _ 제거
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- ConstructionSitePhotoRow 모델 추가
- 부모 모델에서 사진 컬럼 제거, rows() 관계 추가
- 서비스/컨트롤러에 행 추가/삭제 기능 추가
- 라우트를 행 기반 URL 구조로 변경
- 프론트엔드 멀티행 UI 전면 개편
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
VoiceInputButton 프리뷰 패널을 absolute → fixed 포지셔닝으로 변경
- 모달의 overflow-y-auto에 의한 클리핑 완전 우회
- 버튼 위치 기반으로 fixed 좌표 계산하여 항상 버튼 상단에 표시
- z-index 9999로 모든 요소 위에 렌더링
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
업로드 전 Canvas API로 이미지를 리사이즈+압축하여 GCS 저장 용량 절감
- 최대 너비 1920px 리사이즈 (비율 유지)
- JPEG 품질 80% 압축
- 압축 결과가 원본보다 크면 원본 유지 (안전장치)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DocumentTemplateBasicField 모델의 $fillable에 field_key 추가
- Mass Assignment 보호로 인해 create() 시 field_key가 null로 저장되던 버그 수정
- 검사성적서 기본정보 매핑 정상화
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>