概要
| 項目 | 内容 |
|---|
| 案件ID | MAS-077 |
| カテゴリ | 経費・仕訳 |
| Phase | P1 |
| 優先度 | ★★ |
| 所要時間 | 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.js の processSettlementClearings() 内
- 変更量: settledByInv集計ループに5行追加 + 残高更新ループに3行追加
- 既存ロジックへの影響: settledByInv の集計ロジックは変更なし(同じループ内に追加するだけ)
注意事項
invIdx['決済日_実績'] が -1 の場合(DDL未適用環境)はスキップすること
- 部分決済の場合も決済日を転記する(最新の決済日)
- 仕訳振替INVは Action A で即決済されるため、STL経由の転記対象にならない。Action A 側での転記追加は今回のスコープ外
- 日付値はそのまま転記(Date型 or 文字列、33タブの値をそのまま)
関連ドキュメント
人間が検討すべき事項
なし(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.6 | Action Bのデータフロー分析、複数STL時の転記ルール設計 |
| 実装 | Claude Haiku 4.5 | 仕様書でコード完全定義済み。既存ループへの追加のみ |
変更履歴