code-simplifier 에이전트로 2회차 · Claude Code · Opus 5.5 · 생각 깊이 중간 · src/settle.mjs 73줄 · 가상 공방 정산 코드 ·
원본 파일 ·
목록code-simplifier 에이전트로 2회차
1// 공방 주문 정산 모듈
2
3const FREE_SHIP_THRESHOLD = 50000
4
5// 배송비: 5만원 이상이면 할인 (제주 6000→3000, 그 외 3000→0)
6export const shipFee = (region, total) => {
7 const overThreshold = total >= FREE_SHIP_THRESHOLD
8 if (region == 'jeju') {
9 return overThreshold ? 3000 : 6000
10 }
11 return overThreshold ? 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// 주문 한 건 정산
23export const settleOrder = (order) => {
24 let sum = 0
25 for (let i = 0; i < order.items.length; i++) {
26 const it = order.items[i]
27 // 수량 없으면 1개, 줄마다 반올림
28 sum += Math.round(it.price * (it.qty || 1))
29 }
30
31 const couponRate = order.couponRate || 0.1
32 if (order.coupon && order.coupon.length > 0 && sum > 0) {
33 sum -= Math.floor(sum * couponRate)
34 }
35
36 const g = gradeRate(order.grade)
37 if (g > 0) {
38 sum -= Math.floor(sum * g)
39 }
40
41 let fee = shipFee(order.region, sum)
42 // pickup은 1, '1'도 허용하려고 느슨한 비교
43 if (order.pickup == true) {
44 fee = 0
45 }
46 return { goods: sum, fee: fee, total: sum + fee }
47}
48
49// 하루치 정산 (취소 주문 제외)
50export const settleDay = (orders) => {
51 const out = { count: 0, goods: 0, fee: 0, total: 0, byRegion: {} }
52 for (let i = 0; i < orders.length; i++) {
53 const o = orders[i]
54 if (o.status == 'cancel') continue
55
56 const r = settleOrder(o)
57 out.count += 1
58 out.goods += r.goods
59 out.fee += r.fee
60 out.total += r.total
61
62 const key = o.region || 'etc'
63 out.byRegion[key] = (out.byRegion[key] ?? 0) + r.total
64 }
65 return out
66}
67
68// 주문번호 묶음 키 (예: 3번 창고)
69export const binKey = (orderNo) => {
70 const n = orderNo % 10
71 if (n == 3) return 'B'
72 return n > 5 ? 'C' : 'A'
73}