純資産増減ウォーターフォール実装計画
- ブランチ:
claude/implement-net-assets-waterfall-81XYK - 目的: ウォーターフォールチャートでJリーグクラブの純資産増減を可視化
| # | 項目 | 状態 | 詳細 |
|---|
| 1 | 端数調整を当期純利益に吸収 | ✅ 完了 | 調整バーを表示せず、discrepancyをnetIncomeに含める |
| 2 | 利益剰余金調整も当期純利益に吸収 | ✅ 完了 | retainedEarningsChangeもnetIncomeに含める |
| 3 | 下部サマリーコメント削除 | ✅ 完了 | variance-summaryセクションを削除 |
| 4 | 高さ固定 | ✅ 完了 | CHART_HEIGHT=220pxで固定(年度切り替えで変わらないように) |
| 5 | 資本変動ラベル変更 | ✅ 完了 | 「増資等」「減資等」→「資本金等の増減」に統一 |
| # | 項目 | 優先度 | 状態 | 詳細 |
|---|
| 1 | parseInt radix追加 | Low | ✅ 完了 | parseInt(p.label) → parseInt(p.label, 10) |
| 2 | 色定数化 | Medium | ✅ 完了 | COLORSオブジェクトに抽出 |
| 3 | ResizeObserver エラーハンドリング | Medium | ✅ 完了 | try-catchでフォールバック |
| 4 | ツールチップ位置調整 | Low | ✅ 完了 | コンテナからはみ出ないように |
| 5 | discrepancy閾値定数化 | Medium | ✅ 完了 | 調整バー自体を削除したため不要に |
| # | 項目 | 優先度 | 状態 | 詳細 |
|---|
| 1 | テストと実装の不一致 | P0 🔴 | ✅ 完了 | テストが古いロジックを検証している |
| 2 | テストのラベル期待値更新 | P0 🔴 | ✅ 完了 | "増資等"→"資本金等の増減" |
| 3 | Dead Code削除 | P1 🟡 | ✅ 完了 | retainedEarningsChangeのチェックブロック |
| 4 | getRawData()のメモ化 | P1 🟡 | ✅ 完了 | computedで再利用 |
| 5 | ARIAラベル追加 | P2 🟢 | ✅ 完了 | アクセシビリティ改善 |
| 6 | Nullチェック改善 | P2 🟢 | ✅ 完了 | 一貫性のある記述に |
| 7 | 負の純資産でコネクター表示 | P0 🔴 | ✅ 完了 | runningTotalでY座標計算 |
| # | 項目 | 状態 | 詳細 |
|---|
| 1 | クラブ切り替え時の年度保持 | ✅ 完了 | URLクエリパラメータ?year=2020で状態を保持 |
| 2 | クラブ切り替え時のタブ保持 | ✅ 完了 | URLクエリパラメータ?tab=net-assetsで状態を保持 |
| 3 | クエリパラメータを年度形式に変更 | ✅ 完了 | period=14→year=2024で直感的に |
| # | 項目 | 状態 | 詳細 |
|---|
| 1 | チャートにARIAラベル追加 | ✅ 完了 | role="figure", role="img", aria-label |
| 2 | タブにARIA属性追加 | ✅ 完了 | role="tablist", role="tab", role="tabpanel" |
| 3 | ツールチップにARIA追加 | ✅ 完了 | role="tooltip", aria-live="polite" |
| # | 項目 | 優先度 | 状態 | 詳細 |
|---|
| 1 | queryYear NaN検証 | Low | ✅ 完了 | isNaNチェックと2000-2100の範囲検証追加 |
| 2 | ResizeObserverメモリリーク | Low | ✅ 完了 | 新規作成前に既存observerをdisconnect |
| 3 | マジックナンバー抽出 | Low | ✅ 完了 | TOOLTIP_MAX_WIDTH = 220定数化 |
- COLORS定数追加 - バー色を一元管理
- calculateNetAssetsVariance修正 - discrepancyをnetIncomeに吸収
- netAssetsVarianceToBarData修正 - 調整バー削除、COLORS使用
- parseInt radix追加
- variance-summaryセクション削除 - テンプレート・スタイル両方
- 高さ固定 -
CHART_HEIGHT = 220 - ResizeObserver try-catch追加
- ツールチップ位置調整 - はみ出し防止
前年純資産 + 当期純利益(調整済) + 資本変動 = 当期純資産
netIncome = rawNetIncome + retainedEarningsChange + discrepancy- 利益剰余金調整(配当等)と端数調整を全て当期純利益に吸収
- これによりチャートは「前年純資産 → 当期純利益 → (増資等) → 当年純資産」のシンプルな構成に
テストファイル: apps/web/tests/jleague-net-assets-waterfall.test.ts
- 全クラブ全年度の純資産整合性検証(895/895 = 100%)
- 特定クラブ(浦和)の詳細検証
- 負の純資産ケース
- 大規模資本変動ケース(鹿島、浦和、柏、FC東京、東京V、町田)
apps/web/app/pages/financial-quiz/jleague/club/[club].vue- URLクエリパラメータ
?year=2024&tab=net-assets で状態を管理 getClubUrl() 関数で前後クラブへのリンクにパラメータを付与onMounted でクエリパラメータから状態を復元- NaN検証と範囲チェック(2000-2100年)を追加
apps/web/app/components/jleague/JLeaguePLWaterfallSection.vueactiveTab を defineModel に変更し、v-model対応
apps/web/app/components/jleague/JLeagueNetAssetsWaterfallChart.vue- ARIAラベル追加(
chartAriaLabel, svgAriaLabel computed) - ResizeObserverのメモリリーク対策
TOOLTIP_MAX_WIDTH定数化