Commit Graph

71 Commits

Author SHA1 Message Date
a23b727557 feat: Items API CRUD 기능 추가 (BP-MES Phase 1 Day 3-5)
- ItemsController 및 ItemsService CRUD 메서드 구현
- FormRequest 검증 클래스 추가 (ItemStoreRequest, ItemUpdateRequest)
- Swagger 문서 완성 (ItemsApi.php)
- 품목 생성/조회/수정/삭제 엔드포인트 추가
- i18n 메시지 키 추가 (message.item)
- Code 기반 라우팅 적용
- Hybrid 구조 지원 (고정 필드 + attributes JSON)
2025-11-17 11:22:49 +09:00
ffcc6c3742 feat: TenantStatField API 구현
- 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
2025-11-14 14:09:53 +09:00
d4e9f2a6e4 refactor: CategoryField API를 SAM API Rules에 맞게 리팩토링
- FormRequest 패턴 적용 (CategoryFieldStoreRequest, CategoryFieldUpdateRequest)
- Service에서 Validator::make() 제거
- Controller 메시지 i18n 키로 변경 (__('message.category_field.*'))
- is_required 타입을 'Y'/'N' → boolean으로 통일
- Swagger 스키마 is_required boolean 타입으로 업데이트
- Model scopeRequired() boolean 조건으로 변경
2025-11-14 13:45:54 +09:00
e848e12412 feat: Product API 하이브리드 구조 지원 (Phase 1)
[FormRequest 업데이트]
- ProductStoreRequest, ProductUpdateRequest에 하이브리드 필드 추가
  - 고정 필드: safety_stock, lead_time, is_variable_size, product_category, part_type
  - 동적 필드: attributes, attributes_archive
  - unit 필드 추가
- is_active → 제거 (모델과 일치)
- boolean 검증 개선 (in:0,1 → boolean)

[ProductService 업데이트]
- store/update 메서드 중복 Validator 제거 (FormRequest가 검증)
- 기본값 설정 간소화 (true/false로 통일)
- is_active 관련 로직 주석처리
  - index 메서드 필터
  - toggle 메서드 비활성화
  - search 메서드 select 컬럼 수정
- Validator import 제거

[ProductController 업데이트]
- toggle 메서드 주석처리 (is_active 제거에 따름)

[기능 변경]
- 기존: 고정 필드 위주
- 변경: 하이브리드 구조 (최소 고정 + attributes JSON)
- attributes를 통해 테넌트별 커스텀 필드 지원

[비고]
- is_active는 필요시 attributes JSON이나 별도 필드로 재구현 가능
- toggle 기능도 필요시 복원 가능 (주석으로 보존)
2025-11-14 12:42:08 +09:00
6f7d754457 feat: API Key 보안 강화 및 Rate Limiting 구현
- 글로벌 미들웨어로 API Key 검증 적용
- 화이트리스트 확장 (Swagger, Health check 등)
- Rate Limiting 미들웨어 추가 (10회/분)
- 보안 로그 강화 (무단 접근 시도 기록)
- 민감 정보 로깅 제외 (password 필드)
2025-11-13 20:30:34 +09:00
641d7f62ab feat: 글로벌 메뉴 템플릿 복제 시스템 구현
- GlobalMenuTemplateSeeder 추가: 60개 메뉴 템플릿 생성 (tenant_id=NULL)
- MenuBootstrapService.cloneGlobalMenusForTenant() 추가
  - parent_id 매핑으로 계층 구조 유지
  - DB 트랜잭션으로 원자성 보장
- RegisterService 업데이트: 신규 회원가입 시 메뉴 템플릿 복제
- 기존 225개 테넌트에 메뉴 일괄 복제 완료
- 테스트 완료: 회원가입 + 로그인 시 60개 메뉴 정상 반환
2025-11-11 18:03:11 +09:00
ddc4bb99a0 feat: 통합 품목 조회 API 및 가격 통합 시스템 구현
- 통합 품목 조회 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)
2025-11-11 11:30:17 +09:00
fdef567863 feat: 로그인 API에 roles 정보 추가
- 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줄)
2025-11-11 10:56:39 +09:00
bf905f3a5d fix: 회원가입 API 응답 구조 개선
- RegisterService: roles 응답에서 permissions 배열 제거
- menus 배열로 접근 가능한 메뉴 확인 가능하므로 중복 제거
- Swagger 문서 업데이트 (permissions 스키마 제거)
2025-11-11 10:22:40 +09:00
c83e029448 feat: 파일 저장 시스템 DB 마이그레이션
- 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개 기본 폴더 (생산관리, 품질관리, 회계, 인사, 일반)
  - 에러 처리 및 로깅
  - 회원가입 시 자동 실행
2025-11-10 22:09:28 +09:00
798d5149ea feat: API 토큰 관리 시스템 구현 (액세스/리프레시 토큰 분리)
- AuthService: 토큰 발급/갱신 통합 관리
- RefreshController: POST /api/v1/refresh 엔드포인트 추가
- 액세스 토큰 2시간, 리프레시 토큰 7일 (.env 설정)
- TOKEN_EXPIRED 에러 코드로 프론트엔드 자동 리프레시 지원
- 리프레시 토큰 일회성 사용 (보안 강화)
- Swagger 문서 Auth 태그로 통합
2025-11-10 11:17:32 +09:00
657623fef5 perf: 회원가입 쿼리 최적화 (268개 → 58개, 78% 감소)
- MenuObserver: Bulk insert + 지연 캐시 삭제로 메뉴당 28개 → 3개 쿼리
- RegisterService: 중복 권한 생성 로직 제거 (27개 쿼리 감소)
- 캐시 삭제: 126개 → 11개 (91% 감소)
- 확장성 유지: 관리자 메뉴 추가 시에도 최적화 적용
2025-11-10 10:30:35 +09:00
c558606954 feat: 회원가입 API 응답에 메뉴 리스트 추가
주요 변경사항:
- 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와 동일한 메뉴 정보 구조 제공
2025-11-10 09:44:22 +09:00
92c60ff39f fix: 회원가입 메뉴 생성 오류 수정 및 검증 에러 처리 개선
주요 변경사항:
- 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 객체에 필드별 에러 정보 포함
2025-11-10 09:35:43 +09:00
9ba6e8d833 feat: 회원가입 시 기본 메뉴 자동 생성 및 권한 설정
- MenuBootstrapService 생성: 새 테넌트를 위한 기본 메뉴 9개 자동 생성
  - 대시보드
  - 기초정보관리 (제품/거래처/BOM 관리)
  - 시스템 관리 (사용자/권한/부서 관리)
- RegisterService 수정: 메뉴 생성 후 권한 자동 설정
  - 생성된 메뉴에 대한 권한(menu.{id}) 자동 생성
  - system_manager 역할에 모든 메뉴 권한 할당
- 기존 테이블 구조에 맞게 구현 (code, route_name, depth, description 컬럼 미사용)
- message.registered 수정: '회원가입 처리'로 변경 (에러 메시지 개선)
2025-11-10 09:11:41 +09:00
d136fc97b2 fix: RegisterService에서 메뉴 생성 로직 제거
- RecipeRegistry 호출 제거 (클래스 존재하지 않음)
- 메뉴 기반 권한 생성 로직 제거
- system_manager 역할만 생성하고 사용자에게 부여
- 메뉴 테이블 컬럼 불일치 오류 해결

현재는 기본 회원가입 기능만 제공:
- 테넌트 생성 (코드 자동 생성)
- 사용자 생성
- 테넌트-사용자 프로필 연결
- system_manager 역할 부여

향후 메뉴 시스템이 완성되면 RecipeRegistry를 다시 활성화할 예정
2025-11-07 18:15:50 +09:00
be746041fc feat: 테넌트 코드 생성 헬퍼 추가 및 RegisterService 적용
- TenantCodeGenerator 헬퍼 클래스 생성
  - 한글 초성 추출 및 영문 변환
  - Base-36 순번 생성 (최대 1,679,616 코드)
  - 순환형 코드 생성 (초성+순번 조합)
- RegisterService에서 테넌트 생성 시 코드 자동 생성
- 회원가입 시 'code' 필드 누락 오류 해결
2025-11-07 18:11:03 +09:00
ae527f90e8 feat: 로그인 응답 메뉴에 외부 링크 정보 추가 (is_external, external_url) 2025-11-06 20:00:20 +09:00
410a78d336 feat: 로그인 응답에 사용자/테넌트/메뉴 정보 추가
- 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)
2025-11-06 19:54:08 +09:00
cc206fdbed style: Laravel Pint 코드 포맷팅 적용
- PSR-12 스타일 가이드 준수
- 302개 파일 스타일 이슈 자동 수정
- 코드 로직 변경 없음 (포맷팅만)
2025-11-06 17:45:49 +09:00
48e76432ee feat: 회원가입 + 테넌트 생성 통합 API 추가 (/api/v1/register)
- 사용자 등록 + 테넌트 생성 + 시스템 관리자 권한 자동 부여
- 사업자번호 조건부 검증 (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
2025-11-06 17:24:42 +09:00
c5ea6d189a feat: Swagger 문서 전면 수정 및 ClientGroup 자동 복원 기능 추가
- 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 문서 재생성 및 검증 완료
2025-10-14 09:10:52 +09:00
b6f36cc967 feat: ClientGroup 및 Pricing API 완성 및 Swagger 문서 작성
- ClientGroupService 구현: 고객 그룹 관리 비즈니스 로직 (CRUD + toggle)
- ClientGroupController 구현: 6개 REST API 엔드포인트
- PricingController 구현: 5개 가격 관리 API 엔드포인트
- routes/api.php에 client-groups, pricing 라우트 등록
- ClientGroupApi.php Swagger 문서 작성 (OpenAPI 3.0)
- PricingApi.php Swagger 문서 작성 (OpenAPI 3.0)
- l5-swagger 재생성 완료

추가된 파일:
- app/Services/ClientGroupService.php
- app/Http/Controllers/Api/V1/ClientGroupController.php
- app/Http/Controllers/Api/V1/PricingController.php
- app/Swagger/v1/ClientGroupApi.php
- app/Swagger/v1/PricingApi.php

수정된 파일:
- routes/api.php (라우트 11개 추가)
- CURRENT_WORKS.md (작업 내용 문서화)

API 엔드포인트:
- GET/POST/PUT/DELETE /api/v1/client-groups
- GET/POST /api/v1/pricing (show, bulk, upsert 포함)
2025-10-13 22:06:42 +09:00
a6b06be61d feat: 견적 단가 자동 적용 기능 추가
- 고객 그룹별 단가 조정 지원
- 견적 생성 시 자동 단가 조회
- 매출단가만 사용 (매입단가는 경고)
2025-10-13 21:52:34 +09:00
802a511aa0 Revert "feat: DB 연결 오버라이딩 및 대시보드 통계 위젯 추가"
This reverts commit bf8036a64b.
2025-09-30 23:56:25 +09:00
bf8036a64b feat: DB 연결 오버라이딩 및 대시보드 통계 위젯 추가
- DB 연결: 로컬/Docker 환경 오버라이딩 설정 (.env)
- 테넌트 위젯: redirect 버그 수정 (TenantSelectorWidget)
- 통계 위젯: 사용자/제품/자재/주문 카드 추가 (StatsOverviewWidget)
- 리소스 한국어화: Product, Material 모델 레이블 추가
- 대시보드: 위젯 등록 및 캐시 최적화

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-30 23:31:14 +09:00
b6ff56023f refactor: BOM 시스템 정리 및 API 구조 최적화
## 주요 변경사항

### 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>
2025-09-24 20:35:17 +09:00
2d9217c9b4 feat: 견적 시스템 API
- 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>
2025-09-24 17:43:29 +09:00
bd678dfea9 feat: 업체별 동적 BOM 계산 시스템 구현
- 데이터베이스 스키마 확장: 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>
2025-09-22 22:09:42 +09:00
785e367472 feat: 통합 감사 로그 도입 및 조회 API/스케줄러 추가
- DB: 감사 로그 테이블(audit_logs) 마이그레이션 및 인덱스 추가
- Config: audit.php 추가(AUDIT_RETENTION_DAYS, AUDIT_LOG_READS 토글)
- Model/Service: AuditLog 모델, AuditLogger 서비스 생성
- 도메인 훅: ModelVersion.release(released), BomTemplate upsert/update/delete/replaceItems/clone 기록, diff 조회는 설정 기반 기록
- API: GET /api/v1/design/audit-logs 추가(FormRequest/Service/Controller, 필터 page/size/target_type/target_id/action/actor_id/from/to/sort/order)
- Swagger: 감사 로그 조회 문서 추가(Design Audit 태그)
- Console: audit:prune 커맨드 추가 및 스케줄러 매일 03:10 실행 등록(시스템 크론 schedule:run 필요)
- Fix: PruneAuditLogs import 충돌 제거(Google ServiceControl AuditLog 제거)
2025-09-11 14:39:55 +09:00
17fa82c35b feat: Design BOM 템플릿 diff/clone API 및 모델버전 릴리즈 유효성 검사 도입
- Design BOM 템플릿 diff/clone 엔드포인트 추가
- 컨트롤러 검증 로직 FormRequest 분리(DiffRequest/CloneRequest/Upsert/ReplaceItems)
- BomTemplateService에 diffTemplates/cloneTemplate/replaceItems/쇼우 로직 정리
- ModelVersionController createDraft FormRequest 적용 및 서비스 호출 정리
- 모델버전 release 전 유효성 검사(존재/활성/테넌트 일치, qty>0, 중복 금지) 추가
- DB enum 미사용 방침 준수(status 문자열 유지)
- model_versions 인덱스 최적화(tenant_id, model_id, status / 기간 범위)
- Swagger 문서(Design BOM) 및 i18n 메시지 키 추가
2025-09-11 13:39:32 +09:00
d9563c96cb fix : 모델, BOM 구성 수정
- 설계용 모델, BOM 기능 추가
2025-09-05 17:59:34 +09:00
41d0afa245 fix : BOM구성 API - 자재 정보 오류 수정 2025-09-02 10:08:57 +09:00
622c4905fa fix : BOM구성 API, DB 작업
- product_components 컬럼 변경
- BOM 구성, 카테고리리스트, BOM트리(재귀)호출 API 개발
2025-09-02 10:08:55 +09:00
028af8fbfa fix : 모델 및 자재관리 수정 2025-09-02 10:08:51 +09:00
c1996216c2 fix : 제품 카테고리 목록 조회 - static -> instance 변경 2025-08-26 08:34:32 +09:00
52bf8527e2 fix : 카테고리, 제품등록, BOM등록 API (일부 개발 - BOM 추가 작업 필요) 2025-08-25 17:46:34 +09:00
fe7d761bf6 fix : 분류 API 2025-08-22 19:30:05 +09:00
4b6e43ee62 fix : 카테고리 API 2025-08-22 18:08:57 +09:00
cd81285731 feat : 테넌트 부트스트랩 오케스트레이션
Notion : https://www.notion.so/hamss/2579c8d34ba080d586b6faaae249f476?source=copy_link
2025-08-22 15:57:44 +09:00
ed993476be fix : 자재관리 API (리스트,조회,등록,수정,삭제) 2025-08-21 22:28:34 +09:00
d861465276 fix : 부서,역할,유저 권한 메트릭스 조회 API 2025-08-21 20:48:39 +09:00
3ee7719cbc fix : 부서관리 기능 수정
- Route, Controller, Service, Swagger, DB 수정
- 모델 위치 이동
2025-08-21 18:38:27 +09:00
52352f7896 fix : 부서생성 API 오류 수정 2025-08-21 15:43:06 +09:00
05745ee338 fix : Base Service 추가 및 다국어 설정, DepartmentService 서비스를 static에서 인스턴스로 변경
- 모든 서비스를 인스턴스구조로 변경예정
  * 규모가 커질수록 → 인스턴스(=DI) 설계가 유리
  * 작고 단순한 유틸/순수 함수만 스태틱으로 유지
  * DI/모킹/테스트 쉬움 (서비스 교체·부분 테스트 가능)
  * 의존성 교체 쉬움 (Repo/캐시/로거…)
  * 상태·컨텍스트 주입 명확 (테넌트/유저/트랜잭션)
2025-08-20 20:23:01 +09:00
3741dba27b refactor : 불필요한 소스 정리 및 수정 2025-08-20 17:01:32 +09:00
0f01c100d6 fix : 내 테넌트 목록 - 오류 수정
- 회원 가입후 테넌트가 없는 상태일때 빈 배열 처리
2025-08-20 11:02:46 +09:00
43e4c507a7 fix : 결과 전달시 두번 래핑되는 부분 수정
- 컨트롤러와 서비스에서 각각 래핑 후 결과 전달됨으로 이중 래핑되고 있음
  -> 서비스에서 래핑하는 부분을 컨트롤러로 옮겨서 컨트롤러에서만 한번 래핑하는 걸로 수정
2025-08-19 12:41:17 +09:00
aa190bf48d fix : 테넌트별 옵션설정 작업
- Tenant Fields
- Tenant Option Groups
- Tenant Option Values
- Tenant Profiles
2025-08-18 19:03:46 +09:00
6f1842181e fix : 메뉴 모델 및 일부 서비스파일 response 오류 수정 2025-08-16 04:16:34 +09:00