最終更新: 2026/06/22 18:56
MAS-192: Repository パターンの完全移行+ドメイン別モジュール分割
概要
| 項目 | 内容 |
|---|---|
| 案件ID | MAS-192 |
| カテゴリ | アーキテクチャ |
| Phase | P2 |
| 優先度 | ★★ |
| 所要時間 | 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-532 | generateSaasInvoices() | SaaS定期 | 287行 |
| L536-1026 | generateHcInvoices() | HC/給与 | 491行 |
| L1030-1432 | generateCapexInvoices() | 設備投資/償却 | 403行 |
| L1435-1622 | generateFinanceInvoices() | 財務取引 | 188行 |
| L1626-1772 | generateAdhocInvoices() | 単発経費 | 147行 |
| L1776-2031 | generatePipelineInvoices() | 売上パイプライン | 256行 |
③ バッチオーケストレータ(L2034-2065)
// 400_domain/401_bat_rpa.js L2034-2065
function generateAllRpaInvoices() {
// 全6ドメインを順次実行
}
直接シートアクセスの問題箇所
Repository を一切使用せず、19箇所で getDataRange().getValues() を直接呼び出している:
| 箇所 | 行番号 | 用途 |
|---|---|---|
getInvSheet_() 内 | L51 | INVシートデータ読込 |
generateOrdId_() 内 | L71 | ORDシートデータ読込 |
generateSaasInvoices() 内 | L258, L306, L319 | 予算・INV・ORDデータ読込 |
generateHcInvoices() 内 | L548, L579, L591 | HC予算・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-532 | 402_rpa_subscription.js | generateSaasInvoices() |
| L536-1026 | 401_rpa_hc.js | generateHcInvoices() |
| L1030-1432 | 403_rpa_capex.js | generateCapexInvoices() |
| L1435-1622 | 404_rpa_finance.js | generateFinanceInvoices() |
| L1626-1772 | 405_rpa_adhoc.js | generateAdhocInvoices() |
| L1776-2031 | 406_rpa_pipeline.js | generatePipelineInvoices() |
| L2034-2065 | 407_rpa_orchestrator.js | generateAllRpaInvoices() |
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 | ファイル | 変更量 | 既存動作への影響 |
|---|---|---|---|
| 1 | 400_rpa_common.js(新規) | 約100行 | なし(新規追加のみ) |
| 2 | 401_rpa_hc.js 他6ファイル(新規)401_bat_rpa.js(削除) | 約2,064行の移動 | グローバル関数名維持のため外部影響なし |
| 3 | 402→420, 403→410(リネーム) | 0行(名前変更のみ) | GASロード順序変更。依存関係に問題なし |
| 4 | CLAUDE.md(更新) | 約10行変更 | ドキュメントのみ |
リスク評価:
- グローバル関数名を変更しないため、メニュー・テスト・他モジュールからの呼び出しは影響を受けない
- GASのロード順序は
400_rpa_common.js→401_rpa_hc.js→ ... →410_subledger_engine.js→420_project_profitability.jsとなり、依存方向と一致
注意事項
- GASロード順序の依存方向:
400_rpa_common.jsは202_repository.js(200番台) に依存する。200 < 400 なので Repository は先にロードされており問題ない - Repository の findAll() 呼び出し回数: 現在の直接アクセスでは都度
getDataRange()を呼んでいるため、Repository経由にしてもパフォーマンスは同等。ただしRpaCommon.generateInvId()とRpaCommon.isDuplicate()で二重にInvoiceRepository.findAll()を呼ぶ場合は、呼び出し元でキャッシュすることを検討 - 旧ファイル
401_bat_rpa.jsの完全削除: 分割完了後は旧ファイルを削除する。GASは同名グローバル関数が複数ファイルに存在するとエラーになるため、新旧ファイルの共存は不可 - 段階実施の粒度: TODO_future.md では「新機能実装時に該当部分を切り出す」とあるが、本仕様書では一括リファクタリングも定義する。チームの判断で段階実施に切り替え可能
onOpenRpa()(L33): 廃止済み関数。分割時に削除する- 予算シートの直接アクセス:
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.md | HC RPA業務仕様 |
人間が検討すべき事項
- 一括実施 vs 段階実施: 本仕様書は一括リファクタリングを定義しているが、新機能(MAS-099残業・MAS-109賞与等)実装時に該当ドメインのみ切り出す段階方式も可能。リスク許容度に応じて選択
- 予算シート用 Repository の要否: 現在 22_bud_headcount, 23_bud_saas 等の予算シートには Repository が未定義。本案件では直接アクセスを維持するが、将来的に BudgetRepository を追加すべきか検討
- ID生成のパフォーマンス:
RpaCommon.generateInvId()は全INVデータを毎回読み込む。大量データ時はシート末尾から逆引きする最適化が必要になる可能性あり - テスト(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.6 | 93KBファイルの構造分析、番号体系設計、Repository移行の影響評価 |
| Step 1: 共通関数の抽出 | Claude Sonnet 4.6 | Repository API の理解と、既存ヘルパーの書き換え判断が必要 |
| Step 2: ドメイン別分割 | Claude Opus 4.6 | 2,064行のファイル全体を理解し、各ドメインの境界を正確に切り出す必要あり。DTO変換の判断も複数箇所 |
| Step 3: リナンバー | Claude Haiku 4.5 | git mv のみ。判断要素なし |
| Step 4: ドキュメント更新 | Claude Haiku 4.5 | テーブルの行更新のみ |
変更履歴
| 日付 | 変更内容 |
|---|---|
| 2026-04-16 | 初版作成 |