Commit Graph

268 Commits

Author SHA1 Message Date
cc3feb1927 feat: 품목 파일 업로드를 files 테이블 기반으로 변경
- ItemsFileController: files 테이블에 메타데이터 저장, products는 file_id 참조
- 저장 경로: storage/app/tenants/{tenant_id}/items/{year}/{month}/{stored_name}
- 파일명: 64bit 난수로 보안 강화 (bin2hex(random_bytes(8)))
- Swagger 문서: file_id 반환 및 저장 구조 설명 추가
- file-storage-guide.md 규격 준수
2025-12-11 22:40:55 +09:00
86ef841277 feat: 품목 삭제 로직 개선 및 중복 코드 예외 처리 보완
- 품목 삭제 시 모든 참조 테이블 사용 여부 체크 (Force Delete)
  - Product: BOM 구성품/상위품목, BOM 템플릿, 주문, 견적
  - Material: BOM 구성품, BOM 템플릿, 입고, LOT
- 사용 중인 품목 삭제 불가, 미사용 품목만 영구 삭제
- 일괄 삭제도 동일 로직 적용
- DuplicateCodeException 예외 처리 추가
  - ApiResponse.handle()에서 정상 처리되도록 수정
  - Handler.php에도 fallback 처리 추가
- i18n 에러 메시지 추가 (in_use, batch_in_use)
2025-12-11 19:01:07 +09:00
07f0db17a7 feat: 품목 코드 중복 시 에러 반환 및 중복 ID 제공
- DuplicateCodeException 커스텀 예외 추가
- 등록/수정 시 자동 코드 증가 기능 제거
- 중복 발견 시 duplicate_id, duplicate_code 함께 반환
- resolveUniqueCode(), resolveUniqueMaterialCode() 메서드 제거
2025-12-11 11:07:33 +09:00
d5ab522902 feat: Items API is_active 필터/반환 및 동적 필드 지원
- 목록 조회에 is_active 필드 반환 및 필터 파라미터 추가
- 상세 조회에서 options 동적 필드 플랫 전개
- 생성/수정 시 동적 필드 options 저장 지원
2025-12-11 09:56:01 +09:00
b086518075 feat: Material/Product 동적 필드 options 저장 및 자재 삭제 보호
- products 테이블에 options JSON 컬럼 추가 (마이그레이션)
- Material/Product 모델에 options 필드 추가 (fillable, casts)
- SystemFields::PRODUCTS에 options 상수 추가
- MaterialService/ProductService에 동적 필드 자동 추출 로직:
  - getKnownFields(): SystemFields + ItemField 기반 고정 필드 조회
  - extractDynamicOptions(): 동적 필드 추출
  - normalizeOptions(): [{label, value, unit}] 형태로 정규화
- material_code 중복 체크 시 soft delete 포함 (withTrashed)
- 사용 중인 자재 삭제 방지 (checkMaterialUsage)
- Material 모델에 category 관계 추가
2025-12-10 21:37:20 +09:00
cde89b2fb3 feat: Items API item_type 기반 통합 조회/삭제 개선
- ItemTypeHelper를 활용한 item_type(FG/PT/SM/RM/CS) → source_table 매핑
- getItem: item_type 파라미터로 products/materials 테이블 자동 결정
- deleteItem: item_type 필수 파라미터 추가
- batchDeleteItems: item_type별 일괄 삭제 지원
- 목록 조회 시 attributes 플랫 전개
- Swagger 문서 업데이트
2025-12-09 21:51:46 +09:00
9d5f0ba4ca fix: ItemTypeHelper CommonCode 모델 경로 수정
- App\Models\CommonCode → App\Models\Products\CommonCode
- Items 삭제 시 발생하던 Class not found 에러 해결
2025-12-09 21:47:58 +09:00
386eeb280f chore: 구버전 문서 정리 (docs 저장소로 이관)
- Item Master 관련 구버전 문서 삭제 (docs 저장소로 이관)
- 프론트엔드 요청서 삭제 (history 폴더로 아카이브)
- HR API 규칙 문서 삭제 (docs 저장소로 통합)
2025-12-09 20:28:06 +09:00
d9d2bbdacf docs: API 문서 인덱스 및 테스트 플로우 정리
- docs/INDEX.md 업데이트
- API 테스트 플로우 파일 추가
- LOGICAL_RELATIONSHIPS.md 업데이트
2025-12-09 20:27:54 +09:00
f1f4c52c31 feat: 근태관리/직원관리 API 구현
- AttendanceController, AttendanceService 추가
- EmployeeController, EmployeeService 추가
- Attendance 모델 및 마이그레이션 추가
- TenantUserProfile에 employee_status 컬럼 추가
- DepartmentService 트리 조회 기능 개선
- Swagger 문서 추가 (AttendanceApi, EmployeeApi)
- API 라우트 등록
2025-12-09 20:27:44 +09:00
33010f1916 feat: ItemTypeSeeder에 attributes.source_table 매핑 추가
- common_codes 테이블 item_type 그룹에 source_table 매핑 추가
- FG/PT → products, SM/RM/CS → materials 테이블 매핑
- attributes JSON에 name_en 영문명 추가
2025-12-09 20:27:30 +09:00
da44168464 fix: API 메뉴 권한 로직을 mng와 동일하게 수정
- MenuService, MemberService 권한 조회 로직 재작성
- 부서 권한: permission_overrides 테이블 사용 (Department 타입)
- 개인 권한: permission_overrides 테이블 사용 (User 타입)
- 권한 계산: (역할 ∪ 부서 ∪ 개인ALLOW) - 개인DENY
- User model_type을 'App\Models\User'로 하드코딩 (mng 호환)
2025-12-09 20:18:32 +09:00
d16f0410b8 feat: field_key 시스템 필드 예약어 검증 추가
- SystemFields 상수 클래스 생성 (app/Constants/)
  - source_table 기반 테이블별 예약어 관리
  - products/materials 테이블 고정 컬럼 정의
  - 공통 시스템 컬럼 포함
- ItemFieldService 수정
  - validateFieldKeyUnique에 시스템 필드 검증 추가
  - source_table 미지정시 그룹 전체 예약어 체크 (안전 모드)
- 에러 메시지 추가 (error.field_key_reserved)
- 작업 문서 추가 (docs/specs/item-master-field-key-validation.md)
2025-12-09 14:06:35 +09:00
004324d65b docs: 사원관리/근태관리/부서트리 API 규칙 문서 추가
- docs/rules/employee-api.md: 사원관리 API 규칙 문서
- docs/rules/attendance-api.md: 근태관리 API 규칙 문서
- docs/rules/department-tree-api.md: 부서트리 조회 API 규칙 문서
2025-12-09 11:39:27 +09:00
0600a2f822 docs: Items API show 메서드 Swagger 추가 2025-12-09 10:30:35 +09:00
b2b3b27f17 docs: 작업 현황 및 관계 문서 업데이트 2025-12-09 09:40:01 +09:00
c4a4f85e63 feat: QuoteApi Swagger 추가 및 서비스 수정
- QuoteApi: 견적 API Swagger 문서 추가
- Board 모델, GlobalMenuService, MenuSyncService 오류 수정
2025-12-09 09:39:41 +09:00
bf92b37ff6 feat: 품목 마스터 소스 매핑 기능 추가
- ItemField 모델: 소스 매핑 컬럼 추가 (source_table, source_column 등)
- ItemPage 모델: source_table 컬럼 추가
- ItemDataService: 동적 데이터 조회 서비스
- ItemMasterApi Swagger 업데이트
- ItemTypeSeeder: 품목 유형 시더
- 스펙 문서: ITEM_MASTER_FIELD_INTEGRATION_PLAN.md
2025-12-09 09:39:16 +09:00
46d4c30880 chore: 마이그레이션 파일 안정화 (anonymousClass 추가) 2025-12-09 09:38:56 +09:00
5f200054ea feat: clients.is_active CHAR(1) → TINYINT(1) Boolean 마이그레이션
- DB: CHAR(1) 'Y'/'N' → TINYINT(1) 0/1 컬럼 타입 변경
- Model: boolean 캐스트 추가, scopeActive() 수정
- Service: toggle(), index() Boolean 로직 적용
- FormRequest: 'in:Y,N' → 'boolean' 검증 규칙 변경
- Swagger: is_active type string → boolean 변경
2025-12-08 20:25:38 +09:00
8d3ea4bb39 feat: 단가 관리 API 구현 및 Flow Tester 호환성 개선
- Price, PriceRevision 모델 추가 (PriceHistory 대체)
- PricingService: CRUD, 원가 조회, 확정 기능
- PricingController: statusCode 파라미터로 201 반환 지원
- NotFoundHttpException(404) 적용 (존재하지 않는 리소스)
- FormRequest 분리 (Store, Update, Index, Cost, ByItems)
- Swagger 문서 업데이트
- ApiResponse::handle()에 statusCode 옵션 추가
- prices/price_revisions 마이그레이션 및 데이터 이관
2025-12-08 19:03:50 +09:00
56c707f033 fix : 품목 목록 조회 (통합) - 정렬 역순 2025-12-08 10:38:25 +09:00
5131bfff98 feat: item_fields 테이블에 is_active 컬럼 추가
- 마이그레이션: is_active 컬럼 추가 (기본값 true)
- ItemField 모델: fillable, casts에 is_active 추가
- ItemFieldService: store, storeIndependent, clone, update 메서드에 is_active 처리
- FormRequest: is_active 유효성 검사 규칙 추가
- API Flow 테스트 시나리오 추가 (docs/api-flows/)
- docs/INDEX.md에 api-flows 섹션 추가

ModelTrait::scopeActive() 메서드 사용을 위한 필수 컬럼
2025-12-05 14:40:09 +09:00
c946fa457c chore: API Flow Tester 설정 및 문서 업데이트
- flow-tester-auth.json: 인증 API 테스트 설정 추가
- flow-tester-client.json: Client API 테스트 설정 업데이트
- flow-tester-item-master.json: ItemMaster API 테스트 설정 추가
- LOGICAL_RELATIONSHIPS.md: 논리 관계 문서 업데이트
2025-12-04 22:22:46 +09:00
2b57910ca5 chore: 누락된 마이그레이션 추가
- create_quote_formula_tables: 견적 수식 테이블 5개
  - quote_formula_categories (카테고리)
  - quote_formulas (수식)
  - quote_formula_ranges (범위값)
  - quote_formula_mappings (매핑값)
  - quote_formula_items (품목 출력)

- add_api_logs_to_admin_api_flow_runs_table: API Flow 로그 컬럼
2025-12-04 22:20:09 +09:00
40ca8b8697 feat: [quote] 견적 API Phase 2-3 완료 (Service + Controller Layer)
Phase 2 - Service Layer:
- QuoteService: 견적 CRUD + 상태관리 (확정/전환)
- QuoteNumberService: 견적번호 채번 (KD-{PREFIX}-YYMMDD-SEQ)
- FormulaEvaluatorService: 수식 평가 엔진 (SUM, IF, ROUND 등)
- QuoteCalculationService: 자동산출 (스크린/철재 제품)
- QuoteDocumentService: PDF 생성 및 이메일/카카오 발송

Phase 3 - Controller Layer:
- QuoteController: 16개 엔드포인트
- FormRequest 7개: Index, Store, Update, BulkDelete, Calculate, SendEmail, SendKakao
- QuoteApi.php: Swagger 문서 (12개 스키마, 16개 엔드포인트)
- routes/api.php: 16개 라우트 등록

i18n 키 추가:
- error.php: quote_not_found, formula_* 등
- message.php: quote.* 성공 메시지
2025-12-04 22:03:40 +09:00
d164bb4c4a feat: [client] 거래처 API 2차 필드 추가 및 견적 계획 업데이트
- 거래처 유형(client_type), 연락처(mobile, fax), 담당자 정보 필드 추가
- 발주처 설정(account_id/password, payment_day) 필드 추가
- 약정 세금(tax_agreement, tax_amount, tax_start/end_date) 필드 추가
- 악성채권(bad_debt 관련 5개 필드) 정보 필드 추가
- Model, Service, FormRequest, Swagger 문서 업데이트
- 견적 API 계획에 문서 발송 API(email/fax/kakao) 요구사항 추가
2025-12-04 21:13:58 +09:00
96e9a0ba18 feat: [quote] 견적관리 API 기반 구축 (Phase 1)
- 마이그레이션 생성: quotes, quote_items, quote_revisions 테이블
- Model 생성: Quote, QuoteItem, QuoteRevision
- BelongsToTenant, SoftDeletes 트레이트 적용
- 상태 관리 메서드 및 스코프 구현
- 개발 계획서 작성 및 진행 상황 문서화
2025-12-04 17:17:05 +09:00
ccd8b6f81d feat: [quote] 수식 시더 품목/매핑 데이터 추가
- QuoteFormulaSeeder: CONTROLLER_TYPE input 수식 추가
- QuoteFormulaItemSeeder: 14개 품목 마스터 (GR, CASE, MOTOR, CTRL, EDGE, INSP)
- QuoteFormulaMappingSeeder: CTRL_AUTO_SELECT 매핑 3건 (매립형/노출형/일체형)
2025-12-04 16:23:39 +09:00
165512e121 feat: [client] Client API 사업자 정보 필드 및 toggle 버그 수정
- business_no, business_type, business_item 필드 추가
- toggle 로직 수정: boolean 캐스팅 호환 (is_active === 'Y' → !is_active)
2025-12-04 15:58:08 +09:00
f48ac54fe4 [fix] 미정의 변수 사용 수식 12개 비활성화
- QuoteFormulaSeeder: is_active 플래그 추가 (기본 true)
- 미정의 변수 사용 수식 비활성화:
  - GR_QTY_WALL, GR_QTY_SIDE, GR_QTY_MIXED (BASE_QTY 미정의)
  - EDGE_QTY (EDGE_WING_SIZE 미정의)
  - PRICE_GR, PRICE_CASE, PRICE_MOTOR, PRICE_CTRL, PRICE_EDGE (QTY, UNIT_PRICE 미정의)
  - PRICE_INSP (INSPECTION_FEE 미정의)
  - PRICE_AREA_SCREEN, PRICE_AREA_STEEL (AREA, UNIT_PRICE_PER_M2 미정의)
2025-12-04 15:24:10 +09:00
7967082f8b refactor: BOM API ref_id 통합 및 응답 개선
- child_product_id, material_id를 ref_id 단일 컬럼으로 통합
- splitRef() 메서드 제거
- bulkUpsert() 응답에 created_ids, updated_ids 추가
2025-12-04 13:45:41 +09:00
fbaf2720d8 fix: 품목 삭제 시 BOM 참조 무결성 체크 추가
- 삭제 전 product_components 테이블에서 사용 여부 확인
- BOM 구성품으로 사용 중인 품목 삭제 차단 (400 에러)
- 일괄 삭제에도 동일한 참조 체크 적용
- 품목 관련 에러 메시지 추가 (error.item.*)
- 품목 삭제 API 테스트 플로우 JSON 추가
2025-12-03 22:35:38 +09:00
695afb8a86 chore: flow_runs 테이블 failed_step 컬럼 변경 및 문서 업데이트 2025-12-03 16:49:33 +09:00
b8e96be56c refactor: 회원가입 메뉴 복사 로직을 global_menus 테이블 기반으로 변경
- MenuBootstrapService: menus → global_menus 테이블에서 조회
- MenusStep: 신규 테넌트 부트스트랩 시 global_menus 사용
- GlobalMenuTemplateSeeder: GlobalMenu 모델 사용으로 변경
2025-12-02 22:55:10 +09:00
6b4f02e96e docs: 작업 현황 및 관계 문서 업데이트 2025-12-02 22:11:25 +09:00
198ba8688c feat: PM 이슈에 팀/담당자/고객사 필드 추가
- department_id, team: 부서 (하이브리드 FK + 문자열)
- assignee_id, assignee_name: 담당자 (하이브리드)
- client: 고객사명 (문자열)
2025-12-02 22:11:15 +09:00
a72a744612 feat: 글로벌 메뉴 분리 및 테넌트 메뉴 동기화 시스템 구현
- global_menus 테이블 분리를 위한 menus 컬럼 추가 (global_menu_id, is_customized)
- GlobalMenuController: 글로벌 메뉴 CRUD API
- GlobalMenuService: 글로벌 메뉴 비즈니스 로직
- MenuSyncService: 테넌트 메뉴 동기화 서비스
- MenuBootstrapService: 테넌트 초기 메뉴 생성 로직 개선
- MenuController: 메뉴 재동기화 엔드포인트 추가
2025-12-02 22:11:08 +09:00
84eb4f5ab4 fix: global_menus 마이그레이션에 테이블 존재 체크 추가
- 개발 서버에서 테이블 이미 존재 시 에러 발생 방지
- Schema::hasTable() 체크로 중복 생성 스킵
2025-12-02 22:08:49 +09:00
d9348c0714 feat: global_menus 테이블 분리 및 모델 구현
- global_menus 테이블 생성 (ID 1번부터 시작)
- 기존 menus(tenant_id IS NULL) → global_menus 데이터 이전
- GlobalMenu 모델 생성
- Menu.globalMenu() 관계를 GlobalMenu 모델로 변경
2025-12-02 20:43:29 +09:00
686a979127 fix: Items API 품목 생성 시 타입별 테이블 분기 저장
- FG, PT 타입 → Products 테이블 저장
- SM, RM, CS 타입 → Materials 테이블 저장
- createMaterial() 메서드 추가
- resolveUniqueMaterialCode() 메서드 추가
2025-12-02 17:22:00 +09:00
2605d06f91 fix: products 테이블 category_id nullable로 변경
- 외래 키 제약조건으로 인한 INSERT 오류 해결
- category_id 기본값 null 설정
- ON DELETE SET NULL로 외래 키 제약조건 변경
2025-12-02 16:35:19 +09:00
a4a0248a83 fix: products 테이블 category_id 기본값 0 설정
- category_id 필드에 기본값이 없어 INSERT 오류 발생하던 문제 해결
2025-12-02 16:31:34 +09:00
88794c3ce4 feat: [pm] 이슈 일정 필드 추가 마이그레이션
- admin_pm_issues 테이블에 start_date, due_date, estimated_hours 컬럼 추가
- due_date 인덱스 추가
2025-12-02 16:06:18 +09:00
2f2999bb39 chore: archived_records record_type을 varchar로 변경
- enum('tenant','user') → varchar(50)
- 확장성 확보 (department, menu, role 등 추가 가능)
2025-12-02 15:49:31 +09:00
aabd791336 docs: 메뉴 동기화 시스템 상세 설계 추가
- 동기화 상태 분류 (new, up_to_date, updatable, customized, deleted)
- 동기화 액션 유형 (개별, 신규 가져오기, 기존 업데이트, 선택 동기화)
- 커스터마이징 메뉴 보호 정책 (force 옵션)
- 동기화 전용 API 스펙 4개 엔드포인트
- MenuSyncService 메서드 설계
- MNG 동기화 센터 UI 와이어프레임
2025-12-02 09:38:15 +09:00
95ae0234c8 feat: 사용자 must_change_password 컬럼 추가
- users 테이블에 must_change_password 컬럼 추가 (boolean, default: false)
- 신규 사용자 생성/비밀번호 초기화 시 강제 비밀번호 변경 기능 지원

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 23:44:45 +09:00
e73141faf5 docs: CURRENT_WORKS.md 업데이트 - 메뉴 통합관리 시스템 설계 작업 추가 2025-12-01 16:17:13 +09:00
d7fdfa841e docs: 메뉴 통합관리 시스템 설계서 및 SQL 쿼리 추가
- MENU_INTEGRATION_SYSTEM_DESIGN.md: 글로벌-테넌트 메뉴 연결 시스템 설계
  - global_menu_id, is_customized 컬럼 추가 계획
  - API 엔드포인트 설계 (글로벌/테넌트 메뉴 관리)
  - MNG 화면 설계 (복제, 동기화 기능)
  - 구현 Phase 1~4 계획

- MENU_INSERT_QUERIES.sql: PDF 기획서 기반 신규 메뉴 23개 INSERT 쿼리
  - 인사관리 (근태/휴가/급여)
  - 전자결재 (기안함/결재함/참조함)
  - 게시판, 보고서, 계정정보, 회사정보, 구독관리, 결제내역, 고객센터
  - 기준정보 관리 하위 8개 메뉴
2025-12-01 16:16:07 +09:00
0ea8c719d7 feat: [items] 품목 생성/조회 개선
- 중복 코드 자동 증가 기능 추가 (P-001 → P-002, ABC → ABC-001)
- soft delete 항목 조회 파라미터 추가 (include_deleted)
- ValidationException 응답 포맷 수정 (공통 에러 형식)
- batch delete 라우트 순서 수정 (/{id} 보다 /batch 먼저)
- is_active 기본값 true 설정
2025-12-01 14:22:50 +09:00