# 데이터 모델

비즈니스의 도메인 모델: 엔터티, 필드, 관계. 외부에 보이는 필드만 나열합니다. 기계용 JSON-LD는 `/ontology`에 있습니다.

## 관계

| | | | |
| --- | --- | --- | --- |
| `Product` | hasMany | `Sku` | 스타일은 여러 색상/사이즈 변형을 가짐 |
| `Sku` | hasStockIn | `Warehouse` | SKU 는 각 창고에 재고(Stock)가 있음 |
| `Stock` | refersTo | `Sku` | 재고 행은 SKU 하나를 가리킴 |
| `Stock` | belongsTo | `Warehouse` | 재고 행마다 warehouse_code 포함 |
| `Channel` | hasAccessTo | `Warehouse` | 채널이 접근 가능한 창고(허용 목록) |
| `Channel` | hasPriceFor | `Product` | 채널의 스타일별 전용 가격(Price) |
| `Order` | belongsTo | `Channel` | 주문은 채널에 속함(소유권 확인) |
| `DropshipOrder` | belongsTo | `Channel` | 드롭쉬핑 주문은 채널에 속함 |
| `Shipment` | belongsTo | `Channel` | 출고는 채널에 속함 |
| `Shipment` | belongsTo | `Order` | 출고는 도매 주문(order_id)에서 나옴 |
| `StockReservation` | belongsTo | `Order` | 예약은 도매 주문(order_id)에서 나옴; 주문 승인 시 예약 생성, 출고 시 출고 생성 |
| `StockReservation` | belongsTo | `Channel` | 예약은 채널에 속함 |
| `Cart` | belongsTo | `Channel` | 장바구니(계정 경유)는 채널에 속함 |
| `Transaction` | belongsTo | `Channel` | 거래 한 건은 하나의 채널 계정에 기록됩니다 |
| `Transaction` | refersTo | `Order` | 대부분의 거래는 주문 번호와 예약 번호를 함께 가집니다 |

## Product (상품(스타일))

스타일 코드 하나, 여러 색상/사이즈 변형(SKU)을 포함.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `product_code` | string | 스타일 코드 |
| `product_name` | string | 상품명(영문) |
| `product_name_zh` | string | 상품명(중문; 값이 있을 때만, 아직 미연동) |
| `brand` | string | 브랜드 |
| `price_wholesale` | number | 도매가 |
| `price_retail` | number | 소매가 |
| `currency` | string | 통화(AUD / CNY) |
| `weight_grams` | integer | 중량(g; 값이 있을 때만, 아직 미연동) |
| `image_urls` | array | 상품 이미지 URL 목록 |
| `description` | string | 사양 설명 |
| `skus` | array | 이 스타일의 모든 변형(Sku) |

## Sku (SKU(바코드/변형))

바코드 하나 = 스타일 × 색상 × 사이즈.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `sku` | string | SKU / 바코드 |
| `product_code` | string | 소속 스타일 코드 |
| `color_code` | string | 색상 코드 |
| `color_name` | string | 색상명 |
| `color_name_zh` | string | 색상명(중문; 값이 있을 때만, 아직 미연동) |
| `size` | string | 사이즈 |

## Warehouse (창고)

재고가 있는 곳. warehouse_code 가 경로·파라미터·응답에서 쓰는 유일한 식별자: AU = 호주 (전체 창고 합계) (100003); AUSYD2 = 시드니 메인 창고 (Rosehill) (AUSYD2); AUSYD1 = 시드니 액세서리 창고 (AUSYD1); CN = 중국 (전체 창고 합계) (500001); CHNZJ1 = 중국 전장 창고 (CHNZJ1)

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `warehouse_code` | string | 창고 코드: AU / AUSYD2 / AUSYD1 / CN / CHNZJ1 |
| `name` | string | 창고 이름(영문) |
| `name_zh` | string | 창고 이름(중문) |
| `country` | string | 국가(AU / CN) |
| `company_code` | string | 소속 회사 코드(100003 호주 / 500001 중국) |
| `type` | string | group = 회사 단위 합계 뷰; physical = 실물 창고 |
| `can_ship` | boolean | 직접 출고 가능 여부 |
| `currency` | string | 통화 |

## Stock (재고)

한 창고의 한 SKU 실시간 재고(가격 스냅샷 포함). 창고 전체·스타일별·SKU별·증분 조회 모두 이 형태를 반환.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `warehouse_code` | string | 창고(모든 행에 포함) |
| `sku` | string | SKU |
| `product_code` | string | 스타일 코드 |
| `product_name` | string | 상품명 |
| `color_code` | string | 색상 코드 |
| `color_name` | string | 색상 |
| `size` | string | 사이즈 |
| `brand` | string | 브랜드 |
| `quantity_on_hand` | integer | 보유 수량 |
| `quantity_available` | integer | 가용 수량(보유 − 예약) |
| `price_wholesale` | number | 도매가 |
| `price_retail` | number | 소매가 |
| `currency` | string | 통화 |
| `expected_arrival_date` | string | 입고 예정일(운송 중일 때만) |
| `quantity_incoming` | integer | 운송 중 수량(운송 중일 때만) |

## Channel (채널(고객))

도매 고객. 토큰에 채널 코드가 담기며, 호출 가능 범위는 역할과 창고 허용 목록으로 정해집니다.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `channel_code` | string | 채널 코드(고객 식별자) |
| `region` | string | 기본 지역 au / cn |
| `roles` | array | 역할({ROLES}) |

## Price (채널 가격)

한 채널의 한 스타일 가격(채널별; 재고 행의 단일 가격이 아님).

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `warehouse_code` | string | 창고 |
| `channel_code` | string | 채널 |
| `product_code` | string | 스타일 코드 |
| `price_wholesale` | number | 이 채널의 도매가 |
| `price_retail` | number | 소매가 |
| `price_settlement` | number | 정산가 |

## Order (도매 주문)

도매 주문과 조회; 한 채널에 속함. 주문 시 보낸 형태 그대로 조회됩니다.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `order_id` | string | 주문번호 |
| `warehouse_code` | string | 창고 |
| `lines` | array | 명세 [{sku, quantity}] |
| `status` | string | 상태: draft / confirmed / cancelled |
| `status_raw` | integer | 상태 원본 코드 |
| `created_date` | string | 전표 일자 |
| `note` | string | 비고 |
| `channel_code` | string | 소속 채널(소유권 확인: 본인 것만 조회) |

## DropshipOrder (드롭쉬핑 주문)

드롭쉬핑 주문과 조회; 한 채널에 속하며 수취인을 포함. 주문당 SKU 하나.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `dropship_order_id` | string | 드롭쉬핑 주문번호 |
| `serial_number` | string | 일련번호 |
| `client_order_number` | string | 내 시스템 주문번호 |
| `warehouse_code` | string | 창고 |
| `sku` | string | SKU |
| `quantity` | integer | 수량 |
| `quantity_allocated` | integer | 배정 수량 |
| `quantity_shipped` | integer | 출고 수량 |
| `recipient` | object | 수취인 {name, phone, address, country_code, state, city, postal_code} |
| `sender` | object | 발송인 {name, phone} |
| `shipping_method` | string | 배송 방식 normal / express / ems |
| `carrier` | string | 운송사 |
| `tracking_number` | string | 운송장 번호 |
| `shipped` | boolean | 출고 여부 |
| `shipped_date` | string | 출고일 |
| `status` | string | 상태: pending / shipped / intercepted / cancelled |
| `status_raw` | integer | 상태 원본 코드 |
| `paid` | boolean | 결제 여부 |
| `price_settlement` | number | 정산가 |
| `amount_shipping` | number | 배송비 |
| `channel_code` | string | 소속 채널 |

## Shipment (출고)

출고 건; 한 채널에 속하며 배송 추적이 그 아래에 있음.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `shipment_id` | string | 출고번호 |
| `order_id` | string | 원천 도매 주문번호 |
| `reservation_id` | string | 원천 예약번호 |
| `warehouse_code` | string | 창고 |
| `status` | string | 상태: shipped |
| `tracking_number` | string | 운송장 번호 |
| `lines` | array | 명세 |
| `channel_code` | string | 소속 채널 |

## StockReservation (재고 예약)

채널을 위해 잠근 재고; 해당 채널에 속함.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `reservation_id` | string | 예약번호 |
| `order_id` | string | 원천 도매 주문번호 |
| `warehouse_code` | string | 창고 |
| `status` | string | 상태: reserved / cancelled / confirmed |
| `shipped` | boolean | 출고 여부 |
| `lines` | array | 명세 [{sku, quantity}] |
| `channel_code` | string | 소속 채널 |

## Cart (장바구니)

OMS 계정 단위 장바구니(계정은 채널에 속함).

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `account` | string | OMS 계정 |
| `lines` | array | 항목 [{sku, quantity}] |
| `channel_code` | string | 소속 채널 |

## Transaction (계정 거래 내역)

채널 계정의 자금 변동 한 건: 충전 · 결제 · 환불. 잔액은 이들의 누계입니다.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `transaction_id` | string | 거래 번호 (14 자리 숫자 — 대행 발송 일련번호와 형태가 같아 번호 식별 시 후보를 제시하고 추측하지 않습니다) |
| `transaction_type` | string | 유형: recharge 충전 / payment 결제 / refund 환불 |
| `amount` | number | 금액 (부호는 유형에 따름) |
| `currency` | string | 통화 |
| `balance_after` | number | 이 건 이후의 잔액 — 잔액 사슬은 처음과 끝을 대조해 검증할 수 있습니다 |
| `order_id` | string | 연결된 주문 번호 (있을 때만 반환) |
| `reservation_id` | string | 연결된 예약 번호 (있을 때만 반환) |
| `created_at` | string | 상위 시스템이 처리한 시각 — 실제 발생 시각이 아닙니다: 소급 입력분은 입력한 날짜에 표시됩니다 |
| `channel_code` | string | 소유 채널 (소유권 검증용: 본인 것만 조회 가능) |

```bash
curl "https://connect.everugg.net.au/ontology" -H "Accept: application/ld+json"
curl "https://connect.everugg.net.au/ontology?format=plain"
```

`/ontology`는 기본으로 JSON-LD(W3C 표준)를, `?format=plain`은 일반 JSON을, `?format=rdf`는 N-Quads를 반환합니다.

---
Markdown 원본: https://connect.everugg.net.au/reference/ontology.md?lang=ko · 웹 페이지: https://connect.everugg.net.au/reference?sec=ontology&lang=ko
