정산 시스템 로직
DPSP (Delivery Partner Settlement Platform) 정산 파이프라인의 전체 로직을 정리한 문서입니다. 쿠팡이츠와 배민 플랫폼의 익일정산/주간정산 계산 로직, 라이더 매칭, 배치 관리, 인센티브 시스템을 포함합니다.
0. 전체 파이프라인 개요
정산 처리는 아래 단계를 순서대로 거칩니다.
1. 익일정산 - 쿠팡
INPUT
쿠팡이츠 일정산서 Excel 파일 (7개 시트)
일정산서 - 종합
- 라이선스 ID
- 성함
- 총 정산예정 금액
- 총 정산 오더수
- 픽업 비용
- 배달 비용
- 지역 단가
- 배달거리 할증 (오더수 / 금액)
- 픽업지 할증 (오더수 / 금액)
- 도착지 할증 (오더수 / 금액)
- 기상 할증 (오더수 / 금액)
- 기타 프로모션 (오더수 / 금액) - 4개
- 정산금액
- 총 지원금
- 차감내역
- 과세항목 (총 정산금액)
- 비과세 항목 (사업주부담 고용보험, 기사부담 고용보험, 사업주부담 산재보험, 기사부담 산재보험, 시간제보험, 정산 예정금액, 라이더별 실지급액, 수수료 차감 금액, 보수액)
일정산서 - 오더별 상세 내역서
- 성함
- 축약형 주문번호
- 스토어명
- 픽업지역 / 배달지역
- 배정시간 / 수락시간 / 배달시간
- 배달소요시간 (시:분)
- 피크타임
- 배달거리 (m)
- 배달타입
- 픽업 비용 / 배달 비용 / 지역 단가
- 배달거리 할증 / 픽업지 할증 / 도착지 할증 / 기상 할증
- 기타 프로모션1~4
- 정산금액
일정산서 - 지원금
- 주문일자 / 축약형 ID / 성함
- 스토어명 / 픽업지역 / 배달지역
- 배정시간 / 수락시간 / 배달시간 / 배달소요시간
- 피크타임 / 지원금
일정산서 - 추가지원금
- 주문일자 / 축약형 ID / 성함
- 구분 / 금액
일정산서 - 차감내역
- 주문일자 / 축약형 ID / 성함
- 구분 / 스토어명 / 배정시간
- 메뉴가 / 배달비 / 금액
일정산서 - 협력사 자체 미션
- 미션 명 / 미션 시작 / 미션 종료
- 쿠팡이츠 지원금 / 협력사 자체미션 금액
- 이름 / 목표 건수 / 달성 건수 / 달성 유무
일정산서 - 시간제보험
- 발생일자 / 성함 / 금액
로직
데이터 특성
- 쿠팡이 제공하는 일정산서에는 보험료, 시간제보험 등 비과세 항목이 별도 컬럼으로 명시되어 있음
- 시스템은 Excel 원본 금액을 기반으로 모든 공제를 독립적으로 재계산함
- 쿠팡 제공 금액은 참조용이며, 실제 정산은 시스템 요율 기준으로 산출
기본 요율 (시스템 기본값)
| 항목 | 비율 | 비고 |
|---|---|---|
| 고용보험료 | 0.8% (0.008) | 기사부담분 |
| 산재보험료 | 0.88% (0.0088) | 기사부담분 |
| 원천징수세 | 3.3% (0.033) | 소득세 3% + 지방세 0.3% |
| 운영사 수수료 | 설정값 원/건 | 회사/팀별 DB 설정 (commission_fee_per_case) |
| DPSP 수수료 | 설정값 원/건 | 위탁(full_service)만 적용, 비위탁은 0 (dpsp_fee_per_case) |
항목별 계산
- 총 정산금액 = 일정산서 종합 시트 '정산금액' (Z열)
- 고용보험 공제액 = ROUND(총 정산금액 × 0.008)
- 산재보험 공제액 = ROUND(총 정산금액 × 0.0088)
- 시간제보험 공제액 = ABS(시간제보험 시트 금액)
- Excel에서 음수로 제공될 수 있으므로 절대값 변환
- 원천세 공제액 = ROUND(총 정산금액 × 0.033)
- 수수료 공제액 = 총 오더수 × (운영사 수수료 + DPSP 수수료)
- 비위탁(calculation_only) 회사: DPSP 수수료 = 0
- 총 공제액 = 고용보험 + 산재보험 + 시간제보험 + 원천세 + 수수료
- 실지급액 = 총 정산금액 - 총 공제액
Math.round() (사사오입) 적용
OUTPUT
명세서 항목
- 라이더명
- 라이선스 ID
- 총 정산 오더수
- 총 정산금액 (Excel 원본)
- 고용보험 공제액 = ROUND(총 정산금액 × 0.008)
- 산재보험 공제액 = ROUND(총 정산금액 × 0.0088)
- 시간제보험 공제액 = ABS(Excel 시간제보험)
- 원천세 공제액 = ROUND(총 정산금액 × 0.033)
- 수수료 공제액 = 총 오더수 × (운영사 수수료 + DPSP 수수료)
- 총 공제액 = 위 5개 항목 합계
- 실지급액 = 총 정산금액 - 총 공제액
2. 익일정산 - 배민
INPUT
배민 일정산서 - 배달 내역 상세 (단일 시트)
- 협력사아이디 / 사업자등록번호 / 사업자명
- 운행일
- 배달번호 / 배달상태
- 서비스타입 / 배달방식
- 라이더ID / User ID / 라이더명
- 배달수단
- 가게번호 / 가게이름 / 상품가격
- 픽업주소 / 전달지 주소
- 주문시간 / 배차완료 / 가게도착 / 픽업완료 / 전달완료
- 거리
- 추가배달사유 / 추가배달상세내용
- 픽업지 법정동
- 기본단가 / 기상할증 / 추가할증 / 피크할증 등 / 지역 할증 / 대량 할증
- 배달처리비 (핵심 정산 금액)
- 라이더귀책여부 / 추가할증사유
로직
데이터 특성
- 배달처리비 다운로드 파일에는 고용보험, 산재보험, 원천세를 공제하지 않은 원배달료 데이터만 존재
- 모든 공제 항목을 시스템에서 직접 계산해야 함
- 각 공제 항목은 개별적으로 ROUND() 적용 후 합산
기본 요율 (시스템 기본값)
| 항목 | 비율 | 비고 |
|---|---|---|
| 고용보험료 | 0.8% (0.008) | 기사부담분 |
| 산재보험료 | 0.9% (0.009) | 기사부담분 (쿠팡 0.88%와 다름) |
| 원천징수세 | 3.3% (0.033) | 소득세 3% + 지방세 0.3% |
| 일정산 수수료 | 기본값 77원/건 | commission_fee_per_case (DB 설정) |
| DPSP 수수료 | 설정값 원/건 | 위탁(full_service)만 적용, 비위탁은 0 |
| 시간제보험료 | 기본값 5,000원 | 시간제보험 가입자만 적용 (boolean flag) |
항목별 계산
- 원배달료 = SUM(각 배달건의 '배달처리비')
- 총 건수 = 배달 데이터 행 수
- 고용보험 공제액 = ROUND(원배달료 × 0.008)
- 산재보험 공제액 = ROUND(원배달료 × 0.009)
- 원천세 공제액 = ROUND(원배달료 × 0.033)
- 시간제보험 공제액 = 시간제보험 가입자 ? 5,000원 : 0원
- 라이더 정보의 시간제보험 가입 여부(boolean flag)로 판정
- 수수료 = 총 건수 × (일정산 수수료 + DPSP 수수료)
- 비위탁(calculation_only) 회사: DPSP 수수료 = 0
- 실지급액 = 원배달료 - 고용보험 - 산재보험 - 원천세 - 시간제보험 - 수수료
Math.round() (사사오입) 적용. 통합 비율(0.0498)로 한꺼번에 계산하지 않음.
OUTPUT
명세서 항목
- 라이더명
- 라이더ID / User ID
- 총 건수
- 원배달료 = SUM(배달처리비)
- 고용보험 공제액 = ROUND(원배달료 × 0.008)
- 산재보험 공제액 = ROUND(원배달료 × 0.009)
- 원천세 공제액 = ROUND(원배달료 × 0.033)
- 시간제보험 공제액 = 가입 시 5,000원, 미가입 시 0원
- 수수료 공제액 = 총 건수 × (수수료/건 + DPSP 수수료/건)
- 실지급액 = 원배달료 - 모든 공제 합계
- 원천신고 금액 = 원배달료 (공제 전 금액)
3. 주간정산 - 쿠팡
INPUT
주정산서 - 종합 (일자별 정산내역)
- 날짜
- 라이선스 ID / 성함
- 총 정산 오더수
- 총 정산금액
- 픽업 비용 / 배달 비용 / 지역 단가
- 배달거리 할증 (오더수 / 금액)
- 픽업지 할증 (오더수 / 금액)
- 도착지 할증 (오더수 / 금액)
- 기상 할증 (오더수 / 금액)
- 기타 프로모션 (오더수 / 금액) - 3개
- 정산금액 (Z열)
- 총 지원금 (AA열)
- 차감내역 (AB열, 음수)
- 기사부담 고용보험 (AE열)
- 기사부담 산재보험 (AG열)
- 시간제보험 (AH열)
- 보험료 소급 (AI열)
주정산서 - 지원금 상세 내역서
- 주문일자 / 축약형 ID / 성함
- 스토어명 / 픽업지역 / 배달지역
- 배정시간 / 수락시간 / 배달시간 / 배달소요시간
- 피크타임 / 지원금
주정산서 - 추가지원금 상세 내역서
- 주문일자 / 축약형 ID / 성함
- 구분 / 금액
주정산서 - 차감내역
- 주문일자 / 축약형 ID / 성함
- 구분 / 스토어명 / 배정시간
- 메뉴가 / 배달비 / 금액
주정산서 - 협력사 자체미션
- 미션 명 / 미션 시작 / 미션 종료
- 쿠팡이츠 지원금 / 협력사 자체미션 금액
- 이름 / 목표 건수 / 달성 건수 / 달성 유무 / 비고
주정산서 - 시간제 보험료 내역
- 일자 / 이름 / 금액
주정산서 - 보험료 소급 내역
- 이름 / 내역 / 발생금액
로직
주정산자 계산
주정산(weekly_only) 라이더에 대한 전체 정산을 수행합니다.
기본 요율
| 항목 | 비율 | 비고 |
|---|---|---|
| 원천징수세 | 3.3% (0.033) | 반올림: Math.floor() (절삭) |
Math.floor() (소수점 이하 절삭)을 사용합니다. 익일정산의 Math.round()와 다릅니다.
항목별 계산
- 정산서 합계 = 정산금액(Z열) + 총 지원금(AA열) + 차감내역(AB열)
- 차감내역은 음수로 제공되므로 덧셈으로 처리
- 프로모션 합계 = 건별 인센티브 + 팀 미션 금액 + 추가 지원금
- 건별 인센티브: 인센티브 규칙(CINR)에 따라 자동 계산
- 팀 미션: 협력사 자체미션에서 달성(isAchieved=true) + 선택된 미션의 금액 합산
- 추가 지원금: 수동 입력
- 과세 금액 = 정산서 합계 + 프로모션 합계
- 원천세 = FLOOR(과세 금액 × 0.033)
- 정산서 금액과 프로모션 금액이 통합되어 한 번에 과세됨
- 보험 공제 합계 = |고용보험(AE열)| + |산재보험(AG열)| + |시간제보험(AH열)| + |보험소급(AI열)|
- 모든 보험료는 Excel 원본 값의 절대값을 사용
- 추가 공제 = 수동 입력된 추가 공제 금액 (세후 차감)
- 정산 합계 = 과세 금액 - 보험 공제 합계 - 원천세 - 추가 공제
- 실입금액 = 정산 합계 - 기지급 익일정산액
- 해당 주 중 익일정산으로 이미 지급된 금액을 차감
익일정산자 계산
익일정산(daily_settlement) 라이더는 기본 배달료가 이미 익일정산으로 지급 완료되었으므로, 주간정산에서는 프로모션 항목만 정산합니다.
항목별 계산
- 기본 배달료: 이미 익일정산으로 지급 완료 → 제외
- 건별 인센티브 = 인센티브 규칙(CINR)에 따라 자동 계산
- 팀 미션 금액 = 달성 + 선택된 미션의 금액 합산
- 추가 지원금 = 수동 입력
- 프로모션 합계 = 건별 인센티브 + 팀 미션 + 추가 지원금
- 원천세 = FLOOR(프로모션 합계 × 0.033)
- 추가 공제 = 수동 입력 (세후 차감)
- 실입금액 = 프로모션 합계 - 원천세 - 추가 공제
OUTPUT
주정산자 명세서 항목 (20개 필드)
- 라이더명 / 라이더 ID
- 총 오더수
- 정산금액 / 총 지원금 / 차감내역 / 정산서 합계
- 건별 인센티브 / 팀 미션 금액 / 추가 지원금 / 프로모션 합계
- 고용보험 / 산재보험 / 시간제보험 / 보험소급 / 보험 공제 합계
- 과세 금액 = 정산서 합계 + 프로모션 합계
- 원천세 = FLOOR(과세 금액 × 0.033)
- 추가 공제
- 정산 합계
- 기지급 익일정산액
- 실입금액 = 정산 합계 - 기지급 익일정산액
익일정산자 명세서 항목
- 라이더명 / 라이더 ID
- 건별 인센티브
- 팀 미션 금액
- 추가 지원금
- 프로모션 합계 = 건별 인센티브 + 팀 미션 + 추가 지원금
- 원천세 = FLOOR(프로모션 합계 × 0.033)
- 추가 공제
- 실입금액 = 프로모션 합계 - 원천세 - 추가 공제
- 비고: 기본 배달료는 익일정산 완료
톡방 업로드용 이미지
- 주정산 금액 기준으로 작성
- 최종 지급액 표시
- 정산 내역 엑셀 캡처 포함
- 지원금, 추가지원금, 차감내역, 시간제보험 엑셀 캡처 포함
이체 파일
- 실입금액 반영
상세 정산서 (엑셀)
- 기본 정산 내역 (정산서 합계 상세)
- 프로모션 내역 (건별 인센티브 + 팀 미션 계산 과정)
- 보험 공제 내역 (고용보험, 산재보험, 시간제보험, 보험소급)
- 원천세
- 실입금액
4. 주간정산 - 배민
INPUT
주정산서 - 을지_협력사 소속 라이더 정산 확인용
- 라이더명
- 처리건수
- 지급금액
- 프로모션
- 배달료 / 추가지급 / 총 배달료
- 시간제보험료
- 고용보험료 / 산재보험료
- 고용보험 소급정산 / 산재보험 소급정산
- 원천세
주정산서 - 관리비
- 세부정보 (신청 세트 수, 세트당 발주량, 전체 슬롯, 달성 슬롯, 미달성 슬롯, 수락률)
- 관리비정보 (전체 발주 물량, 하위 3개 슬롯 평균 달성률, 유효 처리 물량, 기본 관리비, 보너스 관리비, 기타, 관리수수료 합계)
주정산서 - 프로모션
- 라이더ID / 이름
- 지급금액 / 사유
주정산서 - 추가배달료
- 라이더ID / 이름
- 지급금액 / 배달정보 / 사유
주정산서 - 고용보험 소급정산
- 협력사 ID / 협력사명 / 사업자등록번호 / 사업자명
- User ID / 이름
- 배달료 A / 추가지급 B / 총 배달료 C (A+B)
- 필요경비 D / 월 보수액 E (C-D)
- 사업주부담 고용보험료 공제분1~4
- 고용보험 가입대상 요건 / 고용/산재 가입대상 (최종)
- 확정분 / 소급적용분 / 소급정산 전체
로직
데이터 특성
- 배민은 팀 프로모션이 이미 계산되어 주정산서 '지급금액'에 포함되어 있음
- 지사 프로모션(협력사 자체 인센티브)만 별도 계산 필요
- 주정산자와 익일정산자의 공제 비율이 다름
주정산자 계산
주정산(weekly_only) 라이더의 정산입니다.
항목별 계산
- 주정산서 지급금액 = 을지 시트 '지급금액' 항목
- 이미 팀 프로모션, 보험료, 원천세가 반영된 최종 금액
- 지사 프로모션 계산
- 지사 프로모션 금액 = 협력사 자체 계산
- 지사 프로모션 원천세 공제 = FLOOR(지사 프로모션 금액 × 0.033)
- 지사 프로모션 지급액 = 지사 프로모션 금액 - 지사 프로모션 원천세 공제
- 최종 지급액 = 주정산서 지급금액 + 지사 프로모션 지급액
Math.floor() (절삭) 사용
익일정산자 계산
익일정산(daily_settlement) 라이더는 기본 배달료가 이미 지급되었으므로, 프로모션 항목만 정산합니다.
요율
| 항목 | 비율 | 적용 대상 |
|---|---|---|
| 통합 공제 비율 | 4.98% (0.0498) | 익일정산자의 모든 프로모션 항목 |
항목별 계산
- 팀 프로모션 계산 (배민 제공)
- 팀 프로모션 금액 = 주정산서 '프로모션' 항목
- 팀 프로모션 공제액 = FLOOR(팀 프로모션 금액 × 0.0498)
- 팀 프로모션 지급액 = 팀 프로모션 금액 - 팀 프로모션 공제액
- 지사 프로모션 계산 (협력사 자체)
- 지사 프로모션 금액 = 협력사 자체 계산
- 지사 프로모션 공제액 = FLOOR(지사 프로모션 금액 × 0.0498)
- 지사 프로모션 지급액 = 지사 프로모션 금액 - 지사 프로모션 공제액
- 과적할증 계산 (있는 경우)
- 과적할증 금액 = 주정산서 '과적할증' 항목
- 과적할증 공제액 = FLOOR(과적할증 금액 × 0.0498)
- 과적할증 지급액 = 과적할증 금액 - 과적할증 공제액
- 최종 지급액 = 팀 프로모션 지급액 + 지사 프로모션 지급액 + 과적할증 지급액
OUTPUT
주정산자 명세서 항목
- 라이더명
- 처리건수
- 주정산서 지급금액 (팀 프로모션+보험+세금 반영 완료)
- 지사 프로모션 금액
- 지사 프로모션 원천세 공제 = FLOOR(지사 프로모션 금액 × 0.033)
- 지사 프로모션 지급액
- 최종 지급액 = 주정산서 지급금액 + 지사 프로모션 지급액
익일정산자 명세서 항목
- 라이더명
- 팀 프로모션 금액 (배민 제공)
- 팀 프로모션 공제액 = FLOOR(팀 프로모션 금액 × 0.0498)
- 팀 프로모션 지급액
- 지사 프로모션 금액
- 지사 프로모션 공제액 = FLOOR(지사 프로모션 금액 × 0.0498)
- 지사 프로모션 지급액
- 과적할증 금액 (있는 경우)
- 과적할증 공제액 = FLOOR(과적할증 금액 × 0.0498)
- 과적할증 지급액
- 최종 지급액 = 팀 프로모션 + 지사 프로모션 + 과적할증 지급액 합계
- 비고: 기본 배달료는 익일정산 완료
톡방 업로드용 이미지
- 주정산 금액 기준으로 작성
- 최종 지급액 표시
이체 파일
- 최종 지급액 반영
상세 정산서 (엑셀)
- 기본 정산 내역 (주정산서 기준)
- 지사 프로모션 내역 (계산 과정 포함)
- 팀 프로모션 내역 (익일정산자만, 계산 과정 포함)
- 공제 내역 (주정산자: 원천세 / 익일정산자: 4.98% 통합)
- 최종 지급액
5. 라이더 매칭 시스템
Excel 정산서의 라이더 식별 정보(이름, 라이선스ID 등)를 DB에 등록된 라이더(users)에 매핑하는 시스템입니다. 4단계 우선순위로 매칭을 시도하며, 매칭 실패 시 Dead Letter로 격리합니다.
4단계 매칭 우선순위
| 단계 | 매칭 방법 | 신뢰도 | 안정성 | 적용 조건 |
|---|---|---|---|---|
| 1단계 | LICENSE_ID (라이선스 ID) | 100 | STABLE | 쿠팡: license_id → rider_platform_credentials 배민: rider_id/user_id → platform_rider_id / platform_user_id |
| 2단계 | NAME_PHONE (이름 + 전화번호 뒷 4자리) | 80 | STABLE | 이름과 전화번호 뒷 4자리 동시 일치 |
| 3단계 | NAME_ONLY_INFERRED (이름만, 유일자) | 60 | FRAGILE | 동명이인 없음 (requires_phone = FALSE) + 플랫폼 활성 소속 필터 |
| 4단계 | NAME_ONLY (이름만, 최후 수단) | 40 | FRAGILE | 동명이인 정확히 1명일 때만 |
매칭 프로세스
- Excel에서 라이더 식별 정보 추출 (이름, 라이선스ID, 전화번호 뒷 4자리)
- 1단계부터 순서대로 매칭 시도 — 성공 시 해당 신뢰도로 기록
- 모든 단계 실패 시 → settlement_dead_letters에 격리
- 매칭 결과는 rider_id_mapping 테이블에 기록
- matched_user_id: 매칭된 라이더 ID
- match_method: 매칭 방법
- match_confidence: 신뢰도 점수
- identifier_stability: STABLE / FRAGILE
동명이인 처리
company_name_uniqueness_registry 테이블이 회사별로 동명이인을 자동 추적합니다.
- 라이더 등록/수정 시 트리거가 자동으로
active_rider_count업데이트 active_rider_count >= 2→requires_phone = TRUE설정requires_phone = TRUE인 이름은 3단계(NAME_ONLY_INFERRED), 4단계(NAME_ONLY) 매칭 금지- 동명이인 발생 시 미완료 배치의 FRAGILE 매핑을 자동 무효화 (invalidated_at 기록)
Dead Letter 처리
매칭 실패 시 settlement_dead_letters에 격리됩니다.
실패 유형
| failure_reason | 설명 | 해결 방법 |
|---|---|---|
| NO_MATCH | 라이더 미등록 | 라이더 등록 후 재처리 |
| DUPLICATE_PHONE_SUFFIX | 동명이인 + 번호 뒷 4자리까지 동일 | 관리자 수동 매칭 |
| AMBIGUOUS_ACTIVE | 동명이인 다수 + 모두 플랫폼 활성 | 관리자 수동 매칭 |
| NO_MATCH_PLATFORM | 동명이인 있으나 플랫폼 계정 비활성 | 플랫폼 계정 등록 후 재처리 |
재처리 프로세스
- 관리자가 Dead Letter에
resolved_user_id를 설정 (수동 매칭) fn_reprocess_dead_letters()함수가 자동 재처리- SAVEPOINT 기반 — 개별 Dead Letter 실패 시 나머지는 계속 처리
- 완료/승인/이체준비 상태의 배치는 재처리 차단
6. 배치 생명주기
정산 배치(settlement_batches)는 정산 프로세스의 단위입니다. 각 배치는 특정 회사/팀/플랫폼/정산유형의 정산 건을 묶어 관리합니다.
상태 전이
| 상태 | 설명 | 전이 조건 |
|---|---|---|
| draft | 배치 생성됨, 원본 데이터 저장 | Excel 업로드 시 자동 생성 |
| calculated | 정산 계산 완료 | Calculator 실행 완료 |
| reviewed | 담당자 검토 완료 | 관리자/본사 검토 확인 |
| incentive_applied | 인센티브 규칙 적용 완료 | CINR 규칙 실행, company_incentive 반영 |
| approved | 최종 승인 | 권한자 승인 |
| transfer_ready | 이체 준비 완료 | transfer_records 생성 |
| completed | 이체 완료 | 은행 이체 완료 확인 |
| revoked | 배치 취소 | 관리자에 의한 취소 |
전이 권한 분기
위탁(full_service) vs 비위탁(calculation_only) 여부와 정산 유형(일정산/주정산)에 따라 전이 권한이 달라집니다.
| 구분 | 일정산 (daily) | 주정산 (weekly) |
|---|---|---|
| 비위탁 (calculation_only) | 본사 전이 가능 (전 구간) | 본사 전이 가능 (전 구간) |
| 위탁 (full_service) | calculated 이후 전이 차단 (admin만 가능) |
본사도 직접 전이 가능 |
| admin | 전 구간 통과 | |
배치 보호 규칙
- completed / approved / transfer_ready 배치는 FRAGILE 매핑 소급 무효화 불가
- completed 배치는 재계산/수정 불가 (감사 추적 보존)
- revoked 배치는 더 이상 상태 전이 불가
7. 인센티브 시스템 (CINR)
CINR (Company INcentive Results)은 회사별 인센티브 규칙을 정의하고 정산에 자동 적용하는 시스템입니다. INDIVIDUAL(개인)과 TEAM(팀) 두 가지 유형이 있습니다.
INDIVIDUAL 인센티브
라이더 개인의 배달 건수에 따라 보상을 지급합니다.
계산 방식 (calc_method)
| 방식 | 설명 | 계산 |
|---|---|---|
| tiered | 단계별 누적 | 각 구간(min_count ~ 다음 구간) × rate_per_delivery 합산 최대 금액(max_amount) 제한 가능 |
| simple | 목표 달성 시 건당 금액 | target_count 달성 시 → (달성건수 - from_count) × rate_per_delivery |
| fixed | 목표 달성 시 고정 보너스 | target_count 달성 시 → bonus_amount 지급 |
건수 집계 범위 (count_scope)
- PER_REGION: 지역별로 건수를 분리 집계
- TOTAL_ACROSS_REGIONS: 전 지역 합산 집계
TEAM 인센티브
팀 단위 조건과 개인 조건을 동시에 충족해야 보상이 지급됩니다.
조건
- 팀 전체 최소 건수 (team_min_total_count): 팀 전체 배달 건수가 기준 이상
- 개인 최소 건수 (individual_min_count): 팀원 각자의 배달 건수가 기준 이상
- 두 조건 모두 충족 시 → reward_amount를 팀원 1인당 지급
적용 시점
- 배치 상태가 reviewed → incentive_applied로 전이될 때 실행
- 인센티브 규칙을 평가하여 조건 충족 여부 판정
- 결과가
company_incentive_results테이블에 저장- rule_id: 적용된 규칙
- rider_id: 대상 라이더
- delivery_count_used: 실제 집계된 배달 건수
- reward_amount: 지급 보상 금액
settlement_details.company_incentive필드에 reward_amount 합산 반영- 최종 실지급액(net_payment)에 인센티브 금액이 추가됨
8. 요율 설정
시스템 기본값
각 계산기(Calculator)가 사용하는 기본 요율입니다. DB의 settlement_rate_settings 테이블에서 조회하며, 미설정 시 아래 기본값을 사용합니다.
| 항목 | 쿠팡 익일 | 쿠팡 주간 | 배민 익일 | 배민 주간 |
|---|---|---|---|---|
| 고용보험료 | 0.8% | Excel 값 | 0.8% | Excel 값 |
| 산재보험료 | 0.88% | Excel 값 | 0.9% | Excel 값 |
| 원천징수세 | 3.3% | 3.3% | 3.3% | 3.3% |
| 통합 공제 비율 | - | - | - | 4.98% (익일정산자) |
| 수수료/건 | 설정값 | - | 77원 | - |
| 시간제보험 | Excel 값 | Excel 값 | 5,000원 | - |
| 반올림 | round() | floor() | round() | floor() |
회사/팀별 설정
수수료는 회사/팀 단위로 설정 가능합니다.
| 설정 항목 | 설명 | 조회 경로 |
|---|---|---|
| commission_fee_per_case | 운영사 수수료 (원/건) | TeamService.getSettlementSettings(companyId, teamId) |
| dpsp_fee_per_case | DPSP 수수료 (원/건) | 위탁(full_service)만 적용, 비위탁은 0 |
서비스 타입별 수수료 적용
- 비위탁 (calculation_only): dpsp_fee_per_case = 0으로 강제 설정
- 위탁 (full_service): dpsp_fee_per_case를 DB 설정값 그대로 적용
요율 조회 우선순위
- TeamService.getSettlementSettings(companyId, teamId) → 회사/팀 특정 설정
- TeamService.getDefaultSettings() → 시스템 기본값 (fallback)
- Calculator 내부 하드코딩 기본값 (최후 fallback)