概要

電子帳簿保存法の検索要件(取引年月日)を満たすため、「証憑日(領収書等に印字された日付)」カラムを新設する。 現場には「証憑日」のみを入力させ、「発生日」「決済予定日」はシステムが推論・自動補完するアーキテクチャに改修する。

項目内容
案件IDMAS-110
カテゴリ電帳法対応・データ基盤
PhaseP1
優先度★★
対象シート22_wrk_expense, 31_trn_journal, 32_trn_budget

設計思想(絶対の掟)

  1. NULLの徹底排除: DWHの天敵である空欄は絶対に許容しない。システムがAuto-fillで埋める。
  2. 既存ロジックの保護: 「setupAllSchemas(DDLデプロイ機能)」「神エイム行挿入(appendRow禁止。B列を下から走査して空き行を特定)」「Config-Driven(01_sys_configで論理名管理)」は完璧に稼働しているため維持すること。
  3. Poka-yoke UI: 現場が入力すべき必須列は条件付き書式等で黄色ハイライトする。テーマフォント(BIZ UDGothic)の強制適用も維持する。

実装ステップ

Step 1: 影響範囲の調査とインデックスズレの補正計画(最重要)

リスク: スプレッドシートに列を1つ追加することで、GAS内の配列インデックス(例: row[5])や、データ転送時のマッピング、ダッシュボード側のQUERY関数の列指定(例: Col3 <> '資本金')がズレてシステムが崩壊するリスクが極めて高い。

  • リポジトリ内のGASコード全体を検索(grep)し、スキーマ定義、自動入力処理(onEdit等)、TRNへのデータ転送・承認処理を特定する。
  • ズレの影響範囲をリストアップし、修正計画を出力する。
  • ユーザーの承認を得てから次ステップに進むこと。

Step 2: DDL(スキーマ)とUIのアップデート

  • 対象シート: 22_wrk_expense, 31_trn_journal, 32_trn_budget
  • setupAllSchemas 等を改修し、上記のシートに「証憑日」列を新設する。(「発生日」の左隣に挿入することを推奨)
  • Poka-yoke実装:
    • 22_wrk_expense において現場が入力する「証憑日」列を必須(背景色黄色)とする。
    • 「発生日」「決済予定日」は自動入力される前提として必須の条件付き書式から外す(入力不要を示すグレーアウト等)。

Step 3: Auto-fill(自動補完)ロジックの実装

  • 22_wrk_expense において、onEdit などの入力トリガー発火時に以下を実行する処理を追加する。
    • トリガー条件: 「証憑日」列に値が入力・変更された時。
    • アクション1: 同一行の「発生日」が空欄(NULL)であれば、「証憑日」の値をそのまま自動コピーする。(すでに値が入っている場合は上書きしない=期ズレ対応のため)
    • アクション2: 同一行の「決済予定日」が空欄(NULL)であれば、フォールバック日(例: 証憑日の月末日など)を自動入力し、絶対にNULLにしないこと。
    • 実装方針: calculateSettlementDate() 関数を作成し呼び出す形にする。後日取引先マスタと連携して実装する。

Step 4: 既存データのマイグレーションスクリプト作成

  • スキーマ変更後の既存データに対して、空欄(NULL)が発生しないよう、1回だけ手動で実行する独立したマイグレーション関数 migrateDocumentDate() を作成する。
  • 処理内容: 対象シートの既存行を走査し、「証憑日」が空欄の場合、「発生日」の値を「証憑日」にコピーする。

関連ドキュメント

仕様書関連箇所
4.1.3 システム構成・DDLsetupAllSchemas のスキーマ定義に「証憑日」列を追加
4.2.3 データ整合性チェック証憑日のバリデーションルール追加(NULL不可)
4.3.6 Adhoc(経費・その他)経費精算INVの日付フィールドの扱い変更
4.4.1 Action A / Action B仕訳転記時の証憑日→発生日マッピング
5.0 中小企業会計指針(参照)電子帳簿保存法の検索要件(取引年月日)

人間が検討すべき事項

  • 「証憑日」の列挿入位置(「発生日」の左隣が推奨だが、既存列のインデックスへの影響を考慮)
  • calculateSettlementDate() のフォールバックロジック(証憑日の月末日 or 翌月末日 等)
  • 将来の取引先マスタ連携時の決済条件(支払サイト)の設計
  • 電帳法のスキャナ保存要件との整合性(MAS-157との関連)

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

あなたはGAS会計システム(bizlp-gas-accounting)のシニア開発者です。
案件 MAS-110「証憑日カラムの新設と日付自動補完」を実装してください。

## Phase 1: 実行前タスク(Read で実物を確認。名前や行番号を推測しない)

1. `100_config/101_sys_config.js` — `setupAllSchemas()` の `schemas` オブジェクトで以下3シートのヘッダー定義を特定:
   - `WRK_EXP` (= 22_wrk_expense) の `headers` 配列
   - `TRN_JNL` (= 31_trn_journal) の `headers` 配列
   - `TRN_BUD` (= 32_trn_budget または 32_wrk_invoice) の `headers` 配列
   - 「発生日」または「発生日(P/L計上日)」の位置を確認し、挿入位置(左隣)を決定
2. `000_infra/003_contracts.js` — 対応する DTO(`ExpenseDTO` / `JournalDTO` / `InvoiceDTO`)の `@typedef` を確認。列追加により DTO 定義も更新が必要。
3. `000_infra/002_constants.js` — `SHEET_DEFAULTS` 内の当該シートのデフォルト値配列と、その長さが新ヘッダー長と一致することを確認。
4. 影響範囲調査(必須): 以下の検索で列追加の影響箇所を全特定:
   - Grep: `indexOf\(['"](発生日|証憑日)['"]\)` — ヘッダー名参照箇所
   - Grep: `row\[\d+\]` — ハードコードされた配列インデックス
   - Grep: `Col\d+` / `QUERY\(` — ダッシュボードの列指定
   - Grep: `headers\[(発生日|取引先|科目名)` — DTO マッピング
5. `300_ui/301_ui_assist.js` — `onEdit` トリガーの既存実装パターン(`22_wrk_expense` の入力補助)を確認。
6. `000_infra/004_utils.js` — `addMonths` / `parseDateToYm` / `endOfMonth` 相当のユーティリティ存在確認(フォールバック月末日計算で使用)。
7. **影響範囲リストを作成し、ユーザーの承認を得てから次ステップに進むこと。**

## Phase 2: 修正対象ファイル

- `100_config/101_sys_config.js` — DDL スキーマ拡張・Poka-yoke 色設定
- `000_infra/003_contracts.js` — DTO 定義に `証憑日` 追加
- `000_infra/002_constants.js` — `SHEET_DEFAULTS` の列数整合
- `300_ui/301_ui_assist.js` — `onEdit` に証憑日→発生日/決済予定日 Auto-fill 追加
- `400_domain/400_rpa_common.js` 等 — 列インデックスズレ補正(Phase 1 調査結果による)
- `800_ops/810_migration_s38_document_date.js`(新規) — 既存データのマイグレーション

## Phase 3: 実装内容(「## 実装ステップ」に準拠)

- Step 2 (DDL アップデート): `schemas` の `headers` 配列に「証憑日」を「発生日」の直前に挿入。
- Step 2 (Poka-yoke): 「証憑日」列を必須黄色(`yellow` 背景)、「発生日」「決済予定日」はグレーアウト(自動計算列色)。
- Step 3 (Auto-fill): `handleUxAssist_` などの onEdit ハンドラに以下を追加:
  - トリガー: `22_wrk_expense` の「証憑日」列編集時
  - アクション1: 「発生日」が空なら証憑日の値をコピー(既存値は上書きしない)
  - アクション2: 「決済予定日」が空なら `calculateSettlementDate_(docDate)` の戻り値を設定(証憑日の月末日がデフォルト)
- Step 4 (マイグレーション): `800_ops/810_migration_s38_document_date.js` 新規作成。
  - 関数名: `migrationS38DocumentDate()`
  - 冪等性: 証憑日が空の行のみ処理(既に値がある行はスキップ)
  - アクション: 対象3シートの既存行を走査し、「証憑日」が空なら「発生日」をコピー
  - メニュー登録: `101_sys_config.js` の「🔧 マイグレーション」メニューに追加
  - ログ: `Utils.logInfo` + `SpreadsheetApp.getUi().alert` で件数表示

## 制約

- 列番号ハードコード禁止。すべて `headers.indexOf('証憑日')` 等のヘッダー名ベースで取得。
- `onEdit` の Auto-fill は **既存値を上書きしない**(期ずれ対応のため)。
- マイグレーション関数は冪等(「既に値がある行はスキップ」)。
- DDL 適用順序: DTO 定義更新 → schemas 更新 → `SHEET_DEFAULTS` 更新 → onEdit → マイグレーション。途中でストップしてもデータ破壊しないよう各ステップを独立コミット可能にする。

## エッジケース

| 条件 | 動作 |
|------|------|
| 証憑日が空で発生日も空 | 警告ログ + スキップ(マイグレーション時) |
| 証憑日 > 発生日(月跨ぎ) | 既存値を上書きしない(期ずれとして許容) |
| 決済予定日が既に入力済 | 上書きしない |
| 証憑日が未来日 | バリデーション(別案件 MAS-075 との整合性確認) |
| 列追加による行番号シフト | Phase 1 調査の補正リストをすべて適用済みであること |

## 実データ検証(実装直前に実施)

- dev 環境の `22_wrk_expense` / `31_trn_journal` / `32_trn_budget` のヘッダー行を MCP で取得し、DDL 定義と一致していること
- 既存行数(マイグレーション対象件数)を事前カウント
- `Utils` モジュールに月末日計算ユーティリティの存在確認(なければ実装)

## 動作確認

1. `npm run push:dev` → `setupAllSchemas()` 実行 → 3 シートのヘッダーに「証憑日」が追加されていること
2. `22_wrk_expense` に新規行を追加し「証憑日」のみ入力 → 「発生日」と「決済予定日」が自動設定されること
3. 既存値がある行で「証憑日」のみ変更 → 「発生日」「決済予定日」が上書きされないこと
4. マイグレーション実行 → 既存行の空「証憑日」が「発生日」から埋まること
5. マイグレーション再実行 → 冪等(2 回目は 0 件更新)
6. 依存する RPA(`401_rpa_hc` / `405_rpa_adhoc` 等)を実行し、INV 生成に回帰がないこと
7. 91_fs_bs / 92_fs_pl の期ずれロジック(`dmIsAccruedExpense_`)が新「証憑日」列の影響を受けていないこと

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

| フェーズ | 拡張思考 | 備考 |
|---------|---------|------|
| Phase 1(調査・設計) | あり | 列追加の影響範囲特定・インデックスズレ補正計画 |
| Phase 2(実装) | 部分的 | 各シートのヘッダー挿入位置の決定のみ。コード書き下しでは使用しない |

推奨実行モデル

工程推奨モデル理由
影響範囲調査(Phase 1)Claude Sonnet 4.6Grep 結果の読み取りと補正計画の立案が必要
DDL 変更(Step 2)Claude Sonnet 4.6ヘッダー挿入位置の特定・関連定数の整合性判断
Auto-fill 実装(Step 3)Claude Sonnet 4.6既存 onEdit パターンの理解と値上書きガードの正確性
マイグレーション実装(Step 4)Claude Haiku 4.5804-806 の既存パターンの踏襲のみ

変更履歴

日付変更内容
2026-04-14 10:21初版作成
2026-04-20実装プロンプト + 推奨実行モデル セクション追加