注文計算方式設計
概要
EC-SPOKEシステムにおける注文計算方式の設計仕様です。ECCUBEと異なる単一カート方式(単一決済方式)を採用し、親注文・子注文のリレーション管理による責任境界を明確にした計算システムを定義します。
基本方針
単一カート方式(単一決済方式)
- 採用理由: ECCUBEと異なるアプローチで、より柔軟な価格計算と責任境界の明確化を実現
- 特徴: 注文時にレジ種別ごとに子注文を生成し、リレーション管理を行う
- 計算の複雑さ: 単一カート方式は計算が複雑になるが、明確な責任境界線により管理可能
親注文・子注文のリレーション管理
責任境界線
送料系(子注文単位)
| 項目 | 責任範囲 | 説明 |
|---|---|---|
| 送料 | 子注文(レジ種別毎) | 各レジ種別ごとに送料を計算・管理 |
| 送料無料条件 | 子注文(レジ種別毎) | レジ種別ごとの送料無料条件を適用 |
手数料
| 項目 | 責任範囲 | 説明 |
|---|---|---|
| 代引手数料 | 子注文(レジ種別毎) | 各レジ種別ごとの代引手数料 |
| 決済手数料 | 親注文 | 全体の決済手数料 |
| 購読管理手数料 | 子注文(レジ種別毎) | レジ種別ごとの購読管理手数料 |
| ギフト包装料 | 子注文(レジ種別毎) | レジ種別ごとのギフト包装料 |
課税対象別値引(子注文単位)
| 項目 | 責任範囲 | 説明 |
|---|---|---|
| 課税対象別値引 | 子注文(レジ種別毎) | 各レジ種別ごとの課税対象値引 |
全体対象値引グループ(親注文単位)
| 項目 | 責任範囲 | 説明 |
|---|---|---|
| 全体対象値引 | 親注文 | 注文全体に適用される値引 |
| クーポン値引 | 親注文 | クーポンによる値引 |
| ポイント値引 | 親注文 | ポイントによる値引 |
責任境界線の修正
各項目の責任境界線の修正は、それぞれの管理画面にて行います。
メール送信の責任
注文メール
- 送信単位: 親注文単位
- 対象: フロントでの注文履歴表示
- 内容: 注文全体の情報
部分出荷メール
- 送信単位: 子注文単位
- 対象: 部分出荷時の通知
- 内容: 該当する子注文の情報のみ
全体出荷メール
- 送信単位: 親注文単位
- 対象: 全体出荷時の通知
- 制限: 部分出荷メールが送信済みの場合、親注文からは出荷メール送信は不可
端数処理設定
端数処理設定の種類
EC-SPOKEでは、計算用途に応じて2種類の端数処理設定を使い分けます。
| 設定種類 | 用途 | 適用場面 |
|---|---|---|
| 税込計算用端数処理設定 | 税抜価格から税込価格を計算する際の端数処理 | 商品価格の税込表示、カート内の商品単価表示、フロントエンドでの価格表示 |
| レジ計算用端数処理設定 | レジ計算(注文確定時)の各種計算での端数処理 | 不課税分の按分計算、送料計算、手数料計算、値引計算、最終的な税率別集計 |
設定方法
- 管理画面での設定: それぞれ独立して設定可能
- デフォルト値: 四捨五入
- 本計算時の適用: 注文確定時はレジ計算用端数処理設定に従う
端数処理の種類
| 処理方式 | 説明 |
|---|---|
| 四捨五入 | 0.5以上を切り上げ |
| 切上げ | 0.1以上を切り上げ |
| 切捨て | 小数点以下を切り捨て |
適格請求書対応の計算ルール
明細種別と課税区分
| 明細種別 | 課税区分 | 説明 |
|---|---|---|
| 商品 | 課税 | 商品本体の価格(税率: 10%、8%など) |
| 送料 | 課税 | 配送料 |
| 手数料 | 課税 | 各種手数料 |
| 課税対象別値引 | 課税 | 課税対象の値引 |
| カート値引 | 不課税 | カート全体の値引 |
| クーポン | 不課税 | クーポンによる値引 |
| ポイント | 不課税 | ポイントによる値引 |
課税区分について
- 課税区分は「課税」または「不課税」の2種類のみ
- 0%税率は存在しない(非課税は「不課税」として扱う)
- 税率の種類: 課税商品は10%、8%など複数税率が混在可能(課税区分はすべて「課税」)
明細行フォーマット
明細行
明細区分 商品名 商品コード 商品単価 数量 税率 課税区分 小計
==
商品合計
送料合計
手数料合計
値引き合計
==
課税対象合計
カート値引
XXXクーポン
XXXクーポン
ポイント
==
お支払い合計
==
税率N%対象 XXX円 内消費税 XXX円
税率M%対象 XXX円 内消費税 XXX円
不課税分の按分計算
不課税分(カート値引、クーポン、ポイント)については、税率毎のパーセンテージに応じた按分計算により税率対象金額を決定し、そこから消費税額を計算します。
計算手順
1. 税率毎の課税対象合計を算出
各税率(例: 10%、8%)ごとに課税対象金額を集計します。
2. 課税合計毎のパーセンテージを算出
税率ごとのパーセンテージ = (税率ごとの課税対象合計 / 全課税対象合計)
【例】
課税対象合計: 1000.000円
- 10%税率: 800.000円 → 0.80000 (80.000%)
- 8%税率: 200.000円 → 0.20000 (20.000%)
3. 不課税分合計を按分
各税率への按分金額 = 不課税分合計 × パーセンテージ
【例】
不課税分合計: 100.000円
- 10%税率への按分: 100.000 × 0.80000 = 80.000円
- 8%税率への按分: 100.000 × 0.20000 = 20.000円
4. 端数処理を適用
レジ計算用端数処理設定(四捨五入/切上/切捨て)に従い、按分金額を処理します。
【例: 四捨五入の場合】
- 10%税率: round(80.000, 3) = 80.000円
- 8%税率: round(20.000, 3) = 20.000円
合計: 80.000 + 20.000 = 100.000円 → ✓ 一致
計算精度の保証
保存精度
DECIMAL(10, 3)(小数点以下3桁)で一貫して保存・計算- 詳細は価格計算設計を参照
合計一致の保証
3桁精度で一貫して保存・計算する限り、数学的に合計は必ず一致します。
数学的証明:
不課税分 × (税率A金額 / 課税対象合計) + 不課税分 × (税率B金額 / 課税対象合計)
= 不課税分 × [(税率A金額 + 税率B金額) / 課税対象合計]
= 不課税分 × (課税対象合計 / 課税対象合計)
= 不課税分 × 1
= 不課税分
したがって、端数処理方式(四捨五入/切上/切捨て)に関わらず、按分計算後の合計は必ず不課税分合計と一致します。
複数税率の扱い
注文内に複数の税率(例: 10%、8%)が混在する場合の扱いについて説明します。
計算順序
- 計算順序は存在しない: 各税率の計算は数学的に等価であり、処理順序に依存しない
- 並列処理可能: 各税率ごとに独立して計算し、最終的に合計
処理方法
【例: 10%税率と8%税率が混在する場合】
1. 各税率ごとに課税対象金額を集計
- 10%税率: 800.000円
- 8%税率: 200.000円
2. 各税率ごとに不課税分を按分
- 10%税率への按分: 80.000円
- 8%税率への按分: 20.000円
3. 各税率ごとに税込金額を計算
- 10%税率: (800.000 + 80.000) × 1.10 = 968.000円(内消費税: 88.000円)
- 8%税率: (200.000 + 20.000) × 1.08 = 237.600円(内消費税: 17.600円)
4. 最終合計を算出
- お支払い合計: 968.000 + 237.600 = 1,205.600円
エラーハンドリング
例外ケース
全課税対象合計が0円の場合
- 按分計算をスキップ(按分対象が存在しないため、除算エラーを回避)
- 不課税分のみの注文として処理
特定の税率の課税対象合計が0円の場合
- その税率は計算対象外(按分計算・表示ともにスキップ)
- 他の税率への按分計算は通常通り実行
不課税分合計が0円の場合
- 按分計算をスキップ(結果はすべての税率で0円)
- 課税対象のみの注文として処理
計算例(複数税率で一部が0円の場合)
課税対象合計: 1000.000円
- 10%税率: 1000.000円
- 8%税率: 0.000円(商品なし → 非表示)
不課税分合計: 100.000円
按分計算:
- 10%税率: 100.000 × (1000.000 / 1000.000) = 100.000円
- 8%税率: 計算・表示スキップ(課税対象が0円のため)
最終表示:
==
税率10%対象 1,100.000円 内消費税 100.000円
(8%税率の行は非表示)
関連ドキュメント
今後の拡張予定
TODO
- [ ] 親注文・子注文のテーブル設計詳細
- [ ] 計算ロジックのクラス設計
- [ ] 明細行生成の実装詳細
- [ ] メール送信機能の実装詳細
- [ ] 管理画面での責任境界線修正機能
- [ ] 適格請求書のPDF生成機能
更新日: 2025-10-29 バージョン: 1.1 作成者: EC-SPOKE開発チーム