?tab=payment 등 URL 파라미터로 직접 접속 시 로딩 스피너가
무한 표시되는 문제 수정. DOMContentLoaded에서 초기 탭의
HTMX 콘텐츠를 자동 로드하도록 변경.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- operation 상세 페이지 및 일괄 롤백 실행 기능 추가
- TriggerAuditLog에 scopeForOperation 스코프 추가
- 트리거 INSERT/UPDATE/DELETE에 operation_id 컬럼 포함
- 감사로그 목록에 작업 단위 링크 컬럼 추가
- 라우트: operation/{id}, batch-rollback 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 정산관리에 수당 지급 탭 추가 (파트너별 그룹핑 지급 대기 목록)
- 파트너별 상세 건 목록 HTMX 확장 기능
- 수당지급현황통계 페이지 (Chart.js 4개 차트 + 월별 요약 테이블)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 기존: balance 제외 4컬럼 매칭 → 같은 시간/금액의 다른 거래가 중복으로 처리됨
- 수정: balance 포함 5컬럼 매칭 → DB unique 제약조건과 동일하게 정확히 식별
- update 시 balance 제외 (매칭 조건이므로 변경 불필요)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SettlementController 신규 생성 (통합 정산관리 메인 + 탭별 HTMX)
- 5개 탭: 수당정산, 파트너별현황(NEW), 컨설팅비용, 고객사정산, 구독관리
- 수당정산 탭: 기존 영업수수료정산 이관 + 유치수당 컬럼/수당유형 필터 추가
- 파트너별 현황 탭: SalesPartner 수당 집계 + 필터/페이지네이션
- 컨설팅/고객사/구독 탭: React → Blade+Alpine.js 전환 (기존 API 재사용)
- 통합 통계카드 (미지급수당/승인대기/이번달예정/누적지급)
- 기존 4개 URL → 통합 페이지 리다이렉트
- SalesPartner 모델에 commissions 관계 추가
- SalesCommissionService에 commission_type 필터 + referrerPartner eager load 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
기존: 개발비 × 50% × 요율로 미리 반감 후 또 50% 분할 → 이중 반감 오류
수정: 개발비 × 요율(개인 20%, 단체 30%)로 계산, 1차/2차 분할은 별도 처리
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- User 모델에 isGroupPartner() 헬퍼 추가
- 대시보드에서 단체 파트너는 판매자 카드만 표시 (관리자/협업지원금 카드 제외)
- 유치 파트너 현황 탭 단체 파트너에게 숨김
- 파트너 등록 create/store 접근 차단 (403)
- 파트너 목록에서 등록 버튼 숨김
- SidebarMenuService에 hide_for_group_partner 옵션 기반 메뉴 필터링 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SalesPartner::isGroup()이 partner_type 기반으로 판별하도록 수정
- 대시보드 수수료율 표시: 개인 20%, 단체 30% 동적 반영
- 인수 수수료 계산: 개인 10%, 단체 15% 동적 반영
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 승인 전(pending): 라디오 버튼으로 개인/단체 변경 가능
- 승인 후(approved): 읽기 전용 뱃지로 표시
- 유형 변경 시 수당률 자동 설정 (단체 30%, 개인 초기화)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 빈 결과를 30분간 캐시하는 문제 수정 (성공 결과만 캐시)
- 건강 키워드가 없을 때 리프레이밍 폴백 추가 (트렌드를 건강 관점으로 재해석)
- 최종 폴백: 원본 인기 키워드 표시
- 프론트엔드 에러/안내 메시지 분리 (오류 vs 건강 키워드 없음)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- ScreenAnalysisService: Gemini 프롬프트에 UI 타입별 최소 크기 가이드라인 추가
- ScreenAnalysisService: normalizeCoordinates에 타입별 최소크기 보정 + 1.5% 패딩
- SlideAnnotationService: STEP 배지 1/2 축소 (300x76→150x38)
- SlideAnnotationService: 이중 테두리 (안쪽 흰색 + 바깥 빨간색) 적용
- SlideAnnotationService: 번호 마커 위치를 테두리 바깥으로 이동
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- TutorialVideoJob: 자막 생성 제거, subtitlePath에 null 전달
- TutorialAssemblyService: subtitlePath 파라미터 nullable 변경
- VideoAssemblyService: subtitlePath nullable + null일 때 ass 필터 생략
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Controller: analyzeScreenshots()를 try-catch로 감싸 JSON 에러 응답 보장
- Frontend: api() 함수에서 HTML 응답(504/502 등) 감지 → 친절한 한글 에러 메시지 표시
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- FFmpeg subtitles 필터 → ass 필터 변경 (ASS 스타일 Alignment 완전 보존)
- 인트로/아웃트로 씬 자막 제거를 이중 보장:
1. Job에서 자막용 scenes 복사본의 인트로/아웃트로 narration을 빈 문자열로 설정
2. generateAssSubtitle에서 scene_number int 캐스팅 + <= 1 비교로 안전장치 강화
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- disabled 속성 제거 (브라우저 기본 스타일이 Tailwind을 덮어씌움)
- 클릭 가드로 중복 클릭 방지 대체
- !important로 배경/글자색 강제 적용 (indigo-900/white)
- is-loading 클래스로 진행 중 상태 명확히 구분
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- XHR upload.onprogress로 파일 업로드 실시간 진행률 표시 (0~50%)
- AI 분석 단계 진행률 시뮬레이션 표시 (50~100%)
- 버튼 내부에 반투명 progress fill 애니메이션
- 단계별 텍스트 변경: "업로드 중... 30%" → "AI 분석 중... 75%"
- 업로드+분석을 ScreenshotUpload 내부에서 일괄 처리
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 10x10 그리드 오버레이를 스크린샷에 그려서 Gemini에 전송
(가로 0~9, 세로 A~J 라벨로 AI에게 시각적 참조점 제공)
- 좌표계를 0~1 소수 → 0~1000 정수로 변경 (AI 추정 정확도 향상)
- ERP 화면 기준 좌표 예시 추가 (사이드바, 헤더, 테이블 등)
- normalizeCoordinates()로 1000좌표 → 0~1 비율 자동 변환
- 범위 클램핑으로 비정상 좌표 방지
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
upload()이 gs://bucket/path 형식으로 저장하지만 getSignedUrl()과
delete()는 path만 기대하여 URL에 경로가 중복됨 → 404 발생
stripGsPrefix()로 자동 변환하여 해결
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- stale closure 버그 수정: useRef로 최신 files/previews 참조
- 이미지 추가 시 기존 preview URL 유지 (revoke 안 함) → 올바른 누적
- 드래그 앤 드롭 순서 변경 기능 추가
- + 버튼으로 추가 이미지 등록 UI 개선
- 파일 선택 후 input value 리셋 (같은 파일 재선택 가능)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- ScreenAnalysisService: Gemini 프롬프트를 멀티스텝(3~5 steps) 출력으로 변경 + 하위 호환 fallback
- SlideAnnotationService: 스포트라이트 효과(annotateSlideWithSpotlight), 인트로/아웃트로 슬라이드 생성
- TutorialVideoJob: screen→steps 중첩 루프 + 인트로/아웃트로 씬 추가
- index.blade.php: 단계별 나레이션 편집 UI + 예상 시간 표시
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
preview에서 GCS redirect 대신 서명URL을 JSON 반환(?url=1)하여
video 태그에서 직접 사용. storage.googleapis.com→mng.sam.kr
favicon CORS 차단 문제 해결.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- TutorialVideo 모델 (상태 관리, TenantScope)
- GeminiScriptService에 callGeminiWithParts() 멀티모달 지원 추가
- ScreenAnalysisService: Gemini Vision 스크린샷 AI 분석
- SlideAnnotationService: PHP GD 이미지 어노테이션 (마커, 캡션)
- TutorialAssemblyService: FFmpeg 이미지→영상 합성 (crossfade)
- TutorialVideoJob: 분석→슬라이드→TTS→BGM→합성 파이프라인
- TutorialVideoController: 업로드/분석/생성/상태/다운로드/이력 API
- React-in-Blade UI: 3단계 (업로드→분석확인→생성모니터링) + 이력
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 와이어프레임 헤더 텍스트 너비 확장 (w:2 → w:6.4, 줄바꿈 방지)
- 긴 프로젝트명 자동 폰트 축소 (15자 초과 시 8pt)
- 모든 요소 좌표 재배치 (max x+w ≤ 6.8, 영역 초과 해소)
- 수직 공간 균등 배분 (y:1.35~5.1 전체 활용)
- Description 항목 간격 동적 계산 (항목수 기반)
- 생성 이력 테이블에 4행 + 하단 액션 버튼 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 스크린샷 → Gemini 분석 → 주석 슬라이드 → TTS 나레이션 → FFmpeg 합성
- 기존 Google API Key + TTS/BGM 서비스 재사용
- 4단계 로드맵 (MVP 2주 → PPTX → 고급기능 → 자동화)
- 영상당 비용 ~$0.07 (Veo 미사용)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. 자막 싱크: ffprobe로 실제 TTS 오디오 길이 측정 → 자막 타이밍 반영
- 기존: 장면 길이 * 0.75 추정 → 음성과 자막 불일치
- 변경: 실제 나레이션 오디오 길이 기반 문장별 타이밍 계산
2. 나레이션 밀도: 장면당 40~70자 → 60~100자 (빈 시간 없이 채움)
3. BGM 볼륨: 0.4 → 1.2 (안 들리던 문제 해결)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>