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