[정산 사이클 cron — 매월 15일 KST 09:00]
for each 판매자:
1. 미정산 금액 계산
= SUM(Settlement.status=Succeed 직전 사이클 이후)
- SUM(Settlement.status=Refunded 직전 사이클 이후)
- 이월 음수 잔액
2. 최소 금액 미만이면 SKIP (다음 사이클 이월)
3. billing_tran_id 미보유 시 SKIP + ERROR (계좌 재등록 안내)
4. Payple 이체 대기 (3) → group_key 받음
5. Payple 이체 실행 (4, NOW)
6. SettlementPayout row 생성 (status=Pending)
Webhook 수신 시:
1. SettlementPayout 상태 업데이트 (Succeed/Failed)
2. 알림 (선택)
각 단계별로 PR 분할 권장.
✨ 기능 설명
#485에서 환불 시
Settlement.status='Refunded'로 마킹은 되지만, 이미 지급된 정산금 회수 또는 다음 정산에서 차감하는 실제 회계 처리가 없음. Payple 정산지급대행 명세(파트너 인증 → 계좌인증 → 빌링키 이체 대기 → 실행 → Webhook)를 활용해 정산 사이클 자동화 + 환불 차감 정책 구현.✨ 결정 필요 사항 (기획/회계 확정 필요)
정산 정책
tran_amt=1000고정. 운영 전환 시 검증 필요인프라
verify-account흐름은 Payple 실명인증만 호출. 정산지급대행 명세 2의 계좌인증은billing_tran_id반환 — 이걸SettlementAccount에 저장해야 지급이체 가능✨ 핵심 흐름 (구상)
✨ 개발 목록
Prisma 스키마
SettlementAccount.billing_tran_id String?추가 (계좌인증 응답 빌링키 저장)SettlementPayout모델 신규 — 정산 지급이체 이력Payple 정산지급대행 유틸 (
utils/payple-payout.ts신규)fetchPayoutAuth()— 파트너 인증 (code 10자리 영문+숫자, access_token 60초)fetchPayoutAccountVerification({ bankCode, accountNumber, accountHolderInfoType, accountHolderInfo })— 명세 2. 계좌인증, 빌링키(billing_tran_id) 반환requestPayoutDeposit({ billingTranId, tranAmt })— 명세 3. 이체 대기 요청, group_key 반환executePayout({ groupKey, billingTranId, executeType: 'NOW' })— 명세 4. 이체 실행billing_tran_id,access_token,api_tran_id등)빌링키 발급 통합
POST /settlements/issue-billing-key) — 분리 유지SettlementAccount.billing_tran_id에 저장 + 응답 마스킹Webhook 수신
POST /api/payouts/webhook신규 (Payple 이체 결과)SettlementPayout.status업데이트,api_tran_id저장정산 사이클 cron
src/settlements/jobs/settlement-payout.job.ts신규SettlementPayoutrow로 기록환수 회계 (환불 차감)
알림 / 리포트
환경변수
PAYPLE_PAYOUT_AUTH_PATH(필요 시)PAYPLE_PAYOUT_WEBHOOK_URL(등록용)PAYPLE_PAYOUT_MIN_AMOUNT(최소 정산 금액)PAYPLE_PAYOUT_CYCLE_CRON(사이클 cron 표현식)검증
pnpm build/pnpm tsc --noEmit✨ 별도 이슈로 분리 가능 (작업 분할)
범위가 크므로 단계별로 분리:
/payouts/webhook+ 멱등성)각 단계별로 PR 분할 권장.
✨ 기타 / 질문
PAYPLE_CST_ID/CUST_KEY재사용. 별도면 신규 env