부분 취소
부분 취소는 주문 전체가 아니라 특정 상품이나 일부 수량만 취소하는 처리다. 전체 취소보다 구현 난이도가 높은 이유는 주문 헤더, 주문 라인, 결제 금액, 배송비, 쿠폰, 재고 예약, 출고 요청이 모두 부분적으로 바뀌기 때문이다.
전체 취소와 부분 취소의 차이
| 구분 | 전체 취소 | 부분 취소 |
|---|---|---|
| 대상 | 주문 전체 | 주문 라인 또는 수량 일부 |
| 주문 헤더 상태 | CANCELED | PARTIALLY_CANCELED 가능 |
| 주문 라인 상태 | 전체 취소 | 라인별 상태 필요 |
| 금액 처리 | 전액 취소 | 상품/할인/배송비 재계산 |
| 출고 처리 | 출고 전체 취소 | 일부 라인만 취소 또는 수량 조정 |
실무 팁
부분 취소를 지원하려면 주문 헤더 상태만으로는 부족하다. 주문 상세 라인별 상태와 수량 컬럼을 반드시 분 리해야 한다.
실제 업무 흐름
주문 header/detail 구조
부분 취소는 라인 단위 상태가 핵심이다.
| 테이블 | 주요 컬럼 | 설명 |
|---|---|---|
orders | order_status, total_amount, canceled_amount | 주문 헤더 |
order_lines | ordered_qty, canceled_qty, shipped_qty, line_status | 상품별 상세 |
order_line_amounts | product_amount, discount_amount, refund_amount | 라인별 금액 |
stock_reservations | reserved_qty, released_qty | 예약 재고 |
예를 들어 상품 3개 중 1개만 취소하면 주문 헤더는 PARTIALLY_CANCELED, 해당 라인은 PARTIALLY_CANCELED가 될 수 있다. 남은 2개는 출고가 계속 진행된다.
금액 재계산
부분 취소에서는 단순히 상품 금액만 빼면 안 된다.
| 항목 | 확인 포인트 |
|---|---|
| 상품 금액 | 취소 수량만큼 환불 |
| 쿠폰/포인트 | 전체 주문 할인인지 라인 할인인지 구분 |
| 배송비 | 무료배송 조건이 깨지는지 확인 |
| 결제 수단 | 카드 부분 취소 가능 여부 확인 |
| 정산 금액 | 매출, 수수료, 배송비 정산 영향 반영 |
출고 일부 취소
출고 요청 후 부분 취소가 들어오면 WMS 상태를 확인해야 한다.
피킹 전이면 출고 라인 수량을 줄일 수 있다. 이미 피킹된 상품이 있다면 작업자 회수, 검수 보류, 재피킹 같은 운영 절차가 필요하다.
API 예시
POST /api/orders/ORD-1001/partial-cancel
Content-Type: application/json
{
"reasonCode": "CUSTOMER_REQUEST",
"lines": [
{"orderLineId": 10, "cancelQty": 1}
],
"idempotencyKey": "mall-ord-1001-cancel-1"
}
실무에서 어려운 케이스
- 묶음 할인 상품 중 일부만 취소하는 경우
- 무료배송 조건이 깨져 배송비를 다시 부과해야 하는 경우
- 이미 일부 상품은 출고되고 일부 상품만 취소되는 경우
- 외부몰이 부분 취소를 지원하지 않아 전체 취소 후 재주문으로 처리해야 하는 경우
- 쿠폰, 포인트, 카드 결제 취소 순서가 꼬이는 경우