最終更新: 2026/06/22 18:56
MAS-075: 立替精算INVの発生日=支払期限バリデーション
概要
| 項目 | 内容 |
|---|---|
| 案件ID | MAS-075 |
| カテゴリ | 経費・仕訳 |
| Phase | P1 |
| 優先度 | ★★★ |
| 所要時間 | 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,
'立替精算: 発生日と決済日_計画が同月です(期ずれの入力ミスの可能性)');
}
}
エラーレベルの選定
| レベル | 理由 |
|---|---|
| 立替精算で同月が意図的な場合もあり得る(当日立替→即日精算) | |
| 処理をブロックする程の確実性はない | |
| WARNING | 「確認してください」の警告。背景色は薄オレンジ (#FCE5CD) |
同月でも正当なケース(少額の即日精算等)が存在し得るため、WARNING レベルとする。
影響範囲
- 変更ファイル:
201_data_validator.jsのvalidateInvoice_()に5行程度追加 - 既存チェックへの影響: なし(追加のみ)
- バリデーション実行タイミング: メニュー「データ検証」実行時(手動トリガー)
- 表示方法: 決済日_計画列のセル背景色を薄オレンジに変更 + セルメモに理由を記載
注意事項
Utils.parseDateToYm()は Date型・"YYYY-MM"・"YYYY/MM"・"YYYY年MM月" に対応済み。追加のパーサーは不要- 発生日または決済日_計画が空の場合はチェックをスキップする(空値チェックは既存の L485 で別途カバー)
- 決済手段が空の場合もスキップ(立替精算でないINVには適用しない)
- onEdit での即時警告(301_ui_assist.js)は今回のスコープ外。バリデーター実行時のチェックのみ
関連ドキュメント
| 仕様書 | 関連箇所 |
|---|---|
| CLAUDE.md | 期ずれ・消込ルール: 「後払い=未払金/未払費用」「前払い=前払費用」 |
| CLAUDE.md | Action 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 | 初版作成 |