1. 基本情報
焦点質問: パイプライン案件からどのような売上INVを自動生成するか?
21_bud_pipeline(売上パイプラインマスタ)の受注確定行に対し、契約形態(スポット/継続/準委任/請負)・入金ラグ・入金日を考慮して 最終起票年月日までの未起票分を一括で売上 INV 行に展開 する。スポット売上は1回きり、MRR(継続月額)は月ループで月数分のINVを生成する。全INVの収支区分は「収入」(売上側)。
| 項目 | 内容 |
|---|
| 関数名 | generatePipelineInvoices(targetOverride, _silent) |
| ファイル | 401_bat_rpa.js |
| 入力 | 21_bud_pipeline |
| 出力 | 32_wrk_invoice + 31_wrk_order |
| メニュー | 「🤖 RPA・自動化 > 📊 パイプライン受注の自動起票」 |
2. 前提条件・依存関係
| 項目 | 内容 |
|---|
| SSOT | 32_wrk_invoice(起票先), 31_wrk_order(発注先) |
| マスタ依存 | 11_mst_account(writeInvRows_ 内で諸表区分・大分類を科目マスタから自動付与) |
| 前提 | 有効フラグ=TRUEの行のみ処理対象 |
| 前提 | 確度(ヨミ)に「受注」を含む行のみ対象(内示・Aヨミ等は対象外) |
| 前提 | 計上開始年月が空(parseDateToYm = null)の行はスキップ |
| ヘルパー | INV/ORD ヘルパー 9 関数(400_rpa_common.js 参照) |
| 後続処理 | Action A → TRN/STL 自動作成 → Action B(消込・決済仕訳) |
3. 入力スキーマ
21_bud_pipeline カラム定義
| # | 列名 | 型 | 入力/自動 | 説明 | 制約 |
|---|
| 1 | 有効フラグ | checkbox | 入力 | FALSE→SKIP | 空セルもFALSE扱い |
| 2 | 管理ID | string | 自動(RPA) | PIP_NNNN(自動発番) | 空の場合RPAが自動採番して書き戻し |
| 3 | PJ・案件名 | string | 入力 | 摘要・ORD件名に使用 | — |
| 4 | 契約形態 | string | 入力(pulldown) | スポット/継続/準委任/請負 | MRR展開ロジックに影響 |
| 5 | 売上科目 | string | 入力(pulldown) | INVの科目名 | 空→「売上高」がデフォルト |
| 6 | 確度(ヨミ) | string | 入力(pulldown) | 受注/内示(90%)/Aヨミ(80%)/Bヨミ(50%)/Cヨミ(25%)/Dヨミ(10%)/保留/失注 | 「受注」を含む行のみ対象 |
| 7 | 計上開始年月 | date | 入力 | INV発生日の起点 | 空→SKIP |
| 8 | スポット売上・初期費用 | number | 入力 | 1回きりの売上金額 | 0/空→スポットINV生成なし |
| 9 | 継続月額(MRR) | number | 入力 | 月額売上金額 | 0/空→MRR INV生成なし |
| 10 | 継続月数 | number | 入力 | MRR展開の月数 | 0/空→契約形態で判定(後述) |
| 11 | 取引先名 | string | 入力(pulldown) | INV・ORDの取引先 | — |
| 12 | 決済手段 | string | 入力(pulldown) | INVの決済手段 | — |
| 13 | 入金ラグ(月) | number | 入力 | 計上月→入金月のオフセット | 空→1(翌月)。全角数字→半角変換 |
| 14 | 入金日 | number | 入力 | 入金予定日(日)。0/空=月末 | 月末日より大きい場合キャップ |
| 15 | 組織名 | string | 入力(pulldown) | INV・ORDに転記 | — |
| 16 | 最終起票年月日 | date | 入力(手動) | 「ここまで起票する」を示す。RPAは書き戻さない | — |
| 17 | 備考 | string | 入力 | 自由記述 | — |
4. 処理ロジック(マトリクス)
共通INVフィールド(buildInvRow_ が自動設定):
有効フラグ=true, 請求ID=INV_YYYYMMDD_NNNN(自動発番), 起票日時=now, 起票者="RPA自動起票", 請求ステータス="未処理", 通貨="JPY", 税区分="対象外", 消費税額_計画=0, 申請種別="請求書発行(AR)", 収支区分="収入"
| 項番 | 処理フェーズ | 入力(論理名) | 入力(物理名: タブ.列) | 処理詳細 / 変換ロジック | 出力(論理名) | 出力(物理名: タブ.列) | 例外処理 |
|---|
| S1.1 | 初期化: 対象年月算出 | 最終起票年月日(全有効行) | 21_bud_pipeline.最終起票年月日列 | 全有効行の最終起票年月日の最大値を targetYm とする。targetOverride が指定されていればそちらを優先 | targetYm | 変数: targetYm (YYYY-MM) | ⚠️ 全行が空かつtargetOverride未指定 → 当月(YYYY-MM)をフォールバック |
| S1.2 | 初期化: INV重複チェック用データ読込 | 32_wrk_invoice全データ | 32_wrk_invoice | 摘要列ベースで重複判定するため全行を読み込む | invData, invHeaders | 変数 | — |
| S1.3 | 初期化: ORD/ID準備 | 31_wrk_order全データ | 31_wrk_order | buildOrdMap_() で既存ORDマップを構築 + 管理IDの最大番号(PIP_)取得 | ordMap, mgrIdMax | 変数 | ⚠️ 31タブが存在しない場合はORD作成をスキップ |
| S2.1 | ループ開始 | — | 21_bud_pipeline 全行 | FOR EACH 行 — 以下を各行に対して実行 | — | — | — |
| S2.2 | スキップ判定(1) | 有効フラグ | 21_bud_pipeline.A列 | = FALSE → SKIP | — | — | ⚠️ 空セルもFALSE扱い |
| S2.3 | スキップ判定(2) | 確度(ヨミ) | 21_bud_pipeline.確度(ヨミ)列 | "受注" を含まない → SKIP | — | — | ※1 |
| S2.4 | スキップ判定(3) | 計上開始年月 | 21_bud_pipeline.計上開始年月列 | parseDateToYm が null → SKIP | startYm | 変数: startYm | — |
| S3.1 | 変数: 基本情報取得 | PJ名, 契約形態, 売上科目, 取引先名, 決済手段, 組織名 | 21_bud_pipeline 各列 | 各列からtrim取得 | 各変数 | 変数: pjName, typeStr, acc, vendorName, payMethod, orgName | ⚠️ 売上科目空→"売上高" |
| S3.2 | 変数: 入金ラグ/入金日 | 入金ラグ(月), 入金日 | 21_bud_pipeline.入金ラグ列, 入金日列 | 全角→半角変換後パース | lag, payDayRaw | 変数 | ⚠️ ラグ空→1, 入金日空/0→月末 |
| S3.3 | 変数: 行別ループ上限 | 最終起票年月日, lag | 21_bud_pipeline.最終起票年月日列 | rowTargetYm = addMonths(最終起票年月日, -lag)。ラグ分戻して利用月ベースに変換 | rowTargetYm | 変数: rowTargetYm | ⚠️ 最終起票年月日空→targetYm使用。⚠️ rowTargetYm < startYm → SKIP |
| S3.4 | 管理ID自動発番 | 管理ID | 21_bud_pipeline.管理ID列 | 空 → PIP_ + (mgrIdMax+1) を4桁ゼロ埋め。書き戻しキューに追加 | 管理ID | 21_bud_pipeline.管理ID列 (書き戻し) | — |
| O1.1 | ORD: キー生成/検索 | 管理ID, 計上開始年月 | 変数 | ordKey = pipeMgrId + "|" + startYm → ordMapで検索 | ordId | 変数: ordId | ⚠️ mgrId空→ORDスキップ |
| O1.2 | ORD: 新規作成 | ordKey不存在時 | — | 参照元区分="PIPE", 参照元ID=管理ID, 契約形態=21タブ値, 税抜金額_発注=spot + mrr * dur, PJ名=pjName, 発注ステータス="発注済" | ordId | 31_wrk_order (新規行) | ⚠️ 継続月数0かつ契約形態に'継続'含む→dur=120 ※2 |
| P1.1 | INV-スポット: 条件判定 | スポット売上 | 21_bud_pipeline.スポット売上列 | spot > 0 AND startYm <= rowTargetYm の場合のみ | — | — | — |
| P1.2 | INV-スポット: 重複チェック | 摘要 | 32_wrk_invoice.摘要列 | "【RPA:PIPE】{startYm} {PJ名} スポット" → 有効行に存在すれば SKIP | — | — | — |
| P1.3 | INV-スポット: 行生成 | spot, acc, vendorName, payMethod | 変数 | 発生日=startYmの月末, 決済日_計画=calcSettleDate(startYm), 税抜金額_計画=spot, 税込金額_計画=spot, 未決済残高=spot, PJ名=pjName | INV行 | 32_wrk_invoice (新規行) | — |
| P2.1 | INV-MRR: 条件判定 | 継続月額(MRR) | 21_bud_pipeline.MRR列 | mrr > 0 の場合、月ループを開始 | dur | 変数: dur | ⚠️ 継続月数0→契約形態'継続'含む=120ヶ月, 他=1ヶ月 ※2 |
| P2.2 | INV-MRR: 月ループ | curYm | 変数 | curYm = addMonths(startYm, m) (m=0..dur-1)。curYm > rowTargetYm → BREAK | — | — | — |
| P2.3 | INV-MRR: 重複チェック | 摘要 | 32_wrk_invoice.摘要列 | "【RPA:PIPE】{curYm} {PJ名} MRR {m+1}/{dur}ヶ月目" → 有効行に存在すれば SKIP | — | — | — |
| P2.4 | INV-MRR: 行生成 | mrr, acc, vendorName, payMethod | 変数 | 発生日=curYmの月末, 決済日_計画=calcSettleDate(curYm), 税抜金額_計画=mrr, 税込金額_計画=mrr, 未決済残高=mrr, PJ名=pjName | INV行 | 32_wrk_invoice (新規行) | — |
| W1.1 | 一括書き込み | drafts, newOrdRows, pipeUpdates | — | ORD→31タブ一括追記、INV→32タブ末尾追記(writeInvRows_)、管理ID→21タブ書き戻し | — | 31/32/21タブ | — |
脚注:
- ※1: 確度に「受注」を含む行のみ対象。「Aヨミ (確度80%)」等は含まれない。「内示(90%)」も「受注」を含まないためSKIP
- ※2: 継続月数が0/空の場合、契約形態に
'継続'を含むなら120ヶ月(10年分)をデフォルトとしてMRRを展開。含まなければ1ヶ月分のみ
5. 出力サマリー
生成されるINV行パターン
| パターン | 条件 | 生成行数 | 摘要フォーマット | 発生日 | 決済日_計画 |
|---|
| スポット売上 | spot > 0 かつ startYm <= rowTargetYm | 1行 | 【RPA:PIPE】{startYm} {PJ名} スポット | startYmの月末 | addMonths(startYm, lag)の入金日 or 月末 |
| MRR(月額) | mrr > 0 かつ curYm <= rowTargetYm | 最大dur行 | 【RPA:PIPE】{curYm} {PJ名} MRR {n}/{dur}ヶ月目 | curYmの月末 | addMonths(curYm, lag)の入金日 or 月末 |
生成されるORD行
| 条件 | 生成行数 | 税抜金額_発注 | 参照元区分 |
|---|
| 管理ID + startYm の組み合わせが31タブに未登録 | 1行/案件 | spot + mrr * dur | PIPE |
calcSettleDate ロジック
決済日_計画 = addMonths(curYm, lag) の月に対し:
- 入金日 > 0 の場合: 当該月の入金日(月末日より大きい場合はキャップ)
- 入金日 = 0 or 空の場合: 当該月の月末日
6. 業務ルール
6.1 売上INVの性質
パイプラインRPAが生成するINVはすべて 収入側(申請種別: 請求書発行(AR)、収支区分: 収入)である。SaaS/HC/CAPEXのRPAが支出INVを生成するのとは逆方向。
6.2 スポット売上 vs MRR
- スポット売上: 初期費用や一括売上。計上開始年月に1回だけINVを生成
- MRR(月額売上): 継続月額 x 継続月数分のINVを月ループで生成
両方に金額が設定されている場合、1案件からスポットINV + MRR INV(複数行)が同時に生成される。
6.3 継続月数のデフォルト
継続月数が0/空の場合:
- 契約形態に「継続」を含む → 120ヶ月(10年分)をデフォルト展開
- それ以外 → 1ヶ月分のみ
6.4 入金ラグと最終起票年月日の関係
最終起票年月日は 入金予定日ベース で入力する。RPAは内部で入金ラグ分を差し引いて利用月ベースに変換し、月ループの上限とする。
算出式: 行別ループ上限 = 最終起票年月日 - 入金ラグ(月) — rowTargetYm = addMonths(最終起票年月日, -lag)
7. 冪等性(二重起票防止)
| 保証項目 | メカニズム | 詳細 |
|---|
| INV重複防止 | 摘要の完全一致チェック (isDuplicate_) | 32_wrk_invoiceの 有効行 (有効フラグ=TRUE) に同一摘要文字列が存在する場合はSKIP |
| ORD重複防止 | ordMap キーチェック | 管理ID + "|" + startYm の組み合わせで既存ORDを検索。存在すれば新規作成しない |
| 管理ID一意性 | 既存最大番号からの連番 | PIP_ プレフィックス + 4桁ゼロ埋め。既存最大値+1から採番 |
注意: 有効フラグ=FALSEの行は重複チェックの対象外。一度無効化したINVと同じ摘要のINVは再生成される。
8. エラーハンドリング
| エラー条件 | 処理 | ユーザー通知 |
|---|
| 21_bud_pipeline タブが存在しない | 処理中断 | アラートダイアログ: 「21_bud_pipeline が見つかりません。」 |
| パイプラインデータが空(ヘッダのみ) | 処理中断 | アラートダイアログ: 「パイプラインデータがありません。」 |
| 起票対象なし(受注確定行なし or 全件重複) | 正常終了(0件) | アラートダイアログ: 「受注確定のパイプラインで新たに起票すべき行はありませんでした。」 |
| 処理中の例外(catch節) | 処理中断、Utils.logError でログ出力 | アラートダイアログ: 「generatePipelineInvoices でエラーが発生しました」+ エラーメッセージ |
_silent=true の場合 | ダイアログ非表示 | 一括実行(generateAllRpaInvoices)からの呼び出し時。戻り値のみ返却 |
9. テスト仕様
| テストID | テスト名 | 前提条件 | 期待結果 |
|---|
| PIPE-T01 | スポット案件の起票 | テスト案件X: スポット, 受注, 2026-04, spot=100,000, lag=1, 入金日=10 | ORD 1行 + INV 1行。発生日=2026-04-30, 決済日=2026-05-10, 売上高 100,000, 収入 |
| PIPE-T02 | MRR案件の起票 | テスト案件Y: 継続, 受注, 2026-04, MRR=50,000, 3ヶ月, lag=2, 入金日=10, 最終起票年月日=2026-07-10 | ORD 1行(発注総額=150,000)+ INV 3行。2026-04: 発生日=04-30/決済日=06-10, 2026-05: 発生日=05-31/決済日=07-10, 2026-06: 発生日=06-30/決済日=08-10。各50,000 |
| PIPE-T03 | 二重起票防止 | PIPE-T01実行済の状態で再実行 | 新規INV=0件。既存INVと摘要が一致するためSKIP |
| PIPE-T04 | 未受注案件のスキップ | 確度=Aヨミ(80%) | INV/ORD生成なし |
| PIPE-T05 | 有効フラグFALSEのスキップ | 有効フラグ=FALSE, 確度=受注 | INV/ORD生成なし |
| PIPE-T06 | 継続月数0+契約形態「継続」 | MRR=10,000, 継続月数=0, 契約形態=継続 | dur=120ヶ月としてMRR展開(rowTargetYmまで) |
| PIPE-T07 | 管理ID自動発番 | 管理ID空の受注案件 | PIP_NNNN が自動採番されて21タブに書き戻し |
テストデータ
| PJ・案件名 | 契約形態 | 確度 | 計上開始年月 | スポット | MRR | 継続月数 | 入金ラグ | 入金日 |
|---|
| テスト案件X | スポット | 受注 | 2026-04 | 100,000 | 0 | 0 | 1 | 10 |
| テスト案件Y | 継続 | 受注 | 2026-04 | 0 | 50,000 | 3 | 2 | 10 |
付録
付録A: 最終起票年月日の運用
- 手入力(RPAは書き戻さない)
- 21タブの最終起票年月日列に 入金予定日ベース の日付を入力する
- 入金ラグがある場合、RPA内部で利用月に変換してループ上限とする(S3.3参照)
- 他のRPA(24_bud_hc等)と同じ方式
付録B: 確度(ヨミ)プルダウン一覧
| 確度 | RPA対象 | 備考 |
|---|
| 受注 | 対象 | "受注" を含むため |
| 内示(90%) | 対象外 | "受注" を含まない |
| Aヨミ(80%) | 対象外 | 同上 |
| Bヨミ(50%) | 対象外 | 同上 |
| Cヨミ(25%) | 対象外 | 同上 |
| Dヨミ(10%) | 対象外 | 同上 |
| 保留 | 対象外 | 同上 |
| 失注 | 対象外 | 同上 |
付録C: 変更履歴
| 日付 | 内容 |
|---|
| 2026-04-12 16:06 | Template A (RPA/バッチ処理) 構成に全面リライト。セクション2(前提条件), 8(エラーハンドリング)を新規追加 |