ひとりのワガママは、みんなの設定個人設定 ngwPersonalInfo と Property枠
「カレンダーは日曜始まりがいい」「いや月曜だ」。どちらも正しい主張を、NGWはどちらかに決めず、各自で選べる個人設定に昇格させる。ngwPersonalInfo.php と NGW_STAFF_PROPERTY の汎用Property枠、そして「みんなの既定+ひとりの上書き」という設計の話。
どちらも、正しい
「カレンダーは日曜始まりがいい」「いや、月曜始まりだ」——役所の中でも、この手の小さな主張は必ずぶつかる。厄介なのは、どちらも、その人にとっては正しいことだ。伝票を数える人には日曜始まりが、週の予定を組む人には月曜始まりが、それぞれ自然に見える。
こういうとき、多数決で片方に決めても、負けた側は毎日ちょっとずつ不便を飲むことになる。管理者の一存で決めれば角が立つ。NGWの答えは、そのどちらでもない。「決めない」——ひとりの「こうしたい」を、全員が各自で選べる個人設定に昇格させる。それを一手に引き受けるのが ngwPersonalInfo.php(個人情報管理)だ。
ひとりぶんの、設定たち
設定画面を開くと、その人にだけ効くスイッチがずらりと並ぶ。

並んでいるのは、たとえばこんな「好み」だ。
- ログインで起動するAPP … ログイン直後に何を開くか(HOME画面/メール/スケジュール…)。毎朝最初に見たいものは人によって違う。
- 表示スタイル … 画面テーマ。
Ceruleanなど。ちなみにこのブログもCeruleanで、同じ青空の色をしている。 - グループ初期値 … グループ表示で最初に出す所属(「所属係」など)。いつも見る顔ぶれを既定にできる。
- 予定表 … タイトルと場所を改行して見せるか。
- カレンダー開始曜日 … 日曜か月曜か。——そう、FullCalendarの記事で「
firstDayを個人ごとに設定できるようにした」と書いた、その正体がこれだ。 - グループ表示に自分を含める(上部の自分の予定を非表示にする)/スケジュールの文字数制限(0=制限しない)/HOMEに週間カレンダーを表示する/DataTableの検索を保存する …
派手な機能は、ひとつもない。だが「毎日見るもの」の細部だからこそ、選べることが効く。
どこに、どう持つか
これらは職員ひとりずつ、NGW_STAFF_PROPERTY というテーブルの1行として持つ。特徴的なのは、カラムがあえて意味を持たない汎用名 —— Property01〜Property10 —— になっていることだ。
| 枠 | 中身 |
|---|---|
| Property01 | 表示スタイル |
| Property02 | グループ初期値 |
| Property03 | 予定表(改行) |
| Property04 | ログインで起動するAPP |
| Property05 | カレンダー開始曜日 |
| Property06 | HOMEに週間カレンダー |
| Property07 | DataTableの検索を保存 |
| Property08 | グループ表示に自分を含める |
| Property09 | スケジュールの文字数制限 |
保存の流れは、アプリの仕組みで書いた型そのままだ。画面 ngwPersonalInfo.php(器)が ajaxNgwPersonalInfo.php を呼び、SubMode CHANGE_STYLE で受ける。値の器 clsNgwStaffProperty と、その入出力を握る fncNgwStaffProperty(clsFunction)を通して、STAFF_CD をキーに1行を書く。しかも INSERT ... ON DUPLICATE KEY UPDATE のupsertだから、初回保存でその人の行ができ、以降は同じ行を上書きしていく。
みんなの既定と、ひとりの上書き
ここが設計のいちばんのポイントだ。
個人がまだ何も設定していないとき、たとえばカレンダー開始曜日は空になる。そのときNGWはこうする。
// カレンダー開始曜日:個人設定が空なら、システム既定(定数)を採る
if($fdtProperty05 == ''){
$fdtProperty05 = _SC_FIRST_DAY_;
}
_SC_FIRST_DAY_ はDBに置いた定数、つまりその自治体ぜんぶの既定値である。まとめると、
- 既定は、みんな共通(DB定数。自治体ごとに一度決めておく)
- 個人がひとつ設定すれば、その人だけ上書き
全員が同じ床の上に立ちつつ、いつでも自分だけ、そっと足元をずらせる。これが「ひとりのワガママは、みんなの設定」の実体だ。既定を捨てて全部を個人任せにするのでも、個人を切り捨てて全体で統一するのでもない。共通の土台と、個別の上書きが、重なって効く。
枠を、あえて汎用にする
Property01〜Property10 と、番号だけの汎用枠にしてあるのには意味がある。新しい「こうしたい」が現場から出てきても、空いている枠(10番は予備だ)に割り当て、選択肢をひとつ増やすだけで済む。テーブルに意味付きのカラムを足す——それは全自治体ぶんのDB改修を意味する——という重い一手を、避けられる。
つまりこの仕組みは、未来のワガママを受け入れるコストが、あらかじめ低い。設定が増えるほど散らかるのではなく、増えることを織り込んだ器になっている。
角を立てずに、合意する
最後は、技術の外の話。日曜か月曜かで会議をしても、たぶん決着はつかない。どちらも正しいからだ。「個人設定にする」という答えは、実装の答えであると同時に、合意形成の答えでもある。誰かのために全員を変えなくていいし、誰かの好みを却下しなくてもいい。要望は却下ではなく、枠がひとつ増える形で受け止められる。
AIとの協働作業での学び
機能で意見が割れたら、まずひとつだけ切り分ける。「これは全員に効く仕様か、その人だけの好みか」。仕様なら共通の既定(定数)に、好みなら個人設定の枠に落とす。そのどちらかに振り分けるだけで、揉めごとの多くは「設計の問題」に変わり、感情の問題ではなくなる。
NGWが10年、現場で使われ続けるのは、こういう「ひとりのワガママを、そっと全員ぶんの枠に変える」を積み重ねてきたからだ。ワガママは、切り捨てる対象ではない。うまく畳めば、それはみんなの選択肢になる。