[{"data":1,"prerenderedAt":500},["ShallowReactive",2],{"content-/cfws-q3-all-sheets-fix":3,"all-pages-for-dir":498,"og-image-/cfws-q3-all-sheets-fix":499},{"id":4,"title":5,"body":6,"category":479,"description":480,"extension":481,"meta":482,"navigation":445,"path":483,"project_name":484,"published":485,"publishedAt":486,"seo":487,"stem":488,"tags":489,"todo":496,"unpublished":485,"updatedAt":496,"__hash__":497},"pages/2026-04/2026-04-16/cfws-q3-all-sheets-fix.md","CFWS全37Q網羅修正 - 引当金と貸倒損失の調整ロジック再設計",{"type":7,"value":8,"toc":468},"minimark",[9,13,26,29,33,44,47,67,78,81,157,160,164,167,174,190,193,214,217,221,224,231,237,247,254,258,265,272,275,293,299,302,305,326,329,333,336,346,349,381,384,388,391,398,401,404,417,420,431,434,464],[10,11,5],"h1",{"id":12},"cfws全37q網羅修正-引当金と貸倒損失の調整ロジック再設計",[14,15,16,17,21,22,25],"p",{},"朝、ユーザーから「引当金の取扱いのExcelを見てるんだけど、期首残高の仕訳が出力のMF仕訳シートに入ってないんですよ」と指摘が来た。Q3-3のCFWS（キャッシュフロー計算書ワークシート）を開いて比べてみると、元データには確かに ",[18,19,20],"code",{},"現金及び預金/資本金"," や ",[18,23,24],{},"繰越利益剰余金_期首/製品保証引当金"," といった期首残高の3行が並んでいる。生成後のシートからはそれが丸ごと消えていた。",[14,27,28],{},"ここから全37Qを網羅的に点検する一日が始まった。",[30,31,32],"h2",{"id":32},"期首残高がパーサーに拾われない",[14,34,35,36,39,40,43],{},"まずパーサーの ",[18,37,38],{},"entries_to_mf_rows"," を読み直した。設計としては ",[18,41,42],{},"include_opening=True"," が既定で、期首残高は MF仕訳シートに含めるはず。メインスクリプト側の呼び出しも正しい。となるとパースの入り口側で落ちている可能性が高い。",[14,45,46],{},"元Excelのセル値をUTF-8で読み直すと、原因が一発で見えた。",[48,49,50,61],"ul",{},[51,52,53,54,57,58],"li",{},"Q3-9のような標準形: N列 = ",[18,55,56],{},"x2_period","、O列 = ",[18,59,60],{},"開始残高",[51,62,63,64,66],{},"Q3-3だけ: N列 = ",[18,65,60],{},"、O列 = 空",[14,68,69,70,73,74,77],{},"パーサーの ",[18,71,72],{},"_extract_opening_balances"," は ",[18,75,76],{},"entry.topic_key == '開始残高'"," でフィルタしていたため、Q3-3の期首行は全て素通りしていた。",[14,79,80],{},"修正はシンプルに。パース時点で N列が「開始残高」かつ O列が空なら、正しい位置に補正する。",[82,83,88],"pre",{"className":84,"code":85,"language":86,"meta":87,"style":87},"language-python shiki shiki-themes vitesse-light vitesse-light","if period_key == '開始残高' and not topic_key:\n    topic_key = '開始残高'\n    period_key = first_period_of_sheet\n","python","",[18,89,90,130,146],{"__ignoreMap":87},[91,92,95,99,103,107,111,114,117,120,123,126],"span",{"class":93,"line":94},"line",1,[91,96,98],{"class":97},"sHkkW","if",[91,100,102],{"class":101},"sG7-3"," period_key ",[91,104,106],{"class":105},"stQ0i","==",[91,108,110],{"class":109},"sMJiu"," '",[91,112,60],{"class":113},"sdGka",[91,115,116],{"class":109},"'",[91,118,119],{"class":105}," and",[91,121,122],{"class":105}," not",[91,124,125],{"class":101}," topic_key",[91,127,129],{"class":128},"shFtX",":\n",[91,131,133,136,139,141,143],{"class":93,"line":132},2,[91,134,135],{"class":101},"    topic_key ",[91,137,138],{"class":128},"=",[91,140,110],{"class":109},[91,142,60],{"class":113},[91,144,145],{"class":109},"'\n",[91,147,149,152,154],{"class":93,"line":148},3,[91,150,151],{"class":101},"    period_key ",[91,153,138],{"class":128},[91,155,156],{"class":101}," first_period_of_sheet\n",[14,158,159],{},"これでQ3-3を再生成すると、MF仕訳シートの Row 2-7 に期首残高の3仕訳がきれいに並んだ。",[30,161,163],{"id":162},"未払金の増減列が消えていた問題","「未払金の増減」列が消えていた問題",[14,165,166],{},"次の指摘が来た。Q3-3の年次推移表には「未払金の増減」という調整列があるのに、生成したCFWSからは欠けている。代わりにその金額が「役員退職慰労引当金の増減額」列にまとめて配賦されていた。",[14,168,169,170,173],{},"該当仕訳は ",[18,171,172],{},"役員退職慰労引当金 500 / 未払金 500"," の1行。借方と貸方で別々のCF項目に割り付ける必要がある。",[14,175,176,177,180,181,184,185,189],{},"アロケータの ",[18,178,179],{},"_allocate_cfws"," を読むと、",[18,182,183],{},"_entry_cf_label(entry, adjustments)"," が ",[186,187,188],"strong",{},"1仕訳につき1つのCFラベル"," しか返していなかった。設計の前提がそもそも「1仕訳=1ラベル」だったのだ。",[14,191,192],{},"修正方針を設計し直した。",[48,194,195,198,211],{},[51,196,197],{},"1仕訳=1ラベルの前提を捨てる",[51,199,200,203,204,207,208],{},[18,201,202],{},"entry.dr_cf_label"," と ",[18,205,206],{},"entry.cr_cf_label"," が両方あり、かつ異なる場合、",[186,209,210],{},"DR側とCR側をそれぞれ独自のCFラベルで配賦する",[51,212,213],{},"ステップ6の列生成も同じロジックに寄せる",[14,215,216],{},"これで未払金500が「未払金の増減」列に独立して配賦されるようになり、役員退職慰労引当金の列の金額も整合した。",[30,218,220],{"id":219},"現金科目側のcsラベルが列として漏れ出す","現金科目側のCSラベルが列として漏れ出す",[14,222,223],{},"再生成したシートを眺めていたら、今度は「その他の営業支出」という使っていないはずの列が勝手に追加されていた。",[14,225,226,227,230],{},"原因を追うと、アロケータが借方・貸方の両側からCS科目ラベルを無差別に収集していた。",[18,228,229],{},"現金及び預金_その他の営業支出"," のように現金科目に付いたサフィックスも、列生成のラベル候補として拾ってしまう。これは現金振替の方向を示すためのタグであって、調整項目の列になる筋合いはない。",[14,232,233,236],{},[18,234,235],{},"_entry_cf_label"," 側でも同様に、現金科目に付いたCSラベルはスキップする方針に揃えた。",[82,238,240],{"className":84,"code":239,"language":86,"meta":87,"style":87},"# E列/J列のCSラベルを読む時、科目が現金ならスキップ\n",[18,241,242],{"__ignoreMap":87},[91,243,244],{"class":93,"line":94},[91,245,239],{"class":246},"sxvE3",[14,248,249,250,253],{},"Q5-15で再検証すると、",[18,251,252],{},"支払保険料 / 現金及び預金_その他の営業支出"," の仕訳が「支払保険料」側だけで評価され、誤生成されていた「その他の営業支出」列が消えた。",[30,255,257],{"id":256},"全37qの網羅チェックに向けて計画立案","全37Qの網羅チェックに向けて計画立案",[14,259,260,261,264],{},"Q3-3の期首残高問題と未払金問題は直ったが、ユーザーから「他のQにも同じ漏れがあるはずだから全部見てほしい」と要望。単発の修正ではなく、",[186,262,263],{},"全37Qの網羅チェック"," として計画を立てることにした。",[14,266,267,268,271],{},"プランモードに入り、サブエージェント3つを並列で走らせて全シートを洗う。計画書ができたら ",[18,269,270],{},"codex exec -m gpt-5.4"," でレビューを投げた。",[14,273,274],{},"Codexから致命的な指摘が4点返ってきた。全て正当だったので計画を更新する。",[48,276,277,284,287,290],{},[51,278,279,280,283],{},"検証列の探索範囲が ",[18,281,282],{},"range(10, 22)"," で固定されていて、調整列が増えると「合計」列が22列目以降に移動してしまう",[51,285,286],{},"dual-label対象シートの識別条件が緩い",[51,288,289],{},"期首残高補正がQ3-3以外の将来データで誤動作する可能性",[51,291,292],{},"配賦の優先順位が明文化されていない",[14,294,295,298],{},[18,296,297],{},"codex exec resume --last"," で再レビューを投げて、修正した計画が通ったことを確認してから実装に入った。",[30,300,301],{"id":301},"実装と全件再生成",[14,303,304],{},"Step 0〜6を順に進める。",[48,306,307,310,313,320,323],{},[51,308,309],{},"Step 0: dry-run で37Qのシート一覧を確認（レイアウト用シートが混ざっていないか）",[51,311,312],{},"Step 1: verify列の動的探索に変更",[51,314,315,316,319],{},"Step 2: 旧ファイルを ",[18,317,318],{},"old/"," に退避",[51,321,322],{},"Step 3: 全Q一括再生成",[51,324,325],{},"Step 5: dual-label対象シートのヘッダーと開始残高を確認",[14,327,328],{},"全37Q（多期間分含めて42シート）がエラーなく再生成された。pywin32が入っていないのでCOM経由のcheck=0検証はスキップだが、構造的には全件パスしている。",[30,330,332],{"id":331},"q3-4-貸倒引当金の売上債権貸付債権分離","Q3-4 貸倒引当金の売上債権/貸付債権分離",[14,334,335],{},"午後、別セッションから「Q3-4の貸倒引当金を売上債権用と貸付債権用で分けてほしい」と依頼が来た。",[14,337,338,341,342,345],{},[18,339,340],{},"mf-account-master.json"," を確認すると、会計ソフトAの公式マスタには ",[186,343,344],{},"「貸倒引当金_売上債権」「貸倒引当金_貸付債権」「貸倒引当金_未収入金」が独立した勘定科目として既に登録済み"," だった。マスタに合わせるなら、スクリプト側で正規化して一つにまとめず、独立科目として残すのが正しい。",[14,347,348],{},"修正は3段構え。",[48,350,351,361,375],{},[51,352,353,356,357,360],{},[18,354,355],{},"_SPECIAL_ACCOUNTS"," の正規化で接尾辞（",[18,358,359],{},"_売上債権"," 等）を残す",[51,362,363,366,367,370,371,374],{},[18,364,365],{},"ACCOUNT_DB"," に3科目を追加。グループは ",[18,368,369],{},"other_current","（既存の ",[18,372,373],{},"貸倒引当金"," と同じ）で、CF側では「貸倒引当金の増減額」に集計される",[51,376,377,380],{},[18,378,379],{},"split_qa_to_cfws.py"," のPL→CFラベルマッピングに貸倒損失の売上債権/貸付債権版を追加",[14,382,383],{},"Q3-4を再生成すると、MF仕訳シートに「貸倒引当金_売上債権」「貸倒引当金_貸付債権」が別々に並んだ。CFWSのcheck値は分離前と同一だった（非破壊的な修正）。",[30,385,387],{"id":386},"貸倒損失の長期貸付金k列調整","貸倒損失の長期貸付金K列調整",[14,389,390],{},"もう一つ論点があった。貸倒損失のうち「貸付金の貸倒損失」は、会計基準上、売上債権の貸倒損失とは別に営業CFで個別に調整する必要がある。",[14,392,393,394,397],{},"長期貸付金のK列調整を追加し、PL由来の調整マッピングに ",[18,395,396],{},"貸倒損失_貸付債権"," を独立ラベルとして登録した。影響範囲はQ3-4, Q3-5, Q5-19〜Q5-23の計7Q。",[30,399,400],{"id":400},"振り返り",[14,402,403],{},"今日潰した致命的バグは3つ。",[48,405,406,409,414],{},[51,407,408],{},"Q3-3の期首残高がパースで落ちる（元データの構造ゆれ）",[51,410,411,413],{},[18,412,179],{}," が1仕訳=1ラベル前提で、DR/CR両側独立の配賦ができていなかった",[51,415,416],{},"現金科目側のCSラベルが列として誤って生成される",[14,418,419],{},"どれも「1つのQを手で直してOK」ではなく、パーサーとアロケータの設計を見直して全37Qに効かせる形で直した。Codexレビューで計画段階の穴を4つ塞いでから実装に入ったおかげで、実装中の手戻りはほぼゼロだった。",[14,421,422,423,426,427,430],{},"スキル化で一度ミスをした。独自流でfrontmatterなしのスキルファイルを作ってしまい、ユーザーに「",[18,424,425],{},"example-skills:skill-creator"," があるのになぜ参照しなかったのか」と指摘された。次に新しいスキルを作る時は ",[18,428,429],{},"/skill-creator"," を先に呼ぶ。",[30,432,433],{"id":433},"明日やること",[48,435,438,448,458],{"className":436},[437],"contains-task-list",[51,439,442,447],{"className":440},[441],"task-list-item",[443,444],"input",{"disabled":445,"type":446},true,"checkbox"," pywin32を導入してCOM経由のcheck=0自動検証を復活させる",[51,449,451,453,454,457],{"className":450},[441],[443,452],{"disabled":445,"type":446}," dual-labelの配賦ルールを ",[18,455,456],{},"cf-labels.json"," にデータ化して、スクリプト側のハードコードを減らす",[51,459,461,463],{"className":460},[441],[443,462],{"disabled":445,"type":446}," Q3-4以外の6Q（Q3-5, Q5-19〜Q5-23）でも貸倒引当金分離がHTML上で正しく表示されているかブラウザで確認する",[465,466,467],"style",{},"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 .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);}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}",{"title":87,"searchDepth":132,"depth":132,"links":469},[470,471,472,473,474,475,476,477,478],{"id":32,"depth":132,"text":32},{"id":162,"depth":132,"text":163},{"id":219,"depth":132,"text":220},{"id":256,"depth":132,"text":257},{"id":301,"depth":132,"text":301},{"id":331,"depth":132,"text":332},{"id":386,"depth":132,"text":387},{"id":400,"depth":132,"text":400},{"id":433,"depth":132,"text":433},"dev","キャッシュフロー計算書ワークシートのQ3-3/Q3-4等の調整項目漏れをパーサーとアロケータの改修で根治。全37Qの網羅チェックをCodexレビューで補強。","md",{},"/cfws-q3-all-sheets-fix","eurekapu-nuxt4",false,"2026-04-16T00:00:00.000Z",{"title":5,"description":480},"2026-04/2026-04-16/cfws-q3-all-sheets-fix",[490,491,492,493,494,495],"eurekapu","キャッシュフロー計算書","Python","リファクタリング","Codex","会計基準",null,"3xEFJnzWFfUyJEJ1b5pnVDBS8kb1EL_gf4sT7friu3g",[],"https://log.eurekapu.com/og/blog/cfws-q3-all-sheets-fix.png?v=2026-04-16T00%3A00%3A00.000Z&title=CFWS%E5%85%A837Q%E7%B6%B2%E7%BE%85%E4%BF%AE%E6%AD%A3%20-%20%E5%BC%95%E5%BD%93%E9%87%91%E3%81%A8%E8%B2%B8%E5%80%92%E6%90%8D%E5%A4%B1%E3%81%AE%E8%AA%BF%E6%95%B4%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E5%86%8D%E8%A8%AD%E8%A8%88&author=Kei%20Komatsu&sig=08eefcbb737ec31d",1780786051850]