- Process P-004 options에 is_auxiliary 플래그 도입
- WO 생성 시 Process의 is_auxiliary를 WO options에 자동 복사
- ProductionOrderService: 보조 공정 WO를 공정 진행 현황에서 제외
- WorkOrderService: 보조 공정 WO의 상태 변경이 수주 상태에 영향 주지 않도록 처리
- syncOrderStatus(): 보조 공정이면 스킵
- autoStartWorkOrderOnMaterialInput(): WO는 진행중 전환하되 수주 상태는 유지
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- PrefixResolver: 제품코드×마감재질→LOT prefix 결정 + BD-XX-NN 코드 생성
- DynamicBomEntry DTO: dynamic_bom JSON 항목 타입 안전 관리
- BendingInfoBuilder 확장: build() 리턴 변경 + buildDynamicBomForItem() 추가
- OrderService: 작업지시 생성 시 per-item dynamic_bom 자동 저장
- WorkOrderService.getMaterials(): dynamic_bom 우선 체크 + N+1 배치 최적화
- WorkOrderService.registerMaterialInput(): work_order_item_id 분기 라우팅 통일
- 단위 테스트 58개 + 통합 테스트 6개 (64 tests / 293 assertions)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- OrderService: checkBendingStockForOrder() 메서드 추가
- order_items에서 item_category='BENDING'인 품목 추출
- 각 품목의 가용재고/부족수량 계산 후 반환
- OrderController: checkBendingStock() 엔드포인트 추가
- Route: GET /api/v1/orders/{id}/bending-stock
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- bulkDestroy force=true일 때 상태 체크 bypass, 연관 작업지시 데이터 모두 삭제
- forceDeleteWorkOrders() 헬퍼: 자재투입 재고복구, 문서, 부속데이터 정리 후 hard delete
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- loadDetailRelations() 공통 메서드 추가 (show()와 동일한 relations 보장)
- store/update/updateStatus/createFromQuote/revert 등 11곳 일괄 적용
- 수주확정/되돌리기 시 제품내용이 기타부품으로 매핑되던 문제 해결
- 원인: updateStatus 등에서 quote relation 미로딩 → products 빈 배열
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 수주 일괄 삭제 API 추가 (DELETE /orders/bulk)
- OrderBulkDeleteRequest (ids, force 검증)
- force=true: hard delete (운영환경 차단), force=false: soft delete
- 삭제 불가 건(상태/작업지시/출하) skip 처리 + skipped_ids 반환
- 작업지시 되돌리기 force/운영 모드 분기
- force=true (개발): 기존 hard delete 로직 유지
- force=false (운영): 작업지시 cancelled 상태 변경, options에 취소정보 기록, 자재 투입분 재고 역분개, 데이터 보존
- reason 필수 (운영 모드)
- WorkOrder 모델에 STATUS_CANCELLED 상수 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Quote 모델에 getStatusAttribute() accessor 추가: order_id 존재 시 자동으로 'converted' 반환
- scopeConverted() → whereNotNull('order_id') 변경
- QuoteService/OrderService에서 status='converted' 직접 세팅 제거, order_id만 세팅
- 상태 필터 쿼리: converted는 order_id IS NOT NULL 기반
- 통계 쿼리: status='converted' → order_id IS NOT NULL
- 수주 직접 등록 시에도 자동으로 수주전환 상태 반영
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- KyungdongFormulaHandler: joint_bar_qty 미전달 시 자동 계산
공식: (2 + floor((제작가로 - 500) / 1000)) × 셔터수량
- OrderService.extractSlatInfoFromBom(): 동일 폴백 추가
- OrderService.createWorkOrders(): slat_info.joint_bar 0일 때 width 기반 계산
- CURRENT_WORKS.md 업데이트
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- OrderService.createFromQuote: BOM 결과에서 slat_info(조인트바/방화유리 수량) 추출하여 OrderNode.options에 저장
- OrderService.createWorkOrders: nodeOptions에 slat_info 없을 때 bom_result에서 fallback 추출
- OrderService.syncFromQuote: 동일하게 slat_info 추출 추가
- WorkOrderService: salesOrder eager loading에 client_contact, options 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- CreateProductionOrderRequest에 assignee_ids 배열 validation 추가
- OrderService::createProductionOrder에 work_order_assignees 저장 로직 추가
- 담당자 유무에 따른 status 분기 (pending/unassigned) 적용
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 삭제 불가 상태 추가 (생산중/생산완료/출하중/출하완료)
- 작업지시/출하 존재 시 삭제 차단 + 에러 메시지
- order_item_components → order_items → order_nodes → order 순차 soft delete
- DB 트랜잭션으로 원자성 보장
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- numbering_rules 테이블: JSON 패턴 기반 채번 규칙 저장 (tenant별)
- numbering_sequences 테이블: MySQL UPSERT 기반 atomic 시퀀스 관리
- NumberingService: generate/preview/nextSequence 핵심 서비스
- QuoteNumberService: NumberingService 우선, 폴백 QT{YYYYMMDD}{NNNN}
- OrderService: NumberingService 우선 (pair_code 지원), 폴백 ORD{YYYYMMDD}{NNNN}
- StoreOrderRequest: pair_code 필드 추가
- NumberingRuleSeeder: tenant_id=287 견적(KD-PR)/수주(KD-{pairCode}) 규칙
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 견적확정 시 업체명/현장명/담당자/연락처 필수 검증 추가 (QuoteService)
- 작업지시 stats API에 by_process 공정별 카운트 반환 추가
- 작업지시 목록/상세 쿼리에 수주 개소(rootNodes) 연관 로딩
- 작업지시 품목에 sourceOrderItem.node 관계 추가
- 입고관리 완료건 수정 허용 및 재고 차이 조정
- work_order_step_progress 테이블 마이그레이션
- receivings 테이블 options 컬럼 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- convertToOrder: calculation_inputs.items[]로 OrderNode(location) 생성, order_items에 order_node_id 연결
- resolveLocationIndex() 헬퍼 추가 (formula_source/note 기반 개소 인덱스 매칭)
- syncFromQuote: 기존 nodes 삭제 후 재생성, 아이템 node 연결 동기화
- show(): rootNodes + withRecursiveChildren eager loading 추가
- createFromQuoteItem: order_node_id 매핑 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- OrderService: 생산지시 생성 로직 개선
- order_items.item_id → process_items 테이블에서 공정 자동 조회
- 공정별로 아이템 그룹화 (미지정 아이템은 별도 그룹)
- 각 공정별 작업지시 생성
- work_order_items에 해당 공정의 아이템들 자동 추가
- WorkOrderService: 목록 조회 시 관계 추가
- items 관계 추가 (틀수 계산용)
- process.department 필드 추가 (부서 표시용)
Co-Authored-By: Claude <noreply@anthropic.com>
- KyungdongFormulaHandler: 수식 계산 로직 리팩토링 및 확장
- OrderService: 수주 전환 시 BOM 품목 매핑 로직 추가
- QuoteService: 견적 상태 처리 개선
- FormulaEvaluatorService: 디버그 로깅 추가
- Quote 모델: 캐스팅 타입 수정
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 견적 참조 데이터(현장명, 부호) 조회 API 추가 (GET /quotes/reference-data)
- 수주 전환 시 floor_code/symbol_code를 quoteItem.note에서 파싱하도록 변경
- 수주 전환 시 note에 formula_category 저장
- 검사기준서 프리셋: standard + standard_criteria → text_with_criteria로 통합
- tolerance 컬럼 width 조정 (120px → 85px)
- LOGICAL_RELATIONSHIPS.md 문서 갱신
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- OrderService: client relation에 manager_name 추가
- Order 모델: shipping_cost_label accessor 추가 (common_codes 조회)
- $appends에 shipping_cost_label 추가
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- TenantSetting CRUD API 추가
- Calendar, Entertainment, VAT 서비스 개선
- 5130 BOM 계산 로직 수정
- quote_items에 item_type 컬럼 추가
- tenant_settings 테이블 마이그레이션
- Swagger 문서 업데이트
- updateStatus 메서드에서 CONFIRMED 전환 시 매출 자동 생성
- sales_recognition = 'on_order_confirm' 설정된 수주만 해당
- createSaleFromOrder() 메서드 추가 (수주→매출 변환)
- generateSaleNumber() 메서드 추가 (SAL-YYYYMM-NNNN 형식)
- 생성된 매출은 order.sale_id에 자동 연결
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- revertOrderConfirmation 메서드에 매출 연동 해지 로직 추가
- 수주확정 시 생성된 매출(source_type=order_confirm, status=draft)만 삭제
- 이미 확정된 매출은 연결만 해지하고 삭제하지 않음
- DB 트랜잭션으로 원자성 보장
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- FormRequest에 options 필드 validation 추가 (StoreOrderRequest, UpdateOrderRequest)
- shipping_cost_code, receiver, receiver_contact, shipping_address 등
- OrderService.show()에서 client 로드 시 manager_name 필드 추가
- 수주확정/생산지시 되돌리기 기능 추가 (revertOrderConfirmation, revertProductionOrder)
- 견적 calculation_inputs 포함하여 로드
Co-Authored-By: Claude <noreply@anthropic.com>
- QuoteIndexRequest: for_order 파라미터 추가
- Quote 모델: orders() HasMany 관계 추가 (Order.quote_id 기준)
- QuoteService: for_order 필터링 로직 추가
- whereNull('order_id') - 빠른 체크
- whereDoesntHave('orders') - 이중 체크
- OrderService: 수주 생성 시 견적 상태를 converted로 업데이트
Co-Authored-By: Claude <noreply@anthropic.com>
- WorkOrder 모델에 process_id 추가
- process 관계 추가 (Process 모델)
- 공정별 다중 작업지시 생성 지원
- WorkOrderStoreRequest/UpdateRequest 수정
Co-Authored-By: Claude <noreply@anthropic.com>
- 견적→수주 변환 API (POST /orders/from-quote/{quoteId})
- 생산지시 생성 API (POST /orders/{id}/production-order)
- FormRequest 검증 클래스 추가
- 중복 생성 방지 및 상태 검증 로직
Co-Authored-By: Claude <noreply@anthropic.com>
- OrderService 구현 (index, stats, show, store, update, destroy, updateStatus)
- OrderController 구현 (7개 API 엔드포인트)
- FormRequest 클래스 3개 생성 (Store, Update, UpdateStatus)
- 상태 전환 규칙 검증 (DRAFT → CONFIRMED → IN_PROGRESS → COMPLETED/CANCELLED)
- 수주번호 자동 생성 (ORD{YYYYMMDD}{0001} 형식)
- Swagger API 문서 작성 (OrderApi.php)
- i18n 메시지 키 추가 (ko/en)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>