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