운영 배포: 전자계약 도장 기본값, 아카데미 Git 관리도구, 명함신청, 미수금/미지급금 이월잔액 #1

Closed
light wants to merge 1742 commits from develop into master
Owner

주요 변경사항

  • fix: [esign] 서명 방법 기본값을 도장으로 변경
  • feat: [academy] Git 관리도구 페이지 추가
  • feat: [academy] Docker 명령어 페이지 추가
  • feat: [business-card] 명함신청 기능 구현 (3단계 워크플로우)
  • feat: [receivables] 미수금 이월잔액 반영
  • fix: [payables] 미지급금관리 이월잔액 반영
  • feat: [ecard] 분리 데이터 기반 분개 자동 생성
  • fix: [esign] 알림톡 URL 및 로깅 개선
## 주요 변경사항 - fix: [esign] 서명 방법 기본값을 도장으로 변경 - feat: [academy] Git 관리도구 페이지 추가 - feat: [academy] Docker 명령어 페이지 추가 - feat: [business-card] 명함신청 기능 구현 (3단계 워크플로우) - feat: [receivables] 미수금 이월잔액 반영 - fix: [payables] 미지급금관리 이월잔액 반영 - feat: [ecard] 분리 데이터 기반 분개 자동 생성 - fix: [esign] 알림톡 URL 및 로깅 개선
light added 1742 commits 2026-02-25 14:33:46 +09:00
- Tenant 모델 생성 (SoftDeletes, active scope)
- TenantController 전환 컨트롤러
- ViewServiceProvider로 모든 뷰에 테넌트 데이터 자동 제공
- partials/tenant-selector.blade.php UI 컴포넌트

기능:
- 드롭다운으로 테넌트 전환 (전체 보기 포함)
- Session 기반 선택 상태 저장
- 우측에 현재 테넌트 정보 표시
- 모든 페이지에서 @include로 사용 가능

이슈 해결:
- is_active 컬럼 없음 → tenant_st_code + deleted_at 사용
- 삭제되지 않은 모든 테넌트 표시 (7개)
- TenantService 생성 (CRUD, 통계, 복원/영구삭제)
- API Controller 구현 (HTMX 요청 감지, HTML/JSON 이중 응답)
- FormRequest 검증 (StoreTenantRequest, UpdateTenantRequest)
- Tenant 모델 확장 (17개 필드, 관계 설정, accessor)
- Department, Menu, Role 모델 복사 (admin → mng)
- Web Controller 수정 (index/create/edit 화면)
- MIGRATION_PLAN.md 작성 (HTMX + API 아키텍처)
- 라우트 등록 (web.php: Blade 화면, api.php: HTMX API)
- Blade 뷰 생성 (index, create, edit)
- Partial 템플릿 생성 (table with pagination)
- HTMX 통합 (비동기 CRUD, 필터링, 페이지네이션)
- Pure Tailwind CSS 스타일링
- 실시간 검색 및 상태 필터
- 삭제/복원 기능 구현
- ViewServiceProvider: App\Models\Tenant → App\Models\Tenants\Tenant
- User 모델에 tenant() 관계 추가
주요 변경사항:
- Spatie Laravel Permission 패키지 설치 (v6.23.0)
- admin 프로젝트에서 필수 Traits 및 Scopes 복사
  - ModelTrait, BelongsToTenant, HasTenantFilter, UppercaseAttributes
  - TenantScope
- Tenant 모델 관계 수정 (hasMany → belongsToMany via user_tenants)
- Tenant 모델 null 처리 추가 (status_label, created_at)
- Laravel 12 bootstrap/app.php에 API 라우트 등록
- API 라우트 미들웨어 수정 (auth:sanctum → web,auth)
- HTMX 라이브러리 및 CSRF 토큰 헤더 추가

ViewServiceProvider 수정:
- 전역 View Composer의 $tenants 변수를 $globalTenants로 변경
- 페이지별 페이지네이션된 $tenants 변수와의 충돌 방지
- tenant-selector.blade.php에서 $globalTenants 사용

버그 수정:
- Collection::hasPages() 오류 해결 (ViewComposer 변수 덮어쓰기 문제)
- 테넌트 목록 무한 로딩 스피너 해결
- 500 Internal Server Error 해결
주요 수정사항:
- UpdateTenantRequest: 라우트 파라미터 수정 (tenant → id)
- TenantService: 영구 삭제 시 관련 데이터 먼저 삭제 (FK 제약 해결)
- edit.blade.php: HTMX URL 전체 경로 사용 + 폼 fallback 추가
- index.blade.php: CSRF 토큰 추가 (삭제, 복원, 영구삭제)

버그 수정:
- 수정 시 302 리다이렉트 오류 해결 (code 유일성 검증 실패)
- 삭제 시 419 CSRF 토큰 오류 해결
- 영구 삭제 시 500 FK 제약 오류 해결
테넌트 관리 개발 중 발생한 주요 오류와 해결 방법 문서화:
- HTMX 관련 오류 (URL 라우팅, CSRF, ViewComposer 충돌)
- FormRequest 유효성 검증 오류
- 데이터베이스 외래키 제약 오류

디버깅 팁 및 예방 체크리스트 포함
- RoleService, RoleController (Blade/API) 생성
- 역할 CRUD 기능 완성 (목록/생성/수정/삭제)
- FormRequest 검증 (StoreRoleRequest, UpdateRoleRequest)
- HTMX 패턴 적용 (index, create, edit)
- 권한 선택 UI (체크박스, 전체 선택/해제)
- Tenant Selector 통합
- 레이아웃 패턴 문서화 (LAYOUT_PATTERN.md)
- Sidebar 메뉴에 역할 관리 추가
- Pagination partial 컴포넌트 추가
- Tenants 레이아웃 100% 폭으로 통일

주요 수정:
- UpdateRoleRequest 라우트 파라미터 수정 (role → id)
- RoleController permissions 조회 시 description 제거
- Conditional tenant filtering 적용
- DepartmentService, DepartmentController (Blade/API) 생성
- 부서 CRUD 기능 완성 (목록/생성/수정/삭제)
- FormRequest 검증 (StoreDepartmentRequest, UpdateDepartmentRequest)
- HTMX 패턴 적용 (index, create, edit, partials/table)
- 계층 구조 지원 (parent-child relationships)
- 활성/비활성 상태 관리
- 정렬 순서 관리
- Tenant Selector 통합
- Sidebar 메뉴에 부서 관리 추가

주요 기능:
- 자기 참조 방지 (parent_id validation)
- 하위 부서 존재 시 삭제 방지
- Conditional tenant filtering 적용
- Active/Inactive 필터링
- HTMX 페이지네이션 (target, includeForm 파라미터 포함)

정책:
- 모든 리스트 화면은 1페이지만 있어도 페이지네이션 표시
- User 모델: tenants() belongsToMany 관계 추가
- UserService: whereHas('tenants') pivot 필터링으로 변경
- 사용자 생성 시 user_tenants pivot 처리
- tenant_id 컬럼 참조 제거 (다대다 관계)
- MNG_CRITICAL_RULES.md: DB 마이그레이션 금지 등 핵심 규칙
- UserController: 사용자 CRUD API 엔드포인트
- StoreUserRequest, UpdateUserRequest: 사용자 검증
- 사용자 관리 뷰: index, create, edit, table
- 시스템 관리 메뉴 UI 개선 (테이블 헤더 스타일)
- docs/INDEX.md: CRITICAL_RULES 링크 추가
- UserService: audit 컬럼 처리 추가 (created_by, updated_by, deleted_by)
- UserService: restoreUser(), forceDeleteUser() 메서드 추가
- UserController: restore(), forceDestroy() 엔드포인트 추가
- 권한 체크: 영구삭제는 슈퍼관리자만 가능
- UI: 삭제된 사용자에 복원/영구삭제 버튼 추가
- Routes: restore, forceDestroy 라우트 추가
- UserService::getUsers()에 withTrashed() 추가
- 페이지네이션 로직을 별도 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
- 트리 구조 정렬 및 표시 (무제한 depth 지원)
- 접기/펼치기 기능 추가 (재귀적 처리)
- 활성/숨김 상태 토글 기능 (실시간 업데이트)
- 테넌트 필터링 (전체 선택 시 마스터 메뉴만 표시)
- UI 개선 (토글 버튼, 외부 메뉴 표시)

추가된 파일:
- MenuService: 비즈니스 로직 처리
- MenuController (API/Web): 라우트 처리
- MenuRequest: 유효성 검증
- views/menus/: 메뉴 관리 뷰

수정된 파일:
- routes/api.php, web.php: 메뉴 라우트 추가
- CURRENT_WORKS.md: Phase 4-2~4-5 상세 작업 내역 추가 (365줄)
- docs/INDEX.md: Phase 4 완료 상태 업데이트
- docs/specs/database-schema.md: Phase 4 테이블 8개 상세 스키마 추가
- sidebar.blade.php: 메뉴 관리 링크 추가 (누락되어 있었음)

Phase 4 완료: 시스템 관리 5개 메뉴 (테넌트/역할/부서/사용자/메뉴)
- Permission 모델 및 PermissionService 생성 (Spatie Permission 확장)
- HTMX 기반 권한 CRUD API 구현
- Blade 기반 권한 관리 화면 (index, create, edit)
- 권한명 포맷팅 로직 추가 (menu:id.type 파싱)
- 사이드바 메뉴 추가
- 멀티테넌트 지원 (tenant_id nullable)
- 할당된 역할/부서 표시 기능
- 메뉴를 4개 그룹으로 재구성 (시스템 관리, 권한 관리, 생산 관리, 시스템)
- 그룹 접기/펼치기 기능 추가 (localStorage 상태 저장)
- 그룹 내 메뉴 인덴트 적용 (2rem)
- 그룹 구분선 및 시각적 계층 구조 강화
- 권한 테이블 레이아웃 최적화 (한 줄 표시)
- 사이드바 메뉴 가이드 문서 작성 (SIDEBAR_MENU_GUIDE.md)

변경 파일:
- resources/views/partials/sidebar.blade.php
- resources/views/permissions/partials/table.blade.php
- SIDEBAR_MENU_GUIDE.md (신규)
- 테넌트 선택을 각 페이지에서 헤더로 통합 이동
- 페이지 제목 이모지 제거 및 상단 여백(mt-6) 축소
- 역할 권한 관리 페이지 레이아웃을 다른 페이지와 통일
- 메뉴명 스타일 개선 (depth 들여쓰기, └ 기호 적용)
- 상위 메뉴 컬럼 제거로 테이블 간소화
- RolePermissionService에 depth 계산 로직 추가
- pagination.js를 body 끝으로 이동하여 로딩 오류 해결
- 역할 선택 UI를 셀렉트박스에서 버튼 형태로 변경
- 역할 버튼 hover 효과 개선 (선택된 버튼 가독성 향상)

변경된 파일:
- resources/views/partials/header.blade.php: 테넌트 선택 UI 추가
- resources/views/dashboard|menus|users|departments|permissions|roles/index.blade.php: tenant-selector 제거, 여백 축소
- resources/views/layouts/app.blade.php: pagination.js 위치 변경
- app/Services/RolePermissionService.php: depth 계산 로직 추가
- resources/views/role-permissions/: 역할 권한 관리 페이지 개선
- routes/web.php, routes/api.php: 역할 권한 관리 라우트 추가
- DepartmentPermissionService 생성 (역할 권한 관리 패턴 적용)
- 부서별 메뉴 권한 매트릭스 관리
- 하위 부서 권한 자동 전파 기능
- 전체 허용/거부/초기화 기능
- HTMX 기반 실시간 권한 토글
- Department 모델의 HasRoles trait 활용
- model_has_permissions 테이블 사용

주요 파일:
- app/Services/DepartmentPermissionService.php
- app/Http/Controllers/DepartmentPermissionController.php
- app/Http/Controllers/Api/Admin/DepartmentPermissionController.php
- resources/views/department-permissions/index.blade.php
- resources/views/department-permissions/partials/*.blade.php
- routes/web.php, routes/api.php 라우트 추가
- sidebar 부서 권한 관리 메뉴 활성화
- 부서 권한 아키텍처 재설계 (Role → Department 직접 할당)
- Guard 선택 기능 구현 (API/Web 분리)
- 초기화(Reset) 기능 추가 (view 권한만 허용)
- UI 개선 (Guard 선택기 + 구분선)

부서 권한 관리:
- Department 모델에 HasPermissions trait 추가
- DepartmentPermissionService 완전 재작성 (직접 할당 패턴)
- model_has_permissions 테이블 직접 사용
- guard_name 파라미터 모든 메서드에 추가

역할 권한 관리:
- RolePermissionService에 guard_name 파라미터 추가
- RolePermissionController에 guard_name 처리 구현
- Guard별 독립적인 권한 매트릭스 관리

UI 개선:
- Guard 선택 드롭다운 (Web/API) 추가
- 모든 HTMX 요청에 guard_name 포함
- Guard 변경 시 자동 새로고침 기능
- 시각적 구분선으로 UI 가독성 향상
- 전체 테넌트 선택 시 역할/부서를 테넌트별로 그룹화하여 표시
- 테넌트별 섹션 헤더 추가 (회색 라벨)
- 선택 시 [테넌트명] 역할/부서명 형식으로 표시
- 단일 테넌트 선택 시 기존 UI 유지
- 역할 목록: 테넌트/Guard 컬럼 추가, Guard 필터 드롭다운 추가
- 역할 등록/수정: Guard 선택 기능 추가 (API/Web)
- 권한 선택 UI를 메뉴 기반 매트릭스로 변경 (7가지 권한 유형)
- 테넌트 미선택 시 역할 등록 차단
- pagination.js 디버그 로그 제거
- 테넌트 미선택 시 안내 메시지 표시 (역할/부서 목록 숨김)
- 역할/부서 선택 시 해당 항목의 tenant_id로 메뉴 필터링
- 자동 선택은 특정 테넌트 선택 시에만 동작
사용자 관리:
- 사용자 등록/수정 시 테넌트별 역할/부서 선택 기능 추가
- Department, UserRole, DepartmentUser 모델 추가
- User 모델에 역할/부서 관계 및 헬퍼 메서드 추가
- syncRoles/syncDepartments 메서드 (forceDelete로 유니크 키 충돌 방지)
- 체크박스 UI로 다중 선택 지원

부서 관리:
- Soft Delete 필터 (정상만/전체/삭제된 항목만)
- 복구(restore) 및 영구삭제(forceDelete) 기능 추가
- Department 모델에 SoftDeletes 트레이트 추가
- 삭제된 항목 빨간 배경 + "삭제됨" 배지 표시
- 역할/부서/개인 권한을 통합하여 최종 유효 권한 표시
- 권한 소스별 색상 구분 UI (보라=역할, 파랑=부서, 녹색=개인허용, 빨강=개인거부)
- 스마트 토글 로직 (상속된 권한 오버라이드 지원)
- UserPermissionService: getRolePermissions(), getDepartmentPermissions(), getPersonalOverrides()
- 사용자 ID 뱃지 스타일 개선
- 메뉴별 권한 분석 기능 (접근 가능/불가 사용자 목록)
- 사용자 역추적 기능 (역할/부서/개인별 권한 추적)
- CSV 내보내기 기능
- 트리 구조 시각화 (└─ 연결선, 폴더/문서 아이콘)
- 중복 메뉴 표시 문제 해결 (테넌트별 메뉴만 표시)
- getUserRoles(): user_roles 테이블에서 model_has_roles(Spatie) 테이블로 변경
- roles 테이블의 display_name → description 컬럼으로 수정
- traceUsersWithPermission()에서도 동일한 컬럼명 수정
- ArchivedRecord, ArchivedRecordRelation 모델 추가
- ArchivedRecordService 추가 (읽기 전용)
- 목록/상세 컨트롤러 및 뷰 구현
- HTMX 기반 테이블 필터링 및 페이지네이션
- 사이드바 메뉴 연결
- 권한이 없는 사용자는 목록에 표시하지 않음
- access_denied → explicit_deny로 명칭 변경
- DENY 목록은 명시적 개인 거부만 표시
- ArchivedRecordService: batch_id 기준 그룹핑 쿼리 추가
- Controller: batchId 파라미터로 상세 조회 변경
- 목록: 작업 설명, 레코드 타입, 레코드 수 표시
- 상세: batch 내 모든 레코드를 카드 형태로 표시
- 한번의 삭제 작업이 하나의 행으로 표시됨
- 기존 데이터(batch_id NULL)는 legacy_ 접두사로 가상 batch_id 생성
- legacy 데이터 조회 시 id 기반으로 단일 레코드 조회
- batch_description NULL인 경우 레코드 타입과 원본 ID로 자동 생성
- public/js/menu-tree.js 공통 스크립트 생성
  - 테이블(tr.menu-row) / div(.menu-item) 둘 다 지원
  - toggleChildren, hideChildren, showChildren 함수 통합

- 권한 관리 페이지들 메뉴 트리 디자인 통일
  - role-permissions, department-permissions, user-permissions
  - 폴더/파일 아이콘, 접기/펼치기 버튼, chevron 아이콘
  - menu-row 클래스 및 data 속성 추가

- permission-analyze 접기/펼치기 기능 추가
  - data-parent-id, data-depth 속성 추가
  - 폴더 버튼 클릭으로 하위 메뉴 토글

- menus 페이지 스크립트 공통화

- 각 페이지 중복 코드 제거 및 공통 menu-tree.js 로드
- 모델: AdminApiFlow, AdminApiFlowRun
- 컨트롤러: FlowTesterController
- 뷰: index, create, edit, history, run-detail
- 사이드바 메뉴에 "개발 도구" 그룹 추가
- 라우트 설정
- 테넌트 row 클릭 시 모달 팝업 표시
- 컨텍스트 메뉴 (우클릭) 지원
- 탭 구조: 구독정보, 사용자, 부서, 역할, 메뉴
- 메뉴 탭 트리 구조 접기/펼치기 기능
- 삭제된 테넌트 경고 배너 (삭제일, 삭제자 표시)
- 복원 버튼으로 즉시 복원 및 모달 새로고침
- 액션 버튼 (수정/삭제) 클릭 시 모달 미표시
- VariableBinder: 변수 바인딩 엔진 ({{...}} 패턴 처리)
- DependencyResolver: 의존성 정렬 (Topological Sort)
- ResponseValidator: HTTP 응답 검증 (JSONPath, 연산자)
- HttpClient: Laravel HTTP Client 래퍼
- FlowExecutor: 플로우 실행 엔진
- guide-modal.blade.php: JSON 작성 가이드 (기본 구조, 변수 바인딩, 응답 검증, AI 프롬프트)
- example-flows.blade.php: Item Master 전체/기본 테스트, 인증 플로우 예제
- index.blade.php: 가이드/예제 버튼 추가
- 순수 Tailwind CSS 모달 패턴 적용 (DaisyUI 미사용)
사용자 모달 기능:
- 사용자 정보 모달 팝업 (조회/삭제/수정)
- 권한 요약 정보 (Web/API 권한 카운트)
- 2x2 그리드 레이아웃 (테넌트, 역할, 부서, 권한)
- 테이블 행 클릭으로 모달 열기
- 권한 관리 링크 클릭 시 해당 사용자 자동 선택

컨텍스트 메뉴 확장:
- permission-analyze 페이지 사용자 이름에 컨텍스트 메뉴
- user-permissions 페이지 사용자 버튼에 컨텍스트 메뉴
- 사용자 모달 내 테넌트 칩에 컨텍스트 메뉴
- 헤더 테넌트 배지에 컨텍스트 메뉴
- 테넌트 메뉴에 "이 테넌트로 전환" 기능 추가
- meta 필드 포함 안내 추가 (자동 추출 설명)
- 프롬프트 템플릿에 복사 버튼 추가
- 예시 프롬프트에 복사 버튼 추가
- 사용 흐름 안내 추가
- permissions 테이블의 테넌트 컬럼에 우클릭 메뉴 추가
- roles 테이블의 테넌트 컬럼에 우클릭 메뉴 추가
- 헤더의 현재 테넌트 배지에 우클릭 메뉴 추가
- created_at datetime 캐스팅 추가 (=false로 인한 문제)
- status_color DaisyUI → 순수 Tailwind CSS 클래스로 변경
- FlowTesterController에 FlowExecutor 연결
- 실행 결과를 AdminApiFlowRun에 저장
- 실행 중 로딩 인디케이터 추가
- 결과 모달로 상세 실행 결과 표시
  - 상태, 소요 시간, 완료 스텝 표시
  - 각 스텝별 성공/실패 로그 표시
  - 상세 보기 링크 제공
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 상태 스타일링 (노란색 배경/테두리)
- 행 클릭 시 스텝 상세 확장 기능
- 실행 결과 실시간 표시 개선
- Models: AdminPmProject, AdminPmTask, AdminPmIssue
- Services: ProjectService, TaskService, IssueService, ImportService
- API Controllers: ProjectController, TaskController, IssueController, ImportController
- FormRequests: Store/Update/BulkAction 요청 검증
- Views: 대시보드, 프로젝트 CRUD, JSON Import 화면
- Routes: API 42개 + Web 6개 엔드포인트

주요 기능:
- 프로젝트/작업/이슈 계층 구조 관리
- 상태 변경, 우선순위, 마감일 추적
- 작업 순서 드래그앤드롭 (reorder API)
- JSON Import로 일괄 등록
- Soft Delete 및 복원
- Models: Board, BoardSetting (커스텀 필드)
- Service: BoardService (CRUD, 필드 관리)
- Controllers: BoardController (Blade), Api/Admin/BoardController (API)
- Views: index, create, edit, table partial
- 커스텀 필드 다중 추가 모달 (한 줄 레이아웃, + 버튼 추가)
- Task, Issue 모델에 is_urgent 필드 추가
- TaskService, IssueService에 toggleUrgent() 메서드 추가
- TaskController, IssueController에 toggleUrgent 엔드포인트 추가
- API 라우트에 toggle-urgent 경로 추가
- 프로젝트 상세 페이지 UI 개선:
  - 작업/이슈 행에 긴급 토글 버튼(불꽃 아이콘) 추가
  - 서브 row(아코디언 내 이슈)에도 긴급 토글 추가
  - 서브 row 컬럼을 작업 row와 동일하게 8컬럼으로 정렬
  - 진행중 작업의 이슈 아코디언 자동 열기
  - 이슈 상태 버튼 항상 테두리 표시
- 개발 단계별 문서 추가 (00_OVERVIEW ~ 06_PHASE)
- 기술 표준 문서 추가 (99_TECHNICAL_STANDARDS)
- 개발 프로세스 및 패턴 문서 추가
  - API_FLOW_TESTER_DESIGN, DEV_PROCESS
  - HTMX_API_PATTERN, LAYOUT_PATTERN
  - SETUP_GUIDE, MNG_PROJECT_PLAN
- 프로젝트 관리 문서 추가 (project-management/)
- INDEX.md, MNG_CRITICAL_RULES.md 업데이트
- LoginController: 로그인 처리 개선
- UserPermissionController: 권한 관리 기능 개선
- User 모델: 권한 관련 메서드 추가
- AuthService: 인증 서비스 로직 개선
- Middleware 추가
- bootstrap/app.php: 미들웨어 등록
- 권한 관리 뷰 개선 (user-permissions, users)
- AdminPmProject 모델: 통계 관련 속성 추가
- ProjectService: 통계 조회 로직 개선
- 프로젝트 목록 뷰: 통계 표시 및 UI 개선
- 프로젝트 테이블 뷰: 진행률 표시 개선
- ArchivedRecordController 수정
- 각종 테이블 뷰 개선 (archived-records, boards, departments, menus, tenants)
- web.php 라우트 정비
- 대시보드 페이지: 통계 카드, 섹션 제목, JS 동적 렌더링 이모지 → Heroicons SVG
- 프로젝트 목록 페이지: 페이지 제목 이모지 → folder SVG
- mng 시스템 기존 아이콘 스타일과 일관성 유지

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- 일반관리자가 슈퍼관리자 수정/삭제 불가
- API Controller: update/destroy에서 403 반환
- Web Controller: edit에서 403 abort
- FormRequest: is_super_admin 필드 강제/유지 처리
- View: 테이블, 모달, 생성/수정 폼에서 버튼/체크박스 숨김

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- GROUP BY + paginate() 조합 시 total count 오류 해결 (서브쿼리 방식)
- DB::table() 사용 시 page 파라미터 명시적 전달
- 커스텀 페이지네이션을 공용 컴포넌트(partials.pagination)로 교체

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- routes/api.php: 8개 엔티티의 restore 라우트를 super.admin 미들웨어 밖으로 이동
  - tenants, departments, users, menus, boards
  - pm/projects, pm/tasks, pm/issues
- UserService.canAccessUser(): withTrashed() 적용하여 soft-deleted 사용자 권한 체크 가능
- UserPermissionService.canModifyUser(): withTrashed() 적용 (일관성 유지)

권한 정책:
- 복원 (Restore): 일반관리자 가능
- 영구삭제 (Force Delete): 슈퍼관리자 전용

버그 수정:
- 302 Found 에러 해결 (미들웨어 블로킹)
- soft-deleted 사용자 복원 시 권한 체크 실패 해결

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Phase 1 - 아카이브 복원 기능:
- ArchiveService: 모델별 아카이브 로직 통합 (326줄)
- RestoreService: 복원 로직 및 충돌 검사 (319줄)
- ArchivedRecordController: restore, checkRestore 메서드 추가
- record_type enum→varchar 마이그레이션
- 복원 버튼 및 충돌 체크 UI (restore-check.blade.php)

Phase 2 - 테넌트 필터링:
- ArchivedRecord 모델: tenant_id fillable, tenant 관계 추가
- ArchiveService: tenant_id 저장 로직 (determineTenantId)
- ArchivedRecordService: 테넌트별 필터링 쿼리
- 목록 UI: ID 컬럼, 대상 테넌트 컬럼 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- substr() → mb_substr()로 변경하여 멀티바이트 문자 지원
- strtoupper() → mb_strtoupper()로 변경
- 헤더, 사이드바 사용자 아바타에 적용
- 사용자 등록 시 비밀번호 입력 필드 제거
- 임의 비밀번호 자동 생성 후 이메일 발송
- 사용자 수정 페이지에 비밀번호 초기화 버튼 추가
- 사용자 모달에 비밀번호 초기화 버튼 추가
- 사용자 모달 프로필 이미지 없을 때 이름 첫글자 표시 (한글 지원)
- UserPasswordMail 클래스 및 이메일 템플릿 추가
- SETUP_GUIDE.md: Gmail SMTP 설정 방법, Google Groups 발신자 설정 추가
- CURRENT_WORKS.md: 2025-12-01 비밀번호 자동 생성/이메일 발송 작업 이력
- INDEX.md: 작업 이력 및 최종 업데이트일 갱신
- 생산 관리: 제품/자재/BOM/카테고리 관리 비활성화
- 시스템: 시스템 설정/감사 로그 비활성화
- 클릭 불가 처리 (a태그 → span태그)
- 회색 텍스트 + 금지 커서 + "준비중" 라벨 추가
- 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단계)
- items-crud.json: Faker 기반 CRUD 테스트 (5 steps)
- items-search.json: 목록/검색/통계 테스트 (5 steps)
- items-bom.json: BOM 관리 테스트 (8 steps)
주요 기능:
- 일일 로그 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 + 항목관리)
- 저장소 사용량 표시 추가 (테이블 + 모달)
- 이메일/전화번호 컬럼 병합 (연락처)
- 전화번호 하이픈 포맷 적용
- 생성일 yymmdd 형식 변경 및 ID 뒤로 이동
- 테이블 헤더 가운데 정렬
- 액션 컬럼을 관리(colspan)로 변경
- MenuService.reorderMenus() 메서드 추가
- MenuController.reorder() API 엔드포인트 추가
- POST /api/admin/menus/reorder 라우트 추가
- SortableJS 기반 드래그 앤 드롭 UI 구현
- 같은 부모 메뉴 내에서만 순서 변경 가능 (계층 구조 유지)
- MenuService.moveMenu() 메서드 추가 (부모 변경 + 하위 메뉴 유지)
- POST /api/admin/menus/move API 엔드포인트 추가
- 순환 참조 방지 로직 구현
- Shift+드래그로 위 메뉴의 하위로 이동 가능
- 사용법 안내 UI 추가
- Notion 스타일 좌우 드래그로 계층 이동 방식 변경
  - → 오른쪽 드래그: 상위 메뉴의 하위로 이동 (파란색 하이라이트)
  - ← 왼쪽 드래그: 상위 레벨로 이동 (주황색 하이라이트)
- 드래그 인디케이터 툴팁 추가 (인덴트/아웃덴트/순서변경)
- CSS 펄스 애니메이션으로 타겟 행 강조
- updateRowHighlight 함수 수정: 아웃덴트 시 드래그 중인 행 하이라이트
- forceFallback: true 추가 (네이티브 드래그 → 자체 구현)
  → mousemove 이벤트 정상 발생, 인디케이터/하이라이트 작동
- 드래그 중 텍스트 선택 방지 (body.is-dragging + user-select: none)
- 순서변경(reorder) 시 원래 부모 유지 (계층 변경 버그 수정)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Role 모델에 SoftDeletes 트레이트가 없어 에러 발생
- 테넌트 아카이브 시 역할 조회 로직 수정

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- 프로필 정보 수정 (이름, 전화번호)
- 비밀번호 변경 기능
- 헤더 드롭다운 메뉴 연결

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- 게시판 템플릿 설정 파일 추가 (config/board_templates.php)
  - 시스템 템플릿: 공지사항, 1:1문의, FAQ, 팝업공지
  - 테넌트 템플릿: 자유게시판, 갤러리, 자료실, 공지사항, Q&A
- BoardService 템플릿 관련 메서드 추가
- BoardController 템플릿 API 엔드포인트 추가
- 게시판 생성 UI 3단계 위자드로 개선
- 모든 템플릿 아이콘을 이모지에서 SVG path로 변경

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- User 모델에 must_change_password 필드 추가
- UserService: createUser(), resetPassword()에서 플래그 설정
- ProfileService: changePassword()에서 플래그 해제
- EnsurePasswordChanged 미들웨어 추가
- 인증 라우트에 password.changed 미들웨어 적용
- 프로필 페이지에 비밀번호 변경 필요 알림 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- 닫기/수정 버튼을 모달 하단에 고정 (flex-shrink-0)
- 콘텐츠 스크롤 시에도 버튼 항상 표시
- 기존 modal-info 내부 버튼 제거

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- File 모델 추가 (Polymorphic 관계)
- Post 모델에 files() MorphMany 관계 추가
- PostService 파일 업로드/삭제/다운로드 메서드 추가
- PostController 파일 관련 액션 추가
- 게시글 작성/수정 폼에 드래그앤드롭 파일 업로드 UI
- 게시글 상세에 첨부파일 목록 표시
- tenant 디스크 설정 (공유 스토리지)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- INDEX.md: 메뉴 드래그앤드롭, 프로필 설정, 비밀번호 변경 강제, 게시판 템플릿, 파일 첨부, 일일 스크럼 기능 추가
- 04_PHASE4_CONTENT.md: 게시판 관리 체크리스트 업데이트 (EAV, 파일 첨부, 템플릿 완료 표시)
- CURRENT_WORKS.md: 2025-12-02 작업 내역 추가
- escapeHtml/nl2br 헬퍼 함수 추가
- 요약(summary) 줄바꿈 처리
- 항목 내용(content) 줄바꿈 처리
- XSS 방지를 위한 HTML 이스케이프 처리
- UpdateDailyLogRequest에 log_date 검증 규칙 추가
- DailyLogService.updateDailyLog에 log_date 필드 추가
- 일일 로그 수정 모달에 formatDateForInput 함수 추가
  (ISO 형식을 YYYY-MM-DD 형식으로 변환)
- 오늘의 활동을 3컬럼 칸반 레이아웃으로 변경 (예정/진행중/완료)
- 담당자별 항목 그룹핑 적용
- 인라인 상태 변경 버튼 추가 (hover 시 표시)
- 담당자별 다중 항목 편집 모달 구현
  - 담당자 이름 공통 입력
  - 항목별 textarea, 상태 버튼, 삭제 버튼
  - 항목 추가/삭제 기능
  - Promise.all로 일괄 저장
- 인라인 삭제 기능 추가
- 라우트 경로 수정 (pm.daily-logs.index → daily-logs.index)
- 사이드바에서 JSON Import 메뉴 항목 제거
- 프로젝트 목록 페이지에 JSON Import 버튼 추가
- personal_access_tokens, permission_tables: API에서 이미 생성된 테이블
- archived_records varchar 변경: API로 이동
- 이슈 모달에 시작일/마감일/예상시간 입력 필드 추가
- 작업 탭 아코디언 서브 이슈에 마감일 표시 및 지연 강조
- 이슈 정렬: 마감일 → 상태 순 (이슈탭 + 작업탭 아코디언)
- DB 마이그레이션: 하이브리드 FK + 문자열 필드 방식
- Model: fillable, casts, relationships, accessor 추가
- FormRequest: validation rules 추가 (Store/Update)
- ImportService: JSON import 시 새 필드 처리
- UI: 이슈 모달에 입력 필드 추가
- UI: 작업 탭 아코디언에 고객사·부서·담당자 표시
- 이슈 저장 후 작업 탭 즉시 갱신
- PULL 방식 메뉴 가져오기 (테넌트가 글로벌에서 선택적으로 가져옴)
- 모드 전환 UI (내 메뉴 / 글로벌에서 가져오기)
- 체크박스 선택으로 다중 메뉴 가져오기 지원
- 가져오기 모드에서 읽기 전용 상태 배지 표시
- hidden input으로 HTMX mode 파라미터 전달 수정
- Task: is_urgent, assignee_id 필드 추가
- Issue: start_date, due_date, estimated_hours, is_urgent 필드 추가
- Issue: department_id, team, assignee_id, assignee_name, client 필드 추가
- 이슈 상태, 담당자/팀 하이브리드, 기타 필드 설명 추가
- GlobalMenu 모델 생성
- Menu.globalMenu() 관계를 GlobalMenu 모델로 변경
- getAvailableGlobalMenus(): GlobalMenu 모델 사용
- copyFromGlobal(): GlobalMenu 모델 사용
- Menu::whereNull('tenant_id') → GlobalMenu::query()로 변경
- 글로벌 메뉴 CRUD API 및 라우트 추가 (GlobalMenuController)
- 글로벌 메뉴 목록/생성/수정 뷰 추가 (보라색 테마)
- MenuService에 글로벌 메뉴 관련 메서드 11개 추가
- 메뉴 관리 페이지에 '글로벌 메뉴 관리' 버튼 추가
- 가져오기 모드에서 이미 가져온 메뉴 비활성화 표시
- super.admin 미들웨어로 접근 제어
- ImportController 파일 끝 줄바꿈 추가
- VariableBinder Pint 포맷팅 적용
- PM 임포트 API 에러 응답 처리 강화
- 테이블 행 간격 조정 (py-1.5 → py-2)
- "글로벌 메뉴" → "기본 메뉴" 용어 통일
- 구분 칸에 기본 메뉴 태그 표시 유지
- z-50 → z-[100]으로 변경하여 모달 위에 표시되도록 수정
- 테이블 헤더 스타일 통일 (menus, roles, permissions, boards 등)
- 권한 매트릭스 체크박스/버튼 크기 20x20으로 표준화
- 스크럼 항목 추가/수정 모달 통합 (코드 중복 제거)
- daily-logs API URL 경로 수정 (/pm/ 제거)
- 타임존 Asia/Seoul로 변경
- flow-tester 액션 아이콘 크기 조정
- 문제: .env의 FLOW_TESTER_API_TOKEN이 스텝에서 설정한 Authorization 헤더를 덮어씀
- 원인: withToken()이 항상 호출되어 스텝 헤더를 무시함
- 해결: 스텝 헤더에 Authorization이 있으면 기본 Bearer 토큰 사용 안함
- VariableBinder: setVariables()에서 {{$env.XXX}} 환경변수 치환 지원
- FlowExecutor: 스텝 실행 결과에 reason, description, expect 필드 추가
- buildResultReason(): 성공/실패 이유 자동 생성
  - 부정 테스트(400, 404 등) 시 예상대로 반환됨을 명시
  - 400: 유효성 검증 실패 확인
  - 404: 리소스 미존재 확인
  - 409: 충돌 상태 확인
  - 403: 권한 거부 확인
- run-detail.blade.php: 예상 상태코드, 이유, 스텝 설명 표시 UI
## 구현 내용

### 모델 (5개)
- QuoteFormulaCategory: 수식 카테고리
- QuoteFormula: 수식 정의 (input/calculation/range/mapping)
- QuoteFormulaRange: 범위별 값 정의
- QuoteFormulaMapping: 매핑 테이블
- QuoteFormulaItem: 수식-품목 연결

### 서비스 (3개)
- QuoteFormulaCategoryService: 카테고리 CRUD
- QuoteFormulaService: 수식 CRUD, 복제, 재정렬
- FormulaEvaluatorService: 수식 계산 엔진
  - 지원 함수: SUM, ROUND, CEIL, FLOOR, ABS, MIN, MAX, IF, AND, OR, NOT

### API Controller (2개)
- QuoteFormulaCategoryController: 카테고리 API (11개 엔드포인트)
- QuoteFormulaController: 수식 API (16개 엔드포인트)

### FormRequest (4개)
- Store/Update QuoteFormulaCategoryRequest
- Store/Update QuoteFormulaRequest

### Blade Views (8개)
- 수식 목록/추가/수정/시뮬레이터
- 카테고리 목록/추가/수정
- HTMX 테이블 partial

### 라우트
- API: 27개 엔드포인트
- Web: 7개 라우트
- simulator.blade.php: Range 결과 JSON 문자열 파싱 로직 추가
- QuoteFormulaController.php: simulate 응답 success 항상 true로 변경
- ApiLogCapturer 추가: 플로우 실행 중 API 로그 캡처
- resolveBaseUrl() 추가: .env 환경변수 기반 baseUrl 지원
- 실행 상세 페이지: 스텝별 접기/펼치기 기능 (성공=접힘, 실패=펼침)
- JSON 가이드 및 예제 플로우 최신화
- AI 프롬프트 템플릿 업데이트
- bindExpectVariables() 추가: expect jsonPath 값에 변수 바인딩 적용
- areNumericEqual() 추가: 숫자 타입 유연 비교 ("2" == 2)
- CONTROLLER_TYPE select 드롭다운 추가 (매립형/노출형/일체형)
- 문자열 입력값 지원 (isNaN 체크로 숫자/문자열 구분)
- 타임라인 진행바에 날짜 표시 (MM/DD~MM/DD 형식)
- Task/Issue 타임라인 바 색상 및 가시성 개선
- 이슈 상태 "열림" 버튼 색상 통일 (bg-red-100)
- 아코디언 내 이슈 수정/삭제 아이콘 크기 통일 (w-4 h-4)
- 아코디언 내 이슈 라인에 팀/부서 + 담당자 함께 표시
- Tailwind safelist에 동적 타임라인 색상 추가
Daily Logs 페이지:
- 미완료 항목 상태 변경 시 카드 유지 (done만 제거)
- 카드 정렬을 날짜 오래된 순으로 변경
- 요약 내용 nl2br 적용 및 접힘 시 2줄 제한
- 아코디언 항목 담당자별 그룹핑으로 통합

Project Management 페이지:
- 오늘의 활동을 칸반(3열) → 담당자 카드 스타일로 변경
- 완료 항목도 함께 표시 (취소선, 초록 배지)
- 미완료/완료 건수 헤더에 표시
- prompt() 제거하고 모달에서 담당자 입력 처리
- datalist로 본사 사용자/부서 자동완성 지원
- 팀(부서) 먼저 표시되도록 순서 조정
- openQuickAddModal 함수 추가로 아코디언 항목 추가 연동
- Alpine.js 대신 DaisyUI collapse 컴포넌트 사용
- ApiLogCapturer에 유니코드 이스케이프 디코딩 기능 추가
- 한글 메시지가 정상적으로 표시되도록 수정
- 체크박스에 hidden 필드 추가 (해제 시에도 값 전송)
- UserService에 is_super_admin boolean 변환 로직 추가
- is_active 체크박스도 동일하게 수정
- layouts/app.blade.php에 SweetAlert2 CDN 및 전역 헬퍼 함수 추가
  - showToast(): 토스트 알림 (success, error, warning, info)
  - showConfirm(): 확인 대화상자
  - showDeleteConfirm(): 삭제 확인 (경고 아이콘)
  - showPermanentDeleteConfirm(): 영구 삭제 확인 (빨간색 경고)
  - showSuccess(), showError(): 성공/에러 알림

- 변환된 파일 목록 (48개 Blade 파일):
  - menus/* (6개), boards/* (2개), posts/* (3개)
  - daily-logs/* (3개), project-management/* (6개)
  - dev-tools/flow-tester/* (6개)
  - quote-formulas/* (4개), permission-analyze/* (1개)
  - archived-records/* (1개), profile/* (1개)
  - roles/* (3개), permissions/* (3개)
  - departments/* (3개), tenants/* (3개), users/* (3개)

- 주요 개선사항:
  - Tailwind CSS 테마와 일관된 디자인
  - 비동기 콜백 패턴으로 리팩토링
  - 삭제/복원/영구삭제 각각 다른 스타일 적용
- config.apiKey 필드를 JSON에서 제거 (서버 자동 주입)
- config.baseUrl을 빈 문자열로 설정 (서버 기본값 사용)
- 프롬프트 템플릿에 더 명확한 규칙 추가
- 로그인 스텝 포함한 완전한 예시 제공
- 예시 프롬프트 간소화
- GET 요청에서 query 필드를 URL 쿼리스트링으로 전송
- 요청 로그에 query 정보 포함 (에러/성공 모두)
- 실행 성공 시 리스트 페이지로 이동
- 실행 실패 시 실행 상세 페이지로 이동
- 사용자 목록에 테넌트 컬럼 추가 (기본 테넌트 인디고 배지)
- UserService: tenants 관계 eager loading 추가
- 컨텍스트 메뉴 우클릭 → 좌클릭 변경 (캡처링 방식)
- 전체 blade 파일 툴팁 통일: '클릭하여 메뉴 열기'
- flow-tester 오류 분석 문구 수정
- run-detail에서 재실행 시 edit과 동일하게 동작
- 성공 시: 리스트 페이지로 이동
- 실패 시: 새 상세 페이지로 이동
- ImportService에 importIssuesToTask 메서드 추가
- ImportController에 importIssues 액션 추가
- ImportIssuesRequest FormRequest 생성
- POST /api/admin/pm/import/task/{taskId}/issues 라우트 추가
- import.blade.php UI에 '기존 작업에 이슈 추가' 모드 추가
- ImportProjectRequest에 tasks 레벨 검증 규칙 보완
- getMenuTree()에 TenantScope 비활성화 추가 (HQ 관리자가 다른 테넌트 메뉴 조회 가능)
- getRolePermissions()에 user_roles 테이블 쿼리 추가 (테넌트별 역할 권한 반영)
- hasRolePermission(), getUserPermissionCounts()도 user_roles 포함하도록 수정
- 사용자 버튼의 data-context-menu를 아이디 뱃지로 이동 (클릭 이벤트 충돌 해결)
- checkRolePermission(): user_roles 테이블 쿼리 추가
- traceUsersWithPermission(): user_roles 기반 역할 사용자 조회 추가
- getUserRoles(): model_has_roles + user_roles 통합 조회로 변경
- 중복 제거 및 결과 병합 처리
- 주의 필요 항목을 팀별(이슈)/담당자별(태스크) 카드로 그룹핑
- 반응형 그리드 레이아웃 적용 (1~4열)
- 펼침 블록에 회사/팀/담당자/프로젝트/마감일 상세 정보 표시
- 조회 조건 변경: 마감 3일 이내 → 이번 주 마감 + 마감 초과 + 긴급
- 헤더 뱃지 "마감임박" → "이번주"로 변경
- scopeOverdue: 마감일 지난 미해결 이슈 필터
- scopeDueSoon: 마감일 임박 이슈 필터 (N일 이내)
- scopeNeedsAttention: 주의 필요 이슈 통합 스코프
- getDdayAttribute: D-day 계산 접근자
- getDueStatusAttribute: 마감 상태 접근자 (overdue/due_soon/normal)
- 사이드바 개발도구 블럭 배경 음영 처리 (bg-gray-50)
- 프로젝트 목록에서 행 클릭 시 상세 페이지로 이동
- 액션 버튼 클릭 시 이벤트 전파 방지 (stopPropagation)
- forceDeleteMenu: 연관 권한(menu:{id}.*) 함께 삭제
- forceDeleteGlobalMenu: 연관 권한 삭제 + 테넌트 메뉴 참조 해제
- 삭제 전 권한/역할 연결 정보를 archived_records에 저장
- Controller 반환값에 삭제된 권한 정보 포함
- 메뉴 영구삭제 시 연관 권한도 함께 삭제
- 삭제 정보를 archived_records에 저장 (복구용)
  - 메뉴 데이터, 권한 목록, 역할-권한 연결 정보 보관
- batch_id를 순수 UUID로 변경 (컬럼 크기 제한 해결)
- 영구삭제 시 에러 메시지 토스트로 표시 (하위 메뉴 존재 등)
- 글로벌 메뉴 영구삭제 시 참조 테넌트 메뉴 연결 해제
- ItemField 모델 및 SystemFieldDefinitions 상수 클래스 추가
- ItemFieldSeedingService: 시스템 필드 시딩/초기화/커스텀 필드 CRUD
- ItemFieldController (API): HTMX 기반 시딩 상태, 커스텀 필드 관리
- 커스텀 필드 수정 기능 (시스템 필드는 source_table/field_key 수정 불가)
- 레거시 데이터 표시 개선: 소스 테이블 비어있으면 '미지정' 배지
- 필드 키 정책 변경: 숫자로 시작 허용 (영문/숫자/밑줄)
- AI 문의하기: 시딩 오류 보고서 생성 기능
- 사이드바에 품목기준 필드 관리 메뉴 추가
- 필드 목록에 상태(활성/잠금), 설정(옵션/속성/검증/조건) 컬럼 추가
- Row 클릭 시 아코디언 형태로 JSON 데이터를 Key-Value 테이블로 표시
- 상세보기/수정 모달에 JSON 필드 편집 기능 추가
- 시스템 필드 시딩 탭에서 row 클릭 시 필드 관리 탭으로 이동 및 필터링
- JSON 렌더링용 _key-value-table partial 추가
- ItemFieldController API 수정
- ItemFieldSeedingService 로직 개선
- Flow Tester 상세 화면 개선
- 레이아웃 및 프로젝트 상세 화면 수정
- 테이블 정렬 JS 추가
- 햄버거 버튼을 사이드바 로고 영역으로 이동
- 접힌 상태에서 'S' 버튼 표시 (클릭 시 확장)
- 접힌 상태 메뉴 아이콘에 JavaScript 기반 툴팁 추가
- 이벤트 위임 방식으로 페이지 전환 시에도 안정적 동작
- 브라우저 기본 title 툴팁과 충돌 방지

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 실험실 그룹 (S: Strategy, A: AI/Automation, M: Management) 추가
- 확장 상태: S | A | M 수평 탭, 클릭 시 해당 패널 표시
- 축소 상태: 아이콘 호버 시 우측 플라이아웃 팝업
- localStorage 탭 상태 저장/복원

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CSS: hover 기반에서 .show 클래스 기반 표시로 변경
- CSS: ::before 가상 요소로 20px 투명 브릿지 추가
- JS: mouseenter/mouseleave + 150ms 딜레이 로직 구현
- 축소된 사이드바에서 플라이아웃 이동 시 메뉴 닫힘 현상 해결

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- StrategyController 생성 (15개 메소드)
- presentation.blade.php 레이아웃 추가
- 전략 문서 템플릿 15개 생성:
  - tax, labor, debt, chatbot (슬라이드 프레젠테이션)
  - rag-startups, douzone (Chart.js 통합)
  - confluence-vs-notion (비교 분석 + 퀴즈)
  - sales-strategy (8 슬라이드 + 채팅 UI)
  - kodata-vs-nice, barobill-vs-popbill (API 비교)
  - knowledge-search, chatbot-compare (탭 기반)
  - stablecoin, mrp-overseas, qa-solution (placeholder)
- 라우트 및 사이드바 메뉴 연결

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AIController 생성 (12개 메서드)
- ManagementController 생성 (11개 메서드)
- A 메뉴 플레이스홀더 템플릿 12개 생성
  - 사업자등록증 OCR, 웹 녹음 AI 요약, 회의록 AI 요약
  - 업무협의록 AI 요약, 운영자용 챗봇, Vertex RAG 챗봇
  - 테넌트 지식 업로드, 테넌트 챗봇, SAM AI 메뉴 이동
  - SAM AI 알람음 제작, GPS 출퇴근 관리, 기업개황 조회
- M 메뉴 플레이스홀더 템플릿 11개 생성
  - 바로빌 테넌트 관리, 전자세금계산서 전략, 전자세금계산서
  - 사업자등록번호 진위 확인, 영업관리 & 매니저 미팅관리
  - 카드 세무항목 매칭 전략, 한국 카드사 API 보고서
  - 카드 사용내역 수집 후 매칭, 계좌입출금 내역 조회 API
  - 영업관리 시나리오, 매니저 시나리오
- 라우트 23개 추가 (AI 12개, Management 11개)
- 사이드바 메뉴 라우트 연결 완료

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- S 메뉴 14개 항목을 <span> → <a> 태그로 변경
- 확장 상태 메뉴와 플라이아웃 메뉴 모두 수정
- 모든 lab.strategy.* 라우트 연결 완료

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 사이드바 UI 텍스트 변경 (실험실 → R&D Labs)
- 라우트 및 컨트롤러 주석 업데이트
- AI/Management 컨트롤러 docblock 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 13개 파일의 이모지를 인라인 SVG 아이콘으로 변환
- Heroicons/Tailwind 스타일 SVG 적용 (fill="none" stroke="currentColor")
- flex items-center gap-2 레이아웃으로 아이콘+텍스트 정렬
- 컬러 클래스 적용 (text-blue-600, text-green-600 등)

변환 파일:
- stablecoin, mrp-overseas, qa-solution, rag-startups
- kodata-vs-nice, confluence-vs-notion, barobill-vs-popbill
- chatbot-compare, sales-strategy, tax
- labor, debt, chatbot

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- R&D Labs 헤더, S/A/M 탭, 하위 메뉴 클릭 시 사이드바 최하단 스크롤
- localStorage로 스크롤 위치 저장/복원 (페이지 이동 후에도 유지)
- 일반 메뉴 클릭 시 스크롤 상태 초기화

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- A 메뉴 (AI/자동화) 12개 페이지 아이콘 변환
- M 메뉴 (관리) 11개 페이지 아이콘 변환
- placeholder-icon, feature-icon 스타일 통일

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
레거시 5130.sam.kr/ai_sam의 Google Gemini Live API 음성 어시스턴트를
MNG 프로젝트로 이전 (React → Pure JS + Blade)

변경 내용:
- GeminiController: API 키 제공 엔드포인트 추가
- sam-ai-live.js: LiveManager, AudioVisualizer ES 모듈
- sam-ai-menu.blade.php: 전면 재작성 (Tailwind UI)
- 환경변수: GEMINI_API_KEY, GEMINI_PROJECT_ID 추가

기능:
- 실시간 음성 입출력 (WebAudio API)
- UI 도구: navigateToPage, searchDocuments
- 오디오 시각화 (Canvas API)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ApiLogController: 로그 목록/상세/삭제 기능
- ApiRequestLog 모델: 색상 accessor, 경로 추출
- 뷰: 통계, 필터링, 페이지네이션
- 사이드바에 'API 요청 로그' 메뉴 추가
- JSON 출력 stripslashes 적용 (이스케이프 제거)
- 테넌트/사용자 컬럼 추가 (관계 eager loading)
- 그룹 ID로 연관 API 호출 필터링 및 상세 페이지에서 그룹 목록 표시
- 상태 400 이상일 때 AI 분석용 복사 버튼 추가
- Tenant 모델 네임스페이스 수정 (Tenants\Tenant)
- 파라미터 표시: URL 아래에 key=value 형식으로 표시
- 아코디언 기능: row 클릭 시 요청 헤더/응답 바디 확장 표시
- 요청 헤더: 각 항목별 한 줄 포맷 (key: value)
- 아이콘 버튼: 상세(눈), AI 복사(복사) 아이콘으로 변경
- AI 복사: 에러(400+) 로그에만 AI 분석 복사 버튼 표시
- 레이아웃: 테이블 컬럼 고정 너비, 셀 중간 정렬
- 아코디언 스타일: 테두리 추가, 배경색 조정
- 모든 로그 삭제(truncate) 기능 추가
- 필터 적용 시 오래된 순 정렬 (시간순 추적 용이)
- 상세 페이지 그룹 요청 섹션: 접힌 상태 기본, 메서드별 뱃지
- 리스트 아이콘 버튼 (상세, AI 복사), 세로 중앙 정렬
- 응답 바디 슬래시 이스케이프 처리
- 시스템 alert를 커스텀 Tailwind 모달로 교체
## 주요 변경사항
- 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>
- 카드 그리드 최대 3개로 제한 (xl:grid-cols-4 제거)
- 이슈/태스크 클릭 시 제목 전체 표시 (truncate 토글)
- 상세 정보 박스 레이아웃 변경: 마감 상단, 프로젝트 하단(한 줄)
- layouts.presentation → layouts.app 변경 (13개 파일)
- 슬라이드 높이: 100vh → calc(100vh - 80px)
- 슬라이드 번호 위치 중앙 정렬
- Menu 모델에 options JSON 필드 및 헬퍼 메서드 추가
  - getOption(), setOption()
  - getRouteName(), getSection(), getMenuType()
  - requiresRole(), getBladeComponent(), getCssClass()
  - getMeta(), setMeta()
- MngMenuSeeder 추가 (tenant_id=1 기본 메뉴 29개)
  - main 섹션: 대시보드, PM, 시스템, 권한, 콘텐츠, 시스템설정
  - tools 섹션: 개발 도구
  - labs 섹션: 실험실 (S/A/M 탭)
- MeetingLog 모델 (BelongsToTenant, SoftDeletes)
- GoogleCloudService (GCS 업로드, STT API)
- MeetingLogService (Claude API 요약)
- MeetingLogController (HTMX/JSON 듀얼 응답)
- 순수 Tailwind CSS UI 구현
- API 라우트 8개 엔드포인트 등록
- currentTenantId() → session('selected_tenant_id') 변경
- Google Cloud 인증파일 .gitignore 추가
- 리스트: 섹션, 메타 컬럼 분리 표시
- 등록/수정: 확장 옵션 섹션 추가 (section, meta)
- 메타 데이터 팝오버로 상세 보기
- 소프트 삭제된 필드 목록에 표시 (withTrashed)
- 삭제된 필드 시각적 구분 (빨간 배경, '삭제됨' 배지)
- 필드 복원 기능 추가 (restore API)
- 필드 영구 삭제 기능 추가 (forceDelete API)
- 체크박스 선택 및 일괄 삭제 기능 추가
- 시스템 필드 삭제 제한 해제
- 커스텀 모달 적용 (showConfirm, showDeleteConfirm)
- htmx.trigger 대신 fetch 기반 refreshMeetingList() 함수 사용
- 녹음 완료 후 목록 자동 새로고침
- 삭제 후 목록 자동 새로고침
- MeetingLogService: processUploadedFile 메서드 추가
- MeetingLogController: uploadFile 엔드포인트 추가
- routes/api.php: /api/meeting-logs/upload 라우트 추가
- meeting-summary.blade.php: 드래그앤드롭 파일 업로드 UI 구현
- refreshMeetingList 함수로 목록 새로고침 처리
- pagination.blade.php: data-server-value 속성 추가, 즉시 실행 스크립트로 서버값 강제 설정
- pagination.js: htmx:afterSwap에서 쿠키값 대신 서버값(data-server-value) 우선 사용
- item-fields: 페이지네이션 추가, handlePageChange/handlePerPageChange 핸들러 구현
- 디버그 코드 제거
- 테넌트 메뉴: session 대신 로그인 사용자의 tenant_id만 사용
- 메뉴 그룹 토글: 자식 있으면 기본 표시, localStorage 복원 로직 통일
- 프레젠테이션 페이지 CSS: 글로벌 선택자를 .presentation-container로 스코핑
- MeetingLogService에 summaryType 파라미터 추가
- buildWorkMemoPrompt 메서드 추가 (고객 요구사항/합의사항/To-Do 특화)
- MeetingLogController uploadFile에 summary_type 검증 추가
- work-memo-summary.blade.php 전체 UI 구현 (cyan 테마)
- 6단계 영업 프로세스 체크리스트 UI 구현
- 사용자별 체크포인트 저장/조회 API 추가
- 레거시 스타일 가로 아코디언 UI 적용
- 단계별 진행률 표시 및 꿀팁 모달 추가
- getFields() 반환 타입을 Collection에서 LengthAwarePaginator로 변경
- per_page 값을 뷰에 전달하여 셀렉트박스 selected 상태 유지
- 하드코딩된 Labs 메뉴를 DB에서 가져오도록 변경
- labs-menu.blade.php 컴포넌트 생성 (탭 UI 유지)
- options.meta.tab 값(S/A/M)으로 메뉴 분류
- Labs 메뉴가 없으면 섹션 자체가 렌더링되지 않음
- user-modal.js: 삭제/복원/비밀번호 초기화 알림 개선
- context-menu.js: 테넌트 전환/사용자 삭제 알림 개선
- 시스템 일관성을 위해 SweetAlert2 토스트 사용
- 리스트/상세 페이지에 재전송 버튼 추가
- 인증 방식 선택: 토큰 직접 입력 / 사용자 선택(Sanctum 토큰 발급)
- 환경별 API URL 변환 (API_BASE_URL 설정)
- X-API-KEY 헤더 자동 추가 (FLOW_TESTER_API_KEY 사용)
- 성공/실패 상태 배너 표시
- 세션에 토큰 저장하여 다음 재전송 시 자동 입력
- 재전송 성공 시 1초 후 페이지 새로고침
- 에러만 필터 옵션 추가 (4xx+5xx)
- Config: api-explorer.php (환경, 보안, 캐시 설정)
- Migration: api_bookmarks, api_templates, api_histories, api_environments
- Model: ApiBookmark, ApiTemplate, ApiHistory, ApiEnvironment
- Service: OpenApiParserService, ApiRequestService, ApiExplorerService
- Controller: ApiExplorerController (CRUD, 실행, 히스토리)
- View: 3-Panel 레이아웃 (sidebar, request, response, history)
- Route: 23개 엔드포인트 등록

Swagger UI 대체 개발 도구, HTMX 기반 SPA 경험
- Config, Service, Controller, View 생성
- Model 4개 (admin_api_* 테이블 참조)
- 3-Panel 레이아웃 (sidebar, request, response)
- HTMX 기반 동적 UI
- 마이그레이션은 api/ 프로젝트에서 관리
- OpenAPI 스펙 파일을 mng/storage/api-docs/로 복사
- config 경로를 storage_path()로 변경 (Docker 호환)
- 라우트 이름 수정 (dev-tools.api-explorer.* 접두사)
- HTMX 트리거 수정 (input changed, autocomplete off)
- openSettingsModal, showToast 함수 추가
# Conflicts:
#	app/Models/DevTools/ApiBookmark.php
#	app/Models/DevTools/ApiEnvironment.php
#	app/Models/DevTools/ApiHistory.php
#	app/Models/DevTools/ApiTemplate.php
#	config/api-explorer.php
#	resources/views/dev-tools/api-explorer/index.blade.php
#	resources/views/dev-tools/api-explorer/partials/request-panel.blade.php
- HTMX 응답 에러 수정: JSON 래핑 대신 HTML 직접 반환
  - MenuController, GlobalMenuController의 index 메소드 수정
  - index.blade.php, global-index.blade.php의 JSON 파싱 로직 제거

- 메뉴 options 필드 검증 추가
  - StoreMenuRequest, UpdateMenuRequest에 options 필드 추가
  - section 변경이 정상 저장되도록 수정

- 개발도구 메뉴 하드코딩 제거, DB 기반 동적 렌더링
  - sidebar.blade.php에서 하드코딩된 메뉴 제거
  - tools-menu.blade.php 컴포넌트 신규 생성
  - section=tools 메뉴가 하단 고정 영역에 동적 표시
- ApiTokenService: API 서버 토큰 교환 서비스 추가
- AuthService: 로그인 성공 시 API 토큰 교환 연동
- 레이아웃: 세션 토큰을 localStorage에 동기화 (FCM 사용)
- config/services.php: exchange_secret 설정 추가

환경변수 필요: INTERNAL_EXCHANGE_SECRET (API와 동일)
- 히스토리 로드 기능 구현 (loadFromHistory, fillFormFromHistory)
- 클라이언트 사이드 필수값 밸리데이션 추가
- 응답 본문 \xXX UTF-8 바이트 시퀀스 디코딩 (PHP 스택트레이스 한글 깨짐 해결)
- sidebar에 data-operation-id 속성 추가
- history-drawer 함수 연결 수정
- Flow Tester 변수 바인딩 개선
- 마이그레이션 파일 통합 정리
- API Explorer와 세션 토큰 공유 (api_explorer_token, api_explorer_user_id)
- 사용자 선택 드롭다운 UI 추가 (동일 테넌트 사용자 목록)
- HMAC 변수 자동 생성 기능 추가 (\$hmac.exp, \$hmac.signature 등)
- VariableBinder에서 선택된 사용자 정보 사용
- 사용자 선택 시 Sanctum 토큰 자동 발급
- user_tenants 피벗 테이블에서 tenant_id 조회
- MNG users 테이블에는 tenant_id 컬럼이 없음
- FlowTesterController: users() 메서드 피벗 테이블 쿼리로 변경
- FlowExecutor: 세션 토큰 우선순위 추가 (모달 토큰 사용)
- index.blade.php: tenant_id 표시 및 토큰 프리뷰 UI 수정
- API 사용 통계 조회 및 미사용 API 식별 기능
- 폐기 후보 등록/상태변경/삭제 기능
- API Explorer에서 사용 현황 페이지 링크 추가
- 북마크 토글 버그 수정 (라우트-컨트롤러 메서드명 일치)
- FCM 초기화 순서 변경: 리스너 등록 → 권한 요청 → register 호출
- localStorage → sessionStorage 변경 (보안 강화)
- 코드 간소화 및 불필요한 주석 제거
- API 토큰 동기화 로직 sessionStorage로 통일
- /api/push/* → /api/v1/push/*
- 라우트 경로 불일치로 404 발생하던 문제 해결
- type별 토스트 스타일 분기 (error/warning/success/info)
- 포그라운드 사운드 재생 (sound_key 기반)
- URL 클릭 이동 지원
- 앱 상태 감지 (포그라운드/백그라운드)
- sounds/ 디렉토리 추가
- FCM 토큰 관리 페이지 (목록, 활성화/비활성화, 삭제)
- 테스트 발송 페이지 (대상 필터, 미리보기, 발송)
- 발송 이력 페이지 (필터링, 결과 확인)
- FcmSender 서비스 (HTTP v1, 배치 처리)
- fcm_send_logs 테이블 마이그레이션
- google/auth 패키지 추가
- 부모메뉴 선택 시 트리 구조 순서 + 인덴트 적용
- 아이콘 선택 UI를 이모지에서 Heroicons SVG로 변경
- 확장 옵션 기본 펼침 상태로 변경
- 모바일 사이드바 오버레이 구현 (슬라이드 인/아웃)
- 헤더에 햄버거 메뉴 버튼 추가
- 모바일 백드롭 오버레이 추가
- ESC 키 및 메뉴 클릭 시 사이드바 자동 닫힘
- 사이드바 상단에 모바일 전용 테넌트 셀렉터 추가 (lg:hidden)
- 헤더 로고 옆에 현재 테넌트 뱃지 표시 (클릭 시 사이드바 열림)
- 사용자 메뉴 chevron 모바일 숨김 및 패딩 축소
- Price 모델 생성 (prices 테이블 연동)
- getCurrentPrice(): 현재 유효 단가 조회
- getSalesPriceByItemCode(): 품목 코드로 판매단가 조회
- FormulaEvaluatorService.getItemPrice() 구현 완료 (TODO 해결)
- table-swipe.blade.php 컴포넌트 생성
- CSS 터치 스크롤 최적화 및 스크롤바 스타일 추가
- 11개 테이블에 x-table-swipe 컴포넌트 적용
- 모바일에서 스와이프 힌트 애니메이션 표시 (sm 미만)
- filter-collapsible 컴포넌트 생성 (모바일 필터 토글)
- 10개 index 페이지 헤더/필터 반응형 적용
- 헤더: flex-col sm:flex-row 스택 배치
- 필터: w-full sm:w-40 반응형 너비
- 버튼: flex-1 sm:flex-none 그룹 배치
- LoginToken 모델 생성 (토큰 생성 및 URL 생성)
- UserController에 loginToken API 메서드 추가
- DEV_APP_URL 환경설정 추가 (config/services.php)
- 사용자 목록에 "DEV 접속" 버튼 추가
- openDevSite JavaScript 함수 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Global Menu indent/outdent 기능:
- GlobalMenuController에 move() 메서드 추가
- MenuService에 moveGlobalMenu(), isGlobalDescendant(), reorderGlobalSiblings(), compactGlobalSiblings() 추가
- global-index.blade.php에 드래그 계층 이동 JavaScript 추가
- routes/api.php에 POST /move 라우트 추가

Role 삭제 500 에러 수정:
- config/auth.php에 api guard 추가 (Spatie Permission getModelForGuard 오류 해결)
- RoleService에서 불필요한 users()->detach() 제거 (FK CASCADE 처리)
- RoleController에서 HTMX 요청 시 View 직접 반환 (JSON 파싱 에러 해결)
- index.blade.php에서 불필요한 afterSwap 핸들러 제거

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- 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_resend_token → api_explorer_token
- api_resend_user_id → api_explorer_user_id
- API Logs, API Explorer, Flow Tester 간 토큰 공유 가능

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 메뉴 등록/수정: 부모 메뉴 선택에서 아이콘 제거 (메뉴명만 표시)
- 글로벌 메뉴: 아이콘 그리드 선택기, 확장 옵션(section, meta) 추가
- 페이지네이션: per_page 쿠키 값이 서버 기본값으로 덮어쓰이는 버그 수정

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- FlowTesterController: 테스트 실행 로직 개선
  - 에러 핸들링 강화
  - 응답 형식 표준화
- FlowExecutor: API 호출 실행기 개선
  - 다단계 플로우 지원 강화
  - 변수 바인딩 및 검증 개선
- index.blade.php: UI 개선
  - 테스트 결과 표시 개선
  - 사용성 향상
- routes/web.php: 라우트 정리
- composer.lock: 의존성 업데이트

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- koreanName: 한글 이름 생성 (ko_KR locale 활용)
- employeeCode: 사원코드 생성 (EMP-XXXXXX 형식)
- departmentName: 부서명 랜덤 생성
- positionName: 직급명 랜덤 생성
- dateRange: 날짜 범위 내 랜덤 날짜 생성

HR Employees CRUD 테스트에서 지원하지 않는 Faker 타입으로 인한
422 오류 및 연쇄적인 405 오류 해결

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
JSON 응답에서 객체(연관 배열) 타입을 검증하는 @isObject 연산자 구현
- array_is_list()로 순차 배열과 연관 배열 구분
- $.user 등 객체 필드 검증 시 사용

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 즐겨찾기 클릭 시 404 오류 수정 (selectEndpointByPath 함수 추가)
- 태그명 형식을 "한글명 (English)"로 변경
- 사용자 목록 조회 오류 수정 (user_tenants 피벗 테이블 사용)
- 즐겨찾기 토글 시 페이지 새로고침 없이 로컬 상태 업데이트

🤖 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>
- AppServiceProvider에 Relation::enforceMorphMap 설정 추가
- tokenable_type을 'user' 별칭으로 통일
- mng에서 생성한 토큰을 api에서 사용 시 500 에러 해결

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- ResponseValidator::getValueByPath()에서 [n] 표기법을 .n으로 변환
- 예: $.data.data[0].id → data.data.0.id
- Laravel data_get() 헬퍼 호환성 확보

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- vite.config.js에 rollupOptions.onwarn 설정
- htmx 라이브러리 특성상 eval 사용 필요 (외부 라이브러리)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 오류 카운트 기준: HTTP 상태 → 스텝 실패 여부로 변경
- expect로 4xx 기대하고 성공한 경우 오류로 카운트 안 함
- HTTP 4xx/5xx 응답은 주황색(amber)으로 시각적 구분

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- GlobalMenu 모델에 getSection(), getMeta() 메서드 추가 (import 모드 500 에러 해결)
- table.blade.php: normal 모드에서 체크박스 + 드래그 핸들 분리
- index.blade.php: 선택 삭제/복구/영구삭제 버튼 및 JS 함수 추가
- MenuController: bulkDelete, bulkRestore, bulkForceDelete API 추가
- routes/api.php: bulk 엔드포인트 3개 등록

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- QuoteFormulaRangeService, RangeController 생성
- 범위 CRUD API 엔드포인트 추가 (6개)
- edit.blade.php 탭 구조로 개편 (기본정보/범위/매핑/품목)
- ranges-tab.blade.php 범위 관리 UI 구현
- Alpine.js 기반 인터랙티브 CRUD
Phase 2 - 매핑(Mapping) 관리:
- QuoteFormulaMappingController, QuoteFormulaMappingService 추가
- mappings-tab.blade.php 뷰 생성
- 매핑 CRUD 및 순서 변경 API

Phase 3 - 품목(Item) 관리:
- QuoteFormulaItemController, QuoteFormulaItemService 추가
- items-tab.blade.php 뷰 생성
- 품목 CRUD 및 순서 변경 API
- 수량식/단가식 입력 지원

공통:
- edit.blade.php에 매핑/품목 탭 연동
- routes/api.php에 API 엔드포인트 추가
- LoginToken 모델 수정
- items-bom/crud/search 플로우 데이터 업데이트
- API_FLOW_TESTER_DESIGN 문서 업데이트
- example-flows 뷰 업데이트
- Price.getSalesPriceByItemCode() products/materials → items 테이블 수정
- SeedQuoteFormulasCommand INPUT 카테고리 및 Design 사이트 동기화
  - PC(제품카테고리), PRODUCT_ID(제품명), GT(설치유형)
  - MP(모터전원), CT(제어기), QTY(수량) 필드 추가
- metadata에 field_type, options 정보 추가
- Capacitor 패키지 추가 (@capacitor/core, @capacitor/push-notifications)
- 포그라운드에서 푸시 수신 시 알림 소리 재생
- 알림 소리 파일 추가 (push_notification.wav)
- AdminFcmController, AdminFcmService 추가
- FormRequest 검증 (AdminFcmSendRequest 등)
- Swagger 문서 추가 (AdminFcmApi.php)
- ApiKeyMiddleware: admin/fcm/* 화이트리스트 추가
- FCM 에러 메시지 i18n 추가
- 견적 시뮬레이터 UI 레이아웃 개선 (가로 배치, 반응형)
- FlowTester ConditionEvaluator 클래스 추가 (조건부 실행 지원)
- FormulaEvaluatorService 기능 확장
- DependencyResolver 의존성 해결 로직 개선
- PushDeviceToken 모델 확장 (FCM 토큰 관리)
- QuoteFormula API 엔드포인트 추가
- FlowTester 가이드 모달 업데이트
- items 테이블에 process_type, item_category 필드 추가
- category_groups 테이블 생성 (면적/중량/수량 기반 단가 계산 분류)
- CategoryGroup 모델 및 단가 계산 헬퍼 메서드 구현
- CategoryGroupSeeder: 면적/중량/수량 기반 단가 계산 그룹 3개
- DesignItemSeeder: Design 샘플 품목 99개 (RM:20, SM:25, SF:40, FG:14)
- 완제품 BOM 데이터 포함 (수량 수식 quantityFormula 지원)
주요 변경사항:
- calculateCategoryPrice: 카테고리 기반 단가 계산 (면적/중량/수량)
- groupItemsByProcess: 공정별 품목 그룹화 (screen/bending/steel/electric/assembly)
- calculateBomWithDebug: 10단계 디버깅 정보 포함 BOM 계산
- getItemPrice: items.attributes.salesPrice fallback 추가
- evaluateQuantityFormula: 빈 수식 기본값 1 처리
- expandBomWithFormulas: Design 형식 childItemCode 지원
- DesignItemSeeder: 모든 품목에 process_type 추가
- simulateBom API 엔드포인트 추가 (calculateBomWithDebug 연동)
- simulator.blade.php: BOM 디버깅 모드 탭 추가
  - 10단계 디버그 스텝 패널
  - 공정별 품목 그룹화 표시
  - 원가 요약 (공정별 소계, 총합계)
- FormulaEvaluatorService: currentTenantId 속성 추가
  - 콘솔/API에서 tenant_id 전달 가능하도록 수정
- routes/api.php: simulate-bom 라우트 추가
- 면적/중량기반 단가: final_price 직접 사용 (multiplier 중복 적용 방지)
- 마진값 Design 표준 적용: W+140, H+350 (스크린 기준)
- 수량기반 단가: quantity × unit_price 유지
- renderProcessItem: item.amount → item.total_price (품목별 금액 0원 표시 수정)
- renderCostSummary: subtotals 객체에서 subtotal 값 추출 ([object Object] 표시 수정)
- QuoteFormulaCategorySeeder: 카테고리 4개 (입력변수, 계산변수, 범위선택, 품목매핑)
- QuoteFormulaSeeder: 변수/계산식 19개 (W0, H0, W1, H1, M, K 등)
- QuoteFormulaRangeSeeder: 범위 조건 12개 (모터/가이드레일/케이스 선택)
- QuoteFormulaItemSeeder: 품목 매핑 24개 (FG-SCR-001, FG-STL-001 BOM)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Morph map에 Post, Department 모델 등록 (ClassMorphViolationException 해결)
- 파일 저장 방식을 API 스타일로 변경 (document_id + document_type)
- 파일 미리보기 라우트 및 메서드 추가 (previewFile)
- 게시글 상세 페이지에서 이미지 첨부파일을 본문 상단에 풀 너비로 표시
- 비이미지 첨부파일은 하단에 다운로드 목록으로 분리

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- api_request_logs 테이블 사용으로 변경 (실제 API 호출 기록)
- 기존 admin_api_histories는 API Explorer 테스트 기록용으로 유지
- ApiRequestLog 모델 추가
- URL에서 엔드포인트 경로 추출 (REGEXP_REPLACE 사용)
- DB facade 사용으로 Eloquent accessor 충돌 방지

변경 전: 테스트 호출 2건만 표시
변경 후: 실제 API 호출 857건+ 표시

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- API가 HTMX 요청 시 JSON 대신 순수 HTML 반환하도록 변경
- 불필요한 htmx:afterSwap JSON 파싱 코드 제거

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- /customer-center 라우트 신규 생성
- 활성화된 시스템 게시판만 표시
- 테이블 컬럼: ID, 유형, 코드, 게시판명, 게시글 수, 생성일
- 관리 기능(구분, 필드, 상태, 액션) 제외한 읽기 전용 뷰

🤖 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>
- 사이드바에 hx-boost 적용하여 메인 콘텐츠만 교체
- main-content 영역에 id 부여
- 메뉴 클릭 시 활성화 상태 JavaScript로 처리
- 페이지 전환 시 사이드바 스크롤 위치 유지

🤖 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>
## 수정 내용

### HTMX 응답 형식 수정
- DepartmentController: view 직접 반환 (JSON 래핑 제거)
- MenuController: ->render() 제거하여 SVG 이스케이프 문제 해결

### 사이드바 개선
- hx-boost 적용하여 SPA 스타일 네비게이션 구현
- 메뉴 클릭 시 활성화 상태 즉시 반영
- 스크롤 위치 저장/복원 기능 추가

### 불필요한 코드 제거
- departments/index.blade.php: JSON.parse 코드 제거

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- BoardController: *Board() → *AnyBoard() 메서드로 변경하여 메뉴 연동 활성화
- MenuService: restoreMenuForBoard() 메서드 추가
  - soft-deleted 메뉴 있으면 복원
  - 활성 메뉴가 이미 있으면 스킵 (중복 방지)
  - 둘 다 없으면 새로 생성
- BoardService: restoreAnyBoard()에서 board name 전달하도록 수정

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- createMenuForBoard(): 시스템 게시판 생성 시 global_menus와 menus 테이블 모두에 추가
- deleteMenuForBoard(): 시스템 게시판 삭제 시 GlobalMenu와 Menu 둘 다 삭제
- restoreMenuForBoard(): 시스템 게시판 복원 시 GlobalMenu와 Menu 둘 다 복원

이제 시스템 게시판이 /menus/global과 /menus 페이지 모두에 표시됨

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- createBoard() 메서드에서도 createMenuForBoard() 호출
- 기존에는 createBoardFromTemplate()에서만 메뉴가 생성되었음
- 이제 모든 게시판 생성 경로에서 메뉴 자동 생성됨

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- createMenuForBoard(): 시스템 게시판 생성 시 GlobalMenu + 모든 활성 테넌트의 Menu에 추가
- deleteMenuForBoard(): 시스템 게시판 삭제 시 GlobalMenu + 모든 테넌트의 Menu 삭제
- restoreMenuForBoard(): 시스템 게시판 복원 시 GlobalMenu + 모든 테넌트의 Menu 복원/생성
- /menus 페이지(테넌트 메뉴)에서 시스템 게시판 메뉴가 모든 테넌트에 표시됨

🤖 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>
- createMenuForBoard(): GlobalMenu 조회/생성 후 테넌트 Menu에 global_menu_id 설정
- restoreMenuForBoard(): 복원/생성 시에도 global_menu_id 연결
- is_customized: false 추가하여 글로벌 메뉴 연동 표시

🤖 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>
- MenuService::updateMenuForBoard() 메서드 추가
- 시스템 게시판: global_menus + 연결된 모든 menus URL 업데이트
- 테넌트 게시판: 해당 테넌트의 menus만 URL 업데이트
- BoardService::updateAnyBoard()에서 board_code/name 변경 감지 시 호출

🤖 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>
- Route Model Binding → 수동 조회로 변경 (board_code + tenant_id)
- PostController: resolveBoard() 헬퍼 추가
  - t 파라미터 → 시스템 게시판 → 로그인 회원 tenant 순서
- 사이드바 메뉴 리다이렉트: tenant_id ?? 1 fallback 추가
  - SidebarMenuService와 동일한 로직으로 일관성 확보
- 게시판 목록 테이블에 게시글 수 컬럼 추가
- 모든 posts View에 tenant_id 파라미터 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 본사(tenant_type=HQ) 선택 시: 시스템 게시판 + 본사 게시판 표시
- 일반 테넌트 선택 시: 해당 테넌트 게시판만 표시
- 정렬: is_system DESC 추가 (시스템 게시판 우선)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- FileObserver: 파일 생성/삭제 시 tenant.storage_used 자동 업데이트
- RecalculateTenantStorageCommand: 기존 데이터 재계산 명령어
  - php artisan tenant:recalculate-storage [--tenant=ID] [--dry-run]
- 음수 storage_used 방지 로직 포함

🤖 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>
테넌트 게시판 수정 404 오류:
- BoardService.getBoardById()에 $systemOnly 파라미터 추가
- BoardController.edit()에서 systemOnly=false로 테넌트 게시판 조회 가능
- Api/Admin/BoardController에서 show/update 메서드 테넌트 게시판 지원
- updateAnyBoard() 메서드 사용하여 시스템/테넌트 게시판 공통 수정

메뉴 페이지네이션 쿠키 값 미적용 오류:
- HTMX 요청 시 htmx:configRequest 이벤트로 쿠키 값 적용
- pagination_per_page 쿠키에서 per_page 값 읽어서 요청 파라미터에 설정

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 댓글 라우트 추가 (store, update, destroy)
- PostService에 댓글 관리 메서드 추가
- PostController에 댓글 컨트롤러 메서드 추가
- 게시글 상세 페이지에 댓글 섹션 UI 추가 (AlpineJS)
- 계층형 댓글 지원 (부모/대댓글)
- BoardComment 모델 추가
- HTMLPurifier 패키지 및 설정 추가
- 게시글 목록에 첨부파일/댓글 수 표시

🤖 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>
- DesignPriceSeeder 생성
- items.attributes.salesPrice → prices 테이블 마이그레이션
- 85개 품목 단가 데이터 추가 완료
- 대상: SF-SCR-%, SF-STL-%, SF-BND-%, SM-%, RM-%

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 완제품 조회 순서 변경 (마진값 결정을 위해 선행 조회)
- 제품 카테고리(SCREEN/STEEL)에 따른 마진값 동적 결정
  - 스크린: W+140, H+350
  - 철재: W+110, H+350
- 제품 카테고리에 따른 중량(K) 계산 로직 구현
  - 스크린: M×2 + W0/1000×14.17
  - 철재: M×25
- getItemDetails()에 item_category, process_type 필드 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- FormulaEvaluatorService: 공식 평가 로직 개선
- simulator.blade.php: 시뮬레이터 UI/UX 개선
  - 입력 필드 레이아웃 최적화
  - 계산 결과 표시 개선
  - 에러 처리 강화

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- HTMX 로드 직후 htmx:configRequest 이벤트 리스너를 head에 등록
- 모든 HTMX 요청에서 쿠키의 per_page 값을 적용하도록 수정
- 기존 body 끝의 중복 코드 제거
- 타이밍 이슈로 인한 load 트리거 선행 실행 문제 해결

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- GT(가이드레일): wall/ceiling/floor → 벽면형/측면형
- MP(모터전원): single/three → 220V/380V
- CT(제어기): basic/smart/premium → 단독/연동
- JavaScript 기본값도 동일하게 업데이트

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- items.slice(0, 8) 제거하여 모든 품목 표시
- max-h-80 overflow-y-auto로 스크롤 가능하게 변경

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SampleItemsSeeder: Design sampleQuoteData_Complete.ts와 동일한 데이터 구조
- 원자재 (RM) 20종, 부자재 (SM) 25종
- 스크린 반제품 (SF-SCR) 20종
- 철재/절곡 반제품 (SF-STL/BND) 20종
- 완제품 (FG) 14종 (스크린 5 + 철재 5 + 절곡 4)
- 총 99개 샘플 품목 생성

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 인증 모달에 회사(테넌트) 선택 드롭다운 추가
  - 헤더의 $globalTenants 재사용
  - tenant.switch 라우트와 동기화
  - 회사 변경 시 사용자 목록 자동 갱신

- Bearer 토큰 표시 및 복사 기능 추가
  - 토큰 발급 API 엔드포인트 추가 (POST /dev-tools/api-explorer/issue-token)
  - 현재 상태 영역에 토큰 표시
  - 클립보드 복사 버튼 (Clipboard API + fallback)
  - 적용 후 모달 유지하여 토큰 복사 가능

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- EnsureHQMember: HTMX/AJAX 요청 시 JSON 응답 반환
- EnsureSuperAdmin: HX-Request 헤더 체크 추가
- bootstrap/app.php: 전역 Exception Handler에서 HTMX 요청 처리
- RoleService: SpatieRole → App\Models\Role로 변경하여 테넌트별 역할 분리

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 알림 타입 선택 드롭다운 추가 (6개 타입)
- channel_id 검증 로직 추가
- sound_key 파라미터 제거

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
- htmx:responseError 이벤트에서 401 상태 감지
- SweetAlert2로 세션 만료 알림 표시
- 확인 후 /login 페이지로 자동 이동
- 중복 리다이렉트 방지 플래그 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ApiLogController에서 항상 최신순으로 정렬하도록 변경
- 조건부 정렬 제거하고 고정 내림차순 정렬 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1. /menus 페이지 hx-boost 네비게이션 시 SortableJS 미실행 수정
   - htmx:afterSettle 이벤트로 페이지별 스크립트 초기화
   - menu-sortable.js로 SortableJS 로직 분리
   - 중복 코드 제거

2. 세션 만료 시 자동 갱신 로직 추가
   - /auth/refresh-session 엔드포인트 추가
   - Remember Token으로 자동 재인증 (자동 로그인 사용자)
   - 재인증 실패 시 로그인 페이지 리다이렉트
HTMX 요청 시 HX-Redirect 헤더로 전체 페이지 리로드하여
@push('scripts') 블록의 스크립트가 정상 로드되도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
슬라이드 프레젠테이션 스크립트 로딩을 위해 HX-Redirect 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- MngMenuSeeder에 바로빌 그룹메뉴와 회원사관리 하위메뉴 추가
- BarobillController 생성 (회원사관리 페이지)
- /barobill/members 라우트 추가
- 회원사관리 기본 뷰 파일 생성 (샘플 테이블 포함)

메뉴 적용: php artisan db:seed --class=MngMenuSeeder

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 재무관리 그룹 추가 (콘텐츠 관리 아래)
  - 재무 대시보드
  - 계좌관리
  - 계좌거래내역
  - 자금계획일정
  - 일일자금일보
- 바로빌 그룹을 재무관리 아래에 배치

메뉴 적용: php artisan db:seed --class=MngMenuSeeder

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Docker 컨테이너 목록 및 artisan 실행 방법
- 메뉴 추가/수정 시 시더 실행 절차 문서화
- 메뉴 변경 시 반드시 시더 실행 필요 명시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 레거시 분석 (DB 구조, API, UI 기능)
- Laravel 마이그레이션 계획 (Model, Controller, View)
- 구현 순서 체크리스트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
레거시(sam/sales/barobill/registration)를 Laravel 스타일로 마이그레이션

- Migration: barobill_members 테이블 생성
- Model: BarobillMember (상태 라벨, 사업자번호 포맷팅 등)
- API Controller: CRUD + 통계 조회 (HTMX HTML 반환 지원)
- API Routes: /api/admin/barobill/members/*
- Views:
  - index.blade.php (통계 카드, 필터, 테이블, 모달)
  - partials/table.blade.php (HTMX 테이블)
  - partials/stats.blade.php (통계 카드)
  - partials/modal-form.blade.php (등록/수정 폼, 자동완성)

기능:
- 회원사 목록 조회 (검색, 상태 필터)
- 회원사 등록 (사업자번호 중복 체크)
- 회원사 수정 (모달)
- 회원사 삭제 (확인 후)
- 테스트 데이터 자동완성

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Hash::make() 대신 Laravel encrypted cast 사용
- 비밀번호 복호화 가능하여 바로빌 API 호출 시 평문 전달 가능
- 바로빌 서비스 클릭 시 비밀번호 재입력 절차 불필요
- 수정 모달에서 비밀번호 선택적 입력 가능
- 기존 Hash 저장 데이터를 새로운 encrypted 방식으로 업데이트 가능
- 비밀번호 입력 시에만 업데이트, 빈 값이면 기존 유지
- 바로빌본사 → 바로빌로 이름 변경
- 하위메뉴 추가: 설정, 전자세금계산서, 계좌조회, 카드사용내역, 홈텍스매입/매출, 사용량조회
- 설정 페이지 구현 (이메일, 동기화, API, 알림 설정)
- 나머지 메뉴는 준비중 페이지로 생성
- barobill_companies 테이블에서 barobill_members로 동기화 API 구현
- 바로빌본사 설정 페이지에 테넌트 목록 및 동기화 버튼 추가
- 동기화 시 신규 데이터 생성 및 기존 데이터 업데이트
- 4가지 서비스 옵션 체크박스 추가 (전자세금계산서, 계좌조회, 카드사용내역, 홈텍스매입/매출)
- BarobillSetting 모델 및 BarobillSettingController 생성
- 설정 API 라우트 추가 (/api/admin/barobill/settings)
- 담당자 정보 입력 필드 추가 (이름, 연락처, 이메일)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 프론트엔드: 상세 오류 메시지 표시 추가 (error, error_code)
- BarobillService: 바로빌 API 오류 코드 매핑 확장 (-32xxx 계열)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 회원사 등록 모달에 "바로빌 API 검증 건너뛰기" 체크박스 추가
- 이미 바로빌에 등록된 회원사를 로컬 DB에만 저장 가능
- 수정 시에는 체크박스 숨김 처리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 전체 테넌트 보기 토글 추가 (바로빌본사용)
- 테이블에 테넌트 컬럼 표시 (전체 모드에서)
- 회원사 등록 시 테넌트 선택 기능 추가
- 통계 API에도 전체 테넌트 모드 적용
- 컨트롤러에서 tenant_id 직접 지정 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- UserController index에 HX-Redirect 추가
- HTMX 부분 로드 시 스크립트 미실행 문제 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 신용평가 그룹 메뉴 추가 (MngMenuSeeder)
- 신용평가 조회 하위 메뉴 추가
- CreditController 생성
- 신용평가 조회 페이지 뷰 생성

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CooconConfig 모델 및 마이그레이션 추가
- CooconService 클래스 구현 (OA12~OA17 API)
- CreditController 확장 (설정 관리, 조회 기능)
- 설정 관리 화면 추가 (CRUD, 활성화 토글)
- 사업자번호 조회 화면 업데이트 (API 연동)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 새 설정 추가 시 테스트 URL 기본값으로 채움
- 환경 변경 시 URL 자동 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 숫자 입력 시 자동으로 하이픈 추가
- 붙여넣기 시에도 포맷 적용
- 10자리 검증 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 탭 형태에서 종합 패널 형태로 변경
- 신용요약정보 카드 (OA12) 상단 표시
- 단기연체정보 (OA13) 섹션
- 신용도판단정보 한국신용정보원 (OA14) 섹션
- 신용도판단정보 신용정보사 (OA15) 섹션
- 당좌거래정지정보 (OA16) 섹션
- 법정관리/워크아웃정보 (OA17) 섹션
- 필드명 한글 매핑 및 날짜/금액 포맷팅
- 접기/펼치기 기능 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- credit_inquiries 테이블 마이그레이션 추가
- CreditInquiry 모델 생성 (API 응답 저장, 이슈 카운트 등)
- 조회 이력 리스트 화면으로 변경 (페이지네이션, 필터)
- 원본 데이터 모달 조회 기능 추가
- 신용평가 리포트 모달 (TODO: 가공 형식 구현 예정)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CooconService에 OA08 기업기본정보 API 추가
- NtsBusinessService 신규 생성 (국세청 사업자등록 상태조회)
- CreditInquiry 모델에 회사정보 및 국세청 상태 필드 추가
- 마이그레이션: 기업정보 및 국세청 상태 컬럼 추가
- UI: 리스트에 업체정보/국세청 상태 컬럼 표시
- 원본 데이터 모달에 회사정보 헤더 추가
- 리포트 모달에 회사정보 및 신용요약 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 종합 신용 신호등 (Level 1-4) 구현
- 신용 리스크 프로필 섹션 추가
- 탭 기반 상세 정보 (단기연체/신용도판단/당좌정지/법정관리)
- 거래 승인 판정 섹션 추가
- sales/creditreport/index.php 디자인 참조

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 유동성, 공공기록, 안정성, 성장성, 연체이력 5대 지표 시각화
- SVG 기반 방사형 차트 구현
- 차트 하단 핵심 이슈 요약 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 모달 최대 높이 80vh로 제한
- 외부 컨테이너에 overflow-y-auto 추가
- 상하 여백(py-8) 추가하여 닫기 버튼 접근성 확보

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- EtaxController 생성 (세금계산서 발행/조회/삭제/국세청 전송)
- React 기반 Blade 뷰 페이지 생성
- 라우트 설정 (/barobill/etax)
- 메뉴 시더 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 비활성화된 설정도 카드에 표시되도록 변경
- 설정 목록 형태로 활성/비활성 설정 모두 표시
- 비활성 설정에 활성화 버튼 추가
- 각 설정에 수정 버튼 바로 접근 가능

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- T-ID 열을 첫 번째 열로 추가
- 인디고 원형 배지로 시각적 강조
- 멀티테넌트 구조의 기본 식별자 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 계속사업자(01): 100점 (정상)
- 휴업자(02): 50점
- 폐업자(03): 20점
- 상태 미확인 시 is_active 기반으로 100점 또는 60점

이슈가 없는 정상 기업은 모든 지표에서 100점 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 테넌트 1(코드브릿지엑스, 바로빌 파트너사)이면 자동으로 모든 회원사 표시
- 다른 테넌트는 해당 테넌트의 회원사만 표시
- 본사 접속 시 테넌트 컬럼 자동 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 현재 선택된 테넌트 ID, 회사명, 사업자번호, 대표자, 연락처 표시
- 테넌트 1(본사)인 경우 '파트너사' 배지 표시
- 바로빌 회원사 연동 시 담당자 정보(이름, 연락처, 이메일) 표시
- 미연동 시 회원사 등록 안내 링크 제공

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 세션 키 수정: tenant_id → selected_tenant_id
- 설정이 없거나 담당자 정보가 비어있을 때 바로빌 회원사 정보를 기본값으로 사용
- 담당자명, 연락처, 이메일 자동 매핑

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 현재 테넌트 ID, 회사명, 파트너사 배지 표시
- 바로빌 회원사 정보(사업자번호, 대표자, 담당자, 바로빌ID) 표시
- 공급자 정보를 현재 테넌트의 바로빌 회원사 정보로 동적 변경
- DB에서 활성화된 바로빌 설정 조회하도록 변경
- SOAP 연결 상태 표시 개선

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- InvoicerParty에 ContactID 필드 추가 (기본값: cbx0913)
- TaxRegID, BizType, BizClass, TEL, HP 등 누락 필드 추가
- InvoiceeParty에도 동일한 필드 추가
- TaxInvoiceTradeLineItem에 PurchaseExpiry, Information, Description 추가
- 레거시 barobill_config.php와 동일한 구조로 맞춤

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>
- Tailwind 그라데이션 클래스가 컴파일되지 않는 문제 해결
- background, color 등 인라인 스타일 사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 세금계산서 발행 시 tenant_id 저장
- 조회 시 현재 테넌트의 세금계산서만 표시
- 테넌트 1(본사)이면 모든 세금계산서 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 시작일/종료일 날짜 필터 추가
- 기본값: 현재 월 1일~말일
- 이번 달/지난달 빠른 조회 버튼
- 발행 내역 테이블 스크롤 기능 (max-height: 500px)
- 통계 카드도 필터된 데이터 기준으로 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- style={{ }} 구문이 Blade {{ }}로 해석되는 문제
- style={ {} } 형식으로 변경하여 Blade 파싱 우회

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- EaccountController.php: 바로빌 BANKACCOUNT.asmx SOAP API 연동
  - GetBankAccountEx: 등록된 계좌 목록 조회
  - GetPeriodBankAccountTransLog: 계좌 입출금내역 조회
- index.blade.php: React 기반 UI (전자세금계산서와 동일 구조)
  - 테넌트 정보 카드
  - 통계 카드 (입금/출금/계좌수/거래건수)
  - 계좌 선택 버튼
  - 기간 조회 필터 (이번달/지난달 버튼)
  - 입출금 내역 테이블 (스크롤)
- 라우트 추가: /barobill/eaccount
- 메뉴 시더 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 전자세금계산서/계좌조회 페이지와 동일한 형식의 테넌트 카드
- 보라색 그라디언트 스타일로 설정 페이지 구분
- 바로빌 회원사 정보 표시 (사업자번호, 대표자, 담당자, ID)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Tailwind 클래스가 적용되지 않아 흰색 글씨가 안 보이는 문제 수정
- 전자세금계산서 페이지와 동일한 인라인 스타일로 변경
- 불필요한 기존 코드 삭제

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 바로빌 비밀번호가 없으면 명확한 에러 메시지 반환
- validateMemberForUrlApi 헬퍼 메서드 추가로 중복 코드 제거
- 적용 메서드: 계좌등록, 계좌관리, 카드등록, 카드관리, 세금계산서 등

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- API 응답에 has_password 필드 추가
- 모달 폼에 비밀번호 상태 뱃지 (설정됨/미설정) 표시
- 수정 시 녹색(설정됨) 또는 빨간색(미설정) 뱃지로 구분

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- BAROBILL_CERT_KEY_TEST: 테스트 환경용
- BAROBILL_CERT_KEY_PROD: 운영 환경용
- BAROBILL_TEST_MODE에 따라 자동 선택

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- BankTransaction 모델: 입출금 내역 저장 (계정과목 포함)
- 바로빌 데이터와 DB 저장 데이터 매칭하여 계정과목 유지
- 계정과목 드롭다운 선택 및 저장 기능
- 엑셀(CSV) 다운로드 기능
- 저장된 행은 녹색 배경으로 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 기존 bank_transactions 테이블과 충돌 방지
- 테이블명을 barobill_bank_transactions로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 로컬 showToast를 notify로 변경하여 전역 함수와 충돌 방지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- decimal과 float 형식 차이로 매칭 실패하는 문제 수정
- 금액을 정수로 변환하여 키 생성

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 상대방 레이블을 상대계좌예금주명으로 변경
- AccountName 필드 우선 확인 (Cast fallback)
- EaccountController CERTKEY 테스트/운영 분리 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 취급점(수단) 열 추가 (바로빌 transOffice 필드)
- 상대계좌예금주명 직접 입력 가능하도록 input 필드로 변경
- 저장된 상대계좌예금주명 값 로드 시 병합
- 엑셀 내보내기에 취급점 열 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- account_codes 테이블 및 모델 생성
- 더존 표준 계정과목 163개 시더 추가
- 계정과목 CRUD API 추가 (추가/수정/삭제/조회)
- 계정과목 설정 모달 UI 구현
- 분류별 필터링 및 검색 기능
- 사용/미사용 토글 기능

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 단순 select를 검색 가능한 커스텀 드롭다운으로 변경
- 코드 또는 이름으로 실시간 검색
- 선택값 초기화(X) 버튼 추가
- 외부 클릭 시 드롭다운 닫힘

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- EcardController: 카드 목록/사용내역 조회, 계정과목 저장, 엑셀 내보내기
- CardTransaction 모델: 카드 사용내역 저장 및 고유키 매칭
- 마이그레이션: barobill_card_transactions 테이블 생성
- React 기반 UI: 카드 선택, 기간 조회, 계정과목 검색/선택 기능
- MngMenuSeeder 메뉴 URL 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- GetCardEx2 사용으로 레거시 코드와 동일하게 수정
- CardEx 배열 파싱 로직 수정
- 카드 상태 이름 변환 함수 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 명시적인 조회 버튼으로 사용자가 원할 때 데이터 새로고침 가능
- 이번 달/지난달 버튼 옆에 조회 버튼 배치

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 레거시와 동일한 에러 코드 사용
- -24005: 조회 데이터 없음
- -24001: 등록된 카드 없음

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CardApprovalLogList → CardLogList (레거시와 동일)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 미래 날짜로 조회 시 바로빌 API가 데이터를 반환하지 않는 문제 해결
- 이번달: 1일 ~ 오늘
- 지난달: 1일 ~ 마지막날

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- API 호출 파라미터 로깅
- SOAP 응답 데이터 구조 로깅
- 에러 코드 및 파싱 결과 로깅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CardTransactionSplit 모델 및 마이그레이션 추가
- EcardController에 splits, saveSplits, deleteSplits API 추가
- 분개 라우트 추가 (GET/POST/DELETE /barobill/ecard/splits)
- 프론트엔드 SplitModal 컴포넌트 추가
- 각 거래 행에 +/- 버튼으로 분개 추가/삭제
- 분개 행 시각적 구분 (들여쓰기, 배경색)
- 분개 금액 합계 검증
- 고유키(cardNum|useDt|approvalNum|amount)로 원본 데이터 연결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- updateSplit 함수를 객체로 여러 필드 한 번에 업데이트하도록 변경
- React 상태 배칭 문제 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 할부(paymentPlanName) 열 제거
- 구분(approvalTypeName) 열 제거
- 분개 행의 colspan 조정 (10→8열)
- 빈 데이터 행의 colspan 조정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 공제 열: 사업자번호 유무에 따라 공제/불공제 표시
- 증빙/판매자상호 열: 가맹점명 + 사업자번호 표시
- 내역 열: 업종 또는 메모 표시
- 기존 가맹점 열을 새로운 구조로 재배치
- 분개 행 colspan 조정 (3→5)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 공제 필드: 공제/불공 선택 가능 (불공은 적색 표시)
- 증빙/판매자상호 필드: 텍스트 입력으로 수정 가능
- 내역 필드: 텍스트 입력으로 수정 가능
- CardTransaction 모델에 deduction_type, evidence_name, description 필드 추가
- 마이그레이션 추가
- 컨트롤러에서 새 필드 저장/로드 처리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 너비 1.5배 증가 (min-width: 70px, padding 증가)
- 폰트 크기 증가 (text-xs → text-sm)
- 불공 선택 시 강한 붉은색 배경 (bg-red-500 text-white)

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>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 고정 너비 w-[100px] 적용
- 오른쪽 패딩 추가 (pr-8) - 드롭다운 화살표 공간 확보
- 좌우 패딩 증가 (px-4)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SplitModal에 증빙/판매자상호, 내역 입력 필드 추가
- CardTransactionSplit 모델에 evidence_name, description 필드 추가
- 마이그레이션으로 splits 테이블에 새 컬럼 추가
- 분개 저장/로드 시 새 필드 처리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SplitModal에 공제/불공 선택 드롭다운 추가
- 공제: 녹색 배경, 불공: 붉은색 배경
- CardTransactionSplit 모델에 deduction_type 필드 추가
- 마이그레이션으로 splits 테이블에 deduction_type 컬럼 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 부모 행: 분개된 경우 공제 열에 "-" 표시
- 분개 행: 각 분개별 공제/불공 배지 표시
- 분개 행 레이아웃 개선: 공제, 증빙/판매자상호, 내역, 금액, 계정과목 열 배치

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 분개 복구 버튼 추가 (기존 분개가 있을 때만 표시)
- 클릭 시 확인 후 분개 삭제 및 원본 거래로 복원
- 복구 버튼 스타일: 붉은색 테두리/텍스트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CSV 헤더에 공제여부, 증빙/판매자상호, 내역, 메모 열 추가
- 구분 열 추가: 일반/원본/분개 구분 표시
- 분개된 거래: 원본 행 + 각 분개 행으로 출력
- 분개 행: └ 분개 #N 형식으로 표시
- 분개별 공제여부, 금액, 계정과목 개별 출력

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 금액 입력 시 3자리마다 콤마 자동 추가
- type="number" → type="text"로 변경
- 금액 우측 정렬 (text-right)
- formatAmountInput/parseAmountInput 헬퍼 함수 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- GET → POST 방식으로 변경
- 저장된 DB 데이터 대신 현재 화면에 표시된 데이터 내보내기
- 프론트엔드에서 logs, splits 데이터를 JSON으로 전송
- Blob 다운로드 방식으로 파일 저장
- 금액 필드에 콤마 포맷팅 적용

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>
- API에서 ApprovalType이 "승인"/"취소" 한글 텍스트로 반환되는 문제 해결
- 기존: '1', '0', '' 만 승인으로 처리 (한글 "승인" 누락)
- 수정: '2', '취소'가 아닌 경우 모두 승인으로 처리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- toggleActive, toggleHidden 함수를 낙관적 업데이트 방식으로 변경
- 토글 클릭 시 즉시 UI 상태 변경 후 백엔드 비동기 요청
- 실패 시에만 원래 상태로 롤백 및 에러 토스트 표시
- 일반 메뉴, 글로벌 메뉴 페이지 모두 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- HometaxController 생성 (HOMETAX.asmx SOAP API 연동)
- 매출 세금계산서 목록 조회 (GetHomeTaxTIBySalesEx)
- 매입 세금계산서 목록 조회 (GetHomeTaxTIByPurchaseEx)
- 홈택스 수집 요청 및 상태 조회 기능
- React 기반 UI (매출/매입 탭 전환, 통계 대시보드)
- CSV 엑셀 다운로드 기능

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>
- HOMETAX.asmx는 존재하지 않음 (404)
- 홈택스 API는 TI.asmx (세금계산서 서비스)에 포함됨

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- GetHomeTaxTIBySalesEx → GetTaxInvoiceSalesListEx
- GetHomeTaxTIByPurchaseEx → GetTaxInvoicePurchaseListEx
- parseInvoices() 응답 구조 수정
- 홈택스 수집 기능 별도 구독 필요 안내 추가
- getProperty() 헬퍼로 property_exists 체크
- TaxType/TaxKind 등 필드명 fallback 처리
- WriteDate/IssueDate 대체 필드 지원
- callSoap에서 Encoding 오류 감지 시 parseRawXmlResponse 호출
- __getLastResponse()로 Raw XML 가져와 SimpleXML 파싱
- xmlToObject 헬퍼로 stdClass 변환
- Laravel Http 파사드로 SOAP 요청 전송
- buildSoapRequest()로 XML 요청 생성
- parseSoapResponse()로 응답 XML 파싱
- SOAP 인코딩 오류 우회
- TaxType, DateType 필수 파라미터 추가
- SimpleTaxInvoiceEx 응답 구조에 맞게 파싱 수정
- AmountTotal, TaxTotal, TotalAmount 필드 사용
- 과세유형/영수청구 코드 정수형 처리 추가
- SOAPAction: http://ws.baroservice.com/ 사용
- XML 네임스페이스: http://ws.baroservice.com/ 사용
- HometaxController에 서비스 진단 메소드 추가 (diagnose)
- 홈택스 스크래핑 URL 조회 메소드 추가 (getScrapRequestUrl)
- 홈택스 스크래핑 갱신 요청 메소드 추가 (refreshScrap)
- 뷰에 서비스 진단 모달 UI 추가
- 라우트: scrap-url, refresh-scrap, diagnose 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 상단에 조회 기간 카드 추가 (날짜 선택, 이번 달/지난달 버튼, 조회 버튼)
- 현재 조회 기간 및 매출/매입 건수 표시
- InvoiceTable 컴포넌트 간소화 (중복 날짜 필터 제거)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CorpNum을 파트너사 사업자번호 대신 테넌트 사업자번호로 변경
- 바로빌 회원사 정보 없을 때 명확한 에러 메시지 반환
- 에러 메시지 개선 (-10008, -60001 등)
- 진단 기능에서 파트너사/테넌트 사업자번호 구분 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CorpNum은 파트너사 인증용 (CERTKEY와 매칭)
- UserID만 테넌트별 바로빌 ID 사용
- 카드 API와 동일한 구조로 통일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 테넌트 ID를 항상 표시 (currentTenant가 없어도)
- 배지 크기 및 스타일 개선
- 테넌트 정보 없을 때 안내 메시지 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 홈택스 스크래핑 서비스 미신청 에러 메시지 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
레거시 sales 시스템에서 MNG로 마이그레이션:
- 마이그레이션: sales_managers, sales_prospects, sales_records 등 6개 테이블
- 모델: SalesManager, SalesProspect, SalesRecord 등 6개 모델
- 컨트롤러: SalesManagerController, SalesProspectController, SalesRecordController
- 뷰: managers, prospects, records CRUD 화면
- 라우트: /sales/* 경로 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- MngMenuSeeder에 영업관리 메뉴 그룹 추가
  - 영업담당자 관리 (/sales/managers)
  - 가망고객 관리 (/sales/prospects)
  - 영업실적 관리 (/sales/records)
- 담당자 등록 화면에 번개 아이콘 자동입력 기능 추가
  - 랜덤 샘플 데이터 자동 채우기

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AuditLogController: 목록/상세 조회, 필터링(액션/테넌트/날짜/검색)
- AuditLog 모델: 재고 변동 액션 및 참조 타입 상수 정의
- Blade 뷰: 통계 카드, 필터, 아코디언(Before/After JSON), 상세 페이지
- 메뉴 DB 등록: 시스템 설정 하위에 감사 로그, 삭제된 데이터 백업 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
영업관리 테이블 마이그레이션 파일을 API 프로젝트로 이동
(서버 환경에서 API에서 마이그레이션 실행하기 때문)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 16개 마이그레이션 파일 삭제 (API로 이동 완료)
- MNG는 Laravel 기본 마이그레이션만 유지
- 아키텍처 원칙: 모든 DB 작업은 API에서 관리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- users, cache, jobs 테이블 마이그레이션 삭제
- MNG migrations 폴더 비움 (DB는 전부 API에서 관리)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- MNG에서 마이그레이션 파일 생성 금지 명시
- 모든 DB 작업은 API 프로젝트에서 수행
- MNG database 폴더 상태 및 허용/금지 사항 정리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 테넌트 설정 페이지 (재고관리 품목유형 등)
- 공통코드 관리 페이지 (글로벌/테넌트별 코드 관리)
- 메뉴 동기화 기능 (로컬↔개발↔운영 환경간 메뉴 Push/Pull)
- SSL verify_peer, verify_peer_name 비활성화
- WSDL 캐시 비활성화 (WSDL_CACHE_NONE)
- 오류 -11102 "CERTKEY가 유효하지 않습니다" 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- GetLoginURL은 CORPSTATE.asmx 서비스 메서드라 TI.asmx에서 호출 불가
- 잔액 조회(GetBalanceCostAmount)로 기본 연결 및 인증 테스트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 초기 로드 시 매출만 먼저 조회
- 매입 탭 선택 시 매입 데이터 조회
- loadData를 loadSalesData, loadPurchaseData로 분리
- loaded 플래그로 중복 로드 방지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 문서양식관리 CRUD 기능 구현 (생산관리 > 문서양식관리)
- 결재라인, 섹션, 컬럼 동적 관리 (Vanilla JS)
- 섹션별 이미지 업로드 기능
- SortableJS 드래그앤드롭 순서 변경
- 문서 미리보기 모달
- document_type 글로벌 코드 추가 (품질, 생산, 영업, 구매, 일반, 기타)
- 역할/부서 권한 토글 시 페이지 새로고침 방지 (hx-swap="none")

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- BarobillUsageService: 사용량 집계 로직 (계좌/카드/세금계산서/홈텍스)
- BarobillUsageController: API 엔드포인트 (목록/통계/상세/엑셀)
- HTMX 기반 UI: 기간필터, 통계카드, 테이블, 상세모달
- 서비스별 단가 적용 (세금계산서 100원, 그 외 10원)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 바로빌 설정 화면과 동일한 스타일의 보라색 그라데이션 카드
- 테넌트 ID, 회사명, 사업자번호, 대표자, 담당자, 바로빌 ID 표시
- 파트너사(테넌트 1) 배지 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 모델: BarobillSubscription, BarobillBillingRecord, BarobillMonthlySummary
- 서비스: BarobillBillingService (구독/과금 처리 로직)
- API 컨트롤러: BarobillBillingController (구독/과금 CRUD)
- 뷰: 과금 현황 탭, 구독 관리 탭, 통계 카드, 상세 모달
- 라우트: 웹/API 라우트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 바로빌 그룹에 과금관리 메뉴 항목 추가
- 아이콘: currency-dollar
- 라우트: barobill.billing.index

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 월정액 상품(계좌조회, 카드사용내역, 홈텍스)에서 "건당 X원" 문구 제거
- 월정액 상품의 금액 표시 제거 (건수만 표시)
- 총 과금액을 건별 과금액으로 변경 (전자세금계산서만 해당)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- BarobillPricingPolicy 모델 추가
- BarobillPricingPolicySeeder 추가 (초기 정책 데이터)
- 과금관리 페이지에 정책 관리 탭 추가 (본사 전용)
- 정책 수정 모달 및 API 엔드포인트 추가
- BarobillUsageService에서 DB 정책 사용하도록 수정

정책 항목:
- 법인카드 등록: 기본 3장, 추가 1장당 5,000원
- 계산서 발행: 기본 100건, 추가 50건당 5,000원
- 계좌조회 수집: 기본 1계좌, 추가 1계좌당 10,000원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 삭제된 PRICE 상수 참조 제거
- calculateBillingByPolicy() 메서드로 세금계산서 과금 계산
- 월정액 서비스(계좌, 카드, 홈텍스)는 사용량 조회에서 금액 미표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- priceInfo['price'] → description 표시로 변경
- hometax 기본 정책 정보 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 계좌조회: 거래건수 → 등록 계좌 수 (getBankAccounts API)
- 카드: 사용내역 건수 → 등록 카드 수 (getCards API)
- 세금계산서: 발행 건수 유지 (건별 과금)
- 통계카드, 테이블 헤더, 상세모달 라벨 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 메뉴 동기화(push/pull) 기능과 충돌 방지
- 시더 실행 시 모든 메뉴가 forceDelete되는 문제 해결
- 이제 메뉴 관리는 /menus/sync 화면에서만 수행

Co-Authored-By: Claude <noreply@anthropic.com>
- 이메일 또는 아이디로 로그인 가능
- 아이디 로그인은 본사(HQ) 소속 직원만 허용
- LoginRequest에 isEmail(), getLoginField(), getCredentials() 메서드 추가
- AuthService.login()에 loginField 파라미터 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SalesDashboardController 생성
- 대시보드 뷰 생성 (/sales/salesmanagement/dashboard)
- 전체 누적 실적, 기간별 조회, 역할별 수당 상세 섹션

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- tenantStats 데이터 추가 (관리 테넌트, 총 가입비 실적, 누적 가입비 수당, 확정 가입비 수당)
- 실적 데이터 없음 안내 섹션 추가
- 수익 및 테넌트 관리 통계 카드 4개 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 기간별 조회 및 실적 새로고침 시 전체 페이지가 아닌 데이터 영역만 갱신
- partial 뷰 분리 (stats, commission-by-role, tenant-stats, no-data)
- 컨트롤러에 refresh 메서드 추가
- 로딩 인디케이터 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 새로고침 버튼에 현재 기간 정보(period, start_date, end_date)를 hx-vals로 전달

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 테넌트 선택: 헤더에서 선택된 테넌트 기준으로 동작
- UI 개선: 레벨 뱃지(Lv.2, Lv.3), 동기화 필요 메뉴만 체크박스 활성화
- 전체선택 체크박스 추가 (로컬/원격 각각)
- 선택된 메뉴 개수 표시 (Push/Pull 버튼 옆)
- 상위 메뉴 선택 시 하위 메뉴 자동 선택
- Pull 시 부모 메뉴 이름 기반 매핑 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SalesManagerController: User 시스템 기반으로 재구현
- SalesManagerService: 영업담당자 CRUD, 승인/반려 로직
- SalesManagerDocument: 멀티파일 업로드 모델
- User 모델에 parent, approval 관계 및 메서드 추가
- SalesRoleSeeder: 영업 역할 시더 (sales_operator, sales_admin, sales_manager)
- 뷰 파일 전면 수정 (역할 체크박스, 멀티파일 업로드, 승인/반려 UI)
- 라우트 추가 (approve, reject, documents)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 직위/계층/역할 분리 개념 정의
- 조직 구조 및 수당 체계 설명
- 데이터베이스 구조 문서화
- 개발 로드맵 정리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 역할 위임/부여/제거 기능 추가 (delegateRole, assignRole, removeRole)
- '상위 관리자' → '추천인(유치자)' 용어 변경
- 역할 코드 변경: sales_operator/sales_admin/sales_manager → sales/manager/recruiter
- 뷰 파일 전면 수정 (영업파트너 구조 반영)
- 역할 관리 UI 추가 (show.blade.php)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- TenantProspect 모델, 서비스, 컨트롤러 추가
- 명함 등록 시 2개월 영업권 부여
- 만료 후 1개월 쿨다운 기간 적용
- 테넌트 전환 기능 구현
- 사업자번호 중복 체크 API 추가
- 명함 이미지 업로드 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 입력 시 자동으로 000-00-00000 형식 적용
- 숫자만 입력해도 자동 변환
- 중복확인 시 형식 검증 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AiConfig 모델: AI API 설정 관리
- BusinessCardOcrService: Gemini Vision API 호출
- BusinessCardOcrController: OCR API 엔드포인트
- AiConfigController: AI 설정 CRUD
- create.blade.php: 드래그앤드롭 명함 인식 UI
- AI 설정 관리 페이지 추가
- 함수들을 window 객체에 명시적으로 할당
- 이벤트 리스너를 DOMContentLoaded 안에서 등록
- IIFE 패턴으로 스코프 분리
- data attribute 방식으로 JSON 전달 변경
- hidden 클래스 CSS 명시적 정의
- 페이지 로드 시 모달 강제 닫기
- showToast 함수 추가
- 명함추출로직.md 기술문서 작성

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SalesProspect 모델에 business_card_image 필드 추가
- hasBusinessCard(), business_card_url 접근자 추가
- SalesProspectController store/update에 이미지 저장 로직
- create.blade.php에 이미지 데이터 전송 hidden input 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SalesProspect 모델: id_card_image, bankbook_image 필드 추가
- hasIdCard(), hasBankbook() 메서드 및 URL 접근자 추가
- SalesProspectController: store/update/destroy에 처리 로직 추가
- create.blade.php: 드래그앤드롭 업로드 UI 추가
- edit.blade.php: 기존 이미지 표시 및 교체 UI 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Google AI Studio API에서 Vertex AI API로 전환
- 서비스 계정 OAuth2 인증 방식 적용
- JWT 토큰 생성 및 액세스 토큰 획득 로직 추가
- 서비스 계정 파일 다중 경로 검색 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- /var/www/sales/apikey/ 경로 우선 검색
- Docker 볼륨 마운트된 sales 폴더에서 접근 가능

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AiConfig 모델에 Vertex AI 헬퍼 메소드 추가
- AI 설정 UI에 인증 방식 선택 (API 키 / Vertex AI)
- Vertex AI 선택 시 프로젝트 ID, 리전, 서비스 계정 경로 입력
- BusinessCardOcrService가 DB 설정 기반으로 동작
- Google AI Studio와 Vertex AI 모두 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- api_key NOT NULL 제약 해결 (Vertex AI 모드에서 플레이스홀더 값 사용)
- 모달 백그라운드 클릭 시 닫히지 않도록 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Vertex AI는 contents에 role: 'user' 필수
- Google AI Studio와 Vertex AI 분기 처리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- fillable에 id_card_path, bankbook_path 추가
- hasIdCard(), hasBankbook() 메소드 추가
- id_card_url, bankbook_url 속성 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- tenant 디스크에 url 설정 추가
- public/tenant-storage 심볼릭 링크 추가
- visibility를 public으로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 페이지 로딩 시 블러 오버레이 + 프로그레스 바 추가
- 모든 스크립트 로드 완료 후 오버레이 fade-out
- 메뉴 그룹 상태를 서버에서 기본 펼침으로 렌더링
- localStorage 기반 메뉴 상태 CSS 즉시 적용
- FOUC(Flash of Unstyled Content) 방지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CategoryController: 카테고리 관리 페이지
- CategoryApiController: 테넌트별 카테고리 CRUD API
- GlobalCategoryApiController: 글로벌 카테고리 관리 API
- Category, GlobalCategory 모델 추가
- 카테고리 관리 뷰 (index, partials)
- config/categories.php 설정 파일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- sidebar-static.blade.php: 메뉴 항목 제거
- routes/web.php: 라우트 제거
- ManagementController.php: cardApiReport 메서드 제거
- card-api-report.blade.php: 뷰 파일 삭제

Co-Authored-By: Claude <noreply@anthropic.com>
- sidebar-static.blade.php: 메뉴 항목 제거
- routes/web.php: 라우트 제거
- StrategyController.php: qaSolution 메서드 제거
- qa-solution.blade.php: 뷰 파일 삭제
- DB 메뉴 삭제 (ID: 15536)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
- ManagementController.php 삭제
- lab/management/ 뷰 디렉토리 전체 삭제 (11개 파일)
- sidebar-static.blade.php에서 M. Management 섹션 제거
- routes/web.php에서 lab.management.* 라우트 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- S | A | M 탭에서 M 버튼 제거 (하위 메뉴 없음)
- 이전에 삭제된 라우트 참조 제거:
  - stablecoin, kodata-vs-nice, barobill-vs-popbill
  - qa-solution, business-ocr

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 축소 상태 플라이아웃에서 M 버튼 제거
- 이제 S, A 탭만 표시됨

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 메인 탭 버튼에서 M 제거
- M. Management 메뉴 패널 제거
- 플라이아웃 M 탭 버튼 제거
- 플라이아웃 M. Management 패널 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- routes/web.php에서 sam-ai-menu, sam-ai-alarm 라우트 제거
- AIController에서 samAiMenu, samAiAlarm 메서드 제거
- sidebar-static.blade.php에서 메뉴 항목 제거
- sam-ai-menu.blade.php, sam-ai-alarm.blade.php 뷰 파일 삭제

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- route() 호출 전 Route::has() 체크 추가
- 라우트가 없는 경우 url 또는 # 사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- prospects/create, edit, show에서 신분증/통장 사본 업로드 UI 제거
- SalesManagerDocument DOCUMENT_TYPES를 등본사본, 통장사본만 유지
- 계약서는 모두의싸인 통해 별도 처리 예정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AI 명함 인식에서 이미 이미지 업로드되므로 별도 명함 이미지 필드 제거
- 관련 JavaScript 코드 정리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 파일 선택 버튼 → 드래그앤드롭 존으로 변경
- 파일 미리보기 (이미지/문서 타입별)
- 파일 삭제 기능
- create, edit 페이지 동일하게 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- TaxType: 0(전체) → 1(과세+영세), 3(면세) 각각 조회 후 합침
  (바로빌 API에서 TaxType=0은 미지원)
- DateType: 1(작성일) → 3(전송일자)로 변경 (권장사항)
- 에러 메시지 업데이트:
  - -11010: 과세형태 오류 안내
  - -10008: 날짜형식 오류 안내 (YYYYMMDD)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- TaxType, DateType, 날짜형식 오류 해결 과정 문서화
- 최종 작동 파라미터 및 코드 예시 포함

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 공급일자 → 작성일자로 명칭 변경
- 전송일자 컬럼 추가 (목록 및 상세 모달)
- sendToNts 메서드에서 sentAt 타임스탬프 기록

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 모바일에서 직접 카메라로 명함 촬영 가능
- capture="environment" 속성으로 후면 카메라 기본 사용
- 기존 파일 업로드와 카메라 촬영 버튼 병행 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- sidebar-static.blade.php: 3개 메뉴 항목 제거
- routes/web.php: 해당 라우트 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- StrategyController: tax(), debt(), mrpOverseas() 메서드 제거
- views/lab/strategy/: tax, debt, mrp-overseas 뷰 파일 삭제

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- TenantProspectController: business_card_image_data (Base64) validation 및 처리 추가
- TenantProspectService: saveBase64Image 메서드 추가로 Base64 이미지 저장 지원
- OCR로 인식한 명함 이미지가 DB에 정상 저장되도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AutoLoginViaRemember: 세션 만료 시 remember_token으로 자동 로그인
- HQ 소속/활성 상태 검증
- API 토큰 자동 재발급
- web 미들웨어 그룹에 등록

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CreditUsageController: 조회회수 집계 컨트롤러 신규 생성
- credit/usage/index.blade.php: 집계 화면 (월별/연간/기간별)
- 과금 정책: 월 5건 무료, 추가건당 2,000원
- 본사(tenant_id=1)는 전체 테넌트 조회 가능
- CreditInquiry 모델에 tenant_id 필드 추가
- 신용평가 조회 시 tenant_id 저장하도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 각 select 요소에 min-width 적용
- w-full로 컨테이너 너비에 맞춤
- 글씨 잘림 현상 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- hometax_purchase: 홈택스 매입 수집 정책
- hometax_sales: 홈택스 매출 수집 정책
- 기본 100건 제공, 추가 50건당 3,000원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 분류: CommonCode → DocumentTemplate에서 group by 조회
- 분류 입력: select → input + datalist (자유입력 + 자동완성)
- 회사정보 입력 필드 제거 (tenant에서 자동 조회)
- 미리보기: tenant 회사명 자동 표시

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 그룹 헤더: text-sm font-semibold (기존 text-xs font-bold uppercase)
- 하위 메뉴: font-normal (기존 font-medium)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 헤더에 검색 아이콘 추가 (클릭 시 검색창 토글)
- 실시간 메뉴 필터링 (검색어 입력 시 즉시 반영)
- 검색어 하이라이트 표시
- X 버튼으로 검색 모드 종료
- Ctrl+K / Cmd+K 단축키 지원
- ESC 키로 검색 닫기

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- sidebar-expanded-only 클래스가 hidden을 오버라이드하는 문제 해결
- !important로 hidden 클래스 우선순위 보장
- 사이드바 접힌 상태에서 검색창 숨김 처리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- pl-8 → pl-10으로 변경하여 여유 공간 확보

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- left-2.5 → left-3.5로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- localStorage에 검색 활성화 상태 및 검색어 저장
- 페이지 로드 시 검색 상태 자동 복원
- 검색창 닫기 시에만 상태 초기화

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 새로고침 후에도 검색창 닫으면 전체 메뉴 표시
- originalMenuState가 없어도 모든 메뉴 복원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- App\Models\Tenant → App\Models\Tenants\Tenant

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 테넌트 목록 표시 (업체명, 담당자, 등록일)
- 계약관리 버튼 (영업 진행, 상세계약 설정, 매니저 진행)
- 행 클릭 시 상세 정보 토글
- 신규 테넌트 등록 버튼 제외 (가망고객 관리에서 처리)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- registered_by로 현재 로그인 사용자가 등록한 테넌트만 조회
- 영업 진행 버튼 → 영업실적 등록 페이지 연결
- 상세계약 설정 버튼 → 테넌트 편집 페이지 연결
- 매니저 진행 버튼 → 영업담당자 관리 페이지 연결
- 삭제 버튼에 확인 다이얼로그 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- registered_by 컬럼 대신 user_tenants 관계 사용
- 현재 사용자가 속한 테넌트 중 HQ 제외하고 조회

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- customer → STD (ENUM 허용값에 맞게 수정)
- created_by 필드 제거 (테이블에 없는 컬럼)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- code 필드 추가 (T + 날짜 + 랜덤 4자리)
- 예: T260128ABC1

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 전환한 사용자를 새 테넌트에 자동 연결
- 대시보드에서 관리 테넌트로 표시되도록 함

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 영업/매니저 시나리오 모달 구현 (6단계 체크리스트)
- 상담 기록 기능 (텍스트, 음성, 첨부파일)
- 음성 녹음 + Speech-to-Text 변환
- 첨부파일 Drag & Drop 업로드
- 매니저 지정 드롭다운

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Document 관련 모델 4개 생성 (Document, DocumentApproval, DocumentData, DocumentAttachment)
- DocumentController 생성 (목록/생성/상세/수정 페이지)
- DocumentApiController 생성 (AJAX CRUD 처리)
- 문서 관리 뷰 3개 생성 (index, edit, show)
- 웹/API 라우트 등록

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 가로 탭 → 좌측 세로 탭(사이드바 스타일)으로 변경
- 코드 그룹이 많아져도 세로 스크롤로 확인 가능
- 우측 글로벌/테넌트 2컬럼 그리드 유지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CommonCodeSyncController, CategorySyncController 생성
- 환경설정은 메뉴 동기화와 공유 (TenantSetting)
- Export/Import API 추가 (/common-code-sync, /category-sync)
- Push(로컬→원격), Pull(원격→로컬) 양방향 동기화
- 동일 코드 존재 시 체크박스 비활성화 (충돌 방지)
- 글로벌 + 테넌트 코드 모두 동기화 가능
- 공통코드/카테고리 관리 페이지에 동기화 버튼 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 환경 탭 앞에 글로벌/테넌트 토글 버튼 추가
- 글로벌: tenant_id가 NULL인 코드/카테고리만 표시
- 테넌트: 현재 선택된 테넌트의 데이터만 표시
- Push/Pull API에 type 파라미터 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- InspectionTemplateSeeder: 검사항목 4개(겉모양, 두께, 폭, 길이) 생성
- 템플릿 미리보기를 React 성적서 양식과 동일한 형태로 구현
  - 헤더: 로고, 제목, 결재란
  - 기본정보 테이블 (목업 데이터)
  - 검사항목 테이블: NO, 검사항목, 검사기준, 검사방식, 검사주기, 측정값(n1,n2,n3), 판정
  - 종합판정 영역
- 문서 목록/상세/편집 뷰 개선

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 모델 추가: SalesPartner, SalesTenantManagement, SalesScenarioChecklist, SalesConsultation
- 모델 위치 이동: app/Models/ → app/Models/Sales/
- 컨트롤러 수정: 캐시 대신 DB 모델 사용
- 뷰 수정: Eloquent 모델 속성 사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 기존: 로그인 사용자의 모든 테넌트 표시 (HQ 제외)
- 변경: 가망고객(tenant_prospects)에서 전환된 테넌트만 표시
- TenantProspect.STATUS_CONVERTED 상태의 tenant_id만 조회

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CSRF 예외에 common-code-sync/*, category-sync/* 추가
- fetch 요청에 credentials: 'same-origin' 추가
- 메뉴 동기화 시 menu_id 파싱 방식 수정 (value → dataset.menuId)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 기존: /api/admin/users?tenant_type=HQ (미지원 파라미터)
- 변경: /sales/managers/list (전용 엔드포인트)
- 라우트 추가: sales.managers.list

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 기존: 드롭다운 열 때 API 호출 → 로딩 스피너 문제
- 변경: 컨트롤러에서 allManagers 전달 → 즉시 렌더링
- 로딩 상태 제거로 UX 개선

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Alpine.js 로드 전 드롭다운이 잠시 보이는 FOUC 문제 수정
- x-cloak 디렉티브와 CSS 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 버튼에 type="button" 추가 (폼 제출 방지)
- 스크립트를 @push('scripts')로 이동 (중복 정의 방지)
- 디버깅 로그 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 별도 스크립트 함수 대신 x-data 인라인 정의
- @click.away를 @click.outside로 수정 (올바른 Alpine 문법)
- 스크립트 로드 순서 문제 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 레이아웃에 Alpine.js가 로드되지 않아 x-data 디렉티브가 동작하지 않음
- Alpine.js 3.x CDN 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 확정 수당 카드 클릭 시 모달로 상세 정보 표시
- 대시보드 화면 단순화 (역할별 수당 섹션 제거)
- Alpine.js 모달 트랜지션 효과 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 중복된 실적 데이터 없음 섹션 제거
- 테넌트 목록을 '내 계약 현황'으로 명칭 변경
- 빈 상태 메시지 개선 (가망고객 전환 안내)
- 총 계약 건수 표시 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 최신 계약이 상단에 표시되도록 정렬
- 10건 초과 시 HTMX 페이지네이션 표시
- 현재 페이지 범위 및 총 건수 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 전체 코드에서 '영업담당자' → '영업파트너'로 용어 통일
- 관리 드롭다운: 모든 HQ 사용자 → 내가 유치한 하위 영업파트너만 표시
- User.php children() 관계 활용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 기존: 본사 관리자 등록 시 parent_id = null
- 변경: 누가 등록하든 등록자가 추천인(parent_id)으로 설정

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>
- SalesScenarioChecklist::toggle()에서 user_id 설정 추가 (DB NOT NULL 오류 해결)
- scenario-modal.blade.php에서 @scenario-modal-closed.window 이벤트 리스너 제거 (무한 루프 해결)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 새 레코드 생성 시 checkpoint_index 기본값 0 설정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 그라디에이션으로 우측 텍스트 가독성 저하 문제 해결
- 단색 배경으로 변경 (영업: blue-600, 매니저: green-600)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- HTMX 로드 시 script 태그 미실행 문제 해결
- tenantListManager 함수를 인라인 x-data로 이동
- toggle-detail 버튼에 @click 핸들러 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- GoogleCloudStorageService 생성 (레거시 방식 JWT 인증)
- 10MB 이상 파일은 Google Cloud Storage에 백업 (본사 연구용)
- 오디오/파일 다운로드 라우트 추가
- voice-recorder.blade.php 인라인 x-data로 변경 (HTMX 호환)
- SalesConsultation 모델에 gcs_uri 필드 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AI 설정과 스토리지 설정을 탭으로 구분
- GCS 버킷 이름, 서비스 계정 (JSON 직접입력/파일경로) 설정 가능
- GCS 연결 테스트 기능 추가
- GoogleCloudStorageService가 DB 설정 우선 사용 (fallback: 레거시 파일)
- AiConfig 모델에 gcs provider 및 관련 메서드 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- x-cloak 스타일 추가: Alpine.js 초기화 전 탭 콘텐츠 숨김
- 초기 로드 시 두 탭이 동시에 보이던 문제 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- max-w-4xl mx-auto 제거 → space-y-6 (전체 너비, 왼쪽 정렬)
- 다른 관리자 페이지와 동일한 레이아웃 패턴 적용
- 탭 네비게이션 중복 마진 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- config/gcs.php 추가: 환경변수 기반 설정
- GoogleCloudStorageService 우선순위 변경:
  1. DB 설정 (UI 오버라이드용)
  2. 환경변수 (.env) - 기본
  3. 레거시 파일 (fallback)
- .env.example에 GCS 설정 추가
- 서버 배포 시 .env만 설정하면 DB 설정 불필요

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ai_configs 테이블 구조 설명
- 설정 우선순위 (DB → .env → 레거시)
- 관련 파일 목록 및 위치
- 주요 메서드 사용법
- 배포 가이드 및 트러블슈팅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 음성 녹음: 재생 버튼 + 다운로드 버튼 추가
- 첨부파일: 다운로드 버튼 추가
- GCS 백업 여부 표시 (배지)
- 오디오 재생 시 다른 오디오 자동 정지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- downloadAudio: Response → BinaryFileResponse|RedirectResponse
- downloadFile: Response → BinaryFileResponse
- GCS 리다이렉트: response()->redirectTo() → redirect()->away()

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 확정된 결과를 인덱스별 배열로 관리하여 중복/덮어쓰기 방지
- 음성 인식 끊김 시 자동 재시작 (녹음 중일 때만)
- no-speech, aborted 에러 무시하고 계속 진행

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 실시간 음성 인식: max-h-40 스크롤 영역 + 자동 하단 스크롤
- 음성 인식: 글자 수 표시
- 텍스트 상담 기록: max-h-32 스크롤 영역
- 음성 녹음 transcript: max-h-32 스크롤 영역
- 긴 텍스트(4시간 분량 등) 대응

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SalesScenarioChecklist: getSimpleProgress(), getTenantProgress() 메서드 추가
- tenant-list: 진행률 컬럼 추가 (영업/매니저 각각 프로그레스 바)
- 레이아웃 재조정: 버튼 compact화, 컬럼 비율 조정
- 오른쪽 빈 공간 활용하여 정보 밀도 향상

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- scenario-modal: close() 시 tenantId 포함한 이벤트 발생
- tenant-list: 이벤트 수신 시 API 호출하여 진행률 업데이트
- 진행률 영역에 ID 부여하여 DOM 직접 업데이트
- 새로고침 없이 실시간 반영

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 기존: 마지막 단계(계약 체결)에서만 상담 기록/첨부파일 표시
- 변경: 모든 단계에서 접기/펼치기 아코디언으로 공통 모듈 제공
- 단계별 독립적인 상담 기록 컨테이너 ID 사용
- HTMX revealed 트리거로 펼칠 때만 데이터 로드

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 기존: 각 단계별 독립적인 상담 기록 (step_id 기반)
- 변경: 모달 하단에 고정 배치, 모든 단계에서 동일한 상담 기록 공유
- 탭 전환 시에도 상담 기록 유지
- step_id 파라미터 제거로 통합 관리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- @include 시 $steps 변수가 전달되지 않아 다음 단계 버튼 미표시
- scenario-step.blade.php에 $steps 변수 명시적 전달 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 우측 메인 영역에 min-h-0 추가 (flex 자식 스크롤 활성화)
- overflow-hidden 제거
- 하단 상담 기록 영역에 flex-shrink-0 추가 (축소 방지)
- 아코디언 콘텐츠 max-height: 50vh 인라인 스타일로 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 음성 녹음: 헤더 클릭으로 접기/펼치기, 녹음 중 상태 배지 표시
- 첨부파일: 헤더 클릭으로 접기/펼치기, 대기 파일 개수 배지 표시
- 기본 접힌 상태로 화면 공간 효율화

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
음성 녹음:
- 녹음 종료 시 자동 저장 (저장/취소 버튼 제거)
- 저장 중 오버레이 + 프로그레스바 표시
- 저장 완료 후 자동 초기화

첨부파일:
- 파일 선택 즉시 자동 업로드 (업로드 버튼 제거)
- 업로드 중 오버레이 + 프로그레스바 표시
- 최근 업로드 파일 목록 표시 (5개까지)
- 다중 파일 순차 업로드 및 전체 진행률 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SalesTenantManagement 모델에 본사 진행 상태 7단계 추가
  (대기, 검토, 기획안작성, 개발코드작성, 개발테스트, 개발완료, 통합테스트, 인계)
- 수당 지급 상태 3단계 추가 (대기, 지급대상, 지급완료)
- tenant-list.blade.php에 본사 진행 상태 스텝 인디케이터 추가
- 매니저 100% 완료 시 본사 진행 활성화
- 수당 지급 상태 배지 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- $steps가 전달되지 않을 경우 config에서 직접 가져오도록 수정
- 제안 및 견적 등 모든 단계에서 다음 단계 버튼 표시 보장

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- $steps 빈 배열 체크를 ?? 에서 empty()로 변경
- null만 체크하던 ?? 연산자로 인해 빈 배열일 때 버튼 미표시 문제 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- scenario-step: $totalSteps 명시적 계산으로 다음 단계 버튼 표시 수정
- scenario-step: 완료 버튼 클릭 시 scenario-completed 이벤트 발송
- scenario-modal: completeAndRefresh 함수 추가 (테넌트 리스트 새로고침)
- SalesDashboardController: refreshTenantList 메서드 추가
- routes/web.php: salesmanagement.dashboard.tenants 라우트 추가
- tenant-list: id="tenant-list-container" 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
슈퍼관리자는 다른 테넌트/글로벌 코드 수정·토글·삭제 가능

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- @click → x-on:click (Blade 지시자 충돌 방지)
- 동적 색상 → 고정 색상 bg-indigo-600 (Tailwind JIT 문제 방지)
- 모든 조건 값을 @php에서 명시적 계산
- 조건 로직 단순화 ($isLastStep 불린 사용)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 영업/매니저 프로그레스바를 2행에서 1행으로 변경 (각 50% 너비)
- 삭제 버튼을 본사(HQ) 사용자만 표시하도록 제한
- belongsToHQ() 메서드 활용하여 권한 체크
- @click → x-on:click 변경 (Blade 충돌 방지)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 진행 현황을 2분할 grid로 변경 (영업/매니저 | 본사진행)
- 담당자 드롭다운을 업체명 옆 왼쪽으로 이동 (overflow 방지)
- 모든 @click → x-on:click 변경 (Blade 충돌 방지)
- 본사 진행 비활성화 시 "대기" 간략 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SalesProductController: CRUD + 카테고리 관리
- Models: SalesProductCategory, SalesProduct, SalesContractProduct
- Views: 상품관리 UI (Tailwind + Alpine.js + HTMX)
- Routes: /sales/products/* 라우트 등록

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SalesContractController: 계약 상품 저장/조회 API
- product-selection.blade.php: 상품 선택 UI 컴포넌트
- scenario-step.blade.php: 6단계에서 상품 선택 컴포넌트 표시
- routes/web.php: /sales/contracts/* 라우트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 접기/펼치기 제거, 항상 펼친 상태로 표시
- 업체명 → 관리 드롭다운 순서로 변경
- 업체명 하단에 대표자 | 사업자번호 표시
- 상세정보에 전화번호, 이메일, 주소 아이콘과 함께 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 영업, 매니저 버튼을 왼쪽(관리 드롭다운 옆)으로 이동
- 오른쪽 관리 영역은 설정/삭제 아이콘만 표시
- 그리드 레이아웃 조정 (col-span-4, col-span-4, col-span-1, col-span-3)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 체크포인트 축소 시 DB에 남아있는 이전 데이터 때문에 100% 초과 문제 수정
- validCheckpointKeys 배열로 config 기준 유효성 검증

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 프로그레스 바 넓게 확장 (본사 진행 상태 바 제거)
- 가입비/월 구독료 오른쪽 세로 배치
- 테이블 헤더 및 상세 정보 영역 제거
- 본사 진행 상태 간단 텍스트로 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 영업/매니저 프로그레스 바 영역 50%로 축소
- 나머지 50%에 본사 7단계 진행 상태 바 배치
- 비활성 시에도 7단계 바 표시 (회색)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 데이터베이스 구조 (카테고리, 상품, 계약상품)
- 가격 구조 (개발비, 가입비, 구독료, 수당)
- 가격 계산 공식 및 예시
- 모델 클래스 설명
- API 엔드포인트
- 영업 시나리오 연동 흐름
- 확장 가능성

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
[모델]
- SalesCommission: 영업수수료 정산 모델
- SalesCommissionDetail: 상품별 수당 내역 모델
- SalesTenantManagement: 입금 정보 필드 추가

[서비스/컨트롤러]
- SalesCommissionService: 수당 생성, 승인, 지급 처리 로직
- SalesCommissionController: 정산 관리 CRUD

[뷰]
- 본사 정산 관리 화면 (필터, 통계, 테이블)
- 입금 등록 모달
- 상세 보기 모달
- 영업파트너 대시보드 수당 카드

[라우트]
- /finance/sales-commissions/* 라우트 추가
- 기존 sales-commission 리다이렉트 호환

[메뉴]
- SalesCommissionMenuSeeder: 정산관리 > 영업수수료정산 메뉴 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 기존 재무관리 메뉴에 영업수수료 정산이 이미 존재
- 중복 생성한 정산관리 > 영업수수료정산 메뉴 시더 삭제
- DB에서 중복 메뉴 정리 및 기존 메뉴 URL 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 버튼 텍스트: 전환 → 계약
- 확인 메시지: 테넌트로 전환하시겠습니까? → 계약 처리하시겠습니까?
- 상태 표시: 전환 → 계약

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 영업실적은 수수료 정산에서 자동 산출되므로 별도 등록 불필요
- 메뉴 삭제 (DB)
- 라우트 제거 (/sales/records)
- 대시보드에서 통합 조회로 대체

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 번개 버튼 클릭 시 랜덤 데이터 자동 입력
- 로그인 ID, 이름(한글 3자), 이메일, 전화번호, 비밀번호 랜덤 생성
- 역할 체크박스 3개 자동 체크
- 개발 환경(local, development)에서만 버튼 표시
- 비밀번호는 alert와 콘솔에 출력

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- user_roles, department_user 삭제
- sales_partners, sales_manager_documents 삭제
- 하위 사용자의 parent_id 해제

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SoftDeletes 모델의 delete()는 soft delete만 수행
- DB::table()로 직접 삭제하여 외래 키 제약 조건 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 목록에서 상세/수정 버튼 클릭 시 모달로 표시
- 모달 열림 시 배경 스크롤 방지
- ESC 키로 모달 닫기 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- data-close-modal 속성으로 닫기 버튼 식별
- 부모 요소에서 클릭 이벤트 감지하여 모달 닫기

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- pointer-events 문제와 해결방법
- AJAX HTML에서 함수 호출 문제
- 이벤트 델리게이션 사용법
- 완전한 모달 구현 예시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- TenantProspectController에 modalShow, modalEdit 메서드 추가
- prospects 라우트에 modal-show, modal-edit 엔드포인트 추가
- index.blade.php에 모달 컨테이너 및 JavaScript 추가
- partials/show-modal.blade.php, edit-modal.blade.php 신규 생성

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- labs-menu.blade.php: S/A 탭 구조 유지 (원격 버전)
- routes/web.php: ManagementController + AIController 모두 포함, SalesCommissionController 구현 유지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 메뉴 코드(S./A.)로 Strategy와 AI 메뉴 분리
- 분리 불가 시 모든 메뉴를 sMenus로 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 공통코드/카테고리 테넌트→글로벌 체크박스 벌크 복사 기능 추가
- 이미 대상에 존재하는 항목 체크박스 disabled 처리 (양방향)
- 공통코드 토글 크기 카테고리와 동일하게 축소
- 동기화 환경설정 모달을 공통 partial로 분리
- 동기화 리스트에서 불필요한 타입 컬럼 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- testGeminiVertexAi() 메서드 추가
- getVertexAiAccessToken() OAuth 토큰 획득 메서드 추가
- 모달에서 Vertex AI 파라미터 전송하도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Nginx client_max_body_size 설정 (413 오류 해결)
- shared-storage 디렉토리 생성 및 권한 설정
- TENANT_STORAGE_PATH 환경변수 추가
- AI 설정 메뉴 및 데이터 추가
- SalesRoleSeeder 실행 이력

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 서버 호환성 문제 해결 내역
- Laravel 12 마이그레이션 작성 가이드

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 전체 계약이 아닌 현재 사용자가 등록한 가망고객의 계약만 표시
- 하위 영업파트너가 등록한 계약도 포함

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- confirmDelete 등 스크립트가 실행되도록 HX-Redirect 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 내가 등록한 계약 (20% 수당)
- 내가 매니저로 지정된 계약 (5% 수당)
- 두 목록을 합쳐서 "내 계약 현황"에 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 총 가입비, 총 수당, 지급 완료 비율 등 실제 계산
- 판매자(20%) / 매니저(5%) 역할별 수당 상세
- 영업파트너로서의 수당 + 매니저로서의 수당 모두 집계
- 테넌트 통계 (관리 테넌트 수, 누적 수당, 확정 수당)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 영업파트너구조.md: 수당 구조, 구현 현황, 파일 경로 업데이트
- 수당지급.md: 수당 지급 시스템 기술문서 신규 작성

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 매뉴제작 협업수당 → 협업지원금으로 명칭 변경
- 협업지원금 산출 기준: 메뉴당 2,000원
- 지급 대상: 계약자 기준 2단계 상위 파트너 (할아버지)
- 지급 시점: 가입비 완납 시
- 다단계법 준수를 위한 구조 설명 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 사용자 → 실사용자로 명칭 변경
- 이용자명(명의자) 입력 필드 추가
- 유효기간 YY/MM 형식 입력 필드 추가 (자동 포맷팅)
- CVC 3자리 입력 필드 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 비활성화: status를 inactive로 변경 (데이터 유지)
- 영구삭제: 목록에서 완전히 제거 (복구 불가)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 하드코딩된 목업 데이터 삭제
- 빈 배열로 초기화 (서버 연동 후 실제 데이터 로드 예정)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- push_urgent → push_vendor_register (거래처등록)
- push_payment → push_approval_request (결재요청)
- push_income 신규 추가 (입금)
- config/fcm.php 전체 7개 채널 등록
- FcmController validation 및 Blade select 옵션 반영

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 번개(Zap) 아이콘 버튼 클릭 시 임시 데이터 3건 생성
- 입력 테스트용 기능

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 카드명, 카드번호, 실사용자, 사용현황, 상태만 표시
- 그리드 카드 → 테이블 리스트 형태로 변경
- 클릭 시 상세 정보 모달에서 확인

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CorporateCard 모델 추가
- CorporateCardController API 추가 (CRUD)
- 라우트 추가 (list, store, update, deactivate, destroy)
- React 컴포넌트 API 연동 (fetch 호출)
- 로딩 상태 UI 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AppVersion 모델, Service, Controller
- 버전 등록 폼 (APK 업로드, 강제 업데이트 설정)
- 버전 목록 테이블 (활성 토글, 다운로드 수, 삭제)
- /app-versions 라우트 추가
- app_releases 스토리지 디스크 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- /var/www/shared-storage/releases → /var/www/api/storage/app/releases
- Docker 볼륨 마운트와 일치하도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 세일즈 사이트, 렌딩페이지 영업관리 하위로 이동
- 중복 영업관리 메뉴 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- toggleActive, toggleChildren 등 JS 함수 미정의 오류 해결
- HTMX 부분 로드 시 전체 페이지 리로드로 스크립트 실행 보장

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 공통코드/카테고리: 하드코딩 그룹 라벨 제거, DB description 기반으로 전환
- 코드그룹 신규 생성 기능 추가 (사이드바 + 모달, TenantSetting 저장)
- 글로벌/테넌트 스코프 분류 및 필터 버튼 (전체/글로벌/테넌트)
- 사이드바 컴팩트 레이아웃 (100+ 그룹 대응)
- 동기화 페이지 3종(메뉴/공통코드/카테고리) 테넌트 회사명 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 슈퍼관리자: 삭제된 항목 빨간 배경으로 표시, 복구/영구삭제 버튼
- 소프트 삭제 시 APK 파일 유지, 영구 삭제 시에만 파일 제거
- restore, forceDestroy 라우트 및 서비스 메서드 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 버전코드/버전명/플랫폼/변경사항/강제업데이트/APK 파일 수정 가능
- 새 APK 업로드 시 기존 파일 삭제 후 교체
- 수정 모달 UI, PUT 라우트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- APK 파일명 클릭 시 다운로드, download_count 자동 증가
- app_releases 디스크 스트리밍 다운로드 라우트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Phase 1.3: EGI/SUS 수입검사 시드 데이터 생성 (IncomingInspectionTemplateSeeder)
- Phase 1.5: 양식 복제 기능 (duplicate API, 테이블 버튼, JS)
- Phase 2.1: 문서 생성 보완
  - 문서번호 카테고리별 prefix (IQC/PRD/SLS/PUR-YYMMDD-순번)
  - 결재라인 초기화 (template.approvalLines → document_approvals)
  - 기본필드 뷰 속성 수정 (field_type, Str::slug field_key)
  - store()에 DB 트랜잭션 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 섹션별 동적 검사 테이블 렌더링 (complex/select/check/measurement/text)
- 정적 컬럼 자동 매핑 (NO, 검사항목, 검사기준, 검사방식, 검사주기)
- complex 컬럼 서브 라벨 행 (측정치 n1/n2/n3)
- 종합판정 + 비고 Footer 영역
- JS 폼 데이터 수집 (기본필드 + 섹션 테이블 데이터 + 체크박스)
- saveDocumentData() 공통 메서드 (section_id/column_id/row_index EAV 저장)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- isset→array_key_exists: description NULL인 그룹 스코프 오분류 수정
- 글로벌+테넌트 필터 버튼 추가 (공통코드/카테고리)
- 전체선택 체크박스를 헤더 아이콘 앞에 배치
- 스크롤 영역 calc(100vh-180px) 화면 기준으로 변경
- 복사 시 소프트삭제된 동일 코드 존재하면 복원 처리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- API: submit(DRAFT→PENDING), approve(단계별 승인), reject(반려 사유 필수)
- 전체 승인 완료 시 자동 APPROVED, 재제출 시 결재라인 초기화
- edit: 결재 제출 버튼 + submitForApproval() JS
- show: 승인/반려 버튼, 반려 사유 모달, 결재 현황 속성 수정, 상태 배지 CSS
- 라우트: submit/approve/reject 3개 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- sam_stat DB 연결 추가 (config/database.php)
- StatAlert 모델 생성 (sam_stat 연결, 읽기+상태변경)
- SystemAlertController 생성 (목록/읽음/해결/전체읽음)
- 시스템 알림 Blade 페이지 (필터/페이지네이션/HTMX)
- /system/alerts 라우트 등록

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 5가지 컬럼 타입 렌더링 (complex/select/check/measurement/text)
- select 판정값 배지 표시 (적합=초록, 부적합=빨강)
- check 체크마크 SVG, measurement mono 폰트
- 정적 컬럼 매핑 (NO/검사항목/기준/방식/주기/규격/분류)
- 종합판정 + 비고 Footer (마지막 섹션 하단)
- 검사 기준 이미지 표시
- 버그 수정: field_key→Str::slug, field_type, section.name→title

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- registered_by 필터를 현재 로그인 사용자 ID로 강제 설정
- 통계(stats)도 현재 사용자 기준으로 조회하도록 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- parent_id 필터를 현재 로그인 사용자 ID로 강제 설정
- 통계(stats)도 현재 사용자 기준으로 조회하도록 변경
- getSalesPartners()에 parent_id 필터 처리 추가
- getStats()에 parentId 파라미터 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- isAdmin() 체크 추가: admin 또는 super-admin 역할만 승인/삭제 가능
- 일반 사용자(유치자)는 상세/수정만 가능

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 데스크톱에서 사용자 아바타 뱃지 옆에 이름 표시
- 모바일에서는 기존처럼 뱃지만 표시 (공간 절약)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 승인 대기 목록 페이지 (/sales/managers/approvals)
- isAdmin() 권한 체크: admin 또는 super_admin만 접근 가능
- 승인/반려 기능 (AJAX 지원)
- 상세 보기 모달
- 승인 대기 통계 (오늘 승인/반려 수)
- DB 메뉴 추가: 영업관리 > 영업파트너 승인

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 일반 영업파트너에게는 '본사 운영팀에서 승인 처리 예정' 메시지 표시
- 승인/반려 버튼은 isAdmin() 체크로 관리자에게만 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 좌측: 승인 대기자 목록 (노란색 헤더)
- 우측: 승인 완료 목록 (초록색 헤더, 최근 승인 순)
- 각 패널에 건수 표시 및 독립적 페이지네이션
- 컴팩트한 테이블 디자인으로 더 많은 정보 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- data-close-modal 속성을 onclick="closeDetailModal()"로 변경
- X 버튼과 닫기 버튼이 정상적으로 모달을 닫도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- openEditModal 함수 누락으로 인한 오류 수정
- 상세 모달에서 수정 버튼 클릭 시 수정 폼 로드

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- index.blade.php(closePartnerModal)와 approvals.blade.php(closeDetailModal) 모두 지원
- 함수 존재 여부 확인 후 적절한 함수 호출

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- soft delete된 레코드가 있을 때 새 레코드 생성 대신 복원
- withTrashed()로 기존 레코드 확인 후 처리
- 불필요한 역할만 선별적으로 삭제

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 영업파트너 승인: sort_order 5
- 세일즈 사이트: sort_order 6
- 렌딩페이지: sort_order 7

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 명함 등록 = 영업시작의 개념으로, 별도 계약 버튼 불필요
- 상세, 수정, 삭제 버튼만 유지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 통계 카드: 계약완료 → 성공
- 필터 옵션: 계약완료 → 성공
- 유효기간 표시: 계약 → 성공

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 역할은 아래 '역할 관리' 섹션에서만 표시
- 승인 상태 뱃지만 헤더에 유지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Accept: application/json 헤더 추가
- Laravel validation 오류 시 JSON 응답 보장

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- JSON 응답 여부 확인 후 파싱
- 비JSON 응답시 상세 에러 로그 출력

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AJAX/API 요청 시 JSON 응답 반환 (403)
- 리다이렉트 대신 에러 메시지와 redirect URL 제공

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SalesDashboardController에 partnerActivity() 메서드 추가
- 유치 파트너 요약 통계 (파트너 수, 영업권, 계약, 예상수당)
- 파트너별 상세 활동 테이블 (펼침/접기 기능)
- 기존 대시보드에 탭 UI 통합 (내 활동 / 유치 파트너 현황)
- HTMX로 탭 콘텐츠 지연 로드

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
가이드 문서들을 sam-docs/guides/ 폴더로 통합 이동

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ViewServiceProvider에서 메뉴별 뱃지 데이터 전달
- 영업파트너 승인 대기 건수 뱃지 표시
- menu-item 컴포넌트에서 뱃지 렌더링 (빨간색 원형)
- 99개 초과 시 "99+" 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 라우트명뿐만 아니라 URL로도 뱃지 매칭
- 메뉴 DB에 route_name이 없어도 URL로 뱃지 표시 가능

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- View Composer 변수는 Blade 컴포넌트에서 접근 불가
- View::share로 전역 공유하여 컴포넌트에서도 접근 가능하도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 고객 관리에서 등록한 가망고객(TenantProspect)도 내 계약 현황에 표시
- active/expired 상태의 가망고객을 '영업 진행중' 섹션으로 구분하여 표시
- 영업권 만료까지 D-day 표시
- 상세 버튼으로 고객 관리 페이지 연결

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>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- scenario-modal-closed 이벤트에서 prospectId 처리
- updateProspectProgress 함수 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SalesConsultation 모델에 prospect 관련 메서드 추가
  - createTextByProspect(), createAudioByProspect(), createFileByProspect()
  - getByProspectAndType() 조회 메서드
- ConsultationController에 prospect 라우트 추가
  - prospectIndex(), prospectStore(), prospectUploadAudio(), prospectUploadFile()
- scenario-modal.blade.php에서 @if(!$isProspectMode) 조건 제거
  - 가망고객 모드에서도 상담 기록 섹션 표시
- voice-recorder, file-uploader, consultation-log에 prospect 모드 지원
- routes/web.php에 prospect 상담 기록 라우트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 영업관리 하위에 "개발 승인" 메뉴 추가
- 영업/매니저 100% 완료 고객의 개발 진행 상태 관리
- 3분할 레이아웃: 승인대기 / 개발진행중 / 완료
- 7단계 진행 상태: 대기→검토→기획안작성→개발코드작성→개발테스트→개발완료→통합테스트→인계
- 승인/반려/상태변경 기능 구현
- 통계 카드 및 상세 모달 지원

Co-Authored-By: Claude <noreply@anthropic.com>
- refreshTenantList에 prospects 데이터 추가하여 HTMX 갱신 오류 수정
- 내 계약 현황 진행률 UI 개선:
  - 영업/매니저 프로그래스바 컴팩트 레이아웃 (왼쪽)
  - 개발 진행 과정 7단계 + 상태 배지 (오른쪽)
  - 현재 단계 애니메이션 효과 추가
  - 상태별 색상 배지로 시각적 구분

Co-Authored-By: Claude <noreply@anthropic.com>
- 영업/매니저 프로그래스바 너비를 w-32에서 flex-1로 변경
- 영업/매니저와 개발 진행 프로그래스바가 각각 절반씩 차지하도록 수정

Co-Authored-By: Claude <noreply@anthropic.com>
- salesPartner.user eager loading 추가로 영업자명 표시
- 대표자명(representative_name) 정보 추가 표시
- pending/progress/completed 목록 모두 동일하게 적용

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>
- scenario-step.blade.php: 가망고객 모드에서도 상품 선택 UI 표시
- product-selection.blade.php: 가망고객/테넌트 모드 공통 지원
  - management_id 기반으로 상품 조회/저장
  - isProspect 플래그로 모드 구분
- SalesContractController: prospect_id 지원 추가
  - tenant_id 또는 prospect_id 중 하나로 상품 저장 가능
  - 카테고리별 상품 삭제 후 저장으로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- pending(대기) 단계를 포함하여 8단계 표시
- progress-list, completed-list, detail-modal 모두 수정
- 상태 변경 드롭다운은 기존 유지 (승인대기로 버튼 사용)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 가망고객(prospect) 섹션에 계약 금액 정보 추가
  - 가입비, 월 구독료 표시
  - 상품 미선택 시 "미선택" 표시
- 테넌트/가망고객 모두 management_id 기반 조회로 통일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 영업 + 매니저 진행률 둘 다 100% 달성 시 영업권 만료 카운트다운 숨김
- 100% 달성 = 영업권 만료되지 않음 조건 반영

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- tenantProspect 관계 eager loading 추가
- tenant가 없으면 tenantProspect에서 정보 가져오기
  - 업체명: company_name
  - 사업자번호: business_number
  - 대표자: ceo_name (prospect) / representative_name (tenant)
  - 연락처: contact_phone (prospect) / phone (tenant)
  - 주소: address
- pending/progress/completed/detail 모든 화면 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 가망고객(prospect) 모드에서 영업담당자 이름이 나오도록 수정
- tenantProspect.registeredBy 관계 eager loading 추가
- 매니저가 없으면 영업담당자 이름으로 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 가망고객 영업/매니저 100% 완료 시 개발 진행 상태 표시
- 8단계 프로그레스 바와 현재 상태 배지 추가
- 개발 승인에서 변경한 상태가 실시간 반영됨

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 페이지 헤더에 도움말(i) 버튼 추가
- 영업파트너가이드북.md를 모달로 표시
- HTMX로 마크다운 콘텐츠 로드 및 HTML 변환
- max-w-6xl 모달로 가독성 확보

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- prose 클래스 대신 커스텀 CSS 적용
- @tailwindcss/typography 플러그인 의존성 제거
- 마크다운 렌더링 스타일 개선

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- docs 폴더 대신 resources/markdown 폴더 사용
- Docker 환경에서 파일 접근 가능하도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- hq_status가 handover인 경우 계약 금액 기반 수당 계산
- 판매자 수당: 가입비 × 10% (기준금액 50% × 20%)
- 관리자 수당: 가입비 × 2.5% (기준금액 50% × 5%)
- 관리 테넌트 수에 인계 완료 가망고객 포함
- 총 가입비, 확정 수당 통계에 반영

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 인계 완료된 가망고객을 별도 섹션으로 표시
- 완료된 계약의 가입비, 월 구독료, 예상 수당 표시
- 인계일 표시로 히스토리 관리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 파트너별 카드 레이아웃으로 변경
- 클릭 시 가망고객 목록 펼침
- 각 가망고객의 영업/매니저 진행률 프로그레스 바 표시
- 개발 진행 상태 8단계 표시 (100% 완료 시)
- 인계 완료 목록 별도 섹션으로 구분

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>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 내 활동 탭: 본인이 직접 등록한 건만 표시
- 하위 파트너 등록 건은 유치 파트너 현황 탭에서만 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 가입비 설정 시: 가입비 × 5% 예상수당 표시
- 가입비 미설정 시: "계약전" 표시
- 요약 통계 및 파트너별 예상수당 모두 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
접근 및 탐색 단계의 프로그래스바 색상이
표시되지 않던 문제 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
서버에서 npm build 실행 불가하여 빌드파일 직접 커밋

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This reverts commit f49c86d81f.
- 계약 성사(STATUS_CONVERTED) 기준 대신 가입비(registration_fee > 0) 기준으로 변경
- 예상 수당이 표시되면 총 계약 건수도 함께 표시되도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- is_active 필수 조건 제거 (관리 목적으로 비활성 파트너도 표시)
- is_active 필터 옵션 추가 (필요 시 활성 상태로 필터링 가능)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 전체/승인완료/승인대기 버튼 형태 필터 추가
- 기존 검색 필터에서 상태 select 제거 (버튼으로 대체)
- 검색 시 선택된 승인 상태 유지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 승인 상태 버튼과 검색 영역을 한 줄로 합침
- 구분선 추가로 시각적 분리
- 패딩과 폰트 크기 조정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 영업 진행중(가망고객)에도 매니저 드롭다운 추가
- 가망고객용 assign-manager API 라우트 추가
- 매니저 수당: 5% → 1개월 구독료 (고정 금액)
- 역할별 수당 표시에서 관리자 "1개월 구독료" 라벨 추가
- 유치 파트너 현황 예상 수당도 구독료 기준으로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AdminProspectController 생성 (관리자/슈퍼관리자만 접근)
- 전체 영업파트너의 고객 현황을 한눈에 파악
- 영업파트너별 필터, 상태별 필터 제공
- 영업/매니저 진행률 및 개발 상태 표시
- 상세 모달에서 담당자 정보 및 진행 현황 확인
- AdminProspectMenuSeeder 생성 (메뉴 추가용)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 컨트롤러 생성자에서 middleware() 호출 제거
- checkAdminAccess() 메서드로 권한 체크

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 8단계 개발 상태(HQ Status) 드롭다운 추가
- updateHqStatus API 엔드포인트 및 컨트롤러 메서드 추가
- JavaScript AJAX 함수로 상태 변경 처리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SalesScenarioChecklist에 checkAndConvertProspectStatus() 메서드 추가
- toggleByProspect()에서 체크 완료 시 자동 전환 로직 호출
- AdminProspectController에서 목록 조회 시 기존 100% 데이터 자동 전환
- API 응답에 상태 변경 정보 포함

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 내 활동/유치 파트너 현황 탭에 개별 새로고침 버튼 추가
- HTMX로 탭 콘텐츠만 새로고침 (페이지 전체 리로드 없음)
- 로딩 중 스피너 애니메이션 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- x-collapse 디렉티브 사용을 위한 플러그인 CDN 추가
- Alpine.js 전에 로드되도록 배치

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 헤더에 새로고침 버튼 추가
- HTMX로 콘텐츠 영역만 새로고침 (페이지 전체 리로드 없음)
- 컨트롤러에 refresh 메서드 및 getIndexData 공통 메서드 추가
- content.blade.php partial 분리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 다른 매니저 지정 시: 등록자에게 매니저 버튼/프로그레스바 숨김
- 매니저로만 참여 시: 영업 버튼/프로그레스바 숨김
- 본인 역할에 해당하는 영역만 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 다른 영업파트너가 등록하고 내가 매니저로 지정된 건 조회
- '매니저로 참여 중인 건' 섹션 추가
- 매니저만 진행 배지 표시
- 영업 진행률은 흐리게, 매니저 진행률만 강조

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 파트너가 매니저로 지정된 가망고객 조회 로직 추가
- 파트너 헤더에 매니저 진행 건수 표시
- 펼침 영역에 "매니저로 진행 중" 섹션 추가
- 등록 영업권이 없어도 매니저 진행 건이 있으면 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- prospect_id가 NULL이고 tenant_id만 있는 매니저 지정도 조회
- type 필드로 prospect/tenant 기반 구분
- tenant 기반은 "계약 고객" 배지로 표시
- 진행률 대신 계약 완료 상태 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 내 활동 탭에 "매니저로 참여 중인 건" 섹션 추가
- 영업 시나리오: 읽기 전용 모드(참조용) 지원
- 매니저 시나리오: 체크 가능
- 시나리오 모달에 readonly 파라미터 처리
- 읽기 전용 시 체크박스 비활성화 및 "참조용" 배지 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- getManagerOnlyProspects에서 tenant_id만 있는 경우도 조회
- prospect 기반과 tenant 기반 구분하여 UI 표시
- tenant 기반은 "계약 고객" 배지와 계약 완료 상태 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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>
- 역할: sales(영업파트너), manager(상담매니저) 2개만 유지
- recruiter(유치담당) 역할 완전 제거
- 역할 레이블 변경: 영업→영업파트너, 매니저→상담매니저
- 통계, 필터, 역할관리 UI 모두 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 시더에서 recruiter 역할 및 할당 강제 삭제 로직 추가
- soft delete 레코드 포함 forceDelete 처리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 영업파트너 관리 → 파트너 관리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 뷰에서 삭제 버튼 admin만 표시
- 컨트롤러에서 삭제 권한 체크 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 드롭다운 선택 방식에서 실시간 검색 UI로 변경
- getAllManagerUsers() 메서드 추가 (manager 역할 사용자 조회)
- searchManagers() API 추가 (이름/이메일 검색)
- 자신이 유치한 파트너뿐만 아니라 모든 상담매니저 역할 사용자 선택 가능

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 인계 완료 섹션에 영업/매니저 기록 조회 버튼 추가
- readonly 모드로 열어 수정 불가, 조회만 가능
- prospectManagerScenario에 readonly 파라미터 지원 추가
- 단계 이동 시 readonly 파라미터 유지
- 마지막 단계 버튼 텍스트 조건부 표시 (완료/닫기)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 파트너 관리 페이지와 동일한 방식으로 역할 확인
- userRoles.role 관계를 통해 manager 역할 검색
- 영업파트너가 누구든 상담매니저 역할을 가진 모든 사용자 검색 가능

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 파일 선택/카메라 촬영 버튼 분리
- 모바일에서 직접 카메라로 촬영 가능
- capture="environment" 속성으로 후면 카메라 기본 사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 드롭다운 열릴 때 자동으로 전체 매니저 목록 로드
- 검색어 입력 시 로컬에서 즉시 필터링
- 목록 카운트 표시 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 1차/2차 납입 및 수당지급 추적 컬럼 추가
- 매니저 수당 추적 컬럼 추가
- 편의 메서드 추가 (recordFirstPayment, recordManagerPaid 등)
- 지급예정일 계산 Accessor 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 1차 납입완료, 1차 수당지급 컬럼 추가
- 2차 납입완료, 2차 수당지급 컬럼 추가
- 매니저 수당지급 컬럼 추가
- 컨트롤러에서 commission 정보 로드

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 검사주기 입력을 n값, c값, 텍스트 3개로 분리
- standard_criteria JSON으로 구조화된 비교기준 저장 (min/max + 이상/초과/이하/미만)
- 미리보기 측정치 셀 수를 frequency_n 기반 동적 렌더링
- 그룹 항목 미리보기에서 측정치/검사방식/주기/판정 행별 개별 표시
- ID 비교 === → == 수정 (문자열/숫자 타입 불일치 버그)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 자금계획일정: 금액 소수점 제거 및 세자리 콤마 표시
- 자금계획일정: 관련계좌 → 출금계좌 명칭 변경
- 협력사관리: 거래처등록 계좌번호 입력란 추가
- 채무관리: 미지급금 등록 메모란 추가
- 환불관리: 환불/해지 수정 메모란 추가 (거절사유 입력용)
- 법인카드관리: 카드 사용현황에 체크카드 표시
- 법인차량관리: 차량등록 구분 추가 (법인/렌트/리스)
- 법인차량관리: 렌트/리스 전용 필드 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
재무관리 기능만 유지, 바로빌 관련 변경 취소

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- cardType으로 체크카드/신용카드 구분
- 체크카드: '체크카드' 라벨 표시
- 신용카드 + 한도설정: 사용현황 프로그레스바 표시
- 신용카드 + 한도미설정: '신용카드' 라벨 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 타이틀을 '법인차량 등록'에서 '법인차량관리'로 변경
- 차량 소유 구분(ownershipType) 필드 추가: corporate, rent, lease
- 차량 카드에 소유 구분 배지 표시
- 구분 필터 추가
- 렌트/리스 차량 전용 필드 추가:
  - 계약일자, 렌트/리스회사명, 회사연락처
  - 렌트/리스기간, 약정운행거리
  - 차량가격, 추정잔존가액, 보증금
  - 월 렌트료/리스료 (공급가액, 세액)
  - 보험사명, 보험사 연락처
- CSV 다운로드에 구분 정보 포함

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CorporateVehicle 모델 추가
- CorporateVehicleController 추가 (목록/등록/수정/삭제)
- 목업 데이터 제거, 실제 DB 연동
- 불필요한 필드(보험만료일, 검사만료일) 제거
- 렌트/리스 차량 전용 필드 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 카드 형식에서 테이블 한줄 형식으로 변경 (법인카드관리와 동일)
- 컬럼: 차량(모델/종류/연식) | 차량번호 | 구분 | 운전자 | 취득가/월렌트료 | 상태
- 클릭시 수정 모달 표시
- 필터 버튼 UI 개선

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- date cast 제거하여 문자열로 저장
- 한국시간 기준 날짜가 하루 전으로 저장되는 문제 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 배경색과 구분되도록 slate 색상을 blue로 변경
- 차량 등록, 저장 버튼 등이 더 눈에 띄게 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 렌트/리스 상세 정보를 접을 수 있는 아코디언으로 변경
- 핵심 필드(회사명, 기간, 월렌트료)만 기본 표시
- '상세 정보 보기' 클릭 시 나머지 필드 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 회원사 관리 페이지에 서버 선택 토글 UI 추가
- 서버 모드 전환 API 추가 (GET/POST /api/admin/barobill/members/server-mode)
- BarobillService에서 세션 기반 서버 모드 읽기 지원
- 선택한 서버 설정이 바로빌 API 호출에 적용됨

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
기존 전역 세션 기반 서버 모드 → 회원사별 개별 설정 방식으로 변경

주요 변경사항:
- BarobillMember 모델: server_mode 필드 및 accessor 추가
- BarobillService: switchServerMode() 메서드 추가 (동적 서버 전환)
- BarobillMemberController: 회원사별 서버 모드 변경 API 추가
- 회원사 목록 테이블: 서버 모드 컬럼 추가 (클릭 시 변경 모달)
- 서버 변경 확인 모달: 요금 부과 경고 및 동의 체크박스 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- EtaxController, EaccountController, EcardController, HometaxController에
  테넌트별 서버 모드(server_mode) 적용 로직 추가
- applyMemberServerMode() 메서드로 회원사별 테스트/운영 서버 전환
- 기존 전역 BarobillConfig 대신 BarobillMember.server_mode 우선 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 운영 모드일 때 "새로 발행" 버튼에서 "(랜덤 데이터)" 텍스트 제거
- 운영 모드일 때 "랜덤 데이터 재생성" 버튼 숨김
- 운영 모드일 때 국세청 전송 경고 메시지 표시
- 운영 모드일 때 발행 버튼 빨간색으로 변경 (주의 환기)
- 헤더에 "운영 모드" 뱃지 표시 (경고 아이콘 포함)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 품목명: 25% (기존 너무 넓음)
- 수량: 8%, 단가: 12%, 공급가액: 14%, 세액: 12%, 금액: 14%
- 과세: 10%, 삭제버튼: 5%
- 큰 금액도 잘 표시되도록 숫자 컬럼 너비 확보

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 품목명: 30% (가장 넓게)
- 수량: 60px (작은 고정 너비)
- 단가: 100px (적당한 고정 너비)
- 공급가액/세액/금액: 각각 12%, 10%, 12%
- 과세: 70px, 삭제버튼: 40px

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- colgroup 사용하여 명시적으로 컬럼 너비 지정
- 품목명: 30%, 수량: 60px, 단가: 100px
- table-layout: fixed 인라인 스타일로 적용

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>
- 계좌 입출금내역, 카드 사용내역, 홈택스 화면에 운영 모드 배지 추가
- 운영 모드일 때 경고 아이콘과 함께 빨간색 배지 표시
- 테스트 모드는 기존과 동일하게 황색 배지 유지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- toISOString()이 UTC 기준으로 변환하여 하루 차이 발생하는 문제 해결
- formatLocalDate() 함수 추가하여 로컬 타임존(한국) 기준으로 날짜 포맷
- 전자세금계산서, 계좌입출금, 카드사용내역, 홈택스 화면 모두 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 각 API 메서드(cards, transactions, accounts, issue 등)에서
  테넌트의 server_mode 설정에 따라 SOAP 클라이언트 재초기화
- 기존에는 index()에서만 적용되어 별도 HTTP 요청인 API 호출 시
  기본 설정으로 돌아가는 버그 수정
- EcardController, EaccountController, EtaxController, HometaxController 모두 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 기존: environment + is_active=true 조건으로 config 조회
  → 운영 모드 config의 is_active가 false라 certKey 적용 안됨
- 수정: environment만으로 조회하여 테넌트별 서버 모드 지원
- 운영/테스트 모드 전환 시 올바른 CERTKEY 적용됨
- 4개 컨트롤러 모두 동일 패턴 적용 및 로깅 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- BarobillMember 모델에 last_sales_fetch_at, last_purchases_fetch_at 추가
- 매출/매입 조회 시 마지막 수집 시간 DB에 저장
- collectStatus API에서 저장된 시간 조회하여 반환
- 조회 성공 후 화면의 마지막 수집 시간 자동 갱신

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 테넌트별 서버 모드 지원을 위해 환경에 맞는 설정만 조회
- 기존: is_active=true 조건으로 운영 모드 설정 못 찾음
- 수정: environment만으로 조회하여 test/production 설정 사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- overflow-hidden 제거하여 드롭다운 표시 허용
- min-h-[500px] 추가하여 최소 높이 확보

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remember Me 항상 활성화 (로그인 체크박스 제거 → hidden input)
- 419 CSRF 만료 시 자동 페이지 새로고침 처리
- 401 세션 갱신 성공 시 페이지 새로고침으로 CSRF 토큰도 함께 갱신
- 세션 갱신 실패 시 Tailwind 스타일 SweetAlert 팝업 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 회사명: 생성 시 테넌트 company_name 자동입력
- 분류: select 변경 (수입검사/중간검사/품질검사 + 커스텀)
- 수입검사 → 품목 다중선택 (RM, SM 필터)
- 품질검사 → 공정 선택
- 결재라인 단계명: text → select (작성/검토/승인/참조)
- 작성 단계: (작성자) 표시, user_id=null
- 검토/승인/참조: 테넌트 사용자 검색/선택, user_id 저장
- 공정 검색 API, 테넌트 사용자 검색 API 신규 추가
- ItemApiController에 item_type, ids 파라미터 지원 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- StatAlert 모델에 ai_analysis_summary accessor 추가
- 알림 상세 아코디언에 'AI 분석용 복사' 버튼 추가
- 클립보드 복사 시 심각도/도메인/유형/메시지 등 포맷팅

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 기본정보와 결재라인 탭을 한 화면으로 합침
- 양식명+문서제목 한 줄, 분류+회사명+활성화 한 줄로 컴팩트 배치
- Footer 비고라벨+판정라벨 한 줄, 옵션 한 줄
- 결재라인 행 크기/간격 축소
- 결재라인 탭 버튼 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- VehicleLog 모델 생성
- VehicleLogController (CRUD, 엑셀 다운로드)
- 차량일지 라우트 추가 (/finance/vehicle-logs/*)
- React 기반 UI (vehicle-logs.blade.php)
- VehicleLogMenuSeeder (법인차량관리 > 차량일지 메뉴)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 테이블 text-sm 추가 (다른 리스트 페이지와 동일)
- 미리보기 독립 컬럼 추가 (모니터 아이콘)
- API에서 템플릿 데이터 로드 후 모달로 문서 양식 렌더링
- edit 페이지와 동일한 미리보기 출력 (결재란/기본필드/검사항목/비고/종합판정)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 구분 유형 추가: 출퇴근용(왕복), 업무용(왕복), 비업무용(왕복)
- 비업무 라벨을 '비업무용(개인)'으로 변경
- 출발지/도착지 장소명 라벨 수정 (장소명 → 출발지명/도착지명)
- 새 유형별 색상 추가

Co-Authored-By: Claude <noreply@anthropic.com>
- 검사항목 테이블 컬럼 너비 table-layout:fixed + inline style 적용
- 검사기준 min/max 입력 너비 인라인 스타일로 조정 (5rem/4rem)
- 검사주기 레이아웃 2줄 분리 (주기텍스트 윗줄, n=/c= 아랫줄)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 모델 7개: StatSalesDaily, StatFinanceDaily, StatProductionDaily,
  StatInventoryDaily, StatSystemDaily, StatSalesMonthly, StatFinanceMonthly
- DashboardStatService: 요약카드, 7일 추이차트, 알림, 월간요약 데이터
- StatDashboardController: HX-Redirect 패턴 적용
- 뷰: 요약카드 6개 + Chart.js 4개 차트 + 알림/월간요약 하단섹션
- 기존 대시보드 "통계 및 리포트" 바로가기 링크 연결
- 헤더 테넌트 선택 기준 전체/개별 테넌트 필터링 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 가입비 수당 50%씩 1차/2차 분할 지급 현황 시각화
- 각 단계별 납입대기/지급예정/지급완료 상태 표시
- 진행률 바로 지급 완료 비율 표시
- 수당 지급 프로세스 안내 추가

Co-Authored-By: Claude <noreply@anthropic.com>
- 가입비 수당 지급 현황 섹션 추가 (1차/2차 분할)
- 납입대기/지급예정/지급완료 상태별 금액 표시
- 진행 바로 지급 진행률 시각화
- 수당 지급 프로세스 안내 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- getDashboardData()에서 직접 commissionSummary 계산
- calculateCommissionSummaryFromCollection() 메서드 추가
- calculateStageCommissionFromCollection() 메서드 추가
- index()에서 commissionSummary 덮어쓰기 방지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- calculateCommissionSummaryFromCollection()에서 빈 배열 체크 제거
- 수당 레코드가 없어도 0원으로 UI 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 상단 카드 크기 축소 및 컴팩트한 디자인으로 변경
- "확정 수당" → "내 수당 합계"로 변경 (1차+2차 합계)
- "승인 대기" → "지급 완료"로 변경 (진행률 표시)
- 1차/2차 수당 현황 카드 크기 축소
- 전체적인 패딩/마진 조정으로 정보 밀도 향상

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- index.blade.php에서 "수당 지급 일정 안내" 카드 제거
- 가이드북에 1차/2차 수당 분할 지급 상세 설명 추가
- 수당 상태 구분 (납입대기/지급예정/지급완료) 설명 추가
- 수당 지급 프로세스 플로우 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
index/edit 페이지에 각각 중복 구현되어 있던 미리보기 렌더링 로직을
partials/preview-modal.blade.php로 통합하여 단일 buildDocumentPreviewHtml() 함수로 관리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 카드 5개로 세분화: 영업진행중, 인계완료, 총가입비, 예상수당, 지급완료
- "내 수당 합계" → "예상 수당"으로 명칭 변경
- 1차/2차 수당 현황을 테이블 형식으로 변경
- 합계 행 추가로 전체 현황 한눈에 파악 가능

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- $totalCommissionRatio(비율) → $stats['total_commission'](금액)으로 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 개발 진행 중인 건 (hq_status가 review~int_test)의 예상 수당 포함
- 인계 완료 중 지급 미완료 건의 예상 수당 포함
- 지급 완료된 금액은 예상 수당에서 제외
- calculateExpectedCommissionSummary() 메서드 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
영업 관련 코드 및 문서 전체에서 "가입비"를 "개발비"로 변경
- 컨트롤러, 서비스, 모델
- 뷰 템플릿 (blade 파일)
- 가이드북 문서 (마크다운)
- 설정 파일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- $stats['total_commission'] → $totalCommissionAmount로 변경
- 카드와 모달의 수당 합계 일치

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- "총 개발비" → "지급대상 개발비"로 명칭 변경
- 지급대상 개발비 = 개발 진행 중 + 인계완료 중 지급 미완료
- 지급 완료된 건의 개발비는 제외
- $stats['target_development_fee'] 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- formatLocalDate → formatKoreanDate: Asia/Seoul 시간대 기준 날짜 포맷
- getKoreanNow 함수 추가: 한국 시간대 기준 현재 날짜 반환
- getMonthDates: 한국 시간대 기준으로 월의 시작/종료일 계산

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 컬럼 구성: 구분, 작성일자, 발급일자, 거래처, 사업자번호, 과세형태, 공급가액, 영수청구, 문서형태, 발급형태, 상태
- 인쇄/보기 컬럼 제외
- 홈택스 UI 스타일 적용 (테두리, 색상, 폰트)
- 면세 텍스트 분홍색, 상태 초록색(전송완료) 등 원본 색상 반영

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 작성일자/발급일자 선택 드롭다운 추가
- 분기(1~4분기), 반기(1기/2기), 1년 버튼 추가
- 거래처 검색 필드 추가 (사업자번호/사업자명)
- 컨트롤러 dateType 파라미터 지원 (1:작성일자, 2:발급일자, 3:전송일자)
- 한국 시간대(Asia/Seoul) 기준 날짜 계산

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 공급가액 옆에 세액, 합계 컬럼 추가
- 합계는 파란색 볼드로 강조 표시
- colSpan 11 → 13으로 조정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- HometaxInvoice 모델 생성 (로컬 DB 조회/저장)
- HometaxSyncService 서비스 생성 (API 데이터 동기화)
- HometaxController에 로컬 조회/동기화 메서드 추가
- 라우트 추가: local-sales, local-purchases, sync, update-memo, toggle-checked
- UI: 데이터소스 선택 (로컬 DB/바로빌 API), 동기화 버튼 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 검색기간 행 오른쪽에 [동기화][검색] 버튼 배치
- 데이터 행에서 중복 버튼 제거
- 마지막 동기화 시간은 데이터 행에 유지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 데이터 행의 바로빌 API (실시간) 옆에 저장 버튼 추가
- 주황색(#fd7e14)으로 눈에 띄게 표시
- 저장 아이콘으로 변경
- "마지막 동기화" → "마지막 저장"으로 텍스트 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- VehicleLogController: CRUD 및 통계 API 추가
- VehicleLog 모델: 구분/분류 코드 정의 추가
- vehicle-logs.blade.php: React 기반 운행기록부 UI
- routes/web.php: vehicles, summary 엔드포인트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 차량 등록/수정은 차량목록 페이지에서 관리
- 탭 네비게이션 제거, 유지비 관리만 유지
- 타이틀 '법인차량 관리' → '차량정비이력' 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 유효성 검사 메시지 상세화
- 저장 중 버튼 비활성화 및 로딩 표시
- 콘솔 로그 추가하여 디버깅 용이하게

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- handleEdit에서 null 값을 빈 문자열로 변환

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 검색 버튼 클릭 또는 엔터키로 검색 실행
- 새로고침 버튼 추가 (로딩 시 회전 애니메이션)
- 필터 변경 시 자동 검색 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 테스트 모드 제외하고 운영(production) 모드만 조회하도록 필터 추가
- getTaxInvoiceCount(): HometaxInvoice 테이블에서 매출 세금계산서 건수 카운트
- getHometaxCount(): HometaxInvoice 테이블에서 매입/매출 전체 건수 카운트
- 기존 TODO로 표시된 메서드 구현 완료

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- getMemberUsage()에서 해당 회원사의 server_mode에 맞게 API 서버 전환
- 운영 모드 회원사는 운영 서버로, 테스트 모드 회원사는 테스트 서버로 조회
- 등록 계좌/카드 수가 0으로 표시되는 문제 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 디버깅을 위한 API 응답 상세 로깅 추가
- 데이터 타입 및 실제 응답 내용 로그 기록

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 카드 조회: CardInfoEx2 → CardEx로 수정 (실제 GetCardEx2 응답 구조)
- 계좌 조회: BankAccountInfoEx → BankAccount/BankAccountEx로 수정 (실제 GetBankAccountEx 응답 구조)
- EcardController, EaccountController의 응답 파싱 로직과 일치시킴

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- type이 'tenant'인 경우 $item['prospect']가 없어서 500 에러 발생
- $prospect->company_name 대신 $item['company_name'] 사용
- $tenant 변수도 추가하여 타입별 처리 가능하도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 일정 클릭 시 페이지 이동 대신 모달창에서 편집
- 일정 추가 버튼도 모달창으로 변경
- 모달에서 등록/수정/삭제 모두 가능
- ESC 키로 모달 닫기 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 동적 필드/연결 모델 추가 (SectionField, Link, LinkValue, Preset)
- 통합 검색 API (SourceTableSearchController) - items/processes/lots/users
- 템플릿 편집 UI: 소스 테이블 드롭다운 + datalist 검색/선택
- 문서 작성/인쇄/상세 뷰: getFieldValue() 기반 동적 렌더링
- DocumentTemplateApiController: source_table 기반 저장/복제
- DocumentController: sectionFields/links eager loading 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
역할별 수당 상세 모달에서 판매자 수당과 예상 수당 합계가
일치하지 않던 문제를 수정했습니다.

- 기존: 판매자 수당이 SalesCommission 테이블 기준으로 계산
- 변경: 예상 수당(개발 진행 중 + 인계 완료 미지급) 기준으로 표시
- 1차/2차 수당 합계와 역할별 수당 합계가 일치하도록 수정

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>
x-data 속성 내에서 백틱(`) 사용 시 파싱 오류 발생
- 템플릿 리터럴을 문자열 연결로 변경
- document.querySelector와 htmx.ajax URL에서 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
숫자 ID 값은 CSS selector에서 따옴표 없이 사용 가능
- const를 var로 변경 (x-data 내 호환성)
- 이스케이프된 따옴표 제거로 파싱 오류 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
숫자 ID 값은 CSS selector에서 따옴표가 필요하지만
x-data 내 따옴표 이스케이프 문제로 dataset 방식으로 변경
- querySelectorAll + dataset.prospectId로 행 검색
- 따옴표 이슈 완전히 회피

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 컨트롤러에 매니저 수당 1차/2차 분할 데이터 추가
- 요약 카드를 5개 카드 + 1차/2차 테이블로 개선
- 내 활동 탭과 동일한 UI 패턴 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 공급자(분홍색)/공급받는자(파란색) 좌우 배치 테이블 형태
- 업태, 종목, 종사업장, 담당자, 연락처 항목 추가
- 운영 모드: 공급받는자/품목 샘플 데이터 미표시
- 테스트 모드: 공급받는자에 랜덤 샘플 데이터 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- EtaxController에 getSupplier/updateSupplier 메서드 추가
- etax 라우트 그룹에 GET/POST /supplier 라우트 추가
- SupplierSettingsModal React 컴포넌트 구현 (톱니바퀴 아이콘)
- IssueForm이 supplier state를 props로 참조하도록 변경
- manager_phone → manager_hp 필드명 버그 수정
- FIXED_SUPPLIER → INITIAL_SUPPLIER 상수 리네이밍

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
저장 버튼을 form 바깥 footer에서 form 내부로 이동하여
DOM 탐색 없이 직접 submit되도록 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
4개 분리된 StatCard를 바로빌 참고 화면처럼 컴팩트한
가로 테이블 요약 바로 변경 (발행건수, 총 합계금액,
총 공급가액, 총 세액)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 조회기간: 작성일자/전송일자 선택 + 1주일/1개월/3개월 빠른설정
- 사업자번호/상호 텍스트 검색 필터 추가
- 상태 드롭다운 필터 (전체/작성중/발행완료/전송완료/취소됨)
- 정렬 드롭다운 (작성일자/전송일자/공급받는자/합계금액, 오름/내림차순)
- 기존 분산된 필터 state를 filters 객체로 통합

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- filters(입력용) / appliedFilters(검색결과용) 분리
- 검색 조건 변경은 즉시 반영되지 않고 조회 버튼 클릭 시 적용
- 검색 패널 오른쪽에 파란색 조회 버튼 (rowSpan 3행) 배치

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
텍스트와 꺽음 마크 겹침 방지를 위해 오른쪽 패딩 확대 및
appearance-none + 커스텀 SVG 화살표 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 진행완료(두 시나리오 모두 100%) 필터 버튼 추가 (보라색)
- 진행률 미달 시 수당 날짜 input 5개 disabled 처리
- 통계에 progress_complete 건수 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 품목 데이터 구조에 month, day 필드 추가
- 품목 테이블에 월/일 입력 컬럼 추가
- 바로빌 API PurchaseExpiry 필드에 YYYYMMDD 형식 거래일자 전달
- 상세 모달에 월/일 표시 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 총 사용금액 유지 (승인/취소 건수 subtext로 통합)
- 공제 금액/건수 카드 추가
- 불공제 금액/건수 카드 추가
- 부가세 합계 카드 추가
- 5컬럼 그리드로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 백엔드에서 페이지네이션 전 전체 데이터로 공제/불공제/부가세 통계 산출
- parseTransactionLogs에 deductibleAmount/Count, nonDeductibleAmount/Count, totalTax 추가
- getAllCardsTransactions summary에 공제/불공제 통계 포함
- 프론트엔드에서 logs 기반 계산 제거, summary 데이터 사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- dateFrom/dateTo/selectedCard 변경 시 자동 loadTransactions useEffect 제거
- 조회 버튼 클릭 시에만 조회 동작

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- dateFrom/dateTo/selectedAccount 변경 시 자동 loadTransactions useEffect 제거
- 조회 버튼 클릭 시에만 조회 동작

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 채권관리 메뉴명 → 미수금 관리로 변경 시더 추가
- Receivable 모델/컨트롤러 생성
- 수금 처리 API 추가
- React 프론트엔드 API 호출 전환

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 채무관리 메뉴명 → 미지급금 관리로 변경 시더 추가
- Payable 모델/컨트롤러 생성
- 지급 처리 API 추가
- React 프론트엔드 API 호출 전환

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- VatRecord 모델 생성
- VatRecordController CRUD API 생성
- 라우트 추가 (list/store/update/destroy)
- vat.blade.php API 호출 방식으로 전환

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 일일자금일보: API 호출 방식 전환 (list/store/update/destroy/memo)
- 카드거래내역: API 호출 방식 전환 (list/store/update/destroy)
- 라우트 추가 (daily-fund, card-transactions API 그룹)
- 로딩 상태, 에러 핸들링 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
HX-Redirect 처리 추가로 전체 페이지 리로드하여 @push('scripts') 정상 실행

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- POST /api/admin/fund-schedules/copy 엔드포인트 추가
- FundScheduleService에 copySchedulesToMonth() 메서드 추가
- 월 네비게이션 옆 일정복사 버튼 및 모달 UI 구현
- 날짜 조정 로직 (31일→28/29/30일) 포함

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
플레이스홀더(card-usage) → 실제 기능 페이지(ecard)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
사용법: php artisan menu:fix-url "메뉴명" "/새URL"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 문서 작성 시 연결 품목 규격(두께/너비/길이) 기반 자동 하이라이트
- 미리보기에서 field_values 동적 필드 데이터 정상 표시
- DocumentTemplateController에서 field_values 직렬화 추가
- DocumentController에 linkedItemSpecs 조회 로직 추가
- Item 모델 attributes JSON cast 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 과세형태와 공급가액 사이에 품목(itemName) 컬럼 추가
- 바로빌 API 및 로컬 DB 모두 itemName 필드 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 카드번호 뒷 4자리만 표시 (****-1234 형식)
- '금액' 헤더를 '합계금액'으로 변경
- 합계금액 다음에 '공급가액' 열 추가 (합계금액 - 부가세)
- 공제 다음에 '사업자번호' 열 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CardTransaction 모델에 modified_supply_amount, modified_tax 추가
- CardTransactionAmountLog 모델 신규 생성 (수정 이력)
- parseTransactionLogs: effectiveSupplyAmount, effectiveTax, isAmountModified 응답 추가
- save: 금액 변경 감지 시 amount_logs 이력 자동 기록
- 프론트엔드: 공급가액/부가세 input 수정 가능, 합계금액 자동계산
- 수정 시 주황색 배경 + 원본값 취소선 표시
- 분개된 거래는 금액 수정 비활성화 (읽기전용)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- scheduled_date, completed_date, recurrence_end_date cast를
  'date' → 'date:Y-m-d'로 변경
- JSON 직렬화 시 ISO 8601(T00:00:00.000000Z) 대신 YYYY-MM-DD 출력
- HTML input[type=date]가 요구하는 형식과 일치하도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- totalTax 집계 시 deductionType이 'deductible'인 건만 포함
- parseTransactionLogs(), getAllCardsTransactions() 양쪽 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- selectedCard 변경 감지 useEffect 추가
- 초기 로드와 분리하여 중복 호출 방지 (isInitialMount ref)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 수동입력 모달 (등록/수정) 추가
- storeManual, updateManual, destroyManual 컨트롤러 메서드 추가
- 바로빌 API 데이터와 수동 입력 건 병합 표시
- 수동 건에 "수동" 배지, 수정/삭제 버튼 표시
- 라우트: POST/PUT/DELETE /barobill/ecard/manual

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 바로빌 등록 카드 목록을 select로 표시
- "직접 입력" 옵션 선택 시 카드사/카드번호 수동 입력 가능
- 수정 모드에서 기존 카드 자동 선택

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- fetchRemoteMenus()에서 tenant_id 쿼리 파라미터 추가
- export() API에서 요청의 tenant_id 파라미터 우선 사용
- getMenuTreeForTenant() 메서드 추가로 특정 테넌트 메뉴 조회 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 일정 유형(입금/지급) 전환 시 계좌 라벨 동적 변경
- create, edit, show 3개 뷰 모두 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
수동입력시 approval_amount가 공급가액(supply)인데
effectiveSupplyAmount = amount - tax로 이중 차감되던 문제 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- getCategories()를 common_codes 우선 조회로 변경
- 기존 템플릿 카테고리 폴백 유지
- 카테고리 select를 동적 옵션으로 전환
- 직접 입력 옵션 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
editData.approvalAmount(합계) 대신 effectiveSupplyAmount(공급가액)를 사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SplitModal: 금액 단일필드 → 공급가액+부가세 2필드로 변경
- 행별 합계금액 자동계산 표시
- 분개 리스트 행에 공급가액/부가세 개별 표시
- 분개 기반 요약 재계산 로직 추가 (recalculateSummary)
- 모델: split_supply_amount, split_tax 필드 추가
- 컨트롤러: 분개 합계 검증 및 CSV 내보내기 반영
- 레거시 데이터(supply/tax 없는 기존 분개) 호환성 유지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 공제 StatCard를 커스텀 카드로 변경
- 합계 금액 아래에 공급가액/세액 구분 표시
- recalculateSummary에 deductibleSupply, deductibleTax 집계 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- recalculateSummary를 splits 없이도 logs 변경 시 실행하도록 수정
- useEffect 의존성에 logs 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CardTransactionHide 모델 생성 (숨김 테이블 연동)
- EcardController에 hide/restore/hidden 메서드 추가
- 기존 transactions/getAllCardsTransactions에 숨김 키 필터링 적용
- 프론트엔드에 숨김 버튼, 삭제데이터 보기 토글, 복원 기능 추가
- web.php에 숨김 관련 라우트 3개 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 부가세관리: 신고기간 1P/1C/2P/2C 형식, 세금구분(과세/영세/면세), 카드 공제분 매입 반영, 라벨 변경
- 매출관리: 작성일자/승인번호 라벨, 구분(과세/영세/면세) 추가
- 미지급금: 결제예정일/거래일자 라벨, 청구서번호 숨김, 매입세금계산서 발행여부 체크박스

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- recalculateSummary에서 분개 없는 거래의 합계금액을 approvalAmount(원본) 대신 effectiveSupplyAmount+effectiveTax(수정된 금액)로 계산
- totalAmount도 recalculateSummary에서 재계산하도록 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 출금 오른쪽에 잔액 CompactStat 카드 추가
- 가장 최근 거래의 잔액을 항상 표시
- CompactStat에 emerald 색상 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
홈택스 매출/매입 세금계산서 + 바로빌 카드 공제분 자동 조회 기능 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
CardTransactionSplit::getByDateRange()가 array를 반환하므로 Collection 메서드 대신 배열 접근으로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 달력/목록 뷰 전환, 단일/기간/대량 등록 지원
- 공휴일/회사지정/대체휴일/임시휴일 유형 관리
- 시스템 관리 메뉴에 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
holidays 테이블에서 휴일 조회하여 달력에 빨간색 배경 + 휴일명 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- DocumentTemplateApiController: 연결 품목 ID로 품목명 조회
- table.blade.php: 연결 품목 컬럼 추가 (최대 3개 표시 + 더보기)
- index.blade.php: 카테고리 필터 code/name 구조 적용
- preview-modal.blade.php: 기본필드 테이블 비율 조정 (15:35:15:35)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 휴일 날짜/명칭 글씨 크기 및 굵기 증가 (text-base, font-bold)
- TD 배경 음영 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- scheduleSummary(전체 미완료) → monthlySummary(이번 달 예정)
- 라벨 '이번 달 예정'과 데이터가 일치하도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 페이지 로드 시 바로빌 API로 실시간 잔액 조회
- 새로고침 버튼으로 수동 조회 가능
- 총 잔액 카드도 실시간 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- latestBalances API 추가 (barobill_bank_transactions 테이블)
- 바로빌 GetBankAccountEx 대신 로컬 DB 최신 잔액 사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- barobill_bank_transactions 테이블에서 최근 7일 거래 조회
- 입금/출금/잔액 컬럼 표시
- 전체보기 링크를 계좌 입출금내역 페이지로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- store/bulkStore 메소드에 중복 휴일 등록 방지 로직 추가
- 년도별 일괄 삭제 기능 (destroyByYear) 추가
- 휴일관리 UI에 년도 전체 삭제 버튼 추가

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>
- 매출 → 매출(세금계산서) 명칭 변경
- 계산서(면세) 행 추가 - 홈택스 면세 데이터 집계
- 면세는 세액 없으므로 공급가액만 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- BankTransactionOverride 모델 추가 (오버라이드 데이터 관리)
- EaccountController에 saveOverride 엔드포인트 추가
- parseTransactionLogs에서 오버라이드 데이터 병합 로직 추가
- 프론트엔드에 TransactionEditModal 컴포넌트 추가
- 적요 셀 클릭 시 수정 모달 표시
- 오버라이드된 항목 시각적 표시 (배경색, 수정 배지)
- 원본 복원 기능 포함

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- BankTransactionOverride 데이터 병합 로직 추가
- 수정된 적요/내용이 있으면 오버라이드 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 입출금 내역에 오버라이드(수정된 적요/내용) 데이터 병합
- 표시 형태를 "적요 - 상대계좌예금주명"으로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- BankTransaction 모델에 is_manual 필드 추가
- EaccountController에 storeManual/updateManual/destroyManual 메서드 추가
- transactions() 메서드에서 수동입력 데이터와 API 데이터 병합
- 라우트에 수동입력 관련 POST/PUT/DELETE 추가
- 뷰에 ManualEntryModal 컴포넌트 추가 (계좌선택, 입금/출금 유형, 금액 등)
- 거래 목록에 수동 뱃지, 수정/삭제 버튼 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 계좌 선택 시 최근 거래의 잔액을 기준으로 설정
- 금액/거래유형 변경 시 잔액 자동 계산 (기준잔액 +입금 -출금)
- 기준 잔액 표시 및 수동 오버라이드 가능

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 거래일 기준으로 해당 계좌의 직전 거래 잔액을 찾아 기준잔액 설정
- 계좌/거래일/거래시간 변경 시에도 기준잔액 재계산
- 수정 모드에서 자기 자신 거래를 제외하고 직전 잔액 검색

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- recalcManualBalances() 메서드 추가: 병합된 로그를 시간순으로 순회하며
  수동입력 건의 잔액을 직전 거래 잔액 + 입금 - 출금으로 재계산
- 단일 계좌/전체 계좌/수동건만 있는 경우 모두 적용
- API 거래의 잔액은 그대로 유지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 재무관리 > 계좌거래내역 → 계좌입출금내역으로 명칭 변경
- /finance/account-transactions에서 EaccountController 직접 호출 (리디렉션 제거)
- /barobill/eaccount index는 재무관리로 리디렉션
- 데이터 API 라우트(accounts, transactions 등)는 barobill 하위 유지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 기본 조회 건수 50 → 200으로 변경
- 단일 카드 조회 시 전체 데이터를 가져와서 통계 계산 후 로컬 페이지네이션
- 상단 통계(총 사용금액, 공제, 불공제)가 페이지네이션과 무관하게 전체 조회기간 반영
- 페이지네이션 중일 때 프론트엔드 재계산이 백엔드 통계를 덮어쓰지 않도록 수정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 지난달 옆에 D-2월, D-3월, D-4월 버튼 추가
- 2~4개월 전 기간을 빠르게 선택하여 조회 가능

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- /finance/card-transactions에서 EcardController 직접 호출 (리디렉션 제거)
- /barobill/ecard index는 재무관리로 리디렉션
- 데이터 API 라우트(cards, transactions 등)는 barobill 하위 유지
- 바로빌 메뉴에서 카드 사용내역 제거 (재무관리에 이미 존재)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 조회기간 이전의 마지막 잔액을 DB에서 조회하여 기준값으로 사용
- findBaseBalance() 메소드 추가: 조회 시작일 이전 최종 잔액 탐색
- 수동입력 건의 잔액이 0에서 시작하지 않고 이전 실제 잔액에서 계산
- 단일계좌/전체계좌/수동건만 조회 모든 케이스에 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- findBaseBalance를 이전 전체 거래 순회 방식으로 변경
- API 데이터는 바로빌 잔액을 그대로 사용
- 수동입력 건(잔액 0 저장)은 입출금 누적으로 잔액 계산
- 9월 수동입력 → 10월 조회 시 정확한 이전 잔액 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- BankAccountController에 HX-Redirect 추가 (HTMX 네비게이션 시 스크립트 실행 보장)
- latestBalances() 수동입력 거래 포함 정확한 잔액 계산으로 개선
- N+1 쿼리 제거: 전체 거래를 한번에 조회 후 계좌별 그룹화 처리

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- completed_amount가 null/0인 경우 amount로 fallback 처리
- 수입/지출 모두 동일하게 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- BankTransactionSplit 모델 생성
- EaccountController에 splits/saveSplits/deleteSplits 메서드 추가
- 라우트 3개 추가 (GET/POST/DELETE splits)
- BankSplitModal React 컴포넌트 추가
- TransactionTable에 분개 컬럼/하위행 렌더링
- App 컴포넌트에 분개 상태 및 핸들러 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- store/update 시 같은 category의 다른 템플릿에 이미 연결된 품목이 있으면 422 에러 반환
- duplicate 시 linked_item_ids, linked_process_id, linkValues 복사하지 않음
- 레거시(linked_item_ids)와 신규(template_link_values) 양쪽 경로 모두 검증

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 수동입력: MAN-YYYYMMDD-NNN 형식 자동채번, 생성/수정/삭제
- 분개: 세금계산서에서 일반전표 자동 생성 (매출/매입 패턴)
- 카드내역 참조: 수동입력 시 카드사용내역에서 금액/거래처 자동채움
- 테이블에 액션 컬럼 추가 (분개/수정/삭제 버튼)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- periodReport에서 동일 거래(계좌+일시+금액) 중복 제거 로직 추가
- EaccountController save() 금액 비교를 정수 캐스트로 변경하여 decimal 정밀도 차이 중복 방지
- 합계행 잔액 계산 시 Number() 캐스트로 NaN 방지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 같은 거래가 잔액만 다르게 저장된 경우도 중복으로 인식하도록 수정
- save() upsert에서도 balance 제외하여 향후 중복 방지
- 기존 레코드 발견 시 balance도 갱신

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- orderBy id DESC로 먼저 정렬하여 unique() 시 최신 ID 유지
- 중복 제거 후 날짜+시간 기준으로 재정렬

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
invoicer_corp_name, invoicee_corp_name에 null coalescing 추가
매출 입력 시 invoicer 필드가 null로 전달되어 DB NOT NULL 제약 위반 발생

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
validation.required 대신 필드별 한글 오류 메시지 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- corp_name 필드 sometimes→nullable 변경 (null 전달 시 string 오류 방지)
- tax_amount nullable 처리, 미입력 시 0
- 한글 validation 메시지 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
writeDate(YYYYMMDD) 대신 writeDateFormatted(YYYY-MM-DD) 사용하여
date input에 기존 일자가 정상 표시되도록 수정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- HometaxTradingPartnerSelect 컴포넌트 추가 (검색+키보드 탐색)
- HometaxAddTradingPartnerModal 컴포넌트 추가 (신규 거래처 등록)
- 거래처 선택 시 거래처명+사업자번호 자동채움
- 매출/매입 전환 시 거래처 선택 초기화
- 카드내역 불러오기와 거래처 드롭다운 동기화
- 수정 모달 시 기존 거래처명으로 드롭다운 매칭

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 별도 "거래처 검색" 줄 제거
- 공급받는자명/공급자명 텍스트 input을 드롭다운으로 교체
- 드롭다운 안에 거래처 추가 버튼 포함

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- InterviewScenarioController: 카테고리/항목/질문 CRUD + 세션 관리 API
- InterviewScenarioService: 비즈니스 로직 (트리 조회, 세션 시작/토글/완료)
- MNG 모델 5개: InterviewCategory, InterviewTemplate, InterviewQuestion, InterviewSession, InterviewAnswer
- React 뷰: 2-패널 레이아웃 (카테고리 사이드바 + 항목/질문 관리)
- 인터뷰 실시 모달: 카테고리 선택 → 체크리스트 → 완료
- 인터뷰 기록 모달: 기록 목록 + 상세 보기
- InterviewMenuSeeder: 영업관리 > 인터뷰 시나리오 메뉴 추가
- 라우트 18개 추가 (sales/interviews/api/*)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 기존: tenant_id=1에만 메뉴 생성
- 수정: 글로벌(null) + 모든 테넌트의 영업관리 하위에 생성

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Lucide 아이콘 의존 제거하여 버튼 가시성 개선
- 카테고리/항목/질문의 추가/수정/삭제 버튼을 텍스트로 변경
- 빈 상태에서도 카테고리 추가 버튼 명확하게 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- hover 의존(hidden group-hover) 제거
- 선택된 카테고리에서 수정/삭제 버튼 항상 노출

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 문서 양식 API 컨트롤러 및 뷰 개선
- 수입검사 양식 시더 업데이트
- 문서 미리보기 뷰 개선

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- AI 관리 부모 그룹 생성
- AI 설정 메뉴를 기존 위치에서 AI 관리 그룹으로 이동
- 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>
- API 응답 직접 추출 vs GCC Monitoring API 비교 분석
- SAM 프로젝트 적합성 근거 정리
- 기술 구현 명세 및 향후 개선 방안 포함

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>
- 전역 Toast 등 컴포넌트명 충돌 방지를 위해 IIFE로 감싸기

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>
- Web Speech API로 녹음 중 실시간 텍스트 표시
- 인터뷰 카테고리/템플릿 선택 드롭다운 추가
- 녹음/파일업로드 시 interview_template_id 전달

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- processAudio STT 시작/결과 로그 추가
- GoogleCloudService STT 폴링 토큰 실패 로그 추가
- STT 요청 응답 및 완료 로그 추가

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>
- GoogleCloudService에 downloadFromStorage 메서드 추가 (GCS REST API 사용)
- AiVoiceRecordingController에 download 메서드 추가 (스트림 응답)
- 다운로드 라우트 추가 (GET /{id}/download)
- 파일명은 제목 기반으로 생성, Content-Disposition 헤더 설정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DeleteConfirmModal 컴포넌트 추가 (confirm 대체)
- RecordingCard에 음성파일 다운로드 버튼 추가
- 삭제 중 로딩 상태 표시

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>
- 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>
- Str::slug()이 한글을 제거하는 문제 수정
- 한글 파일명 그대로 유지 (파일시스템 금지문자만 치환)
- RFC 5987 filename*=UTF-8'' 헤더로 브라우저 호환성 확보
- 다운로드 파일명 예시: 무제 음성녹음.webm

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>
- 호출메뉴 앞에 카테고리 컬럼 추가
- menu_name에서 카테고리 자동 파생 (AI음성녹음, 회의록, 명함OCR, 사업자등록증OCR)
- 주황색 뱃지로 시각 구분

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>
- 세션 간 텍스트 누적 보존 (accumulatedTextRef 추가)
- 침묵으로 인한 자동 재시작 시 이전 텍스트 유실 방지
- 일시정지→재개 시 텍스트 보존
- 재시작 300ms 지연으로 급속 루프 방지
- stop() 후 이벤트 핸들러 제거로 중복 처리 방지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- max-w-4xl mx-auto 제거하여 콘텐츠 영역 전체 너비 사용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 헤더, 검색, 필터, 새녹음, 파일업로드 버튼을 한 줄로 통합
- 통계 카운트를 헤더 옆으로 이동

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 입력 패딩 pl-9→pl-10, 너비 w-44→w-48로 조정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- max-w-7xl mx-auto 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- card.alias (바로빌 ID) 표시 제거, 카드 뒷번호만 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- container mx-auto 제거

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>
- AiPricingConfig 모델 추가 (캐시 적용 단가/환율 조회)
- AiTokenUsageController에 pricingList/pricingUpdate 메서드 추가
- AI 토큰 사용량 페이지에 설정 버튼 + 모달 UI 추가
- AiTokenHelper 하드코딩 단가를 DB 조회로 변경
- pricing 라우트 추가 (GET/PUT)

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>
- 기존: 초기 주행거리(mileage)만 표시
- 변경: 초기 주행거리 + vehicle_logs.distance_km 합계 = total_mileage
- 요약 카드, CSV 다운로드 모두 total_mileage 사용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
서버 DB의 메뉴 이름(미수금 관리, 미지급금 관리, 환불/해지 관리)이
로컬과 달라 이동되지 않은 3개 메뉴를 고객/거래처/채권관리로 이동

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
분개가 있는 카드거래의 unique_key가 금액 변경/수동입력으로
달라질 경우 매칭 실패하여 원본+분개 이중 집계되는 문제 수정.
금액을 제외한 부분키(card_num|use_dt|approval_num)로
보조 매칭하여 분개가 있으면 원본 금액을 사용하지 않도록 개선.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- basic_fields에 수주 LOT NO 필드 추가
- 중간검사 기준서 이미지 섹션 추가 (4종 공통)
- 데이터 섹션 타이틀 "중간검사 DATA"로 통일
- 절곡품 4개 검사 섹션을 1개로 병합
- 미리보기에 ■ 섹션 타이틀 렌더링 (이미지/데이터 분리)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- HometaxInvoiceJournal 모델 신규 생성
- HometaxInvoice에 journals() 관계 추가
- HometaxController: 저장 로직 변경 + 조회/삭제 엔드포인트 추가
- HometaxSyncService: hasJournal 필드 추가
- 프론트엔드: 분개완료 상태 표시, 기존 분개 로드/수정/삭제 지원

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
기존 거래 업데이트 시 cast(상대계좌예금주명), summary(적요)가
업데이트 대상에서 빠져있어 저장되지 않던 문제 수정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- TriggerManagementService: 테이블별 트리거 상태 조회/재생성/삭제
- PartitionManagementService: 파티션 현황 조회/추가/삭제 (보관기간 검증)
- triggers.blade.php: 트리거 상태 대시보드 + 개별/전체 재생성·삭제
- partitions.blade.php: 파티션 통계 + 추가/삭제 (초과분만)
- sub-nav: 감사 로그 목록/트리거 관리/파티션 관리 탭 내비게이션
- 라우트 6개 추가, 컨트롤러 6개 메서드 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
모델, 서비스, 컨트롤러, React SPA 뷰, 라우트 추가
GCS 업로드/다운로드, 드래그앤드롭 사진 관리

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
레이아웃의 전역 Toast(SweetAlert)와 이름 충돌 → ToastNotification으로 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
AiTokenHelper::saveGcsStorageUsage 호출 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Web Speech API 기반 음성→텍스트 변환
신규등록/수정 모드에서만 마이크 버튼 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
continuous 모드로 변경, interimResults로 실시간 텍스트 표시
녹음 중 버튼 재클릭 시 중지, 아이콘 정지 모양으로 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
logSttUsage 엔드포인트 추가, 녹음 종료 시 duration 전송
AI 토큰 사용량에 '공사현장사진대지-음성입력' 카테고리로 기록

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>
AI 설정 + 스토리지 설정을 섹션별로 나누어 한 페이지에 표시
각 섹션에 개별 추가 버튼 배치

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>
- 모달에서 사진 업로드/삭제/수정 시 배경 리스트 fetchList() 제거
- modalDirtyRef로 변경 여부 추적
- 모달 닫힐 때만 dirty 상태면 리스트 한 번 갱신
- 카드 많을 때 불필요한 리렌더링으로 인한 성능 저하 방지

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>
- 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>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- toggleMenuChildren 함수 추가 (재귀적 하위 메뉴 체크)
- import/normal 모드 체크박스에 onchange 연동

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 동기화 요약 카드 → 탭 바 우측 인라인 뱃지로 축소
- 에러/경고 메시지 탭 하단 인라인으로 이동
- 비교 테이블 영역 overflow 처리 개선 (min-h-0)

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>
같은 출금금액이라도 잔액(balance)이 다르면 별도 거래로 인식하도록 개선.
기존에는 balance 없이 매칭하여 김종성/곽형석 등 다른 거래가 같은 키로 인식되는 문제 수정.

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>
서버에서 @vite() 사용 시 manifest.json이 없어 500 에러 발생.
.gitignore에서 public/build/ 제외하고 빌드 결과물을 커밋하여 서버 배포.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
수동으로 '요약 실행' 클릭 시 로컬 세그먼트가 서버에 저장되지 않아
full_transcript가 비어있어 '요약할 텍스트가 없습니다' 에러 발생.
요약 API 호출 전에 로컬 세그먼트를 먼저 서버에 저장하도록 수정.

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>
- generateColumnsFromItems() JS 함수: items의 measurement_type 분석 → 정적+동적 columns 자동 생성
- 테이블 컬럼 탭에 "기준서에서 자동 생성" 버튼 및 상태 indicator 추가
- IncomingInspectionTemplateSeeder에 section_fields 6개 필드 추가
- MidInspectionTemplateSeeder에 section_fields 5개 필드 추가
- 시더 cleanup에 section_fields 삭제 로직 포함

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>
barobill_bank_transactions에서 계좌번호 매칭(하이픈 제거)으로
최신 거래일시를 서브쿼리로 조회하여 fallback 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
container mx-auto 제거하여 전체 너비 사용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
max-w-6xl mx-auto 제거하여 전체 너비 사용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
녹음 중지 시 오디오 업로드 → 자동 화자 분리(Google Cloud STT)
→ 자동 AI 요약 순서로 진행하도록 변경
기존에는 수동으로 "화자 분리" 버튼을 눌러야 했음

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>
Eloquent 모델의 decimal:2 cast가 balance를 dirty로 잘못 감지하여
UPDATE 시 balance가 포함되면서 unique 제약조건 위반 발생.
Query Builder(DB::table)로 변경하여 지정 필드만 업데이트.

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 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가 deposit/withdraw/balance를
dirty로 오감지 (DB "515900.00" vs validation 515900 비교).
DB::table()로 변경하여 지정 필드만 정확히 업데이트.

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>
- section_fields 5→7개 확장 (text_with_criteria, json_tolerance, select_api, composite_frequency)
- items에 measurement_type(checkbox/numeric), tolerance(JSON 공차), standard_criteria(기준값) 추가
- method 한글→API코드 변경 (육안검사→visual, 계측검사→check)
- frequency_n/frequency_c, field_values 구조화 데이터 추가
- 4종(조인트바/슬랫/스크린/절곡) 모두 동일 구조 적용

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가 재계산되어 composite key 매칭 불가.
dbId를 사용하여 직접 레코드를 찾고 비-키 필드만 업데이트.

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>
- 프론트엔드: 전표목록 테이블에서 상태 컬럼/필터/통계 제거
- 프론트엔드: 임시저장/확정 stat cards를 차변합계/대변합계로 교체
- 백엔드: store(), storeFromBank() 기본 status를 draft→confirmed 변경
- 백엔드: index() 통계에서 draftCount/confirmedCount 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This reverts commit 6ecbcfd428.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 3개 탭(은행거래분개, 수동전표, 전표목록) 제거
- BankTransactionTab을 메인 화면으로 직접 렌더링
- ManualEntryTab, JournalEntryForm, JournalListTab 컴포넌트 삭제
- 미사용 아이콘(BookOpen, ListOrdered) 제거

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>
- bankTransactions()를 barobill_bank_transactions 테이블 직접 조회로 변경
- EaccountController 의존성 제거
- 계좌 목록을 DB distinct 조회로 제공 (별도 API 불필요)
- 프론트엔드 계좌 드롭다운 필드명 수정 (camelCase → snake_case)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 기간 빠른선택 버튼 추가 (이번달, 지난달, D-2월~D-5월)
- 조회건수 표시 추가
- 계좌/분개상태 필터를 2행으로 분리
- emerald 테마 통일

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Schedule 모델 생성 (schedules 테이블, type별 색상 상수)
- DashboardCalendarController 생성 (CRUD + 달력 partial)
- 대시보드 뷰에 월간 달력 섹션 추가 (HTMX + Vanilla JS)
- 일정 생성/수정/삭제 모달 구현
- 공휴일 빨간색 표시, 일정 유형별 색상 뱃지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DashboardCalendarController에 uploadFiles/deleteFile/downloadFile 추가
- 파일 업로드 라우트 3개 추가 (POST/DELETE/GET)
- 모달에 드래그앤드롭 파일 업로드 영역 추가
- XHR 진행률 표시, 파일 목록 렌더링, 개별 삭제
- Google Cloud Storage 연동 (가용시 자동 업로드)
- files 테이블 document_type='schedule' 활용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 생성/수정 모드 모두 드래그앤드롭 영역 표시
- 생성 모드: 파일을 대기 큐에 담고 저장 시 자동 업로드
- 대기 파일 미리보기 (노란색 뱃지 + '저장 시 업로드' 표시)
- 대기 파일 개별 제거 기능

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Schedule 모델에 TYPE_INTERVIEW(면접) 추가 (보라색)
- 유형 select 옆에 [+] 버튼 → 커스텀 유형 직접 입력 가능
- 컨트롤러 validation을 string|max:50으로 변경 (동적 유형 허용)
- 달력 뱃지 색상을 인라인 스타일로 변경 (Tailwind JIT 미빌드 대응)
- 수정 모달에서 커스텀 유형도 select에 자동 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- date 캐스트에 Y-m-d 포맷 지정하여 JSON 직렬화 시 UTC 변환 방지
- 달력 12일 일정이 모달에서 11일로 표시되던 문제 해결

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 이메일/로그인시간/상태 카드 제거
- 달력 아래에 한줄 바 형태로 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
체크된 메뉴 항목들을 함께 드래그하여 이동할 수 있도록 개선:
- 상위 메뉴 체크 시 하위 메뉴도 함께 그룹으로 묶여서 이동
- 드래그 중 그룹 항목 수 뱃지 표시
- 드래그 인디케이터에 그룹 개수 표시
- 그룹 이동 시 순차적으로 API 호출

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
계좌입출금내역에서 제거된 계정과목 설정 기능을 일반전표입력 페이지로 이관
- JournalEntryController에 계정과목 CRUD 메서드 추가
- 계정과목 CRUD 라우트 추가 (journal-entries/account-codes/*)
- AccountCodeSettingsModal 컴포넌트 추가
- 페이지 헤더에 계정과목 설정 버튼 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
은행거래 기반 분개 외에 수동으로 전표를 작성할 수 있는 탭/모달 추가
- 탭 시스템: 은행거래 분개 / 수동전표 탭 전환
- ManualJournalTab: 전표 목록 조회, 필터링, 통계 카드
- ManualJournalModal: 날짜/적요 입력, 분개라인 편집, 대차균형 검증
- 컨트롤러 index() 응답에 source_type 필드 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
탭으로 분리하지 않고 기존 은행거래 분개 화면에 수동 전표 추가 기능 통합
- 탭 시스템 및 ManualJournalTab 제거
- 페이지 헤더에 "전표 추가" 버튼 추가 → ManualJournalModal 열기

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 요약카드 4개→6개 확장 (등록카드, 총한도, 매월결제일, 사용금액, 선불결제, 잔여한도)
- 매월결제일: 휴일/주말 시 다음 영업일로 자동 조정 표시
- 사용금액: barobill_card_transactions 기반 청구기간 실거래 합산
- 선불결제: 수정 모달로 테넌트 단위 월별 금액 관리
- 잔여한도: (총한도 - 사용금액 + 선불결제) 계산

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- summary API에 cardUsages(카드번호별 사용금액) 응답 추가
- 카드 목록 프로그래스바가 바로빌 거래 합산 기준으로 표시
- 체크카드도 사용금액 있으면 금액 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 카드번호 문자형 출력 (="번호" 형식으로 과학적 표기 방지)
- 사업자번호, 가맹점명 열 추가
- 합계금액/공급가액/세액 3열로 분리 (화면과 동일)
- 분개 행도 공급가액/세액 분리 출력

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 확정(C) 기간 조회 시 대응하는 예정(P) 기간의 netVat 자동 계산
- 예정 환급세액 → "예정신고 미환급세액"으로 차감 표시
- 예정 납부세액 → "예정신고 기납부세액"으로 차감 표시
- 최종 납부세액 = 확정 산출세액 - 예정 차감액
- 상단 요약 카드에도 최종 세액 반영

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
vat_records 테이블에 tax_type 컬럼이 없어 DB 쿼리 실패.
index 메서드와 동일하게 인메모리 컬렉션 필터링으로 변경.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
예정 기간이 환급세액(음수)일 때만 확정에서 차감 표시.
예정 기간이 납부세액(양수)일 때는 표시하지 않음.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
동일 거래가 수동(is_manual=true)과 API(is_manual=false)로 중복 저장된 경우
MAX(id)로 최신 레코드를 선택하면 잔액이 0에서 계산된 수동 레코드가
선택되어 잔액이 잘못 표시되는 문제 수정.
API 레코드의 balance가 바로빌에서 제공한 정확한 은행 잔액이므로 우선 선택.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 모달 기본 높이 min-h-[80vh]로 확대 (기존 대비 1.5배)
- AccountCodeSelect, TradingPartnerSelect 드롭다운을 ReactDOM.createPortal로 변경
- 드롭다운이 모달 overflow에 의해 잘리지 않도록 fixed 포지셔닝 적용
- 공간 부족 시 위쪽으로 열리는 자동 방향 전환 지원
- 계정과목 → Tab → 거래처 → Tab → 차변/대변 → Tab → 적요
- 적요에서 Tab → 다음 행의 계정과목으로 이동
- 드롭다운 검색 중 Tab 시 선택 후 다음 필드 이동
- Enter/Space 키로 드롭다운 열기 지원
- 삭제 버튼 tabIndex=-1로 Tab 순서에서 제외
- handleSelect 후 triggerRef.focus()로 포커스 복원
- Tab 핸들러에서 setTimeout으로 안정적 포커스 이동
- 포탈 드롭다운 닫힐 때 포커스 유실 방지
- DocumentTemplateController: common_codes(doc_template_basic_field) 조회하여 뷰에 전달
- prepareTemplateData: basic_fields에 field_key 포함
- DocumentTemplateApiController: basic_fields 저장 시 field_key 포함
- edit.blade.php: 기본필드 행에 '연동키 선택' 드롭다운 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- NumberingRule 모델, 서비스, 컨트롤러 추가
- API/Blade 라우트 등록
- CRUD + 미리보기 기능

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>
VoiceInputButton 프리뷰 패널을 absolute → fixed 포지셔닝으로 변경
- 모달의 overflow-y-auto에 의한 클리핑 완전 우회
- 버튼 위치 기반으로 fixed 좌표 계산하여 항상 버튼 상단에 표시
- z-index 9999로 모든 요소 위에 렌더링

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
기존 비용 데이터를 복사하여 새 비용으로 등록할 수 있는 기능
- 복사 클릭 시 폼 데이터 유지한 채 등록 모드로 전환
- 날짜만 오늘 날짜로 자동 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- ConstructionSitePhotoRow 모델 추가
- 부모 모델에서 사진 컬럼 제거, rows() 관계 추가
- 서비스/컨트롤러에 행 추가/삭제 기능 추가
- 라우트를 행 기반 URL 구조로 변경
- 프론트엔드 멀티행 UI 전면 개편

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
work_date ISO 형식에서 YYYY-MM-DD만 추출하여 date input에 바인딩

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 수정 모드일 때만 행 추가/삭제 버튼 활성화
- 신규 생성 후 자동으로 수정 모드 진입

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- GoogleCloudService: STT 결과에서 언더스코어만으로 구성된 단어 필터링
- 프론트엔드: 기존 저장된 데이터 표시 시에도 언더스코어 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- GoogleCloudService: 단어 내부/앞뒤 _ 모두 제거 + cleanSttText 헬퍼
- MeetingMinuteService: 세그먼트 저장 시 _ 제거
- 프론트엔드: 대화기록/스크립트 탭 표시 시에도 _ 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 대화 기록 탭에서 텍스트, 화자 변경, 세그먼트 삭제 가능
- 편집/저장/취소 버튼을 탭 바에 배치
- 자동 높이 조절 textarea 컴포넌트 추가
- 녹음 중에는 편집 버튼 숨김

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>
- startEditingSegments에서 ▁(U+2581) 문자 제거 후 편집 시작
- DB에 이미 저장된 노이즈 문자도 편집 시 깨끗하게 표시

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>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Chirp 2 지원 리전: us-central1, europe-west4, asia-southeast1
서울(asia-northeast3)은 Chirp 2 미지원

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>
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>
- 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>
- Web Audio API rawAnalyser를 오디오 체인에 삽입 (compressor 이전, 원본 신호 분석)
- Spectral Centroid + VAD 기반 100ms 간격 실시간 화자 분류 엔진 구현
- 500ms 윈도우 다수결 투표로 화자 안정성 확보
- 수동 화자 선택 버튼 제거 → 자동 감지 인디케이터로 대체
- 최대 4명까지 자동 화자 프로필 등록 및 speakers 동기화

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>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
- 새 파일: resources/views/partials/react-cdn.blade.php
- 모든 React 페이지에서 중복된 CDN 스크립트를 @include('partials.react-cdn')로 대체
- 30개 파일 업데이트 (finance, juil, system, sales)
- 유지보수성 향상: CDN 버전 변경 시 한 곳만 수정
- esign 전자서명 관련 9개 파일 업데이트
- layouts/app.blade.php 업데이트
- fcm.js React 관련 변경사항 반영
자식 메뉴가 있는 부모 메뉴의 경우, 하위 경로까지 매칭되어
부모와 자식 메뉴가 동시에 활성화되는 문제를 수정.
자식 메뉴가 있으면 정확한 URL 매칭만 적용.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
다른 메뉴가 현재 URL에 정확히 매칭될 때 prefix 매칭을
비활성화하여, 형제 메뉴가 동시에 활성화되는 문제 해결.
예: /esign/create 접속 시 /esign 메뉴가 함께 활성화되던 문제.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
갑/을 역할별 단계별 가이드, FAQ 13개, 용어 사전 포함

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 전자계약 (E-Sign), 전자계약 대시보드, 전자계약 상세 등 → SAM E-Sign
- 9개 파일, 19곳 수정 (코드 식별자/URL은 유지)

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/...)
- WorkLogTemplateSeeder: 스크린/슬랫/절곡 공정별 작업일지 양식
- 공정별 결재라인, 기본필드(9개), 컬럼 구조 반영
- 판정 없음, 비고만 사용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DocumentTemplateApiController: 이미지 업로드 API 파일저장소 연동
- 양식 편집: 미리보기 모달 개선
- 문서 편집: UI 개선
- 빌드 에셋 업데이트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- OTP 개념 설명 (택배 보관함 비유)
- 왜 필요한지 쉬운 설명
- 시각적 단계별 가이드 (6자리 입력 UI 포함)
- 주의사항 친절한 안내
- FAQ에 "코드가 안 올 때" 항목 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- interact.js 기반 드래그 이동 + 8방향 리사이즈
- 3패널 레이아웃 (썸네일 | PDF뷰어 | 속성패널)
- PDF 페이지 썸네일 사이드바 + 필드 개수 뱃지
- 줌 컨트롤 (50%~200%, Ctrl+/-)
- Undo/Redo (Ctrl+Z/Shift+Z, 최대 50단계)
- 키보드 단축키 (화살표 미세조정, Delete 삭제, Ctrl+C/V 복붙)
- 스냅-투-그리드 토글 + 그리드 오버레이
- 서명자별 필드 타입 도구상자 (서명/도장/텍스트/날짜/체크박스)
- 선택 필드 속성 패널 (유형/라벨/좌표/필수여부)
- 백엔드 변경 없음, 기존 API 100% 호환

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>
모델 $fillable에 tenant_id 추가, 컨트롤러의 감사 로그 생성 3곳
(contract_created, contract_cancelled, sign_request_sent) 모두
tenant_id를 포함하도록 수정.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
configureFields()에서 서명 필드 생성 시 tenant_id 추가,
모델 $fillable에도 tenant_id 추가.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
detail.blade.php에서 호출하는 remind 엔드포인트가 누락되어 있었음.
POST /esign/contracts/{id}/remind 라우트 추가,
EsignApiController::remind() 메서드 구현 (상태 변경 + 감사 로그).

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>
기존: 브라우저 → 외부 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>
- submitSignature: 첫 번째 서명자 완료 시 다음 서명자에게 자동 이메일 발송
- send: sign_order_type이 parallel이면 모든 서명자에게 동시 발송

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- EsignFieldTemplate, EsignFieldTemplateItem 모델 추가
- EsignApiController에 템플릿 CRUD + 적용/복사 메서드 5개 추가
- web.php에 템플릿 라우트 5개 추가
- fields.blade.php에 템플릿 드롭다운 메뉴 + 모달 3개 추가
  (SaveTemplate, LoadTemplate, CopyFromContract)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 이름 25% : 이메일 50% : 전화번호 25% (grid-cols-8 기반 2:4:2)
- 작성자, 상대방 섹션 모두 동일 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- md: breakpoint 제거하여 항상 grid-cols-8 적용
- 사이드바 포함 레이아웃에서도 한 행으로 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- max-w-3xl 제거하여 전체 너비 사용
- flex 기반 반응형 레이아웃 (PC: 한 행, 모바일: 자동 줄바꿈)
- 이름(1):이메일(2.5):전화번호(1) flex-grow 비율 적용
- 작성자/상대방을 하나의 카드에 통합 (구분선으로 분리)
- SignerRow 컴포넌트 분리로 중복 제거
- 서명자 컬러 표시 (파란색: 작성자, 빨간색: 상대방)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 템플릿 관리 전용 페이지 (카드 그리드, 검색/필터, 편집/복제/삭제)
- API: showTemplate, updateTemplate, duplicateTemplate 추가
- indexTemplates에 category/search 필터 추가
- 계약 생성 시 템플릿 선택 UI 추가
- 필드 에디터에서 URL 파라미터 template_id 자동 적용
- EsignFieldTemplate 모델에 category 필드 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- PdfSignatureService 신규 생성 (FPDI+TCPDF 기반 PDF 합성)
- submitSignature에서 모든 서명 완료 시 자동 PDF 합성 호출
- downloadDocument에서 서명 완료 PDF 우선 제공
- setasign/fpdi, tecnickcom/tcpdf 패키지 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- detail: max-w-5xl 제거
- send: max-w-2xl 제거
- docs: max-w-7xl 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 번개 아이콘 클릭 시 랜덤 계약정보/서명자 자동 입력
- 슈퍼관리자/관리자에게만 표시
- 이메일은 테스트용 고정값 사용

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>
- 양식명 앞에 ID 번호 컬럼 추가
- colspan 10 → 11 수정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 상태/템플릿 필터에 onchange 즉시 검색 적용
- 양식분류(category) 필터 추가 (API + 뷰 컨트롤러 + 프론트)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- sections, columns는 삭제→재생성 대신 ID 보존 upsert로 변경
- document_data.section_id, column_id FK 참조 깨짐 방지
- 요청에 없는 섹션/컬럼/항목만 선택적 삭제

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- filterMenusByName에서 children 제거하여 동명 메뉴 중복 import 방지
- importMenu에서 name+parent_id로 매칭하여 다른 계층 동명 메뉴 자기참조 방지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 모델: EsignFieldTemplate fillable에 file 컬럼 추가
- storeTemplate: include_pdf + contract_id로 계약 PDF를 템플릿으로 복사
- store(계약 생성): template_id로 템플릿 PDF 자동 복사 (사용자 업로드 우선)
- duplicateTemplate: 복제 시 PDF 파일도 복사
- 템플릿 PDF 다운로드 엔드포인트 추가
- SaveTemplateModal: "현재 PDF 파일 포함" 체크박스 추가
- create: 템플릿 카드에 PDF 뱃지, PDF 자동 사용 안내
- templates: 템플릿 카드에 PDF 파일명 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- EsignCompletedMail Mailable 생성 (완료 알림 + PDF 다운로드 링크)
- completed.blade.php 이메일 뷰 템플릿 생성 (초록색 테마)
- submitSignature에 contract_completed 감사 로그 추가
- 모든 서명자에게 완료 이메일 발송 + completion_email_sent 감사 로그
- 이메일 발송 실패 시 try-catch로 계약 완료 보호

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- max-w-3xl + mx-auto로 폼 너비 제한 (768px)
- input/select/textarea padding 축소 (py-2 → py-1.5)
- 카드 내부 패딩 축소 (p-5 → p-4)
- 라벨 폰트 크기 축소 (text-sm → text-xs)
- 섹션 간격 축소 (space-y-5 → space-y-4)
- 버튼 크기 축소 및 rounded-lg → rounded-md 통일

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- EsignApiController에 destroy 메서드 추가 (복수 삭제 지원)
- 관련 파일(PDF, 서명이미지) 및 레코드(서명자, 필드, 감사로그) 일괄 삭제
- 서명 진행 중(pending, partially_signed) 계약은 삭제 차단
- DELETE /esign/contracts/destroy 라우트 추가
- 대시보드에 체크박스 전체/개별 선택 + 삭제 버튼 UI 추가
- 삭제 전 confirm 확인 다이얼로그

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 대시보드: 제목 옆 새로고침 버튼 (통계+목록 갱신)
- 계약 상세: 상태 뱃지 앞 새로고침 버튼 (계약 정보 갱신)
- 템플릿 관리: 제목 옆 새로고침 버튼 (템플릿 목록 갱신)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
백엔드:
- destroy를 SoftDelete 방식으로 변경 (deleted_at + deleted_by 기록)
- trashed: 휴지통 목록 조회 API 추가
- restore: 선택 복구 API 추가
- forceDestroy: 영구 삭제 API 추가 (파일+관련 레코드 완전 삭제)
- 라우트 3개 추가 (trashed, restore, force-destroy)

프론트엔드:
- 대시보드에 탭 UI 추가 (계약 목록 / 휴지통)
- 휴지통 탭: 삭제된 계약 목록, 삭제일 표시
- 선택 복구(파란색) / 영구삭제(빨간색) 버튼
- 휴지통 건수 뱃지 표시
- 삭제 시 메시지를 "휴지통으로 이동"으로 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
백엔드:
- uploadTemplatePdf: 템플릿 PDF 업로드/교체 API
- removeTemplatePdf: 템플릿 PDF 제거 API
- destroyTemplateItem: 개별 필드 아이템 삭제 API (signer_count 자동 재계산)
- updateTemplate 응답에 items 관계 포함

프론트엔드:
- 모달 폭 420px → 680px 확장
- 3개 탭 구성: 기본 정보 / PDF 파일 / 서식 필드
- PDF 탭: 현재 파일 정보, 다운로드, 교체, 제거 기능
- 서식 필드 탭: 필드 목록 테이블 (유형/라벨/서명자/페이지/위치/필수), 개별 삭제
- 편집 시 상세 데이터(items 포함) 로드

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PDF 위에서 드래그앤드롭으로 템플릿 필드를 편집하는 기능 구현:
- template-fields.blade.php 뷰 생성 (fields.blade.php 기반, signer_order 사용)
- updateTemplateItems API 추가 (필드 일괄 저장)
- 템플릿 카드/모달에 필드 편집 링크 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
/esign/templates/5/fields 접속 시 /esign, /esign/templates 둘 다
활성화되던 문제 수정. 더 구체적인 prefix 메뉴가 있으면 덜 구체적인
메뉴는 비활성화.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 시스템 변수 (서명자명, 이메일, 계약제목, 날짜 등) 자동 해석
- 커스텀 변수 정의/관리 (템플릿별 계약금액, 기간 등)
- 템플릿 필드 에디터: 변수 관리 + 필드-변수 바인딩 UI
- 계약 생성 폼: 템플릿 변수 입력 섹션 추가
- 계약 필드 에디터: 변수 연결 정보 표시
- PdfSignatureService: font_size 반영 렌더링

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 기본 상태(점선): 드래그=이동만 활성, 클릭=선택
- 더블클릭: 리사이즈 모드 전환(실선+핸들 표시, 크기조절)
- ESC 또는 바깥 클릭: 리사이즈 모드 해제
- fields.blade.php, template-fields.blade.php 양쪽 동일 적용

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>
Word(.docx/.doc) 파일 업로드 시 서버에서 LibreOffice headless로 PDF 자동 변환.
계약 생성, PDF 업로드, 템플릿 PDF 교체 3개 엔드포인트에 적용.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
파일 선택 시 메모리에 복사하여 디스크 파일 변경으로 인한
브라우저 ERR_UPLOAD_FILE_CHANGED 오류 방지.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
www-data 사용자의 홈 디렉토리에 쓰기 권한이 없어 변환 실패하는 문제.
HOME을 임시 디렉토리로 지정하여 해결.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- select → 자유 텍스트 입력으로 변경
- OCR에서 업태/종목 직접 매핑
- 컨트롤러 enum 검증 제거
- 필터 동적 옵션, 통계 카드 간소화

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 대표자(ceo) 입력란 추가 (OCR에서 ceo_name 직접 매핑)
- 주소(address) 입력란 추가 (메모가 아닌 별도 필드)
- 테이블/검색/CSV에 대표자 반영

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 등록/수정 모달에 매출/매입 라디오버튼 (기본값: 매출)
- 통계 카드에 매출/매입 건수 표시
- 필터 바에 매출/매입 필터 버튼
- 테이블에 매출/매입 뱃지 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 계약 생성 화면에 법인도장 업로드 UI 추가 (미리보기/삭제)
- store()에서 base64 이미지 디코딩 후 저장, creator signer에 연결
- send()에서 법인도장 있는 작성자 자동 서명 처리 (상대방에게만 이메일 발송)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 작성자 자동서명 로직 제거 → 양쪽 모두 서명 과정 필수
- 서명 화면에서 '직접 서명' / '법인도장' 선택 UI 추가
- 도장 선택 시 기존 stamp 이미지로 바로 제출
- getContract API에 has_stamp 필드 추가
- submitSignature에 use_stamp 플래그 처리 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 대시보드 설정 탭 추가 (법인도장 등록/미리보기/삭제 UI)
- tenant_settings 테이블에 esign/company_stamp 키로 저장
- 새 계약 생성 시 등록된 도장 자동 적용 (creator signer)
- 계약 생성 페이지에서 개별 도장 업로드 UI 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 업로드: base64 → 임시파일 → GCS 업로드
- 조회: GCS signed URL 반환 (60분 유효)
- 삭제: GCS 객체 삭제 + tenant_settings 삭제
- 계약 생성 시: GCS에서 다운로드 → 로컬 저장 → signer에 설정
- tenant_settings 값: image_path → gcs_object로 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- store()에서 template_id 있으면 필드 자동 생성 (서버 사이드)
- create.blade.php 변수 입력 UX 개선 (시스템/커스텀 변수 구분)
- 바로 발송 버튼 추가 (템플릿 선택 시)
- fields.blade.php URL 파라미터 기반 auto-apply 제거
- PdfSignatureService NanumGothic 한글 폰트 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Step 1: 계약 정보 + 서명자 (유효성 검사 포함)
- Step 2: 템플릿 선택 + PDF 미리보기 (필드 위치 오버레이)
- Step 3: 변수 입력 + 요약 + 생성/바로발송 버튼
- pdf.js 추가하여 템플릿 PDF 프리뷰 렌더링
- 필드 목록 테이블로 배치될 필드 한눈에 확인
- 스텝 인디케이터 (완료 단계 클릭 이동 지원)

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>
- PdfSignatureService: 자동 폰트 크기 공식 2배(h*0.7→h*1.4), 기본 정렬 C→L
- text_align 필드 추가 (L/C/R 정렬 선택 가능)
- store()/buildVariableMap(): sign_order→role 기반 매핑으로 변경
  (signer_order 1=creator/갑/회사, 2=counterpart/을/파트너)
- template-fields: 가로 정렬 버튼 UI 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- template-fields/fields FieldOverlay: justify-center → text_align 기반 정렬
- 기본값 justify-start(왼쪽), text_align에 따라 L/C/R 반영

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- fmtDate() 유틸 추가: UTC ISO 문자열을 브라우저 로컬 시간으로 변환
- 서명자 signed_at, 활동 로그 created_at, 계약 생성일/만료일 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- overlayDate: Y-m-d → Y년 n월 j일, 미지정 시 12pt 고정
- buildVariableMap: current_date/expires_at도 동일 형식 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- EsignApiController에 searchPartners() 검색 API 추가
- SalesPartner 모델 $fillable에 company_name, biz_no, address 추가
- User 모델에 salesPartner() HasOne 관계 추가
- create.blade.php에 PartnerSearchModal 컴포넌트 + 자동채우기 로직 추가
- web.php에 search-partners 라우트 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
- 컨트롤러 store/update 유효성 검사에 3개 필드 추가
- 서비스 create/update에서 SalesPartner 레코드 생성/업데이트
- 등록 폼(create.blade.php)에 사업자 정보 섹션 추가
- 수정 모달(edit-modal.blade.php)에 사업자 정보 섹션 추가
- 테스트 데이터 자동입력에 사업자 정보 포함

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>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 기존 레코드가 있거나 실제 값이 입력된 경우에만 저장
- SoftDelete 스코프 충돌 방지를 위해 where 쿼리로 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 폼을 AJAX 제출로 변경하여 422 에러 시 모달 내 에러 메시지 표시
- innerHTML로 로드된 script 태그 수동 실행 처리
- 컨트롤러에 JSON 응답 지원 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- flex-1 제거하여 카드가 화면 전체를 채우지 않도록 변경
- 이전/서명확인 버튼이 서명 입력란 바로 아래에 위치

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
취소/거절/완료된 계약이나 이미 서명한 서명자가 서명 페이지에
접근할 때 즉시 명확한 에러 메시지를 표시하도록 개선.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
getContract API가 항상 데이터를 반환하되 is_signable 플래그로
서명 가능 여부를 전달하도록 변경. done 페이지에서 signed/completed
상태의 계약도 정상적으로 정보를 표시할 수 있도록 수정.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
이메일에서는 JavaScript가 차단되므로 클립보드 버튼 대신
user-select:all로 터치/클릭 시 전체 선택되는 복사 영역 추가.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
configureFields()와 copyFieldsFromContract()에서 기존 필드를
삭제 후 재생성할 때 field_value를 설정하지 않아 계약서 PDF에
서명자명, 날짜 등 기본값이 빠지는 문제 수정.
buildVariableMap()으로 변수 맵을 구성하여 값을 채우도록 개선.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- BarobillService에 KAKAOTALK SOAP 클라이언트 추가
  - 채널/템플릿 관리, 알림톡/친구톡 발송, 전송조회/예약취소 API
- BarobillKakaotalkController (API) 생성: 15개 엔드포인트
- KakaotalkController (페이지) 생성: 5개 페이지
- 라우트 등록 (web.php, api.php)
- Blade 뷰 5개 생성: 대시보드, 채널관리, 템플릿관리, 발송, 전송내역

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 알림톡/친구톡 비교, 준비사항, 채널/템플릿/발송/전송내역 사용법
- FAQ 섹션 포함 (초보자 친화적 설명)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- EsignApiController: send_method/sms_fallback 저장, dispatchNotification/sendAlimtalk 메서드 추가
- EsignPublicController: 완료/다음서명자 알림에 알림톡 지원 추가
- EsignContract 모델: send_method, sms_fallback fillable/casts 추가
- send.blade.php: 발송방식 선택 UI (알림톡/이메일/동시), SMS 대체발송, 연락처 확인

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- sendATKakaotalkEx() 호출 시 존재하지 않는 certKey 파라미터 제거 (TypeError 버그)
- sendAlimtalk/dispatchNotification 결과 반환 (void → array)
- send/remind 응답에 notification_results 포함
- 감사 로그 metadata에 서명자별 알림 발송 결과 저장
- EsignPublicController 다음 서명자/완료 알림에도 동일 수정 적용
- detail.blade.php: 발송 방식 배지, 서명자 연락처, 알림 오류 배너, 활동 로그 발송 결과 표시
- send.blade.php: 발송 후 알림 실패 시 경고 메시지 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 템플릿 카드의 PDF 표시 영역에 '교체' 버튼 추가
- PDF 미연결 템플릿에 'PDF/Word 파일 추가' 버튼 표시
- 카드에서 직접 파일 선택 → 업로드 → 즉시 반영
- PDF/DOC/DOCX 지원 (서버에서 자동 PDF 변환)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 기존 번개(노란색): 영업파트너 계약서 테스트 데이터
- 새 번개(보라색): 비밀유지서약서 테스트 데이터
- 개발 편의를 위한 관리자 전용 퀵필 버튼

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- searchPartners 역할 필터를 sales만 → sales/manager 모두 포함하도록 확장
- 사용자 역할(영업파트너/상담매니저)을 position 필드로 API 응답에 추가
- handlePartnerSelect에 position 매핑 추가 (key: position, label: 포지션/직책/역할)
- PartnerSearchModal 검색 결과에 position 배지 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SalesPartner: referrer_partner_id, referrer/referredGroups 관계, isGroup() 헬퍼
- SalesCommission: 유치수당 필드, referrerPartner 관계, 지급 추적 메서드
- SalesCommissionService: 단체/개인 분기 수당 계산 로직
- SalesManagerService: 단체 등록 시 수당률 자동 설정
- SalesManagerController: 유형 선택 및 유치 파트너 지정 기능
- 대시보드: 유치수당 카드 표시 및 합산
- UI: purple 색상 처리 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- createCommission: 개인 파트너도 parent_id → SalesPartner 조회하여 3% 협업지원금 계산
- 대시보드: "유치수당" → "협업지원금" 카드 이름 복원
- 본사 총 수당 구조: 개인 28%(20+5+3), 단체 33%(30+0+3)
- 변경 보고서 v2 업데이트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
개인/단체 파트너 수당 체계를 설명하는 7슬라이드 PPTX 자료:
표지, 수당 체계 비교, 개인/단체 상세, 협업지원금 설명, 계산 예시, 지급 절차 요약

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 전 슬라이드에 빨간색 'CONFIDENTIAL/대외비' 스탬프 추가
- 표지에 '사내 대외비 문서' 보안 경고문 추가
- 협업지원금 설명을 '내부 복리후생 지원제도'로 순화
- '생계 보조' → '안정적 파트너십 유지를 위한 내부 지원'으로 변경
- 유의사항(필독) 섹션 추가: 외부 유출 금지 명시
- 보안 유의사항 슬라이드(8번) 신규 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
페이지 로드 시 바로빌 API를 백그라운드에서 호출하여 신규 데이터를 자동 동기화.
수동 데이터소스 토글/저장 버튼 제거, 항상 로컬 DB에서 즉시 표시 후 증분 동기화.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- GeminiScriptService: 트렌딩 제목/시나리오 생성
- VeoVideoService: Veo 3.1 영상 클립 생성
- TtsService: Google TTS 나레이션 생성
- BgmService: 분위기별 BGM 선택
- VideoAssemblyService: FFmpeg 영상 합성
- VideoGenerationJob: 백그라운드 처리
- Veo3Controller: API 엔드포인트
- React 프론트엔드 (5단계 위저드)
- GoogleCloudService.getAccessToken() public 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- .env API 키 대신 시스템 > AI 설정의 활성 Gemini 설정 사용
- API Key / Vertex AI(서비스 계정) 방식 자동 분기 지원

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 기본 모델을 gemini-3.0-flash로 변경
- @apply를 순수 CSS로 전환 (Tailwind CDN 호환)
- 제목 카드에 라디오 도트, 체크 뱃지, hover/selected 효과 추가
- 선택 시 border glow + 체크마크 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 경과 시간 실시간 표시 (초 단위 타이머)
- 단계별 타임라인 (Queue 대기 → TTS → 영상 → BGM → 합성)
- 프로그레스 바 shimmer 애니메이션 (작동 중 표시)
- 2분간 변화 없으면 경고 배너 표시
- 폴링 횟수 & 서버 마지막 업데이트 시간 표시
- status API에 updated_at/created_at 추가

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>
- VeoVideoService.waitAndSave() 반환값을 array로 변경 (실패 원인 포함)
- 클립 생성 실패 시 프롬프트 수정 후 자동 재시도
- 재시도 실패 시 해당 장면 건너뛰고 나머지로 합성 진행
- 성공 클립이 절반 미만일 때만 전체 실패 처리
- 건너뛴 장면의 나레이션/자막 자동 필터링

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
영상 생성 Job이 10~20분 소요되는데 retry_after=90초로 설정되어
DB 큐 드라이버가 Job을 "멈춤"으로 판단하여 재시도 → tries 초과 실패
retry_after를 Job timeout(1800초)보다 크게 설정하여 해결

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 이력 테이블 첫 열에 체크박스 추가 (전체 선택/해제)
- 선택 시 상단에 빨간색 삭제 버튼 표시
- DELETE /video/veo3/history API 엔드포인트 추가
- 삭제 후 이력 목록 자동 새로고침

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 자막: 하단→중앙(Alignment=5), 48→96pt, 외곽선 5px, 줄바꿈 12자
- TTS: 나레이션 볼륨 1.0→2.0 (2배 증가)
- BGM: 무음 대신 분위기별 앰비언트 화음 자동생성 (FFmpeg aevalsrc)
- BGM 볼륨: 0.15→0.4 (나레이션 방해 안 하는 수준)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Gemini 프롬프트: visual_prompt에 한국인 여성(20대) 등장인물 규칙 추가
- Veo 프롬프트: 모든 클립에 "Korean woman in her 20s" 프리픽스 자동 추가
- 싱크 버그: activeNarrationPaths 인덱스 off-by-one ($num-1→$num) 수정
  - 나레이션이 영상보다 1장면 앞서 재생되던 근본 원인
- concatNarrations: atrim+apad로 나레이션을 장면 길이에 정확히 매칭

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 날짜→생성일시: KST(Asia/Seoul) 기준 MM/DD HH:mm 형식
- 제작시간 열 추가: created_at~updated_at 차이 계산 (완료/실패 시)
- 진행 중인 항목은 "진행 중" 표시
- history API에 updated_at 추가 반환

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>
- VideoGenerationJob: 최종 합성 후 GCS 업로드, gcs_path 저장
- Veo3Controller: download/preview GCS 서명URL 사용, destroy GCS 파일 삭제
- VideoGeneration 모델: gcs_path fillable 추가
- GCS 불가 시 로컬 파일로 폴백

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Google Trends RSS 기반 실시간 급상승 키워드 수집 서비스 추가
- 트렌딩 컨텍스트 활용 후킹 제목 생성 (5패턴: 충격/비교/숫자/질문/반전)
- Veo 3.1 공식 가이드 기반 visual_prompt 5요소 프레임워크 적용
- GET /video/veo3/trending 엔드포인트 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- KeywordInput 컴포넌트에 Google 실시간 급상승 키워드 가져오기 버튼 추가
- 키워드 칩(pill) 클릭 시 인풋 자동 채움 + trending_context 저장
- handleKeywordSubmit에서 trending_context를 POST body에 포함하여 전송
- 직접 입력 시 기존과 동일하게 동작 (하위 호환)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 초반 3초 후킹 규칙 강화 (충격/의문/공감 필수, 평범한 인사 금지)
- 나레이션 속도감 향상 (장면당 50~80자, 빠른 말투)
- 매 장면마다 놀라운 팩트 또는 감정 변화 필수
- 마지막 장면 CTA(좋아요/구독/알림설정) 완전 제거 → 여운 남기는 마무리로 대체
- 장면 구성 6→5장면으로 변경 (CTA 장면 삭제, 시간 재분배)
- 나레이션 좋은/나쁜 예시 추가로 AI 출력 품질 가이드

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
TTS 개선:
- 음성: ko-KR-Wavenet-A → ko-KR-Neural2-C (남성, 자연스럽고 개성있는 음성)
- 속도: 1.0x → 1.5x (기존 대비 50% 빠르게)
- 피치: 0.0 → 2.0 (더 에너지 있는 톤)

자막 싱크 버그 수정:
- 장면 전체 나레이션을 한 블록으로 표시 → 문장 단위로 분리 표시
- 각 문장 타이밍을 글자 수 비례로 자동 계산
- 문장 분리 로직: 마침표/느낌표/물음표 기준, 폴백으로 쉼표 분리
- 장면 끝 0.3초 여백으로 자연스러운 전환

시나리오 프롬프트:
- 나레이션 문장 길이 규칙 추가 (한 문장 15~25자)
- 반드시 마침표/느낌표/물음표로 문장 구분하도록 명시
- 장면당 글자 수 60~100자로 밀도 향상

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
건강 채널 전용 트렌딩 시스템:
- Gemini로 실시간 트렌드에서 건강 관련 키워드만 필터링
- 간접적 키워드도 건강 앵글로 리프레이밍 (예: 김치 → 장건강)
- 필터 결과 30분 캐싱 (Gemini 호출 최소화)
- 필터 실패 시 원본 키워드 폴백

제목 생성 건강 앵글 반영:
- generateTrendingHookTitles 프롬프트에 건강 채널 명시
- trending_context에 health_angle, suggested_topic 추가
- 모든 제목이 건강/웰빙 관점으로 생성되도록 가이드

UI 건강 테마 적용:
- 버튼/칩 색상: orange/indigo → green 테마
- 칩에 건강 앵글 태그 배지 표시
- 칩 클릭 시 건강 주제(suggested_topic)가 인풋에 채워짐

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
TTS 설정:
- 음성: Neural2-C (남성) → Neural2-A (여성)
- 속도: 1.5x → 1.2x (20% 감속)
- 피치: 2.0 → 0.0 (자연스러운 여성 톤)

자막 한글자/한단어 버그 수정:
- 최소 청크 길이 10자 보장 (짧은 조각 인접 청크에 병합)
- 전체 25자 이하면 분리하지 않고 한 블록으로 표시
- 남은 짧은 버퍼는 마지막 청크에 합치기
- 최소 표시 시간 0.8초 → 1.5초로 증가
- 줄바꿈 기준 14자 → 16자 (가독성 향상)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
이모지/특수문자 제거:
- TtsService: TTS 전송 전 이모지, *강조*, (효과음), [동작] 등 제거
- VideoAssemblyService: 자막 생성 시에도 동일하게 이모지 제거
- 유니코드 이모지 전체 블록 커버 (이모티콘~태그 문자)

자막 분리 로직 개선:
- 5자 미만 조각만 병합 (기존 10자 → 과도한 병합 제거)
- 정상 문장(5자+)은 독립 자막으로 표시
- 장면당 2~3개 자막으로 깔끔하게 전환

시나리오 프롬프트 수정:
- 이모지/이모티콘 절대 금지 규칙 명시
- *강조*, (효과음), [동작], ○기호 금지
- 숫자 한글 표기 권장 (3가지 → 세 가지)
- 장면당 글자 수 40~70자로 조정 (1.2x 속도에 맞춤)
- 한 문장 10~20자로 축소 (자막 가독성)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- TTS 속도: 1.2x → 1.4x
- 자막 타이밍: 장면의 90% → 75% 구간에 압축 (음성과 싱크)
- 쇼츠 트렌드에 맞춘 빠른 템포

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Lyria API 연동:
- Vertex AI 기반 Google Lyria 음악 생성 API 추가
- 분위기(mood)별 영어 프롬프트 매핑 (upbeat, energetic, calm 등 8종)
- 생성된 30초 WAV → MP3 변환 + 영상 길이에 맞춰 루프/트림
- 페이드인(1초) + 페이드아웃(3초) 자동 적용
- 비용: $0.06/30초

BGM 우선순위 변경:
- 1순위: Lyria AI 배경음악 (신규)
- 2순위: 프리셋 BGM 파일 (storage/app/bgm/)
- 3순위: FFmpeg 앰비언트 (기존 폴백)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Veo3Controller에 show 엔드포인트 추가 (시나리오/프롬프트 상세 데이터 반환)
- YouTube Shorts 제목/설명/해시태그 자동 생성 (완료된 영상)
- DetailModal 컴포넌트: 탭 UI (시나리오/프롬프트 | YouTube 텍스트)
- 이력 테이블 행 클릭 시 상세 모달 표시
- 복사 버튼으로 YouTube 텍스트 클립보드 복사

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- splitIntoSentences 정규식: 연속 구두점(?!, !!, ?!?)을 하나로 취급
- 분리 조건: 구두점 후 공백이 있을 때만 분리 (공백 없으면 분리 안 함)
- 짧은 조각 병합 방향: forward → backward (이전 문장에 붙임)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PCRE는 (?<=[.!?]+) 가변길이 lookbehind 미지원
→ (?<=[.!?])(?![.!?]) 고정길이 lookbehind + negative lookahead 조합으로 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PCRE lookbehind는 멀티바이트 문자 클래스에서 가변길이 오류 발생
→ \K (match reset)로 대체하여 구두점은 앞 문장에 유지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 프롬프트에 엄격한 제외 규칙 추가 (연예인/정치인/스포츠선수/드라마 등)
- "간접 연결 가능하면 포함" 조건 삭제 (억지 건강 앵글 방지)
- 컨트롤러: 필터 결과가 비면 원본 대신 빈 배열 반환

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>
- 생성 이력 제목 옆에 새로고침 아이콘 버튼 추가
- 클릭 시 스피너 회전 애니메이션 + 이력 목록 갱신

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>
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>
- 기대효과 박스 갯수 기반 동적 폭 계산 (4개일 때 w:2.18, gap:0.15)
- 박스가 좁을 때 폰트 자동 축소 (title 10pt, desc 8pt)

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>
활성 문서 4종 + 아카이브 문서 관리 및 수정 이력 추적용

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>
화면 캡처 후 바로 Ctrl+V로 업로드 가능.
클립보드 이미지 자동 감지, 파일명 자동 생성,
붙여넣기 시 녹색 플래시 시각 피드백 제공.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
- stale closure 버그 수정: useRef로 최신 files/previews 참조
- 이미지 추가 시 기존 preview URL 유지 (revoke 안 함) → 올바른 누적
- 드래그 앤 드롭 순서 변경 기능 추가
- + 버튼으로 추가 이미지 등록 UI 개선
- 파일 선택 후 input value 리셋 (같은 파일 재선택 가능)

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>
- 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>
- XHR upload.onprogress로 파일 업로드 실시간 진행률 표시 (0~50%)
- AI 분석 단계 진행률 시뮬레이션 표시 (50~100%)
- 버튼 내부에 반투명 progress fill 애니메이션
- 단계별 텍스트 변경: "업로드 중... 30%" → "AI 분석 중... 75%"
- 업로드+분석을 ScreenshotUpload 내부에서 일괄 처리

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
인트로(scene 1)와 아웃트로(scene 999) 슬라이드는 이미지에
텍스트가 포함되어 있으므로 ASS 자막 생성에서 제외

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>
- 모든 스크린샷을 1920x1080으로 정규화 후 Gemini에 전송
  (비율 유지, 여백은 검정 → 일관된 해상도로 좌표 정확도 향상)
- 그리드 라벨에 실제 0-1000 좌표 병기 (0=0, 1=100, ..., 9=900)
- 교차점에 빨간 십자 마커 추가 (더 정밀한 참조점)
- 프롬프트에 정규화 해상도 + 그리드 간격 정보 명시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- generateAssSubtitle()에 layout 파라미터 추가 (portrait/landscape)
- landscape 모드: PlayRes 1920x1080, 폰트 48pt, Alignment=2(하단 중앙)
- WrapStyle=2 (줄바꿈 없음) + maxCharsPerLine=999 → 한줄 유지
- BorderStyle=3 (반투명 배경 박스) → 가독성 확보
- MarginL/R=20 (좌우 여백 최소) → 최대한 길게
- TutorialVideoJob에서 'landscape' 레이아웃으로 호출

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>
- 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>
- Controller: analyzeScreenshots()를 try-catch로 감싸 JSON 에러 응답 보장
- Frontend: api() 함수에서 HTML 응답(504/502 등) 감지 → 친절한 한글 에러 메시지 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SlideAnnotationService: 아웃트로 메인텍스트 36→72, 서브텍스트 24→48
- ScreenAnalysisService: 그리드 오버레이 레터박스 제거 (전체 채움)
  → Gemini 좌표가 이미지 비율과 직접 매핑되어 스포트라이트 위치 정확도 향상

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>
- 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>
- 빈 결과를 30분간 캐시하는 문제 수정 (성공 결과만 캐시)
- 건강 키워드가 없을 때 리프레이밍 폴백 추가 (트렌드를 건강 관점으로 재해석)
- 최종 폴백: 원본 인기 키워드 표시
- 프론트엔드 에러/안내 메시지 분리 (오류 vs 건강 키워드 없음)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
영업파트는 본사 소속이므로 테넌트 선택이 불필요하여
sales.* 라우트에서 헤더/사이드바의 테넌트 셀렉터를 숨김 처리

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
영업파트너가 직접 등록하므로 등록자가 곧 유치파트너임.
드롭다운 대신 등록자 이름을 표시하고 서버에서 자동 설정.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
salesPartner 관계를 eager load하여 partner_type 표시
개인: 하늘색 뱃지, 단체: 주황색 뱃지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 승인 전(pending): 라디오 버튼으로 개인/단체 변경 가능
- 승인 후(approved): 읽기 전용 뱃지로 표시
- 유형 변경 시 수당률 자동 설정 (단체 30%, 개인 초기화)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
등록폼/수정모달 모두 적용

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>
- User 모델에 isGroupPartner() 헬퍼 추가
- 대시보드에서 단체 파트너는 판매자 카드만 표시 (관리자/협업지원금 카드 제외)
- 유치 파트너 현황 탭 단체 파트너에게 숨김
- 파트너 등록 create/store 접근 차단 (403)
- 파트너 목록에서 등록 버튼 숨김
- SidebarMenuService에 hide_for_group_partner 옵션 기반 메뉴 필터링 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
기존: 모든 파트너에 대해 1개월 구독료를 예상수당으로 사용
수정: 단체 파트너 → 개발비×3%(협업지원금), 개인 파트너 → 1개월 구독료(관리자 수당)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
- 기존: balance 제외 4컬럼 매칭 → 같은 시간/금액의 다른 거래가 중복으로 처리됨
- 수정: balance 포함 5컬럼 매칭 → DB unique 제약조건과 동일하게 정확히 식별
- update 시 balance 제외 (매칭 조건이므로 변경 불필요)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Alpine 컴포넌트 함수를 HTMX partial에서 메인 페이지로 이동하여
x-data 처리 시점에 함수가 정의되어 있도록 수정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 정산관리에 수당 지급 탭 추가 (파트너별 그룹핑 지급 대기 목록)
- 파트너별 상세 건 목록 HTMX 확장 기능
- 수당지급현황통계 페이지 (Chart.js 4개 차트 + 월별 요약 테이블)

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>
?tab=payment 등 URL 파라미터로 직접 접속 시 로딩 스피너가
무한 표시되는 문제 수정. DOMContentLoaded에서 초기 탭의
HTMX 콘텐츠를 자동 로드하도록 변경.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
필터 항목이 행으로 나열되던 문제 수정.
grid-cols-2 md:grid-cols-3 레이아웃으로 변경하여 컴팩트하게 표시.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
모바일 2열 → 태블릿 3열 → 데스크톱 6열 반응형 레이아웃

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
필터 6개 + 버튼 영역(col-span-2)을 한 줄에 배치.
모바일 2열 → 태블릿 4열 → 데스크톱 8열 반응형.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
사이드바로 인해 grid 열이 깨지는 문제 해결.
flex-wrap으로 변경하여 PC에서 한 줄, 모바일에서 2열 자동 배치.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
영업파트너 select가 남은 공간을 전부 채우던 문제 수정.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 개인 파트너: 협업지원금 금액 수정 가능한 number input 추가
- 단체 파트너: "-" 표시 (자동계산 3% 고정, 수동 수정 불가)
- AdminProspectController에 updateReferrerCommission 메서드 추가
- firstOrCreate에 referrer_rate, referrer_commission 필드 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
management.sales_partner_id가 미설정된 경우
registered_by(User ID)로 SalesPartner를 조회하여 partner_type 결정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- select * → 목록에 필요한 컬럼만 select (JSON 대용량 컬럼 제외)
- old_values, new_values, session_info 등 정렬 버퍼 과다 사용 방지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- customerTab() 메서드: SalesTenantManagement 기반 쿼리로 재작성
- getCustomerStats() private 메서드 추가 (총개발비/수금완료/미수금/개발진행/구독전환)
- customer-tab.blade.php: Alpine.js CRUD → 순수 Blade 테이블로 전체 교체
- index.blade.php: 미사용 customerSettlementManager() Alpine 함수 제거
- 필터: 검색/개발상태/수금상태/담당파트너 4종
- 테이블: 고객사/파트너/매니저/개발비/1차/2차/구독료/개발상태 8열

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- eager loading에 management.tenant, management.tenantProspect 추가
- 검색 필터를 management 기반 고객사명 검색으로 변경
- 테넌트 컬럼을 management→tenant/tenantProspect 기반으로 표시
- 본사 진행상태(hq_status) 배지 추가
- 입금액 0원일 때 '-' 표시로 개선

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- partner→user 없을 시 management→salesPartner→user → management→manager 순으로 fallback
- eager loading에 management.salesPartner.user, management.manager 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 입금액: commission이 0이면 management의 deposit/balance 금액으로 fallback
- 유치파트너: commission→referrerPartner → partner→referrer → management→salesPartner→referrer 순 fallback
- 매니저: commission→manager → management→manager 순 fallback
- 파트너/매니저/유치 수당 0원일 때 '-' 표시
- 수당률 0%일 때 숨김 처리
- eager loading에 partner.referrer.user, management.salesPartner.referrer.user 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 영업파트너: tenantProspect→registeredBy(가망고객 등록자) 경로 추가
- 유치파트너: registeredBy→salesPartner→referrer 경로 추가
- eager loading에 management.tenantProspect.registeredBy.salesPartner.referrer.user 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 유치파트너 = 영업파트너 user의 parent_id (User→parent 관계)
- partner→user→parent, salesPartner→user→parent, registeredBy→parent 순 fallback
- eager loading 정리 (불필요한 referrer 체인 제거, parent 관계 추가)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- commission 금액이 0일 때 management의 total_registration_fee/contractProducts에서 계산
- 기준액 = 총개발비 / 2, 입금액 = 기준액 (계약금/잔금 각 50%)
- 파트너수당 = 기준액 × 20%, 매니저수당 = 기준액 × 5%, 유치수당 = 기준액 × 3%
- eager loading에 management.contractProducts 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 구분 컬럼: partner_type 기반 개인(sky)/단체(purple) 배지
- 단체: 파트너 30%, 매니저 0%, 유치 3%
- 개인: 파트너 20%, 매니저 5%, 유치 3%
- eager loading에 registeredBy.salesPartner 추가 (타입 판별용)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 매니저수당: 기준액 비율(5%) → 구독료 1개월(subscription_fee)로 변경
- 유치파트너수당: 개인일 때 상위파트너 5%, 단체일 때 유치 3%
- 파트너수당: 개인 20%, 단체 30% (기존 유지)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 담당파트너: salesPartner→user → tenantProspect→registeredBy fallback 추가
- 개발비/계약금/잔금: contractProducts 기반 계산 fallback 추가
- 구독료: contractProducts fallback 추가
- eager loading에 tenantProspect.registeredBy.salesPartner, contractProducts 추가
- 파트너 필터에 tenantProspect.registeredBy 경로 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 상수: DEFAULT_MANAGER_RATE 제거, 유치수당률 개인5%/단체3% 분리
- createCommission: 파트너 resolve fallback 추가, 매니저수당=구독료1개월
- approve/bulkApprove: 금액 0원 기존 레코드 승인 시 자동 재계산
- recalculateCommission: 신규 메서드 추가 (partner_id/금액 정상화)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
기존에는 management당 하나의 커미션 레코드만 생성되어 수당리스트에 계약금만 표시됨.
이제 1차 필드(first_*)는 deposit 레코드, 2차 필드(second_*)는 balance 레코드로
분리하여 양쪽 모두 수당리스트에 나타남.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 고객관리 테이블: 1차수당/2차수당/매니저수당/협업지원금/등록일 열 제거, 계약일 열 추가 (16열→12열)
- 정산관리 수당정산 테이블: 수당지급일/매니저지급일/협업지원금 인라인 편집 컬럼 추가
- SalesCommissionController에 updateCommissionDate 메서드 추가
- 불필요한 JS 함수 제거 (saveReferrerCommission, checkHandoverStatus)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 수당정산+수당지급 → 수당관리 탭으로 통합
- 서브탭 추가: 영업파트너 수당 / 매니저 수당
- 파트너별 현황 탭 제거
- 수당유형 필터 제거 (서브탭으로 대체)
- 기존 table.blade.php → partner/manager 테이블로 분리

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- rowspan 2행 구조를 단일 행으로 변경
- 테넌트 다음에 계약일(contracted_at) 열 추가
- 지급예정일/수당지급일/협업지원금/매니저지급일을 독립 열로 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- management_id로 그룹핑하여 같은 테넌트의 1차(계약금)/2차(잔금) 한 블록에 표시
- 공통 열(테넌트, 계약일) rowspan=2로 묶기
- 구분 열 추가 (1차 파란색, 2차 초록색 뱃지)
- 입금~협업지원금/매니저지급일 열은 각 차수별 독립 표시
- 데이터 없는 차수는 대시(-) 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 2차 레코드 미존재 시 빈 행 표시하지 않음
- 1차만 있으면 rowspan 없이 단일 행 표시
- 1차/2차 모두 있을 때만 rowspan 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
referrer_commission 컬럼이 NOT NULL인데 빈값을 null로 저장하려 해서
Integrity constraint violation 발생. 빈값은 0으로 처리하도록 수정.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
전체선택 시 현재 서브탭의 체크박스만 선택되도록 수정.
서브탭 전환 시 기존 선택 초기화.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
getActiveSubtabContainer에서 Alpine 내부 API 대신
offsetParent로 활성 서브탭 컨테이너를 판별하도록 변경.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
매니저 수당은 1계약당 1회 지급 구조이므로
그룹핑/구분 열/rowspan 로직을 제거하고 단순 1행 구조로 변경.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
grid 균등분할 → flex wrap + min-width로 자연스러운 너비 적용.
수당관리 필터와 동일한 스타일로 통일.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
인계(handover) 완료된 업체 = 구독 업체로 간주.
기존 contracted() 스코프 + subscription_fee 조건 대신
hq_status='handover' 조건으로 변경. 불필요한 상태 필터 제거.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 필터: 년/월 범위, 상태, 지급유형, 파트너, 매니저, 검색어
- 통계 카드 4→8개 (총 발생액, 지급완료, 미지급, 파트너수, 유형별 합계, 평균)
- 차트 4→6개 (월별 추이, 유형비율, Top10, 상태분포 건수/금액, 파트너vs매니저)
- 테이블 1→3개 탭 (월별 요약, 파트너별 결산, 매니저별 결산 + 완료율 프로그레스바)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- BankSyncStatus 모델 추가 (월별 동기화 상태 추적)
- BankTransaction에 getCachedByMonth() 메서드 추가
- EaccountController fetchAccountTransactions() 캐싱 로직 적용
  - 과거 월: sync 레코드 존재 시 DB 캐시 반환
  - 현재 월: 10분 이내 sync이면 DB 캐시 반환, 초과 시 API 재호출
  - 미동기화: API 호출 → DB 자동 저장 → sync 상태 갱신
- cacheApiTransactions(): insertOrIgnore로 기존 레코드 보호
- convertDbToRawLog(): DB→SOAP 객체 변환 (기존 파싱 로직 호환)
- updateSyncStatus(): 동기화 상태 upsert

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Client 모델 생성 (거래처 검색용)
- EaccountController에 searchClients API 추가
- save/parseTransactionLogs/convertManualToLogs/convertDbToRawLog에 client_code/client_name 필드 추가
- ClientCodeSelect 컴포넌트 추가 (서버 검색 기반 debounce 드롭다운)
- 테이블에 거래처코드 컬럼 추가
- BankTransaction 모델 fillable에 client_code/client_name 추가
- 라우트에 clients/search 엔드포인트 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Client::searchByCodeOrName → searchByIdOrName으로 변경
- 검색 기준: id(숫자일 때 정확 매칭) + name(LIKE 검색)
- 반환값: client_code 대신 id를 code로 반환

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Barobill/Client 모델 삭제, Finance/TradingPartner 모델 사용
- 거래처관리(finance/partners)와 동일한 데이터 소스 사용
- status='active' 필터 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- OverviewTab: 기술 스택에 카카오 알림톡 API 추가
- UserManualTab: 소개, 역할, 준비물, 서명 요청, 리마인더, OTP 인증 등 전반에 알림톡 채널 추가
- UserManualTab: 을 가이드에 알림톡 수신 예시 UI 추가
- WorkflowTab: 발송/인증/완료 단계에 알림톡 채널 반영
- SecurityTab: OTP 인증 프로세스에 알림톡 우선 발송 반영
- ArchitectureTab: KakaoAlimtalkService 서비스 추가
- OperationsTab: 알림톡 환경 변수, 장애 대응 가이드 추가
- ChangelogTab: v1.1 계획에 카카오 알림톡 연동 추가
- FAQ, 용어사전 등 전반적으로 알림톡 관련 내용 반영

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 계약 제목을 드롭박스로 변경 (영업파트너 계약서/비밀유지 서약서/고객 서비스이용 계약서/직접입력)
- 직접입력 선택 시 텍스트 입력 필드 표시
- 번개마크 2개 → 1개로 축소
- 번개마크 클릭 시 영업파트너 목록에서 랜덤으로 상대방 정보 자동 채우기

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 테넌트(고객) 검색 API 추가 (searchTenants)
- 계약번호 자동 채번 API 추가 (CONTRACT-YYYYMMDD-N 형식)
- 고객 서비스이용 계약서 선택 시 "고객 불러오기" 버튼 표시
- 고객 선택 시 상호/사업자등록번호/주소/전화번호 자동 채움
- 총개발비 기본값 20,000,000 / 월구독료 기본값 500,000 자동 세팅
- TenantSearchModal 컴포넌트 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 하드코딩 키 대신 템플릿 변수의 라벨(계약번호/총개발비/월구독료)로 매칭
- 빈 문자열 기본값도 덮어쓰도록 trim() 체크 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Tenant 대신 TenantProspect(tenant_prospects 테이블) 사용
- 업체명/사업자번호/대표자명/연락처로 검색
- 필드명 매칭: business_number, contact_phone, contact_email

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 품목관리 3-Panel 레이아웃 (좌:목록, 중:BOM/수식산출, 우:상세)
- FormulaApiService로 API 견적수식 엔진 연동
- FG 품목 선택 시 기본값(W:1000, H:1000, QTY:1) 자동 산출
- 수식 산출 결과 트리 렌더링 (그룹별/소계/합계)
- 중앙 패널 클릭 시 우측 상세만 변경 (skipCenterUpdate)
- API 인증 버튼 전역 헤더로 이동 (모든 페이지에서 사용 가능)
- FormulaApiService에 Bearer 토큰 지원 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 수식 입력 패널에 전원 Select 추가 (단상 220V / 삼상 380V)
- calculateFormula()에서 MP 변수 수집 및 API 전송
- Controller에서 MP 파라미터 수신 후 FormulaApiService로 전달

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This reverts commit 4d6081beb6.
This reverts commit 11c685bda7.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 계약 및 납입 정보 옆에 '정보보기' 토글 버튼 추가
- 계약 상품 내역 (카테고리, 상품명, 개발비, 구독료, 할인율) 테이블 표시
- 수당 정산 내역 (계약금/잔금별 입금액, 수당, 지급예정일 등) 카드 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
AJAX 로드 모달에서 script 태그가 실행되지 않는 문제 해결
- 별도 함수 대신 onclick 인라인으로 토글 로직 직접 처리

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- updateCommissionDate, updateReferrerCommission의 firstOrCreate에서
  partner_rate를 0 고정 → 파트너 타입(개인 20% / 단체 30%)에 따라 설정
- referrer_rate도 파트너 타입에 따라 설정 (개인 5% / 단체 3%)
- SalesCommissionService 상수 재사용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 기존: contact || email (둘 중 하나만 표시)
- 수정: 전화번호(1줄) + 이메일(2줄) 각각 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 제품모델(KSS01~KDSS01), 설치타입(벽면형/측면형/혼합형), 마감타입(SUS/EGI) select 추가
- FG 코드 파싱으로 입력폼 자동 세팅 (FG-KQTS01-벽면형-SUS → 각 필드 매핑)
- calculateFormula() API 호출 시 새 파라미터 전송
- ItemManagementApiController에서 product_model/installation_type/finishing_type 수신 처리

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- parseTransactionLogs에서 TransRemark2를 summary에 합산하지 않도록 변경
- TransRemark2는 상대계좌예금주명(cast) 컬럼에서만 별도 표시
- 저장 후 재로드 시 remark2가 반복 합산되는 문제 해결

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 입금 등록 버튼 및 모달 제거
- 내보내기 버튼을 모든 탭에서 동작하도록 변경
- 현재 활성 탭(수당관리/고객사정산/구독관리)의 테이블을 CSV로 내보내기
- UTF-8 BOM 포함하여 엑셀에서 한글 정상 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- rowspan이 적용된 셀(테넌트/계약일)이 2차 행에서 누락되어 열이 밀리던 문제 수정
- 논리 열 인덱스 기반으로 rowspan 추적하여 정확한 열 매핑
- 체크박스/액션 컬럼 제외 로직도 인덱스 기반으로 개선

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- API 응답에 대표자, 주소, 업태, 종목 필드 추가
- 거래처 선택 시 모든 필드 자동 매핑 (대표자, 주소, 업태, 종목)
- 검색 결과 목록에 대표자, 주소 정보 표시
- 공통 Blade 컴포넌트(barobill-tenant-header) 생성하여 중복 헤더 HTML 제거
- 설정 페이지에 서버 모드 확인/변경 위젯 추가 (본사만 변경 가능)
- 모든 바로빌 페이지(etax, hometax, eaccount, ecard, settings)에 서버 모드 배지 통일
- BarobillController의 settings(), bankAccount(), cardUsage()에 $isTestMode 전달 추가
- config/database.php에서 chandj 커넥션 정의 제거
- BarobillConfigController에서 syncCompanies(), getCompanies() 메서드 제거
- api.php에서 barobill/companies 동기화 라우트 제거
- 로컬/서버 .env에서 CHANDJ_DB_* 환경변수 제거
- 본사(tenant_id=1) 접근 시 barobill_members 레코드가 없는 테넌트에 기본 레코드 자동 생성
- 신규 생성 레코드는 status=pending, server_mode=test 기본값
- 테넌트의 사업자번호, 회사명, 대표자명을 자동 매핑
- flex-1(가로 꽉채움) → sm:w-80(320px 고정)으로 변경
- 모바일에서는 w-full 유지
- form에 sm:flex-nowrap 추가하여 PC에서 줄바꿈 방지
- 검색창 sm:flex-1 + sm:max-w-sm으로 자연스러운 너비 유지
- 모바일에서는 기존처럼 flex-wrap 유지
- sm:max-w-sm 제한 제거, flex-1로 남은 공간을 자연스럽게 채움
- w-full 제거하여 flex-wrap 시 불필요한 줄바꿈 방지
- 검색창: flex 1 1 250px + max-width 400px로 자연스러운 크기
- 상태/버튼: shrink-0으로 축소 방지
- 반응형 클래스 대신 inline style 사용 규칙
- flex 레이아웃 패턴 정리
- w-full 금지 규칙 (flex 컨테이너 자식)
- 기상청 공공데이터포털 API 연동 (단기+중기 7일 예보)
- WeatherService: 3시간 캐시, SKY/PTY 아이콘 매핑
- HTMX 비동기 로딩 + 스켈레톤 UI
- 오늘 카드 파란색 강조, 요일/날짜/아이콘/기온 표시
- serviceKey 이중 인코딩 방지 (withOptions 사용)
- 오늘부터 7일간 표시 (데이터 없는 날은 '준비 중')
- 기온 바 그래프 추가 (파랑→빨강 그라데이션)
- 날씨 텍스트 표시, 강수일 강조
- 단기예보 기온 없는 날 중기예보 기온으로 보충
- 데이터 없는 날 '준비 중' 표시
- 단기예보 POP (하루 최대값) + 중기예보 rnSt 병합
- 우산 아이콘 + 퍼센트 표시 (50% 이상 진한 파랑 강조)
- 강수확률 0%일 때는 표시하지 않음
- 수정 모달에서 바로빌 아이디 필드 표시 (기존: hidden)
- 컨트롤러 update 메서드에 barobill_id 유효성 검증 추가
- 아이디/비밀번호 모두 '변경 시에만 입력' 힌트 표시
- show() 메서드의 has_password 체크에서 encrypted cast 복호화 실패 시 getRawOriginal()로 폴백
- 바로빌 로그인 정보 조건부 표시 (등록/미등록)
- 바로빌 로그인 정보 등록/수정 모달 추가
- 계좌 연동, 카드 연동, 공인인증서 등록 섹션 추가
- 미등록 시 연동 카드 비활성 처리
- Phase 1: 그리드 오버레이를 비율 보존 레터박스 배치로 변경 (annotateSlideWithSpotlight과 동일)
- Phase 2: 그리드 밀도 10x10 → 20x12 향상, 주요 그리드선/좌표 라벨 추가
- Phase 3: 좌표 정규화 경계 클램핑 개선, 편향 패딩 구현, 디버깅 로그 추가
- TutorialVideoJob, VideoGenerationJob에 onQueue('mng') 지정
- API 워커가 MNG Job을 가져가 __PHP_Incomplete_Class 에러 발생 방지
- Gemini 2-pass 자기 검증 메커니즘 구현
- runCoordinateVerification: 검증 오케스트레이터
- createVerificationImage: 색상별 스포트라이트 렌더링
- verifyCoordinates: Gemini에게 좌표 정확도 확인 요청
- applyVerifiedCoordinates: 보정 좌표 적용
- 각 step별 검증 결과 저장 (accurate/corrected + 원본 좌표)
- 스크린 단위 검증 통계 저장 (정확/보정 수, 검증 시각)
- 영상 완료 시 _output 메타데이터 저장 (경로, GCS, 비용, 슬라이드수, 총 재생시간)
- 2-pass 보정 후 각 step의 좌표 영역을 원본에서 크롭하여 Gemini 검증
- 크롭에 패딩 확장 (30% 또는 최소 80px) + 최소 크롭 200x150px 보장
- 빨간 사각형으로 타겟 영역 표시하여 false positive 방지
- 재추정 실패 시 그리드 오버레이 이미지로 3차 재시도
- _verification 메타데이터에 crop_verified, crop_corrected 추가
- PASS율: 37.5% → 100% (FAIL 5 → 0)
- group_name "/" 구분자로 다단계(4단) 헤더 지원
- sub_label 이름 기반 셀 의미 구분 (기준값/입력/POINT)
- check 컬럼 커스텀 체크박스 라벨 (양호/불량 등) 지원
- maxN 제거, 각 컬럼 자체 sub_labels.length 기반 colspan
- 기존 템플릿 하위 호환성 유지
- FormulaApiService의 Bearer token 조회를 session('api_explorer_token')에서
  ApiTokenService 기반으로 변경
- resolveApiToken() 메서드 추가: 세션 토큰 확인 → 만료시 HMAC 토큰 교환
- DocumentTemplateApiController와 동일한 인증 패턴 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 이전 작업 이력 정리, 최근 커밋 참고용으로 축약

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DEFAULT_MONTHLY_FEES hometax: 10000 → 0
- 월정액 0원일 때 "무료 (본사 제공)" 표시
- 개인가입(20%/5%/3%) vs 단체가입(30%/0%/3%) 수당 체계 반영
- 유치자 협업지원금(3%) 정책 반영
- 개발비/구독료 VAT 별도 명시
- 18시 발표 중기예보 미발행 시 06시/전일 발표로 fallback
- 불완전한 날씨 데이터 캐시 TTL 10분으로 단축 (기존 3시간)
- 기상청 중기예보 18시 발표는 D+5부터만 제공, 06시는 D+4부터 제공
- 여러 발표시각 데이터를 병합하여 빈 필드 보충 (최신 우선)
- 단기예보 TMN/TMX 없는 날은 중기예보 icon/pop 우선 사용
- 발표시각별 데이터 커버리지 차이 문서화 (06시 vs 18시)
- D+3~D+4 사각지대 문제 및 다중 발표 병합 해결법
- 디버깅 명령어, 트러블슈팅 포함
- 바로빌 API가 Status를 int로 반환 (WSDL 정의: s:int)
- 기존 문자 매핑(R/N/P/S)에 숫자 매핑(1=등록, 2=심사중, 3=승인, 4=반려) 추가
- 승인 상태(3)가 녹색 뱃지로 올바르게 표시됨
- 테이블 컬럼 확장: 메시지유형, 강조유형, 보안, 버튼수, 검수상태
- 통계 바 추가: 전체/승인/심사중/반려 건수 한눈에 확인
- 상세 모달 개선: 4칸 속성 요약, 타이틀, 이미지, 버튼 상세 표시
- 바로빌 WSDL 전체 필드 활용 (TemplateMessageType, EmphasizeType, SecurityFlag 등)
- XSS 방지를 위한 escHtml 헬퍼 추가
- AcademyController 신규 생성 (HX-Redirect 처리)
- /academy/fire-shutter 라우트 등록
- 방화셔터 백과사전 Blade 뷰 (개요/구성품/제조공정/설치/유지보수)
- 슬랫 재질: SGCC → EGI(전기아연도금강판), 두께 1.6mm 명확화
- 스크린형: 실리카(SiO2) 계열 내화섬유 상세 기술
- 일체형(복합형): 2020.01.30 이후 설치 금지 규정 반영
- 일부폐쇄 위치: 1.5m → 약 1m (법규 기준)
- 감지기 연동: P형/R형 수신기 명시
- Gemini 생성 기술 일러스트레이션 12장 적용
- 히어로 배너 (샤프트 어셈블리 이미지)
- ASCII 다이어그램 → 실제 구성도 이미지 교체
- 이미지-텍스트 카드 레이아웃 (좌우 교차 배치)
- 설치/유지보수 섹션 히어로 이미지 추가
- 이미지 클릭 라이트박스 (순수 JS/CSS)
- max-w-5xl → max-w-6xl 폭 확대
- 모든 이미지가 1024x1024 정사각형이므로 비율 존중 레이아웃으로 변경
- 히어로 배너: object-cover 배경 → 텍스트+이미지 병렬 레이아웃
- 이미지-텍스트 카드: 이미지 고정 너비(220px) + 비율 유지
- 풀와이드 이미지: max-height 제한 + 중앙 정렬 (object-contain)
- 섹션 히어로(설치/유지보수): 와이드 배경 → 컴팩트 이미지 배치
- 히어로 배너 배경: Tailwind 클래스 → inline style (빌드 누락 방지)
- 히어로 글씨 색상: inline style로 흰색 강제 적용
- 이미지 hover: scale(1.05) + box-shadow 확대 효과 (CSS 클래스)
- 이미지 컨테이너: overflow:hidden으로 확대 시 넘침 방지
- 라이트박스: Tailwind 클래스 → CSS/inline style로 교체
- 이미지 hover 시 350ms 후 화면 중앙에 80vh 크기로 확대 프리뷰
- backdrop blur 오버레이 + scale 애니메이션 효과
- 프리뷰 클릭 시 기존 라이트박스로 전환
- 원본 이미지에서 mouseleave 시 프리뷰 즉시 닫히도록 수정
- 프리뷰 오버레이 pointer-events: none으로 마우스 이벤트 가로채기 방지
- 2중 이미지 표시 문제 해결
- KioskController (index/showroom/factory) 생성
- 키오스크 메인 선택 페이지 (쇼룸/공장 카드 UI)
- 쇼룸 키오스크 골격 (제품 카탈로그, 견적 시뮬레이션, 시공 갤러리, 회사 소개)
- 공장 키오스크 골격 (생산 현황, 작업 지시, 생산 통계, 공지사항)
- /additional/kiosk 라우트 그룹 추가
- index: 왜 키오스크인가, DNSYS 파트너/스펙, SAM 연동 구조, 가격/도입조건, 영업포인트 추가
- showroom: 4단계 활용 시나리오, SAM 자산 활용 태그, 기능별 상세 설명 추가
- factory: 4단계 활용 시나리오, SAM 자산 활용 태그, 기능별 상세 설명 추가
- SVG로 기둥형 키오스크 비주얼 (모니터, 기둥, 캐스터, 스캐너 걸이)
- 제품 사양 섹션 3열 레이아웃 (일러스트 + DNSYS 개요 + 스펙)
- 반응형 대응 (모바일 1열, 태블릿 2열)
- NotionService: Notion API 검색 + Gemini AI 답변
- AiConfig에 notion provider 추가
- 추가기능 > Notion 검색 채팅 UI
- RagSearchService: docs 폴더 키워드 검색 + Gemini API 컨텍스트 기반 답변
- RagSearchController: 검색 페이지 및 HTMX 비동기 검색 API
- 검색 UI: 통계 바, 예시 질문, Markdown 렌더링, 참조 문서 표시
- AiTokenHelper 연동으로 토큰 사용량 자동 추적
- AI 설정 페이지에 Notion 섹션 추가 (추가/수정/삭제)
- AiConfig에 API_SERVICE_PROVIDERS 상수 분리
- Notion 전용 모달 (API 키, API 버전, 활성화)
- Gemini API 오류 시 실제 에러 메시지 표시
- 검색어 정제 실패 시 에러 원인 전달
- 상단에 실시간 검색 안내 배지 추가
- 검색어 정제/AI 답변 시 AiTokenHelper로 토큰 사용량 저장
- 상단 안내에 Gemini API 2회 호출 및 토큰 기록 안내 추가
- 검색 전 비용 안내 문구 (건당 약 3~10원, AI 토큰 사용량 기록 안내)
- 검색 결과에 토큰 사용량 바 표시 (입력/출력/합계/비용)
- AiTokenHelper + AiPricingConfig 연동으로 정확한 비용 계산
- 파일시스템 스캔 기반 PPTX 목록 조회/다운로드
- 카테고리별 필터, 파일명 검색 기능
- 경로 트래버설 방지 보안 검증
- 파일시스템 스캔 기반 DOCX 목록 조회/다운로드
- 카테고리별 필터, 파일명 검색 기능
- 경로 트래버설 방지 보안 검증
- 5개 섹션: 개요, 기획 프로세스, 산출물, 도구, 방법론
- 방화셔터와 동일한 백과사전 UI 패턴 (블루 테마)
- AI 이미지 생성 프롬프트 문서 포함
- 히어로, 역할 다이어그램, 프로세스 흐름도 등 12장 SVG 생성
- Blade 파일 이미지 확장자 .png → .svg 변경
- 3.svg: & → &amp; 이스케이프 (Iterative & Incremental)
- 11.svg: & → &amp; 이스케이프 (What & Why, Look & Feel)
- 1.svg: 서버룸 히어로 이미지
- 2.svg: SAM 5-서비스 건물 지도
- 3.svg: 요청 처리 흐름도
- 4.svg: Linux 사용자/그룹 조직도
- 5.svg: drwxrwxr-x 권한 해독 인포그래픽
- 6.svg: umask 계산법 (666 - 022 = 644)
- 7.svg: 사고 타임라인 5단계
- 8.svg: Git 배포 택배 비유
- 9.svg: Hook 동작 흐름 + 권한 체크포인트
- 10.svg: 금지 작업 경고 카드
- 11.svg: 올바른 대응 절차 4단계
- 12.svg: 안전/위험 명령 비교 테이블
- AcademyController에 serverKnowledge() 메서드 추가
- /academy/server-knowledge 라우트 등록
- 그린 테마 Blade 뷰 (5대 섹션, 18소 섹션)
- SVG 이미지 12장 생성
- 이미지 생성 프롬프트 문서 작성
- 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 인터페이스 유지)
- 3개 백과사전 페이지 공용 glossary-tooltip 컴포넌트
- JS TreeWalker 자동 감지 + CSS-only 풍선 툴팁
- 도메인별 용어사전: 방화셔터/IT기획/서버지식 각 25~30개
- .env.example 생성 (서버 설정 시 참조 템플릿)
- .gitignore에 !.env.example 예외 추가
- 공유 API 키, 프로젝트 전용 키 구분 문서화
- 10개 섹션: HTML/CSS/JS, 프레임워크, 반응형, 브라우저, API, 도구, 성능
- purple 테마, 기존 아카데미 패턴 동일 적용
- 전문용어 툴팁 26개 추가 (frontend-dev 도메인)
- 1.svg: Hero 이미지 (Docker 고래 로고 + 컨테이너 비유)
- 2.svg: 컨테이너 vs VM 비교 다이어그램
- 3.svg: SAM 전체 아키텍처 다이어그램 (9개 서비스)
- 4.svg: 요청 흐름 5단계 시각화
- 5.svg: 서비스별 내부 프로세스 구조 (Supervisor)
- 6.svg: Nginx 도메인-서비스 라우팅 맵
- 7.svg: 볼륨 마운트 구조 (바인드 마운트 vs Docker 볼륨)
- 8.svg: .env 로드 흐름 다이어그램
- 9.svg: 로컬 vs 서버 환경 비교
- 10.svg: Docker 명령어 치트시트
- AcademyController에 dockerEnvironment() 메서드 추가
- academy 라우트 그룹에 docker-environment 라우트 추가
- 6개 섹션 Blade 뷰 작성 (Docker 소개, 아키텍처, 서비스 상세, 볼륨, .env, 명령어)
- academy-glossary에 docker-environment 도메인 용어 25개 추가
- 섹션별 SVG 일러스트 10개를 주요 위치에 삽입 (5~10.svg)
- 도움말 풍선(?) 트리거 8개 추가 (핵심 개념 설명)
- toggleBalloon() JavaScript 함수 및 외부 클릭 닫기 구현
- 1.svg: 3계층 아키텍처 히어로 이미지
- 2.svg: 요청-응답 사이클
- 3.svg: ERD 테이블 관계
- 4.svg: MVC 흐름도
- 5.svg: REST API 구조
- 6.svg: 인증 비교 (세션 vs 토큰)
- 7.svg: 트랜잭션
- 8.svg: 큐 처리
- 9.svg: 캐시 계층
- 10.svg: 배포 파이프라인
- 퍼플 테마 6대 섹션 22소 섹션 Blade 뷰 작성
- SVG 이미지 12장 생성 (인터넷, URL, HTTP, 에러코드 등)
- AcademyController webBasics() 메서드 및 라우트 등록
- academy-glossary 컴포넌트에 web-basics 도메인 추가
- 이미지 생성 프롬프트 문서 작성
- 히어로, 인터넷 지구본, URL 해부도, HTTP 흐름도
- 에러코드 인포그래픽, 설치형vs클라우드, SaaS 모델
- 로그인 흐름도, ERP 구조도, DB 비유, API 원리, SAM 접속
- 10개 섹션: 서버/DB/Laravel/API/보안/큐/캐시/배포
- orange 테마, SVG 일러스트 10개, 도움말 풍선
- 전문용어 툴팁 30개 (backend-dev 도메인)
- 6.svg: 경로가 다른 변수 시각화 (MNG/API 컨테이너 경로 비교)
- 7.svg: 로컬(Docker) vs 서버(운영) 환경변수 비교
- 8.svg: .env 변경 → config:clear 캐시 클리어 흐름도
- 9.svg: 신규 개발자 온보딩 체크리스트
- 1.svg: 열쇠 고리 비유 Hero 이미지
- 2.svg: .env 역할 개념도 (App → Services 흐름)
- 3.svg: 프로젝트별 .env 구조 (MNG/API/React)
- 4.svg: Docker Override 우선순위 다이어그램
- 5.svg: MNG ↔ API 동기화 필수 변수 맵
- 7개 섹션 교육 콘텐츠 (열쇠 고리 비유, 프로젝트별 구조, Docker Override, 동기화 필수 변수, 로컬/서버 비교, 변경 후 할 일, 주의사항)
- SVG 이미지 9종 (에메랄드 다크 테마)
- 용어 사전 15개 (env-management 도메인)
- 실제 .env.example, docker-compose.yml, production-env-sync.md 기반 콘텐츠
- 기존 AI 생성 PNG 12장을 기술적으로 정확한 SVG 다이어그램으로 교체
- 제조 공정 섹션(Section 3)에 신규 SVG 3장 추가 (롤포밍, 조립, 검사)
- Blade 파일에서 .png → .svg 참조 변경 12곳
- 제조 공정 블록에 이미지 삽입 3곳
- 1.svg: Nginx 히어로 이미지 (로고, 네트워크 배경)
- 2.svg: 웹 서버 = 접수 창구 비유 다이어그램
- 3.svg: Apache vs Nginx 비교 인포그래픽
- 4.svg: Nginx 설정 계층 구조 (마트료시카)
- 9.svg: 보안 필터 = 입장 불가 명단 (경비원/차단목록 비유)
- 10.svg: 정적 자산 캐싱 = 냉장고 보관 (캐시 히트 vs 미스 비교)
- 11.svg: 502/504/403/413 에러 카드 4종 (원인/해결 가이드)
- 12.svg: 핵심 정리 총괄 인포그래픽 (6대 기능 원형 배치)
- 5.svg: Forward Proxy vs Reverse Proxy 비교 다이어그램
- 6.svg: SAM 5개 도메인 라우팅 맵
- 7.svg: 2계층 Nginx 아키텍처 건물 단면도
- 8.svg: SSL/TLS 봉투 자물쇠 비유
- 10개 섹션: 버전관리/기초/원격/브랜치/커밋/협업/충돌/SAM정책/.gitignore/배포
- teal 테마, SVG 일러스트 10개, 도움말 풍선
- 전문용어 툴팁 30개 (git-policy 도메인)
- 7개 섹션 Blade 뷰 (기초→중급→심화→실전)
- 실제 SAM nginx.conf 기반 설정 해설
- 용어 사전 20개 추가 (academy-glossary)
- 타이틀, 히어로 제목에서 중복 표현 정리
- 8개 페이지 일괄 적용
- 올가미(Lasso) 드래그로 여러 필드 다중 선택 기능 추가
- Ctrl+클릭으로 개별 필드 토글 선택 지원
- Ctrl+X 잘라내기, Ctrl+C 복사, Ctrl+V 붙여넣기 (다중 필드)
- 다른 페이지로 붙여넣기 시 현재 페이지에 배치
- Delete/방향키 다중 필드 일괄 삭제/이동 지원
- PDF.js CMap 설정 추가로 Pretendard 등 한글 폰트 렌더링 개선
- 올가미 mouseup 후 click 이벤트가 상위 div로 버블링되어 clearSelection() 호출되는 문제
- 컨테이너 div에 onClick stopPropagation 추가하여 이벤트 전파 차단
- lassoUsedRef 플래그로 올가미 직후 click 이벤트 무시
- 인라인 SVG + CSS @keyframes 애니메이션
- 감김→1차하강→완전폐쇄→복귀 루프
- 재생/정지/리셋 컨트롤, 상태 텍스트 표시
- 다중 선택된 필드 드래그 시 전체 그룹이 동시에 이동
- FieldOverlay에 selectedIndices/onGroupMove props 전달
- 단일 선택 시 기존 동작 유지
- 드래그 완료 후 click 이벤트에서 선택 변경 무시
- 여백 클릭 시에만 그룹 선택 해제
- 서버는 Docker 없이 네이티브로 운영됨을 명시하는 핵심 안내 박스 추가
- 섹션 2 제목을 "SAM 로컬 Docker 아키텍처"로 변경
- 섹션 5-3에 서버 네이티브 구조도 추가
- 섹션 6에 로컬(Docker) vs 서버(네이티브) 명령어 비교표 추가
- 목차(TOC) 업데이트
- 홈택스 매입세금계산서 미지급금/미지급비용 대변 데이터 연동
- 일반전표 미지급금/미지급비용 차변 상계 데이터 연동
- 거래처별 잔액 자동 계산 (발생-상계)
- 통합잔액/홈택스발생/일반전표상계/수동관리 4탭 구조
- 백엔드: submitSignature에 stamp_image(base64) 파라미터 처리 추가
- 프론트: counterpart 역할에 도장 선택 UI 항상 표시
- 프론트: 도장 이미지 업로드(PNG/JPG, 5MB 제한) 및 미리보기 기능
- 기존 Creator 법인도장 흐름은 변경 없음
- 홈택스 분개(hometax_invoice_journals)와 일반전표(journal_entry_lines)에서 계정코드 108(외상매출금) 데이터 집계
- ledger() API: 날짜순 정렬, 누적잔액 계산, 출처/거래처/기간 필터
- summary() API: 거래처별 발생액/회수액/잔액 요약
- UI 3탭 구조로 개편: 외상매출금 원장 / 거래처별 요약 / 수동관리(기존)
- 거래처별 요약에서 행 클릭 시 해당 거래처 원장으로 이동
- React에서 style="..." 문자열은 에러 #62 발생
- style={{...}} 객체 문법으로 전체 수정
- ManualTab 컴포넌트 및 관련 유틸 함수 삭제
- 미사용 아이콘 선언 정리
- 외상매출금 원장 / 거래처별 요약 2탭 구조로 변경
- localStorage로 시작일/종료일 저장 (재방문 시 유지)
- 이번달/지난달/D-2월/D-3월/올해전체 빠른 선택 버튼
- 미지급금관리와 동일한 패턴으로 기간 관리 구조 변경
- 기간 설정을 메인 컴포넌트에서 관리하고 각 탭에 props로 전달
- localStorage에 기간 저장 (탭 이동/새로고침 시 유지)
- 월 빠른 선택 버튼 추가 (이번달, 지난달, D-2월, D-3월, 올해전체)
- 각 탭 내부 개별 필터 제거, 공통 필터바로 통합
- Canvas API로 흰색/밝은 배경 픽셀을 투명 처리
- 경계 부분 부드러운 페이드 처리 (anti-aliasing)
- 미리보기에 체크무늬 배경으로 투명 영역 시각화
- "배경이 자동 제거되었습니다" 안내 메시지 표시
- BankTransaction 모델: getUniqueKeyAttribute, generateUniqueKey에 summary 추가
- EaccountController: API 응답 및 DB upsert 시 summary 포함 매칭
- JournalEntry, JournalEntryController: 레거시(5필드) 키 호환 처리
- BankTransactionOverride: 레거시 키 호환 조회
- lucide@latest(0.575.0)에서 createElement SVG 속성에 따옴표 포함되는 버그 발생
- 28개 Blade 파일 일괄 변경
- lucide.createElement가 SVG 속성에 따옴표를 포함시키는 버그 우회
- 아이콘 데이터 배열에서 createElementNS로 직접 SVG 생성
- 25개 Blade 파일 일괄 적용
- SVG 기본 속성을 하드코딩하여 lucide 데이터의 따옴표 포함 문제 해결
- 자식 요소(path 등) 속성에서 불필요한 따옴표 자동 제거
- Error: <svg> attribute viewBox: Expected number 에러 해소
- lucide@0.469.0에 존재하지 않는 createElement 함수 대신 재귀적 buildEl 함수 사용
- account-transactions, payables 두 페이지 수정
- lucide@0.469.0 아이콘 정의의 속성값에 포함된 불필요한 따옴표 strip
- 24개 Blade 파일의 수동 SVG 생성 코드를 lucide.createElement(_def)로 통일
- 불필요한 quote-stripping regex(/^"|"$/g) 제거
- Lucide 공식 API 사용으로 SVG viewBox/path 속성 에러 해결
- 10개 섹션: 터미널 기초, 파일 탐색, 파일 조작, 권한 관리, 검색, 모니터링, 프로세스, 네트워크, 텍스트 편집, 위험 명령어
- git-policy 페이지와 동일한 레이아웃 (히어로 배너, 좌측 TOC, 도움말 풍선)
- 초보자 친화적 비유와 실무 팁 포함
- useRef/useEffect 기반 DOM 조작 방식 제거
- React.createElement로 SVG 직접 렌더링하는 방식으로 전환
- arrow-up-circle, arrow-down-circle 아이콘 별칭 추가
- 대상: finance 20개, system 2개, sales 1개 blade 파일 (총 23개)
- useRef/useEffect DOM 조작 → React 네이티브 SVG 렌더링
- arrow-up-circle/arrow-down-circle 아이콘 별칭 추가
- 같은 시간/계좌/금액이라도 잔액·적요가 다른 거래가 하나로 합쳐지는 문제 수정
- uniqueKey 구성(6필드)과 groupBy(4필드) 불일치 해소
- tenant disk root: /var/www/shared-storage/tenants → storage_path('app/tenants')
- symlink 경로도 동일하게 변경
- react git pull 시 shared-storage 삭제 문제 해결
- autoSync dateType: 1(작성일자) → 3(전송일자, 바로빌 권장)
- autoSync 증분 범위: -1일 → -3일로 확대 (안전 마진)
- 수집 요청 후 자동 동기화 추가 (스크래핑만 요청 → 동기화까지 수행)
- 수집 상태 영역에 "전일까지 데이터 제공, 당일 발행분은 익일 반영" 안내 표시
- x-barobill-tenant-header 보라색 그라디언트 Blade 컴포넌트 제거
- StatCard 4칸 그리드 → CompactStat 인라인 배지로 변경
- CardSelector 버튼 그룹 → select 드롭다운으로 변경
- 날짜 필터/액션 버튼을 TransactionTable에서 App 레벨로 이동
- border-stone-100 → border-gray-200로 통일
- 파트너별 GROUP BY 요약 → 개별 commission 레코드 표시로 변경
- 1차/2차수당 계산에 매니저/유치 수당 포함하여 합계 불일치 해소
- 파트너 헤더행 + 개별 건 행 + 합계행 구조로 테이블 재구성
- style={{height:...}} 구문이 Blade에 의해 PHP로 해석되는 문제
- script 블록에 @verbatim 추가하여 Blade 해석 방지
- 원본 해상도 PNG 변환 시 용량 폭발 문제 해결
- 최대 500px로 리사이즈 후 배경 제거 적용
- @verbatim 추가로 PHP 8.4 named parameter 에러 수정
- BarobillMember의 실제 컬럼명은 biz_no인데 corp_num으로 접근하여 항상 null
- is_test_mode → server_mode로 수정
- kakaotalk_sender_id → 빈 문자열 (기본 발신프로필 사용)
- senderId를 빈 문자열로 보내던 것을 바로빌 채널 목록에서 ChannelId 조회 후 전달
- 바로빌 API 오류 -24005 해결
- 승인 상태 필터를 'R'만 체크하던 것을 'R' 또는 '3'으로 확장
- 바로빌 API가 승인 상태를 숫자(3)로 반환하는 경우 대응
- Status 필터 제거 (API가 반환하는 모든 템플릿 표시)
- 응답 파싱 누락 케이스 추가 (else if raw)
- API 오류 시 에러 메시지 표시 및 console.log 디버깅 추가
- at-buttons-container 요소가 알림톡 폼에 없어 null 참조 오류 발생
- container가 null이면 빈 배열 즉시 반환
- WSDL 스펙에 맞게 KakaotalkMessage 중첩 구조로 변경
- ReceiverName, ReceiverNum 등을 최상위에서 KakaotalkMessage 내부로 이동
- ReserveDT → SendDT로 파라미터명 수정
- SendATKakaotalkEx에 YellowId 파라미터 추가
- 버튼 배열을 KakaotalkButton 래핑 구조로 변경
- sendATKakaotalks 대량 발송도 WSDL 구조에 맞게 수정
- esign 알림톡 메시지 본문을 등록 템플릿에 맞게 조정
- .env.example MAIL_FROM_NAME을 (주)코드브릿지엑스로 변경
- 전자계약 이메일 템플릿 푸터에 회사명 추가
- 비밀번호 이메일 푸터 copyright를 (주)코드브릿지엑스로 변경
- EsignRequestMail, EsignOtpMail, EsignCompletedMail에 from 주소 명시
- config/mail.php에 contact_from_address 설정 추가
- .env의 CONTACT_MAIL_FROM_ADDRESS(contact@codebridge-x.com) 사용
- SenderID: 바로빌 계정 ID (barobill_id) 사용
- YellowId: 카카오톡 채널 ID 필수 전달 (기존에 빈값)
- SmsReply: 'N' (대체문자 미발송) 또는 'S' (발송) 명시
- 템플릿 본문: API에서 조회 후 변수 치환 (정확한 포맷 유지)
- getKakaotalkSenderId → getKakaotalkChannelId 이름 변경
- EsignPublicController: 잘못된 필드명(corp_num, is_test_mode) 수정
- EcardController에 storeJournal/getJournal/deleteJournal/getJournalStatuses 4개 메서드 추가
- journal_entries + journal_entry_lines 통합 (source_type='ecard_transaction')
- CardJournalModal 차변/대변 복식부기 UI 추가
- 거래 테이블에 분개완료/구버전/미분개 3단계 상태 표시
- 기존 splits 데이터 자동 전환 지원
- style={{width:'60px'}} → Tailwind 클래스(w-16, w-36, w-10)로 교체
- Blade의 {{ }} echo 문법과 JSX inline style 충돌 해소
- TradingPartnerSelect 컴포넌트 추가 (거래처 검색/선택)
- CardJournalModal 테이블에 거래처 컬럼 추가
- 분개 라인별 trading_partner_id/name 저장/조회 지원
- EcardController storeJournal/getJournal에 거래처 필드 추가
- TradingPartnerSelect 드롭다운을 ReactDOM.createPortal로 body에 렌더링
- position: fixed 기반 좌표 계산으로 부모 overflow 영향 제거
- 화면 하단 공간 부족 시 위쪽으로 열리도록 자동 판단
- 모달 내 스크롤/리사이즈 시 위치 재계산
- updatePrepayment에서 Carbon::now() 대신 결제일 기준 year_month 사용
- summary 조회와 동일한 로직으로 getBillingYearMonth() 메서드 추출
- 결제일이 지난 경우 다음 달 기준으로 저장되도록 수정
- 사용금액 = 원본 사용금액 - 선결제 금액
- 카드별 사용금액도 비율 배분하여 선결제 차감 반영
- 잔여 한도 = 총 한도 - 차감된 사용금액
- 선결제 반영 시 하위 텍스트에 차감 내역 표시
- 1단계: 한도 초과 카드에 초과분만큼 우선 차감
- 2단계: 잔여 금액을 현재 사용액 비율로 배분
- 마지막 카드에 반올림 오차 보정
- 어떤 카드도 100% 초과하지 않도록 보장
- 기존 '분개' 열을 '분리'(금액 나누기)와 '분개'(복식부기) 두 열로 분리
- SplitModal 텍스트를 '분개'에서 '분리'로 변경
- CSV 내보내기 텍스트도 '분리'로 통일
- 분리 열: 금액 분리 기능 (SplitModal)
- 분개 열: 복식부기 분개 기능 (CardJournalModal)
- 알림톡 버튼 클릭 시 전화번호 입력으로 서명 페이지 이동
- 바로빌 템플릿 URL 변경 전 임시 우회 방법
- handleOpenJournalModal에 splits 데이터 전달
- getDefaultLines()에서 splits 기반 차변 라인 자동 생성
- 공제 항목: 비용계정 + 부가세대급금 분리, 불공제: 합산
- 분개 모달에 분리 데이터 기반 인디케이터 배지 표시
- storeJournal의 splits 자동삭제 코드 제거 (분리+분개 공존)
- 분리가 있는 거래: 작은 '+' 아이콘 대신 '분개' 라벨 버튼 표시
- 분리 없는 거래: 기존 '+' 아이콘 유지
- 기존 multi-split 번들 분개를 단일 split 개별 분개로 교체
- 원본 행 분개 열에 split별 집계 상태 표시 (N/M, 완료)
- 각 분리 행에 독립 분개 버튼 추가 (splitSourceKey 기반)
- handleOpenJournalModal에 singleSplit 파라미터 추가
- CardJournalModal 거래 정보에 개별 split 정보 표시
- 합계금액 열에 split 분개 진행률 표시
- 기존 분개 로드 시 카드 금액과 분개 차변 합계 비교
- 불일치 시 빨간색 경고 배너 표시 (카드 금액, 분개 금액, 차이)
- "카드 데이터로 갱신" 버튼으로 현재 카드 데이터 기준 분개 라인 재생성
- split 분개와 원본 분개 모두 지원
- 모델: BusinessCardRequest (pending/processed 상태 관리)
- 서비스: 신청/처리/통계/뱃지 카운트
- 컨트롤러: 관리자 2분할 뷰, 파트너 신청폼+이력
- 뷰: admin-index (대기/처리완료 2분할), partner-index (신청폼+이력)
- 라우트: GET/POST /sales/business-cards, POST /{id}/process
- 뱃지: ViewServiceProvider에 대기 건수 연동
- 파트너 명함신청 (/sales/business-cards): 모든 사용자 (신청폼+이력)
- 명함신청 처리 (/sales/business-cards/manage): 관리자 전용 (2분할)
- 뱃지를 manage 라우트에 연동
- 모델: STATUS_ORDERED 추가, markAsOrdered() 헬퍼
- 서비스: order(), getOrderedRequests() 추가
- 컨트롤러: order() 액션 추가
- 관리자 뷰: 좌측 신규요청 + 우측 제작중 + 하단 처리완료
- 파트너 뷰: 제작중(파란) 상태 뱃지 추가
- 라우트: POST business-cards/{id}/order 추가
- SystemGuideController 생성 (HX-Redirect 패턴)
- git-deploy-flow.blade.php 뷰 생성 (아카데미 형식 참고)
- 라우트: /system/git-deploy-flow
- startDate 이전 누적 데이터로 이월잔액(priorBalance) 계산 추가
- 잔액 공식 변경: 이월잔액 + 당기발생 - 당기상계
- 이월잔액만 있고 당기 거래 없는 거래처도 목록에 포함
- 통계 카드에 이월잔액 표시 추가
- 거래처 테이블에 이월잔액 열 추가
- mng.dev.codebridge-x.com → admin.codebridge-x.com
- 도메인 스왑(48ef98e) 반영
- summary() 메서드: 거래처별 이월잔액(priorBalance) 계산 추가
- ledger() 메서드: 원장 누적잔액이 이월잔액부터 시작하도록 변경
- 프론트엔드: LedgerTab 이월잔액 통계카드 추가 (조건부 표시)
- 프론트엔드: SummaryTab 이월잔액 컬럼 추가, 라벨 당기발생/당기회수로 변경
- CSV 다운로드에 이월잔액 포함
- Docker 기본 확인/컨테이너 제어/진입&실행/로그/Compose/볼륨&네트워크/트러블슈팅/위험명령어 8개 섹션
- SAM 전용 docker exec 패턴 표 포함
- 용어집 23개 항목 추가
- 라우트, 컨트롤러 메서드 추가
- git-tools.blade.php 뷰 생성 (violet 테마, 8개 섹션)
- 용어집 git-tools 도메인 20개 용어 추가
- signMode 기본값 signature → stamp 변경
- creator(본사)에서도 서명/도장 선택 UI 표시
kent closed this pull request 2026-02-25 15:05:49 +09:00

Pull request closed

Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: SamProject/sam-manage#1
No description provided.