概要

項目内容
案件IDMAS-075
カテゴリ経費・仕訳
PhaseP1
優先度★★★
所要時間30分
対象ファイル200_data/201_data_validator.js
関連ファイル300_ui/301_ui_assist.js(オプション: onEdit警告)

目的

立替精算INVで「発生日(P/L計上日)」と「決済日_計画」が同月の場合に警告を表示し、期ずれの入力ミスを防止する。

背景

立替精算は「従業員が自費で立て替えた経費を後日精算する」取引パターンである。本来、発生日(費用が発生した月)と決済日_計画(立替精算日)は異なる月になるのが正常形。同月の場合は以下のいずれかの入力ミスが疑われる:

  • 発生日に決済日を誤入力している(期ずれが正しく計上されない)
  • 決済日_計画に発生日を誤入力している

現状、validateInvoice_() には発生日と決済日_計画の関係性チェックが一切なく、入力ミスが Action A/B まで気づかれない。

現在のコード

validateInvoice_()(201_data_validator.js L468-517)

function validateInvoice_(ss) {
  // ... (省略)
  // 既存チェック:
  //   L485: 承認済なのに発生日が空 → CRITICAL
  //   L491: 親発注ID(ORD)存在チェック → ERROR
  //   L496: 請求額計算一致チェック → WARNING
  //   L504: 請求総額=0 → ERROR
  //   L508: 科目名の空白・マスタ存在 → CRITICAL
  //   L512: 未決済残高がマイナス → ERROR
  //   L514: 請求IDが未発番 → WARNING
  // ★ 発生日と決済日_計画の関係性チェック → なし
}

立替精算INVの特定方法

401_bat_rpa.js での判定ロジック:

// L1728: 決済手段に「立替」を含む → 申請種別 = '経費精算(社員立替)'
if (payMethod.includes('立替')) appType = '経費精算(社員立替)';

ただし手動起票されたINVでは申請種別が空や別の値の場合がある。判定方法は2つ:

  • 案A: 決済手段 列に「立替」を含むか(RPA判定と同じ基準)
  • 案B: 申請種別 列が「経費精算(社員立替)」か

案Aを採用: 手動起票INVもカバーでき、RPA判定基準と一貫性がある。

32_wrk_invoice のヘッダー構造(関連列)

Index列名用途
6発生日(P/L計上日)費用のP/L計上月を決定
7決済日_計画立替精算日(=支払期限)
22決済手段「立替」を含むか判定

修正方針

validateInvoice_() にチェックを追加

既存の科目名チェック(L508-510)の後に、以下のチェックを追加する。

// S-03: 立替精算INVの発生日と決済日_計画の同月チェック
var payMethod = String(data[r][idx['決済手段']] || '').trim();
if (payMethod.includes('立替')) {
  var dateStr = Utils.parseDateToYm(data[r][idx['発生日(P/L計上日)']]);
  var dueStr  = Utils.parseDateToYm(data[r][idx['決済日_計画']]);
  if (dateStr && dueStr && dateStr === dueStr) {
    setErr_(bg, notes, r, idx['決済日_計画'], VAL_COLORS.WARNING,
      '立替精算: 発生日と決済日_計画が同月です(期ずれの入力ミスの可能性)');
  }
}

エラーレベルの選定

レベル理由
CRITICAL立替精算で同月が意図的な場合もあり得る(当日立替→即日精算)
ERROR処理をブロックする程の確実性はない
WARNING「確認してください」の警告。背景色は薄オレンジ (#FCE5CD)

同月でも正当なケース(少額の即日精算等)が存在し得るため、WARNING レベルとする。

影響範囲

  • 変更ファイル: 201_data_validator.jsvalidateInvoice_() に5行程度追加
  • 既存チェックへの影響: なし(追加のみ)
  • バリデーション実行タイミング: メニュー「データ検証」実行時(手動トリガー)
  • 表示方法: 決済日_計画列のセル背景色を薄オレンジに変更 + セルメモに理由を記載

注意事項

  1. Utils.parseDateToYm() は Date型・"YYYY-MM"・"YYYY/MM"・"YYYY年MM月" に対応済み。追加のパーサーは不要
  2. 発生日または決済日_計画が空の場合はチェックをスキップする(空値チェックは既存の L485 で別途カバー)
  3. 決済手段が空の場合もスキップ(立替精算でないINVには適用しない)
  4. onEdit での即時警告(301_ui_assist.js)は今回のスコープ外。バリデーター実行時のチェックのみ

関連ドキュメント

仕様書関連箇所
CLAUDE.md期ずれ・消込ルール: 「後払い=未払金/未払費用」「前払い=前払費用」
CLAUDE.mdAction B バリデーション: 「決済日<INV発生日→スキップ(前払いINV除く)」
B.3 統合テスト手順バリデーションテスト

人間が検討すべき事項

  • 警告のみか入力ブロックか: 本仕様書では WARNING(警告のみ)を採用。入力ブロック(CRITICAL化)が必要なら変更可能
  • onEdit 即時警告の要否: 現スコープではバリデーター実行時のみ。入力時即座に警告する場合は 301_ui_assist.js への追加が別途必要

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

あなたはGAS会計システム(bizlp-gas-accounting)のシニア開発者です。
CLIエージェントである「Claude Code」として、以下の指示に従い、案件 S-03「立替精算INVの発生日=支払期限バリデーション」を実装してください。

## 実行前タスク(コンテキストの読み込み)

実装前に**必ず**以下のファイルを読み込んで、既存パターンと現在の実装を正確に把握してください。

1. 修正対象: `200_data/201_data_validator.js` — `validateInvoice_()` の全体構造(L468-517)、`setErr_()` の引数パターン、`VAL_COLORS` の定義
2. ユーティリティ: `000_infra/004_utils.js` — `Utils.parseDateToYm()` のシグネチャと対応形式
3. 参考(立替判定): `400_domain/401_bat_rpa.js` — L1728付近の `payMethod.includes('立替')` パターン
4. プロジェクト規約: `CLAUDE.md`
5. 開発仕様書: `docs/dev/dev_mas-075_expense_date_validation.md`

## 修正対象ファイル

`200_data/201_data_validator.js` の `validateInvoice_()` のみ。他ファイルの変更は不要。

## 実装内容

### validateInvoice_() への追加(1箇所のみ)

既存の科目名チェック(L508-510付近)と未決済残高チェック(L512付近)の間、または未決済残高チェックの後に以下のチェックを追加:

1. `決済手段` 列の値を取得し、「立替」を含むか判定
2. 含む場合、`発生日(P/L計上日)` と `決済日_計画` の両方を `Utils.parseDateToYm()` で "YYYY-MM" に変換
3. 両方が非空かつ同月なら、`決済日_計画` のセルに WARNING を設定

```js
// MAS-075: 立替精算INVの発生日と決済日_計画の同月チェック
var payMethod = String(data[r][idx['決済手段']] || '').trim();
if (payMethod.includes('立替')) {
  var dateStr = Utils.parseDateToYm(data[r][idx['発生日(P/L計上日)']]);
  var dueStr  = Utils.parseDateToYm(data[r][idx['決済日_計画']]);
  if (dateStr && dueStr && dateStr === dueStr) {
    setErr_(bg, notes, r, idx['決済日_計画'], VAL_COLORS.WARNING,
      '立替精算: 発生日と決済日_計画が同月です(期ずれの入力ミスの可能性)');
  }
}
```

## 制約

- `validateInvoice_()` の既存チェック(L485-514)は一切変更しない
- WARNING レベルを使用する(CRITICAL や ERROR ではない)
- `301_ui_assist.js` は変更しない(onEdit即時警告はスコープ外)
- `idx['決済手段']`, `idx['発生日(P/L計上日)']`, `idx['決済日_計画']` は `buildHeaderIndex_()` で生成済みのヘッダーインデックスを使用すること。列番号のハードコードは禁止

## 動作確認

実装後、`npm run push:dev` で開発環境にデプロイし、以下を確認:
1. GASエディタでメニュー「データ検証」を実行
2. 32_wrk_invoice で決済手段に「立替」を含み、かつ発生日と決済日_計画が同月のINVがあれば、決済日_計画セルが薄オレンジ(#FCE5CD)になること
3. 立替以外のINV、または異月の立替INVは警告が出ないこと

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

| フェーズ | 拡張思考 | 備考 |
|---------|:--------:|------|
| ファイル読み込み・パターン理解 | なし | 既存パターンの読み取りのみ |
| チェックロジック実装 | なし | 5行の単純な条件判定。パターン確立済み |
| 挿入位置の判定 | なし | 既存チェックの末尾に追加するだけ |

推奨実行モデル

工程推奨モデル理由
仕様書作成(本ドキュメント)Claude Opus 4.6期ずれの会計ロジック理解、立替精算の判定方法の選定(案A vs 案B)、既存バリデーションとの整合性判断に高い推論力が必要
実装Claude Haiku 4.5仕様書で挿入コードが完全に定義済み。5行の追加のみで、判断要素がほぼない
動作確認ユーザー手動GASエディタでのバリデーション実行とスプレッドシート目視確認が必要

変更履歴

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