コード
Controllers/AutoInsuranceController.cs
using Microsoft.AspNetCore.Mvc;
using InsuranceProductManager.Models;
using System;
using System.Collections.Generic;
using System.Linq;
namespace InsuranceProductManager.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class AutoInsuranceController : ControllerBase
{
// 架空の料率テーブル
private readonly List<AutoInsuranceRate> _rateTable = new()
{
new AutoInsuranceRate { VehicleClass = "軽自動車", AgeGroup = "全年齢", BaseRate = 0.06m, GenderFactorMale = 1.05m, GenderFactorFemale = 1.00m },
new AutoInsuranceRate { VehicleClass = "軽自動車", AgeGroup = "21歳以上", BaseRate = 0.05m, GenderFactorMale = 1.03m, GenderFactorFemale = 1.00m },
new AutoInsuranceRate { VehicleClass = "軽自動車", AgeGroup = "26歳以上", BaseRate = 0.04m, GenderFactorMale = 1.00m, GenderFactorFemale = 0.98m },
new AutoInsuranceRate { VehicleClass = "普通車", AgeGroup = "全年齢", BaseRate = 0.08m, GenderFactorMale = 1.07m, GenderFactorFemale = 1.00m },
new AutoInsuranceRate { VehicleClass = "普通車", AgeGroup = "21歳以上", BaseRate = 0.07m, GenderFactorMale = 1.05m, GenderFactorFemale = 1.00m },
new AutoInsuranceRate { VehicleClass = "普通車", AgeGroup = "26歳以上", BaseRate = 0.06m, GenderFactorMale = 1.02m, GenderFactorFemale = 0.98m }
};
[HttpPost("calculate")]
public ActionResult<AutoInsuranceCalculationResult> Calculate(AutoInsuranceCalculationRequest request)
{
// 該当する料率を取得
var rate = _rateTable.FirstOrDefault(r =>
r.VehicleClass == request.VehicleClass &&
r.AgeGroup == request.AgeGroup
);
if (rate == null)
{
return BadRequest("該当する料率が見つかりません。");
}
// 性別補正
decimal genderFactor = request.Gender == "男性" ? rate.GenderFactorMale : rate.GenderFactorFemale;
// 等級割引・割増(20等級で-60%、1等級で+60%という例)
decimal gradeFactor = request.Grade switch
{
>= 20 => 0.40m,
>= 15 => 0.60m,
>= 10 => 0.80m,
>= 6 => 1.00m,
_ => 1.60m
};
// 走行距離補正
decimal mileageFactor = request.AnnualMileage switch
{
<= 5000 => 0.95m,
<= 10000 => 1.00m,
<= 15000 => 1.05m,
_ => 1.10m
};
// オプション補正
decimal optionFactor = 1.00m;
if (request.IncludeVehicleDamage) optionFactor += 0.25m;
if (request.IncludePersonalInjury) optionFactor += 0.15m;
if (request.IncludeLawyerService) optionFactor += 0.05m;
// 年間保険料計算(仮の計算式)
decimal annualPremium = 300000 * rate.BaseRate * genderFactor * gradeFactor * mileageFactor * optionFactor;
// 総保険料
decimal totalPremium = annualPremium * request.Years;
// 詳細内訳
string details = $"車種: {request.VehicleClass}, 年齢条件: {request.AgeGroup}, 性別: {request.Gender}, " +
$"基本料率: {rate.BaseRate:P}, 等級補正: {gradeFactor}, 走行距離補正: {mileageFactor}, オプション補正: {optionFactor}";
return new AutoInsuranceCalculationResult
{
AnnualPremium = Math.Round(annualPremium, 0),
TotalPremium = Math.Round(totalPremium, 0),
Details = details
};
}
}
}
解説
Controllers/AutoInsuranceController.cs
// 該当する料率を取得
var rate = _rateTable.FirstOrDefault(r =>
r.VehicleClass == request.VehicleClass &&
r.AgeGroup == request.AgeGroup
);
上記で_rateTableから基本料率、男性補正と女性補正を取得。
Controllers/AutoInsuranceController.cs
// 性別補正
decimal genderFactor = request.Gender == "男性" ? rate.GenderFactorMale : rate.GenderFactorFemale;
request.Genderが男性か女性で、genderFactorに性別補正を代入。
Controllers/AutoInsuranceController.cs
// 等級割引・割増(20等級で-60%、1等級で+60%という例)
decimal gradeFactor = request.Grade switch
{
>= 20 => 0.40m,
>= 15 => 0.60m,
>= 10 => 0.80m,
>= 6 => 1.00m,
_ => 1.60m
};
request.Gradeの等級によって、割引・割増(0.40m等)を行う。
Controllers/AutoInsuranceController.cs
decimal mileageFactor = request.AnnualMileage switch
{
<= 5000 => 0.95m,
<= 10000 => 1.00m,
<= 15000 => 1.05m,
_ => 1.10m
};
request.AnnualMileageの数値によって、割引・割増(0.95m等)を行う。
Controllers/AutoInsuranceController.cs
// オプション補正
decimal optionFactor = 1.00m;
if (request.IncludeVehicleDamage) optionFactor += 0.25m;
if (request.IncludePersonalInjury) optionFactor += 0.15m;
if (request.IncludeLawyerService) optionFactor += 0.05m;
requestの各変数がtrueであれば、オプション係数を+0.25します。
Controllers/AutoInsuranceController.cs
// 年間保険料計算(仮の計算式)
decimal annualPremium = 300000 * rate.BaseRate * genderFactor * gradeFactor * mileageFactor * optionFactor;
// 総保険料
decimal totalPremium = annualPremium * request.Years;
掛け算をしてannualPremium、totalPremiumに代入しています。
Controllers/AutoInsuranceController.cs
// 詳細内訳
string details = $"車種: {request.VehicleClass}, 年齢条件: {request.AgeGroup}, 性別: {request.Gender}, " +
$"基本料率: {rate.BaseRate:P}, 等級補正: {gradeFactor}, 走行距離補正: {mileageFactor}, オプション補正: {optionFactor}";
各計算結果に各文字列(車種:)を合わせた内容をdetailsに代入しています。
Controllers/AutoInsuranceController.cs
return new AutoInsuranceCalculationResult
{
AnnualPremium = Math.Round(annualPremium, 0),
TotalPremium = Math.Round(totalPremium, 0),
Details = details
};
上記のReturn文の内容が画面で取得できます。