[{"data":1,"prerenderedAt":518},["ShallowReactive",2],{"content-/consolidated-3part-modal-expansion":3,"all-pages-for-dir":516,"og-image-/consolidated-3part-modal-expansion":517},{"id":4,"title":5,"body":6,"category":497,"description":498,"extension":499,"meta":500,"navigation":501,"ogImage":502,"path":503,"project_name":504,"published":505,"publishedAt":506,"seo":507,"stem":508,"tags":509,"todo":502,"unpublished":505,"updatedAt":502,"__hash__":515},"pages/2026-05/2026-05-01/consolidated-3part-modal-expansion.md","連結会計レッスンの仕訳モーダルを3部構成に拡張：個別→連結あるべき→連結修正の差分検算",{"type":7,"value":8,"toc":484},"minimark",[9,18,22,28,31,41,48,52,63,70,225,229,232,238,245,249,256,259,263,270,274,277,353,356,360,367,370,373,399,404,408,415,425,431,434,454,457,480],[10,11,12,13,17],"p",{},"連結会計レッスンI-2-1〜I-3-3の6設例で、仕訳モーダルを3部構成に組み替えた。「個別上の処理」「連結上あるべき仕訳」「連結修正仕訳」を縦に並べ、",[14,15,16],"code",{},"② − ① = ③"," の差分を bookRowId 単位で検算する。Codexレビュー（gpt-5.5）で2回方針転換させられた末にデータ駆動方式へ落ち着いた。",[19,20,21],"h2",{"id":21},"何を変えたか",[10,23,24,27],{},[14,25,26],{},"JournalEntryModal.vue"," を3部構成に分割した。連結修正仕訳の意図は「個別の処理を一旦取り消し、連結ベースの正しい姿に置き換える差分」だが、従来は③だけを表示していたので、学習者が「なぜこの修正が必要か」を頭の中で復元するしかなかった。",[10,29,30],{},"3部構成にしたことで、画面が次のように並ぶ。",[32,33,38],"pre",{"className":34,"code":36,"language":37},[35],"language-text","① 個別上の処理        （点線枠＋ヘッダー）\n② 連結上あるべき仕訳  （点線枠＋ヘッダー）\n③ 連結修正仕訳       （実線枠＋ヘッダー）\n","text",[14,39,36],{"__ignoreMap":40},"",[10,42,43,44,47],{},"階層インデントは ② を ",[14,45,46],{},"2em"," に揃え、視線が「①と②を見比べて、その差分が③」と流れるように整えた。",[19,49,51],{"id":50},"の検算ロジック","②−①=③ の検算ロジック",[10,53,54,55,58,59,62],{},"bookRowId 単位で借方・貸方を集計し、",[14,56,57],{},"②の金額 − ①の金額"," が ",[14,60,61],{},"③の金額"," と一致するかをコンポーネント側で検算する。一致しなかった場合はモーダル右上に警告バッジを出す。",[10,64,65,66,69],{},"ただし NCI按分・未実現損益・連結内ソフト売買のような複雑グループは「個別側の二社合算と連結側の集計が貸借不一致」になるケースがあり、機械的な照合が壊れる。やむを得ず ",[14,67,68],{},"skipReconcileCheck"," フラグを設例側に持たせ、これらは検算を飛ばす設計に切り替えた。",[32,71,75],{"className":72,"code":73,"language":74,"meta":40,"style":40},"language-typescript shiki shiki-themes vitesse-light vitesse-light","// 検算スキップ条件\nif (group.skipReconcileCheck) return { ok: true, skipped: true }\nconst diff = sumByBookRow(group.consolidated) - sumByBookRow(group.individual)\nreturn { ok: diff === sumByBookRow(group.modify), skipped: false }\n","typescript",[14,76,77,86,138,185],{"__ignoreMap":40},[78,79,82],"span",{"class":80,"line":81},"line",1,[78,83,85],{"class":84},"sxvE3","// 検算スキップ条件\n",[78,87,89,93,97,101,104,106,109,112,115,119,122,125,128,131,133,135],{"class":80,"line":88},2,[78,90,92],{"class":91},"sHkkW","if",[78,94,96],{"class":95},"shFtX"," (",[78,98,100],{"class":99},"s4oTP","group",[78,102,103],{"class":95},".",[78,105,68],{"class":99},[78,107,108],{"class":95},")",[78,110,111],{"class":91}," return",[78,113,114],{"class":95}," { ",[78,116,118],{"class":117},"sz8Xr","ok",[78,120,121],{"class":95},": ",[78,123,124],{"class":91},"true",[78,126,127],{"class":95},", ",[78,129,130],{"class":117},"skipped",[78,132,121],{"class":95},[78,134,124],{"class":91},[78,136,137],{"class":95}," }\n",[78,139,141,145,148,151,155,158,160,162,165,167,170,173,175,177,179,182],{"class":80,"line":140},3,[78,142,144],{"class":143},"stQ0i","const ",[78,146,147],{"class":99},"diff",[78,149,150],{"class":95}," =",[78,152,154],{"class":153},"senZ8"," sumByBookRow",[78,156,157],{"class":95},"(",[78,159,100],{"class":99},[78,161,103],{"class":95},[78,163,164],{"class":99},"consolidated",[78,166,108],{"class":95},[78,168,169],{"class":143}," - ",[78,171,172],{"class":153},"sumByBookRow",[78,174,157],{"class":95},[78,176,100],{"class":99},[78,178,103],{"class":95},[78,180,181],{"class":99},"individual",[78,183,184],{"class":95},")\n",[78,186,188,191,193,195,197,199,202,204,206,208,210,213,216,218,220,223],{"class":80,"line":187},4,[78,189,190],{"class":91},"return",[78,192,114],{"class":95},[78,194,118],{"class":117},[78,196,121],{"class":95},[78,198,147],{"class":99},[78,200,201],{"class":143}," ===",[78,203,154],{"class":153},[78,205,157],{"class":95},[78,207,100],{"class":99},[78,209,103],{"class":95},[78,211,212],{"class":99},"modify",[78,214,215],{"class":95},"), ",[78,217,130],{"class":117},[78,219,121],{"class":95},[78,221,222],{"class":91},"false",[78,224,137],{"class":95},[19,226,228],{"id":227},"codexレビューで方針転換した経緯","Codexレビューで方針転換した経緯",[10,230,231],{},"最初の計画では「③の連結修正仕訳から①の個別仕訳を逆推測する」設計にしていた。Codex（gpt-5.5）に投げたところ即座に致命点を突かれた。",[233,234,235],"blockquote",{},[10,236,237],{},"JournalEntry単位で逆推測すると、A社の仕訳とB社の仕訳が混在した片側だけになり、二社の個別処理を再構成できない。データ駆動で個別仕訳をソースに持つべき。",[10,239,240,241,244],{},"設例ファイルに ",[14,242,243],{},"individualEntries"," を直接持たせるデータ駆動方式に切り替えた。書く量は増えたが、「期末残高ベース＋差額は現金預金で補完」という設計指針をユーザーから受けて、I-2-1／I-2-2／I-2-3を全面書き直しした。",[19,246,248],{"id":247},"i-2-2-の借方貸方ミスをユーザー指摘で発見","I-2-2 の借方貸方ミスをユーザー指摘で発見",[10,250,251,252,255],{},"I-2-2 の ",[14,253,254],{},"cogs-to-sga-reclass","（売上原価から販管費への振替）で、借方が費用なのに貸方も「費用」になっている矛盾が残っていた。ユーザーから「貸方は費用じゃなく、実態は現金預金が動いているはず」と指摘されて気づいた。",[10,257,258],{},"業務委託サービスで原価が労務費中心という文脈を踏まえ、ラベルを「売上原価（労務費）」に変えたうえで、貸方を現金預金に修正した。仕訳の意味を読み解く前提知識がないと検出できないバグで、Codexも見落としていた。",[19,260,262],{"id":261},"i-2-3-を-i-2-1-構造に統一","I-2-3 を I-2-1 構造に統一",[10,264,265,266,269],{},"I-2-3 は当初、独自の構造で「未達取引」を扱っていたが、I-2-1 と並べて見せたときに学習者の認知負荷が跳ねる。",[14,267,268],{},"期首棚卸 + 仕入 − 期末棚卸 = 売上原価"," の流れに揃え、未達取引4本を ② 連結上あるべき仕訳のセクションに追加した。これで I-2-1／I-2-2／I-2-3 が同じ骨組みで読める。",[19,271,273],{"id":272},"i-3-1-に減価償却スケジュール表を追加","I-3-1 に減価償却スケジュール表を追加",[10,275,276],{},"I-3-1（固定資産の未実現利益消去）では、未実現利益¥400 が10年かけて毎期¥40ずつ実現していく流れをモーダル内に表として埋め込んだ。",[278,279,280,300],"table",{},[281,282,283],"thead",{},[284,285,286,290,294,297],"tr",{},[287,288,289],"th",{},"年度",[287,291,293],{"align":292},"right","期首未実現",[287,295,296],{"align":292},"当期実現",[287,298,299],{"align":292},"期末未実現",[301,302,303,318,330,341],"tbody",{},[284,304,305,309,312,315],{},[306,307,308],"td",{},"X1",[306,310,311],{"align":292},"400",[306,313,314],{"align":292},"40",[306,316,317],{"align":292},"360",[284,319,320,323,325,327],{},[306,321,322],{},"X2",[306,324,317],{"align":292},[306,326,314],{"align":292},[306,328,329],{"align":292},"320",[284,331,332,335,337,339],{},[306,333,334],{},"...",[306,336,334],{"align":292},[306,338,334],{"align":292},[306,340,334],{"align":292},[284,342,343,346,348,350],{},[306,344,345],{},"X10",[306,347,314],{"align":292},[306,349,314],{"align":292},[306,351,352],{"align":292},"0",[10,354,355],{},"「未実現損益の実現」という用語が業界標準として正しいか不安だったので、Turso DBに登録済みのTAC『連結財務諸表 1』を蔵書検索で引いてp.304を確認した。同書の表記をそのまま採用した。",[19,357,359],{"id":358},"_4kワイド画面対応","4Kワイド画面対応",[10,361,362,363,366],{},"精算表を3カラムレイアウトに組み替えた。",[14,364,365],{},"max-width"," を撤廃し、サイドバー1/8、前提条件エリア2/8、精算表本体が残り5/8という比率に調整した。FHDでは従来通り収まり、4Kでは前提条件と精算表が左右に並ぶようになった。",[19,368,369],{"id":369},"データ構造の変更点",[10,371,372],{},"設例ファイルの型定義に追加した主なフィールド：",[374,375,376,383,389,394],"ul",{},[377,378,379,382],"li",{},[14,380,381],{},"IndividualModifyColumnDef","：個別修正仕訳列の型",[377,384,385,388],{},[14,386,387],{},"fiscalYearLabel","：会計期間ラベル（「連結WS_FY20X2-03」など）",[377,390,391,393],{},[14,392,68],{},"：検算スキップフラグ",[377,395,396,398],{},[14,397,243],{},"：① 個別上の処理の仕訳配列",[10,400,401,403],{},[14,402,387],{}," を入れたことで、ヘッダーに「連結WS_FY20X2-03」と出るようになり、複数年度を切り替える設例で「いま何期目か」が一目で分かる。",[19,405,407],{"id":406},"codex再レビューでの追加指摘","Codex再レビューでの追加指摘",[10,409,410,411,414],{},"データ駆動に切り替えた更新版を ",[14,412,413],{},"codex exec resume --last"," で再レビューに回したところ、次の致命点が出た。",[374,416,417,420],{},[377,418,419],{},"ペアリング（借方／貸方を同じ行位置に揃える）が崩れているグループがある",[377,421,422,424],{},[14,423,68],{}," の使いどころを設例ごとにコメントで残すべき",[10,426,427,428,430],{},"行位置のペアリングは、グループ単位で借方／貸方を揃えるユーティリティを噛ませて解決した。",[14,429,68],{}," のコメントは設例ファイルに直接書き込んで、後から読んだ自分が「なぜスキップしたか」を即座に思い出せるようにした。",[19,432,433],{"id":433},"学んだこと",[374,435,436,439,445,448],{},[377,437,438],{},"仕訳の片側（連結修正仕訳）から両側（個別＋連結あるべき）を復元するのは無理。データソースを増やす方が結果的に保守しやすい",[377,440,441,444],{},[14,442,443],{},"② − ① = ³"," の検算は学習者向けの安心感だけでなく、設例データの整合性チェックとしても効く",[377,446,447],{},"Codexは構造的な破綻（逆推測の不可能性）を突くのは得意だが、会計実務的な借方貸方の意味付けは見抜けない。両軸でレビューを回す必要がある",[377,449,450,451,453],{},"4Kワイド画面では ",[14,452,365],{}," を撤廃してカラム比率で組む方が、画面の余白を活かせる",[19,455,456],{"id":456},"関連ファイル",[374,458,459,464,469,475],{},[377,460,461],{},[14,462,463],{},"apps/web/app/components/lessons/JournalEntryModal.vue",[377,465,466],{},[14,467,468],{},"apps/web/app/composables/lessons/useReconcileCheck.ts",[377,470,471,474],{},[14,472,473],{},"apps/web/app/data/lessons/consolidated/I-2-1.ts"," ほか6設例",[377,476,477],{},[14,478,479],{},"apps/web/app/types/lessons/IndividualModifyColumnDef.ts",[481,482,483],"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 .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}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":40,"searchDepth":88,"depth":88,"links":485},[486,487,488,489,490,491,492,493,494,495,496],{"id":21,"depth":88,"text":21},{"id":50,"depth":88,"text":51},{"id":227,"depth":88,"text":228},{"id":247,"depth":88,"text":248},{"id":261,"depth":88,"text":262},{"id":272,"depth":88,"text":273},{"id":358,"depth":88,"text":359},{"id":369,"depth":88,"text":369},{"id":406,"depth":88,"text":407},{"id":433,"depth":88,"text":433},{"id":456,"depth":88,"text":456},"dev","連結会計I-2-1〜I-3-3の6設例で、個別上の処理を前提条件エリアに追加し、JournalEntryModalを3部構成（個別／連結あるべき／連結修正）に再設計。bookRowId単位で『② − ① = ③』を自動検算し、Codexレビューで方針転換した過程を含めて記録する。","md",{},true,null,"/consolidated-3part-modal-expansion","eurekapu-nuxt4",false,"2026-05-01T00:00:00.000Z",{"title":5,"description":498},"2026-05/2026-05-01/consolidated-3part-modal-expansion",[510,511,512,513,514],"連結会計","Nuxt","Vue","リファクタリング","UI改善","nRbIyk4NC-86V0cs9pOQJtNHYqPrpDExqOYts00Yhe0",[],"https://log.eurekapu.com/og/blog/consolidated-3part-modal-expansion.png?v=2026-05-01T00%3A00%3A00.000Z&title=%E9%80%A3%E7%B5%90%E4%BC%9A%E8%A8%88%E3%83%AC%E3%83%83%E3%82%B9%E3%83%B3%E3%81%AE%E4%BB%95%E8%A8%B3%E3%83%A2%E3%83%BC%E3%83%80%E3%83%AB%E3%82%923%E9%83%A8%E6%A7%8B%E6%88%90%E3%81%AB%E6%8B%A1%E5%BC%B5%EF%BC%9A%E5%80%8B%E5%88%A5%E2%86%92%E9%80%A3%E7%B5%90%E3%81%82%E3%82%8B%E3%81%B9%E3%81%8D%E2%86%92%E9%80%A3%E7%B5%90%E4%BF%AE%E6%AD%A3%E3%81%AE%E5%B7%AE%E5%88%86%E6%A4%9C%E7%AE%97&author=Kei%20Komatsu&sig=cdebced3ba9610f1",1782528831490]