状態遷移図¶
主要エンティティのステータス遷移を Mermaid の stateDiagram-v2 で示します。各 enum
の値は実スキーマ (packages/shared/src/schemas/** と supabase/migrations/** の CHECK
制約) で裏取りしています。
(a) 案件 (jobs.status)¶
jobs.status の取りうる値は migration 0004 の CHECK 制約と JOB_STATUSES
(packages/shared/src/schemas/job.ts) に一致します。
実効ステータスは assignment から派生する
処理業者の受託承認 (CollectorInboundPage) は job_assignments.status を
accepted_by_discharger に変えるだけで、jobs.status は更新しません
(jobs の RLS は「発注元 discharger のみ書込可」のため collector に更新経路が
ない)。そのため Dashboard 等は resolveJobEffectiveStatus
(apps/web/src/lib/job-lifecycle.ts) で assignment 群から実効ステータスを
派生します: completed の assignment があれば completed、
accepted_by_discharger があれば最低でも matched、それ以外は jobs.status を尊重。
stateDiagram-v2
[*] --> draft: 案件作成
draft --> open_for_quotes: 見積募集開始
draft --> cancelled: 取消
open_for_quotes --> matched: 採用見積決定 (受託承認)
open_for_quotes --> cancelled: 取消
matched --> in_progress: 回収・処分 開始
matched --> cancelled: 取消
in_progress --> completed: 完了
in_progress --> cancelled: 取消
completed --> [*]
cancelled --> [*]
note right of matched
実効上は job_assignments の
accepted_by_discharger で
matched 相当に派生する
end note
関連 ADR: 0003 RLS マルチテナント分離。
(b) 案件アサインメント (job_assignments.status)¶
JOB_ASSIGNMENT_STATUSES (packages/shared/src/schemas/job-assignment.ts) と
migration 0004 + 0006 (completed 追加) の CHECK 制約に一致する 7 値です。遷移は
アプリケーション層で制御します。declined_* / expired / cancelled は占有を解く
ため非 active 扱い (再依頼可能) になります (isActiveAssignment)。
stateDiagram-v2
[*] --> proposed: マッチングが候補生成
proposed --> accepted_by_discharger: 排出事業者が採用
proposed --> declined_by_discharger: 排出事業者が辞退
proposed --> declined_by_collector: 処理業者が辞退
proposed --> expired: quote_valid_until 経過
proposed --> cancelled: 取消
accepted_by_discharger --> completed: 配車・処分 完了
accepted_by_discharger --> cancelled: 取消
declined_by_discharger --> [*]
declined_by_collector --> [*]
expired --> [*]
cancelled --> [*]
completed --> [*]
note right of accepted_by_discharger
= 契約成立。実効的に
案件を占有する (active)
end note
関連 ADR: 0005 ロールモデル。
(c) 配車ストップ (dispatch_stops.status)¶
DISPATCH_STOP_STATUSES (packages/shared/src/schemas/dispatch.ts) と migration 0025
の CHECK 制約は pending / completed の 2 値です。driver はワンタップで完了 /
取消できます (status と completed_at のみ。列レベル制限はトリガで担保)。
stateDiagram-v2
[*] --> pending: 生成 / プールから追加
pending --> completed: 完了 (useCompleteStop)
completed --> pending: 完了取消 (useUncompleteStop)
pending --> [*]: 配車から外す (削除)
completed --> [*]: 配車から外す (削除)
note right of completed
completed_at に時刻を記録。
driver は status/completed_at/note のみ更新可
end note
関連 ADR: 0008 配車コースモデル。
(d) 招待コード (signup_invite_codes)¶
メール紐付け招待のライフサイクルです (migration 0048 / 0049 / 0050)。試行は
register_signup_invite_attempt がアトミックに行い、used_at is null かつ
attempts < 5 のときだけ attempts を +1 して admit します
(SIGNUP_MAX_ATTEMPTS = 5)。正コードでも 1 回消費しますが、成功時は直後に used_at
で消費するため実害はありません。
stateDiagram-v2
[*] --> issued: 運営が発行 (未使用 / attempts=0 / code_hash 保存)
issued --> issued: コード照合試行 (attempts+1, 上限まで)
issued --> consumed: 正コード + 登録成功 (used_at セット)
issued --> locked: attempts が上限(5)到達
issued --> expired: expires_at 経過
issued --> replaced: 同一メールに再発行 (旧未使用行を delete)
consumed --> [*]
locked --> [*]
expired --> [*]
replaced --> [*]
note right of issued
RLS は service_role のみ。
ブラウザからは読めない
end note
関連 ADR: 0011 公開オンボーディング (招待コード)。
(e) サブスクリプション (subscriptions.status) — スキーマ定義¶
migration 0013 の CHECK 制約が定める status のドメインです
(plan は free / starter / growth / enterprise)。
遷移は Stripe 駆動 (現状未実装)
subscriptions テーブルと読み取り API (GET /billing/subscription) は存在しますが、
Stripe Checkout / Webhook (POST /billing/webhook) は TODO で、状態遷移はまだ
配線されていません (apps/api/src/routes/billing.ts)。下図は CHECK 制約が許す値域と、
Stripe で実装する際に想定する遷移です。
stateDiagram-v2
[*] --> inactive: 既定 (未契約)
inactive --> trialing: トライアル開始
inactive --> active: 課金開始
trialing --> active: 本契約へ移行
trialing --> cancelled: 解約
active --> past_due: 支払い遅延
active --> cancelled: 解約
past_due --> active: 支払い回復
past_due --> cancelled: 解約 / 失効
cancelled --> [*]
関連 ADR: 0002 バックエンドに Supabase を採用。