@sayren/store-sdk 0.55.1 → 0.56.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +334 -294
- package/dist/index.mjs +34 -15
- package/package.json +1 -1
- package/src/client.ts +14 -5
- package/src/schemas/claim.ts +8 -0
- package/src/schemas/commerce-flow.ts +10 -1
- package/src/schemas/order.ts +98 -3
- package/src/schemas/points.ts +2 -1
- package/src/schemas/webhook-event.ts +10 -2
package/dist/index.mjs
CHANGED
|
@@ -3867,7 +3867,8 @@ const approveClaimResultSchema = z$1.object({
|
|
|
3867
3867
|
couponChargeRefundAmount: z$1.number().int().optional().default(0).describe("환불액에 더한, 앞선 환불에서 뺀 쿠폰 차감을 되돌린 몫. 서버는 항상 싣는다"),
|
|
3868
3868
|
pointRefundAmount: z$1.number().int().optional().default(0).describe("돌려준 적립금 (원, #93) — 결제에 쓴 적립금 중 이번 취소·반품 수량의 몫이다. 현금 환불(`refundAmount`)과 별개다. 차감은 현금에서 먼저 빼고 모자란 몫만 여기서 뺀다. 적립금을 쓰지 않은 주문과 이 필드가 없는 이전 응답·이벤트는 0으로 읽는다"),
|
|
3869
3869
|
refundedAt: z$1.string(),
|
|
3870
|
-
refundHeld: z$1.boolean().optional().default(false).describe("결제 환불을 대기로 남겼다(`holdRefund`, #115). 결제 상세에서 환불 처리한다")
|
|
3870
|
+
refundHeld: z$1.boolean().optional().default(false).describe("결제 환불을 대기로 남겼다(`holdRefund`, #115). 결제 상세에서 환불 처리한다"),
|
|
3871
|
+
refundStatus: z$1.string().nullable().optional().default(null).describe("이번 취소의 결제 환불 원장 상태 — SUCCEEDED 환불됨 · FAILED 실패(결제 상세에서 다시 요청) · PROCESSING 결과 불명(PG 확인 필요) · HELD 환불 대기. 환불할 PG 결제가 없으면(금액 0·적립금 전액) null. 새 값이 추가될 수 있다")
|
|
3871
3872
|
});
|
|
3872
3873
|
//#endregion
|
|
3873
3874
|
//#region src/schemas/points.ts
|
|
@@ -4015,6 +4016,7 @@ const POINT_ENTRY_TYPES = [
|
|
|
4015
4016
|
"EARN_REVIEW",
|
|
4016
4017
|
"REVOKE_REVIEW",
|
|
4017
4018
|
"EARN_PURCHASE",
|
|
4019
|
+
"REVOKE_PURCHASE",
|
|
4018
4020
|
"USE_RESERVE",
|
|
4019
4021
|
"USE_RELEASE",
|
|
4020
4022
|
"REFUND_RESTORE",
|
|
@@ -4047,7 +4049,7 @@ const updatePointPolicyRequestSchema = strictRequest(z$1.object({
|
|
|
4047
4049
|
expiryDays: expiryDays.optional()
|
|
4048
4050
|
}));
|
|
4049
4051
|
/** 응답의 원장 유형 — 값이 추가될 수 있어 문자열로 받는다 */
|
|
4050
|
-
const responsePointEntryTypeSchema = z$1.union([z$1.enum(POINT_ENTRY_TYPES), z$1.string()]).describe("유형. `EARN_REVIEW` 리뷰 적립 · `REVOKE_REVIEW` 리뷰 삭제 회수 · `EARN_PURCHASE` 구매 적립 · `EXPIRE` 소멸 · `ADJUST` 셀러 지급·차감 · `OPENING` 기존 잔액 이전 · `USE_RESERVE` 결제 사용(결제 시작 때 빠짐) · `USE_RELEASE` 결제가 실패·만료되어 되돌림 · `REFUND_RESTORE` 취소·반품 환불로 반환 · `EARN_COUPON` 적립금 지급 쿠폰. 값이 추가될 수 있어 문자열로 받는다");
|
|
4052
|
+
const responsePointEntryTypeSchema = z$1.union([z$1.enum(POINT_ENTRY_TYPES), z$1.string()]).describe("유형. `EARN_REVIEW` 리뷰 적립 · `REVOKE_REVIEW` 리뷰 삭제 회수 · `EARN_PURCHASE` 구매 적립 · `REVOKE_PURCHASE` 판매자 취소의 구매 적립 회수 · `EXPIRE` 소멸 · `ADJUST` 셀러 지급·차감 · `OPENING` 기존 잔액 이전 · `USE_RESERVE` 결제 사용(결제 시작 때 빠짐) · `USE_RELEASE` 결제가 실패·만료되어 되돌림 · `REFUND_RESTORE` 취소·반품 환불로 반환 · `EARN_COUPON` 적립금 지급 쿠폰. 값이 추가될 수 있어 문자열로 받는다");
|
|
4051
4053
|
/** 원장 항목 — 셀러 조회용(사유·행위자 포함) */
|
|
4052
4054
|
const pointEntrySchema = z$1.object({
|
|
4053
4055
|
entryId: z$1.string(),
|
|
@@ -4987,12 +4989,13 @@ const orderCanceledWebhookEventDataSchema = z$1.object({
|
|
|
4987
4989
|
reason: z$1.string().describe("취소 사유 코드 — 판매자 취소 요청의 `reason`(`OUT_OF_STOCK`·`PRICE_ERROR`·`DELIVERY_IMPOSSIBLE`·`ETC`). 사유가 늘어날 수 있어 문자열이다. 모르는 값은 `ETC`처럼 다룬다"),
|
|
4988
4990
|
quantity: z$1.number().int().describe("이번에 취소한 수량"),
|
|
4989
4991
|
canceledQuantity: z$1.number().int().describe("취소 후 누적 취소 수량"),
|
|
4990
|
-
refundAmount: z$1.number().int().describe("환불액 (원). 수량 비율 상품 실결제 금액(쿠폰 배분을 뺀 금액) + 배송비 환불 − 조건부 무료배송 미달 차감 + 되돌린 쿠폰 차감(`couponChargeRefundAmount`)이다. 결제사 환불 결과는 결제 내역(`GET /v1/payments/{paymentId}`)으로 확인한다"),
|
|
4992
|
+
refundAmount: z$1.number().int().describe("환불액 (원). 수량 비율 상품 실결제 금액(쿠폰 배분을 뺀 금액) + 배송비 환불 − 조건부 무료배송 미달 차감 − 쿠폰 조건 미달 차감 + 되돌린 쿠폰 차감(`couponChargeRefundAmount`) − 추가 차감(`deductAmount`)이다. 결제사 환불 결과는 결제 내역(`GET /v1/payments/{paymentId}`)으로 확인한다"),
|
|
4991
4993
|
deliveryFeeRefundAmount: z$1.number().int().describe("환불액에 포함된 배송비 (원)"),
|
|
4992
4994
|
deliveryFeeChargeAmount: z$1.number().int().describe("환불액에서 뺀 배송비 (원) — 조건부 무료배송 기준 미달 차감"),
|
|
4993
|
-
couponChargeAmount: z$1.number().int().optional().default(0).describe("환불액에서 뺀 쿠폰 조건 미달 차감 (원). 판매자 취소는 차감하지 않으므로
|
|
4995
|
+
couponChargeAmount: z$1.number().int().optional().default(0).describe("환불액에서 뺀 쿠폰 조건 미달 차감 (원). 판매자 귀책 취소는 차감하지 않으므로 0이고, 구매자 귀책(`responsibility: BUYER`)이면 생길 수 있다. 이 필드가 없는 이전 이벤트는 0으로 읽는다"),
|
|
4994
4996
|
couponChargeRefundAmount: z$1.number().int().optional().default(0).describe("환불액에 더한 금액 (원) — 앞선 환불에서 뺀 쿠폰 조건 미달 차감을 되돌린 몫이다. 전량 취소면 누적 차감이 모두 되돌아간다. 이 필드가 없는 이전 이벤트는 0으로 읽는다"),
|
|
4995
4997
|
pointRefundAmount: z$1.number().int().optional().default(0).describe("돌려준 적립금 (원, #93) — 결제에 쓴 적립금 중 이번 취소·반품 수량의 몫이다. 현금 환불(`refundAmount`)과 별개다. 차감은 현금에서 먼저 빼고 모자란 몫만 여기서 뺀다. 적립금을 쓰지 않은 주문과 이 필드가 없는 이전 응답·이벤트는 0으로 읽는다"),
|
|
4998
|
+
deductAmount: z$1.number().int().optional().default(0).describe("환불액에서 뺀 추가 차감 (원, #301) — 판매자가 취소 요청에 넣은 `deductAmount`다. 배송비 차감과 따로 싣는다. 이 필드가 없는 이전 이벤트는 0으로 읽는다"),
|
|
4996
4999
|
currency: z$1.string().optional().describe("주문 통화(ISO 4217, 이슈 #130). 이 이벤트의 금액은 모두 이 통화의 최소 단위다. 외화 주문이 생기면 이 값을 확인한다. 이 필드가 없는 이전 이벤트는 KRW다"),
|
|
4997
5000
|
testPayment: z$1.boolean().describe("테스트 결제(샌드박스 결제) 주문인가. true면 실제로 돈이 오가지 않았다")
|
|
4998
5001
|
});
|
|
@@ -7214,13 +7217,14 @@ const orderItemFlowSchema = z$1.object({
|
|
|
7214
7217
|
key: z$1.string(),
|
|
7215
7218
|
label: z$1.string().describe("셀러용 상태 이름"),
|
|
7216
7219
|
coreStatus: orderItemStatusSchema.nullable()
|
|
7217
|
-
})).optional().describe("상태 직접 이동으로 옮길 수 있는 상태(셀러 보기). 흐름이 끝났으면 빈
|
|
7220
|
+
})).optional().describe("상태 직접 이동으로 옮길 수 있는 상태(셀러 보기). 흐름이 끝났으면 빈 배열. `coreStatus`가 `CANCELED`인 상태로 옮기면 판매자 취소와 같이 환불한다(#301)"),
|
|
7218
7221
|
branches: z$1.array(flowStateSchema).optional().describe("활성 위치가 둘 이상(병렬 가지·하위 흐름)이면 각 위치의 상태. `flowState`는 그 가운데 가장 앞 단계다")
|
|
7219
7222
|
});
|
|
7220
7223
|
/** 상태 직접 이동(#115) — 연결선을 지나지 않고 다른 상태로 옮긴다. 블록(재고·환불·송장)은 실행하지 않는다 */
|
|
7221
7224
|
const moveFlowStateRequestSchema = strictRequest(z$1.object({
|
|
7222
7225
|
to: z$1.string().min(1).describe("옮길 상태 키(`moveTargets[].key`)"),
|
|
7223
|
-
reason: z$1.string().trim().max(200).optional().describe("옮긴 사유(실행 기록에 남는다)")
|
|
7226
|
+
reason: z$1.string().trim().max(200).optional().describe("옮긴 사유(실행 기록에 남는다)"),
|
|
7227
|
+
restock: z$1.boolean().optional().describe("취소 상태(`moveTargets[].coreStatus` `CANCELED`)로 옮길 때 재고를 되돌리는가(#301). 취소 상태로 옮기면 판매자 취소와 같이 환불한다. 발송 전은 생략하면 true, 발송 뒤는 생략하면 400 `RESTOCK_REQUIRED`다. 다른 상태로 옮길 때는 무시한다")
|
|
7224
7228
|
}));
|
|
7225
7229
|
const flowRunStepSchema = z$1.object({
|
|
7226
7230
|
step: z$1.number().int(),
|
|
@@ -11181,8 +11185,10 @@ const shippingOrderItemSchema = orderItemSchema.extend({
|
|
|
11181
11185
|
delivery: deliveryInfoSchema.nullable().describe("발송 정보. 발송 전이면 null"),
|
|
11182
11186
|
flowStep: z$1.object({
|
|
11183
11187
|
key: z$1.string().describe("주문 흐름 안 단계 키(상점이 정한다). 화면 분기에 쓰지 않는다"),
|
|
11184
|
-
label: z$1.string().describe("셀러용 단계 이름")
|
|
11185
|
-
|
|
11188
|
+
label: z$1.string().describe("셀러용 단계 이름"),
|
|
11189
|
+
acceptsConfirm: z$1.boolean().optional().default(true).describe("이 단계가 발주 확인(`POST /v1/order-items/{orderItemId}/confirm`)을 받는가. 거짓이면 발주 확인은 409 `INVALID_STATUS`다. 연결선 조건식은 실행 때 다시 판정한다"),
|
|
11190
|
+
acceptsDispatch: z$1.boolean().optional().default(true).describe("이 단계가 발송(`POST /v1/order-items/{orderItemId}/dispatch`)을 받는가. 거짓이면 발송은 409 `INVALID_STATUS`다. 연결선 조건식은 실행 때 다시 판정한다")
|
|
11191
|
+
}).nullable().optional().default(null).describe("주문 흐름의 지금 단계(`GET /v1/order-items/{orderItemId}/flow`의 `flowState` 키·이름). 같은 상태라도 단계가 발송을 받지 않으면 발송은 409 `INVALID_STATUS`다(`acceptsConfirm`·`acceptsDispatch`). 흐름이 없으면 null. 서버는 항상 싣는다")
|
|
11186
11192
|
});
|
|
11187
11193
|
const shippingOrderItemPageSchema = pageSchema(shippingOrderItemSchema);
|
|
11188
11194
|
/**
|
|
@@ -11249,7 +11255,11 @@ const cancelBySellerRequestSchema = strictRequest(z$1.object({
|
|
|
11249
11255
|
]),
|
|
11250
11256
|
detail: z$1.string().max(500).optional(),
|
|
11251
11257
|
quantity: z$1.number().int().min(1).optional().describe("취소할 수량. 생략하면 남은 수량 전체다. 남은 수량보다 크면 400 `INVALID_QUANTITY`. 일부만 취소하면 주문상품은 상태를 유지한 채 `canceledQuantity`가 늘고, 전 수량이 소진되면 `CANCELED`가 된다"),
|
|
11252
|
-
holdRefund: z$1.boolean().optional().describe("true면 주문만 취소하고 결제 환불은 대기로 남긴다(#115). 정산·재고·적립금 반환은 그대로 하고, PG 환불은 결제 상세의 `POST /v1/payments/refunds/{refundId}/process`로 따로 한다. 생략하면 취소와 함께 환불한다")
|
|
11258
|
+
holdRefund: z$1.boolean().optional().describe("true면 주문만 취소하고 결제 환불은 대기로 남긴다(#115). 정산·재고·적립금 반환은 그대로 하고, PG 환불은 결제 상세의 `POST /v1/payments/refunds/{refundId}/process`로 따로 한다. 생략하면 취소와 함께 환불한다"),
|
|
11259
|
+
responsibility: z$1.enum(["SELLER", "BUYER"]).optional().describe("귀책(#301). 생략하면 `SELLER`다. `SELLER`면 배송비를 판매자가 부담하고(환불 정책 `sellerFaultFreeShipping`) 쿠폰 조건 미달 차감을 하지 않는다. `BUYER`면 클레임 승인의 구매자 귀책과 같은 규칙이다(발송 뒤에는 배송비를 돌려주지 않는다). 반품 배송비는 자동으로 빼지 않는다 — 필요하면 `deductAmount`로 뺀다"),
|
|
11260
|
+
deductAmount: z$1.number().int().min(0).optional().describe("환불액에서 뺄 추가 차감(#301, 원). 생략하면 0이다. 현금에서 먼저 빼고 모자란 몫만 돌려줄 적립금에서 뺀다. 환불 원장·`ORDER.CANCELED` 웹훅에 따로 남는다"),
|
|
11261
|
+
restock: z$1.boolean().optional().describe("재고를 되돌리는가(#301). 발송 전(결제완료·발주확인, 배송 없는 상품은 제공 완료까지)은 생략하면 true다. 그 뒤(발송·배송중·배송완료·구매확정)는 생략하면 400 `RESTOCK_REQUIRED`다 — 물건이 돌아왔는지는 판매자가 정한다"),
|
|
11262
|
+
reclaimPurchasePoints: z$1.boolean().optional().describe("구매확정 때 지급한 구매 적립금 중 이번 수량의 몫을 회수하는가(#301). 지급된 구매 적립금이 없으면 무시한다. 생략하면 회수하지 않는다. 회원 잔액이 모자라면 있는 만큼만 회수한다(리뷰 적립 회수와 같은 규칙)")
|
|
11253
11263
|
}));
|
|
11254
11264
|
/**
|
|
11255
11265
|
* 제공 처리 요청 (이슈 #48) — `POST /v1/order-items/{orderItemId}/fulfill`. 배송 없는 주문상품(`MANUAL`)을
|
|
@@ -11264,16 +11274,19 @@ const fulfillBulkRequestSchema = strictRequest(z$1.object({
|
|
|
11264
11274
|
/** `POST /v1/order-items/{orderItemId}/cancel` 응답 — 셀러 직권취소 환불 결과 */
|
|
11265
11275
|
const cancelBySellerResultSchema = z$1.object({
|
|
11266
11276
|
orderItemId: z$1.string(),
|
|
11267
|
-
refundAmount: z$1.number().int().describe("실제 환불한 금액 — 수량 비율 상품 실결제 금액(쿠폰 배분을 뺀 금액) + 배송비 환불 − 조건부 무료배송 미달 차감 + 되돌린 쿠폰 차감(`couponChargeRefundAmount`)"),
|
|
11277
|
+
refundAmount: z$1.number().int().describe("실제 환불한 금액 — 수량 비율 상품 실결제 금액(쿠폰 배분을 뺀 금액) + 배송비 환불 − 조건부 무료배송 미달 차감 − 쿠폰 조건 미달 차감 + 되돌린 쿠폰 차감(`couponChargeRefundAmount`) − 추가 차감(`deductAmount`)"),
|
|
11268
11278
|
quantity: z$1.number().int().describe("취소한 수량"),
|
|
11269
11279
|
canceledQuantity: z$1.number().int().describe("취소 후 누적 취소 수량"),
|
|
11270
11280
|
deliveryFeeRefundAmount: z$1.number().int().describe("환불에 포함된 배송비. 배송 묶음(같은 상품)이 모두 취소됐고 환불 정책이 켜져 있을 때만 0보다 크다"),
|
|
11271
11281
|
deliveryFeeChargeAmount: z$1.number().int().describe("조건부 무료배송 기준 미달로 환불액에서 뺀 배송비. 정책이 꺼져 있으면 항상 0이다"),
|
|
11272
|
-
couponChargeAmount: z$1.number().int().optional().default(0).describe("쿠폰 조건 미달 차감. 판매자 취소는 차감하지 않으므로
|
|
11282
|
+
couponChargeAmount: z$1.number().int().optional().default(0).describe("쿠폰 조건 미달 차감. 판매자 귀책 취소는 차감하지 않으므로 0이고, 구매자 귀책(`responsibility: BUYER`)이면 생길 수 있다. 서버는 항상 싣는다"),
|
|
11273
11283
|
couponChargeRefundAmount: z$1.number().int().optional().default(0).describe("환불액에 더한, 앞선 환불에서 뺀 쿠폰 차감을 되돌린 몫. 서버는 항상 싣는다"),
|
|
11274
11284
|
pointRefundAmount: z$1.number().int().optional().default(0).describe("돌려준 적립금 (원, #93) — 결제에 쓴 적립금 중 이번 취소·반품 수량의 몫이다. 현금 환불(`refundAmount`)과 별개다. 차감은 현금에서 먼저 빼고 모자란 몫만 여기서 뺀다. 적립금을 쓰지 않은 주문과 이 필드가 없는 이전 응답·이벤트는 0으로 읽는다"),
|
|
11275
11285
|
refundedAt: z$1.string().describe("환불을 요청한 시각. `refundHeld`면 취소 시각이고 환불은 아직 하지 않았다"),
|
|
11276
|
-
refundHeld: z$1.boolean().optional().default(false).describe("결제 환불을 대기로 남겼다(`holdRefund`). 결제 상세에서 환불 처리한다")
|
|
11286
|
+
refundHeld: z$1.boolean().optional().default(false).describe("결제 환불을 대기로 남겼다(`holdRefund`). 결제 상세에서 환불 처리한다"),
|
|
11287
|
+
refundStatus: z$1.string().nullable().optional().default(null).describe("이번 취소의 결제 환불 원장 상태 — SUCCEEDED 환불됨 · FAILED 실패(결제 상세에서 다시 요청) · PROCESSING 결과 불명(PG 확인 필요) · HELD 환불 대기. 환불할 PG 결제가 없으면(금액 0·적립금 전액) null. 새 값이 추가될 수 있다"),
|
|
11288
|
+
deductAmount: z$1.number().int().optional().default(0).describe("환불액에서 뺀 추가 차감(#301). 서버는 항상 싣는다"),
|
|
11289
|
+
purchasePointReclaimedAmount: z$1.number().int().optional().default(0).describe("회수한 구매 적립금(#301, `reclaimPurchasePoints`). 잔액이 모자라면 요청한 몫보다 작다. 서버는 항상 싣는다")
|
|
11277
11290
|
});
|
|
11278
11291
|
/**
|
|
11279
11292
|
* `GET /v1/order-items/{orderItemId}/cancel-preview` 응답(#115) — 판매자 취소를 하면 돌려줄 금액. 실제 취소와 같은 계산을
|
|
@@ -11285,7 +11298,10 @@ const sellerCancelPreviewSchema = z$1.object({
|
|
|
11285
11298
|
refundAmount: z$1.number().int().describe("현금 환불 예정 금액(배송비 환불·차감 포함)"),
|
|
11286
11299
|
pointRefundAmount: z$1.number().int().describe("돌려줄 적립금 (원)"),
|
|
11287
11300
|
deliveryFeeRefundAmount: z$1.number().int().describe("환불에 포함될 배송비"),
|
|
11288
|
-
deliveryFeeChargeAmount: z$1.number().int().describe("조건부 무료배송 기준 미달로 뺄 배송비")
|
|
11301
|
+
deliveryFeeChargeAmount: z$1.number().int().describe("조건부 무료배송 기준 미달로 뺄 배송비"),
|
|
11302
|
+
deductAmount: z$1.number().int().optional().default(0).describe("뺄 추가 차감(쿼리 `deductAmount`). 서버는 항상 싣는다"),
|
|
11303
|
+
restockRequired: z$1.boolean().optional().default(false).describe("취소 요청에 `restock`이 있어야 하는가(#301) — 발송 뒤 주문상품이면 true다. 서버는 항상 싣는다"),
|
|
11304
|
+
purchasePointAmount: z$1.number().int().optional().default(0).describe("이번 수량에서 회수할 수 있는 구매 적립금(#301). 0이면 회수할 것이 없다(`reclaimPurchasePoints`를 묻지 않는다). 서버는 항상 싣는다")
|
|
11289
11305
|
});
|
|
11290
11306
|
/** `PUT /v1/order-items/{orderItemId}/memo` 응답 — 빈 문자열로 저장하면 메모가 지워져 `null`이다 */
|
|
11291
11307
|
const orderItemMemoResultSchema = z$1.object({
|
|
@@ -12194,7 +12210,10 @@ function createStoreClient(options) {
|
|
|
12194
12210
|
hold: (orderItemId, body) => storeHttp.requestVoid("POST", path`/order-items/${orderItemId}/hold`, { body: holdOrderItemRequestSchema.parse(body) }),
|
|
12195
12211
|
releaseHold: (orderItemId) => storeHttp.requestVoid("DELETE", path`/order-items/${orderItemId}/hold`),
|
|
12196
12212
|
/** 판매자 취소 미리보기(#115) — 취소하면 돌려줄 현금·적립금. 생략한 수량은 남은 수량 전체다 */
|
|
12197
|
-
cancelPreview: (orderItemId,
|
|
12213
|
+
cancelPreview: (orderItemId, query) => {
|
|
12214
|
+
const params = typeof query === "number" ? { quantity: query } : query ?? {};
|
|
12215
|
+
return storeHttp.request("GET", path`/order-items/${orderItemId}/cancel-preview`, sellerCancelPreviewSchema, { query: Object.fromEntries(Object.entries(params).filter(([, value]) => value !== void 0 && value !== 0)) });
|
|
12216
|
+
},
|
|
12198
12217
|
cancelBySeller: (orderItemId, body, idempotencyKey) => storeHttp.request("POST", path`/order-items/${orderItemId}/cancel`, cancelBySellerResultSchema, {
|
|
12199
12218
|
body: cancelBySellerRequestSchema.parse(body),
|
|
12200
12219
|
headers: idempotency(idempotencyKey)
|
|
@@ -12514,7 +12533,7 @@ get: (params) => storeHttp.request("GET", "/sales-report", salesReportSchema, {
|
|
|
12514
12533
|
list: (params = {}) => storeHttp.request("GET", "/payments", paymentRecordPageSchema, { query: params }),
|
|
12515
12534
|
/** `GET /v1/payments/{paymentId}` — 시도·환불 이력 포함. 404 `PAYMENT_NOT_FOUND` */
|
|
12516
12535
|
get: (paymentId) => storeHttp.request("GET", path`/payments/${paymentId}`, paymentRecordDetailSchema),
|
|
12517
|
-
/** `POST /v1/payments/refunds/{refundId}/process` — 대기
|
|
12536
|
+
/** `POST /v1/payments/refunds/{refundId}/process` — 대기(`HELD`)·실패(`FAILED`) 환불을 PG로 환불한다(#115, #301). 409 `REFUND_NOT_HELD` */
|
|
12518
12537
|
processRefund: (refundId) => storeHttp.request("POST", path`/payments/refunds/${refundId}/process`, paymentRefundRecordSchema)
|
|
12519
12538
|
},
|
|
12520
12539
|
/**
|
package/package.json
CHANGED
package/src/client.ts
CHANGED
|
@@ -274,6 +274,7 @@ import {
|
|
|
274
274
|
orderSchema,
|
|
275
275
|
orderSummarySchema,
|
|
276
276
|
purchaseDecisionExtendResultSchema,
|
|
277
|
+
type SellerCancelPreviewQuery,
|
|
277
278
|
type ShippingOrderItemListParams,
|
|
278
279
|
sellerCancelPreviewSchema,
|
|
279
280
|
shippingOrderItemSchema,
|
|
@@ -1086,13 +1087,21 @@ export function createStoreClient(options: StoreClientOptions) {
|
|
|
1086
1087
|
releaseHold: (orderItemId: string) =>
|
|
1087
1088
|
storeHttp.requestVoid("DELETE", path`/order-items/${orderItemId}/hold`),
|
|
1088
1089
|
/** 판매자 취소 미리보기(#115) — 취소하면 돌려줄 현금·적립금. 생략한 수량은 남은 수량 전체다 */
|
|
1089
|
-
cancelPreview: (orderItemId: string,
|
|
1090
|
-
|
|
1090
|
+
cancelPreview: (orderItemId: string, query?: number | SellerCancelPreviewQuery) => {
|
|
1091
|
+
// 두 번째 인자는 수량(이전 호출) 또는 귀책·추가 차감까지 담은 쿼리(#301)다
|
|
1092
|
+
const params: SellerCancelPreviewQuery =
|
|
1093
|
+
typeof query === "number" ? { quantity: query } : (query ?? {});
|
|
1094
|
+
return storeHttp.request(
|
|
1091
1095
|
"GET",
|
|
1092
1096
|
path`/order-items/${orderItemId}/cancel-preview`,
|
|
1093
1097
|
sellerCancelPreviewSchema,
|
|
1094
|
-
{
|
|
1095
|
-
|
|
1098
|
+
{
|
|
1099
|
+
query: Object.fromEntries(
|
|
1100
|
+
Object.entries(params).filter(([, value]) => value !== undefined && value !== 0),
|
|
1101
|
+
) as Query,
|
|
1102
|
+
},
|
|
1103
|
+
);
|
|
1104
|
+
},
|
|
1096
1105
|
cancelBySeller: (orderItemId: string, body: CancelBySellerRequest, idempotencyKey?: string) =>
|
|
1097
1106
|
storeHttp.request(
|
|
1098
1107
|
"POST",
|
|
@@ -1754,7 +1763,7 @@ export function createStoreClient(options: StoreClientOptions) {
|
|
|
1754
1763
|
/** `GET /v1/payments/{paymentId}` — 시도·환불 이력 포함. 404 `PAYMENT_NOT_FOUND` */
|
|
1755
1764
|
get: (paymentId: string) =>
|
|
1756
1765
|
storeHttp.request("GET", path`/payments/${paymentId}`, paymentRecordDetailSchema),
|
|
1757
|
-
/** `POST /v1/payments/refunds/{refundId}/process` — 대기
|
|
1766
|
+
/** `POST /v1/payments/refunds/{refundId}/process` — 대기(`HELD`)·실패(`FAILED`) 환불을 PG로 환불한다(#115, #301). 409 `REFUND_NOT_HELD` */
|
|
1758
1767
|
processRefund: (refundId: string) =>
|
|
1759
1768
|
storeHttp.request(
|
|
1760
1769
|
"POST",
|
package/src/schemas/claim.ts
CHANGED
|
@@ -232,6 +232,14 @@ export const approveClaimResultSchema = z.object({
|
|
|
232
232
|
.optional()
|
|
233
233
|
.default(false)
|
|
234
234
|
.describe("결제 환불을 대기로 남겼다(`holdRefund`, #115). 결제 상세에서 환불 처리한다"),
|
|
235
|
+
refundStatus: z
|
|
236
|
+
.string()
|
|
237
|
+
.nullable()
|
|
238
|
+
.optional()
|
|
239
|
+
.default(null)
|
|
240
|
+
.describe(
|
|
241
|
+
"이번 취소의 결제 환불 원장 상태 — SUCCEEDED 환불됨 · FAILED 실패(결제 상세에서 다시 요청) · PROCESSING 결과 불명(PG 확인 필요) · HELD 환불 대기. 환불할 PG 결제가 없으면(금액 0·적립금 전액) null. 새 값이 추가될 수 있다",
|
|
242
|
+
),
|
|
235
243
|
});
|
|
236
244
|
|
|
237
245
|
export type ApproveClaimResult = z.infer<typeof approveClaimResultSchema>;
|
|
@@ -136,7 +136,9 @@ export const orderItemFlowSchema = z.object({
|
|
|
136
136
|
}),
|
|
137
137
|
)
|
|
138
138
|
.optional()
|
|
139
|
-
.describe(
|
|
139
|
+
.describe(
|
|
140
|
+
"상태 직접 이동으로 옮길 수 있는 상태(셀러 보기). 흐름이 끝났으면 빈 배열. `coreStatus`가 `CANCELED`인 상태로 옮기면 판매자 취소와 같이 환불한다(#301)",
|
|
141
|
+
),
|
|
140
142
|
branches: z
|
|
141
143
|
.array(flowStateSchema)
|
|
142
144
|
.optional()
|
|
@@ -151,6 +153,13 @@ export const moveFlowStateRequestSchema = strictRequest(
|
|
|
151
153
|
z.object({
|
|
152
154
|
to: z.string().min(1).describe("옮길 상태 키(`moveTargets[].key`)"),
|
|
153
155
|
reason: z.string().trim().max(200).optional().describe("옮긴 사유(실행 기록에 남는다)"),
|
|
156
|
+
restock: z
|
|
157
|
+
.boolean()
|
|
158
|
+
.optional()
|
|
159
|
+
.describe(
|
|
160
|
+
"취소 상태(`moveTargets[].coreStatus` `CANCELED`)로 옮길 때 재고를 되돌리는가(#301). 취소 상태로 옮기면 판매자 취소와 같이 환불한다. " +
|
|
161
|
+
"발송 전은 생략하면 true, 발송 뒤는 생략하면 400 `RESTOCK_REQUIRED`다. 다른 상태로 옮길 때는 무시한다",
|
|
162
|
+
),
|
|
154
163
|
}),
|
|
155
164
|
);
|
|
156
165
|
export type MoveFlowStateRequest = z.infer<typeof moveFlowStateRequestSchema>;
|
package/src/schemas/order.ts
CHANGED
|
@@ -493,12 +493,26 @@ export const shippingOrderItemSchema = orderItemSchema.extend({
|
|
|
493
493
|
.object({
|
|
494
494
|
key: z.string().describe("주문 흐름 안 단계 키(상점이 정한다). 화면 분기에 쓰지 않는다"),
|
|
495
495
|
label: z.string().describe("셀러용 단계 이름"),
|
|
496
|
+
acceptsConfirm: z
|
|
497
|
+
.boolean()
|
|
498
|
+
.optional()
|
|
499
|
+
.default(true)
|
|
500
|
+
.describe(
|
|
501
|
+
"이 단계가 발주 확인(`POST /v1/order-items/{orderItemId}/confirm`)을 받는가. 거짓이면 발주 확인은 409 `INVALID_STATUS`다. 연결선 조건식은 실행 때 다시 판정한다",
|
|
502
|
+
),
|
|
503
|
+
acceptsDispatch: z
|
|
504
|
+
.boolean()
|
|
505
|
+
.optional()
|
|
506
|
+
.default(true)
|
|
507
|
+
.describe(
|
|
508
|
+
"이 단계가 발송(`POST /v1/order-items/{orderItemId}/dispatch`)을 받는가. 거짓이면 발송은 409 `INVALID_STATUS`다. 연결선 조건식은 실행 때 다시 판정한다",
|
|
509
|
+
),
|
|
496
510
|
})
|
|
497
511
|
.nullable()
|
|
498
512
|
.optional()
|
|
499
513
|
.default(null)
|
|
500
514
|
.describe(
|
|
501
|
-
"주문 흐름의 지금 단계(`GET /v1/order-items/{orderItemId}/flow`의 `flowState` 키·이름). 같은 상태라도 단계가 발송을 받지 않으면 발송은 409 `INVALID_STATUS
|
|
515
|
+
"주문 흐름의 지금 단계(`GET /v1/order-items/{orderItemId}/flow`의 `flowState` 키·이름). 같은 상태라도 단계가 발송을 받지 않으면 발송은 409 `INVALID_STATUS`다(`acceptsConfirm`·`acceptsDispatch`). 흐름이 없으면 null. 서버는 항상 싣는다",
|
|
502
516
|
),
|
|
503
517
|
});
|
|
504
518
|
|
|
@@ -661,6 +675,35 @@ export const cancelBySellerRequestSchema = strictRequest(
|
|
|
661
675
|
"true면 주문만 취소하고 결제 환불은 대기로 남긴다(#115). 정산·재고·적립금 반환은 그대로 하고, PG 환불은 결제 상세의 " +
|
|
662
676
|
"`POST /v1/payments/refunds/{refundId}/process`로 따로 한다. 생략하면 취소와 함께 환불한다",
|
|
663
677
|
),
|
|
678
|
+
responsibility: z
|
|
679
|
+
.enum(["SELLER", "BUYER"])
|
|
680
|
+
.optional()
|
|
681
|
+
.describe(
|
|
682
|
+
"귀책(#301). 생략하면 `SELLER`다. `SELLER`면 배송비를 판매자가 부담하고(환불 정책 `sellerFaultFreeShipping`) 쿠폰 조건 미달 차감을 하지 않는다. " +
|
|
683
|
+
"`BUYER`면 클레임 승인의 구매자 귀책과 같은 규칙이다(발송 뒤에는 배송비를 돌려주지 않는다). 반품 배송비는 자동으로 빼지 않는다 — 필요하면 `deductAmount`로 뺀다",
|
|
684
|
+
),
|
|
685
|
+
deductAmount: z
|
|
686
|
+
.number()
|
|
687
|
+
.int()
|
|
688
|
+
.min(0)
|
|
689
|
+
.optional()
|
|
690
|
+
.describe(
|
|
691
|
+
"환불액에서 뺄 추가 차감(#301, 원). 생략하면 0이다. 현금에서 먼저 빼고 모자란 몫만 돌려줄 적립금에서 뺀다. 환불 원장·`ORDER.CANCELED` 웹훅에 따로 남는다",
|
|
692
|
+
),
|
|
693
|
+
restock: z
|
|
694
|
+
.boolean()
|
|
695
|
+
.optional()
|
|
696
|
+
.describe(
|
|
697
|
+
"재고를 되돌리는가(#301). 발송 전(결제완료·발주확인, 배송 없는 상품은 제공 완료까지)은 생략하면 true다. " +
|
|
698
|
+
"그 뒤(발송·배송중·배송완료·구매확정)는 생략하면 400 `RESTOCK_REQUIRED`다 — 물건이 돌아왔는지는 판매자가 정한다",
|
|
699
|
+
),
|
|
700
|
+
reclaimPurchasePoints: z
|
|
701
|
+
.boolean()
|
|
702
|
+
.optional()
|
|
703
|
+
.describe(
|
|
704
|
+
"구매확정 때 지급한 구매 적립금 중 이번 수량의 몫을 회수하는가(#301). 지급된 구매 적립금이 없으면 무시한다. 생략하면 회수하지 않는다. " +
|
|
705
|
+
"회원 잔액이 모자라면 있는 만큼만 회수한다(리뷰 적립 회수와 같은 규칙)",
|
|
706
|
+
),
|
|
664
707
|
}),
|
|
665
708
|
);
|
|
666
709
|
|
|
@@ -701,7 +744,7 @@ export const cancelBySellerResultSchema = z.object({
|
|
|
701
744
|
.int()
|
|
702
745
|
.describe(
|
|
703
746
|
"실제 환불한 금액 — 수량 비율 상품 실결제 금액(쿠폰 배분을 뺀 금액) + 배송비 환불 − 조건부 무료배송 미달 차감 " +
|
|
704
|
-
"+ 되돌린 쿠폰 차감(`couponChargeRefundAmount`)",
|
|
747
|
+
"− 쿠폰 조건 미달 차감 + 되돌린 쿠폰 차감(`couponChargeRefundAmount`) − 추가 차감(`deductAmount`)",
|
|
705
748
|
),
|
|
706
749
|
quantity: z.number().int().describe("취소한 수량"),
|
|
707
750
|
canceledQuantity: z.number().int().describe("취소 후 누적 취소 수량"),
|
|
@@ -720,7 +763,9 @@ export const cancelBySellerResultSchema = z.object({
|
|
|
720
763
|
.int()
|
|
721
764
|
.optional()
|
|
722
765
|
.default(0)
|
|
723
|
-
.describe(
|
|
766
|
+
.describe(
|
|
767
|
+
"쿠폰 조건 미달 차감. 판매자 귀책 취소는 차감하지 않으므로 0이고, 구매자 귀책(`responsibility: BUYER`)이면 생길 수 있다. 서버는 항상 싣는다",
|
|
768
|
+
),
|
|
724
769
|
couponChargeRefundAmount: z
|
|
725
770
|
.number()
|
|
726
771
|
.int()
|
|
@@ -744,10 +789,39 @@ export const cancelBySellerResultSchema = z.object({
|
|
|
744
789
|
.optional()
|
|
745
790
|
.default(false)
|
|
746
791
|
.describe("결제 환불을 대기로 남겼다(`holdRefund`). 결제 상세에서 환불 처리한다"),
|
|
792
|
+
refundStatus: z
|
|
793
|
+
.string()
|
|
794
|
+
.nullable()
|
|
795
|
+
.optional()
|
|
796
|
+
.default(null)
|
|
797
|
+
.describe(
|
|
798
|
+
"이번 취소의 결제 환불 원장 상태 — SUCCEEDED 환불됨 · FAILED 실패(결제 상세에서 다시 요청) · PROCESSING 결과 불명(PG 확인 필요) · HELD 환불 대기. 환불할 PG 결제가 없으면(금액 0·적립금 전액) null. 새 값이 추가될 수 있다",
|
|
799
|
+
),
|
|
800
|
+
deductAmount: z
|
|
801
|
+
.number()
|
|
802
|
+
.int()
|
|
803
|
+
.optional()
|
|
804
|
+
.default(0)
|
|
805
|
+
.describe("환불액에서 뺀 추가 차감(#301). 서버는 항상 싣는다"),
|
|
806
|
+
purchasePointReclaimedAmount: z
|
|
807
|
+
.number()
|
|
808
|
+
.int()
|
|
809
|
+
.optional()
|
|
810
|
+
.default(0)
|
|
811
|
+
.describe(
|
|
812
|
+
"회수한 구매 적립금(#301, `reclaimPurchasePoints`). 잔액이 모자라면 요청한 몫보다 작다. 서버는 항상 싣는다",
|
|
813
|
+
),
|
|
747
814
|
});
|
|
748
815
|
|
|
749
816
|
export type CancelBySellerResult = z.infer<typeof cancelBySellerResultSchema>;
|
|
750
817
|
|
|
818
|
+
/** `GET /v1/order-items/{orderItemId}/cancel-preview` 쿼리 — 금액에 영향을 주는 취소 입력(#301). 생략하면 취소의 기본값이다 */
|
|
819
|
+
export interface SellerCancelPreviewQuery {
|
|
820
|
+
quantity?: number;
|
|
821
|
+
responsibility?: "SELLER" | "BUYER";
|
|
822
|
+
deductAmount?: number;
|
|
823
|
+
}
|
|
824
|
+
|
|
751
825
|
/**
|
|
752
826
|
* `GET /v1/order-items/{orderItemId}/cancel-preview` 응답(#115) — 판매자 취소를 하면 돌려줄 금액. 실제 취소와 같은 계산을
|
|
753
827
|
* 쓰기 없이 돌린 결과다. 취소할 수 없는 주문상품은 취소와 같은 409다
|
|
@@ -759,6 +833,27 @@ export const sellerCancelPreviewSchema = z.object({
|
|
|
759
833
|
pointRefundAmount: z.number().int().describe("돌려줄 적립금 (원)"),
|
|
760
834
|
deliveryFeeRefundAmount: z.number().int().describe("환불에 포함될 배송비"),
|
|
761
835
|
deliveryFeeChargeAmount: z.number().int().describe("조건부 무료배송 기준 미달로 뺄 배송비"),
|
|
836
|
+
deductAmount: z
|
|
837
|
+
.number()
|
|
838
|
+
.int()
|
|
839
|
+
.optional()
|
|
840
|
+
.default(0)
|
|
841
|
+
.describe("뺄 추가 차감(쿼리 `deductAmount`). 서버는 항상 싣는다"),
|
|
842
|
+
restockRequired: z
|
|
843
|
+
.boolean()
|
|
844
|
+
.optional()
|
|
845
|
+
.default(false)
|
|
846
|
+
.describe(
|
|
847
|
+
"취소 요청에 `restock`이 있어야 하는가(#301) — 발송 뒤 주문상품이면 true다. 서버는 항상 싣는다",
|
|
848
|
+
),
|
|
849
|
+
purchasePointAmount: z
|
|
850
|
+
.number()
|
|
851
|
+
.int()
|
|
852
|
+
.optional()
|
|
853
|
+
.default(0)
|
|
854
|
+
.describe(
|
|
855
|
+
"이번 수량에서 회수할 수 있는 구매 적립금(#301). 0이면 회수할 것이 없다(`reclaimPurchasePoints`를 묻지 않는다). 서버는 항상 싣는다",
|
|
856
|
+
),
|
|
762
857
|
});
|
|
763
858
|
|
|
764
859
|
export type SellerCancelPreview = z.infer<typeof sellerCancelPreviewSchema>;
|
package/src/schemas/points.ts
CHANGED
|
@@ -189,6 +189,7 @@ export const POINT_ENTRY_TYPES = [
|
|
|
189
189
|
"EARN_REVIEW",
|
|
190
190
|
"REVOKE_REVIEW",
|
|
191
191
|
"EARN_PURCHASE",
|
|
192
|
+
"REVOKE_PURCHASE",
|
|
192
193
|
"USE_RESERVE",
|
|
193
194
|
"USE_RELEASE",
|
|
194
195
|
"REFUND_RESTORE",
|
|
@@ -257,7 +258,7 @@ export type UpdatePointPolicyRequest = z.infer<typeof updatePointPolicyRequestSc
|
|
|
257
258
|
export const responsePointEntryTypeSchema = z
|
|
258
259
|
.union([z.enum(POINT_ENTRY_TYPES), z.string()])
|
|
259
260
|
.describe(
|
|
260
|
-
"유형. `EARN_REVIEW` 리뷰 적립 · `REVOKE_REVIEW` 리뷰 삭제 회수 · `EARN_PURCHASE` 구매 적립 · `EXPIRE` 소멸 · `ADJUST` 셀러 지급·차감 · " +
|
|
261
|
+
"유형. `EARN_REVIEW` 리뷰 적립 · `REVOKE_REVIEW` 리뷰 삭제 회수 · `EARN_PURCHASE` 구매 적립 · `REVOKE_PURCHASE` 판매자 취소의 구매 적립 회수 · `EXPIRE` 소멸 · `ADJUST` 셀러 지급·차감 · " +
|
|
261
262
|
"`OPENING` 기존 잔액 이전 · `USE_RESERVE` 결제 사용(결제 시작 때 빠짐) · `USE_RELEASE` 결제가 실패·만료되어 되돌림 · " +
|
|
262
263
|
"`REFUND_RESTORE` 취소·반품 환불로 반환 · `EARN_COUPON` 적립금 지급 쿠폰. 값이 추가될 수 있어 문자열로 받는다",
|
|
263
264
|
);
|
|
@@ -176,7 +176,7 @@ export const orderCanceledWebhookEventDataSchema = z.object({
|
|
|
176
176
|
.int()
|
|
177
177
|
.describe(
|
|
178
178
|
"환불액 (원). 수량 비율 상품 실결제 금액(쿠폰 배분을 뺀 금액) + 배송비 환불 − 조건부 무료배송 미달 차감 " +
|
|
179
|
-
"+ 되돌린 쿠폰 차감(`couponChargeRefundAmount`)이다. " +
|
|
179
|
+
"− 쿠폰 조건 미달 차감 + 되돌린 쿠폰 차감(`couponChargeRefundAmount`) − 추가 차감(`deductAmount`)이다. " +
|
|
180
180
|
"결제사 환불 결과는 결제 내역(`GET /v1/payments/{paymentId}`)으로 확인한다",
|
|
181
181
|
),
|
|
182
182
|
deliveryFeeRefundAmount: z.number().int().describe("환불액에 포함된 배송비 (원)"),
|
|
@@ -190,7 +190,7 @@ export const orderCanceledWebhookEventDataSchema = z.object({
|
|
|
190
190
|
.optional()
|
|
191
191
|
.default(0)
|
|
192
192
|
.describe(
|
|
193
|
-
"환불액에서 뺀 쿠폰 조건 미달 차감 (원). 판매자 취소는 차감하지 않으므로
|
|
193
|
+
"환불액에서 뺀 쿠폰 조건 미달 차감 (원). 판매자 귀책 취소는 차감하지 않으므로 0이고, 구매자 귀책(`responsibility: BUYER`)이면 생길 수 있다. 이 필드가 없는 이전 이벤트는 0으로 읽는다",
|
|
194
194
|
),
|
|
195
195
|
couponChargeRefundAmount: z
|
|
196
196
|
.number()
|
|
@@ -210,6 +210,14 @@ export const orderCanceledWebhookEventDataSchema = z.object({
|
|
|
210
210
|
"돌려준 적립금 (원, #93) — 결제에 쓴 적립금 중 이번 취소·반품 수량의 몫이다. 현금 환불(`refundAmount`)과 별개다. " +
|
|
211
211
|
"차감은 현금에서 먼저 빼고 모자란 몫만 여기서 뺀다. 적립금을 쓰지 않은 주문과 이 필드가 없는 이전 응답·이벤트는 0으로 읽는다",
|
|
212
212
|
),
|
|
213
|
+
deductAmount: z
|
|
214
|
+
.number()
|
|
215
|
+
.int()
|
|
216
|
+
.optional()
|
|
217
|
+
.default(0)
|
|
218
|
+
.describe(
|
|
219
|
+
"환불액에서 뺀 추가 차감 (원, #301) — 판매자가 취소 요청에 넣은 `deductAmount`다. 배송비 차감과 따로 싣는다. 이 필드가 없는 이전 이벤트는 0으로 읽는다",
|
|
220
|
+
),
|
|
213
221
|
currency: z
|
|
214
222
|
.string()
|
|
215
223
|
.optional()
|