概要

項目内容
案件IDMAS-077
カテゴリ経費・仕訳
PhaseP1
優先度★★
所要時間30分
対象ファイル400_domain/403_subledger_engine.js
前提案件D-05(DDL変更: 完了済み 2026-04-14)

目的

33タブ(33_wrk_bank)の決済日_実績を、32タブ(32_wrk_invoice)の決済日_実績列に自動転記する。Action B消込処理)実行時に、INVの決済実績日がINV側にも記録されるようにする。

現在のステータス

作業ステータス
D-05: DDLスキーマ変更(WRK_INVC に決済日_実績列追加)✅ 完了
コード連動(Action B での自動転記)✅ 完了(2026-04-16)

DDL状況(101_sys_config.js L461)

'WRK_INVC': {
  headers: [..., "自動仕訳JNL_ID", "決済日_実績"],  // ← 最終列に追加済み
  color: "#1155cc"
}

32タブの決済日_実績はヘッダー配列の index 26(AA列)に存在するが、データは空のまま。

現在のコード

Action B の残高再計算セクション(403_subledger_engine.js L587-608)

// INV別に残高再計算
for (const upd of invBalUpdates) {
  if (updatedRows[upd.row]) continue;
  updatedRows[upd.row] = true;
  var invId = String(invSheet.getRange(upd.row, invIdCol).getValue()).trim();
  var rawTotal = Number(invSheet.getRange(upd.row, invTotalCol).getValue()) || 0;
  var settled = settledByInv[invId] || 0;
  var newBalAbs = Math.abs(rawTotal) - settled;
  if (Math.abs(newBalAbs) < 1) newBalAbs = 0;
  var newBal = rawTotal < 0 ? -newBalAbs : newBalAbs;
  invSheet.getRange(upd.row, invBalCol).setValue(newBal);        // 未決済残高
  if (newBal === 0) {
    invSheet.getRange(upd.row, invStatusCol).setValue('決済完了'); // ステータス
  } else if (settled > 0) {
    invSheet.getRange(upd.row, invStatusCol).setValue('部分決済');
  }
  // ★ 決済日_実績の転記がない
}

33タブの決済日_実績の取得(L573-584のSTL集計ループ内)

const iBDate = bHdr.indexOf('決済日_実績');  // 既存の変数定義は要確認

修正方針

Action B の残高再計算セクションで、INVが「決済完了」になった際に、対応するSTLの決済日_実績を32タブに転記する。

実装ロジック

// S-05: STLからINV別の最新決済日を集計(settledByInvと同じループ内で構築)
const settleDateByInv = {};
const iBDate = bHdr.indexOf('決済日_実績');
for (var bi = 1; bi < bankAllData.length; bi++) {
  if (String(bankAllData[bi][iBStat]).trim() !== '消込済') continue;
  if (iBJnl !== -1 && !String(bankAllData[bi][iBJnl]).trim()) continue;
  var bInvId = String(bankAllData[bi][iBInvId]).trim();
  if (bInvId) {
    // 既存: 決済金額の集計
    settledByInv[bInvId] = (settledByInv[bInvId] || 0) + (Number(bankAllData[bi][iBAmt]) || 0);
    // S-05追加: 最新の決済日を記録
    if (iBDate !== -1) {
      var stlDate = bankAllData[bi][iBDate];
      if (stlDate) {
        var prev = settleDateByInv[bInvId];
        if (!prev || new Date(stlDate) > new Date(prev)) {
          settleDateByInv[bInvId] = stlDate;
        }
      }
    }
  }
}

// 残高再計算ループ内(L602付近、ステータス更新の後)に追加:
var invSettleDateCol = invIdx['決済日_実績'] + 1;
if (invSettleDateCol > 0 && settleDateByInv[invId]) {
  invSheet.getRange(upd.row, invSettleDateCol).setValue(settleDateByInv[invId]);
}

転記ルール

条件転記する値
STLが1件のみそのSTLの決済日_実績
STLが複数件(部分決済→全額消込)最新(最も遅い)決済日_実績
STLなし(仕訳振替INV等)転記しない(Action Aで即決済のため)

影響範囲

  • 変更ファイル: 403_subledger_engine.jsprocessSettlementClearings()
  • 変更量: settledByInv集計ループに5行追加 + 残高更新ループに3行追加
  • 既存ロジックへの影響: settledByInv の集計ロジックは変更なし(同じループ内に追加するだけ)

注意事項

  1. invIdx['決済日_実績'] が -1 の場合(DDL未適用環境)はスキップすること
  2. 部分決済の場合も決済日を転記する(最新の決済日)
  3. 仕訳振替INVは Action A で即決済されるため、STL経由の転記対象にならない。Action A 側での転記追加は今回のスコープ外
  4. 日付値はそのまま転記(Date型 or 文字列、33タブの値をそのまま)

関連ドキュメント

仕様書関連箇所
CLAUDE.mdAction B バリデーション: 決済日関連のルール
data_maintenance.mdD-05: DDL変更の完了記録
MAS-338 STL 消込時 差額自動処理機能下流の派生案件。本仕様で確立した settlement_date 同期パターン (決済日_実績 SSoT) を前提に、合算消込時の差額按分・自動推定科目を扱う

人間が検討すべき事項

なし(DDL変更済み、コード連動のみ。即実装可)


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

あなたはGAS会計システム(bizlp-gas-accounting)のシニア開発者です。
案件 S-05「32タブに決済日列を追加(コード連動)」を実装してください。

## 実行前タスク

以下のファイルを読み込んでください:
1. `400_domain/403_subledger_engine.js` — `processSettlementClearings()` の L571-608(STL集計 + 残高再計算セクション)
2. `100_config/101_sys_config.js` — L461の WRK_INVC headers(決済日_実績の位置確認)
3. `CLAUDE.md`
4. `docs/dev/dev_mas-077_settlement_date_sync.md`

## 修正対象ファイル

`400_domain/403_subledger_engine.js` の `processSettlementClearings()` のみ。

## 実装内容

### A: STL集計ループの拡張(L573-585)

既存の `settledByInv` 集計ループに `settleDateByInv` の構築を追加:
- `bHdr.indexOf('決済日_実績')` で日付列インデックスを取得
- 各STL行から決済日を取得し、INV別に最新(最も遅い)日付を記録

### B: 残高更新ループへの転記追加(L592-608)

ステータス更新の後に、`invIdx['決済日_実績']` が存在すれば32タブの対応セルに転記。

## 制約
- settledByInv の計算ロジックは変更しない(同じループ内に追加するだけ)
- invIdx['決済日_実績'] が -1 の場合(DDL未適用)はスキップ
- Action A 側の処理は変更しない

## 動作確認

`npm run push:dev` 後:
1. 32タブでINVを「承認済」に変更 → Action A 実行
2. 33タブでSTLに決済日入力 +「消込済」に変更 → Action B 実行
3. **検証**: 32タブの決済日_実績列(AA列)に33タブの決済日が転記されていること

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

| フェーズ | 拡張思考 | 備考 |
|---------|:--------:|------|
| STL集計ループ拡張 | なし | 既存ループへの3行追加 |
| 残高更新ループ拡張 | なし | 3行の転記コード追加 |

推奨実行モデル

工程推奨モデル理由
仕様書作成(本ドキュメント)Claude Opus 4.6Action Bのデータフロー分析、複数STL時の転記ルール設計
実装Claude Haiku 4.5仕様書でコード完全定義済み。既存ループへの追加のみ

変更履歴

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