コンテンツにスキップ

状態遷移図

主要エンティティのステータス遷移を 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.statusaccepted_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 はワンタップで完了 / 取消できます (statuscompleted_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 のドメインです (planfree / 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 を採用