- TenantStatFieldService: CRUD + reorder + bulkUpsert 로직 구현
- TenantStatFieldController: 7개 엔드포인트 (SAM API Rules 준수)
- FormRequest: Store/Update 검증 클래스 생성
- Swagger: 완전한 API 문서화 (6개 스키마, 7개 엔드포인트)
- i18n: message.tenant_stat_field 키 추가
- Route: /tenant-stat-fields 7개 라우트 등록
유니크 제약 검증: tenant_id + target_table + field_key
집계 함수 필터링: avg, sum, min, max, count
- FormRequest 패턴 적용 (CategoryFieldStoreRequest, CategoryFieldUpdateRequest)
- Service에서 Validator::make() 제거
- Controller 메시지 i18n 키로 변경 (__('message.category_field.*'))
- is_required 타입을 'Y'/'N' → boolean으로 통일
- Swagger 스키마 is_required boolean 타입으로 업데이트
- Model scopeRequired() boolean 조건으로 변경
[추가된 파일]
- app/Models/Tenants/TenantStatField.php
- 테넌트별 통계 필드 설정 모델
- Scopes: forTable, critical, withAggregation, ordered
- 통계 시스템의 메타 정보 제공
- claudedocs/mes/HYBRID_STRUCTURE_GUIDE.md
- 하이브리드 구조 사용 가이드 문서
- 데이터베이스 구조 설명
- 코드 예제 (Product, ProductComponent 생성)
- 통계 쿼리 예제
- 성능 고려사항 및 주의사항
[모델 기능]
- BelongsToTenant, ModelTrait 적용
- aggregation_types JSON 자동 캐스팅
- tenant, target_table, field_key 조합으로 통계 필드 관리
[문서 내용]
- 고정 필드 vs 동적 필드 선택 기준
- attributes JSON 사용법
- 통계 쿼리 예제 (JSON_EXTRACT)
- CategoryField와 연동 방법
- 향후 Virtual Column 최적화 가이드
[모델 업데이트]
- Product 모델: 하이브리드 구조 필드로 fillable/casts 간소화
- 고정 필드: safety_stock, lead_time, is_variable_size, product_category, part_type, attributes_archive
- 동적 필드: attributes JSON (category_fields로 관리)
- 제거: BP-MES 전용 33개 필드 (이제 attributes에 저장)
- ProductComponent 모델: BOM 계산 필드 + 동적 필드
- 고정 필드: quantity_formula, condition
- 동적 필드: attributes JSON
- 제거: is_bending, bending_diagram, bending_details (이제 attributes에 저장)
[Seeder 실행]
- BpMesCategoryFieldsSeeder: FG/PT/절곡품 카테고리 및 필드 생성
- BpMesTenantStatFieldsSeeder: 통계 필드 설정 (마진율, 가공비, 인건비, 설치비 등)
[검증 완료]
- Tinker 모델 테스트 통과
- Pint 코드 포맷팅 검사 통과
- GlobalMenuTemplateSeeder 추가: 60개 메뉴 템플릿 생성 (tenant_id=NULL)
- MenuBootstrapService.cloneGlobalMenusForTenant() 추가
- parent_id 매핑으로 계층 구조 유지
- DB 트랜잭션으로 원자성 보장
- RegisterService 업데이트: 신규 회원가입 시 메뉴 템플릿 복제
- 기존 225개 테넌트에 메뉴 일괄 복제 완료
- 테스트 완료: 회원가입 + 로그인 시 60개 메뉴 정상 반환
- 통합 품목 조회 API (materials + products UNION)
- ItemsService, ItemsController, Swagger 문서 생성
- 타입 필터링 (FG/PT/SM/RM/CS), 검색, 카테고리 지원
- Collection merge 방식으로 UNION 쿼리 안정화
- 품목-가격 통합 조회
- PricingService.getPriceByType() 추가 (SALE/PURCHASE 지원)
- 단일 품목 조회 시 판매가/매입가 선택적 포함
- 고객그룹 가격 우선순위 적용 및 시계열 조회
- 자재 타입 명시적 관리
- materials.material_type 컬럼 추가 (SM/RM/CS)
- 기존 데이터 344개 자동 변환 (RAW→RM, SUB→SM)
- 인덱스 추가로 조회 성능 최적화
- DB 데이터 정규화
- products.product_type: 760개 정규화 (PRODUCT→FG, PART/SUBASSEMBLY→PT)
- 타입 코드 표준화로 API 일관성 확보
최종 데이터: 제품 760개(FG 297, PT 463), 자재 344개(SM 215, RM 129)
- MemberService::getUserInfoForLogin(): 사용자 역할 조회 로직 추가
- ApiController::login(): 응답에 roles 포함
- AuthApi (Swagger): roles 응답 스키마 추가
- 로그인 시 해당 회원의 역할 목록 반환 (id, name, description)
fix: 회원가입 시 UserTenant 생성 누락으로 인한 로그인 실패 수정
근본 원인:
- RegisterService는 TenantUserProfile만 생성
- MemberService::getUserInfoForLogin()은 UserTenant 조회
- 회원가입 직후 로그인 시 테넌트 조회 실패 (userTenants->isEmpty() = true)
해결 방안:
- RegisterService에 UserTenant::create() 추가
- TenantUserProfile: 프로필 정보 (부서, 직급 등)
- UserTenant: 접근 권한 관리 (is_active, is_default, joined_at)
영향도:
- 신규 사용자: 로그인 가능하게 수정
- 기존 사용자: 영향 없음 (user_tenants 데이터 이미 존재)
fix: 로그인 시 테넌트 없는 경우 roles 누락 오류 수정
- MemberService::getUserInfoForLogin(): 테넌트가 없는 경우에도 roles 빈 배열 반환
- Undefined array key 'roles' 에러 해결
MemberService.php 권한 조회 로직 수정 - 역할 기반 권한 지원
[문제]
- 회원가입 후 로그인 시 메뉴 리스트가 표시되지 않음
- RegisterService에서 역할에 권한 할당(role_has_permissions)하고
사용자에게 역할 부여(model_has_roles)
- 하지만 MemberService는 model_has_permissions(직접 사용자 권한)만 조회
[원인]
- Spatie Permission 아키텍처 불일치
- 권한이 역할에 저장되었으나 직접 사용자 권한 테이블만 조회
[해결]
- model_has_roles → role_has_permissions → permissions 조인 쿼리로 변경
- UNION으로 직접 권한(model_has_permissions)도 지원하는 하이브리드 방식
- 역할 기반 권한과 직접 권한 모두 조회 가능
[변경 파일]
- app/Services/MemberService.php (getUserInfoForLogin 메서드, 239-259줄)
- enhance_files_table: 이중 파일명 시스템 (display_name/stored_name), 폴더 관리, 문서 연결 지원
- create_folders_table: 동적 폴더 관리 시스템 (tenant별 커스터마이징 가능)
- 5개 stub 마이그레이션 생성 (file_share_links, file_deletion_logs, storage_usage_history, add_storage_columns_to_tenants)
- FolderSeeder stub 생성
- CURRENT_WORKS.md에 Phase 1 진행상황 문서화
fix: 파일 공유 및 삭제 기능 버그 수정
- ShareLinkRequest: PATH 파라미터 {id}를 file_id로 자동 병합
- routes/api.php: 공유 링크 다운로드를 auth.apikey 그룹 밖으로 이동 (인증 불필요)
- FileShareLink: File, Tenant 클래스 import 추가
- File 모델: softDeleteFile()에서 SoftDeletes의 delete() 메서드 사용
- FileStorageService: getTrash(), restoreFile(), permanentDelete()에서 onlyTrashed() 사용
- File 모델: Tenant 네임스페이스 수정 (App\Models\Tenants\Tenant)
refactor: Swagger 문서 정리 - File 태그를 Files로 통합
- FileApi.php의 모든 태그를 Files로 변경
- 구 파일 시스템 라우트 삭제 (prefix 'file')
- 구 FileController.php 삭제
- 신규 파일 저장소 시스템으로 완전 통합
fix: 모든 legacy 파일 컬럼 nullable 일괄 처리
- 5개 legacy 컬럼을 한 번에 nullable로 변경
* original_name, file_name, file_name_old (string)
* fileable_id, fileable_type (polymorphic)
- foreach 루프로 반복 작업 자동화
- 신규/기존 시스템 간 완전한 하위 호환성 확보
fix: legacy 파일 컬럼 nullable 처리 완료
- file_name, file_name_old 컬럼도 nullable로 변경
- 기존 시스템과 신규 시스템 간 완전한 하위 호환성 확보
- Legacy: original_name, file_name, file_name_old (nullable)
- New: display_name, stored_name (required)
fix: original_name 컬럼 nullable 처리
- original_name을 nullable로 변경하여 하위 호환성 유지
- 새 시스템에서는 display_name 사용, 기존 시스템은 original_name 사용 가능
fix: 파일 업로드 DB 컬럼 누락 및 메시지 구조 개선
- files 테이블에 감사 컬럼 추가 (created_by, updated_by, uploaded_by)
- ApiResponse::handle() 메시지 로직 개선 (접미사 제거)
- 다국어 지원을 위한 완성된 문장 구조 유지
- FileUploadRequest 파일 검증 규칙 수정
fix: 파일 저장소 버그 수정 및 신규 테넌트 폴더 자동 생성
- FolderSeeder 네임스페이스 수정 (App\Models\Tenant → App\Models\Tenants\Tenant)
- FileStorageController use 문 구문 오류 수정 (/ → \)
- TenantObserver에 신규 테넌트 기본 폴더 자동 생성 로직 추가
- 5개 기본 폴더 (생산관리, 품질관리, 회계, 인사, 일반)
- 에러 처리 및 로깅
- 회원가입 시 자동 실행
- AuthService: 토큰 발급/갱신 통합 관리
- RefreshController: POST /api/v1/refresh 엔드포인트 추가
- 액세스 토큰 2시간, 리프레시 토큰 7일 (.env 설정)
- TOKEN_EXPIRED 에러 코드로 프론트엔드 자동 리프레시 지원
- 리프레시 토큰 일회성 사용 (보안 강화)
- Swagger 문서 Auth 태그로 통합
주요 변경사항:
- RegisterService.php: 생성된 메뉴 정보를 조회해서 응답에 포함
- RegisterApi.php: Swagger 문서에 menus 배열 스키마 추가
응답 구조:
{
user: {...},
tenant: {...},
menus: [
{id, parent_id, name, url, icon, sort_order, is_external, external_url}
]
}
기술 세부사항:
- 생성된 메뉴 ID 배열을 사용해 Menu::whereIn() 조회
- parent_id, sort_order 순서로 정렬
- 로그인 API와 동일한 메뉴 정보 구조 제공
주요 변경사항:
- MenusStep.php: 존재하지 않는 컬럼(code, route_name, depth, description) 제거
- MenusStep.php: 실제 DB 스키마 컬럼(hidden, is_external, external_url) 추가
- RecipeRegistry.php: MenusStep 비활성화 (하이브리드 메뉴 생성 방식 도입)
- Handler.php: ValidationException 처리 개선 (실제 에러 메시지 표시, 422 상태 코드)
기술 세부사항:
- 하이브리드 접근: TenantBootstrapper(데이터) + MenuBootstrapService(메뉴)
- HTTP 상태 코드 표준화: 422 Unprocessable Entity (validation 실패)
- 실제 검증 에러 메시지 반환: errors 객체에 필드별 에러 정보 포함
- MenuBootstrapService 생성: 새 테넌트를 위한 기본 메뉴 9개 자동 생성
- 대시보드
- 기초정보관리 (제품/거래처/BOM 관리)
- 시스템 관리 (사용자/권한/부서 관리)
- RegisterService 수정: 메뉴 생성 후 권한 자동 설정
- 생성된 메뉴에 대한 권한(menu.{id}) 자동 생성
- system_manager 역할에 모든 메뉴 권한 할당
- 기존 테이블 구조에 맞게 구현 (code, route_name, depth, description 컬럼 미사용)
- message.registered 수정: '회원가입 처리'로 변경 (에러 메시지 개선)
- RecipeRegistry 호출 제거 (클래스 존재하지 않음)
- 메뉴 기반 권한 생성 로직 제거
- system_manager 역할만 생성하고 사용자에게 부여
- 메뉴 테이블 컬럼 불일치 오류 해결
현재는 기본 회원가입 기능만 제공:
- 테넌트 생성 (코드 자동 생성)
- 사용자 생성
- 테넌트-사용자 프로필 연결
- system_manager 역할 부여
향후 메뉴 시스템이 완성되면 RecipeRegistry를 다시 활성화할 예정
- TenantCodeGenerator 헬퍼 클래스 생성
- 한글 초성 추출 및 영문 변환
- Base-36 순번 생성 (최대 1,679,616 코드)
- 순환형 코드 생성 (초성+순번 조합)
- RegisterService에서 테넌트 생성 시 코드 자동 생성
- 회원가입 시 'code' 필드 누락 오류 해결
- Laravel 표준 validation 규칙 메시지 60+ 개 추가 (lang/ko/validation.php)
- unique, required, email, confirmed 등 주요 규칙 포함
- :attribute 플레이스홀더로 동적 필드명 지원
- RegisterController의 ApiResponse 네임스페이스 수정
- 잘못: App\Http\Resources\ApiResponse
- 올바름: App\Helpers\ApiResponse
해결된 에러:
- "The 사용자 아이디 has already been taken." → "사용자 아이디은(는) 이미 사용 중입니다."
- "Class App\Http\Resources\ApiResponse not found" → 네임스페이스 수정으로 해결
Phase 3-5 (TenantApi.php):
- TenantStoreRequest.php 생성 (검증 로직 분리)
- TenantUpdateRequest.php 생성 (검증 로직 분리)
- TenantController.php FormRequest 적용 및 DI 패턴 적용
- TenantService static 호출 → DI 인스턴스 호출
- lang/ko/message.php tenant 메시지 키 추가
Phase 3-6 (CategoryApi.php):
- CategoryStoreRequest.php 생성 (검증 로직 분리)
- CategoryUpdateRequest.php 생성 (검증 로직 분리)
- CategoryMoveRequest.php 생성 (카테고리 이동 검증)
- CategoryReorderRequest.php 생성 (정렬순서 일괄 변경 검증)
- CategoryController.php FormRequest 적용
- lang/ko/message.php category 메시지 키 추가
- SAM API Development Rules 준수 완료
- UserUpdateRequest.php 생성 (검증 로직 분리)
- PasswordChangeRequest.php 생성 (비밀번호 변경 검증)
- SwitchTenantRequest.php 생성 (테넌트 전환 검증)
- UserApi.php에 Request 스키마 추가
- UserController.php FormRequest 적용 및 DI 패턴 적용
- MemberService static 호출 → DI 인스턴스 호출
- lang/ko/message.php user 메시지 키 추가
- SAM API Development Rules 준수 완료
- ClientStoreRequest.php 생성 (검증 로직 분리)
- ClientUpdateRequest.php 생성 (검증 로직 분리)
- ClientController.php FormRequest 적용 및 패턴 통일
- lang/ko/message.php client 메시지 키 추가
- ApiResponse::handle 패턴 통일 (메시지 두 번째 인자)
- SAM API Development Rules 준수 완료
- MaterialStoreRequest.php 생성 (검증 로직 분리)
- MaterialUpdateRequest.php 생성 (검증 로직 분리)
- MaterialApi.php 경로 수정 (/api/v1/products/materials)
- MaterialController.php Swagger 주석 제거, FormRequest 적용
- lang/ko/message.php material 메시지 키 추가
- SAM API Development Rules 준수 완료
- ProductStoreRequest, ProductUpdateRequest 생성
- ProductController에 FormRequest 적용
- 하드코딩된 메시지를 i18n 키로 변경
- lang/ko/message.php에 product 관련 메시지 키 추가
- SAM API Development Rules 준수
Phase 3-1: ProductApi.php Swagger 점검 완료
- AuthApi.php 응답 형식 실제 코드와 일치화
- logout: {success, message, data} → {message}
- debug-apikey: description 및 응답 형식 추가
- login API 검증 완료
- 요청/응답 스키마와 실제 코드 일치 확인
- user, tenant, menus 구조 정확성 검증
- signup API 중복 확인
- AuthApi.php와 RegisterApi.php 동일 엔드포인트
- RegisterApi.php가 더 상세 (테넌트 생성 포함)
- SWAGGER_AUDIT.md 업데이트
- Phase 2 완료 상태로 변경
- 발견 이슈 4건 추가 (모두 해결)
- SAMInfo.php Auth 태그 상세화
- 인증 흐름 설명 추가 (API Key + Bearer Token)
- 사용 예시 코드 추가
- IP 기반 접근 제어 안내 추가
- RegisterApi.php 보안 어노테이션 추가
- security={"ApiKeyAuth": {}} 설정
- "Authentication: Not Required" 오류 해결
- SWAGGER_AUDIT.md 작업 추적 문서 생성
- Phase별 점검 계획 수립
- 표준 체크리스트 정의
- 진행 상황 추적 체계 구축
- MemberService::getUserInfoForLogin() 메서드 추가
- 사용자 기본 정보 (id, user_id, name, email, phone)
- 활성 테넌트 정보 (is_default 우선 → is_active 차순)
- 테넌트 없는 경우 null 반환
- 추가 테넌트 목록 (other_tenants 배열)
- 권한 기반 메뉴 필터링 (menu:{id}.view)
- 권한 체크 3단계
- 기본 Role 권한 (model_has_permissions)
- Override 권한 (permission_overrides, 시간 제약)
- 우선순위: deny(-1) > allow(1) > base permission
- ApiController::login() 응답 구조 변경
- 기존: {message, user_token}
- 개선: {message, user_token, user, tenant, menus}
- Swagger 문서 업데이트 (AuthApi.php)
- 테넌트 있는 경우 응답 스키마
- 테넌트 없는 경우 응답 스키마 (null)
- 에러 케이스 추가 (400, 401, 404)
- 사용자 등록 + 테넌트 생성 + 시스템 관리자 권한 자동 부여
- 사업자번호 조건부 검증 (active 테넌트만 unique)
- 글로벌 메뉴 자동 복제 (parent_id 매핑 알고리즘)
- DB 트랜잭션으로 전체 프로세스 원자성 보장
추가:
- RegisterRequest: FormRequest 검증 (conditional unique)
- RegisterService: 9-step 통합 비즈니스 로직
- RegisterController: ApiResponse::handle() 패턴
- RegisterApi: 완전한 Swagger 문서
수정:
- MenusStep: 글로벌 메뉴 복제 로직 구현
- message.php: 'registered' 키 추가
- error.php: 4개 에러 메시지 추가
- routes/api.php: POST /api/v1/register 라우트
SAM API Rules 준수:
- Service-First, FormRequest, i18n, Swagger, DB Transaction
- use 문 파싱 추가하여 짧은 클래스명을 FQCN으로 변환
- self/static 자기 참조 관계 정상 처리
- Polymorphic 관계 지원 (morphTo, morphMany, morphOne)
- 클래스 존재 확인 및 안전한 에러 처리
- ::class 문자열 오류 수정
마이그레이션 실행 시 'Class BoardSetting::class not found' 에러 해결
- CommonComponents.php: ApiResponse/ErrorResponse 글로벌 스키마 수정
- property="status" → property="success" (boolean)
- property="data" → property="error" (object with code/details)
- AuthApi, AdminApi, UserApi: 개별 응답 스키마 수정
- signup(): allOf 구조로 변경
- index(): Laravel LengthAwarePaginator 구조 적용
- updateMe(): Member schema 참조로 변경
- PermissionApi, MaterialApi, DepartmentApi: 로컬 스키마 재정의 제거
- ClientGroupService: 삭제된 데이터 자동 복원 기능 구현
- store(): withTrashed()로 삭제된 데이터 확인 후 restore()
- update(): 삭제된 코드 존재 시 에러 반환
- ClientApi: client_group_id 필드 추가
- Client, ClientCreateRequest, ClientUpdateRequest 스키마에 추가
- lang/ko/error.php, lang/en/error.php: 에러 메시지 추가
- duplicate_code, has_clients, code_exists_in_deleted
- Swagger 문서 재생성 및 검증 완료
- Spatie\Permission\Models\Permission 확장
- tenant() belongsTo 관계 추가
- tenant_id fillable 추가
- API 권한 시스템에서 사용
🤖 Generated with [Claude Code](https://claude.ai/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- DB 연결: 로컬/Docker 환경 오버라이딩 설정 (.env)
- 테넌트 위젯: redirect 버그 수정 (TenantSelectorWidget)
- 통계 위젯: 사용자/제품/자재/주문 카드 추가 (StatsOverviewWidget)
- 리소스 한국어화: Product, Material 모델 레이블 추가
- 대시보드: 위젯 등록 및 캐시 최적화
🤖 Generated with [Claude Code](https://claude.ai/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Material 모델
- fillable 속성 추가 (모든 필드 명시)
- User 모델
- BelongsToMany 관계 타입 힌트 추가
- Product 모델
- fillable에 unit 필드 추가
- casts 순서 정리 (boolean 그룹화)
- ProductComponent 모델
- quantity 캐스트 정밀도 변경 (decimal:4 → decimal:6)
- referencedItem() 메서드 추가 (동적 관계 로드)
- product(), material() 관계 메서드 수정 (where 조건 추가)
- is_default 캐스트 제거 (컬럼 없음)
- Tenant 모델
- options 캐스트 추가 (array)
- scopeActive() 추가 (trial, active 상태 필터링)
- isActive(), isTrial() 헬퍼 메서드 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- GraphViz 설치를 통한 ERD 다이어그램 생성 지원
- BelongsToTenantTrait → BelongsToTenant 트레잇명 수정
- Estimate, EstimateItem 모델의 인터페이스 참조 오류 해결
- 60개 모델의 완전한 관계도 생성 (graph.png, 4.1MB)
- beyondcode/laravel-er-diagram-generator 패키지 활용
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Settings 그룹 API 문서 추가
* CommonController에 공통 코드 관리 CRUD 문서 작성
* TenantFieldSettingController에 필드 설정 관리 문서 작성
* "Settings - Common Codes", "Settings - Fields" 태그로 그룹화
- Products/Materials 통합 문서 업데이트
* MaterialController에 "Products & Materials - Materials" 태그 적용
* Products 그룹 내 자재 관리로 통합 구성
- Files API 완전한 Swagger 문서 추가
* FileController에 누락되었던 전체 API 문서 작성
* 파일 업로드/조회/삭제/정보조회 모든 엔드포인트 문서화
* "Files" 태그로 독립적인 그룹 구성
- 새로운 에러 메시지 응답 예제 추가
* Materials 관련: 중복 코드, 사용 중 삭제 불가, 정보 없음
* Settings 관련: 중복 공통 코드, 필드 설정 없음, 유효하지 않은 타입
* Files 관련: 업로드 실패, 파일 크기 초과, 지원하지 않는 형식
- 제거된 BOM 라우트 문서 정리
* 사용하지 않는 BomApi.php 파일 삭제
* 기본 BOM 시스템(/v1/boms) 완전 제거로 문서 정합성 확보
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## 주요 변경사항
### BOM 시스템 통합 및 정리
- 기본 BOM 시스템 완전 제거 (미완성 3-tier 구조)
- app/Http/Controllers/Api/V1/BomController.php 삭제
- app/Services/BomService.php 삭제
- app/Models/Products/Bom.php 삭제
- app/Models/Products/BomItem.php 삭제
- BOM 역할 명확화: Product BOM (운영용) + Design BOM (설계용)
- Tag 모델에서 불필요한 BOM 참조 제거
### API 그룹핑 최적화
- Products & Materials 통합: /v1/products/materials/*
- Settings & Configuration 통합: /v1/settings/*
- 필드 설정: /v1/settings/fields/*
- 옵션 관리: /v1/settings/options/*
- 공통 코드: /v1/settings/common/*
- 기존 분산된 라우트 통합으로 일관성 향상
### 번역 완성도 향상
- 영어 에러 메시지 누락 항목 추가
- Settings, Materials, File 관련 메시지 보완
- 한국어/영어 번역 파일 동기화 완료
### 시스템 품질 개선
- API 구조 논리적 재구성으로 사용자 경험 향상
- 코드 복잡도 감소 및 유지보수성 개선
- 불필요한 컨트롤러/서비스 제거로 시스템 단순화
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 5130의 71개 하드코딩 컬럼을 동적 카테고리 필드 시스템으로 전환
- 모터 브라켓 계산 등 핵심 비즈니스 로직 FormulaParser에 통합
- 파라미터 기반 동적 견적 폼 시스템 구축
- 견적 상태 워크플로 (DRAFT → SENT → APPROVED/REJECTED/EXPIRED)
- 모델셋 관리 API: 카테고리+제품+BOM 통합 관리
- 견적 관리 API: 생성/수정/복제/상태변경/미리보기 기능
주요 구현 사항:
- EstimateController/EstimateService: 견적 비즈니스 로직
- ModelSetController/ModelSetService: 모델셋 관리 로직
- Estimate/EstimateItem 모델: 견적 데이터 구조
- 동적 견적 필드 마이그레이션: 스크린/철재 제품 구조
- API 라우트 17개 엔드포인트 추가
- 다국어 메시지 지원 (성공/에러 메시지)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- BomCalculationApi.php: 기존 시스템 방식 클래스 형태 Swagger 문서 작성
- BOM Calculation 태그로 5개 API 엔드포인트 완전 문서화
- 요청/응답 스키마, 예시 데이터, 오류 응답 모두 정의
- BomCalculationController.php: ApiResponse 클래스 참조 경로 수정
- App\Http\Resources\ApiResponse → App\Helpers\ApiResponse
- 테스트 데이터 생성으로 완전한 API 테스트 환경 구축
Swagger UI에서 "BOM Calculation" 메뉴로 확인 가능
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 데이터베이스 스키마 확장: BOM 테이블에 계산 관련 필드 추가
- 계산 엔진 구현: CalculationEngine, FormulaParser, ParameterValidator
- API 구현: 견적 파라미터 추출, 실시간 BOM 계산, 업체별 산출식 관리
- FormRequest 검증: 모든 입력 데이터 검증 및 한국어 에러 메시지
- 라우트 등록: 5개 BOM 계산 API 엔드포인트 추가
주요 기능:
• BOM에서 필요한 조건만 동적 추출하여 견적 화면에 표시
• 경동기업 하드코딩 산출식을 동적 시스템으로 전환
• 업체별 산출식 버전 관리 및 실시간 테스트 지원
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>