v1 (j-20260507-002 初稿) では「MFの過去データを丸ごと Zaim に引っ越す」前提で設計してた。健人 msg 5810 で本論点が追加:
つまり「移行元」が MF だけじゃなく、Zaim 自身も別ルートで過去1年を取りに行く。この二重供給をどう設計するかが本丸だった。
| 案 | 仕組み | dedup必要? | 判定 |
|---|---|---|---|
| 案A: Zaim自動連携 1年 + MF 1年超 | 1年以内は Zaim 連携にお任せ、1年超だけ MF から変換投入。時間軸で完全分離 | 不要 | 推奨 |
| 案B: MF全期間 + Zaim自動連携停止 | Zaim 連携を切って MF データのみ使う | 不要 (連携停止のため) | 却下 |
| 案C: ハイブリッド + SHA-256 dedup | 1年以内も両方からデータ取得、ハッシュで重複弾き | 必須 | 却下 |
[日付, 方法, 金額, 品目, メモ, お店] をハッシュする。Zaim自動連携と MF で「品目」「お店」の表記が違えば別ハッシュになり、重複として弾けない。案C は理論上きれいだが実運用で破綻する★案A の絵
時間軸: 過去 ―――――――――― [T日前] ―――――――― 今日
データ源: ── MF からCSV変換投入 ── | ── Zaim 自動連携 ──
dedup: 不要 (時間軸で完全分離。同じ取引が両方から来ない)
Zaim 自動連携の遡及範囲は 連携先 (クレカ会社・銀行) ごとに違う。たとえば:
| 連携先の例 | 典型的な遡及範囲 |
|---|---|
| クレカA社 | 過去12ヶ月 |
| クレカB社 | 過去6ヶ月 |
| 銀行X | 過去3ヶ月 |
| 銀行Y | 過去13ヶ月 |
連携先ごとに別々の境界を持つこともできるけど、運用が複雑になる。推奨は T_min 統一方式:
T_min として確定D = T_min の前日D 以前のみこれで「全連携先が確実にカバーする期間」を Zaim 自動連携が、「それより前」を MF が担当する形になる。連携先によっては Zaim 自動が遡及範囲をオーバーランしてMFと重なる場合もあるけど、MF データを D でカットするから問題ない。
連携先ごとに最古取引日を記録して、MF からの取込時に「クレカA関連は12ヶ月超だけ」「銀行Xは3ヶ月超だけ」と細かく切る方法。MF移行範囲が最大化されるが、変換スクリプトが連携先別ロジックを持つ必要があり、開発コストが跳ねる。健人が「過去1年弱の MF データはあきらめていい」なら T_min 統一で十分。
Zaim 側のデータ流入経路は 3系統あり、これらが重複しないことを確認する必要がある:
| 系統 | 担当範囲 | 重複源 |
|---|---|---|
| ① Zaim 自動連携 (クレカ) | 直近 T_min 日のクレカ取引すべて。Suicaチャージも記録される | Suicaチャージ ⇔ Suica取込のチャージ行 |
| ② Zaim Suica 取込 (j-507-001) | Suica 利用記録 (改札タッチ等) と現金チャージ | クレカチャージは ① と重複 → j-507-001 推奨案で「電子マネー入金」行を skip |
| ③ MF 過去データ取込 (本ジョブ) | D 以前の MF データ全て (Suica関連含む) | ① ② とは時間軸分離 (案A) で重複なし |
過去 ―――――――――――――――― [D=T_min前日] ――――――――― 今日
③ MF取込のみ ① Zaim自動連携(クレカ)
(Suica関連も全部MF経由) ② Zaim Suica取込
(①との重複は j-507-001 で skip)
D 以前 → ③ MF取込のみ。① ② は届かない範囲なので競合なしD 以降 → ① + ② の併用 (j-507-001 設計どおり)。③ は触らないD 当日 → MF データに含めない (前日まで)。Zaim 自動連携が当日分を拾うこれで Suica チャージが二重登録されるパスは閉じられる。健人の MF が Suica 連携してても、その記録は D 以前のみが Zaim に流れ込み、D 以降は Zaim 自動 + Suica取込の組合せで担当する。
同じ。整理は完全に揃う:
つまり論点1〜4 は単一フレームワーク (案A + T_min) で全てカバーできる。設計の追加複雑度はほぼゼロ。
変換スクリプト (mf-to-zaim-csv.ts) には「日付 ≤ D の行のみ出力」という条件を1つ追加するだけ。importCsvHandler の重複防止3層 (運用カットオーバー / SHA-256 / 計算対象=0除外) はそのまま機能する。コード差分は最小限。
T_min として確定 → D = T_min の前日D 以降にあれば、Zaim自動連携でカバーされるからMFから移行不要scripts/mf-to-zaim-csv.ts + src/lib/mfFallbackMap.ts + importCsvHandler 拡張 + テスト--cutoff D オプションを追加。D 以前の行のみ出力 (それ以降はスキップ件数として表示)--cutoff D 付きで変換スクリプト実行 → D 以降の行は自動でスキップ/api/zaim/import-csv に POST健人に確認したい計8点 (v1 の4点 + v2 の4点):
v1 から継続:
1. MFプレミアム会員か (未加入なら 500円課金 / Tampermonkey 判断)
2. 移行対象期間は何年分か (5年想定だが実データの古さで件数変わる)
3. 振替(口座間移動) は移行対象に含めるか (現状 importCsvHandler は振替を一律スキップ)
4. 重複検知キーの名前空間を Suica と MF で分けるか統合するか
v2 で追加:
5. Zaim 自動連携で連携する先のリスト (クレカ・銀行・電子マネー、何社あるか)
6. 各連携先の遡及範囲 (= T_min を決めるため。連携完了後にスクショ)
7. 案A で問題ないか (1年以内 Zaim自動 + 1年超 MF)。それとも B (連携停止) や C (ハイブリッド+dedup) を希望?
8. 境界方式: T_min 統一 (シンプル) と 連携先別 (移行範囲最大化、複雑) のどちらにするか
| # | 項目 | 状態 |
|---|---|---|
| 1 | v1 設計を保ちつつ4論点追加で plan-viewer 更新 | 完了 — 本ページ (v2 別ファイル並存) |
| 2 | 推奨案 (重複期間1年取得先) 選定 + 根拠 | 完了 — 案A、根拠4点を §論点1 に |
| 3 | 期間境界の運用手順 | 完了 — T_min 統一方式、§論点2 + §事前準備 |
| 4 | Suica取込 (j-507-001) 優先順位 | 完了 — 三者の時間軸分離、§論点3 |
| 5 | 金融機関連携の扱い | 完了 — クレカと同フレーム、§論点4 |
| 6 | v1 4点 + v2 4点 統合チェックリスト | 完了 — §統合チェックリスト |
| 7 | verification_summary.result_summary v2 上書き | 完了 — /tmp/verification-j-20260507-002.txt |
next_action: 健人が統合チェックリスト8点を回答 → 設計OK判定 → 実装ジョブ起票 (v1 範囲 + --cutoff D オプション追加)