Create costs.py
Browse files- services/costs.py +32 -0
services/costs.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
import os
|
| 4 |
+
from typing import Literal
|
| 5 |
+
|
| 6 |
+
Mode = Literal["Walk", "Transit", "Drive/Taxi"]
|
| 7 |
+
|
| 8 |
+
def _get_float(name: str, default: float) -> float:
|
| 9 |
+
try:
|
| 10 |
+
return float(os.getenv(name, default))
|
| 11 |
+
except Exception:
|
| 12 |
+
return default
|
| 13 |
+
|
| 14 |
+
# デフォルト(東京の概算)— 環境変数で上書き可
|
| 15 |
+
TAXI_BASE_FARE = _get_float("TAXI_BASE_FARE", 500.0) # 初乗り
|
| 16 |
+
TAXI_PER_KM = _get_float("TAXI_PER_KM", 320.0) # 1kmあたり
|
| 17 |
+
TAXI_PER_MIN = _get_float("TAXI_PER_MIN", 0.0) # 分課金があれば
|
| 18 |
+
|
| 19 |
+
TRANSIT_BASE = _get_float("TRANSIT_BASE_FARE", 210.0) # 乗車初乗り
|
| 20 |
+
TRANSIT_PER_KM= _get_float("TRANSIT_PER_KM", 25.0) # 1kmあたり(概算)
|
| 21 |
+
|
| 22 |
+
def estimate_leg_cost(mode: Mode, distance_km: float, duration_min: float, fare_hint: float | None = None) -> float:
|
| 23 |
+
"""1区間の概算費用(JPY)を返す。公共交通はAPIのfare_hint優先。"""
|
| 24 |
+
if mode == "Walk":
|
| 25 |
+
return 0.0
|
| 26 |
+
if mode == "Drive/Taxi":
|
| 27 |
+
return TAXI_BASE_FARE + TAXI_PER_KM * max(0.0, distance_km) + TAXI_PER_MIN * max(0.0, duration_min)
|
| 28 |
+
if mode == "Transit":
|
| 29 |
+
if fare_hint is not None:
|
| 30 |
+
return float(fare_hint)
|
| 31 |
+
return TRANSIT_BASE + TRANSIT_PER_KM * max(0.0, distance_km)
|
| 32 |
+
return 0.0
|