コンテンツにスキップ

商流ルールシミュレーター価格遷移フロー仕様

背景

Dashboard の商流ルールシミュレーターでは、価格決定ロジックのプレビューをツリー構造で表示していた。しかし運用上この画面で確認したいのは、どのルールが親子関係にあるかではなく、基準価格から最終価格までどの順序で価格が変化したかである。

このため、価格決定ロジックのプレビューはツリーではなく、価格遷移フローとして表示する。

対象画面

  • React Dashboard
  • /commercial-rules/simulator

要件

1. 表示形式

  • 価格決定ロジックは親子ツリーではなく、縦方向のフローで表示する。
  • 基準価格から最終価格までの遷移をステップバイステップで示す。

2. 表示項目

各ステップで以下の情報を表示する:

  • ステップ名(ルール名、または「基準価格」「最終価格」)
  • 変化後の価格
  • 変動額(オプション)
  • 適用されたルールの詳細リンク(オプション)

3. ビジュアルデザイン

  • フローの各ステップは視覚的に連結される(矢印やラインを使用)。
  • 価格が増加したか減少したかを色分け(例:増加は赤、減少は青)で表現する。

4. カート全体合計の表示

multi-line + order-level 調整 + 直送加算が混在する場合、focus line の 3 段モデル (上代 / SMILE 後 / 最終)だけでは cart 全体の最終金額を読み取れない。そのため 行別結果と注文効果セクションの間に カート合計セクション を必ず表示する。

表示項目は engine 出力 CommercialSimulationState の cart-level 4 値を 4-card grid で並べる:

カード engine field 補足
値引前合計 cartOriginalTotal Σ listUnitPrice × quantity (preview/gift 除く)
行値引合計 lineDiscountTotal SMILE + commercial rule の per-line 値引
注文調整合計 orderAdjustmentTotal add_order_amount の cart 全体調整
最終合計(強調表示) cartFinalTotal 行合計 + 注文調整 (直送加算込み)

直送加算 (direct_shipping_surcharge) は per-line で finalUnitPrice に既に 組み込まれているため、最終合計には自動的に内包される(別カード化はしない)。

実装方針

コンポーネント構成

  • PriceTransitionFlow: 全体のコンテナ
  • PriceTransitionStep: 各ステップの表示コンポーネント
  • CartTotalsSection: カート全体合計の 4-card セクション (SimulationPage.tsx 内、LineResultsSectionOrderEffectsSection の間に配置)

データ構造

シミュレーション結果から遷移フロー表示用のフラットな配列を生成するロジックを実装する。 カート合計は simulateCommercialRules の戻り値 (cartOriginalTotal / lineDiscountTotal / orderAdjustmentTotal / cartFinalTotal) をそのまま使用する (GraphQL クエリで取得済み、追加 fetch 不要)。