feat: 수수료 공식 갭 보완 + 8종 신규모듈 풀스택 (V116~V123)
수수료 공식 갭분석(5 병렬감사) 후 확정 버그 3건 수정 + 개념적으로 빠진 모듈 8종 풀스택 구현. [확정 버그 3건] - 1200% 누적한도(checkContractTotal)를 배치 CalcRecruitStep에 연결(기존 1차년 한도만 적용 → 두 한도 중 더 제한적인 값으로 clip+이연). +CalcRecruitStepTest - BatchInstallmentPlanGenerator planMonth 반영(하드코딩 1 제거, API판과 동일). +단위테스트 - PersistencyBonus 임계유지율 게이트 + FIXED 정액 룰 도출. +PersistencyBonusServiceTest [신규 모듈 8종] - MOD-1 도입수수료(recruiter/development) / MOD-2 선지급·차익정산 / MOD-3 환수 분할상환 - MOD-4 익월부활 재지급 / MOD-5 정산대사 입수 / MOD-6 환수 시효 / MOD-7 환수 감면 - MOD-8 채널별 수수료차등(sales_channel) 각 DB(테이블+메뉴+권한+공통코드)→VO/Mapper/Enum→Service/Controller→화면 풀스택. 배치 정산연계: AggregateStep에 도입/익월부활 가산(11종), 선지급 FIFO 상계(멱등 reverse), MOD-8 채널 우선 요율조회(NULL 폴백 하위호환). [검증] - 전체 ./gradlew build(전 모듈+전 테스트) GREEN - Flyway V116~V123 운영DB 적용(schema v115→v123) - 라이브 스모크 8 GET=200, MOD-1 RATE공식 50000 실측, 액션 POST 5xx 0건 - 적대적 코드리뷰 APPROVED(MOD-8 계산기 미연결 버그 발견·수정) 스펙: docs/DOMAIN_GAP_MOD1-8.md Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -18,9 +18,10 @@ import { agentApi } from '@/api/agent';
|
||||
export default function ContractList() {
|
||||
const actionRef = useRef<ActionType>();
|
||||
const [open, setOpen] = useState(false);
|
||||
const { data: insuranceCodes = [] } = useCommonCodes('INSURANCE_TYPE');
|
||||
const { data: statusCodes = [] } = useCommonCodes('CONTRACT_STATUS');
|
||||
const { data: payCycleCodes = [] } = useCommonCodes('PAY_CYCLE');
|
||||
const { data: insuranceCodes = [] } = useCommonCodes('INSURANCE_TYPE');
|
||||
const { data: statusCodes = [] } = useCommonCodes('CONTRACT_STATUS');
|
||||
const { data: payCycleCodes = [] } = useCommonCodes('PAY_CYCLE');
|
||||
const { data: salesChannelCodes = [] } = useCommonCodes('SALES_CHANNEL');
|
||||
|
||||
// 등록 모달용 - 상품/설계사 옵션
|
||||
const { data: products } = useQuery({
|
||||
@@ -74,6 +75,10 @@ export default function ContractList() {
|
||||
render: (_, r) => <CodeBadge groupCode="PAY_CYCLE" value={r.payCycle} />,
|
||||
},
|
||||
{ title: '계약일', dataIndex: 'contractDate', width: 110, search: false },
|
||||
{
|
||||
title: '판매채널', dataIndex: 'salesChannel', width: 110, search: false,
|
||||
render: (_, r) => r.salesChannelName ?? r.salesChannel ?? '-',
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
@@ -138,6 +143,13 @@ export default function ContractList() {
|
||||
<ProFormDatePicker name="contractDate" label="계약일" width="md" />
|
||||
<ProFormDatePicker name="effectiveDate" label="효력발생일" width="md" />
|
||||
</ProForm.Group>
|
||||
<ProFormSelect
|
||||
name="salesChannel"
|
||||
label="판매채널"
|
||||
width="md"
|
||||
options={salesChannelCodes.map((c) => ({ value: c.code, label: c.codeName }))}
|
||||
placeholder="선택 안 함(직판 기본)"
|
||||
/>
|
||||
</ModalForm>
|
||||
</PageContainer>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user