概要

項目内容
案件IDMAS-192
カテゴリアーキテクチャ
PhaseP2
優先度★★
所要時間4-6時間(4ステップ段階実施)
対象ファイル400_domain/401_bat_rpa.js(2,064行・90KB)
200_data/202_repository.js(351行)
100_config/101_sys_config.js(メニュー登録)
900_test/901_test_runner.js(テスト参照更新)
前提案件なし(段階実施のため単独着手可)

目的

93KBの巨大ファイル 401_bat_rpa.js を業務ドメイン別に6分割し、直接のシートアクセス(19箇所の getDataRange().getValues())を Repository/DTO パターンに統一する。新機能追加時の影響範囲を明確化し、保守性を大幅に向上させる。

現在のコード

401_bat_rpa.js の構造(2,064行)

ファイルは大きく3層で構成されている:

① 共通ヘルパー関数群(L33-244)

// 400_domain/401_bat_rpa.js L40-65
function getInvSheet_() { ... }          // L40: INVシート取得
function generateInvId_(invSheet, dateStr, offset) { ... }  // L48: INV ID採番
function generateOrdId_(ordSheet, dateStr, offset) { ... }  // L68: ORD ID採番
function buildOrdRow_(ordHeaders, fields) { ... }     // L91: ORD行構築
function writeOrdRows_(ordSheet, ordHeaders, rows) { ... }  // L96: ORD書込
function buildOrdMap_(ordData) { ... }           // L111: ORD重複チェックマップ
function findTrueLastRow_(sheet, colIdx) { ... }      // L134: 最終行検出
function buildInvRow_(invHeaders, fields) { ... }     // L139: INV行構築
function isDuplicate_(invData, headers, memoPattern) { ... } // L145: 冪等性チェック
function promptTargetYm_(defaultYm) { ... }        // L155: 対象年月プロンプト
function deriveTargetYmFromSheet_(sheetData, idxLastBilled) { ... }  // L174
function ensureLastBilledCol_(sheet, headers) { ... }   // L187
function resolveRpaDefault_(value) { ... }         // L204
function writeInvRows_(invSheet, invHeaders, rows) { ... } // L210: INV書込
function loadAcctMapForRpa_() { ... }           // L240: 科目マスタ読込

② ドメイン別起票関数群(L246-2031) — 6ドメイン混在

行範囲関数名ドメイン行数
L246-532generateSaasInvoices()SaaS定期287行
L536-1026generateHcInvoices()HC/給与491行
L1030-1432generateCapexInvoices()設備投資/償却403行
L1435-1622generateFinanceInvoices()財務取引188行
L1626-1772generateAdhocInvoices()単発経費147行
L1776-2031generatePipelineInvoices()売上パイプライン256行

③ バッチオーケストレータ(L2034-2065)

// 400_domain/401_bat_rpa.js L2034-2065
function generateAllRpaInvoices() {
  // 全6ドメインを順次実行
}

直接シートアクセスの問題箇所

Repository を一切使用せず、19箇所で getDataRange().getValues() を直接呼び出している:

箇所行番号用途
getInvSheet_()L51INVシートデータ読込
generateOrdId_()L71ORDシートデータ読込
generateSaasInvoices()L258, L306, L319予算・INV・ORDデータ読込
generateHcInvoices()L548, L579, L591HC予算・INV・ORDデータ読込
generateCapexInvoices()L1042, L1070, L1084設備予算・INV・ORDデータ読込
generateFinanceInvoices()L1447, L1461, L1473財務予算・INV・ORDデータ読込
generateAdhocInvoices()L1638, L1647経費予算・INVデータ読込
generatePipelineInvoices()L1788, L1814パイプライン・INVデータ読込

既存 Repository パターン(202_repository.js)

// 200_data/202_repository.js — 既に5つのRepositoryが定義済み
var OrderRepository = { findAll(), save(), append() };      // 31_wrk_order
var InvoiceRepository = { findAll(), save(), append() };    // 32_wrk_invoice
var BankTxRepository = { findAll(), save(), append() };     // 33_wrk_bank
var JournalRepository = { findAll(), save(), append() };    // 42_trn_journal
var AccountRepository = { findAll(), findAsMap(), resetCache() }; // 11_mst_account

既存テスト(901_test_runner.js)

テストID対象関数フィルタパターン
T1 (L140-287)generateHcInvoices()"RPA:HC"
T5 (L1014-1049)generateSaasInvoices()"RPA:SaaS"
T6 (L1054+)generateCapexInvoices()"RPA:CAPEX"

テストはグローバル関数名で呼び出しているため、関数名さえ維持すればファイル分割後もテストは動作する。

修正方針(4ステップ段階実装)

全体アーキテクチャ(分割後)

400_domain/
├── 400_rpa_common.js        ← NEW: 共通ヘルパー(ID生成・冪等性チェック等)
├── 401_rpa_hc.js           ← NEW: HC/給与(generateHcInvoices)
├── 402_rpa_subscription.js     ← NEW: SaaS定期(generateSaasInvoices)
├── 403_rpa_capex.js         ← NEW: 設備投資/償却(generateCapexInvoices)
├── 404_rpa_finance.js        ← NEW: 財務取引(generateFinanceInvoices)
├── 405_rpa_adhoc.js         ← NEW: 単発経費(generateAdhocInvoices)
├── 406_rpa_pipeline.js       ← NEW: パイプライン売上(generatePipelineInvoices)
├── 407_rpa_orchestrator.js     ← NEW: 一括実行(generateAllRpaInvoices)
├── 410_subledger_engine.js     ← RENAME: 403 → 410
└── 420_project_profitability.js  ← RENAME: 402 → 420

番号体系の設計方針:

  • 400-409: RPAモジュール群(共通→ドメイン別→オーケストレータ)
  • 410-419: 仕訳エンジン(Action A/B)
  • 420-429: PJ損益

Step 1: 共通関数の抽出(400_rpa_common.js 新設)

401_bat_rpa.js のL33-244から共通ヘルパーを RpaCommon 名前空間に抽出する。

// 400_domain/400_rpa_common.js — RPA共通ヘルパー
var RpaCommon = (function() {
  return {
    /** INV ID採番 (Repository経由) */
    generateInvId: function(dateStr, offset) {
      var invDtos = InvoiceRepository.findAll();
      var prefix = 'INV_' + dateStr + '_';
      var maxSeq = 0;
      invDtos.forEach(function(dto) {
        var id = dto['請求ID(INV)'] || '';
        if (id.indexOf(prefix) === 0) {
          var seq = parseInt(id.substring(prefix.length), 10);
          if (seq > maxSeq) maxSeq = seq;
        }
      });
      return prefix + String(maxSeq + 1 + (offset || 0)).padStart(4, '0');
    },

    /** ORD ID採番 (Repository経由) */
    generateOrdId: function(dateStr, offset) {
      var ordDtos = OrderRepository.findAll();
      var prefix = 'ORD_' + dateStr + '_';
      var maxSeq = 0;
      ordDtos.forEach(function(dto) {
        var id = dto['発注ID(ORD)'] || '';
        if (id.indexOf(prefix) === 0) {
          var seq = parseInt(id.substring(prefix.length), 10);
          if (seq > maxSeq) maxSeq = seq;
        }
      });
      return prefix + String(maxSeq + 1 + (offset || 0)).padStart(4, '0');
    },

    /** 冪等性チェック (Repository経由) */
    isDuplicate: function(memoPattern) {
      var invDtos = InvoiceRepository.findAll();
      return invDtos.some(function(dto) {
        return dto['有効フラグ'] !== false
          && (dto['摘要'] || '').indexOf(memoPattern) !== -1;
      });
    },

    /** 対象年月ダイアログ */
    promptTargetYm: promptTargetYm_,

    /** 科目マスタ読込 (Repository経由) */
    loadAcctMap: function() {
      return AccountRepository.findAsMap();
    },

    /** RPA既定値解決 */
    resolveDefault: resolveRpaDefault_
  };
})();

ポイント:

  • getDataRange().getValues()InvoiceRepository.findAll() / OrderRepository.findAll() に置換
  • AccountRepository.findAsMap() で科目マスタキャッシュを活用
  • GASのグローバルスコープを汚さないよう RpaCommon 名前空間でラップ

Step 2: ドメイン別ファイル分割

各ドメイン関数を独立ファイルに移動。関数のシグネチャ(グローバル関数名)は維持する。

例: 401_rpa_hc.js

// 400_domain/401_rpa_hc.js — HC(人件費)RPA自動起票
// 依存: RpaCommon (400_rpa_common.js), InvoiceRepository, OrderRepository (202_repository.js)

/**
 * HC月次請求の自動起票
 * @param {string} [targetOverride] - 対象年月 (YYYY-MM)
 * @param {boolean} [_silent] - ダイアログ非表示(テスト用)
 */
function generateHcInvoices(targetOverride, _silent) {
  var FUNC = 'generateHcInvoices';
  // ... 401_bat_rpa.js L536-1026 のロジックを移植
  // ただし以下を置換:
  //   getDataRange().getValues() → InvoiceRepository.findAll() / OrderRepository.findAll()
  //   generateInvId_() → RpaCommon.generateInvId()
  //   isDuplicate_() → RpaCommon.isDuplicate()
  //   writeInvRows_() → InvoiceRepository.append()
  //   loadAcctMapForRpa_() → RpaCommon.loadAcctMap()
}

分割マッピング:

元の行範囲新ファイルグローバル関数名(維持)
L246-532402_rpa_subscription.jsgenerateSaasInvoices()
L536-1026401_rpa_hc.jsgenerateHcInvoices()
L1030-1432403_rpa_capex.jsgenerateCapexInvoices()
L1435-1622404_rpa_finance.jsgenerateFinanceInvoices()
L1626-1772405_rpa_adhoc.jsgenerateAdhocInvoices()
L1776-2031406_rpa_pipeline.jsgeneratePipelineInvoices()
L2034-2065407_rpa_orchestrator.jsgenerateAllRpaInvoices()

Step 3: 既存ファイルのリナンバー

403_subledger_engine.js → 410_subledger_engine.js
402_project_profitability.js → 420_project_profitability.js

名前空間 SubledgerService / 関数名は変更しない。 GASはファイル名のアルファベット順でロードするため、番号変更のみで依存関係に影響はない。

Step 4: テスト・メニュー更新

901_test_runner.js: グローバル関数名を維持しているため、テストコードの変更は不要。ただし動作確認は必須。

101_sys_config.js: メニュー登録のコールバック関数名はグローバル関数名を参照しているため変更不要。

CLAUDE.md: ファイル番号体系テーブルの更新が必要。

ディレクトリレイヤーファイル(更新後)
400_domain/ドメインサービス400_rpa_common, 401_rpa_hc, 402_rpa_subscription, 403_rpa_capex, 404_rpa_finance, 405_rpa_adhoc, 406_rpa_pipeline, 407_rpa_orchestrator, 410_subledger_engine, 420_project_profitability

影響範囲

Stepファイル変更量既存動作への影響
1400_rpa_common.js(新規)約100行なし(新規追加のみ)
2401_rpa_hc.js 他6ファイル(新規)
401_bat_rpa.js(削除)
約2,064行の移動グローバル関数名維持のため外部影響なし
3402→420, 403→410(リネーム)0行(名前変更のみ)GASロード順序変更。依存関係に問題なし
4CLAUDE.md(更新)約10行変更ドキュメントのみ

リスク評価:

  • グローバル関数名を変更しないため、メニュー・テスト・他モジュールからの呼び出しは影響を受けない
  • GASのロード順序は 400_rpa_common.js401_rpa_hc.js → ... → 410_subledger_engine.js420_project_profitability.js となり、依存方向と一致

注意事項

  1. GASロード順序の依存方向: 400_rpa_common.js202_repository.js (200番台) に依存する。200 < 400 なので Repository は先にロードされており問題ない
  2. Repository の findAll() 呼び出し回数: 現在の直接アクセスでは都度 getDataRange() を呼んでいるため、Repository経由にしてもパフォーマンスは同等。ただし RpaCommon.generateInvId()RpaCommon.isDuplicate() で二重に InvoiceRepository.findAll() を呼ぶ場合は、呼び出し元でキャッシュすることを検討
  3. 旧ファイル 401_bat_rpa.js の完全削除: 分割完了後は旧ファイルを削除する。GASは同名グローバル関数が複数ファイルに存在するとエラーになるため、新旧ファイルの共存は不可
  4. 段階実施の粒度: TODO_future.md では「新機能実装時に該当部分を切り出す」とあるが、本仕様書では一括リファクタリングも定義する。チームの判断で段階実施に切り替え可能
  5. onOpenRpa() (L33): 廃止済み関数。分割時に削除する
  6. 予算シートの直接アクセス: generateSaasInvoices() 等は予算シート(22_bud_headcount, 23_bud_saas 等)を直接読み込んでいる。これらのRepository化は本案件のスコープ外(予算タブ用Repositoryは未定義)。Step 2では予算シートの直接アクセスはそのまま維持する

関連ドキュメント

仕様書関連箇所
CLAUDE.mdファイル番号体系・名前空間ルール
MAS-193 DTOバリデーション層Repository.append()時のバリデーション追加(後続案件)
MAS-196 Repository/Contracts層テストRepository層のテスト追加(前提として推奨)
MAS-076 冪等性バグ修正isDuplicate_ のパターン
spec_rpa_hc.mdHC RPA業務仕様

人間が検討すべき事項

  1. 一括実施 vs 段階実施: 本仕様書は一括リファクタリングを定義しているが、新機能(MAS-099残業・MAS-109賞与等)実装時に該当ドメインのみ切り出す段階方式も可能。リスク許容度に応じて選択
  2. 予算シート用 Repository の要否: 現在 22_bud_headcount, 23_bud_saas 等の予算シートには Repository が未定義。本案件では直接アクセスを維持するが、将来的に BudgetRepository を追加すべきか検討
  3. ID生成のパフォーマンス: RpaCommon.generateInvId() は全INVデータを毎回読み込む。大量データ時はシート末尾から逆引きする最適化が必要になる可能性あり
  4. テスト(901_test_runner.js)の関数参照: グローバル関数名維持のため変更不要だが、分割後に全テスト(T1, T5, T6)のパスを確認すること

実装プロンプト(Claude Code 用)

Step 1: 共通関数の抽出

あなたはGAS会計システム(bizlp-gas-accounting)のシニア開発者です。
案件 MAS-192「Repository パターンの完全移行+ドメイン別モジュール分割」の Step 1(共通関数の抽出)を実装してください。

## 実行前タスク

以下のファイルを読み込んでください:
1. `400_domain/401_bat_rpa.js` — L33-244の共通ヘルパー関数群。特に以下を確認:
   - generateInvId_ (L48-65): INV ID採番ロジック
   - generateOrdId_ (L68-88): ORD ID採番ロジック
   - isDuplicate_ (L145-153): 冪等性チェック
   - writeInvRows_ (L210-239): INV書込ロジック
   - writeOrdRows_ (L96-109): ORD書込ロジック
   - loadAcctMapForRpa_ (L240-244): 科目マスタ読込
   - promptTargetYm_ (L155-172): 対象年月プロンプト
   - resolveRpaDefault_ (L204-208): 既定値解決
2. `200_data/202_repository.js` — InvoiceRepository, OrderRepository, AccountRepository の API
3. `000_infra/003_contracts.js` — toDto, toRow の仕様
4. `CLAUDE.md` — ファイル番号体系
5. `docs/dev/dev_mas-192_repository_module_split.md` — 本仕様書

## 修正対象ファイル

- `400_domain/400_rpa_common.js`(新規作成)

## 実装内容

1. `400_rpa_common.js` を新規作成し、`RpaCommon` 名前空間を定義
2. 以下の関数を Repository 経由に書き換えて移植:
   - `generateInvId` → InvoiceRepository.findAll() でID一覧取得 → 最大連番+1
   - `generateOrdId` → OrderRepository.findAll() でID一覧取得 → 最大連番+1
   - `isDuplicate` → InvoiceRepository.findAll() でメモパターン検索
   - `loadAcctMap` → AccountRepository.findAsMap()
3. 以下はロジック変更なしで移植:
   - `promptTargetYm` (ダイアログ表示)
   - `resolveDefault` (既定値解決)
   - `deriveTargetYmFromSheet` (最終起票年月判定)
   - `ensureLastBilledCol` (列追加)
4. `writeInvRows_` / `writeOrdRows_` は **移植しない** — Step 2で各ドメインモジュール内で InvoiceRepository.append() / OrderRepository.append() に置換する

## 制約

- 401_bat_rpa.js は **この Step では変更しない**(Step 2で一括置換)
- Repository の findAll() は DTO 配列を返す。生の行データ(2次元配列)ではない点に注意
- AccountRepository.findAsMap() のキーは科目名。戻り値の形式を確認してから使用すること
- GASのグローバルスコープを汚さないよう、全関数を `RpaCommon` オブジェクトにラップ

## 動作確認

1. `npm run push:dev` で開発環境にデプロイ
2. GASエディタで `400_rpa_common.js` が正常にロードされることを確認
3. `RpaCommon.generateInvId('20260401', 0)` をスクリプトエディタのログで実行し、正しいIDが返ることを確認
4. 既存の RPA 機能(generateAllRpaInvoices)が引き続き動作することを確認(Step 1では旧コードを変更していないため)

### 拡張思考の使用状況

| フェーズ | 拡張思考 | 備考 |
|---------|:--------:|------|
| RpaCommon 設計 | なし | 既存ヘルパーの Repository 経由への書き換え。パターンは202_repository.jsに確立済み |

Step 2: ドメイン別ファイル分割+Repository移行

あなたはGAS会計システム(bizlp-gas-accounting)のシニア開発者です。
案件 MAS-192「Repository パターンの完全移行+ドメイン別モジュール分割」の Step 2(ドメイン別ファイル分割)を実装してください。

## 実行前タスク

以下のファイルを読み込んでください:
1. `400_domain/401_bat_rpa.js` — 全体を通読。特に以下の6つのドメイン関数の境界を確認:
   - generateSaasInvoices (L246-532)
   - generateHcInvoices (L536-1026)
   - generateCapexInvoices (L1030-1432)
   - generateFinanceInvoices (L1435-1622)
   - generateAdhocInvoices (L1626-1772)
   - generatePipelineInvoices (L1776-2031)
   - generateAllRpaInvoices (L2034-2065)
2. `400_domain/400_rpa_common.js` — Step 1で作成した共通関数の API
3. `200_data/202_repository.js` — InvoiceRepository.append(), OrderRepository.append() の引数仕様
4. `docs/dev/dev_mas-192_repository_module_split.md` — 本仕様書の分割マッピング

## 修正対象ファイル

- `400_domain/401_rpa_hc.js`(新規作成)— generateHcInvoices
- `400_domain/402_rpa_subscription.js`(新規作成)— generateSaasInvoices
- `400_domain/403_rpa_capex.js`(新規作成)— generateCapexInvoices
- `400_domain/404_rpa_finance.js`(新規作成)— generateFinanceInvoices
- `400_domain/405_rpa_adhoc.js`(新規作成)— generateAdhocInvoices
- `400_domain/406_rpa_pipeline.js`(新規作成)— generatePipelineInvoices
- `400_domain/407_rpa_orchestrator.js`(新規作成)— generateAllRpaInvoices
- `400_domain/401_bat_rpa.js`(削除)

## 実装内容

各ドメインファイルで以下の置換を行う:

1. **シート直接アクセス → Repository**:
   - `invSheet.getDataRange().getValues()` → `InvoiceRepository.findAll()`
   - `ordSheet.getDataRange().getValues()` → `OrderRepository.findAll()`
   - `writeInvRows_(invSheet, invHeaders, rows)` → `InvoiceRepository.append(invDtos)`
   - `writeOrdRows_(ordSheet, ordHeaders, rows)` → `OrderRepository.append(ordDtos)`
   - `loadAcctMapForRpa_()` → `RpaCommon.loadAcctMap()`

2. **共通関数 → RpaCommon**:
   - `generateInvId_(invSheet, dateStr, offset)` → `RpaCommon.generateInvId(dateStr, offset)`
   - `generateOrdId_(ordSheet, dateStr, offset)` → `RpaCommon.generateOrdId(dateStr, offset)`
   - `isDuplicate_(invData, headers, pattern)` → `RpaCommon.isDuplicate(pattern)`
   - `promptTargetYm_(defaultYm)` → `RpaCommon.promptTargetYm(defaultYm)`

3. **予算シートの直接アクセスは維持**: 22_bud_headcount, 23_bud_saas 等の予算シート読込は Repository 未定義のためそのまま移植

4. **generateAllRpaInvoices**: 6つのドメイン関数を順次呼び出すだけのオーケストレータ。変更不要で移植

5. **旧ファイル削除**: 全ドメイン関数の移植完了後、`401_bat_rpa.js` を削除

## 制約

- **グローバル関数名は変更禁止**: `generateHcInvoices`, `generateSaasInvoices` 等のシグネチャ(関数名・引数)は完全に維持すること。テスト・メニューからの呼び出しが壊れる
- 各ファイル冒頭にコメントで依存関係を明記: `// 依存: RpaCommon (400), InvoiceRepository (202), OrderRepository (202)`
- `onOpenRpa()` (L33) は廃止済み関数のため、どのファイルにも移植しない(削除)
- `findTrueLastRow_` (L134) は Repository.append() が内部で処理するため不要。移植しない
- `buildInvRow_` / `buildOrdRow_` は Contracts.toRow() のラッパー。Repository.append() が DTO を受け取るため不要。ただし各ドメイン関数内で行構築している箇所は DTO オブジェクト構築に書き換える

## 動作確認

1. `npm run push:dev` で開発環境にデプロイ
2. GASエディタで旧 `401_bat_rpa.js` が存在しないことを確認
3. メニュー「📒 経理業務」→「🤖 全RPA一括実行」が正常に動作することを確認
4. 個別RPA実行:
   - 📥 SaaS月次請求の自動起票
   - 📥 人件費(HC)月次請求の自動起票
   - 📥 設備投資・返済の自動起票
5. テスト実行: 901_test_runner.js の T1(HC), T5(SaaS), T6(CAPEX) が全パスすることを確認

### 拡張思考の使用状況

| フェーズ | 拡張思考 | 備考 |
|---------|:--------:|------|
| ドメイン関数の移植 | なし | 既存ロジックのコピー+置換。判断要素は少ない |
| Repository API への書き換え | あり | findAll() が返す DTO 形式と、既存の行データ(2次元配列)の差異を吸収する変換が必要 |

Step 3: 既存ファイルのリナンバー

あなたはGAS会計システム(bizlp-gas-accounting)のシニア開発者です。
案件 MAS-192「Repository パターンの完全移行+ドメイン別モジュール分割」の Step 3(ファイルリナンバー)を実装してください。

## 実行前タスク

以下のファイルを読み込んでください:
1. `400_domain/` ディレクトリの一覧を確認(Step 2完了後の状態)
2. `CLAUDE.md` — ファイル番号体系の記載箇所

## 修正対象ファイル

- `400_domain/403_subledger_engine.js` → `400_domain/410_subledger_engine.js`(リネーム)
- `400_domain/402_project_profitability.js` → `400_domain/420_project_profitability.js`(リネーム)

## 実装内容

1. `git mv 400_domain/403_subledger_engine.js 400_domain/410_subledger_engine.js`
2. `git mv 400_domain/402_project_profitability.js 400_domain/420_project_profitability.js`
3. ファイル内のコメント(ファイル番号参照)があれば更新

## 制約

- **名前空間 `SubledgerService` は変更しない**
- **グローバル関数名は変更しない**(`processInvoiceApprovals`, `processSettlementClearings`, `buildProjectProfitability` 等)
- CLAUDE.md のファイル番号体系テーブルを更新すること

## 動作確認

1. `npm run push:dev` で開発環境にデプロイ
2. メニュー「📒 経理業務」→「Action A: 承認INV→費用計上」が正常動作することを確認
3. メニューから「PJ損益更新」が正常動作することを確認

### 拡張思考の使用状況

| フェーズ | 拡張思考 | 備考 |
|---------|:--------:|------|
| ファイルリネーム | なし | git mv のみ。ロジック変更なし |

Step 4: CLAUDE.md 更新+最終検証

あなたはGAS会計システム(bizlp-gas-accounting)のシニア開発者です。
案件 MAS-192「Repository パターンの完全移行+ドメイン別モジュール分割」の Step 4(ドキュメント更新+最終検証)を実装してください。

## 実行前タスク

以下を確認してください:
1. `400_domain/` ディレクトリに以下のファイルが存在すること:
   400_rpa_common.js, 401_rpa_hc.js, 402_rpa_subscription.js,
   403_rpa_capex.js, 404_rpa_finance.js, 405_rpa_adhoc.js,
   406_rpa_pipeline.js, 407_rpa_orchestrator.js,
   410_subledger_engine.js, 420_project_profitability.js
2. 旧ファイル `401_bat_rpa.js` が削除されていること
3. `CLAUDE.md` の現在のファイル番号体系セクション

## 修正対象ファイル

- `CLAUDE.md` — ファイル番号体系テーブルの `400_domain/` 行を更新

## 実装内容

CLAUDE.md の GAS ファイル番号体系テーブルで `400_domain/` の行を以下に更新:

| `400_domain/` | ドメインサービス | `400_rpa_common`, `401_rpa_hc`, `402_rpa_subscription`, `403_rpa_capex`, `404_rpa_finance`, `405_rpa_adhoc`, `406_rpa_pipeline`, `407_rpa_orchestrator`, `410_subledger_engine`, `420_project_profitability` |

名前空間テーブルに RpaCommon を追加:

| `RpaCommon` | `400_domain/400_rpa_common.js` | RPA共通ヘルパー(ID生成・冪等性チェック・科目マスタ) |

## 動作確認

1. `npm run push:dev` で開発環境にデプロイ
2. 全RPA一括実行(generateAllRpaInvoices)が正常終了すること
3. テスト実行: 901_test_runner.js の全テストがパスすること
4. Action A / Action B が正常動作すること
5. PJ損益更新が正常動作すること

### 拡張思考の使用状況

| フェーズ | 拡張思考 | 備考 |
|---------|:--------:|------|
| CLAUDE.md 更新 | なし | テーブルの行書き換えのみ |

推奨実行モデル

工程推奨モデル理由
仕様書作成(本ドキュメント)Claude Opus 4.693KBファイルの構造分析、番号体系設計、Repository移行の影響評価
Step 1: 共通関数の抽出Claude Sonnet 4.6Repository API の理解と、既存ヘルパーの書き換え判断が必要
Step 2: ドメイン別分割Claude Opus 4.62,064行のファイル全体を理解し、各ドメインの境界を正確に切り出す必要あり。DTO変換の判断も複数箇所
Step 3: リナンバーClaude Haiku 4.5git mv のみ。判断要素なし
Step 4: ドキュメント更新Claude Haiku 4.5テーブルの行更新のみ

変更履歴

日付変更内容
2026-04-16初版作成