1. 基本情報
焦点質問: SaaSサブスクからどのようなINVを自動生成するか?
23_bud_subscription(SaaS契約マスタ)の各行に対し、契約形態(月額/年額)・決済ラグ・支払基準日を考慮して 対象年月までの未起票分を一括で INV 行に展開 する。1契約1ヶ月あたり1行のINVを生成し、HC RPAのような預り金・仕訳振替・益税の派生Rowは不要。
| 項目 | 内容 |
|---|
| 関数名 | generateSaasInvoices(targetOverride, _silent) |
| ファイル | 401_bat_rpa.js |
| 入力 | 23_bud_subscription |
| 出力 | 32_wrk_invoice + 31_wrk_order |
| メニュー | 「⚙️ 定期RPA起票 > 📦 SaaS(サブスク)」 |
2. 前提条件・依存関係
| 項目 | 内容 |
|---|
| SSOT | 32_wrk_invoice(起票先), 31_wrk_order(発注先) |
| マスタ依存 | 11_mst_account(writeInvRows_ 内で諸表区分・大分類を科目マスタから自動付与) |
| 前提 | 有効フラグ=TRUEの行のみ処理対象 |
| 前提 | 利用ステータスに「解約済」を含む行はスキップ |
| 前提 | 開始・契約年月が空の行はスキップ |
| ヘルパー | INV/ORD ヘルパー 9 関数(一覧は 400_rpa_common.js 参照) |
| 後続処理 | Action A → TRN/STL 自動作成 → Action B(消込・決済仕訳) |
3. 入力スキーマ
23_bud_subscription カラム定義
| # | 列 | カラム名 | 型 | 入力/自動 | 説明 | 制約 |
|---|
| 1 | A | 有効フラグ | checkbox | 入力 | FALSE→SKIP | 空セルもFALSE扱い |
| 2 | B | 管理ID | string | 自動(RPA) | SAS_NNNN(自動発番) | 空の場合RPAが自動採番 |
| 3 | C | サービス・ツール名 | string | 入力 | 表示名・摘要に使用 | コード上は 資産・契約名 もフォールバック |
| 4 | D | 利用者・部門 | string | 入力 | デフォルト「全社共通」 | — |
| 5 | E | 費用科目 | string | 入力(pulldown) | デフォルト「通信費」 | 11_mst_account に登録済の科目名のみ |
| 6 | F | 取引先名 | string | 入力(pulldown) | 「選定中」「未定」含む→空にクレンジング | — |
| 7 | G | 契約形態 | string | 入力 | 月額 / 年額 | 月額/年額以外は月額扱い |
| 8 | H | 開始・契約年月 | date | 入力 | RPA対象期間の開始 | 空→SKIP。コード上は 開始年月 もフォールバック |
| 9 | I | 次回更新・終了年月 | date | 入力 | 空=無期限(自動更新) | コード上は 終了年月 もフォールバック |
| 10 | J | 税抜金額_計画 | number | 入力 | 月額/年額の単価 | 必須(空→0扱い) |
| 11 | K | 消費税額_計画 | number | 入力 | 0の場合もあり(対象外) | — |
| 12 | L | 税区分 | string | 入力 | 対象外 / 課税 等 | — |
| 13 | M | 決済手段 | string | 入力(pulldown) | クレカ / 口座振込 / 口座振替 等 | 「未定」含む→空にクレンジング |
| 14 | N | 決済ラグ(月) | number | 入力 | 0=当月、1=翌月、-1=前月(前払い) | 全角数字→半角変換 |
| 15 | O | 支払基準日 | number | 入力 | 日(1-31)。0=月末 | 月末日より大きい場合キャップ |
| 16 | P | 休日調整 | string | 入力 | 前/後/なし | — |
| 17 | Q | CF計上 | string | 入力 | 予算/実績 | INV起票には影響なし(Datamartで判定) |
| 18 | R | 自動更新アラート | string | 入力 | 参考情報 | — |
| 19 | S | 利用ステータス | string | 入力 | 利用中/解約予定/解約済 | 「解約済」含む→SKIP。コード上は ステータス もフォールバック |
| 20 | T | 組織名 | string | 入力(pulldown) | ORD・INV Rowに転記 | — |
| 21 | U | 備考 | string | 入力 | 自由記述 | — |
| 22 | V | 最終起票年月日 | date | 入力(手動) | 「ここまで起票済」を示す。RPAは書き戻さない | — |
| 23 | W | 最終決済予定日 | date | 自動(RPA) | 列が存在しない場合は自動追加 | — |
4. 処理ロジック(マトリクス)
共通INVフィールド(buildInvRow_ が自動設定):
有効フラグ=true, 請求ID=INV_YYYYMMDD_NNNN(自動発番), 起票日時=now, 起票者="RPA自動起票", 請求ステータス="未処理", 収支区分="支出", 通貨="JPY", 未決済残高=税込金額_計画
HCとの違い: SaaS INVは1契約1ヶ月あたり1行のみ。預り金・仕訳振替・益税などの派生Rowは不要。
| 項番 | 処理フェーズ | 入力(論理名) | 入力(物理名: タブ.列) | 処理詳細 / 変換ロジック | 出力(論理名) | 出力(物理名: タブ.列) | 例外処理 |
|---|
| S1.1 | 初期化: 対象年月算出 | 最終起票年月日(全有効行) | 23_bud_subscription.V列 | 全有効行の最終起票年月日の最大値を targetYm とする。targetOverride が指定されていればそちらを優先 | targetYm | 変数: targetYm (YYYY-MM) | ⚠️ 全行が空かつtargetOverride未指定 → 当月(YYYY-MM)をtargetYmとする |
| S1.2 | 初期化: INV重複チェック用データ読込 | 32_wrk_invoice全データ | 32_wrk_invoice | 摘要列ベースで重複判定するため全行を読み込む | invData, invHeaders | 変数 | — |
| S1.3 | 初期化: ORD準備 | 31_wrk_order全データ | 31_wrk_order | buildOrdMap_() で既存ORDマップを構築 | ordMap | 変数 | ⚠️ 31タブが存在しない場合はORD作成をスキップ |
| S2.1 | ループ開始 | — | 23_bud_subscription 全行 | FOR EACH 行 — 以下を各行に対して実行 | — | — | — |
| S2.2 | スキップ判定① | 有効フラグ | 23_bud_subscription.A列 | = FALSE → SKIP | — | — | ⚠️ 空セルもFALSE扱い |
| S2.3 | スキップ判定② | 利用ステータス | 23_bud_subscription.S列 | "解約済" を含む → SKIP | — | — | — |
| S2.4 | スキップ判定③ | 開始・契約年月 | 23_bud_subscription.H列 | 空 → SKIP | startYm | 変数: startYm | — |
| S2.5 | 変数: ラグ算出 | 決済ラグ(月) | 23_bud_subscription.N列 | 全角→半角変換後パース。空/非数値→0 | lagForCheck | 変数 | — |
| S2.6 | 変数: 有効開始年月 | startYm, lagForCheck | 変数 | lagForCheck < 0(前払い)の場合: effectiveStartYm = startYm + lagForCheck。それ以外: effectiveStartYm = startYm | effectiveStartYm | 変数 | — |
| S2.7 | 変数: 行別対象年月 | 最終起票年月日, targetYm, lagForCheck | 23_bud_subscription.V列 | rowTargetYmRaw = 行の最終起票年月日 or targetYm。rowTargetYm = rowTargetYmRaw - lagForCheck(決済予定日ベース→利用月ベースに変換) | rowTargetYm | 変数 | ⚠️ rowTargetYmRaw < effectiveStartYm → SKIP |
| S2.8 | 管理ID自動発番 | 管理ID | 23_bud_subscription.B列 | 空の場合 SAS_NNNN(既存最大+1)を発番し23タブに書き戻し | subMgrId | 23_bud_subscription.B列 | — |
| S2.9 | ORD検索/作成 | subMgrId, startYm | 31_wrk_order | キー=`subMgrId | startYmで既存ORDを検索。未存在ならbuildOrdRow_()` でORDを新規作成 | ordId | 31_wrk_order(新規行) |
| S3.1 | 月ループ開始 | curYm = startYm | 変数 | WHILE curYm <= rowTargetYm | — | — | ⚠️ 終了年月あり AND curYm > 終了年月 → BREAK |
| S3.2 | shouldBill判定 | 契約形態 | 23_bud_subscription.G列 | 月額 → 毎月true。年額 → 開始月と同じ月のみtrue | shouldBill | 変数: shouldBill (bool) | ⚠️ 月額/年額以外 → 毎月true(月額扱い) |
| S3.3 | 発生日算出 | curYm | 変数 | curYmの月末日 をDate型で取得 | 発生日 | 変数: occurDate (Date) | — |
| S3.4 | 決済日_計画算出 | 決済ラグ(月), 支払基準日 | 23_bud_subscription.N列, O列 | settleDate = curYm + ラグ月 の 支払基準日。支払基準日=0→月末 | 決済日_計画 | 変数: settleDate (Date) | ⚠️ 支払基準日>月末日→キャップ |
| S3.5 | 重複チェック | 摘要 | 32_wrk_invoice.摘要列 | isDuplicate_() で "【RPA:SaaS】{curYm}利用分: {サービス名}" を検索 → 存在すれば SKIP | — | — | — |
| S3.6 | 申請種別判定 | 決済手段 | 23_bud_subscription.M列 | 振込 含む → 手動振込、クレカ or 振替 含む → 自動引落、それ以外 → 請求書受領(AP) | appType | 変数 | — |
| S3.7 | INV行生成 | 全変数 | — | buildInvRow_() で INV行を構築。親発注ID(ORD)=ordId, 科目名=費用科目, 税抜金額_計画=taxExcl, 消費税額_計画=taxAmt, 税込金額_計画=totalIncTax, 発生日=occurDate, 決済日_計画=settleDate, 決済手段=payMethod(「未定」含む→空), 組織名=orgName, 申請種別=appType | INV行 | drafts配列に追加 | — |
| S3.8 | ループ進行 | curYm | 変数 | curYm += 1ヶ月 → S3.1に戻る | — | — | — |
| W1.1 | 一括書き込み: ORD | newOrdRows | — | writeOrdRows_() で31タブ末尾に追記 | — | 31_wrk_order | ⚠️ 31タブ未存在 or ORD 0件 → スキップ |
| W1.2 | 一括書き込み: INV | drafts | — | writeInvRows_() で32タブ末尾に追記。諸表区分・大分類を科目マスタから自動付与 | — | 32_wrk_invoice | — |
| W1.3 | 23タブ更新: 管理ID | subUpdates | — | 管理IDが空だった行に自動発番した SAS_NNNN を書き戻し | — | 23_bud_subscription.B列 | — |
旧仕様との差異(コード検証結果):
- 旧S4.5「起票時期チェック(settleDate > targetDate → SKIP)」は現在のコードには存在しない。代わりに行別の
rowTargetYm で利用月ベースのループ上限を制御している(S2.7)
- 旧W1.2「最終起票年月日・最終決済予定日の書き戻し」は現在のコードでは行われない(コメント「手入力のため書き戻しなし」)
- ORD(31_wrk_order)の自動作成が追加されている(S2.9, W1.1)
- 申請種別が決済手段に応じて自動判定される(S3.6)。旧仕様では固定値「請求書受領(AP)」
5. 出力サマリー
32_wrk_invoice(INV行)
| フィールド | 値 | 備考 |
|---|
| 有効フラグ | TRUE | — |
| 親発注ID(ORD) | ORD_YYYYMMDD_NNNN | 31タブのORDに紐づく |
| 請求ID(INV) | INV_YYYYMMDD_NNNN | 自動発番 |
| 起票日時 | 実行時刻 | — |
| 起票者 | RPA自動起票 | — |
| 申請種別 | 手動振込 / 自動引落 / 請求書受領(AP) | 決済手段から自動判定 |
| 発生日(P/L計上日) | 対象年月の末日 | — |
| 決済日_計画 | 対象年月 + ラグ月 の 支払基準日 | — |
| 請求ステータス | 未処理 | — |
| 収支区分 | 支出 | — |
| 取引先名 | 23タブの値 | 「選定中」「未定」→空 |
| 科目名 | 23タブの費用科目 | — |
| 税区分 | 23タブの値 | — |
| 通貨 | JPY | — |
| 税抜金額_計画 | 23タブの値 | — |
| 消費税額_計画 | 23タブの値 | — |
| 税込金額_計画 | 税抜 + 消費税 | — |
| 未決済残高 | 税込金額_計画 | 初期値=税込金額 |
| 決済手段 | 23タブの値 | 「未定」→空 |
| 組織名 | 23タブの値 | — |
| 摘要 | 【RPA:SaaS】YYYY-MM利用分: サービス名 | 重複チェックのキー |
31_wrk_order(ORD行)
| フィールド | 値 | 備考 |
|---|
| 発注ID(ORD) | ORD_YYYYMMDD_NNNN | 自動発番 |
| 契約・件名 | サービス名 + 契約形態 | — |
| 摘要 | 【RPA:SaaS】サービス名 | — |
| 税抜/消費税/税込金額_発注 | 月額単価 × 契約月数 | 終了年月なし→12ヶ月 |
| 参照元区分 | SaaS | — |
| 参照元ID | SAS_NNNN | 23タブの管理ID |
6. 業務ルール
- 行別の最終起票年月日で起票範囲を制御 — 各行の最終起票年月日(手入力)を「ここまで起票済」の上限として扱う。最終起票年月日は決済予定日ベースの値なので、利用月ベースに変換(ラグ分を差し引く)してループ上限とする
- 取引先名が「選定中」「未定」なら空に — INVに不確定な名前を入れない
- 年額の課金月 — 開始月と同じ月にだけ起票(コード上は月の一致で判定)
- 決済ラグの全角対応 — 全角数字を半角に変換してパース
- 解約済は除外 — 利用ステータスに「解約済」を含むSaaSは起票しない
- 1契約1INV/月 — HCと異なり、預り金・益税等の派生Rowは生成しない
- ORD自動作成 — 管理ID+開始年月をキーにORDを検索し、未存在なら自動作成する。契約金額は月額単価×契約月数(終了年月未設定なら12ヶ月)
- 管理ID自動発番 — 管理IDが空の行には
SAS_NNNN を自動採番し23タブに書き戻す
- 申請種別の自動判定 — 決済手段に「振込」を含む→手動振込、「クレカ」「振替」を含む→自動引落、その他→請求書受領(AP)
- 決済手段「未定」の除外 — 決済手段に「未定」を含む場合はINVの決済手段を空にする
- 前払い(ラグ<0)の有効開始年月 — ラグが負の場合、開始年月にラグ月を加算した月を有効開始年月とする(支払月が開始月より前になるため)
7. 冪等性(二重起票防止)
| メカニズム | 詳細 |
|---|
| 摘要ベース重複チェック | isDuplicate_() が "【RPA:SaaS】{curYm}利用分: {サービス名}" を32_wrk_invoiceの摘要列から検索。完全一致する行が存在すればその月の起票をスキップ |
| ORD重複チェック | buildOrdMap_() で `管理ID |
再実行安全性: 同一条件で再実行しても、重複チェックにより既起票分はスキップされるため、二重起票は発生しない。
8. エラーハンドリング
| エラー条件 | 処理 | ユーザー通知 |
|---|
| 23_bud_subscription タブが存在しない | 即座にreturn | 🚨 23_bud_subscription が見つかりません。 |
| SaaSデータが0行(ヘッダのみ) | 即座にreturn | ✅ SaaSデータがありません。 |
| 必須ヘッダー列が見つからない(サービス名/費用科目/開始年月/税抜金額) | 即座にreturn | ⚠️ サブスク台帳の必須項目が見つかりません。 |
| 起票対象0件 | 正常終了 | ✅ 起票対象なし: {targetYm} の期間で新たに起票すべきSaaSはありませんでした。 |
| 起票成功 | 正常終了 | 🎉 SaaS起票完了: {count}件 のINV行を生成しました。 |
| 予期しないエラー(try-catch) | Utils.logError でログ出力後return 0 | 🚨 generateSaasInvoices でエラーが発生しました: {e.message} |
_silent=true の場合 | ダイアログを表示しない | — |
9. テスト仕様
単体テスト観点
| テストID | テストケース | 入力 | 期待結果 |
|---|
| T1 | 月額・基本 | M365 Premium: 月額4,354, ラグ1, 支払基準日10, target=2026-02 | INV1行: 通信費4,354, 発生日=2026-02-28, 決済日_計画=2026-03-10 |
| T2 | 前払い(ラグ-1) | オフィス家賃: 月額30,000, ラグ-1, 支払基準日25, target=2026-05 | INV: 発生日=2026-06-30, 決済日_計画=2026-05-25 |
| T3 | 年額・基本 | Adobe CC: 年額60,000, 開始2025-04, target=2026-04 | 2026-04のみ起票 |
| T4 | 解約済SKIP | 利用ステータス="解約済" | 起票されない |
| T5 | 重複チェック | 同月を2回実行 | 2回目は0件起票 |
| T6 | キャッチアップ | 最終起票=2026-01, target=2026-03 | 02月分・03月分をまとめて起票 |
| T7 | CF計上=実績 | オフィス家賃: CF計上="実績" | INV起票は通常通り(CF計上はDatamartで判定) |
| T8 | 消費税あり | 税抜5,000, 消費税500 | 税込=5,500 |
| T9 | STL税込金額_決済 | 親ORDあり, 税込4,354 | Action A後STL税込金額_決済=4,354(jeFxAmt差引きなし) |
| T10 | 管理ID自動発番 | 管理IDが空の行 | SAS_NNNN が自動採番され23タブに書き戻し |
| T11 | ORD自動作成 | 31タブにORD未存在 | ORD行が31タブに追加される |
| T12 | 申請種別: 振込 | 決済手段="口座振込_福井銀行" | 申請種別="手動振込" |
| T13 | 申請種別: クレカ | 決済手段="クレカ_福井銀行" | 申請種別="自動引落" |
| T14 | 申請種別: その他 | 決済手段="現金" | 申請種別="請求書受領(AP)" |
テストデータ(23タブ 3行)
| # | サービス名 | 費用科目 | 取引先 | サイクル | 税抜 | 消費税 | 税区分 | 決済手段 | ラグ | 支払基準日 | 休日調整 | CF計上 | ステータス |
|---|
| 1 | Microsoft 365 Business Premium | 通信費 | 日本マイクロソフト | 月額 | 4,354 | 0 | 対象外 | クレカ_福井銀行 | 1 | 10 | 後 | 予算 | 利用中 |
| 2 | Microsoft 365 Business Standard | 通信費 | 日本マイクロソフト | 月額 | 1,837 | 0 | 対象外 | クレカ_福井銀行 | 1 | 10 | 後 | 予算 | 利用中 |
| 3 | オフィス家賃 | 地代家賃 | 高野組 | 月額 | 30,000 | 0 | 対象外 | 口座振込_福井銀行 | -1 | 25 | 前 | 実績 | 利用中 |
ケース A: M365 Premium(月額・後払い・ラグ+1)target=2026-02
算出変数
startYm = "2026-01"
curYm = "2026-01"(最終起票=2026-02-10 → lastBilledYm="2026-02" → curYm="2026-03"の場合あり)
cycle = "月額" → shouldBill = true
lag = 1
payDay = 10(後)
32タブ期待結果(INV 2行: 1月分・2月分)
前提: 最終起票年月日をクリアしてtarget=2026-02で実行
| # | 摘要 | 科目名 | 税抜 | 消費税 | 税込 | 発生日 | 決済日_計画 | 決済手段 | 取引先 |
|---|
| 1 | 【RPA:SaaS】2026-01利用分: M365 Premium | 通信費 | 4,354 | 0 | 4,354 | 2026-01-31 | 2026-02-10 | クレカ_福井銀行 | 日本マイクロソフト |
| 2 | 【RPA:SaaS】2026-02利用分: M365 Premium | 通信費 | 4,354 | 0 | 4,354 | 2026-02-28 | 2026-03-10 | クレカ_福井銀行 | 日本マイクロソフト |
注: 2月分の決済日_計画=2026-03-10 > targetDate=2026-02-28 のため、2月分はスキップされる。実際にはINV 1行(1月分のみ)。
33タブ期待結果(STL 1行 — Action A後)
| STL | 消込対象INV | 入出金 | 決済口座 | 取引先 | 税込金額_決済 |
|---|
| STL 1 | INV (1月分) | 出金 | クレカ_福井銀行 | 日本マイクロソフト | 4,354 |
期待値サマリー
| 財務諸表 | 科目 | 金額 | タイミング |
|---|
| P/L | 通信費 | -4,354 | 2026-01(発生月) |
| B/S | 未払金 | +4,354 → 0 | 1月に計上 → 2月STL消込で解消 |
| B/S | 現預金 | -4,354 | STL消込後 |
| CF | 出金 | 4,354 | STL消込時(2026-02) |
ケース B: オフィス家賃(月額・前払い・ラグ-1)target=2026-05
算出変数
startYm = "2026-02"
cycle = "月額" → shouldBill = true
lag = -1 ← 前払い(翌月分を前月に支払い)
payDay = 25(前)
32タブ期待結果
前提: 最終起票=2026-05-25 → lastBilledYm="2026-05" → curYm="2026-06"
| # | 摘要 | 科目名 | 税抜 | 消費税 | 税込 | 発生日 | 決済日_計画 | 決済手段 |
|---|
| 1 | 【RPA:SaaS】2026-06利用分: オフィス家賃 | 地代家賃 | 30,000 | 0 | 30,000 | 2026-06-30 | 2026-05-25 | 口座振込_福井銀行 |
注: 6月利用分を5月に前払い。発生日(6月末) > 決済日_計画(5月25日) → 期ズレパターン: 前払費用。
33タブ期待結果(STL 1行 — Action A後)
| STL | 消込対象INV | 入出金 | 決済口座 | 取引先 | 税込金額_決済 |
|---|
| STL 1 | INV (6月分) | 出金 | 口座振込_福井銀行 | 高野組 | 30,000 |
期待値サマリー
| 財務諸表 | 科目 | 金額 | タイミング |
|---|
| P/L | 地代家賃 | -30,000 | 2026-06(発生月) |
| B/S | 前払費用 | +30,000 → 0 | 5月に前払計上 → 6月に解消 |
| B/S | 現預金 | -30,000 | STL消込後(2026-05) |
| CF | 出金 | 30,000 | STL消込時(2026-05) |
ケース C: 3行同時テスト(target=2026-02)
前提: 全行の最終起票年月日をクリア
期待される32タブ INV行数
| # | サービス名 | 摘要の利用月 | 発生日 | 決済日_計画 | target内? | INV行 |
|---|
| 1 | M365 Premium | 2026-01 | 2026-01-31 | 2026-02-10 | o | 1行 |
| 2 | M365 Standard | 2026-01 | 2026-01-31 | 2026-02-10 | o | 1行 |
| 3 | オフィス家賃 | 2026-02 | 2026-02-28 | 2026-01-25 | o | 1行 |
| 4 | オフィス家賃 | 2026-03 | 2026-03-31 | 2026-02-25 | o | 1行 |
合計: INV 4行
注: オフィス家賃はラグ=-1(前払い)のため、3月利用分の決済日_計画(02-25)もtarget(02-28)内に入り、2行起票される。
33タブ期待結果(STL 4行 — Action A後)
| STL | INV摘要 | 科目 | 税込金額_決済 | 決済口座 |
|---|
| STL 1 | 【RPA:SaaS】2026-01利用分: M365 Premium | 通信費 | 4,354 | クレカ_福井銀行 |
| STL 2 | 【RPA:SaaS】2026-01利用分: M365 Standard | 通信費 | 1,837 | クレカ_福井銀行 |
| STL 3 | 【RPA:SaaS】2026-02利用分: オフィス家賃 | 地代家賃 | 30,000 | 口座振込_福井銀行 |
| STL 4 | 【RPA:SaaS】2026-03利用分: オフィス家賃 | 地代家賃 | 30,000 | 口座振込_福井銀行 |
全消込後の期待値サマリー
| 財務諸表 | 科目 | 金額 | 月 |
|---|
| P/L | 通信費 | -6,191 | 2026-01(M365 Premium 4,354 + Standard 1,837) |
| P/L | 地代家賃 | -30,000 | 2026-02(オフィス家賃 2月利用分) |
| P/L | 地代家賃 | -30,000 | 2026-03(オフィス家賃 3月利用分) |
| B/S | 未払金(通信費) | +6,191 → 0 | 1月計上 → 2月消込 |
| B/S | 前払費用(家賃2月分) | 0 | 発生日=02-28, 決済日_計画=01-25 → 前払だがtarget内で即解消 |
| B/S | 前払費用(家賃3月分) | +30,000 → 0 | 2月前払 → 3月解消 |
| B/S | 現預金 | -66,191 | 全STL消込後 |
| CF | 出金(通信費) | 6,191 | 2026-02 |
| CF | 出金(家賃2月分) | 30,000 | 2026-01(決済日_計画) |
| CF | 出金(家賃3月分) | 30,000 | 2026-02(決済日_計画) |
付録
付録A: Action A → Action B の流れ
SaaS INVはHCと同じ汎用エンジン(403_subledger_engine.js)で処理される。
Action A(INV承認 → TRN + STL自動作成)
1. 32タブで請求ステータスを "承認済" に変更
2. Action A を実行
3. 結果:
- 42_trn_journal: TRN 1行追加(費用計上仕訳)
発生日 = INVの発生日
決済日_計画 = INVの決済日_計画
科目名 = INVの科目名
金額 = INVの税込金額_計画
- 32タブ: 自動仕訳JNL_ID ← TRN_ID
- 33タブ: STL 1行自動作成(仕訳振替以外のINVのみ)
税込金額_決済 = 税込金額_計画 ← 仕訳振替Rowなし → そのまま
ORDありの場合のSTL金額: SaaS INVはORDに紐づくが、jeFxAmtMapによる仕訳振替分の差引きは発生しない(SaaS INVに仕訳振替Rowがないため)。STL税込金額_決済 = INV税込金額_計画となる。
Action B(STL消込 → 決済仕訳)
1. 33タブでSTLに決済日・決済ステータス="消込済" を入力
2. Action B を実行
3. 結果:
- 42_trn_journal: TRN追加(決済仕訳)
決済日_実績 = STLの決済日
- 33タブ: 自動仕訳JNL_ID ← TRN_ID
- 32タブ: INVの未決済残高=0、請求ステータス=決済完了
付録B: 決済ラグによる期ズレパターン
| ラグ | パターン | 例 | B/S影響 |
|---|
| 0 | 当月決済 | pYm=sYm → 期ズレなし | なし |
| +1 | 翌月後払い | 3月利用→4月決済 → 3月に未払金+、4月に未払金- | 未払金 |
| -1 | 前月前払い | 3月利用→2月決済 → 2月に前払費用+、3月に前払費用- | 前払費用 |
期ズレは 602_datamart_main.js の processEvent() が自動処理する(B/S形状ロジック)。