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?

【保険商品管理システムの開発】自動車保険のコントローラーの作成

Posted at

コード

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文の内容が画面で取得できます。

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?