価格計算アルゴリズム仕様書¶
作成日: 2025年10月15日
更新日: 2025年10月15日
バージョン: 1.0
概要¶
リツビBtoB ECシステムにおける価格計算アルゴリズムの詳細仕様。SMILE現行システムの価格計算ロジックをVendureプラグインとして実装するための技術仕様。
価格計算の基本原則¶
計算順序¶
- 税抜き価格での計算: すべての価格計算は税抜きで実行
- 消費税の適用: 最終段階で消費税を適用
- 処理優先度: 図の下にある処理が優先される(後から適用される処理が優先)
価格マスタ構成¶
通常価格マスタ¶
- 用途: 標準的な商品価格設定
- 管理項目: 商品コード、通常価格、適用期間
単価マスタ¶
- 用途: 通常価格とは異なる特別価格設定
- 管理項目: 商品コード、特別価格、適用条件、顧客グループ制限
- 特徴: 通常価格を上書きする独立した価格管理システム
顧客グループ制限¶
現行システム制限¶
- 制限内容: 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連携仕様¶
データ変換処理¶
- セット商品の検出: セット商品を識別
- 個別商品への変換: A+B+C → [A, B, C]
- 価格の分配: セット価格を個別商品に分配
- エクスポート: 個別商品として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: 基本価格計算¶
- 通常価格マスタの実装
- 単価マスタの実装
- 基本的な価格計算ロジック
Phase 2: 特別価格処理¶
- price_chk_campain()関数の実装
- セット商品の特別価格計算
- 顧客グループ別価格制御
Phase 3: セット商品処理¶
- セット商品の定義と管理
- 個別商品への変換処理
- SMILE連携時のデータ変換
Phase 4: 高度な機能¶
- 同一ブランド商品の組み合わせ割引
- おまけ商品の処理
- 亜種パターンの実装
テスト仕様¶
単体テスト¶
- 価格計算ロジックのテスト
- セット商品変換のテスト
- 顧客グループ制限のテスト
統合テスト¶
- SMILE連携のテスト
- エンドツーエンドの価格計算テスト
- パフォーマンステスト