기존 Supplier(공급사) 모델 중심의 구조를 Partner(거래처) 통합 모델로 개편합니다.
이 과정에서 내부적으로 공급사(SUPPLIER)와 고객사(CUSTOMER)를 type으로 구분하여 관리하고, '거래처 관리' 메뉴 하위에 공급사 | 고객사 탭을 두어 별도의 페이지처럼 작동하도록 구성합니다.
또한 사용자가 요청하신 비밀번호(로그인용) 항목 추가와 주소(기본주소, 나머지주소) 분리를 반영합니다.
partners 테이블 생성:
type (enum: 'SUPPLIER', 'CUSTOMER') - 공급사/고객사 구분name (string) - 거래처명contact_name (string, nullable) - 담당자명password (string, nullable) - 로그인용 비밀번호 (해시 암호화 처리)email (string, nullable) - 이메일phone (string, nullable) - 전화번호address (string, nullable) - 기본주소address_detail (string, nullable) - 나머지 주소is_active (boolean, default true)suppliers 테이블의 데이터를 partners 로 복제 (단, type은 'SUPPLIER'로 지정)purchase_orders 등):
purchase_orders) 테이블 등이 참조하던 supplier_id 컬럼을 partner_id 로 이름 변경 및 외래키 재설정suppliers 테이블 및 제약조건 삭제App\Domains\Purchasing\Models\Partner 모델 생성:
hashed 적용 고려)App\Domains\Purchasing\Models\Supplier 모델 및 팩토리 삭제PurchaseOrder 모델:
supplier_id 매핑 로직을 partner_id 와 partner() 릴레이션으로 변경PartnerResource 생성:
ListPartners 페이지에 getTabs() 메소드를 적용하여 '공급사', '고객사' 탭으로 분리SupplierResource 전체 삭제 (기존 컨트롤러 및 파일 정리)PurchaseOrderTest, InboundHistoryTest, ScenarioTestSeeder 등 Supplier를 참조하던 기존 테스트/시더 코드를 Partner 구조에 맞추어 partner_id 형식으로 리팩터링 및 통과 확인.php artisan test --compact) 실행하여 기존 발주(Purchase Order) 및 입고 이력에서 Supplier를 Partner로 완전히 교체 후 문제가 없는지 검증합니다.환경 설정 > 거래처 관리 메뉴 접근향후 상품 정보 대폭 수정 시 반영될 **[채널별 재고 할당 및 예약 주문 고도화]**에 대한 아키텍처 초안.
✔️ 현행 할당(/admin/allocations) 시스템의 한계점 분석
현재 시스템의 InventoryAllocation은 특정 위치(Warehouse)의 물리적 재고(Inventory) 레코드에 1:1로 결합된 allocated_qty(할당량) 방식을 띄고 있습니다.
이는 오프라인 창고 이동이나 재고 차감 시 락(Lock) 경합을 유발하고 수불 기록이 남지 않아 오류 추적이 불가능한 구조입니다.
따라서 기존의 복잡한 물리재고 종속형 누적 할당량을 완전히 폐기하고, 은행 통장 잔고(Running Balance) 모델과 수불부(Audit Trail) 개념을 도입하여 '일반 할당 재고(stock)'와 '예약 할당 재고(preorder_stock)' 모두를 완벽한 무결성으로 보장하는 새로운 재고 관리를 구현합니다.
채널별 재고 할당 테이블(channel_stocks)에는 증감 과정의 복잡한 내역 없이 오직 2개의 '현재 잔액(Balance)' 필드만 유지하여 직관성을 극대화합니다.
stock (integer) : 일반 주문 가능 잔여량preorder_stock (integer) : 예약 주문(Backorder) 가능 잔여량사용자의 수기 조정, 주문에 의한 자동 차감, 취소에 의한 복구 등 **잔고가 변하는 모든 이벤트는 1원 단위까지 무조건 ChannelStockHistory 테이블에 기록(Insert Only)**됩니다.
stock > 0 : [바로 구매] 활성화stock = 0 && preorder_stock > 0 : [예약 구매] 활성화 (결제 및 상태 분리)stock = 0 && preorder_stock = 0 : [품절] 처리주문(Order) 테이블의 status나 플래그로 격리.이 구조는 **기록의 영구성(수불부)**과 **동시성 제어(LockForUpdate)**를 통해 다중 채널 쇼핑몰 동시 주문 폭주 상황에서도 '초과 판매(Overselling)' 및 데이터 꼬임을 원천 차단하는 가장 무결한 아키텍처로 기능하게 됩니다.