1. 概要
焦点質問: 今月および年度累計の損益はいくらか?
P/L(損益計算書)を 32_wrk_invoice(承認済INV)から直接集計し、単月推移(61_pl)と年度累計(62_pl_ytd)を出力する。
42_trn_journal は監査証跡であり、P/L集計のソースとしては使用しない。
| 項目 | 内容 |
|---|
| 出力タブ | 61_pl(単月)/ 62_pl_ytd(累計) |
| 関数 | dmCalcPl_, dmBuildPlOutput_ |
| ファイル | 603_datamart_pl.js |
旧 (V1) → 新 (V2) の変更
| 項目 | V1 | V2 |
|---|
| 実績ソース | 42_trn_journal | 32_wrk_invoice |
| 金額列 | 日本円金額 (税抜) | 税込金額_計画 |
| 対象判定 | ステータス = "計上済" | 請求ステータス = "承認済" or "決済完了" |
2. データソース
| ソース | 読み込み条件 | 用途 |
|---|
| 32_wrk_invoice | 請求ステータス = "承認済" or "決済完了" | 実績P/L |
| 41_trn_budget | 有効フラグ = TRUE, pYm >= boundary | 予算P/L |
| 11_mst_account | acctMap(諸表区分・表示区分) | 科目分類 |
32_wrk_invoice から読み取る列
| 列 | ヘッダー名 | P/Lでの用途 |
|---|
| A | 有効フラグ | FALSE → SKIP |
| G | 発生日(P/L計上日) | P/L計上月 (pYm) |
| H | 決済日_計画 | 決済月 (sYm) → 期ずれ判定に使用 |
| I | 請求ステータス | "承認済" or "決済完了" のみ対象 |
| J | 収支区分 | 支出/収入 → 金額の符号判定に使用 |
| M | 科目名 | P/Lセクション分類キー |
| R | 税込金額_計画 | 集計金額 |
| T | 決済手段 | noCash判定(仕訳振替→B/S cashPlug補正用) |
3. 対象判定・フィルタ条件
| # | 条件 | 処理 | 理由 |
|---|
| F1 | 有効フラグ = FALSE | SKIP | 論理削除行の除外 |
| F2 | 請求ステータス ∉ [承認済, 決済完了] | SKIP | 未承認INVは計上対象外 |
| F3 | 発生日が空 | SKIP | 計上月が特定できない |
| F4 | 科目の諸表区分 = B/S | P/L対象外 | B/S科目はP/Lに含めない |
| F5 | 科目名 = "指定なし" or "バッファ" | buffer セクションへ | 未定予算の暫定配置 |
| F6 | 科目が11_mst_account に未登録 | エラー | キーワード推測は禁止 |
P/L科目の例
| 科目名 | セクション | 備考 |
|---|
| 役員報酬 | 販管費 (sga) | |
| 給料手当 | 販管費 (sga) | |
| 支払手数料 | 販管費 (sga) | 顧問料等 |
| 開発外注費 | 販管費 (sga) | 業務委託 |
| 雑給 | 販管費 (sga) | アルバイト |
| 法定福利費 | 販管費 (sga) | 会社負担の社保 |
| 雑収入 | 営業外収益 (non_op_inc) | 益税等 |
B/S科目の例(P/L対象外)
| 科目名 | B/Sセクション | 備考 |
|---|
| 預り金 | 流動負債 (liab_cl) | 源泉所得税等の天引き |
| 仮払消費税等 | 流動資産 (asset_ca) | 課税事業者の仕入税額控除 |
4. 処理ロジック
※ 本セクションは技術実装の詳細を記述する(TDD)。業務ルールは §5 参照。
4.1 INV読み込み・変数算出
| STEP | 処理 | 入力 | 出力 | 条件 |
|---|
| P1.1 | スキップ判定 | 有効フラグ, 請求ステータス, 発生日 (32_wrk_invoice.A,I,G列) | — | FALSE→SKIP、ステータス∉[承認済,決済完了]→SKIP、発生日空→SKIP |
| P1.2 | 年月・金額算出 | 発生日, 決済日_計画, 税込金額_計画, 決済手段 (32_wrk_invoice.G,H,R,T列) | pYm, sYm, amt, noCash | pYm = parseDateToYm(発生日), sYm = parseDateToYm(決済日_計画) || pYm, noCash = 決済手段==="仕訳振替" |
| P1.3 | P/L vs B/S分類 | 科目名 (32_wrk_invoice.M列) | secId | acctMap[科目名].stmtで判定。P/L→セクション分類へ、B/S→P/L対象外。マスタ未登録→エラー。"指定なし"→buffer |
4.2 セクション分類 (dmGetPlSectionId_)
| 表示区分 (disp) のキーワード | セクション |
|---|
| 売上高 / 営業収益 / 売上 | sales |
| 売上原価 / 原価 / 仕入 | cogs |
| 販管 / 販売 / 管理 / 一般 | sga |
| 営業外収益 / 外収益 | non_op_inc |
| 営業外費用 / 外費用 / 支払利息 | non_op_exp |
| 特別利益 | ext_inc |
| 特別損失 | ext_exp |
| 法人税 / 税金 | tax |
| (disp が空) | エラー(表示区分の登録漏れ) |
4.3 符号決定・期ずれイベント生成
| STEP | 処理 | 入力 | 出力 | 条件 |
|---|
| P2.1 | 符号決定 | 収支区分, 税込金額_計画 (32_wrk_invoice.J,R列) | amt (符号付き) | 支出→費用(マイナス方向)、収入→収益(プラス方向) |
| P2.2 | 期ずれ判定 | pYm, sYm | — | pYm ≠ sYm → 期ずれあり |
| P2.3 | 後払い期ずれ | pYm < sYm | B/Sイベント → martBs | pYmに未払金+(or未払費用+)/ sYmに未払金−。dmIsAccruedExpense_()で未払金/未払費用を判別 |
| P2.4 | 前払い期ずれ | sYm < pYm | B/Sイベント → martBs | sYmに前払費用+ / pYmに前払費用−。収入前受け→前受金 |
4.4 セクション合計・利益行計算 (dmCalcPl_)
| STEP | 処理 | 入力 | 出力 | 条件 |
|---|
| C1 | グループ集計 | martPl[secId] の全科目 | sectionTotalsPl[secId] | type = 'group' の各セクションを月別合計 |
| C2 | 利益行算出 | 定義済みの calc 配列 | sectionTotalsPl[profitId] | type = 'profit': calc の各セクション合計に sign を乗じて加算 |
| C3 | みなし法人税 | 税引前利益YTD, 累進課税ブラケット | sectionTotalsPl[auto_tax_*] | type = 'auto_tax': 手動法人税あり→スキップ。月次差分 = max(0, 当月YTD税額 − 前月YTD税額)。地方税は均等割を加算 |
4.5 出力配列構築 (dmBuildPlOutput_)
| STEP | 処理 | 入力 | 出力 |
|---|
| O1 | ヘッダー行 | uiHeader, targetMonthsWithActBgt | タイトル行 + ヘッダー行(P/L科目, 通期, 各月) |
| O2 | グループ行 | martPl, sectionTotalsPl | ■セクション名 → 科目明細 → 【計】小計 |
| O3 | 利益行 | sectionTotalsPl | 売上総利益, 営業利益, 経常利益, 税引前当期純利益, 当期純利益 |
| O4 | YTD変換 | 単月配列 | dmToYtdArray_ で累積配列に変換 |
4.6 境界月算出
| STEP | 処理 | 入力 | 出力 | 条件 |
|---|
| B1 | 境界月算出 | 承認済INVの最大発生月 | boundaryMonthStr | 最大発生月 + 1ヶ月(当月を超えない) |
| B2 | 実績/予算振り分け | pYm, boundaryMonthStr | — | pYm < boundary → 実績、pYm >= boundary → 予算(41_trn_budget) |
5. 財務ロジック (FRD)
※ 本セクションは経理担当・CFOが検証可能な表現で記述。技術用語は使用しない。
→ 技術詳細: §4 参照
5.1 P/Lセクション構造
損益計算書は以下のセクション構造で集計される。各利益行は上位セクションの合計から算出される。
売上高
売上原価
━━━━━━━━━━━━━━━━━━━
売上総利益 = 売上高 − 売上原価
販売費及び一般管理費
未定・バッファ予算
━━━━━━━━━━━━━━━━━━━
営業利益 = 売上総利益 − 販管費 − バッファ
営業外収益
営業外費用
━━━━━━━━━━━━━━━━━━━
経常利益 = 営業利益 + 営業外収益 − 営業外費用
特別利益
特別損失
━━━━━━━━━━━━━━━━━━━
税引前当期純利益 = 経常利益 + 特別利益 − 特別損失
法人税等(手動計上)
みなし法人税等・国税(自動計算)
みなし法人税等・地方税(自動計算)
━━━━━━━━━━━━━━━━━━━
当期純利益 = 税引前当期純利益 − 法人税等 − みなし法人税等
5.2 符号ルール
| 収支区分 | P/Lへの影響 | 例 |
|---|
| 支出 | 費用としてマイナス方向に計上 | 役員報酬 −500,000 |
| 収入 | 収益としてプラス方向に計上 | 雑収入 +2,000 |
負の税込金額(預り金取崩し等)は B/S 科目のため P/L に影響しない。
5.3 期ずれ処理
P/L計上月(発生日ベース)と決済月が異なる場合、B/S に経過勘定を計上して期間帰属を正しく反映する。
| パターン | 条件 | B/S処理 | 根拠 |
|---|
| 後払い | 発生月 < 決済月 | 発生月に未払金(or 未払費用)を計上、決済月に取崩し | 中小企業会計指針 第30項 |
| 前払い | 決済月 < 発生月 | 決済月に前払費用を計上、発生月に取崩し | 中小企業会計指針 第31項 |
| 収入の前受け | 決済月 < 発生月 かつ 収入 | 決済月に前受金を計上、発生月に取崩し | 中小企業会計指針 第32項 |
未払金と未払費用の区分: 給料・役員報酬・法定福利・支払利息・地代家賃など継続的役務提供の未払対価は「未払費用」、それ以外は「未払金」。
→ 技術詳細: §4.3 参照
期ずれの具体例
支払手数料 22,000:
発生日 = 2025-11-30 (発生月 = 2025-11)
支払期限 = 2025-12-25 (決済月 = 2025-12)
→ P/L: 2025-11 に 支払手数料 −22,000
→ B/S: 2025-11 に 未払金 +22,000 / 2025-12 に 未払金 −22,000
5.4 予実差異の定義
計画P/L (63/64タブ) における差異計算の定義は spec_plan — 予実差異の定義 を参照。
| 指標 | 計算式 | 符号の解釈 |
|---|
| 金額差異 | 実績 − 計画 | 収益科目: 正=好意的(実績超過)/ 費用科目: 正=不利(超過) |
| 差異率 | 金額差異 ÷ | 計画 |
科目レベルの要因分解(レート差異・能率差異・数量差異等)は現行スコープ外。将来対応は TODO_future 参照。
5.5 みなし法人税の計算
手動で法人税等が計上されていない場合、システムが自動計算する。
- 所得割: 税引前当期純利益の年度累計に累進課税ブラケットを適用し、月次差分を算出。赤字月はゼロにクランプ(マイナスにならない)
- 均等割(地方税のみ): 年額を事業月数で按分し毎月定額計上。設立初年度は設立月から期末までの月数で按分(1ヶ月未満切上、100円未満切捨)。端数は最終月に加算
- 手動計上された法人税等がある場合、みなし法人税の自動計算はスキップ
→ 技術詳細: §4.4 STEP C3 参照
5.6 境界月(実績 vs 予算の切り替え)
境界月 = 承認済INVの最大発生月 + 1ヶ月(当月を超えない)
発生月 < 境界月 → 実績(32_wrk_invoice から集計)
発生月 >= 境界月 → 予算(41_trn_budget から読み込み)
→ 技術詳細: §4.6 参照
6. 出力スキーマ
列構成
| # | 列名 | 内容 |
|---|
| 1 | P/L科目 (表示区分 > 勘定科目) | セクション・科目ラベル |
| 2 | 通期(Total) | 12ヶ月合計 |
| 3〜14 | 各月 (実績/予算) | 月別金額。ヘッダーに「実績」「予算」の区分を付記 |
行構成
| 行タイプ | 表示形式 | 例 |
|---|
| グループヘッダー | ■ セクション名 | ■ 販売費及び一般管理費 |
| 科目明細 | 科目名 | 支払手数料 |
| 小計 | 【セクション名 計】 | 【販売費及び一般管理費 計】 |
| 利益行 | セクション名 | 売上総利益, 営業利益, ... |
| みなし法人税 | 🤖 法人税等・国税/地方税(税率内訳) | |
P/Lセクション → 科目マッピング
| セクション | 表示区分のキーワード | 科目例 |
|---|
| 売上高 (sales) | 売上高, 営業収益, 売上 | 売上高 |
| 売上原価 (cogs) | 売上原価, 原価, 仕入 | 仕入高 |
| 販管費 (sga) | 販管, 販売, 管理, 一般 | 役員報酬, 給料手当, 支払手数料 |
| 未定・バッファ (buffer) | — | 指定なし, バッファ |
| 営業外収益 (non_op_inc) | 営業外収益, 外収益 | 雑収入 |
| 営業外費用 (non_op_exp) | 営業外費用, 外費用, 支払利息 | 支払利息 |
| 特別利益 (ext_inc) | 特別利益 | — |
| 特別損失 (ext_exp) | 特別損失 | — |
| 法人税等 (tax) | 法人税, 税金 | 法人税等 |
7. エッジケース・境界条件
| ケース | 条件 | 処理 |
|---|
| noCash (仕訳振替) | 決済手段 = "仕訳振替" | P/L・B/Sには通常通り計上。C/Fには含めない(現金移動なし)。cashPlug補正: P/L項目→未払金で相殺、B/S負債→立替未精算(資産)で相殺 |
| 赤字月のみなし法人税 | 月次差分がマイナス | ゼロにクランプ(マイナスにならない) |
| 手動法人税あり | 法人税等セクションに計上済み科目あり | みなし法人税の自動計算をスキップ |
| 設立初年度の均等割 | 事業月数 < 12 | 年額を事業月数で按分(100円未満切捨) |
| 表示区分が空 | 11_mst_account の表示区分が未設定 | エラー(セクション判定不可) |
| マスタ未登録科目 | acctMap にキーなし | エラー(キーワード推測は禁止) |
noCash の具体例
雑収入 2,000 (仕訳振替):
→ P/L: 2025-12 に 雑収入 +2,000 ← 計上する
→ C/F: SKIP(現金は動かない)
→ cashPlug: 未払金で相殺(現預金を増やさない)
預り金 +42 (仕訳振替):
→ B/S: 2025-12 に 預り金(流動負債) +42 ← 計上する
→ C/F: SKIP
→ cashPlug: 立替未精算(資産)で相殺
8. テスト仕様
入力: 4件のINV (EMP_0002 角会計事務所 2025-11月分)
| INV | 科目名 | 税込金額_計画 | 収支区分 | 発生日 | P/L or B/S |
|---|
| Row 1 | 支払手数料 | 22,000 | 支出 | 2025-11-30 | P/L |
| Row 1b | 雑収入 | 2,000 | 収入 | 2025-12-25 | P/L |
| Row 2a | 預り金 | 42 | 支出 | 2025-12-25 | B/S (P/L対象外) |
| Row 2 | 預り金 | -42 | 支出 | 2026-01-10 | B/S (P/L対象外) |
期待: P/L出力
| 月 | セクション | 科目 | 金額 |
|---|
| 2025-11 | 販管費 (sga) | 支払手数料 | -22,000 |
| 2025-12 | 営業外収益 (non_op_inc) | 雑収入 | +2,000 |
期待: 利益への影響
| 利益行 | 2025-11 | 2025-12 | 通期 |
|---|
| 営業利益 | -22,000 | 0 | -22,000 |
| 経常利益 | -22,000 | +2,000 | -20,000 |
付録A: 実装変更の影響範囲
| ファイル | 変更内容 |
|---|
601_datamart_ingest.js | 実績ソースを 42→32 に変更。INVヘッダーベースで読み込み |
602_datamart_main.js | dmProcessAllEvents_ の入力を INV ベースに変更 |
603_datamart_pl.js | 変更なし(セクション分類・計算ロジックはそのまま) |
付録B: 出力フォーマット (92_fs_pl)
| 項目 | 仕様 |
|---|
| 列幅自動調整 | 数値・日付列のみ(ラベル列は固定) |
| フィルター | スキーマシートに自動設定 |
| 条件付き書式 | なし(現行) |
付録C: 計画P/L
計画P/Lの生成ロジック・出力スキーマの詳細は spec_plan — 出力スキーマ を参照。