最終更新: 2026/06/22 18:56
財務イベント自動起票 — 25_bud_finance
1. 基本情報
焦点質問: 資本金・借入等の財務イベントからどのようなINVを生成するか?
| 項目 | 内容 |
|---|---|
| 関数名 | generateFinanceInvoices |
| ファイル | 401_bat_rpa.js |
| 入力 | 25_bud_finance |
| 出力 | 32_wrk_invoice + 31_wrk_order |
| メニュー | 「🤖 RPA・自動化 > 💰 資金移動・財務取引の自動起票」 |
2. 前提条件・依存関係
| 項目 | 内容 |
|---|---|
| SSOT | 32_wrk_invoice(INV台帳が正の情報源) |
| マスタ依存 | 11_mst_account — 科目名完全一致必須・諸表区分は自動付与 |
| ORD 依存 | 31_wrk_order — 参照元 ID|開始年月 キーで検索・タブ不存在時はスキップ |
| 前提: 有効フラグ | TRUE のみ処理(空・未定義は FALSE 扱い) |
| 前提: 列参照 | ヘッダー名ベース(indexOf)。列番号ハードコード禁止 |
| 実行引数 | targetOverride(対象年月指定)/ _silent(ダイアログ非表示) |
3. 入力スキーマ
25_bud_finance カラム定義
| # | 列 | カラム名 | 型 | 入力/自動 | 説明 | 制約 |
|---|---|---|---|---|---|---|
| 1 | A | 有効フラグ | Boolean | 入力(checkbox) | FALSE → SKIP | 空セルも FALSE 扱い |
| 2 | B | 管理ID | String | 入力 | FIN_NNNN 形式 | ORD紐づけキーに使用 |
| 3 | C | 取引名 | String | 入力 | 資本金払込、借入金等 | 摘要に転記 |
| 4 | D | 取引先名 | String | 入力 | ORD・INV に転記 | |
| 5 | E | 科目名 | String | 入力(pulldown) | 資本金、長期借入金等 | 11_mst_account に登録済であること |
| 6 | F | 金額 | Number | 入力 | #,##0 | 0 → SKIP |
| 7 | G | 発生日(P/L計上日) | Date | 入力 | 発生年月の判定に使用 | 空 → SKIP |
| 8 | H | 収支区分 | String | 入力(pulldown) | 収入/支出 | 空 → '支出' でフォールバック |
| 9 | I | 決済手段 | String | 入力(pulldown) | 通常は「資産計上」 | 空 → '資産計上' でフォールバック |
| 10 | J | 組織名 | String | 入力(pulldown) | ORD・両INV行に転記 | |
| 11 | K | 備考 | String | 入力 | INV には転記されない | |
| 12 | L | 最終起票年月日 | 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 < occurYm → SKIP | — | — | 日付解析不能 → parseDateToYm が null → SKIP |
| S2.4 | スキップ判定3: 起票済み | 最終起票年月日 | 25_bud_finance.L列 | lastBilledYm >= occurYm → SKIP(当月以前は起票済み) | — | — | — |
| 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.1 | ORD: キー生成 | 管理ID, 発生年月 | 変数: mgrId, occurYm | `ordKey = mgrId + " | " + occurYm` | ordKey | 変数: ordKey |
| O1.2 | ORD: 既存検索 | ordKey | 変数: ordMap | ordKey が既存マップに存在 → 既存 ORD_ID を使用 | ordId | 変数: ordId | — |
| O1.3 | ORD: 新規作成 | ordKey不存在時 | — | 31タブに新規ORD行を作成。参照元区分="FIN", 参照元ID=管理ID, 契約形態="財務取引", 税抜金額_発注=金額, PJ名="指定なし_共通費など", 発注ステータス="発注済" | ordId | 31_wrk_order (新規行) | — |
| F1.1 | INV 1: 重複チェック | 摘要 | 32_wrk_invoice.摘要列 | isDuplicate_() で "【RPA:FIN】{occurYm} {取引名}" を有効行から検索 → 存在すれば SKIP (INV 1 + INV 2 ともスキップ) | — | — | — |
| F1.2 | INV 1: 本体行生成 | 科目名, 金額, 収支区分, 決済手段, 取引先名, 組織名 | 25_bud_finance.E,F,H,I,D,J列 | 申請種別="財務仕訳(振替等)", 発生日=occurMonthEnd, 決済日_計画=occurMonthEnd, 税抜金額_計画=amt, 税込金額_計画=amt, 未決済残高=amt | INV行 (本体) | 32_wrk_invoice (新規行) | — |
| F2.1 | INV 2: 科目名決定 | 収支区分 | 変数: shushi | 収入 → "未収入金", それ以外 → "未払金" | offsetAcc | 変数: offsetAcc | ※2 |
| F2.2 | INV 2: 重複チェック | 摘要 | 32_wrk_invoice.摘要列 | isDuplicate_() で "【RPA:FIN】{occurYm} {取引名} {offsetAcc}" を検索 → 存在すれば SKIP | — | — | — |
| F2.3 | INV 2: 未収入金/未払金行生成 | 金額, 収支区分, 決済手段, 取引先名, 組織名 | 25_bud_finance.F,H,I,D,J列 | 申請種別="財務仕訳(振替等)", 科目名=offsetAcc, 発生日=occurMonthEnd, 決済日_計画=occurMonthEnd, 決済手段=payMethod, 未決済残高=amt | INV行 (未収入金/未払金) | 32_wrk_invoice (新規行) | — |
| F2.4 | 最終起票年月日更新 | — | — | 25タブの当該行の最終起票年月日列を occurMonthEnd で即時更新 | 最終起票年月日 | 25_bud_finance.L列 | — |
| W1.1 | 一括書き込み: ORD | newOrdRows | — | writeOrdRows_() で31タブ末尾に追記。バリデーション一時解除→書込→再適用 | — | 31_wrk_order | — |
| W1.2 | 一括書き込み: INV | drafts | — | writeInvRows_() で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_invoice | isDuplicate_() が有効行(有効フラグ !== 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_order | buildOrdMap_ で `参照元ID |
| INV ID キャッシュ | 実行内メモリ | generateInvId_._cache = {} / generateOrdId_._cache = {} を実行開始時にリセットし、同一実行内の ID 衝突を防止 |
注意: 無効化済み行(有効フラグ=FALSE)の INV は
isDuplicate_のスキャン対象外。同じ摘要の INV を無効化してから再実行すると、新規 INV が生成される(仕様通りの挙動)。
8. エラーハンドリング
| エラー条件 | 処理 | ユーザー通知 |
|---|---|---|
| 25_bud_finance タブ不存在 | 即時 return | ui.alert('🚨 25_bud_finance が見つかりません。') |
| 25_bud_finance データ行なし(ヘッダーのみ) | 即時 return | ui.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行(資本金 + 未収入金)生成 |
| T2 | Action A: STL自動作成 | T1 の未収入金 INV を承認 | STL 1行自動作成(未収入金に紐づく) |
| T3 | B/S 決済前検証 | T1 後にマート更新 | B/S: 資本金+3M, 未収入金+3M, 現預金=0 |
| T4 | 部分決済 | STL を 2,000,000 で部分消込 | 未決済残高=1,000,000, ステータス=部分決済 |
| T5 | B/S 部分決済後検証 | T4 後にマート更新 | B/S: 未収入金+1M, 現預金+2M |
| T6 | CF日次計画ハイブリッド | T4 後 | 計画(未決済残高 1M)+ 実績(消込額 2M)のハイブリッド |
| T7 | 冪等性: 二重起票防止 | T1 の後に同一条件で再実行 | 起票対象なし(count=0) |
| T8 | 無効行スキップ | 有効フラグ=FALSE の行を含む | FALSE 行は処理されない |
| T9 | ORD 重複防止 | 同一管理ID・同一年月で再実行 | 既存 ORD を再利用、新規作成しない |
| T10 | 借入金 支出 起票 | 25_bud_finance に長期借入金 5,000,000(支出)を入力 | INV 2行(長期借入金 + 未払金)生成 |
付録
付録A: 変更履歴
| 日付 | 内容 |
|---|---|
| 2026-04-12 16:06 | Template A 形式にリライト。§2 前提条件、§7 冪等性、§8 エラーハンドリングを新規追加 |
付録B: 関連仕様書
| 仕様書 | 関連 |
|---|---|
| spec_engine | Action A(STL自動作成)/ Action B(消込処理) |
| spec_bs | B/S への反映ロジック |
| spec_daily_cf | CF日次(83/84/85タブ)への反映 |
| spec_ord | ORD 自動紐づけ仕様 |