3. Calculate メソッドの流れ
3. 基本保険料計算
var basePremium = (request.BuildingCoverage * 10000 + request.HouseholdCoverage * 10000) * rate.BaseRate;
• 建物補償金額と家財補償金額を合計(万円→円に変換)し、基本料率を掛けて年間基本保険料を算出
4. 建物年数による補正
decimal buildingAgeFactor = request.BuildingAge switch
{
<= 5 => 1.00m,
<= 10 => 1.05m,
<= 20 => 1.10m,
_ => 1.20m
};
• 建物が古くなるほど保険料が高くなるよう補正
1. request.BuildingAge switch
• switch 式 は、C# 8.0 以降で使える新しい構文です。
• switch に渡された値(ここでは request.BuildingAge)を条件に照らして一致するパターンを探し、その結果を返します。
2. <= 5 => 1.00m
• 「もし BuildingAge が 5以下 なら 1.00m を返す」という意味です。
• 1.00m の m は「decimal型の定数ですよ」という印です。
3. 他の条件
<= 10 => 1.05m, // 10以下なら 1.05
<= 20 => 1.10m, // 20以下なら 1.10
• 順番に上から評価され、最初にマッチしたものが採用されます。
4. _ => 1.20m
• _ は「ワイルドカード(何でも)」です。
• つまり「上記のどの条件にも当てはまらなかった場合は 1.20m を返す」という意味です。
5. オプション加算
decimal optionFactor = 1.00m;
if (request.IncludeEarthquake) optionFactor += 0.30m;
if (request.IncludeFlood) optionFactor += 0.10m;
• 地震特約(+30%)
• 水害特約(+10%)
6. 免責額による割引
decimal deductibleDiscount = request.Deductible switch
{
>= 100000 => 0.95m,
>= 50000 => 0.97m,
_ => 1.00m
};
• 免責額が高いほど保険料が安くなる(例:10万円免責 → 5%割引)
1. >= 100000 => 0.95m
• もし Deductible(免責金額)が 100,000円以上 なら 0.95 を返します。
• これは「保険料を 95% にする」という意味で、5% 割引のことです。
2. >= 50000 => 0.97m
• もし 50,000円以上 かつ 100,000円未満 の場合は 0.97(3% 割引)を返します。
• 先に >= 100000 がチェックされるので、50,000〜99,999 の範囲だけが該当します。
7. 年間保険料・総保険料計算
decimal annualPremium = basePremium * rate.AgeFactor * rate.CoverageFactor * buildingAgeFactor * optionFactor * deductibleDiscount;
decimal totalPremium = annualPremium * request.Years;
• 年間保険料を算出し、契約年数分掛けて総額を計算
8. 計算詳細メッセージ作成
string details = $"構造: {request.StructureType}, 地域: {region}, 基本料率: {rate.BaseRate:P}, 建物年数補正: {buildingAgeFactor}, オプション補正: {optionFactor}, 免責割引: {deductibleDiscount}";
9. レスポンス返却
return new FireInsuranceCalculationResult
{
AnnualPremium = Math.Round(annualPremium, 0),
TotalPremium = Math.Round(totalPremium, 0),
Details = details
};