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:
parent
8c8cb332bb
commit
0bee14f18c
@ -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一覧
|
||||
|
||||
|
||||
@ -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) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user