0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【保険商品管理システムの開発】自動車保険の計算処理サービスを解説

0
Posted at

コード

Services/AutoPremiumCalculator.cs
using InsuranceProductManager2.Models;
using System;

namespace InsuranceProductManager2.Services
{
    public class AutoPremiumCalculator : IAutoPremiumCalculator
    {
        public AutoPremiumCalculationResult CalculatePremium(Customer customer, AutoInsurancePolicy policy)
        {
            decimal baseRate = 0.02m; // 自動車保険の基準料率(例)

            // 年齢補正
            decimal ageFactor = policy.DriverAgeCategory switch
            {
                "全年齢" => 1.5m,
                "21歳以上" => 1.2m,
                "26歳以上" => 1.0m,
                _ => 1.0m
            };

            // 車の年式による補正
            int carAge = DateTime.Now.Year - policy.CarYear;
            decimal carAgeFactor = carAge > 10 ? 1.2m : 1.0m;

            // 事故歴補正
            decimal accidentFactor = policy.HasAccidentHistory ? 1.3m : 1.0m;

            // 等級補正(1〜20)
            decimal gradeFactor = 1.0m - (policy.GradeLevel - 6) * 0.03m;
            if (gradeFactor < 0.6m) gradeFactor = 0.6m;

            // 契約期間補正
            int termYears = policy.EndDate.Year - policy.StartDate.Year;
            decimal termFactor = 1.0m + (termYears / 10m) * 0.05m;

            // 年間保険料計算
            decimal annualPremium = policy.InsuredValue * baseRate * ageFactor * carAgeFactor * accidentFactor * gradeFactor * termFactor;

            return new AutoPremiumCalculationResult
            {
                CustomerId = customer.CustomerId,
                PolicyId = policy.PolicyId,
                InsuredValue = policy.InsuredValue,
                AnnualPremium = Math.Round(annualPremium, 0),
                BaseRate = baseRate,
                AgeFactor = ageFactor,
                CarAgeFactor = carAgeFactor,
                AccidentFactor = accidentFactor,
                GradeFactor = gradeFactor,
                TermFactor = termFactor,
                StartDate = policy.StartDate,
                EndDate = policy.EndDate,
                CalculatedAt = DateTime.Now
            };
        }
    }
}

🔷全体の役割

• CalculatePremium メソッドで、顧客 (Customer) と契約情報 (AutoInsurancePolicy) を入力に、計算結果 (AutoPremiumCalculationResult) を出力します。

🔷インターフェース

Services/AutoPremiumCalculator.cs
    public class AutoPremiumCalculator : IAutoPremiumCalculator

• IAutoPremiumCalculator(インターフェース)を実装するクラス。

🔹 1️⃣ baseRate(基準料率)

Services/AutoPremiumCalculator.cs
decimal baseRate = 0.02m;

• 基本の保険料率。
• m は decimal 型リテラル(金額計算に使う高精度型)。小数点を含む値を正確に表現するためのものです。

🔹 2️⃣ 年齢補正(ageFactor)

Services/AutoPremiumCalculator.cs
decimal ageFactor = policy.DriverAgeCategory switch
{
    "全年齢" => 1.5m,
    "21歳以上" => 1.2m,
    "26歳以上" => 1.0m,
    _ => 1.0m
};

• switch 式で運転者の年齢区分ごとにリスク補正。
• 若いほど事故リスクが高く、保険料が上がる(1.5倍など)。

🔹 3️⃣ 車の年式による補正(carAgeFactor)

Services/AutoPremiumCalculator.cs
int carAge = DateTime.Now.Year - policy.CarYear;
decimal carAgeFactor = carAge > 10 ? 1.2m : 1.0m;

• 車の経過年数を計算し、古い車(10年以上)は補正 1.2倍。
 → 故障・事故リスク増。

🔹 4️⃣ 事故歴補正(accidentFactor)

Services/AutoPremiumCalculator.cs
decimal accidentFactor = policy.HasAccidentHistory ? 1.3m : 1.0m;

• 事故歴があれば保険料1.3倍。
 → リスクが高いため。

🔹 5️⃣ 等級補正(gradeFactor)

Services/AutoPremiumCalculator.cs
decimal gradeFactor = 1.0m - (policy.GradeLevel - 6) * 0.03m;
if (gradeFactor < 0.6m) gradeFactor = 0.6m;

• 等級(1〜20)に応じて割引。
 等級が高いほど(安全運転者)割引される。
• 下限は 0.6(つまり最大で40%割引まで)。

🔹 6️⃣ 契約期間補正(termFactor)

Services/AutoPremiumCalculator.cs
int termYears = policy.EndDate.Year - policy.StartDate.Year;
decimal termFactor = 1.0m + (termYears / 10m) * 0.05m;

• 契約が長期になるほど少し割増(例:10年で+5%)。
• 長期間の補償コストを考慮。

🔹 7️⃣ 年間保険料の算出

Services/AutoPremiumCalculator.cs
decimal annualPremium = policy.InsuredValue * baseRate
    * ageFactor * carAgeFactor * accidentFactor * gradeFactor * termFactor;

• 全ての補正を掛け合わせた結果が年間保険料。

🔹 8️⃣ 結果の返却

Services/AutoPremiumCalculator.cs
return new AutoPremiumCalculationResult
{
    CustomerId = customer.CustomerId,
    PolicyId = policy.PolicyId,
    InsuredValue = policy.InsuredValue,
    AnnualPremium = Math.Round(annualPremium, 0), // 四捨五入
    ...
    CalculatedAt = DateTime.Now
};

保険料や各補正要素を AutoPremiumCalculationResult モデルにまとめて返す。
• 小数点は四捨五入して整数に。

🔹 このクラスの構造的な意図

構成要素 意味
IAutoPremiumCalculator 保険料計算サービスの共通インターフェース
AutoPremiumCalculator その具体的な実装クラス
Customer, AutoInsurancePolicy 入力データモデル
AutoPremiumCalculationResult 計算結果モデル
CalculatePremium 実際に保険料を計算するメソッド

🔹 まとめ

このクラスは:
• 責務が明確(計算だけを担当)
• 保守性が高い(補正ルールを簡単に変更可能)
• DI(依存性注入)対応(IAutoPremiumCalculator 経由で利用)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?