3画面パック ③ PM — 案件のかんばん¶
結論(3行)
- 列=領域、カード=案件 1 件。案件が進むと、カードが次の列へ動きます
- 🔴 警告は 2 つの条件でしか出しません。「決めて止めている案件」は鳴りません。ここがこの画面の肝です
- 画面を直しても意味がありません。直す場所は
deal.csvとactivity.csvです
この画面が答える問い:いま案件は何件あり、どこに居て、次に何をするのか。そして手が止まっているものはどれか。
1. 画面の構成¶
flowchart TB
H["ヘッダー<br>タイトル / 他の画面への行き来 / 判定日"] --> M["指標 3つ<br>進行中 / 停滞 / 型 n/総数"]
M --> S["今週の主役<br>1件だけ選ぶ"]
S --> B["板<br>領域の列 + 完了の列"]
B --> C["カード = 案件1件"]
| 場所 | 何を出すか |
|---|---|
| ヘッダー | 画面名、ポータルと SW への行き来、判定日の入力欄 |
| 指標(3 つ) | ① 進行中の件数 ② 停滞の件数 ③ 型が「ある」数 / 全升目数(押すと SW へ) |
| 今週の主役 | 進行中の案件から 1 件だけ選ぶ。選んだカードを板の上で強調する |
| 板 | 領域ごとの列 + 右端に 完了の列 |
| カード | 案件 1 件 |
2. 列(何を列にするか)¶
- 列は
area.csvの領域を、ファイルに書いてある順に並べます - 右端に
完了という列を 1 つ足します。ここにはstatusが終了の案件が入ります - 列の見出しには
領域ID+ 領域名 + 件数 を出します(例:A 受注まで/3件) - 案件が 0 件の列も、列自体は必ず出します(「ここには今、何も無い」が見えることに意味があります)
🔴 板に列が無い領域へ案件を入れないでください
列を持たない領域に案件が入ると、その案件は画面から黙って消えます。 生成器は、この状態を見つけたらエラーで止めて人に知らせます(黙って落としません)。 → 05_build の検査 4
列に出さない領域(例:案件が乗らない、社内向けの領域)を作る場合は、 生成器の「板に出す領域」の一覧を明示的に書き換えてください。
案件がどの列に入るか¶
案件の status |
入る列 |
|---|---|
進行中 |
area_id の列 |
停止中 |
area_id の列(進行中 と同じ列。文字の違いはカードのタグで見せる) |
終了 |
完了の列 |
3. カードに何を出すか¶
上から順に、この 7 つだけです。これ以上詰め込まないでください。
| # | 出すもの | 元の列 | 備考 |
|---|---|---|---|
| 1 | 警告の帯(出るときだけ) | — | カードの最上部。理由を 1 行(下の §4) |
| 2 | 案件 ID | deal.deal_id |
小さく、薄く |
| 3 | 案件名 | deal.name |
いちばん大きく |
| 4 | 会社名 | company.name(company_id で引く) |
薄く |
| 5 | 工程バッジ | deal.stage_id + stage.name_ja |
色付きの小さな箱(例 A2 見積・提案) |
| 6 | 次の一手 | deal.next_action |
見出し「次の一手」+本文。空なら 未定。長い場合は 2 行で切り、全文はマウスを乗せると出す |
| 7 | タグ 3 つ | owner / amount+paid_type / status |
丸い小さなタグ。空なら 未定 |
| 8 | 放置の宣言(あるときだけ) | deal.snooze_until |
「9月24日まで意図して放置」と日本語で |
「次の一手」を必ず 1 か所に出すのは、意図的です
案件そのものは実行できません。実行できるのは行動だけです。 案件のリストと「次の行動」を別々に持つと、両方を突き合わせる手間が毎回かかります。 だからカードの真ん中に、次の 1 動作を固定で出します。
カードの並び順¶
- 列の中は
deal.csvの行の順そのままにします。並べ替えのルールを増やさないでください - 順番を変えたいときは、CSV の行を動かします(画面側で並べ替えの設定を作らない)
なぜ並べ替え機能を付けないのか
並べ替えを画面に持たせると、「自分が見ている順」と「CSV の順」が食い違い、 どちらが本当の優先順位か分からなくなります。順番も CSV に持たせます。
4. 🔴 警告(停滞)の判定 — この画面でいちばん大事な仕様¶
判定日(既定は今日。画面上で変更できる)を基準に、案件ごとに次の順で判定します。
flowchart TD
A["案件"] --> B{"status が 終了 ?"}
B -->|はい| N["警告なし"]
B -->|いいえ| C{"snooze_until が入っている ?"}
C -->|はい| D{"snooze_until < 判定日 ?"}
D -->|はい| E["🔴 期限切れ"]
D -->|いいえ| N2["警告なし(決めて待っている)"]
C -->|いいえ| F{"最後の活動が<br>判定日の7日前より古い ?"}
F -->|はい| G["🟡 放置の宣言なし(7日以上)"]
F -->|いいえ| N3["警告なし(最近さわった)"]
| 警告 | 条件 | 帯の色 | 意味 |
|---|---|---|---|
| 期限切れ | snooze_until が入っていて、判定日より前 |
赤 | 「この日まで待つ」と決めた日が過ぎた |
| 放置の宣言なし(7日以上) | snooze_until が空で、activity の最新が判定日の 7 日前より古い |
黄 | 決めてもいないのに、1 週間さわっていない |
| なし | 上のどちらでもない | — | 健全 |
「最後の活動」は、activity.csv のうち deal_id が一致する行の happened_on の最大値です。1 件も無ければ、無限に古いものとして扱います。
🔴 停止中 という文字だけでは警告しません
決めて止めているのか、忘れているのかを、文字の見た目では区別できません。
区別するのは snooze_until があるかどうかだけです。
こうしないと、止めている案件が毎日赤くなり、板を見るのが苦痛になって見なくなります。 見なくなった板は、無いのと同じです。
判定日を未来にすると、先読みできます
判定日を来週にすると「来週になると何件が警告になるか」が分かります。 週に 1 回、判定日を 1 週間先にして見るのがおすすめです。
5. 今週の主役¶
- 進行中の案件から 1 件だけ選ぶ選択欄を、板の上に置きます
- 選ぶと、そのカードだけ枠を強調します
- 🔴 保存しません。選び直すだけの、その場の道具です
なぜ 1 件だけなのか
同時に手を付ける数を絞るためです。一人で全部同時に進めることはできません。 「今週はこれ」を 1 件決めるという、それだけの機能です。
6. 案件の動かし方(状態遷移)¶
flowchart LR
S1["進行中<br>A1"] -->|工程が進んだ| S2["進行中<br>A2"]
S2 -->|領域をまたいだ| S3["進行中<br>B1"]
S3 --> S4["終了"]
S2 -->|待つと決めた| P["停止中<br>+ snooze_until"]
P -->|再開| S2
| やること | 直す列 |
|---|---|
| 工程を進める | stage_id(領域をまたいだら area_id も一緒に) |
| いったん止める | status を 停止中 に、snooze_until にいつまで待つかを書く |
| 再開する | status を 進行中 に、snooze_until を空にする |
| 終わる | status を 終了 に |
| 何かした | activity.csv に1 行足す(消さない・直さない) |
🔴 deal_id は、始まりから終わりまで変えません
領域(A、B、…)は案件の「いまの位置」であって、案件そのものではありません。 受注から入金まで、1 本の ID で追えます。ID を振り直すと、活動ログも請求も全部切れます。
7. 画面の下に必ず出す 1 行¶
正本は CSV 9 枚。この画面は生成された表示です。ここを直しても正本は変わりません。
生成日時: 2026-09-14T10:00:00+09:00
生成日時を必ず出してください
これが無いと、いつのデータを見ているか分からなくなります。 「板が古いまま」に気づけるかどうかは、この 1 行にかかっています。
8. 作り手向けの決めごと¶
| 決めごと | 理由 |
|---|---|
| HTML は 1 ファイル(CSS も JavaScript もデータも中に埋め込む) | 外部への読み込みを 0 にします。メールで送っても、USB で渡しても開けます |
| 外部のサービスを読み込まない | 社内のデータが外へ出ません。ネットが無くても開きます |
| 文字はすべてエスケープする | 案件名に < や & が入っても壊れません |
| 横に並ばなくなったら横スクロール(列は畳まない) | スマホでも「列がいくつあるか」が分かります |
次は 03_sw(仕事の型の升目) です。