Task2完了: Process入力検証タブのJSON構造を実機実績から確認

508971への新規テストProcess追加なしで、既存本番プロジェクト
「実行予算WF申請」(SiteId 376872)の取得済みprocesses.jsonに
入力検証タブの実例があり、そこから構造(ValidateInputs配列、
各要素{Id, ColumnName, Required})を確認できた。508971への
書き込みが不要になったため、Task2の内容と手順を計画書側も
実態に合わせて修正。Task5のサンプルコード内のキー名も
Validations→ValidateInputsへ修正。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Kenichiro NOGI 2026-09-05 14:27:09 +09:00
parent 8c8cb332bb
commit 0bee14f18c
2 changed files with 33 additions and 50 deletions

View File

@ -6,9 +6,18 @@
設計書: `NodeSrv/docs/superpowers/specs/2026-09-05-healthcheck-lineworks-survey-n8n-design.md` 設計書: `NodeSrv/docs/superpowers/specs/2026-09-05-healthcheck-lineworks-survey-n8n-design.md`
実装計画: `NodeSrv/docs/superpowers/plans/2026-09-05-healthcheck-lineworks-survey-n8n.md` 実装計画: `NodeSrv/docs/superpowers/plans/2026-09-05-healthcheck-lineworks-survey-n8n.md`
## 実機調査メモ ## 実機調査メモ2026-09-05確認
(Task 2完了後、ここにPleasanterのProcess入力検証タブのJSON構造を記録する) 508971への新規テストProcess追加なしで、既存本番プロジェクト「実行予算WF申請」SiteId 376872
取得済み`processes.json``Pleasanter/実行予算WF申請/configs/production/site-376872_実行予算WF申請/processes.json`
に入力検証タブを使ったProcessの実例があり、そこからJSON構造を確認できた。
Processの入力検証タブは`SiteSettings.Processes[].ValidateInputs`配列として保存される。
各要素は`{"Id": number, "ColumnName": string, "Required": boolean}`(実例: `{"Id": 1, "ColumnName": "Class021", "Required": true}`)。
配列名は`Validations`ではなく`ValidateInputs`。値を設定していない項目(クライアント/サーバ正規表現、エラーメッセージ、最小/最大等)は
キー自体が省略される可能性が高い(今回の実例では未設定のため確認できていない)。
Task 5processFlow.jsの`getValidationColumnNames`はこの構造(`process.ValidateInputs[].ColumnName`)を前提に実装する。
## n8nリソースID一覧 ## n8nリソースID一覧

View File

@ -110,60 +110,34 @@ git commit -m "feat: healthcheck-survey-botプロジェクト雛形を追加"
--- ---
### Task 2: 実機調査 — Processの入力検証タブのJSON構造を確認 ### Task 2: 実機調査 — Processの入力検証タブのJSON構造を確認(完了)
Pleasanter公式マニュアルにも構造の記載がなく、508971の既存Processesには入力検証を使った実例がないため、実機で確認する。**508971本番へのSiteSettings変更を伴うため、着手前に必ずユーザーへ確認する。** Pleasanter公式マニュアルには構造の記載がなく、508971の既存Processesにも入力検証を使った実例がなかったが、508971へテストProcessを追加する前に、既存本番プロジェクト「実行予算WF申請」SiteId 376872の取得済み`processes.json`に入力検証タブを使ったProcessの実例が見つかり、508971への書き込みなしで構造を確認できた。
**Files:** **Files:**
- Modify: `NodeSrv/apps/healthcheck-survey-bot/README.md`(調査結果を追記) - Modified: `NodeSrv/apps/healthcheck-survey-bot/README.md`(調査結果を追記済み
**Interfaces:** **Interfaces:**
- Produces: Task 5processFlow.jsが前提とする、Process内で入力検証対象列を表すJSONキー名とその構造 - Produces: Task 5processFlow.jsが前提とする、Process内で入力検証対象列を表すJSONキー名とその構造
- [ ] **Step 1: ユーザーへテストProcess作成を依頼** **確認できた構造:**
以下をプリザンター508971の「プロセス」設定画面で新規作成してもらうよう、ユーザーに依頼する本番Statusに影響しないよう、現在の状況・変更後の状況は同じ値のままにしてもらう `Pleasanter/実行予算WF申請/configs/production/site-376872_実行予算WF申請/processes.json`のId:1「入力完了」Processに実例あり:
- 名称: `テスト_入力検証構造確認` ```json
- 表示名: `テスト` {
- 現在の状況/変更後の状況: 触らず空欄のまま(全状況共通ボタンにしてもらう) "Id": 1,
- 入力検証タブ: 「新規作成」→項目に`日付001`Date001を選択して保存 "Name": "入力完了",
- Process自体を保存 "ValidateInputs": [
{ "Id": 1, "ColumnName": "Class021", "Required": true },
- [ ] **Step 2: 最新のSiteSettingsを取得** { "Id": 2, "ColumnName": "Class022", "Required": true }
]
```bash }
cd "C:\Users\k.nogi\#GitHub\ken_nogi\dev\Pleasanter"
node .claude/js/get-site-config.js --project="健康診断管理" --env=production
``` ```
Expected: `健康診断管理/configs/production/site-508971_健康診断管理/sitesettings/site-508971_latest.json`が更新される 配列名は`Validations`ではなく`ValidateInputs`。各要素は`{Id, ColumnName, Required}`。値を設定していない項目(クライアント/サーバ正規表現、エラーメッセージ、最小/最大等)はキー自体が省略される可能性が高い(この実例では未設定のため確認できていない)。
- [ ] **Step 3: Processes配列の該当エントリを確認** Task 5processFlow.jsの`getValidationColumnNames`はこの構造(`process.ValidateInputs[].ColumnName`)を前提に実装する。
`site-508971_latest.json`内の`Response.Data.SiteSettings.Processes`配列から、Step1で追加したProcess`Name`が`テスト_入力検証構造確認`のもの)を探し、入力検証設定に対応するキー(配列名・各要素のプロパティ名)を特定する。
- [ ] **Step 4: 発見した構造をREADME.mdに記録**
例(実際のキー名は実機確認結果に置き換える):
```markdown
## 実機調査メモ2026-09-05確認
Processの入力検証タブは`SiteSettings.Processes[].Validations`配列として保存される。
各要素は`{"Id": 1, "ColumnName": "Date001"}`形式(フィールド名は実機確認結果で確定)。
```
- [ ] **Step 5: テストProcessを削除**
ユーザーに508971の管理画面からテストProcessを削除してもらう本番のProcess一覧を汚さないため
- [ ] **Step 6: コミット**
```bash
git add NodeSrv/apps/healthcheck-survey-bot/README.md
git commit -m "docs: Process入力検証タブのJSON構造を調査結果として記録"
```
--- ---
@ -455,7 +429,7 @@ git commit -m "feat: ツールチップ文言のプレースホルダー置換
### Task 5: processFlow.js — Process抽出・回答照合・追加入力判定 ### Task 5: processFlow.js — Process抽出・回答照合・追加入力判定
Task 2で確認したJSON構造を前提に実装する。以下のコードでは、入力検証対象列が`process.Validations`(各要素`{ColumnName: string}`)に入っている前提で書いている。**Task 2の実機調査結果が異なる構造だった場合は、`getValidationColumnNames`関数のみをその構造に合わせて書き換える**(他の関数への影響はない) Task 2で確認したJSON構造を前提に実装する。入力検証対象列は`process.ValidateInputs`(各要素`{Id: number, ColumnName: string, Required: boolean}`)に入っている
**Files:** **Files:**
- Create: `NodeSrv/apps/healthcheck-survey-bot/src/lib/processFlow.js` - Create: `NodeSrv/apps/healthcheck-survey-bot/src/lib/processFlow.js`
@ -482,9 +456,9 @@ const {
const processes = [ const processes = [
{ Id: 1, Name: "了承", DisplayName: "了承", CurrentStatus: 100, ChangedStatus: 200 }, { Id: 1, Name: "了承", DisplayName: "了承", CurrentStatus: 100, ChangedStatus: 200 },
{ Id: 2, Name: "日程変更", DisplayName: "日程変更", CurrentStatus: 100, ChangedStatus: 150, Validations: [{ ColumnName: "Date001" }] }, { Id: 2, Name: "日程変更", DisplayName: "日程変更", CurrentStatus: 100, ChangedStatus: 150, ValidateInputs: [{ Id: 1, ColumnName: "Date001", Required: true }] },
{ Id: 3, Name: "受けた", DisplayName: "受けた", CurrentStatus: 200, ChangedStatus: 300 }, { Id: 3, Name: "受けた", DisplayName: "受けた", CurrentStatus: 200, ChangedStatus: 300 },
{ Id: 4, Name: "結果受取り", DisplayName: "受け取った", CurrentStatus: 300, ChangedStatus: 900, Validations: [{ ColumnName: "AttachmentsA" }] }, { Id: 4, Name: "結果受取り", DisplayName: "受け取った", CurrentStatus: 300, ChangedStatus: 900, ValidateInputs: [{ Id: 1, ColumnName: "AttachmentsA", Required: true }] },
]; ];
test("extractProcessesForStatus: 現在のStatusに一致するProcessのみ返す", () => { test("extractProcessesForStatus: 現在のStatusに一致するProcessのみ返す", () => {
@ -514,7 +488,7 @@ test("matchProcessByLabel: 一致しなければnull", () => {
assert.strictEqual(matchProcessByLabel(candidates, "存在しない選択肢"), null); assert.strictEqual(matchProcessByLabel(candidates, "存在しない選択肢"), null);
}); });
test("classifyAwaitInput: Validationsが無いProcessはnone", () => { test("classifyAwaitInput: ValidateInputsが無いProcessはnone", () => {
assert.deepStrictEqual(classifyAwaitInput(processes[0]), { awaitInput: "none", column: null }); assert.deepStrictEqual(classifyAwaitInput(processes[0]), { awaitInput: "none", column: null });
}); });
@ -549,8 +523,8 @@ function matchProcessByLabel(processes, text) {
} }
function getValidationColumnNames(process) { function getValidationColumnNames(process) {
if (!Array.isArray(process.Validations)) return []; if (!Array.isArray(process.ValidateInputs)) return [];
return process.Validations.map((v) => v.ColumnName).filter(Boolean); return process.ValidateInputs.map((v) => v.ColumnName).filter(Boolean);
} }
function classifyAwaitInput(process) { function classifyAwaitInput(process) {