WS-G 정산·인센티브 월렛 v1 — 완료 (PR #9)
FR-2 첫 슬라이스. 건별 수익에서 운영유지비(reserve_pct%) 공제 → 대표·상담원·고객지원금 3자 분배. 상담원 화면엔 본인 수령액만.
핵심: 비노출을 '스키마 분리'로 강제
- 상담원 표면(WalletDealOut/WalletMeOut/DealCreatedOut)에 gross/reserve/owner 필드가 정의 자체가 없음 → FastAPI response_model이 원천 차단(마스킹 아님).
- 전체 분배는 manager+ 전용 GET /wallet/summary(WalletDealFull)에서만.
- 스키마 필드 부재를 코드로도 증명 완료.
API
- POST /t/{tenant}/deals — 분배 합계 보존 검증(422)·개통완료 리드 전제(422)·권한(consultant=자기 딜만, manager+=대리) + DealAudit
- GET /wallet/me?month= — 본인 딜·월 합계(비노출)
- GET /wallet/summary?month= — 전체 분배(manager+)
- PATCH /deals/{id} — 재배분(manager+, 합계 재검증) + 감사 / GET /deals/{id}/audit
무결성
consultant + customer_support + owner == gross − floor(gross×reserve_pct/100). KST 월경계는 WS-D kpi와 동일 규약을 services/month.py로 추출·공유.
v1 컷 준수
급여룰·수습단가·오버라이드·다단법인(FR-2.4/2.5/2.9)·결제자동매칭(2.8) 비범위. Console disposition '딜기록' 연결은 WS-F Console.tsx 충돌 회피 위해 미접촉(선택사항).
회귀
백엔드 pytest 151 passed(134+17) · 프론트 vitest 78 passed(75+3) · tsc+vite build OK. 공용파일 append-only(§4) 준수(기존 줄 삭제 0), 동결파일 미접촉.
PR: https://github.com/shinjadong/callcenter-os/pull/9 · 브랜치 feat/ws-g-wallet · 머지는 PM 세션(우선순위 F>J>G>H>I).