@startuml

package domain {
    package model {

        class 申し込みフォーム
        class 申し込みフォームID
        enum 駅
        package fare {
            class 料金
            class 割引率
        }
        class 利用日
        class 距離
        enum 人数
        enum 片道往復
        enum 特急利用
        enum 年齢区分
    }

}

package application {
    package service {
        class 料金計算サービス
    }
}

package api {
    class ReserveController
}

class 申し込みフォーム {
    - 申し込みフォームID
    - 乗車駅 : 駅
    - 降車駅 : 駅
    - 利用日
    - 片道往復
    - 大人 : 人数
    - 子供 : 人数
    - 特急利用
}
class 申し込みフォームID {
    - id : String
}
enum 駅 {
    東京
    新大阪
    姫路
    --
    - 運賃 : 料金
    - 指定席ひかり料金 : 料金
    - のぞみ割り増し料金 : 料金
    - 距離
}
enum 特急利用 {
    利用しない
    ひかり指定席
    のぞみ指定席
    自由席
    --
    + {abstract} get特急料金(駅 降車駅) : 料金
}
enum 年齢区分 {
    おとな
    こども
    --
    - 運賃割引率 : 割引率
}
class 料金 {
    - 円 : int

    + 足す(料金) : 料金
    + 引く(料金) : 料金
    + かける(人数) : 料金
    + 割引(割引率) : 料金
}
class 割引率 {
    - パーセント : int

    ~ get百分率() : double
}
class 距離 {
    - キロメートル : int

    + 大なり(距離) : boolean
}
class 人数 {
    - 人数 : int

    + 足す(人数) : 人数
    + 引く(人数) : 人数
    + 大なりイコール(人数) : boolean
    + get無料人数() : 人数
}
enum 片道往復 {
    片道
    往復
    --
    + {abstract} 往復割引計算(料金 一人分片道運賃, 距離 _距離) : 料金
}
class 利用日 {
    LocalDate

    + isAfter(int month, int day) : boolean
    + isBefore(int month, int day) : boolean
}

class 料金計算サービス {
    --
    + 料金計算(降車駅, 利用日, 片道往復, 人数, 人数, 特急利用) : 料金
}

駅 <-- 特急利用
料金 --> 人数
料金 -> 割引率

@enduml