1. 基本情報

焦点質問: 資本金・借入等の財務イベントからどのようなINVを生成するか?

項目内容
関数名generateFinanceInvoices
ファイル401_bat_rpa.js
入力25_bud_finance
出力32_wrk_invoice + 31_wrk_order
メニュー「🤖 RPA・自動化 > 💰 資金移動・財務取引の自動起票」

2. 前提条件・依存関係

項目内容
SSOT32_wrk_invoice(INV台帳が正の情報源)
マスタ依存11_mst_account — 科目名完全一致必須・諸表区分は自動付与
ORD 依存31_wrk_order — 参照元 ID|開始年月 キーで検索・タブ不存在時はスキップ
前提: 有効フラグTRUE のみ処理(空・未定義は FALSE 扱い)
前提: 列参照ヘッダー名ベース(indexOf)。列番号ハードコード禁止
実行引数targetOverride(対象年月指定)/ _silent(ダイアログ非表示)

3. 入力スキーマ

25_bud_finance カラム定義

#カラム名入力/自動説明制約
1A有効フラグBoolean入力(checkbox)FALSE → SKIP空セルも FALSE 扱い
2B管理IDString入力FIN_NNNN 形式ORD紐づけキーに使用
3C取引名String入力資本金払込、借入金等摘要に転記
4D取引先名String入力ORD・INV に転記
5E科目名String入力(pulldown)資本金、長期借入金等11_mst_account に登録済であること
6F金額Number入力#,##00 → SKIP
7G発生日(P/L計上日)Date入力発生年月の判定に使用空 → SKIP
8H収支区分String入力(pulldown)収入/支出空 → '支出' でフォールバック
9I決済手段String入力(pulldown)通常は「資産計上」空 → '資産計上' でフォールバック
10J組織名String入力(pulldown)ORD・両INV行に転記
11K備考String入力INV には転記されない
12L最終起票年月日Date自動(RPA)起票済み判定に使用ensureLastBilledCol_ で列を自動確保

4. 処理ロジック(マトリクス)

共通INVフィールド(全Row共通で buildInvRow_ が自動設定): 有効フラグ=true, 請求ID=INV_YYYYMMDD_NNNN(自動発番), 起票日時=now, 起票者="RPA自動起票", 請求ステータス="未処理", 通貨="JPY", 税区分="対象外", 消費税額_計画=0, PJ名="指定なし_共通費など"(未指定時デフォルト)

項番処理フェーズ入力(論理名)入力(物理名: タブ.列)処理詳細 / 変換ロジック出力(論理名)出力(物理名: タブ.列)例外処理
S1.1初期化: 対象年月算出最終起票年月日25_bud_finance.L列deriveTargetYmFromSheet_() で有効行の最終起票年月日の最大値に +1ヶ月targetYm変数: targetYm (YYYY-MM)全行が空 → 当月(YYYY-MM)をデフォルト使用。targetOverride 指定時はそちらを優先
S1.2初期化: 最終起票列確保ヘッダー行25_bud_finance 1行目ensureLastBilledCol_() で「最終起票年月日」列を確保。旧名「最終起票年月」があればリネーム、なければ末尾に追加idxLastBilled変数: idxLastBilled
S1.3初期化: ORD準備31_wrk_order 全体buildOrdMap_() で既存ORDの `参照元ID開始年月` → ORD_IDマップを構築ordMap変数: ordMap
S2.1ループ開始25_bud_finance 全行FOR EACH 行 — 以下 S2〜F2 を各行に対して実行
S2.2スキップ判定1: 有効フラグ有効フラグ25_bud_finance.A列!== true && !== 'TRUE'SKIP空セル・未定義値もFALSE扱い
S2.3スキップ判定2: 対象期間発生日(P/L計上日)25_bud_finance.G列parseDateToYm → null なら SKIP。targetYm < occurYmSKIP日付解析不能 → parseDateToYm が null → SKIP
S2.4スキップ判定3: 起票済み最終起票年月日25_bud_finance.L列lastBilledYm >= occurYmSKIP(当月以前は起票済み)
S2.5スキップ判定4: 必須項目科目名, 金額25_bud_finance.E列, F列科目名が空 OR 金額=0 → SKIP※1
S3.1変数: 基本情報取得管理ID, 取引名, 取引先名, 科目名, 金額, 収支区分, 決済手段, 組織名25_bud_finance.B〜K列各列から文字列/数値を trim 取得各変数変数: mgrId, txnName, vendorName, accName, amt, shushi, payMethod, orgName収支区分が空 → '支出'、決済手段が空 → '資産計上' でフォールバック
S3.2変数: 発生月末日発生日(P/L計上日)25_bud_finance.G列occurYm.split('-')new Date(year, month, 0) で当月末日を Date 型で取得occurMonthEnd変数: occurMonthEnd (Date)
O1.1ORD: キー生成管理ID, 発生年月変数: mgrId, occurYm`ordKey = mgrId + "" + occurYm`ordKey変数: ordKey
O1.2ORD: 既存検索ordKey変数: ordMapordKey が既存マップに存在 → 既存 ORD_ID を使用ordId変数: ordId
O1.3ORD: 新規作成ordKey不存在時31タブに新規ORD行を作成。参照元区分="FIN", 参照元ID=管理ID, 契約形態="財務取引", 税抜金額_発注=金額, PJ名="指定なし_共通費など", 発注ステータス="発注済"ordId31_wrk_order (新規行)
F1.1INV 1: 重複チェック摘要32_wrk_invoice.摘要列isDuplicate_()"【RPA:FIN】{occurYm} {取引名}" を有効行から検索 → 存在すれば SKIP (INV 1 + INV 2 ともスキップ)
F1.2INV 1: 本体行生成科目名, 金額, 収支区分, 決済手段, 取引先名, 組織名25_bud_finance.E,F,H,I,D,J列申請種別="財務仕訳(振替等)", 発生日=occurMonthEnd, 決済日_計画=occurMonthEnd, 税抜金額_計画=amt, 税込金額_計画=amt, 未決済残高=amtINV行 (本体)32_wrk_invoice (新規行)
F2.1INV 2: 科目名決定収支区分変数: shushi収入"未収入金", それ以外 → "未払金"offsetAcc変数: offsetAcc※2
F2.2INV 2: 重複チェック摘要32_wrk_invoice.摘要列isDuplicate_()"【RPA:FIN】{occurYm} {取引名} {offsetAcc}" を検索 → 存在すれば SKIP
F2.3INV 2: 未収入金/未払金行生成金額, 収支区分, 決済手段, 取引先名, 組織名25_bud_finance.F,H,I,D,J列申請種別="財務仕訳(振替等)", 科目名=offsetAcc, 発生日=occurMonthEnd, 決済日_計画=occurMonthEnd, 決済手段=payMethod, 未決済残高=amtINV行 (未収入金/未払金)32_wrk_invoice (新規行)
F2.4最終起票年月日更新25タブの当該行の最終起票年月日列を occurMonthEnd で即時更新最終起票年月日25_bud_finance.L列
W1.1一括書き込み: ORDnewOrdRowswriteOrdRows_() で31タブ末尾に追記。バリデーション一時解除→書込→再適用31_wrk_order
W1.2一括書き込み: INVdraftswriteInvRows_() で32タブ末尾に追記。科目マスタから諸表区分・大分類を自動付与32_wrk_invoice

脚注:

  • ※1: 仕様書の擬似コードには未記載だが、コード(L1534)に if (!accName || amt === 0) continue; が存在
  • ※2: コード上は shushi === '収入' のみ判定し、それ以外は全て '未払金'。「収入」「支出」以外の値が入った場合のバリデーションはない

5. 出力サマリー

5.1 生成されるINV(1取引あたり2行)

INV科目金額決済手段申請種別摘要パターン
本体入力値(資本金等)入力値入力値(通常「資産計上」)財務仕訳(振替等)【RPA:FIN】{YYYY-MM} {取引名}
相手科目未収入金 or 未払金同額同上財務仕訳(振替等)【RPA:FIN】{YYYY-MM} {取引名} {未収入金/未払金}

5.2 具体例: 資本金 3,000,000(収入)

INV科目金額決済手段摘要
1資本金3,000,000資産計上【RPA:FIN】2025-11 資本金振込
2未収入金3,000,000資産計上【RPA:FIN】2025-11 資本金振込 未収入金

5.3 生成されるORD(1取引あたり1行)

フィールド
参照元区分FIN
参照元ID管理ID (FIN_NNNN)
契約形態財務取引
税抜金額_発注金額
PJ名指定なし_共通費など
発注ステータス発注済

6. 業務ルール

6.1 B/S への反映

財務INVは「資産計上」決済手段により、B/S に即時計上される。本体行(資本金等)と相手科目行(未収入金/未払金)がペアで計上され、現預金は決済前は中立となる。

決済前

科目残高cashPlug
資本金 (純資産)+3,000,000+3,000,000
未収入金 (流動資産)+3,000,000-3,000,000
現預金0中立

部分決済 2,000,000 消込後

科目残高cashPlug
資本金+3,000,000+3,000,000
未収入金+1,000,000-1,000,000
現預金+2,000,000入金分

6.2 STL 自動作成

Action A で未収入金/未払金 INV に対して STL を自動作成する。 (摘要に「未収入金」「未払金」を含む資産計上 INV が対象)

STL フィールド
消込対象請求ID未収入金 INV の ID
決済口座口座振込_福井銀行
入出金区分収入→入金 / 支出→出金
税込金額_決済INV の請求総額
決済ステータス未処理

ユーザーは STL を分割して部分決済が可能。

6.3 CF 日次への反映

シートソース金額
83 CF日次計上未収入金 INV(未決済残高)承認済のみ
84 CF日次計画未収入金 INV(未決済残高)+ 実績 STLハイブリッド
85 CF日次実績33タブ消込済 STL実際の入出金

6.4 収支区分による科目分岐

収支区分相手科目STL入出金区分
収入未収入金入金
支出未払金出金

CF除外: 「資産計上」決済手段のINVは CF 計算書の営業CF等には含まれない。入出金は STL 消込経由で CF 日次にのみ反映される。


7. 冪等性(二重起票防止)

メカニズム対象詳細
摘要ベース重複チェック (INV 1)32_wrk_invoiceisDuplicate_() が有効行(有効フラグ !== FALSE)の摘要列を完全一致で検索。"【RPA:FIN】{occurYm} {取引名}" が存在すれば INV 1 + INV 2 ともスキップ
摘要ベース重複チェック (INV 2)32_wrk_invoice"【RPA:FIN】{occurYm} {取引名} {offsetAcc}" で個別にも重複チェック(INV 1 が存在せず INV 2 のみ残存するケースに対応)
最終起票年月日ガード25_bud_finance.L列lastBilledYm >= occurYm であれば当該行の当月分はスキップ。ただしこの更新は finUpdates として即時書き込みされるため、同一実行内での二重ループは発生しない
ORD 既存検索31_wrk_orderbuildOrdMap_ で `参照元ID
INV ID キャッシュ実行内メモリgenerateInvId_._cache = {} / generateOrdId_._cache = {} を実行開始時にリセットし、同一実行内の ID 衝突を防止

注意: 無効化済み行(有効フラグ=FALSE)の INV は isDuplicate_ のスキャン対象外。同じ摘要の INV を無効化してから再実行すると、新規 INV が生成される(仕様通りの挙動)。


8. エラーハンドリング

エラー条件処理ユーザー通知
25_bud_finance タブ不存在即時 returnui.alert('🚨 25_bud_finance が見つかりません。')
25_bud_finance データ行なし(ヘッダーのみ)即時 returnui.alert('✅ 財務データがありません。')
「最終起票年月日」列が存在しないensureLastBilledCol_ が末尾に自動追加(青背景・白文字・太字)なし(自動復旧)
「最終起票年月日」が旧名「最終起票年月」ensureLastBilledCol_ がヘッダーをリネームなし(自動復旧)
31_wrk_order タブ不存在ORD 作成をスキップ(ordId 空のまま INV を生成)なし(INV は正常生成)
起票対象行ゼロ正常終了(count=0)ui.alert('✅ 起票対象なし', '{targetYm} の期間で新たに起票すべき財務取引はありませんでした。')
関数内例外(catch)Utils.logError でログ記録ui.alert('🚨 generateFinanceInvoices でエラーが発生しました', e.message)
_silent=true の場合ダイアログ非表示(バッチ統合呼び出し用)なし(return count のみ)

9. テスト仕様

テストIDテスト名前提条件期待結果
T1資本金 収入 起票25_bud_finance に資本金 3,000,000(収入)を入力INV 2行(資本金 + 未収入金)生成
T2Action A: STL自動作成T1 の未収入金 INV を承認STL 1行自動作成(未収入金に紐づく)
T3B/S 決済前検証T1 後にマート更新B/S: 資本金+3M, 未収入金+3M, 現預金=0
T4部分決済STL を 2,000,000 で部分消込未決済残高=1,000,000, ステータス=部分決済
T5B/S 部分決済後検証T4 後にマート更新B/S: 未収入金+1M, 現預金+2M
T6CF日次計画ハイブリッドT4 後計画(未決済残高 1M)+ 実績(消込額 2M)のハイブリッド
T7冪等性: 二重起票防止T1 の後に同一条件で再実行起票対象なし(count=0)
T8無効行スキップ有効フラグ=FALSE の行を含むFALSE 行は処理されない
T9ORD 重複防止同一管理ID・同一年月で再実行既存 ORD を再利用、新規作成しない
T10借入金 支出 起票25_bud_finance に長期借入金 5,000,000(支出)を入力INV 2行(長期借入金 + 未払金)生成

付録

付録A: 変更履歴

日付内容
2026-04-12 16:06Template A 形式にリライト。§2 前提条件、§7 冪等性、§8 エラーハンドリングを新規追加

付録B: 関連仕様書

仕様書関連
spec_engineAction A(STL自動作成)/ Action B(消込処理)
spec_bsB/S への反映ロジック
spec_daily_cfCF日次(83/84/85タブ)への反映
spec_ordORD 自動紐づけ仕様