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