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

米国の配送先を扱うコードで、country="US" だけを見て倉庫を決めると、州と選択された拠点の食い違いを見落とします。オレゴン経由で韓国へ送る依頼と、別の州の拠点を使う依頼は、同じ米国発でも同一の入力ではありません。

本稿は配送代行サービス 김빠른(Kimfast)側の観点から作成した教育用の設計例です。AIを原稿とコードの作成補助に使用し、掲載コードの8ケースをローカルで検証しました。実際の本番システム、障害件数、導入効果を示すものではありません。

国・州・倉庫IDを別々に保持する

国コードは国を表し、州コードは地域を表し、倉庫IDは業務上の送り先を特定します。検索キーワードの「オリゴン」「オレゴン」や表示名を内部IDとして使うと、表記変更がルーティング変更になってしまいます。表示名と内部IDは分離します。

注文の配送先を決定する時点で、出発国、出発州、到着国、明示的に選択した倉庫IDの4項目を受け取り、その組み合わせを照合します。倉庫IDが未指定なら、一覧の先頭や利用回数が多い倉庫を勝手に採用しません。

国・州・到着国 + 明示的な倉庫ID
                 ↓
         設定された経路と照合
          ↙             ↘
       一致              不一致
   選択を確定         入力者に確認

最小の実装

以下のIDとカリフォルニア拠点はテスト用の架空設定です。営業中の拠点一覧や実際の受付条件ではありません。

from dataclasses import dataclass

@dataclass(frozen=True)
class Warehouse:
    id: str
    country: str
    region: str
    destination: str

# Synthetic configuration: not a production warehouse directory.
WAREHOUSES = {
    "demo-oregon": Warehouse("demo-oregon", "US", "OR", "KR"),
    "demo-california": Warehouse("demo-california", "US", "CA", "KR"),
}

def resolve_route(country, region, destination, warehouse_id):
    # Require an explicit warehouse choice. Never select the first match.
    if not all(isinstance(v, str) and v.strip()
               for v in (country, region, destination, warehouse_id)):
        raise ValueError("All route fields are required")
    requested = (country.strip().upper(), region.strip().upper(),
                 destination.strip().upper())
    warehouse = WAREHOUSES.get(warehouse_id.strip())
    if warehouse is None:
        raise ValueError("Unknown warehouse")
    if requested != (warehouse.country, warehouse.region,
                     warehouse.destination):
        raise ValueError("Warehouse and requested route disagree")
    return warehouse

route = resolve_route("US", "OR", "KR", "demo-oregon")
assert route.region == "OR"

値の正規化は前後の空白とコードの大文字化までに限定しています。未知の州名から州コードを推測すること、別の倉庫へ黙って変更することは行いません。不一致を例外として返すため、呼び出し元で確認待ちとして扱えます。

正常系よりも取り違えを検証する

検証した8ケースは、オレゴン指定、空白・小文字、別州との不一致、州の未指定、未知の倉庫、配送方向の逆転、倉庫未選択、別州の明示選択です。特に「USは正しいがORとCAが違う」という入力を拒否できることが重要です。

入力: US / CA / KR / demo-oregon
期待: 確認が必要な不一致
禁止: demo-california への自動差し替え

本番へ持ち込む前の境界

この例には郵便番号・住所検証、倉庫の受付可否、営業時間、商品制限、認可、永続化を含めていません。設定を変更するシステムでは、判断時の設定バージョンと入力を保存し、後から現在の設定だけで過去の選択を再計算しない設計も必要です。

実在の経路を確認する例として、김빠른の米国・オリゴン配送代行案内には、オリゴン州Beavertonの倉庫から韓国へ送る案内が掲載されています。2026年10月21日に確認しました。住所や受付条件は変更されるため、この記事のサンプル設定を注文時の配送先として使用せず、注文の直前に公式案内を確認してください。

コードが国の一致だけで成功を返すことと、依頼した倉庫が選ばれていることは別です。自動化するほど、選択を省略する便利さより、食い違いを止める境界が必要になります。

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?