- bankTransactions()를 barobill_bank_transactions 테이블 직접 조회로 변경
- EaccountController 의존성 제거
- 계좌 목록을 DB distinct 조회로 제공 (별도 API 불필요)
- 프론트엔드 계좌 드롭다운 필드명 수정 (camelCase → snake_case)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 프론트엔드: 전표목록 테이블에서 상태 컬럼/필터/통계 제거
- 프론트엔드: 임시저장/확정 stat cards를 차변합계/대변합계로 교체
- 백엔드: store(), storeFromBank() 기본 status를 draft→confirmed 변경
- 백엔드: index() 통계에서 draftCount/confirmedCount 제거
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 3탭 구조로 전면 재작성 (은행거래분개, 수동전표, 전표목록)
- JournalEntryController에 bankTransactions, storeFromBank, bankJournals, deleteBankJournal API 추가
- JournalEntry 모델에 source_type, source_key fillable 및 헬퍼 메서드 추가
- 은행거래 목록에서 분개 모달로 복식부기 전표 생성
- 입금/출금에 따라 보통예금(103) 자동 세팅
- 분개 완료/미분개 상태 표시 및 필터링
- 기존 수동전표, 전표목록 기능 그대로 유지
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
수동 거래의 balance는 화면에서 재계산된 값이므로 DB 원본값과 다름.
save()에서 처리하면 잘못된 레코드 매칭 또는 unique key 충돌 발생.
수동 거래는 updateManual()에서만 처리하도록 스킵.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
수동 거래의 balance는 화면에서 재계산(recalcManualBalances)되어 표시되므로
DB의 원본값과 다름. 프론트에서 재계산된 balance를 보내면 다른 레코드와
unique key 충돌 발생. 수정 시 적요/예금주명 등 비-키 필드만 업데이트.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
수동 거래 수정 시 Eloquent가 deposit/withdraw/balance를
dirty로 오감지 (DB "515900.00" vs validation 515900 비교).
DB::table()로 변경하여 지정 필드만 정확히 업데이트.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Eloquent 모델의 decimal cast + opcache 캐시 문제로 인해
deposit/withdraw/balance가 dirty 감지되어 unique 제약조건 위반.
- Eloquent 완전 우회: DB::table() 기반 lookup + update + insert
- CAST(AS SIGNED) 제거: 정확한 decimal 비교로 변경
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Eloquent decimal:2 cast가 deposit/withdraw/balance를 dirty로
잘못 감지하여 update 시 unique 제약조건 위반 발생.
모든 사용처에서 이미 (int)/(float) 명시 변환하므로 cast 불필요.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Eloquent 모델의 decimal:2 cast가 balance를 dirty로 잘못 감지하여
UPDATE 시 balance가 포함되면서 unique 제약조건 위반 발생.
Query Builder(DB::table)로 변경하여 지정 필드만 업데이트.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
인라인 편집으로 cast 저장 시 override 테이블의 modified_cast가
메인 테이블 값보다 우선하여 이전 값이 표시되는 문제.
save() 후 override의 modified_cast를 동기화(제거)하여 충돌 방지.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
녹음 중지 시 오디오 업로드 → 자동 화자 분리(Google Cloud STT)
→ 자동 AI 요약 순서로 진행하도록 변경
기존에는 수동으로 "화자 분리" 버튼을 눌러야 했음
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
last_transaction_at이 null일 때 eager load된 최신 거래내역의
transaction_date + transaction_time을 fallback으로 표시
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- TradingPartnerOcrService 신규 생성 (Gemini Vision API 사업자등록증 OCR)
- TradingPartnerController에 ocr() 메서드 추가
- partners 라우트 그룹에 OCR 엔드포인트 추가
- 거래처 등록 모달에 이미지 드래그앤드롭 업로드 UI 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
수동으로 '요약 실행' 클릭 시 로컬 세그먼트가 서버에 저장되지 않아
full_transcript가 비어있어 '요약할 텍스트가 없습니다' 에러 발생.
요약 API 호출 전에 로컬 세그먼트를 먼저 서버에 저장하도록 수정.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
서버에서 @vite() 사용 시 manifest.json이 없어 500 에러 발생.
.gitignore에서 public/build/ 제외하고 빌드 결과물을 커밋하여 서버 배포.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
계좌 입출금내역과 동일한 문제: balance 없이 중복 제거하면
같은 출금금액의 서로 다른 거래가 하나로 합쳐지는 문제 수정.
BankTransaction 모델의 unique_key 속성(balance 포함)을 재사용.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
같은 출금금액이라도 잔액(balance)이 다르면 별도 거래로 인식하도록 개선.
기존에는 balance 없이 매칭하여 김종성/곽형석 등 다른 거래가 같은 키로 인식되는 문제 수정.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- GoogleCloudService에 speechToTextWithDiarization 메서드 추가
- Google STT V1 diarizationConfig 활성화로 자동 화자 구분
- MeetingMinuteService에 processDiarization 메서드 추가
- POST /{id}/diarize 엔드포인트 및 라우트 추가
- 프론트엔드에 '화자 분리' 버튼 추가 (RecordingControlBar)
- saveSegments 컨트롤러에 try-catch 에러 핸들링 추가
- 빈 텍스트 세그먼트 필터링 로직 추가 (서버/클라이언트 양쪽)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- MeetingMinute/MeetingMinuteSegment 모델
- MeetingMinuteService (CRUD, GCS 업로드, Gemini AI 요약)
- MeetingMinuteController (11개 엔드포인트)
- React SPA Blade 뷰 (대화기록/스크립트 탭, AI 요약 사이드패널)
- Web Speech API 실시간 STT + 수동 화자 전환 + MediaRecorder 녹음
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- onresult에서 event.resultIndex부터 순회 (중복 처리 방지)
- finalizedSegments[] 배열로 확정 텍스트 영구 관리
- 다크 프리뷰 패널(bg-gray-900)로 UI 통일
- 확정=흰색 일반체, 미확정=회색 이탤릭 스타일 적용
- 고정 line-height(1.6)으로 텍스트 전환 시 흔들림 방지
- 인식 중/완료 상태 표시 추가
- 공사현장 사진대지 VoiceInputButton과 동일 규칙 적용
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 모달에서 사진 업로드/삭제/수정 시 배경 리스트 fetchList() 제거
- modalDirtyRef로 변경 여부 추적
- 모달 닫힐 때만 dirty 상태면 리스트 한 번 갱신
- 카드 많을 때 불필요한 리렌더링으로 인한 성능 저하 방지
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- interim 텍스트: italic + gray (수정 가능)
- final 텍스트: normal weight + solid color (영구 저장, 삭제 불가)
- finalizedSegments 배열로 확정 텍스트 누적 관리
- 고정 line-height(1.6)으로 부드러운 전환
- 녹음 종료 후 2초 dismiss 타이머
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 말풍선 max-w 확대 + 줄바꿈 허용 (truncate 제거)
- final 결과 시 녹색 말풍선으로 1.2초 유지 후 페이드
- interim→final 전환 시 깜빡임 없이 자연스럽게 연결
- 인식 중 노란 점 애니메이션, 확정 시 체크 아이콘
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>