운영 배포: 전자계약 도장 기본값, 아카데미 Git 관리도구, 명함신청, 미수금/미지급금 이월잔액 #1
Reference in New Issue
Block a user
No description provided.
Delete Branch "develop"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
주요 변경사항
- User 모델: tenants() belongsToMany 관계 추가 - UserService: whereHas('tenants') pivot 필터링으로 변경 - 사용자 생성 시 user_tenants pivot 처리 - tenant_id 컬럼 참조 제거 (다대다 관계)- 페이지네이션 로직을 별도 JS 파일로 분리 (public/js/pagination.js) * 쿠키 기반 per_page 값 저장 및 유지 * 페이지네이션 이벤트 핸들러 통합 * 중복 코드 제거 - 페이지네이션 UI 개선 * 처음으로/끝으로 이동 버튼 추가 * selectbox 너비 조정 (90px) * 서버사이드 selected 속성으로 옵션 매칭 개선 - 초기 페이지당 항목 수를 10개로 변경 * TenantController, UserController, DepartmentController, RoleController 기본값 수정 - layouts/app.blade.php * pagination.js 로드 추가 * 기존 인라인 스크립트 제거 변경 파일: - public/js/pagination.js (신규) - resources/views/layouts/app.blade.php - resources/views/partials/pagination.blade.php - app/Http/Controllers/Api/Admin/{Tenant,User,Department,Role}Controller.php- VariableBinder: 변수 바인딩 엔진 ({{...}} 패턴 처리) - DependencyResolver: 의존성 정렬 (Topological Sort) - ResponseValidator: HTTP 응답 검증 (JSONPath, 연산자) - HttpClient: Laravel HTTP Client 래퍼 - FlowExecutor: 플로우 실행 엔진FlowExecutor 개선: - 의존성 스텝 실패 시 후속 스텝 자동 스킵 로직 추가 - Docker 환경 자동 감지 및 내부 URL 변환 (api.sam.kr → nginx) - SSL 검증 비활성화 및 Host 헤더 설정 지원 - .env에서 API Key/Bearer Token 자동 주입 VariableBinder 개선: - 임의 stepId 패턴 지원 (page_create_1.tempPageId 등) - {{$env.VAR_NAME}} 환경변수 플레이스홀더 추가 - {{$auth.token}}, {{$auth.apiKey}} 인증 플레이스홀더 추가 UI 개선: - SKIPPED 상태 스타일링 (노란색 배경/테두리) - 행 클릭 시 스텝 상세 확장 기능 - 실행 결과 실시간 표시 개선- VariableBinder에 Laravel Faker 기반 랜덤 데이터 생성 기능 추가 - {{$faker.name}}, {{$faker.email}}, {{$faker.phone}} 등 텍스트 생성 - {{$faker.number:MIN:MAX}}, {{$faker.price:MIN:MAX}} 숫자/가격 생성 - {{$faker.itemCode:PREFIX}}, {{$faker.code:PREFIX:LENGTH}} 코드 생성 - {{$faker.productName}}, {{$faker.unit}}, {{$faker.category}} 품목 관련 - 가이드 모달에 Faker 변수 문서 추가 - 품목관리 API 테스트 예제 3개 추가 - items-crud: Faker 기반 CRUD 테스트 (6단계) - items-search: 검색/통계 API 테스트 (5단계) - items-bom: BOM 관리 테스트 (8단계)주요 기능: - 일일 로그 CRUD (생성, 조회, 수정, 삭제, 복원, 영구삭제) - 로그 항목(Entry) 관리 (추가, 상태변경, 삭제, 순서변경) - 주간 타임라인 (최근 7일 진행률 표시) - 테이블 리스트 아코디언 상세보기 - 담당자 자동완성 (일반 사용자는 슈퍼관리자 목록 제외) - HTMX 기반 동적 테이블 로딩 및 필터링 - Soft Delete 지원 파일 추가: - Models: AdminPmDailyLog, AdminPmDailyLogEntry - Controllers: DailyLogController (Web, API) - Service: DailyLogService - Requests: StoreDailyLogRequest, UpdateDailyLogRequest - Views: index, show, table partial, modal-form partial 라우트 추가: - Web: /daily-logs, /daily-logs/today, /daily-logs/{id} - API: /api/admin/daily-logs/* (CRUD + 항목관리)- getAvailableGlobalMenus(): GlobalMenu 모델 사용 - copyFromGlobal(): GlobalMenu 모델 사용 - Menu::whereNull('tenant_id') → GlobalMenu::query()로 변경- VariableBinder: setVariables()에서 {{$env.XXX}} 환경변수 치환 지원 - FlowExecutor: 스텝 실행 결과에 reason, description, expect 필드 추가 - buildResultReason(): 성공/실패 이유 자동 생성 - 부정 테스트(400, 404 등) 시 예상대로 반환됨을 명시 - 400: 유효성 검증 실패 확인 - 404: 리소스 미존재 확인 - 409: 충돌 상태 확인 - 403: 권한 거부 확인 - run-detail.blade.php: 예상 상태코드, 이유, 스텝 설명 표시 UI- ApiLogCapturer 추가: 플로우 실행 중 API 로그 캡처 - resolveBaseUrl() 추가: .env 환경변수 기반 baseUrl 지원 - 실행 상세 페이지: 스텝별 접기/펼치기 기능 (성공=접힘, 실패=펼침) - JSON 가이드 및 예제 플로우 최신화 - AI 프롬프트 템플릿 업데이트 - bindExpectVariables() 추가: expect jsonPath 값에 변수 바인딩 적용 - areNumericEqual() 추가: 숫자 타입 유연 비교 ("2" == 2)- ImportService에 importIssuesToTask 메서드 추가 - ImportController에 importIssues 액션 추가 - ImportIssuesRequest FormRequest 생성 - POST /api/admin/pm/import/task/{taskId}/issues 라우트 추가 - import.blade.php UI에 '기존 작업에 이슈 추가' 모드 추가 - ImportProjectRequest에 tasks 레벨 검증 규칙 보완- forceDeleteMenu: 연관 권한(menu:{id}.*) 함께 삭제 - forceDeleteGlobalMenu: 연관 권한 삭제 + 테넌트 메뉴 참조 해제 - 삭제 전 권한/역할 연결 정보를 archived_records에 저장 - Controller 반환값에 삭제된 권한 정보 포함## 주요 변경사항 - BizCertController: 내부 API (OCR, CRUD) - BizCertOcrService: Claude Vision API 연동, Tesseract.js 지원 - BizCert 모델 및 FormRequest 추가 - config/services.php에 Claude API 설정 추가 ## 프론트엔드 - business-ocr.blade.php: layouts.app 레이아웃 적용 - JS/AI 토글 모드 (Tesseract.js / Claude Vision) - 이미지 전처리 추가 (그레이스케일, 대비 강화, 이진화) - SweetAlert2 연동 (토스트, 삭제 확인) ## API 엔드포인트 - POST /api/biz-cert/ocr - OCR 처리 - GET /api/biz-cert - 목록 조회 - POST /api/biz-cert - 저장 - DELETE /api/biz-cert/{id} - 삭제 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>## 주요 변경사항 ### 1. 시스템 필드 정의 DB 마이그레이션 - 기존 하드코딩된 Constants/SystemFieldDefinitions.php 제거 - 신규 Models/SystemFieldDefinition.php 모델 추가 - system_field_definitions 테이블 기반 동적 관리 ### 2. 테이블 등록 시 자동 필드 생성 - DB 실제 테이블 목록에서 선택하여 등록 - MySQL INFORMATION_SCHEMA에서 컬럼 정보 자동 조회 - COLUMN_COMMENT를 필드명(한글)으로 사용 - IS_NULLABLE로 필수 여부 자동 설정 - 시스템 컬럼(id, tenant_id, timestamps 등) 자동 제외 ### 3. 필드명 동기화 기능 - 기존 등록된 테이블의 필드명을 DB COMMENT로 업데이트 - POST /source-tables/{table}/sync-field-names API 추가 ### 4. 시딩 상태 계산 수정 - getFieldCountFor(): is_seed_default=true인 필드만 카운트 - getTotalFieldCountFor(): 전체 활성 필드 카운트 (신규) - "제외" 필드가 있어도 시딩 완료 상태 정상 표시 ### 5. UI 개선 - 시스템 필드 정의 탭에서 테이블별 관리 - 테이블 헤더에 "필드명 동기화", "삭제" 버튼 추가 - 테이블 선택 모달에서 COMMENT(한글명) 표시 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- currentTenantId() → session('selected_tenant_id') 변경 - Google Cloud 인증파일 .gitignore 추가- VariableBinder: {{$session.xxx}} 변수 지원 추가 - {{$session.token}}: 세션 Bearer 토큰 - {{$session.user_id}}: 세션 사용자 ID - {{$session.user.email/name}}: 사용자 정보 - {{$session.tenant_id}}: 테넌트 ID - getSessionAuth() 메서드 추가 - FlowExecutor: useSessionAuth 옵션 처리 - login 스텝에서 API 호출 대신 세션 토큰 사용 - {{login.token}} 등 자동 바인딩 - 세션 토큰 없을 시 명확한 에러 메시지 페이지 인증 완료 시 플로우의 login 스텝에서 실제 API 호출 없이 세션 인증 정보를 활용할 수 있음 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>## 인증 모달 통합 - api-explorer, flow-tester, api-logs 3개 페이지의 인증 UI 통합 - 공유 컴포넌트 생성: auth-modal.blade.php, auth-scripts.blade.php - sessionStorage 기반으로 페이지 간 인증 상태 공유 - DevToolsAuth 글로벌 JavaScript API 제공 ## 테넌트 사용자 조회 개선 - 시스템 헤더에서 선택한 테넌트의 사용자 목록 표시 - 관리자가 모든 테넌트의 사용자 조회 가능 (소속 무관) - session('selected_tenant_id')로 Tenant 모델 직접 조회 - 테넌트 미선택 시 안내 메시지 표시 ## 버그 수정 - /users 페이지 HTMX swap 오류 수정 (JSON→HTML 직접 반환) - 사용자 이름 JavaScript 이스케이프 처리 (@js() 사용) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- /customer-center/{code} → /boards/{id}/posts 리다이렉트 - 시스템 게시판(tenant_id=null) + 활성화된 게시판만 대상 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>## 주요 변경사항 ### 게시판-메뉴 자동 연동 - 게시판 생성 시 메뉴 자동 생성 (BoardService.createBoardFromTemplate) - 게시판 삭제 시 연결 메뉴 함께 삭제 (Soft Delete 연동) - 게시판 복원 시 메뉴 재생성 - 게시판 영구삭제 시 메뉴 영구삭제 ### 게시판 메뉴 보호 - MenuService: 게시판 연동 메뉴 수동 수정/삭제 방지 - isBoardMenuUrl(), isBoardMenu(), validateNotBoardUrl() 헬퍼 추가 - 8개 CRUD 메서드에 검증 로직 적용 ### URL 패턴 변경 - 시스템 게시판: /system-boards/{code} → /customer-center/{code} - 테넌트 게시판: /boards/{code} (변경 없음) ### UI 개선 - 메뉴 목록에서 게시판 메뉴 "📋 게시판" 뱃지 표시 - 게시판 메뉴는 수정/삭제 버튼 숨김 (활성/숨김 토글만 허용) - 삭제된 게시판 행 클릭 시 404 오류 수정 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- Tenant::where('is_active', true) → Tenant::active() - tenants 테이블에 is_active 컬럼이 없어 발생한 SQL 오류 수정 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- 테넌트 게시판 부모 메뉴 우선순위 변경: /boards → /customer-center - 테넌트 게시판 리다이렉트 라우트 추가: /boards/{code} → /boards/{id}/posts 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- api-logs: let→var 변경으로 스크립트 재실행 오류 해결 - api-explorer: @push('styles')→content 내 style로 hx-boost 호환 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>## 슈퍼관리자 삭제 게시물 관리 - 삭제된 게시물 목록에 표시 (빨간색 배경, 취소선) - 게시물 복원 기능 추가 (POST /{post}/restore) - 게시물 영구삭제 기능 추가 (DELETE /{post}/force) - 통계 카드에 삭제됨 카운트 추가 ## 페이지 타이틀 회사명 표시 - /boards: "회사명 게시판 관리" 형식으로 표시 - /boards/{code}/posts: "회사명 게시판명" 형식으로 표시 - 회사명 파란색으로 구분 표시 ## 버그 수정 - 통계 카드 CSS: Tailwind 동적 클래스 문제 해결 (grid-cols-{{ }} → 정적 클래스로 변경) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- GuideModal, ExampleFlows, ExamplesModal 변수를 const에서 window 패턴으로 변경 - htmx가 콘텐츠를 다시 로드할 때 'Identifier has already been declared' 에러 방지 - window.XXX = window.XXX || {} 패턴으로 중복 선언 방지 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>HTMX 요청 시 HX-Redirect 헤더로 전체 페이지 리로드하여 @push('scripts') 블록의 스크립트가 정상 로드되도록 수정 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- React JSX 내부의 Blade 코드가 Tailwind 클래스와 충돌하는 문제 해결 - 테넌트 정보 카드를 @section('content') 내 Blade 코드로 이동 - className → class로 변경하여 정상 렌더링 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- style={{ }} 구문이 Blade {{ }}로 해석되는 문제 - style={ {} } 형식으로 변경하여 Blade 파싱 우회 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- style={{ }} 대신 Tailwind 클래스 min-w-[70px] 사용 - Blade의 {{ }} 해석 문제 해결 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- ApprovalType을 문자열로 캐스팅하여 비교 - 숫자(1)와 문자열('1') 비교 불일치 문제 해결 - 디버깅용 로그 추가 (첫 번째 로그의 ApprovalType 값 확인) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- 빈값(''), '0', '1' 모두 승인으로 처리 - '2'만 취소로 처리 - 통계 및 표시 모두 동일한 isApproval 변수 사용 - 디버깅 로그에 amount 추가 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- style={{ }} JSX 구문을 Tailwind 클래스로 변경 - max-h-[500px] overflow-y-auto 사용 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- 버튼에 type="button" 추가 (폼 제출 방지) - 스크립트를 @push('scripts')로 이동 (중복 정의 방지) - 디버깅 로그 추가 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- @push('scripts') 대신 인라인 x-data로 변경 (HTMX 호환) - x-collapse 플러그인 의존성 제거, x-transition 사용 - $parent 참조 대신 window 이벤트(CustomEvent) 사용 - 체크리스트 토글, 진행률 업데이트, 단계 이동 정상화 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- SalesTenantManagement, SalesScenarioChecklist에 tenant_prospect_id 지원 추가 - 가망고객 기반 시나리오 컨트롤러 메서드 추가 - 라우트 추가: /sales/scenarios/prospect/{id}/sales, manager - 대시보드에서 가망고객 행에 영업/매니저 버튼 및 진행률 표시 - 시나리오 모달/스텝 뷰 prospect 모드 지원 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- revertToPending 서비스 메서드 추가 - revertToPending 컨트롤러 액션 추가 - /approvals/{id}/revert-pending 라우트 추가 - progress-list에 "승인대기로" 버튼 추가 - JavaScript revertToPending 함수 추가 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- 성적서 인쇄뷰(print.blade.php) 추가: 동적 검사 테이블 렌더링 - DocumentController: print() 메서드, create/edit HTMX HX-Redirect 추가 - 기본필드 field_key: Str::slug→bf_{id} (한글 빈문자열 버그 수정) - show.blade.php: 성적서 버튼 추가 - 양식 편집 UI 개선 + 복제 기능 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- 검사기준서 테이블 7컬럼→9컬럼 (공차/범위, 검사방식, 측정유형) - 검사방식 select: common_codes inspection_method 그룹에서 동적 로드 - 검사방식 변경 시 측정유형 자동매핑 (수동 변경 가능) - saveRelations, duplicate, prepareTemplateData에 새 필드 반영 - 공통코드 JSON API 엔드포인트 추가 (/api/admin/common-codes/{group}) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- {{ }} → @{{ }} 로 Blade 이스케이프 처리 - tableLayout, width 스타일이 React로 정상 전달되도록 수정 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- colgroup을 사용한 명시적 컬럼 너비 지정 방법 - Blade에서 React 스타일 객체 이스케이프 (@{{ }}) - 입력 테이블 권장 컬럼 비율 가이드 (품목명 30%, 수량 60px 등) - 전체 예제 코드 포함 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- 가망고객 행을 별도 partial(prospect-row.blade.php)로 분리 - 매니저 드롭다운에서 선택 시 HTMX로 해당 행만 새로고침 - 컨트롤러에 getProspectRow 메서드 추가 - 라우트 추가: salesmanagement/dashboard/prospect/{id}/row 이제 매니저 지정 후 새로고침 없이 화면이 동적으로 업데이트됩니다. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>HX-Redirect 처리 추가로 전체 페이지 리로드하여 @push('scripts') 정상 실행 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- /year/{year} 라우트를 /{id} 보다 먼저 배치 - Laravel 라우트 매칭 우선순위 문제 해결 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>- DELETE /year/{year} → POST /destroy-year 변경 - JavaScript fetch도 POST + JSON body 방식으로 변경 Co-Authored-By: Claude Opus 4.5 <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>Auth::user()->tenant_id → session('selected_tenant_id') 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>- DocumentTemplateController::index()에 HX-Request 체크 및 HX-Redirect 응답 추가 - 사이드메뉴 HTMX 클릭 시 @push('scripts') 미실행 문제 해결 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>- 새 파일: resources/views/partials/react-cdn.blade.php - 모든 React 페이지에서 중복된 CDN 스크립트를 @include('partials.react-cdn')로 대체 - 30개 파일 업데이트 (finance, juil, system, sales) - 유지보수성 향상: CDN 버전 변경 시 한 곳만 수정detail.blade.php에서 호출하는 remind 엔드포인트가 누락되어 있었음. POST /esign/contracts/{id}/remind 라우트 추가, EsignApiController::remind() 메서드 구현 (상태 변경 + 감사 로그). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>기존: 브라우저 → 외부 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>- sign.blade.php: style={{}} → STYLES 상수로 Blade {{ }} 파싱 충돌 해결 - sign.blade.php, done.blade.php: 외부 API 호출 → MNG 내부 엔드포인트로 변경 - EsignPublicController: submitSignature, rejectContract, downloadDocument 추가 - routes/web.php: submit, reject, document API 라우트 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>주석의 {{ }} 텍스트를 Blade가 PHP 코드로 해석하여 ParseError 발생 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>- create: 템플릿 선택 시 PDF required 제거, 안내 메시지 표시 - fields: PDF 없는 계약 시 업로드 UI 표시 - API: uploadPdf 엔드포인트 추가 (POST /{id}/upload-pdf) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>- show/edit 뷰에서 bf_{id} 조회 실패 시 bf_{label} 레거시 호환 추가 - 기존 bf_납품명 형식으로 저장된 문서도 정상 표시 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>- SignaturePad backgroundColor를 rgba(0,0,0,0)으로 변경 (투명) - 캔버스 CSS background는 #fff 유지 (시각적 흰색 배경) - toDataURL('image/png')로 투명 배경 서명 이미지 저장 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>- whereHas('salesPartner') → whereHas('userRoles') + role.name='sales' - 현재 테넌트의 sales 역할을 가진 활성 사용자만 검색 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>- 'sales'는 enum('individual','corporate')에 없는 값이라 DB 저장 실패 - create/update 모두 'individual'로 변경 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>- GET /v1/{operationName} → POST fetchPredictOperation 변경 - 응답 구조 predictions → response.videos 수정 - 연속 5회 HTTP 에러 시 조기 중단 로직 추가 - 30초 간격 대기 로그 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>- DB 레코드만 삭제하던 것을 storage/app/video_gen/{id}/ 디렉토리도 삭제 - 클립, 나레이션, BGM, 최종 영상 등 모든 작업 파일 정리 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>- TutorialVideoController에 detail/{id} 엔드포인트 추가 (analysis_data 반환) - HistoryTable에 새로고침 버튼 추가 (스피너 애니메이션) - 행 클릭 시 스크립트 상세정보 (화면별 단계, 나레이션, 소요시간) 펼침 표시 - 상세 데이터는 캐시하여 재클릭 시 재요청 없음 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>- TutorialVideoJob, VideoGenerationJob에 onQueue('mng') 지정 - API 워커가 MNG Job을 가져가 __PHP_Incomplete_Class 에러 발생 방지- FormulaApiService의 Bearer token 조회를 session('api_explorer_token')에서 ApiTokenService 기반으로 변경 - resolveApiToken() 메서드 추가: 세션 토큰 확인 → 만료시 HMAC 토큰 교환 - DocumentTemplateApiController와 동일한 인증 패턴 적용 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>- NotionService: AiConfig::getActiveNotion() → config('services.notion') - config/services.php에 notion 섹션 추가 - .env에 NOTION_API_KEY, NOTION_VERSION 추가- AiConfig::getActiveGemini() → config('services.gemini') 기반 - AiConfig::getActiveGcs() → config('services.google') 기반 - AiConfig::getActiveClaude() → config('services.claude') 기반 - AiConfig::getActiveNotion() → config('services.notion') 기반 - GoogleCloudStorageService: DB 우선 로직 제거, .env만 사용 - 8개 서비스 파일은 수정 없이 동작 (AiConfig 인터페이스 유지)- tenant disk root: /var/www/shared-storage/tenants → storage_path('app/tenants') - symlink 경로도 동일하게 변경 - react git pull 시 shared-storage 삭제 문제 해결- style={{height:...}} 구문이 Blade에 의해 PHP로 해석되는 문제 - script 블록에 @verbatim 추가하여 Blade 해석 방지- style={{width:'60px'}} → Tailwind 클래스(w-16, w-36, w-10)로 교체 - Blade의 {{ }} echo 문법과 JSX inline style 충돌 해소- 모델: BusinessCardRequest (pending/processed 상태 관리) - 서비스: 신청/처리/통계/뱃지 카운트 - 컨트롤러: 관리자 2분할 뷰, 파트너 신청폼+이력 - 뷰: admin-index (대기/처리완료 2분할), partner-index (신청폼+이력) - 라우트: GET/POST /sales/business-cards, POST /{id}/process - 뱃지: ViewServiceProvider에 대기 건수 연동- 모델: STATUS_ORDERED 추가, markAsOrdered() 헬퍼 - 서비스: order(), getOrderedRequests() 추가 - 컨트롤러: order() 액션 추가 - 관리자 뷰: 좌측 신규요청 + 우측 제작중 + 하단 처리완료 - 파트너 뷰: 제작중(파란) 상태 뱃지 추가 - 라우트: POST business-cards/{id}/order 추가Pull request closed