Python/票据理赔自动化/case.py

118 lines
3.8 KiB
Python

# -*- coding: utf-8 -*-
"""通用模块"""
from typing import Any, Dict, List
from decimal import Decimal, ROUND_HALF_UP
import pandas
from common import masterdata, rules_engine
def case_adjust(dossier: Dict[str, Any]) -> None:
"""
理算赔案并整合至赔案档案
:param dossier: 赔案档案
:return: 无
"""
# 基于拒付决策规则评估
if not (result := rules_engine.evaluate(decision="拒付", inputs=dossier)):
raise RuntimeError("该保险分公司未配置拒付规则")
dossier["adjustment_layer"].update(
{
"conclusion": (conclusion := result["conclusion"]), # 理赔结论
"explanation": result["explanation"], # 结论说明
}
)
if conclusion == "拒付":
return
# 赔案理算记录
adjustments = (
pandas.DataFrame(data=dossier["receipts_layer"]).assing(
adjustments=lambda dataframe: dataframe.apply(
lambda row: receipt_adjust(
row=row, liabilities=dossier["liabilities_layer"]
),
axis="columns",
) # 票据理算
)
).explode("adjustments", ignore_index=True)
print(adjustments)
def receipt_adjust(
row: pandas.Series, liabilities: List[Dict[str, Any]]
) -> List[Dict[str, Any]]:
"""
理算票据
:param row: 一张票据数据
:param liabilities: 理算责任
:return: 理算记录
"""
# 初始化票据理算记录
adjustments = []
# 初始化剩余个人自费金额
remaining_personal_self_payment = row["personal_self_payment"]
# 初始化剩余个人自付金额
remaining_non_medical_payment = row["non_medical_payment"]
# 初始化剩余合理金额
remaining_reasonable_amount = row["reasonable_amount"]
# 出险事故
accident = row["accident"]
# 出险人
accident_person = row["payer"]
# 出险日期
accident_date = row["date"]
# 查验状态
verification = row["verification"]
# 初始化理赔责任理算金额
adjustment_amount = Decimal("0.00")
# 初始化理赔责任理赔金额
claim_amount = Decimal("0.00")
# 遍历所有理赔责任,根据出险事故、出险人、出险日期和查验状态匹配责任
for liability in liabilities:
if (
accident == liability["accident"]
and accident_person == liability["insured_person"]
and liability["commencement_date"]
<= accident_date
<= liability["termination_date"]
and verification == "真票"
):
# 理赔责任理算金额
adjustment_amount = (
row["personal_self_payment"]
* liability["personal_self_ratio"] # 个人自费金额
+ row["non_medical_payment"]
* liability["non_medical_ratio"] # 个人自付金额
+ row["reasonable_amount"] * liability["reasonable_ratio"] # 合理金额
).quantize(
Decimal("0.00"),
rounding=ROUND_HALF_UP,
)
# 据变动保单唯一标识查询最新一条保额变动记录的变动后金额(理赔责任的理赔保单余额)
remaining_amount = masterdata.query_remaining_amount(
policy_guid=liability["policy_guid"],
)
# 理赔责任理赔金额
claim_amount = min(
remaining_amount,
adjustment_amount,
)
# 初始化票据理算记录
adjustment = {
"liability": liability["liability"], # 理赔责任名称
"type": row["就诊类型"],
"amount": row["合理金额"],
"payable": 0.0,
}
return adjustments