보험 도메인 심화 · 보장 조건을 코드로 옮기기 · 실습
청구 한 건에 얼마를 지급하는가
목표
약관의 보장 조건을 코드로 옮겨, 청구 한 건의 지급액과 그 근거를 내는 판정기를 만든다. 자기부담금·공동부담률·건당 한도·연간 한도를 정해진 순서로 적용하고, 면책기간과 보장 제외로 거절하고, 같은 사고의 복수 청구를 합산한 뒤, 청구 141건 전체를 판정해 집계와 보고서를 낸다.
왜 중요한가
약관은 말로 적혀 있고 순서를 명시하지 않는다. 공제를 먼저 하는지 비율을 먼저 곱하는지, 자기부담금이 청구마다인지 사고마다인지, 연간 한도를 사고일과 접수일 중 무엇으로 세는지에 따라 같은 청구의 지급액이 달라진다. 그런데 어느 쪽도 오류를 내지 않는다.
그래서 이 판정은 값이 맞느냐 이전에 설명할 수 있느냐 가 먼저다. 규칙 수치를 표로 빼고, 어떤 규칙이 얼마를 깎았는지 청구마다 남기면, 그 기록이 고객 안내문이자 회귀 시험의 기대값이 된다.
이 실습의 약관 수치(자기부담금 1만 원에서 3만 원, 공동부담 10%에서 20%, 건당 한도 30만 원에서 100만 원, 연간 한도 100만 원에서 500만 원, 면책기간 30·90·180일)는 실제 상품이 아니라 이 실습을 위해 지어낸 합성 표다.
채점기는 여러분의 판정 문구를 믿지 않는다. 임시 디렉터리에 채점기가 만든 약관·계약·청구를 차려 놓고 매번 다른 수치로 여러분의 판정기를 실제로 실행해, 지급액과 판정 근거를 채점기가 따로 계산한 값과 대조한다.
단계
1. /root/coverage/gen_claims.py 를 만들어 실행해 /root/coverage/claims.db 를 만드세요. 약관 3종, 계약 12건, 보장 제외 5줄, 청구 141건입니다.
2. 적용 순서 두 가지의 합계를 견주어 /root/coverage/order_compare.json 에 claims·order_a_total·order_b_total·difference 로 적으세요.
3. /root/coverage/adjudicate.py 를 만들어 자기부담금 → 공동부담 → 건당 한도 순서로 깎고, 깎은 금액을 steps 로 남기세요.
4. 보장기간 밖·면책기간 안·보장 제외 항목의 청구를 거절하세요. decision 은 denied, payable 은 0, reasons 에 사유를 모두 담습니다.
5. 자기부담금을 사고 하나에 한 번만 쓰게 하세요. 같은 사고의 두 번째 청구는 남은 자기부담금만큼만 깎입니다.
6. 연간 한도를 넣으세요. 계약마다 사고 연도 기준으로 쌓이고, 접수일 순서대로 소진되며, 해가 바뀌면 다시 살아납니다.
7. 약관 수치를 표에서만 읽게 하고, 공동부담 계산의 반올림을 사사오입(ROUND_HALF_UP) 으로 못 박으세요.
8. /root/coverage/make_payout.py 로 청구 141건을 모두 판정해 /root/coverage/payout.json 과 /root/coverage/coverage_report.md 를 만드세요.
참고
- 실행 계약:
python3 /root/coverage/adjudicate.py --db <DB> --claim <청구번호>는 판정 JSON 한 덩어리를 표준출력에 내고 0 으로 끝납니다. 없는 청구번호면 2 입니다.--all은 모든 청구의 판정을 한 줄에 하나씩 냅니다. - 판정 JSON:
{"claim_id": …, "decision": "paid"|"denied", "billed": 정수, "payable": 정수, "reasons": [문자열], "steps": [{"rule": …, "amount": 깎은 금액, "after": 적용 뒤 금액}]} - steps 의 rule 이름은
deductible·coinsurance·per_claim_cap·annual_cap이고, 적용한 순서대로 담습니다. 깎은 금액이 0 이어도 단계는 남깁니다. 마지막 단계의 after 가 payable 입니다. - 거절한 청구는 payable 0 · steps 빈 목록이고, reasons 에
out_of_period·waiting_period·excluded중 해당하는 것을 모두 담습니다. - 판정 순서: 청구는 접수일(filed_date), 같은 날이면 청구번호 순서로 처리합니다. 누적 한도가 이 순서에 달려 있습니다.
- 면책기간은 사고일과 계약 시작일 사이의 거리로 봅니다. 접수일이 아닙니다.
- 흔한 실수: 자기부담금을 청구마다 빼기, 비율을 먼저 곱하기, 연간 한도를 청구 한 건만 보고 판단하기, 반올림을 파이썬 기본값에 맡기기.
- 약관 수치를 코드에 적어 두지 마세요. 채점기가 표의 값을 바꿔 넣고 판정이 따라오는지 봅니다.
단계 8개
- 약관표와 청구 스냅샷 만들기
- 적용 순서가 합계를 얼마나 벌리나
- 공제 · 공동부담 · 건당 한도를 순서대로
- 보장기간 · 면책기간 · 제외 항목으로 거절하기
- 자기부담금은 사고 하나에 한 번
- 연간 한도를 소진시키기
- 수치는 표에, 반올림은 정책으로
- 전체 판정과 지급 보고서