[{"data":1,"prerenderedAt":304},["ShallowReactive",2],{"content-/cf-tax-module-pipeline":3,"all-pages-for-dir":302,"og-image-/cf-tax-module-pipeline":303},{"id":4,"title":5,"body":6,"category":280,"description":281,"extension":282,"meta":283,"navigation":284,"path":285,"project_name":286,"published":287,"publishedAt":288,"seo":289,"stem":290,"tags":291,"todo":299,"updatedAt":300,"__hash__":301},"pages/2026-04/2026-04-07/cf-tax-module-pipeline.md","CF精算表: 法人税ライフサイクルモジュールの実装・統合・リファクタリング",{"type":7,"value":8,"toc":248},"minimark",[9,13,17,22,27,30,43,46,49,52,55,66,70,73,76,79,85,89,100,103,106,110,113,117,120,124,127,133,137,144,155,158,161,165,171,175,184,188,195,199,206,210,213,217,223,227,230,233,236,242,245],[10,11,5],"h1",{"id":12},"cf精算表-法人税ライフサイクルモジュールの実装統合リファクタリング",[14,15,16],"p",{},"朝、法人税の取引モジュール（CF_306）のPythonファイルを新規に開いた。ここまでのパイプラインは借入金・固定資産・運転資本と個別論点を積み上げてきたが、法人税だけはどの論点にも横串で刺さる。単独モジュールを作って統合する方針で進めた。ところが統合した瞬間、CFWSの数字が合わない。法人税仕訳が二重に計上されていた。原因を追い、修正し、さらにリファクタリングで重複コードを潰す --- 朝から夜まで法人税に向き合い続けた一日だった。",[18,19,21],"h2",{"id":20},"cf_306-法人税ライフサイクル取引モジュールの新規実装","CF_306 法人税ライフサイクル取引モジュールの新規実装",[23,24,26],"h3",{"id":25},"gen_tax_lifecycle_xlsxpy","gen_tax_lifecycle_xlsx.py",[14,28,29],{},"法人税の「発生→計上→支払→繰越」というライフサイクル全体を1ファイルで表現する取引モジュールを書いた。中間決算なしの年1回申告を前提に、以下の流れを仕訳として自動生成する。",[31,32,33,37,40],"ul",{},[34,35,36],"li",{},"12/31に税引前当期純利益を算出し、法人税等を計上（未払法人税等）",[34,38,39],{},"翌年2/28に未払法人税等を取り崩して現金で支払う",[34,41,42],{},"税引前当期純利益がマイナスなら欠損金として繰越",[23,44,45],{"id":45},"繰越欠損金マトリクス",[14,47,48],{},"元Excelモジュールの繰越欠損金マトリクスと照合しながら実装した。マトリクスは「発生年度 x 使用年度」の2次元テーブルで、各年度の欠損金が何年度にいくら使用されたかを追跡する。10年繰越のルールに従い、期限切れの欠損金が自動で落ちるようにした。",[14,50,51],{},"Excel上ではマトリクスの各セルに数式を入れ、行合計が繰越残高、列合計がその年度の控除額と一致することを検証できるようにした。",[23,53,54],{"id":54},"税金仕訳ビルダーの追加",[14,56,57,61,62,65],{},[58,59,60],"code",{},"mf_journal.py","に",[58,63,64],{},"build_tax_journals","関数を追加した。税引前当期純利益の算出、法人税額の計算、未払法人税等の計上仕訳と支払仕訳の生成をこの関数に集約した。会計ソフトAのインポート形式に合わせた仕訳データを返す。",[18,67,69],{"id":68},"cf_300-総合演習への法人税統合-二重計上バグとの格闘","CF_300 総合演習への法人税統合 --- 二重計上バグとの格闘",[23,71,72],{"id":72},"二重計上バグの発見",[14,74,75],{},"法人税モジュールを総合演習（CF_300）に統合してCFWSを再生成すると、法人税等の金額が想定の2倍になっていた。Check行が0にならない。仕訳シートを開いて法人税の行をカウントすると、同じ仕訳が2セットある。",[23,77,78],{"id":78},"原因の特定",[14,80,81,82,84],{},"仕訳の出所を追うと、1セットは今回追加した",[58,83,64],{},"から、もう1セットはCF_304（運転資本）のExcelに既に埋め込まれていた。運転資本モジュールが独自に法人税仕訳を生成しており、そこに新モジュールの仕訳を重ねていた。",[23,86,88],{"id":87},"修正-filter_journalsにexclude_taxオプション追加","修正: filter_journalsにexclude_taxオプション追加",[14,90,91,92,95,96,99],{},"総合演習では法人税モジュール側の仕訳を正とし、運転資本側の法人税仕訳を除外する方針にした。",[58,93,94],{},"filter_journals","関数に",[58,97,98],{},"exclude_tax","パラメータを追加し、総合演習での結合時にのみ運転資本の法人税仕訳をフィルタアウトする。個別論点としてCF_304を単体で動かすときは従来通り法人税込みで生成される。",[23,101,102],{"id":102},"未払法人税等が計上されない問題",[14,104,105],{},"二重計上を潰した後、今度は未払法人税等のBS残高がゼロのままだった。計上日を確認すると期中日付になっていた。期末日（12/31）に計上し、翌年2/28に支払う日付に修正して解消した。決算日をまたぐ負債が正しくBSに載るようになった。",[23,107,109],{"id":108},"cfws営業cf小計の調整列並び替え","CFWS営業CF小計の調整列並び替え",[14,111,112],{},"法人税を統合したことで、CFWSの営業CF小計内に「法人税等調整額」の行が追加された。日本基準の様式2に合わせ、調整列の行順序を「減価償却費→貸倒引当金増減→受取利息→支払利息→...→法人税等調整額」の並びに修正した。",[23,114,116],{"id":115},"cf計算書セクションのbs由来pl由来統合","CF計算書セクションのBS由来/PL由来統合",[14,118,119],{},"CFWSの下半分（CF計算書セクション）では、BS由来の増減とPL由来の調整を分離して出力していた。法人税が加わると列順序と行順序が噛み合わなくなったため、BS由来とPL由来を統合し、列順序と行順序を一致させる修正を入れた。",[18,121,123],{"id":122},"cf_304-運転資本への法人税統合","CF_304 運転資本への法人税統合",[23,125,126],{"id":126},"税引前当期純利益の自動計算",[14,128,129,132],{},[58,130,131],{},"gen_working_capital_xlsx.py","に税引前当期純利益を自動計算するロジックを追加した。PLの売上高から売上原価・販管費・営業外損益を差し引き、税引前当期純利益を算出する。この値をもとに法人税額を計算し、仕訳を生成する。",[23,134,136],{"id":135},"cf-labelsjsonとcfws配分ロジック","cf-labels.jsonとCFWS配分ロジック",[14,138,139,140,143],{},"未払法人税等を",[58,141,142],{},"cf-labels.json","に追加し、CFWS上での配分先を設定した。ここで手が止まった。未払法人税等の増減は営業CFの小計内に入るのか、小計外なのか。",[14,145,146,147,151,152,154],{},"日本基準の間接法CFWSでは、「法人税等の支払額」は営業CF小計の",[148,149,150],"strong",{},"外","に表示する。小計は営業活動から生まれたキャッシュを示し、税金の支払いはその後に控除する。",[58,153,142],{},"の配分設定を修正し、「法人税等の支払額」が小計外に正しく配置されるようにした。",[23,156,157],{"id":157},"繰越利益剰余金への法人税反映",[14,159,160],{},"繰越利益剰余金の配分ロジックに法人税等を追加した。当期純利益 = 税引前当期純利益 - 法人税等 という関係が、BS上の繰越利益剰余金の増減に正しく反映されるようになった。",[18,162,164],{"id":163},"税金モジュールのリファクタリング4タスク","税金モジュールのリファクタリング（4タスク）",[14,166,167,168,170],{},"法人税統合を終えた時点で、",[58,169,64],{},"が3ファイルに散在していた。CF_306単体・CF_300総合・CF_304運転資本のそれぞれが微妙に異なるコピーを持っている。同じロジックの3つのコピーは、次の変更で必ず壊れる。リファクタリングを4タスクに分割して実行した。",[23,172,174],{"id":173},"task-1-build_tax_journals-を-mf_journalpy-に統合","Task 1: build_tax_journals を mf_journal.py に統合",[14,176,177,178,180,181,183],{},"3ファイルの",[58,179,64],{},"を比較し、差分を洗い出した。パラメータの違いを引数で吸収し、",[58,182,60],{},"の1箇所に統合した。3ファイルから重複コードを削除。",[23,185,187],{"id":186},"task-2-write_tax_params-共通関数","Task 2: write_tax_params 共通関数",[14,189,190,191,194],{},"税金パラメータ（税率・繰越期間・申告期限等）をExcelシートに書き出す処理が各ファイルにコピーされていた。",[58,192,193],{},"write_tax_params","として共通関数に切り出した。",[23,196,198],{"id":197},"task-3-write_nol_matrix-統合","Task 3: write_nol_matrix 統合",[14,200,201,202,205],{},"繰越欠損金マトリクスの書き出し処理を共通化した。CF_306とCF_300で列の開始位置が異なるため、",[58,203,204],{},"col_start","パラメータを追加して吸収した。",[23,207,209],{"id":208},"task-4-write_tax_schedule_sheet-の整理","Task 4: write_tax_schedule_sheet の整理",[14,211,212],{},"税金スケジュールシート（計上日・支払日・金額の一覧）の書き出し処理を整理した。",[23,214,216],{"id":215},"codexgpt-54レビューで漏れを検出","Codex（GPT-5.4）レビューで漏れを検出",[14,218,219,220,222],{},"リファクタリング完了後、Codexにレビューを依頼した。「CF_300総合演習版で",[58,221,193],{},"の呼び出しが旧関数のまま残っている」という指摘が返ってきた。確認すると、Task 2で共通関数に切り出した際にCF_300側のimportを更新し忘れていた。指摘通り修正してリファクタリング完了。",[18,224,226],{"id":225},"cfwsの取引_税金シートを数式化","CFWSの取引_税金シートを数式化",[14,228,229],{},"リファクタリング後、取引_税金シートの値がベタ打ちのまま残っていた。前日の方針に従い、年次推移表からINDEX/MATCHで参照する数式に置き換えた。年次推移表の値を変更すれば、取引_税金シートにも自動で反映される。",[14,231,232],{},"最後にIBフォーマット（投資銀行モデルの書式ルール）を適用し、ヘッダ色・数値書式・参照セルの色分けを統一した。",[18,234,235],{"id":235},"振り返り",[14,237,238,239,241],{},"二重計上バグは、仕訳シートの行数を数えた瞬間に「あ、倍ある」と気づいた。原因の特定自体は速かったが、「どちらを正とするか」の判断に時間を使った。単体モジュールでも総合演習でも同じコードパスを通したい。しかし総合演習では法人税の計算元となるPL数値が他モジュールの仕訳も含む。結局、",[58,240,98],{},"フラグで結合時にフィルタする設計に落ち着いた。",[14,243,244],{},"リファクタリングの4タスクは、統合直後にやったからこそ差分が小さかった。これが数日寝かせると、各ファイルが独自に進化して統合コストが跳ね上がる。コピーが生まれた瞬間に潰す --- この判断は正しかった。",[14,246,247],{},"Codexのレビューでimport漏れを拾えたのも収穫だった。人間の目は「変更した箇所」に集中するが、「変更すべきだったのにしなかった箇所」は見落としやすい。外部レビューの価値はそこにある。",{"title":249,"searchDepth":250,"depth":250,"links":251},"",2,[252,258,266,271,278,279],{"id":20,"depth":250,"text":21,"children":253},[254,256,257],{"id":25,"depth":255,"text":26},3,{"id":45,"depth":255,"text":45},{"id":54,"depth":255,"text":54},{"id":68,"depth":250,"text":69,"children":259},[260,261,262,263,264,265],{"id":72,"depth":255,"text":72},{"id":78,"depth":255,"text":78},{"id":87,"depth":255,"text":88},{"id":102,"depth":255,"text":102},{"id":108,"depth":255,"text":109},{"id":115,"depth":255,"text":116},{"id":122,"depth":250,"text":123,"children":267},[268,269,270],{"id":126,"depth":255,"text":126},{"id":135,"depth":255,"text":136},{"id":157,"depth":255,"text":157},{"id":163,"depth":250,"text":164,"children":272},[273,274,275,276,277],{"id":173,"depth":255,"text":174},{"id":186,"depth":255,"text":187},{"id":197,"depth":255,"text":198},{"id":208,"depth":255,"text":209},{"id":215,"depth":255,"text":216},{"id":225,"depth":250,"text":226},{"id":235,"depth":250,"text":235},"dev","CF精算表パイプラインに法人税モジュール（CF_306）を新規実装し、総合演習（CF_300）と運転資本（CF_304）へ統合。二重計上バグの発見と修正、繰越欠損金マトリクスの照合、税金仕訳ビルダーの統合リファクタリングまでを一日で走り切った記録","md",{},true,"/cf-tax-module-pipeline","eurekapu-nuxt4",false,"2026-04-07T00:00:00.000Z",{"title":5,"description":281},"2026-04/2026-04-07/cf-tax-module-pipeline",[292,293,294,295,296,297,298],"CF精算表","法人税","Python","Excel自動化","リファクタリング","CFWS","繰越欠損金","memo",null,"wsPH3oLNBZ7hl5AnK72OnON1MCxtNs3gZnc3xb-jH3w",[],"https://log.eurekapu.com/favicon.svg",1775602359602]