[{"data":1,"prerenderedAt":418},["ShallowReactive",2],{"content-/cfws-topic-expansion-lending-assets":3,"all-pages-for-dir":416,"og-image-/cfws-topic-expansion-lending-assets":417},{"id":4,"title":5,"body":6,"category":395,"description":396,"extension":397,"meta":398,"navigation":194,"path":399,"project_name":400,"published":401,"publishedAt":402,"seo":403,"stem":404,"tags":405,"todo":413,"updatedAt":414,"__hash__":415},"pages/2026-04/2026-04-04/cfws-topic-expansion-lending-assets.md","CF精算表の論点展開 — 貸付金・固定資産・運転資本モジュールを一日で立ち上げた",{"type":7,"value":8,"toc":377},"minimark",[9,14,18,22,34,37,41,48,51,55,65,71,75,90,111,246,249,252,257,279,282,286,289,293,296,299,302,305,308,329,332,335,338,341,348,352,355,361,364,370,373],[10,11,13],"h1",{"id":12},"cf精算表の論点展開-貸付金固定資産運転資本","CF精算表の論点展開 — 貸付金・固定資産・運転資本",[15,16,17],"p",{},"前日までに全12論点のパイプライン骨格が立ち上がっていた。今日は手を動かして中身を埋める番だ。朝、貸付金の回収予定表を開いてセルをクリックしたら、数式ではなく値がベタ書きされていた。借入金側はとっくに数式化してある。この非対称に気づいた瞬間、今日の最初のタスクが決まった。",[19,20,21],"h2",{"id":21},"貸付金の回収予定表を数式ベースに書き直す",[15,23,24,25,29,30,33],{},"借入金の返済予定表は ",[26,27,28],"code",{},"元金 = 融資額 / 返済回数","、",[26,31,32],{},"利息 = 残高 × 年利率 × 日数 / 365"," という数式で動いている。一方、貸付金側の回収予定表は金額がすべてリテラル値だった。借入金のテンプレートをミラーリングして、入力変数（貸付額・年利率・返済回数）を変えるだけで72行が再計算される構造に揃えた。",[15,35,36],{},"合わせて、短期貸付金の論点も追加した。借入金側には既に短期借入金の振替処理（決算整理仕訳 + 翌期振替仕訳）が組まれている。これを貸付金側にミラーリングし、集約シートの構成も同じ形に整えた。",[19,38,40],{"id":39},"未収収益がaccount_dbに存在しない","未収収益がACCOUNT_DBに存在しない",[15,42,43,44,47],{},"貸付金の年次推移表を生成しようとしたら、",[26,45,46],{},"KeyError: '未収収益'"," でスクリプトが止まった。ACCOUNT_DBに「未収収益」が登録されていなかった。",[15,49,50],{},"勘定科目マスタを確認すると、「その他流動資産」のカテゴリが丸ごと未登録だった。ACCOUNT_DBに「その他流動資産」を追加し、SUB_ACCOUNT_EXPANDにも「未収収益」を子科目として追加した。再実行すると年次推移表が最後まで通った。",[19,52,54],{"id":53},"補助科目あり版の年次推移表で-sum_above-が親行に止まる","補助科目あり版の年次推移表で sum_above が親行に止まる",[15,56,57,58,61,62,64],{},"補助科目を展開した年次推移表で、",[26,59,60],{},"sum_above"," 関数が想定外の行を拾っていた。親行（「長期貸付金」など）の直下に補助科目行が展開されるが、",[26,63,60],{}," は直上の空でないセルまで遡る仕様のため、展開された親行のラベルセルに到達した時点で止まってしまう。結果、補助科目の合計が親行の値を含まない不完全な集計になっていた。",[15,66,67,68,70],{},"原因は ",[26,69,60],{}," のセル走査ロジックが「空セル以外に当たったら停止」だったこと。展開後の親行はラベルだけ入っていて数値セルは空なので、ラベルセルを数値セルと誤認していた。修正として、走査対象を数値セル列に限定し、ラベル列は無視するようにした。",[19,72,74],{"id":73},"貸付金cfwsの生成-int_table-が-none-になるバグ","貸付金CFWSの生成 — int_table が None になるバグ",[15,76,77,78,81,82,85,86,89],{},"CFWS生成スクリプトで ",[26,79,80],{},"tpl_type == 'lending'"," を指定したとき、",[26,83,84],{},"int_table","（利息テーブル）が ",[26,87,88],{},"None"," で返ってくるバグに当たった。",[15,91,92,93,96,97,100,101,104,105,107,108,110],{},"原因を追うと、",[26,94,95],{},"get_interest_table()"," の分岐が ",[26,98,99],{},"borrowing"," しか想定しておらず、",[26,102,103],{},"lending"," のときは早期リターンで ",[26,106,88],{}," を返していた。利息テーブルの取得ロジック自体は借入・貸付で共通なので、分岐条件に ",[26,109,103],{}," を追加して解決した。",[112,113,118],"pre",{"className":114,"code":115,"language":116,"meta":117,"style":117},"language-python shiki shiki-themes vitesse-light vitesse-light","# Before: borrowingのみ対応\nif tpl_type == 'borrowing':\n    return _build_interest_table(...)\nreturn None  # lending がここに落ちていた\n\n# After: lending も同じロジックで処理\nif tpl_type in ('borrowing', 'lending'):\n    return _build_interest_table(...)\n","python","",[26,119,120,129,158,177,189,196,202,233],{"__ignoreMap":117},[121,122,125],"span",{"class":123,"line":124},"line",1,[121,126,128],{"class":127},"sxvE3","# Before: borrowingのみ対応\n",[121,130,132,136,140,144,148,151,154],{"class":123,"line":131},2,[121,133,135],{"class":134},"sHkkW","if",[121,137,139],{"class":138},"sG7-3"," tpl_type ",[121,141,143],{"class":142},"stQ0i","==",[121,145,147],{"class":146},"sMJiu"," '",[121,149,99],{"class":150},"sdGka",[121,152,153],{"class":146},"'",[121,155,157],{"class":156},"shFtX",":\n",[121,159,161,164,167,170,174],{"class":123,"line":160},3,[121,162,163],{"class":134},"    return",[121,165,166],{"class":138}," _build_interest_table",[121,168,169],{"class":156},"(",[121,171,173],{"class":172},"snbK4","...",[121,175,176],{"class":156},")\n",[121,178,180,183,186],{"class":123,"line":179},4,[121,181,182],{"class":134},"return",[121,184,185],{"class":134}," None",[121,187,188],{"class":127},"  # lending がここに落ちていた\n",[121,190,192],{"class":123,"line":191},5,[121,193,195],{"emptyLinePlaceholder":194},true,"\n",[121,197,199],{"class":123,"line":198},6,[121,200,201],{"class":127},"# After: lending も同じロジックで処理\n",[121,203,205,207,209,212,215,217,219,221,224,226,228,230],{"class":123,"line":204},7,[121,206,135],{"class":134},[121,208,139],{"class":138},[121,210,211],{"class":142},"in",[121,213,214],{"class":156}," (",[121,216,153],{"class":146},[121,218,99],{"class":150},[121,220,153],{"class":146},[121,222,223],{"class":156},",",[121,225,147],{"class":146},[121,227,103],{"class":150},[121,229,153],{"class":146},[121,231,232],{"class":156},"):\n",[121,234,236,238,240,242,244],{"class":123,"line":235},8,[121,237,163],{"class":134},[121,239,166],{"class":138},[121,241,169],{"class":156},[121,243,173],{"class":172},[121,245,176],{"class":156},[19,247,248],{"id":248},"固定資産の取引モジュールを新規作成",[15,250,251],{},"車両運搬具150万円、定額法、4年後に40万円で売却（売却損5万円）という想定で固定資産ライフサイクルの取引モジュールを組んだ。",[253,254,256],"h3",{"id":255},"mf_journalpy-に3関数を追加","mf_journal.py に3関数を追加",[258,259,260,267,273],"ul",{},[261,262,263,266],"li",{},[26,264,265],{},"gen_depreciation_journals()"," — 毎期の減価償却仕訳を生成",[261,268,269,272],{},[26,270,271],{},"gen_disposal_journals()"," — 売却時の仕訳（売却損益を含む）を生成",[261,274,275,278],{},[26,276,277],{},"gen_acquisition_journals()"," — 取得時の仕訳を生成",[15,280,281],{},"3つの関数を組み合わせることで、取得から売却までのライフサイクル全体の仕訳を一括生成できる。",[253,283,285],{"id":284},"gen_fixed_asset_lifecycle_xlsxpy-の作成","gen_fixed_asset_lifecycle_xlsx.py の作成",[15,287,288],{},"上記の仕訳データを受け取り、減価償却スケジュール表・年次推移表・CFWSをExcelに出力するスクリプトを新規作成した。",[253,290,292],{"id":291},"codexレビューでの指摘","Codexレビューでの指摘",[15,294,295],{},"計画段階でCodexにレビューを投げたところ、「E2E検証（年次推移表 → CFWSまでの一気通貫テスト）を計画に入れろ」と返ってきた。取引モジュール単体のテストだけでは、下流のCFWS生成で数値がずれても気づけない。この指摘を受けて、固定資産の完成後にE2Eテストケースを追加する計画に修正した。",[19,297,298],{"id":298},"運転資本モジュールの構築を開始",[15,300,301],{},"小売業を想定した運転資本モジュールの構築に着手した。",[253,303,304],{"id":304},"取引パターンの設計",[15,306,307],{},"以下3種類の売上と掛け仕入を組み合わせた。",[258,309,310,317,323],{},[261,311,312,316],{},[313,314,315],"strong",{},"現金売上"," — 即時入金",[261,318,319,322],{},[313,320,321],{},"B2C掛売上"," — 当月末締め翌月入金",[261,324,325,328],{},[313,326,327],{},"クレカ売上"," — 月末締め翌15日入金",[15,330,331],{},"仕入側も掛け取引で、月末締め翌月末払い。この組み合わせで売掛金・買掛金・クレカ未収金が月をまたいで滞留し、運転資本の増減がCFWSに反映される構造になる。",[253,333,334],{"id":334},"日次取引データを3年分作成",[15,336,337],{},"日次の売上データを3年分（約1,000行）生成するスクリプトを書いた。曜日による売上変動と季節係数を入れて、実務に近い波を持たせている。",[253,339,340],{"id":340},"値ベタ書きから数式参照へ",[15,342,343,344,347],{},"売掛金・買掛金・クレカ決済の各シートが、最初は月次の金額をリテラル値で埋めていた。貸付金の回収予定表と同じ轍を踏むところだった。日次取引データシートを参照元にして、各シートの金額セルをすべて ",[26,345,346],{},"SUMIFS"," 数式に書き換えた。",[253,349,351],{"id":350},"小計行の廃止-データとビューを分ける","小計行の廃止 — データとビューを分ける",[15,353,354],{},"当初、Excel上に月次小計行を挟んでいた。しかし小計行があると、データ範囲が不規則になり、下流のスクリプトでパースしにくくなる。",[15,356,357,358,360],{},"「データとビューを分ける」原則に従い、小計行をすべて廃止した。月次集計が必要な場面では、別セルに ",[26,359,346],{}," 関数を置いて対応する。データシートは純粋なトランザクションログとして、加工はビュー側に任せる構成に統一した。",[19,362,363],{"id":363},"振り返り",[15,365,366,367,369],{},"貸付金の値ベタ書きに気づいてから、固定資産モジュールの新規作成、運転資本モジュールの着手まで、一日で3つの論点を前に進めた。どの論点でも同じパターンが現れた。値ベタ書きを見つけたら数式に直す。未登録の勘定科目に当たったらマスタに追加する。",[26,368,60],{}," のような汎用関数が特定の構造を想定しすぎていたら、走査ロジックを一般化する。",[15,371,372],{},"Codexから「E2Eテストを入れろ」と突き返されたのは正しい指摘だった。取引モジュール → Excel生成 → CFWS出力という3段のパイプラインは、途中で数値がずれても最終段まで見ないと気づけない。明日は固定資産のE2Eテストを書いてから、運転資本モジュールの残りを埋めていく。",[374,375,376],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .sG7-3, html code.shiki .sG7-3{--shiki-default:#393A34;--shiki-dark:#393A34}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":117,"searchDepth":131,"depth":131,"links":378},[379,380,381,382,383,388,394],{"id":21,"depth":131,"text":21},{"id":39,"depth":131,"text":40},{"id":53,"depth":131,"text":54},{"id":73,"depth":131,"text":74},{"id":248,"depth":131,"text":248,"children":384},[385,386,387],{"id":255,"depth":160,"text":256},{"id":284,"depth":160,"text":285},{"id":291,"depth":160,"text":292},{"id":298,"depth":131,"text":298,"children":389},[390,391,392,393],{"id":304,"depth":160,"text":304},{"id":334,"depth":160,"text":334},{"id":340,"depth":160,"text":340},{"id":350,"depth":160,"text":351},{"id":363,"depth":131,"text":363},"dev","CF精算表パイプラインで貸付金の数式化・固定資産ライフサイクル・運転資本モジュールを構築し、sum_aboveバグや未登録勘定科目など複数の問題を解消した記録","md",{},"/cfws-topic-expansion-lending-assets","eurekapu-nuxt4",false,"2026-04-04T00:00:00.000Z",{"title":5,"description":396},"2026-04/2026-04-04/cfws-topic-expansion-lending-assets",[406,407,408,409,410,411,412],"CF精算表","Python","openpyxl","貸付金","固定資産","運転資本","Excel自動化","memo",null,"szlIZFlm1KdUCHA-yi56Y-1OWAJUKR2A2lty-Ccg23E",[],"https://log.eurekapu.com/favicon.svg",1775338204624]