---
generated_at: 2026-02-24 23:15:00
metrics:
  claims_total: 93
  claims_with_evidence: 93
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：tax.csv

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：93 / 93、根拠なし：0
- 優先レビュー（高）
  1. **税率優先度ロジック（C-41〜C-45）**：複雑な優先度スコアリングロジックの網羅性確認推奨
  2. **複合税率（C-30, C-52）**：is_combinableフラグの複合税率処理の動作確認推奨
  3. **プロバイダエラーハンドリング（C-56, C-57）**：エラーパス分岐の網羅性確認推奨

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `packages/modules/tax/src/services/tax-module-service.ts`
- E-02: `packages/modules/tax/src/services/tax-provider.ts`
- E-03: `packages/modules/tax/src/providers/system.ts`
- E-04: `packages/modules/tax/src/loaders/providers.ts`
- E-05: `packages/modules/tax/src/models/tax-rate.ts`
- E-06: `packages/modules/tax/src/models/tax-rate-rule.ts`
- E-07: `packages/modules/tax/src/models/tax-region.ts`
- E-08: `packages/modules/tax/src/models/tax-provider.ts`
- E-09: `packages/modules/tax/src/index.ts`

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

### TaxModuleService - createTaxRates
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | 単一の税率を作成できること | E-01 (L85-111) | ○ |
| C-02 | 複数の税率を一括作成できること | E-01 (L99-111) Array.isArray判定 | ○ |
| C-03 | 税率とルールを同時に作成できること | E-01 (L113-155) createTaxRates_メソッド | ○ |
| C-04 | ルールが空配列の場合 | E-01 (L150-152) if (rulesToCreate.length > 0) | ○ |
| C-05 | rateがnullの場合 | E-05 (L8) rate: model.float().nullable() | ○ |

### TaxModuleService - updateTaxRates
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-06 | IDで税率を更新できること | E-01 (L157-191) updateTaxRates | ○ |
| C-07 | 複数IDで税率を一括更新できること | E-01 (L164-168) ids: string[]オーバーロード | ○ |
| C-08 | セレクタで税率を更新できること | E-01 (L170-174) FilterableTaxRatePropsオーバーロード | ○ |
| C-09 | ルールを更新できること | E-01 (L204-213) setTaxRateRulesForTaxRates呼び出し | ○ |
| C-10 | ルールを空配列に更新した場合 | E-01 (L243-245) if (rules.length === 0) return | ○ |

### TaxModuleService - upsertTaxRates
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-11 | 新規税率をupsertできること | E-01 (L283-305) upsertTaxRates | ○ |
| C-12 | 既存税率をupsertで更新できること | E-01 (L298) taxRateService_.upsert | ○ |
| C-13 | 複数の税率をupsertできること | E-01 (L283-286) Array対応オーバーロード | ○ |

### TaxModuleService - createTaxRegions
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-14 | 単一の税リージョンを作成できること | E-01 (L307-334) createTaxRegions | ○ |
| C-15 | 複数の税リージョンを一括作成できること | E-01 (L313-317) Array対応オーバーロード | ○ |
| C-16 | デフォルト税率付きで税リージョンを作成できること | E-01 (L341-365) prepareTaxRegionInputForCreate, createTaxRates | ○ |
| C-17 | 子リージョン（州）を作成できること | E-01 (L602-635) verifyProvinceToCountryMatch | ○ |
| C-18 | country_codeが小文字に正規化されること | E-01 (L595, L842-844) normalizeRegionCodes | ○ |
| C-19 | province_codeが小文字に正規化されること | E-01 (L592-594) normalizeRegionCodes | ○ |
| C-20 | 親リージョンが存在しない場合エラーになること | E-01 (L619-624) MedusaError INVALID_DATA | ○ |
| C-21 | 親リージョンと国コードが異なる場合エラーになること | E-01 (L626-631) MedusaError INVALID_DATA | ○ |

### TaxModuleService - createTaxRateRules
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-22 | 単一の税率ルールを作成できること | E-01 (L370-405) createTaxRateRules | ○ |
| C-23 | 複数の税率ルールを一括作成できること | E-01 (L375-379) Array対応オーバーロード | ○ |
| C-24 | product_type参照でルールを作成できること | E-06 (L12-13) reference, reference_idフィールド | ○ |
| C-25 | shipping_option参照でルールを作成できること | E-06 (L12-13), E-01 (L686-690) shipping_option参照 | ○ |

### TaxModuleService - getTaxLines
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-26 | 商品アイテムの税額行を取得できること | E-01 (L407-509) getTaxLines | ○ |
| C-27 | 配送の税額行を取得できること | E-01 (L445-446, L464-468) shipping_option_id判定 | ○ |
| C-28 | 商品と配送を混在して処理できること | E-01 (L489-500) items.map処理 | ○ |
| C-29 | 州レベルの税リージョンが優先されること | E-01 (L802-840) prioritizeRates | ○ |
| C-30 | is_combinableがtrueの場合に複合税率が適用されること | E-01 (L651-666) getTaxRatesForItem | ○ |
| C-31 | 商品IDに一致するルールが優先されること | E-01 (L818-819) priority_score = 1 | ○ |
| C-32 | 商品タイプIDに一致するルールが適用されること | E-01 (L820-821) priority_score = 2 | ○ |
| C-33 | デフォルト税率が適用されること | E-01 (L822-823, L828-829) is_default判定 | ○ |
| C-34 | 対象国の税リージョンが存在しない場合 | E-01 (L432-435) if (!parentRegion) return [] | ○ |
| C-35 | country_codeが小文字に正規化されること | E-01 (L552-565) normalizeTaxCalculationContext | ○ |
| C-36 | province_codeがnullでも処理できること | E-01 (L560-562) province_code null処理 | ○ |

### TaxModuleService - その他メソッド
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-37 | プロバイダを取得できること | E-01 (L511-513) getProvider | ○ |
| C-38 | 依存関係が正しく注入されること | E-01 (L63-82) constructor | ○ |
| C-39 | 大文字の国コードが小文字に変換されること | E-01 (L842-844) normalizeRegionCodes | ○ |
| C-40 | 既に小文字の国コードはそのまま返却されること | E-01 (L843) code.toLowerCase() | ○ |

### TaxModuleService - prioritizeRates
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-41 | 商品ルール一致かつ州レベルが最優先（スコア1）であること | E-01 (L818-819) priority_score = 1 | ○ |
| C-42 | 商品タイプルール一致かつ州レベルがスコア2であること | E-01 (L820-821) priority_score = 2 | ○ |
| C-43 | デフォルトかつ州レベルがスコア3であること | E-01 (L822-823) priority_score = 3 | ○ |
| C-44 | 商品ルール一致かつ国レベルがスコア4であること | E-01 (L824-825) priority_score = 4 | ○ |
| C-45 | デフォルトかつ国レベルがスコア6であること | E-01 (L828-829) priority_score = 6 | ○ |

### TaxModuleService - checkRuleMatches
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-46 | 商品ルール一致を検出できること | E-01 (L783-794) isProductMatch判定 | ○ |
| C-47 | 商品タイプルール一致を検出できること | E-01 (L786-788) product_type判定 | ○ |
| C-48 | 配送ルール一致を検出できること | E-01 (L777-781) shipping_option判定 | ○ |
| C-49 | ルールが空の場合すべてfalseであること | E-01 (L766-772) if (rate.rules.length === 0) | ○ |

### TaxModuleService - getTaxRatesForItem
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-50 | 税率が0件の場合空配列が返却されること | E-01 (L641-643) if (!rates.length) return [] | ○ |
| C-51 | is_combinable: falseの場合単一税率が返却されること | E-01 (L652-654) if条件 | ○ |
| C-52 | is_combinable: trueの場合親税率も含めて返却されること | E-01 (L655-666) parentRate取得 | ○ |

### TaxProviderService
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-53 | ロガーが正しく設定されること | E-02 (L17-21) constructor | ○ |
| C-54 | ロガーが未設定の場合consoleが使用されること | E-02 (L19-21) console as Logger | ○ |
| C-55 | 登録済みプロバイダを取得できること | E-02 (L24-26) retrieveProvider | ○ |
| C-56 | 未登録プロバイダの場合AwilixResolutionErrorでエラーが発生すること | E-02 (L27-36) AwilixResolutionError処理 | ○ |
| C-57 | その他のエラーの場合適切なメッセージでエラーが発生すること | E-02 (L38-43) エラーハンドリング | ○ |
| C-58 | プロバイダを使用して税額行を取得できること | E-02 (L46-54) getTaxLines | ○ |

### SystemTaxService
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-59 | 識別子'system'が返却されること | E-03 (L4, L6-8) identifier = "system" | ○ |
| C-60 | 商品アイテムの税額行を計算できること | E-03 (L10-25) getTaxLines itemLines処理 | ○ |
| C-61 | 配送の税額行を計算できること | E-03 (L27-38) shippingLines処理 | ○ |
| C-62 | 商品と配送を同時に処理できること | E-03 (L15-38) flatMap + concat | ○ |
| C-63 | 複数の税率が適用されること | E-03 (L17) l.rates.map | ○ |
| C-64 | rateがnullの場合0として処理されること | E-03 (L19, L31) r.rate || 0 | ○ |
| C-65 | 商品アイテムが0件の場合 | E-03 (L16) flatMap空配列 | ○ |
| C-66 | 税率が0件のアイテムの場合 | E-03 (L17) rates.map空配列 | ○ |
| C-67 | provider_idが正しく設定されること | E-03 (L23, L35) provider_id: this.getIdentifier() | ○ |

### providers.ts (ローダー)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-68 | プロバイダがコンテナに登録されること | E-04 (L17-36) registrationFn | ○ |
| C-69 | プラグインIDが指定された場合キーに含まれること | E-04 (L25-27) pluginOptions.id処理 | ○ |
| C-70 | identifierがないプロバイダの場合エラーになること | E-04 (L18-23) !klass?.identifier判定 | ○ |
| C-71 | ローカルプロバイダが登録されること | E-04 (L47-50) providers登録 | ○ |
| C-72 | 外部プロバイダが登録されること | E-04 (L52-56) moduleProviderLoader | ○ |
| C-73 | プロバイダがDBに登録されること | E-04 (L81-85) upsertData作成 | ○ |
| C-74 | 未登録のプロバイダが無効化されること | E-04 (L75-78) is_enabled: false | ○ |

### モデル定義 - TaxRate
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-75 | 税率モデルが正しく定義されていること | E-05 (L5-21) model.define | ○ |
| C-76 | rateがnull許容であること | E-05 (L8) model.float().nullable() | ○ |
| C-77 | is_defaultのデフォルト値がfalseであること | E-05 (L11) model.boolean().default(false) | ○ |
| C-78 | is_combinableのデフォルト値がfalseであること | E-05 (L12) model.boolean().default(false) | ○ |
| C-79 | 税率削除時にルールも削除されること | E-05 (L35-37) cascades: delete: ["rules"] | ○ |
| C-80 | 同一リージョンに複数のデフォルト税率を作成できないこと | E-05 (L29-33) IDX_single_default_region unique | ○ |

### モデル定義 - TaxRateRule
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-81 | 税率ルールモデルが正しく定義されていること | E-06 (L4-14) model.define | ○ |
| C-82 | 同一税率に同一参照IDで複数ルールを作成できないこと | E-06 (L21-26) IDX_tax_rate_rule_unique_rate_reference unique | ○ |

### モデル定義 - TaxRegion
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-83 | 税リージョンモデルが正しく定義されていること | E-07 (L10-33) model.define | ○ |
| C-84 | province_codeがnull許容であること | E-07 (L14) model.text().nullable() | ○ |
| C-85 | 子リージョンにプロバイダを設定できないこと | E-07 (L36-38) CK_tax_region_provider_top_level | ○ |
| C-86 | 子リージョンにprovince_codeが必須であること | E-07 (L39-42) CK_tax_region_country_top_level | ○ |
| C-87 | 同一国・州コードの組み合わせは一意であること | E-07 (L44-49) IDX_tax_region_unique_country_province | ○ |
| C-88 | 同一国コードで省略なし（国レベル）は一意であること | E-07 (L50-56) IDX_tax_region_unique_country_nullable_province | ○ |
| C-89 | 税リージョン削除時に子リージョンも削除されること | E-07 (L58-60) cascades: delete: ["children"] | ○ |
| C-90 | 税リージョン削除時に税率も削除されること | E-07 (L58-60) cascades: delete: ["tax_rates"] | ○ |

### モデル定義 - TaxProvider
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-91 | 税プロバイダモデルが正しく定義されていること | E-08 (L4-10) model.define | ○ |
| C-92 | is_enabledのデフォルト値がtrueであること | E-08 (L6) model.boolean().default(true) | ○ |

### モジュールエクスポート
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-93 | モジュールが正しくエクスポートされること | E-09 (L5-8) Module export | ○ |

## 4) 不足情報（Unknown / Missing）
- なし（すべてのテストケースにソースコード上の根拠が確認できた）

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - すべてのテストケースがソースコードに基づいており、根拠が明確

以下の点は特に注意してレビューすることを推奨：
1. **税率優先度ロジック（prioritizeRates）**: 6段階のスコアリングは複雑であり、実際の動作確認が重要
2. **複合税率（is_combinable）処理**: 親税率の取得ロジックが期待通りに動作するか確認
3. **プロバイダエラーハンドリング**: AwilixResolutionErrorと一般エラーの分岐が正しくテストされること
4. **モデルの制約**: DB制約（ユニーク、チェック）は統合テストでの確認も推奨

## 6) レビュアーチェックリスト（最小）
- [ ] TaxModuleServiceの各publicメソッドに対するテストケースが網羅されているか
- [ ] 税率優先度の6段階スコアリング（prioritizeRates）のロジックが正しく理解されているか
- [ ] is_combinable=trueの複合税率処理が正しくテストされているか
- [ ] プロバイダの登録・取得・エラーハンドリングが網羅されているか
- [ ] モデルの制約（ユニークインデックス、チェック制約、カスケード削除）が網羅されているか
- [ ] 国コード・州コードの正規化（小文字化）がテストされているか
- [ ] 境界値（空配列、null値、存在しないリソース）がテストされているか
