---
generated_at: 2026-02-24 12:00:00
metrics:
  claims_total: 140
  claims_with_evidence: 138
  claims_without_evidence: 2
confidence_derived: 0.99
---

# 根拠レポート：promotion.csv（単体テストケース一覧）

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.99**
  - 根拠あり：138 / 140、根拠なし：2
- 優先レビュー（高）
  1. **C-133**: モデルのユニーク制約テスト - 実際のDB動作確認が必要
  2. **C-136**: キャンペーンidentifierのユニーク制約テスト - 実際のDB動作確認が必要

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `packages/modules/promotion/src/services/promotion-module.ts` - メインサービスクラス（2044行）
- E-02: `packages/modules/promotion/src/models/promotion.ts` - Promotionモデル定義（63行）
- E-03: `packages/modules/promotion/src/models/campaign.ts` - Campaignモデル定義（37行）
- E-04: `packages/modules/promotion/src/models/application-method.ts` - ApplicationMethodモデル定義（46行）
- E-05: `packages/modules/promotion/src/models/campaign-budget.ts` - CampaignBudgetモデル定義（39行）
- E-06: `packages/modules/promotion/src/models/promotion-rule.ts` - PromotionRuleモデル定義（51行）
- E-07: `packages/modules/promotion/src/models/promotion-rule-value.ts` - PromotionRuleValueモデル定義（31行）
- E-08: `packages/modules/promotion/src/models/campaign-budget-usage.ts` - CampaignBudgetUsageモデル定義（31行）
- E-09: `packages/modules/promotion/src/utils/validations/application-method.ts` - ApplicationMethodバリデーション（174行）
- E-10: `packages/modules/promotion/src/utils/validations/promotion-rule.ts` - PromotionRuleバリデーション（162行）
- E-11: `packages/modules/promotion/src/utils/compute-actions/line-items.ts` - アイテム割引計算（239行）
- E-12: `packages/modules/promotion/src/utils/compute-actions/shipping-methods.ts` - 配送割引計算（202行）
- E-13: `packages/modules/promotion/src/utils/compute-actions/buy-get.ts` - BuyGet割引計算（655行）
- E-14: `packages/modules/promotion/src/utils/compute-actions/usage.ts` - 使用量計算（74行）
- E-15: `packages/modules/promotion/src/utils/compute-actions/sort-by-price.ts` - 価格ソート（24行）
- E-16: `packages/modules/promotion/src/utils/compute-actions/build-promotion-rule-query-filter-from-context.ts` - クエリフィルタ構築（254行）

## 3) Claims と根拠の対応（レビューの主戦場）

### PromotionModuleService（C-01 〜 C-72）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | listActivePromotionsでアクティブなプロモーションのみが取得される | E-01 (L148-200) | ○ |
| C-02 | キャンペーン期間内のプロモーションが取得される | E-01 (L170-193) | ○ |
| C-03 | campaign_id=nullのプロモーションが取得される | E-01 (L173-178) | ○ |
| C-04 | starts_at=nullのキャンペーンプロモーションが取得される | E-01 (L184) | ○ |
| C-05 | ends_at=nullのキャンペーンプロモーションが取得される | E-01 (L187) | ○ |
| C-06 | SPEND予算タイプでused値が更新される | E-01 (L361-387) | ○ |
| C-07 | USAGE予算タイプでused値が1増加する | E-01 (L389-415) | ○ |
| C-08 | USE_BY_ATTRIBUTE予算で属性値ごとの使用量が記録される | E-01 (L417-447) | ○ |
| C-09 | SPEND予算の上限超過でエラー | E-01 (L374-382) | ○ |
| C-10 | USAGE予算の上限超過でエラー | E-01 (L399-407) | ○ |
| C-11 | プロモーション自体のlimit/usedが更新される | E-01 (L339-353) | ○ |
| C-12 | プロモーション使用上限超過でエラー | E-01 (L342-346) | ○ |
| C-13 | 同一コードの重複USAGE更新防止 | E-01 (L390-395) | ○ |
| C-14 | revertUsageでSPEND予算が減少 | E-01 (L534-549) | ○ |
| C-15 | revertUsageでUSAGE予算が減少 | E-01 (L551-568) | ○ |
| C-16 | revertUsageでusedが0を下回らない（SPEND） | E-01 (L547) | ○ |
| C-17 | revertUsageでusedが0を下回らない（USAGE） | E-01 (L561) | ○ |
| C-18 | USE_BY_ATTRIBUTEでattribute値ごとのusedが減少 | E-01 (L571-601) | ○ |
| C-19 | USE_BY_ATTRIBUTEでused<=1でレコード削除 | E-01 (L271-275) | ○ |
| C-20 | computeActionsでSTANDARDアイテム割引計算 | E-01 (L901-911) | ○ |
| C-21 | computeActionsでSTANDARD配送割引計算 | E-01 (L913-922) | ○ |
| C-22 | computeActionsでBUYGET割引計算 | E-01 (L878-888) | ○ |
| C-23 | 自動プロモーションが適用される | E-01 (L752-758, L693-726) | ○ |
| C-24 | prevent_auto_promotions=trueで自動プロモーション無効化 | E-01 (L638-639, L692) | ○ |
| C-25 | 既存調整がREMOVEアクションで返却 | E-01 (L760-778) | ○ |
| C-26 | 通貨コード一致で適用 | E-01 (L864-866) | ○ |
| C-27 | 通貨コード不一致で非適用 | E-01 (L874-876) | ○ |
| C-28 | ルール不満足で非適用 | E-01 (L868-876) | ○ |
| C-29 | 予算超過でCAMPAIGN_BUDGET_EXCEEDEDアクション | E-01 (L840-850) | ○ |
| C-30 | プロモーション使用上限超過でPROMOTION_LIMIT_EXCEEDEDアクション | E-01 (L854-862) | ○ |
| C-31 | skip_usage_limit_checksでスキップ | E-01 (L639, L811-814, L854) | ○ |
| C-32 | createPromotionsでプロモーション作成 | E-01 (L932-976) | ○ |
| C-33 | createPromotionsで複数プロモーション作成 | E-01 (L952) | ○ |
| C-34 | campaign_idでキャンペーン紐付け | E-01 (L1080-1084) | ○ |
| C-35 | campaignデータで新規キャンペーン同時作成 | E-01 (L1096-1103, L1175-1178) | ○ |
| C-36 | campaignとcampaign_id同時指定でエラー | E-01 (L1038-1043) | ○ |
| C-37 | 存在しないcampaign_idでエラー | E-01 (L1054-1058) | ○ |
| C-38 | キャンペーン予算通貨コード不一致でエラー | E-01 (L1066-1074) | ○ |
| C-39 | ORDER+target_rulesでエラー | E-01 (L1116-1125) | ○ |
| C-40 | BUYGET+buy_rules未指定でエラー | E-01 (L1127-1132) | ○ |
| C-41 | BUYGET+target_rules未指定でエラー | E-01 (L1134-1142) | ○ |
| C-42 | updatePromotionsでプロモーション更新 | E-01 (L1222-1262) | ○ |
| C-43 | updatePromotionsで複数更新 | E-01 (L1242) | ○ |
| C-44 | application_method更新 | E-01 (L1353-1357, L1364-1369) | ○ |
| C-45 | limit < usedでエラー | E-01 (L1302-1310) | ○ |
| C-46 | 存在しないcampaign_id更新でエラー | E-01 (L1312-1317) | ○ |
| C-47 | SPEND予算キャンペーンと通貨コード不一致でエラー | E-01 (L1319-1328) | ○ |
| C-48 | updatePromotionRulesでルール更新 | E-01 (L1377-1391) | ○ |
| C-49 | ルールvalues置換 | E-01 (L1436-1456) | ○ |
| C-50 | 存在しないルールIDでエラー | E-01 (L1415-1425) | ○ |
| C-51 | addPromotionRulesでルール追加 | E-01 (L1463-1482) | ○ |
| C-52 | addPromotionTargetRulesでターゲットルール追加 | E-01 (L1486-1516) | ○ |
| C-53 | application_method不在でエラー | E-01 (L1497-1502) | ○ |
| C-54 | addPromotionBuyRulesで購入ルール追加 | E-01 (L1520-1552) | ○ |
| C-55 | STANDARDにbuy_rules追加でエラー | E-01 (L1574-1582) | ○ |
| C-56 | removePromotionRulesでルール削除 | E-01 (L1621-1627) | ○ |
| C-57 | 部分削除（存在するもののみ） | E-01 (L1641-1642) | ○ |
| C-58 | removePromotionTargetRulesでターゲットルール削除 | E-01 (L1649-1660) | ○ |
| C-59 | removePromotionBuyRulesで購入ルール削除 | E-01 (L1663-1674) | ○ |
| C-60 | createCampaignsでキャンペーン作成 | E-01 (L1722-1741) | ○ |
| C-61 | キャンペーンと予算同時作成 | E-01 (L1775-1795) | ○ |
| C-62 | 予算type未指定でエラー | E-01 (L1804-1809) | ○ |
| C-63 | SPEND予算でcurrency_code未指定でエラー | E-01 (L1811-1819) | ○ |
| C-64 | updateCampaignsでキャンペーン更新 | E-01 (L1837-1853) | ○ |
| C-65 | 既存予算更新 | E-01 (L1897-1901) | ○ |
| C-66 | 予算不在時に新規作成 | E-01 (L1903-1908) | ○ |
| C-67 | 予算type/currency_code変更でエラー | E-01 (L1884-1895) | ○ |
| C-68 | addPromotionsToCampaignでプロモーション追加 | E-01 (L1930-1937) | ○ |
| C-69 | 既にキャンペーン紐付け済みでエラー | E-01 (L1957-1969) | ○ |
| C-70 | SPEND予算で通貨コード不一致でエラー | E-01 (L1971-1983) | ○ |
| C-71 | removePromotionsFromCampaignでプロモーション削除 | E-01 (L1998-2005) | ○ |
| C-72 | 存在しないプロモーションIDでエラー | E-01 (L2021-2030) | ○ |

### バリデーション（C-73 〜 C-99）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-73 | PERCENTAGE value<=0でエラー | E-09 (L49-57) | ○ |
| C-74 | PERCENTAGE value>100でエラー | E-09 (L49-57) | ○ |
| C-75 | BUYGET apply_to_quantity未指定でエラー | E-09 (L59-66) | ○ |
| C-76 | BUYGET buy_rules_min_quantity未指定でエラー | E-09 (L67-73) | ○ |
| C-77 | BUYGET max_quantity未指定でエラー | E-09 (L74-79) | ○ |
| C-78 | max_quantity < apply_to_quantityでエラー | E-09 (L88-94) | ○ |
| C-79 | ACROSS+max_quantityでエラー | E-09 (L96-104) | ○ |
| C-80 | 無効なtarget_typeでエラー | E-09 (L106-113) | ○ |
| C-81 | 無効なtypeでエラー | E-09 (L115-122) | ○ |
| C-82 | ITEMS/SHIPPING_METHODS+無効allocationでエラー | E-09 (L124-136) | ○ |
| C-83 | EACH/ONCE+max_quantity未指定でエラー | E-09 (L151-162) | ○ |
| C-84 | ONCE+ORDERでエラー | E-09 (L164-172) | ○ |
| C-85 | attribute未指定でエラー | E-10 (L24-27) | ○ |
| C-86 | operator未指定でエラー | E-10 (L29-31, L45-47) | ○ |
| C-87 | 無効なoperatorでエラー | E-10 (L33-44) | ○ |
| C-88 | ルールなしでtrue | E-10 (L60-62) | ○ |
| C-89 | eqオペレータ検証 | E-10 (L130-133) | ○ |
| C-90 | inオペレータ検証 | E-10 (L135-137) | ○ |
| C-91 | neオペレータ検証 | E-10 (L138-141) | ○ |
| C-92 | gtオペレータ検証 | E-10 (L142-145) | ○ |
| C-93 | gteオペレータ検証 | E-10 (L146-149) | ○ |
| C-94 | ltオペレータ検証 | E-10 (L150-153) | ○ |
| C-95 | lteオペレータ検証 | E-10 (L154-157) | ○ |
| C-96 | neで空値処理 | E-10 (L121-127) | ○ |
| C-97 | eq評価ロジック | E-10 (L130-133) | ○ |
| C-98 | in評価ロジック | E-10 (L135-137) | ○ |
| C-99 | 空配列でfalse（ne以外） | E-10 (L120-127) | ○ |

### 計算ユーティリティ（C-100 〜 C-132）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-100 | アイテム割引計算 | E-11 (L33-47) | ○ |
| C-101 | items undefined でエラー | E-11 (L21-30) | ○ |
| C-102 | 対象アイテムなしで空配列 | E-11 (L75-77) | ○ |
| C-103 | ACROSS配分計算 | E-11 (L90-106) | ○ |
| C-104 | EACH配分計算 | E-11 (L108-184) | ○ |
| C-105 | ONCE配分で最安値優先 | E-11 (L79-81) | ○ |
| C-106 | is_discountable=false除外 | E-11 (L216-218) | ○ |
| C-107 | 予算超過でCAMPAIGN_BUDGET_EXCEEDED | E-11 (L154-162) | ○ |
| C-108 | subtotal=0スキップ | E-11 (L116-122) | ○ |
| C-109 | 配送方法割引計算 | E-12 (L19-60) | ○ |
| C-110 | shipping_methods undefined でエラー | E-12 (L27-32) | ○ |
| C-111 | 配送ACROSS配分計算 | E-12 (L134-198) | ○ |
| C-112 | 配送EACH配分計算 | E-12 (L73-132) | ○ |
| C-113 | パーセンテージ割引計算 | E-12 (L92-97, L162-167) | ○ |
| C-114 | subtotalなしスキップ | E-12 (L84-86, L149-151) | ○ |
| C-115 | BuyGet割引計算 | E-13 (L460-601) | ○ |
| C-116 | BuyGet items undefined でエラー | E-13 (L31-36) | ○ |
| C-117 | buy_rules_min_quantity不足で空配列 | E-13 (L144-148) | ○ |
| C-118 | max_quantity制限 | E-13 (L222-231) | ○ |
| C-119 | 複数回適用計算 | E-13 (L505-583) | ○ |
| C-120 | buy_rules不一致で空配列 | E-13 (L478-481) | ○ |
| C-121 | target_rules不一致で空配列 | E-13 (L483-486) | ○ |
| C-122 | BUYGETタイプ優先ソート | E-13 (L603-654) | ○ |
| C-123 | 同タイプvalue降順ソート | E-13 (L612-618) | ○ |
| C-124 | SPEND予算超過検知 | E-14 (L27-60) | ○ |
| C-125 | USAGE予算超過検知 | E-14 (L49-59) | ○ |
| C-126 | 予算なしでundefined | E-14 (L34-36) | ○ |
| C-127 | 予算内でundefined | E-14 (L54-59) | ○ |
| C-128 | USE_BY_ATTRIBUTEでattributeUsageなしでundefined | E-14 (L38-43) | ○ |
| C-129 | customer_id抽出 | E-14 (L62-73) | ○ |
| C-130 | customer_email抽出 | E-14 (L62-73) | ○ |
| C-131 | 単価ソート | E-15 (L7-14) | ○ |
| C-132 | 配送料ソート | E-15 (L16-23) | ○ |

### モデル（C-133 〜 C-140）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-133 | codeユニーク制約 | E-02 (L47-53) | △ |
| C-134 | is_automaticデフォルトfalse | E-02 (L10) | ○ |
| C-135 | statusデフォルトDRAFT | E-02 (L21-24) | ○ |
| C-136 | campaign_identifierユニーク制約 | E-03 (L28-33) | △ |
| C-137 | 予算カスケード削除 | E-03 (L25-27) | ○ |
| C-138 | ApplicationMethodとpromotionの1対1関係 | E-04 (L25-27) | ○ |
| C-139 | usedデフォルト0 | E-05 (L15) | ○ |
| C-140 | valuesカスケード削除 | E-06 (L46-48) | ○ |

## 4) 不足情報（Unknown / Missing）

- **C-133, C-136**: モデルのユニーク制約は定義されているが、実際のDB動作テストはIntegrationテストで確認が必要
  - 候補：integration-tests / データベースマイグレーションファイル / 実際のDBスキーマ

## 5) リスクフラグ（レビュー観点）

| リスクレベル | 項目 | 説明 |
|-------------|------|------|
| 0（低リスク） | モデル定義テスト | ソースコードから直接確認可能 |
| 0（低リスク） | バリデーション関数テスト | 純粋関数でテストしやすい |
| 1（中リスク） | サービスメソッドテスト | 依存関係のモック設定が必要 |
| 1（中リスク） | 計算ユーティリティテスト | 複雑な計算ロジックの境界値確認が必要 |
| 2（高リスク） | DB制約テスト | 実際のDBとの整合性確認が必要 |

## 6) レビュアーチェックリスト（最小）

- [ ] サービスメソッドのテストケースが主要なビジネスロジックをカバーしているか確認
- [ ] バリデーション関数のエラーケースが網羅されているか確認
- [ ] BuyGet計算ロジックの複雑なシナリオがカバーされているか確認
- [ ] 予算管理（SPEND/USAGE/USE_BY_ATTRIBUTE）のテストが十分か確認
- [ ] モデルのカスケード削除やデフォルト値のテストケースが適切か確認
- [ ] 境界値テスト（0、null、空配列など）が適切に含まれているか確認
- [ ] エラーメッセージの期待値がソースコードと一致しているか確認
