┌────────────────────────┐
│ Filament Admin │ ← UI 계층
│ (Resources / Pages) │
└───────────┬────────────┘
│
┌───────────▼────────────┐
│ Laravel Routes │ ← 라우팅
│ (web.php / api.php) │
└───────────┬────────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
┌─────────▼──────────┐ ┌──────▼───────┐ ┌───────────▼──────────┐
│ Filament Resource │ │ API Controller│ │ PlanController │
│ (Admin CRUD) │ │ (REST API) │ │ (문서 허브) │
└─────────┬──────────┘ └──────┬───────┘ └──────────────────────┘
│ │
└─────────┬───────────┘
│
┌─────────▼──────────┐
│ Domain Services │ ← 비즈니스 로직
│ (InventoryService │
│ OrderService │
│ PurchaseService) │
└─────────┬──────────┘
│
┌─────────▼──────────┐
│ Domain Models │ ← 데이터 계층
│ (Eloquent ORM) │
└─────────┬──────────┘
│
┌─────────▼──────────┐
│ MariaDB │ ← 저장소
└────────────────────┘
app/
├── Domains/ ← DDD 도메인 계층
│ ├── Product/
│ │ ├── Models/ (Product, ProductMapping)
│ │ ├── Imports/ (ProductImport)
│ │ └── Policies/ (ProductPolicy)
│ ├── Inventory/
│ │ ├── Enums/ (StockLogType, StockTakeStatus)
│ │ ├── Models/ (Inventory, InventoryAllocation, StockLog, StockTake*)
│ │ ├── Services/ (InventoryService, InventoryAnalysisService, SafetyStockService)
│ │ ├── Imports/ (InventoryImport)
│ │ └── Policies/ (InventoryPolicy, InventoryAllocationPolicy, StockTakePolicy)
│ ├── Order/
│ │ ├── Enums/ (OrderStatus, ReturnRequestStatus)
│ │ ├── Models/ (Order, OrderItem, ReturnRequest)
│ │ ├── Services/ (OrderService)
│ │ ├── Imports/ (OrderImport, OrderInvoiceImport, ShipmentImport)
│ │ └── Policies/ (OrderPolicy, ReturnRequestPolicy)
│ ├── Purchasing/
│ │ ├── Enums/ (PurchaseOrderStatus)
│ │ ├── Models/ (PurchaseOrder, PurchaseOrderItem, Supplier)
│ │ ├── Services/ (PurchaseService)
│ │ └── Policies/ (PurchaseOrderPolicy, SupplierPolicy)
│ └── SalesChannel/
│ ├── Models/ (SalesChannel)
│ └── Policies/ (SalesChannelPolicy)
│
├── Exports/ ← 엑셀 내보내기 (Sample Templates)
├── Filament/ ← Filament Admin Panel
│ └── Resources/ (15개 Resource — 아래 참조)
├── Http/
│ ├── Controllers/
│ │ ├── Api/V1/ (InventoryController, OrderController)
│ │ └── PlanController.php (문서 허브)
│ ├── Middleware/ (AuthenticateApiKey)
│ ├── Requests/ (StoreOrderRequest 등)
│ └── Resources/ (API Resource 변환기)
├── Jobs/ ← Queue 작업
├── Models/ ← 공통 모델 (CommonCode, Setting, User)
├── Policies/ ← 공통 정책
└── Providers/ ← 서비스 프로바이더
| Resource | 도메인 | 핵심 기능 |
|---|---|---|
| ProductResource | Product | 상품 CRUD + 공통코드 연결 + SKU 매핑 |
| SalesChannelResource | SalesChannel | 채널 관리 + API Key |
| InventoryResource | Inventory | 재고 조회 + 입/출/조정 액션 |
| AllocationResource | Inventory | 채널별 재고 할당 |
| InboundResource | Inventory | 입고 관리 |
| StockLogResource | Inventory | 입출고 이력 조회 |
| StockTakeResource | Inventory | 재고 실사 |
| AssetValueResource | Inventory | 재고 자산 가치 |
| MovementSummaryResource | Inventory | 입출고 요약 |
| OrderResource | Order | 주문 관리 + 상태 탭 + Excel Import |
| ReturnRequestResource | Order | 반품 관리 |
| PurchaseOrderResource | Purchasing | 구매 발주 관리 |
| SupplierResource | Purchasing | 공급업체 관리 |
| CommonCodeResource | System | 공통코드 (브랜드/카테고리/색상/단위) |
| UserResource | System | 사용자 관리 |
재고 변동의 중심 서비스. 모든 재고 관련 작업은 DB 트랜잭션 + Stock Log 기록.
inbound() — 입고 처리 (quantity 증가 + IN 로그)outbound() — 출고 처리 (quantity 감소 + OUT 로그)adjust() — 수량 조정 (ADJUST 로그)allocate() — 채널 할당 (ALLOCATE 로그)주문 상태 전이를 관리. OrderStatus Enum 사용:
Unpaid (0): 입금전Paid (1): 입금완료Preparing (2): 상품준비ReadyToShip (9): 발송준비Shipped (3): 발송완료Cancelled (88): 취소모든 상태값은
App\Domains\Order\Enums\OrderStatusEnum으로 관리됩니다.
구매 발주 라이프사이클 관리.
Draft → Ordered → Received → (또는 Cancelled)received_qty 업데이트 + Inventory 연동안전재고 자동 계산 + 발주점 알림.
calculateAndApply() — Z-Score 기반 안전재고 자동 계산checkReorderPoints() — 부족 재고 → Filament 알림 전송UpdateSafetyStockJob → 매일 02:00 자동 실행spatie/laravel-activitylog 기반 변경 이력 자동 추적.
logAll(), logOnlyDirty() — 변경된 필드만 기록routes/api.php
└── prefix('v1') + middleware(AuthenticateApiKey)
├── GET /inventory → InventoryController@index
├── GET /inventory/{sku} → InventoryController@show
└── POST /orders → OrderController@store
인증 흐름:
X-Api-Key 헤더 확인sales_channels 테이블에서 api_key 매칭SalesChannel 객체를 $request->attributes에 주입Model::query() 사용 (DB:: 금지)casts() 메서드 사용bootstrap/app.php에서 선언적 등록--dirty 옵션)@theme config)