- 기존: 초기 주행거리(mileage)만 표시
- 변경: 초기 주행거리 + vehicle_logs.distance_km 합계 = total_mileage
- 요약 카드, CSV 다운로드 모두 total_mileage 사용
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 매출(세금계산서) → 매출(전자세금계산서) + 매출(종이세금계산서) 분리
- 매입(세금계산서) → 매입(전자세금계산서) + 매입(종이세금계산서) 분리
- 매입(카드) → 매입(신용카드) 명칭 변경
- 요약 테이블 6행으로 확장, 필터 드롭다운 업데이트
- 컨트롤러 stats에 hometaxSales/manualSales/manualPurchase 분리 반환
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- AiPricingConfig 모델 추가 (캐시 적용 단가/환율 조회)
- AiTokenUsageController에 pricingList/pricingUpdate 메서드 추가
- AI 토큰 사용량 페이지에 설정 버튼 + 모달 UI 추가
- AiTokenHelper 하드코딩 단가를 DB 조회로 변경
- pricing 라우트 추가 (GET/PUT)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- TriggerAuditLog 모델 (casts, accessors, scopes)
- TriggerAuditController (목록/상세/이력/롤백 미리보기/롤백 실행)
- index: 대시보드 통계 + 필터 + 목록 + 파티션 현황
- show: old/new diff 뷰 (변경 컬럼 하이라이트)
- history: 레코드별 변경 타임라인
- rollback-preview: SQL 미리보기 + 확인 후 실행
- 라우트 5개 등록, 메뉴 시더 (시스템 관리 > DB 변경 추적)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 세션 간 텍스트 누적 보존 (accumulatedTextRef 추가)
- 침묵으로 인한 자동 재시작 시 이전 텍스트 유실 방지
- 일시정지→재개 시 텍스트 보존
- 재시작 300ms 지연으로 급속 루프 방지
- stop() 후 이벤트 핸들러 제거로 중복 처리 방지
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 모델 열 뒤에 녹음시간 컬럼 추가
- STT(google-speech-to-text) 항목에서 prompt_tokens(초)를 '분 초' 형식으로 표시
- 다른 항목은 빈칸 표시
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DetailModal에 <audio> 태그 기반 재생기 추가 (다운로드 없이 바로 재생)
- 다운로드 엔드포인트에 ?inline=1 파라미터 지원 (스트리밍 재생용)
- Content-Length, Accept-Ranges 헤더 추가
- 플레이어 옆 다운로드 버튼 배치
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Str::slug()이 한글을 제거하는 문제 수정
- 한글 파일명 그대로 유지 (파일시스템 금지문자만 치환)
- RFC 5987 filename*=UTF-8'' 헤더로 브라우저 호환성 확보
- 다운로드 파일명 예시: 무제 음성녹음.webm
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Lucide 0.563.0 API 변경 대응: lucide.icons[name] → PascalCase 개별 export
- kebab-case → PascalCase 자동 변환 로직 적용
- 리네임된 아이콘 별칭 매핑 (check-circle→CircleCheck 등)
- 구버전 lucide.icons 객체 폴백 유지
- 적용 범위: finance/*(19), system/*(2), sales/interviews(1), ai-token-usage(1), holidays(1)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Lucide 0.563.0 API 변경 대응 (icons 객체 → 개별 PascalCase export)
- 아이콘 이름 변환: kebab-case → PascalCase, 구버전 호환 유지
- 리네임된 아이콘 별칭 처리 (check-circle→CircleCheck 등)
- 액션버튼(결과보기/다운로드/삭제) opacity-0 제거하여 항상 표시
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- GoogleCloudService에 downloadFromStorage 메서드 추가 (GCS REST API 사용)
- AiVoiceRecordingController에 download 메서드 추가 (스트림 응답)
- 다운로드 라우트 추가 (GET /{id}/download)
- 파일명은 제목 기반으로 생성, Content-Disposition 헤더 설정
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- AiTokenHelper: saveGcsStorageUsage(), saveSttUsage() 메서드 추가
- GoogleCloudService: uploadToStorage 반환값 배열로 변경 (uri + size)
- AiVoiceRecordingService: GCS/STT 각각 토큰 사용량 기록
- MeetingLogService: uploadToStorage 반환값 변경 대응
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Web Speech API로 녹음 중 실시간 텍스트 표시
- 인터뷰 카테고리/템플릿 선택 드롭다운 추가
- 녹음/파일업로드 시 interview_template_id 전달
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Canvas 기반 실시간 파형 시각화 (Web Audio API)
- 원형 녹음 버튼 (보라→빨강→녹색 상태 전환)
- 저장 진행률 오버레이 (프로그레스바 + 애니메이션)
- 카드형 목록 (호버 액션, 상태 아이콘)
- 탭 기반 상세 모달 (AI 분석 / 녹취록 원문)
- 파일 업로드 드래그&드롭 개선
- 검색/필터 UI 개선
- 전체 IIFE 스코프 격리
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- AiVoiceRecording 모델 (상태 상수, 접근자)
- AiVoiceRecordingService (GCS 업로드, STT, Gemini 분석 파이프라인)
- AiVoiceRecordingController (CRUD, 녹음 처리, 상태 폴링)
- React 블레이드 뷰 (녹음 UI, 파일 업로드, 목록, 상세 모달)
- 라우트 추가 (system/ai-voice-recording)
- 메뉴 시더에 AI 음성녹음 항목 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- AiTokenHelper 공통 헬퍼 생성 (Gemini/Claude 응답 파서)
- BizCertOcrService (Claude) 토큰 기록 추가
- BusinessCardOcrService (Gemini) 토큰 기록 추가
- MeetingLogService (Claude) 토큰 기록 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- AiTokenUsageController (index, list) 생성
- AiTokenUsage 모델 생성
- React 기반 토큰 사용량 조회 페이지 (필터, 통계, 페이지네이션)
- 라우트 추가 (system/ai-token-usage)
- AiTokenUsageMenuSeeder 메뉴 시더 생성
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>