コンテンツにスキップ

価格計算アルゴリズム仕様書

作成日: 2025年10月15日
更新日: 2025年10月15日
バージョン: 1.0

概要

リツビBtoB ECシステムにおける価格計算アルゴリズムの詳細仕様。SMILE現行システムの価格計算ロジックをVendureプラグインとして実装するための技術仕様。

価格計算の基本原則

計算順序

  1. 税抜き価格での計算: すべての価格計算は税抜きで実行
  2. 消費税の適用: 最終段階で消費税を適用
  3. 処理優先度: 図の下にある処理が優先される(後から適用される処理が優先)

価格マスタ構成

通常価格マスタ

  • 用途: 標準的な商品価格設定
  • 管理項目: 商品コード、通常価格、適用期間

単価マスタ

  • 用途: 通常価格とは異なる特別価格設定
  • 管理項目: 商品コード、特別価格、適用条件、顧客グループ制限
  • 特徴: 通常価格を上書きする独立した価格管理システム

顧客グループ制限

現行システム制限

  • 制限内容: 1つの顧客は1つの顧客グループにのみ所属可能
  • 移行要件: Vendureシステムでも同様の制限を維持
  • 実装方法: Vendureの顧客管理機能で1グループ制限を実装

特別価格計算処理

price_chk_campain() 関数

  • 定義: システム側で自動設定される特別価格計算条件
  • 対象: セット商品(ユニーク商品)のみ
  • 実行タイミング: 通常の価格計算後に適用
  • 実装場所: Vendureカスタムプラグイン

処理内容

interface PriceCheckCampaign {
  // セット商品の特別価格計算
  calculateSetPrice(setProduct: SetProduct): number;

  // ユニーク商品の特別条件チェック
  checkUniqueProductConditions(product: Product): boolean;

  // 特別価格の適用
  applySpecialPricing(price: number, conditions: PricingConditions): number;
}

商品セット処理

セット商品の定義

  • 購入時: 商品セット(X=A+B+C)として扱う
  • SMILE連携時: 分裂した商品(A, B, C)として個別にエクスポート
  • データ変換: セット→個別商品への変換処理が必要

セット商品パターン

基本パターン

  • 形式: A+B+C
  • 処理: 3つの商品を組み合わせたセット価格

おまけ付きパターン

  • 形式: A+B+C(+Dおまけ)
  • 処理: 基本セットにおまけ商品Dを追加

亜種パターン

  • 対象商品1割引: 特定商品に対して10%割引
  • 除外条件: 特別安い設定の顧客には適用しない
  • 実装: 顧客グループ別の割引適用制御

ブランド別価格管理

RCODE(商品ブランド)

  • 定義: 商品ブランドの一つ
  • 管理: 複数ブランドの価格計算に対応
  • 価格設定: ブランド別の価格体系

同一ブランド商品の組み合わせ

  • パターン: 同一ブランド商品×点数の組み合わせ割引
  • : 同一ブランド商品3点購入で割引適用
  • 実装: ブランド別の数量割引ロジック

Vendure実装仕様

カスタムプラグイン構成

価格計算プラグイン

// 価格計算のメインプラグイン
export class PriceCalculationPlugin implements VendurePlugin {
  // 単価マスタ管理
  // 特別価格計算
  // セット商品処理
}

セット商品プラグイン

// セット商品の管理と変換
export class SetProductPlugin implements VendurePlugin {
  // セット商品の定義
  // 個別商品への変換
  // SMILE連携時のデータ変換
}

顧客グループ制限プラグイン

// 顧客グループの制限管理
export class CustomerGroupRestrictionPlugin implements VendurePlugin {
  // 1グループ制限の実装
  // 顧客グループ変更の制御
}

データベース設計

単価マスタテーブル

CREATE TABLE unit_price_master (
  id UUID PRIMARY KEY,
  product_id UUID NOT NULL,
  special_price DECIMAL(10,2) NOT NULL,
  customer_group_id UUID,
  valid_from TIMESTAMP,
  valid_to TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

セット商品テーブル

CREATE TABLE set_products (
  id UUID PRIMARY KEY,
  set_code VARCHAR(50) NOT NULL,
  set_name VARCHAR(255) NOT NULL,
  individual_products JSONB NOT NULL, -- [A, B, C]の配列
  created_at TIMESTAMP DEFAULT NOW()
);

SMILE連携仕様

データ変換処理

  1. セット商品の検出: セット商品を識別
  2. 個別商品への変換: A+B+C → [A, B, C]
  3. 価格の分配: セット価格を個別商品に分配
  4. エクスポート: 個別商品としてSMILEに送信

連携データ形式

{
  "order_id": "ORD-12345",
  "products": [
    {
      "product_code": "A",
      "quantity": 1,
      "unit_price": 1000,
      "total_price": 1000
    },
    {
      "product_code": "B",
      "quantity": 1,
      "unit_price": 2000,
      "total_price": 2000
    }
  ]
}

実装優先度

Phase 1: 基本価格計算

  1. 通常価格マスタの実装
  2. 単価マスタの実装
  3. 基本的な価格計算ロジック

Phase 2: 特別価格処理

  1. price_chk_campain()関数の実装
  2. セット商品の特別価格計算
  3. 顧客グループ別価格制御

Phase 3: セット商品処理

  1. セット商品の定義と管理
  2. 個別商品への変換処理
  3. SMILE連携時のデータ変換

Phase 4: 高度な機能

  1. 同一ブランド商品の組み合わせ割引
  2. おまけ商品の処理
  3. 亜種パターンの実装

テスト仕様

単体テスト

  • 価格計算ロジックのテスト
  • セット商品変換のテスト
  • 顧客グループ制限のテスト

統合テスト

  • SMILE連携のテスト
  • エンドツーエンドの価格計算テスト
  • パフォーマンステスト

関連ドキュメント