diff --git a/NodeSrv/apps/healthcheck-survey-bot/README.md b/NodeSrv/apps/healthcheck-survey-bot/README.md index bb67bd81..857cd795 100644 --- a/NodeSrv/apps/healthcheck-survey-bot/README.md +++ b/NodeSrv/apps/healthcheck-survey-bot/README.md @@ -6,9 +6,18 @@ 設計書: `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` -## 実機調査メモ +## 実機調査メモ(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 5(processFlow.js)の`getValidationColumnNames`はこの構造(`process.ValidateInputs[].ColumnName`)を前提に実装する。 ## n8nリソースID一覧 diff --git a/NodeSrv/docs/superpowers/plans/2026-09-05-healthcheck-lineworks-survey-n8n.md b/NodeSrv/docs/superpowers/plans/2026-09-05-healthcheck-lineworks-survey-n8n.md index fbea1ab2..11ae4d1d 100644 --- a/NodeSrv/docs/superpowers/plans/2026-09-05-healthcheck-lineworks-survey-n8n.md +++ b/NodeSrv/docs/superpowers/plans/2026-09-05-healthcheck-lineworks-survey-n8n.md @@ -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:** -- Modify: `NodeSrv/apps/healthcheck-survey-bot/README.md`(調査結果を追記) +- Modified: `NodeSrv/apps/healthcheck-survey-bot/README.md`(調査結果を追記済み) **Interfaces:** - Produces: Task 5(processFlow.js)が前提とする、Process内で入力検証対象列を表すJSONキー名とその構造 -- [ ] **Step 1: ユーザーへテストProcess作成を依頼** +**確認できた構造:** -以下をプリザンター508971の「プロセス」設定画面で新規作成してもらうよう、ユーザーに依頼する(本番Statusに影響しないよう、現在の状況・変更後の状況は同じ値のままにしてもらう)。 +`Pleasanter/実行予算WF申請/configs/production/site-376872_実行予算WF申請/processes.json`のId:1「入力完了」Processに実例あり: -- 名称: `テスト_入力検証構造確認` -- 表示名: `テスト` -- 現在の状況/変更後の状況: 触らず空欄のまま(全状況共通ボタンにしてもらう) -- 入力検証タブ: 「新規作成」→項目に`日付001`(Date001)を選択して保存 -- Process自体を保存 - -- [ ] **Step 2: 最新のSiteSettingsを取得** - -```bash -cd "C:\Users\k.nogi\#GitHub\ken_nogi\dev\Pleasanter" -node .claude/js/get-site-config.js --project="健康診断管理" --env=production +```json +{ + "Id": 1, + "Name": "入力完了", + "ValidateInputs": [ + { "Id": 1, "ColumnName": "Class021", "Required": true }, + { "Id": 2, "ColumnName": "Class022", "Required": true } + ] +} ``` -Expected: `健康診断管理/configs/production/site-508971_健康診断管理/sitesettings/site-508971_latest.json`が更新される +配列名は`Validations`ではなく`ValidateInputs`。各要素は`{Id, ColumnName, Required}`。値を設定していない項目(クライアント/サーバ正規表現、エラーメッセージ、最小/最大等)はキー自体が省略される可能性が高い(この実例では未設定のため確認できていない)。 -- [ ] **Step 3: Processes配列の該当エントリを確認** - -`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構造を調査結果として記録" -``` +Task 5(processFlow.js)の`getValidationColumnNames`はこの構造(`process.ValidateInputs[].ColumnName`)を前提に実装する。 --- @@ -455,7 +429,7 @@ git commit -m "feat: ツールチップ文言のプレースホルダー置換 ### 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:** - Create: `NodeSrv/apps/healthcheck-survey-bot/src/lib/processFlow.js` @@ -482,9 +456,9 @@ const { const processes = [ { 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: 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のみ返す", () => { @@ -514,7 +488,7 @@ test("matchProcessByLabel: 一致しなければ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 }); }); @@ -549,8 +523,8 @@ function matchProcessByLabel(processes, text) { } function getValidationColumnNames(process) { - if (!Array.isArray(process.Validations)) return []; - return process.Validations.map((v) => v.ColumnName).filter(Boolean); + if (!Array.isArray(process.ValidateInputs)) return []; + return process.ValidateInputs.map((v) => v.ColumnName).filter(Boolean); } function classifyAwaitInput(process) {