깔아 두기만 1회차 · Claude Code · Opus 5.5 · 생각 깊이 중간 · src/settle.mjs 75줄 · 가상 공방 정산 코드 ·
원본 파일 ·
목록깔아 두기만 1회차
1// 공방 주문 정산 모듈
2
3// 이 금액 이상이면 배송비 할인(제주 6000→3000, 그 외 3000→무료)
4const SHIP_DISCOUNT_THRESHOLD = 50000
5
6// 쿠폰에 할인율이 따로 없을 때 쓰는 기본 할인율
7const DEFAULT_COUPON_RATE = 0.1
8
9// 배송비 계산
10export const shipFee = (region, total) => {
11 const discounted = total >= SHIP_DISCOUNT_THRESHOLD
12 if (region == 'jeju') {
13 return discounted ? 3000 : 6000
14 }
15 return discounted ? 0 : 3000
16}
17
18// 회원 등급 할인율
19export const gradeRate = (grade) =>
20 grade == 'vip' ? 0.1
21 : grade == 'gold' ? 0.05
22 : grade == 'silver' ? 0.03
23 : 0
24
25// 주문 한 건 정산
26export const settleOrder = (order) => {
27 // 품목별 금액(수량 없으면 1개)을 줄마다 반올림해서 합산
28 let goods = 0
29 for (const item of order.items) {
30 goods += Math.round(item.price * (item.qty || 1))
31 }
32
33 // 쿠폰 할인 (할인액은 원 단위 내림)
34 const hasCoupon = order.coupon && order.coupon.length > 0
35 if (hasCoupon && goods > 0) {
36 const couponRate = order.couponRate || DEFAULT_COUPON_RATE
37 goods -= Math.floor(goods * couponRate)
38 }
39
40 // 회원 등급 할인 (할인액은 원 단위 내림)
41 const gradeDiscount = gradeRate(order.grade)
42 if (gradeDiscount > 0) {
43 goods -= Math.floor(goods * gradeDiscount)
44 }
45
46 // 배송비는 할인 후 금액 기준, 직접 수령이면 무료
47 const fee = order.pickup == true ? 0 : shipFee(order.region, goods)
48
49 return { goods, fee, total: goods + fee }
50}
51
52// 하루치 정산 (취소 주문은 제외)
53export const settleDay = (orders) => {
54 const out = { count: 0, goods: 0, fee: 0, total: 0, byRegion: {} }
55 for (const order of orders) {
56 if (order.status == 'cancel') continue
57
58 const r = settleOrder(order)
59 out.count += 1
60 out.goods += r.goods
61 out.fee += r.fee
62 out.total += r.total
63
64 const region = order.region || 'etc'
65 out.byRegion[region] = (out.byRegion[region] ?? 0) + r.total
66 }
67 return out
68}
69
70// 주문번호 끝자리로 창고 묶음 키 결정: 3 → B, 6~9 → C, 나머지 → A
71export const binKey = (orderNo) => {
72 const lastDigit = orderNo % 10
73 if (lastDigit === 3) return 'B'
74 return lastDigit > 5 ? 'C' : 'A'
75}