ArenaMate · Gym Ownership

場館上架與所有權 — 圖解

一間場館從「地圖上還不存在」到「館主確立、平台代收的錢撥得出去」, 中間有哪些身分、哪些審核、每個時期各自握有什麼權限。 這頁是行為規格的圖解版;文字正本在 docs/ArenaMate_場館上架與所有權_交接.md

更新:2026-07-27 · 對應 DB:nrhgnkmpapeiolldjejy · 規則層:GymOwnershipGatesarena_gym_can

① 整套設計只有一句話

所有權限分界都從這一句推出來。記住這句,其餘的規則都不用背。

這件事,會讓平台欠這個館錢嗎?

不會 — 現金當場付清

平台不經手這筆錢。場館資料審過就能做:開場次、排時段、收現金入場費。

⚠️ 不讓管理員收現金,場次根本開不成 —— 館主常常懶得聲明所有權,冷啟動就死在這裡。

會 — 平台代收後要撥款

教練開課、聯誼賽報名費、區域聯賽。平台收了錢之後要撥給場館,必須先知道撥給誰

⚠️ 人工核可 館主確立 —— 是 AND 不是 OR。

verify_tier — 這個館的資料被驗到什麼程度
none 剛送件 ai 場館審過 human 人工核可
ownership_status — 所有權在誰手上
unclaimed 館主從缺 claiming 登記審核中 owned 館主已確立 disputed 爭議中

⚠️ 兩條軸是獨立的,不要混在一起。 「審過了」不等於「知道館主是誰」;「館主是誰」也不等於「資料驗過了」。 平台代收要兩條軸同時到位。

② 時間軸 — 一間場館的一生

每一格都標了當下的資料庫狀態、誰是誰、以及那個時期實際能做什麼。

STAGE 0

還不存在

地圖上沒有這個點

球員搜尋不到、約不了球。這是我們要解決的起點。

STAGE 1

有人建館,送審

建館的人 → admin(不是 owner)

流程:先問一個是非題「你是這間場館的老闆嗎?」→ 填座標時自動偵測附近 500 公尺內已有的場館,列出來問「是不是這一間」→ 填樓層、正面照、球場照、身分證。

status=pending verify_tier=none ownership=unclaimed(代建)或 claiming(自稱館主)
開場次收現金 平台代收看得到資料

建館的人一律先是 admin,不再直接是 owner。 舊行為「誰建誰就是 owner」等於開了一條自助升級成金流控制者的路 —— owner 就是收款帳戶控制權。

STAGE 2

平台核准場館上線

operator(老闆本人)在審核台按核准

核准=「這個館的資料驗過了」。場館出現在地圖上,館主就算從缺,照樣可以營運

status=approved verify_tier=ai ownership 不變
開場次排時段 管成員收現金入場費 平台代收

⚠️ 核准與 verify_tier 必須綁在同一個交易。 2026-07-27 抓到過一次:核准只改 status、沒動 verify_tier → 新館核准後管理員照樣開不了場次。已修(arena_operator_set_gym_status)。

STAGE 3

館主出現,送出登記

可能是任何人 —— 由平台裁決他是不是

兩個入口:App 進館頁大廳的「館主登記」橫幅,或純網頁 chefsmate.app/gym/<代號>/claim

ownership=claiming arena_gym_claims 新增一筆 ai_verdict=系統預審結果

⚠️ 網頁版不可以綁 App —— 五十幾歲的館主不會為了登記去下載 App, 會卡死在第一步,而公立場館的窗口正好是這個年齡層。

STAGE 4

平台人工核可 → 館主確立

登記人 → owner;建館者保留 admin

兩條軸同時到位,平台代收解鎖。

ownership=owned verify_tier=human gym_members.role=owner 文件 30 天後清除
開場次收現金 看分帳明細平台代收(教練開課/報名費)

⚠️ 核可=把這個場館的收款控制權交給這個人。審核台的二次確認要把後果講出來, 不是只問「確定嗎」。同一間館其他還在排隊的登記件會一併結掉。

分支 A

退回 / 要更多資料

operator 一定要寫理由(對方看得到)

要更多資料:件留著、場館維持 claiming,可以補件再送。
退回:沒有其他排隊件時,場館退回 unclaimed

⚠️ 退回後不可以留在 claiming —— 大廳會永遠顯示「審核中」, 真正的館主看到就不會來登記了。

分支 B

所有權爭議

兩造文件都送到平台人工裁決

營運照常、金流凍結。

ownership=disputed
開場次排時段 收現金(暫停)平台代收(暫停)

⚠️ 不可以停掉整個館 —— 已經報名的球員沒做錯事。 裁決給另一方時,舊 owner 降成 admin 但不踢出場館(他可能是館方真的員工), 錢跟著換人。

終局

合併(同一個地點被建成兩間)

operator 專用,不可逆

場地、成員、教練、時段搬到留下來那間;已經發生的事實留在原地 (那場比賽確實是在原本那間館打的)。舊館標 merged_into + 下架,不刪

merged_into=留下來的館 id is_active=false 資料列仍在

⚠️ 不同址一律擋。最嚴重的後果是打卡圍欄只剩一組 → 另一個地點的人永遠打不了卡,而且不會報錯

③ 權限矩陣 — 兩條軸交叉出來的結果

這張表就是 GymOwnershipGates.can() 的全部內容,SQL 端 arena_gym_can() 是它的鏡像。 兩邊不一致=App 顯示可以按、server 拒絕(或更糟:App 擋了但 server 放行)。

驗證程度 \ 所有權 unclaimed
館主從缺
claiming
登記審核中
owned
館主已確立
disputed
爭議中
none
剛送件
只能看資料
場次、時段、收費全鎖
只能看資料 只能看資料 只能看資料
ai
場館審過
營運 ✓ 現金 ✓ 分帳明細 ✓
平台代收 ✗
營運 ✓ 現金 ✓ 分帳明細 ✓
平台代收 ✗
營運 ✓ 現金 ✓ 分帳明細 ✓
平台代收 ✗(還缺人工核可)
營運 ✓ 分帳明細 ✓
現金與代收全凍結
human
人工核可
營運 ✓ 現金 ✓ 分帳明細 ✓
平台代收 ✗(還缺館主)
營運 ✓ 現金 ✓ 分帳明細 ✓
平台代收 ✗(還缺館主)
全開
營運 ✓ 現金 ✓ 分帳明細 ✓ 平台代收 ✓
營運 ✓ 分帳明細 ✓
現金與代收全凍結
全開(含平台代收) 可營運、可收現金,代收未開 爭議中:營運照常、金流凍結 只能看

⭐ 注意整個 ai 那一列:館主從缺照樣可以開場次、收現金。 這一格就是冷啟動能不能活的關鍵 —— 台灣多數公立場館的常態就是館主從缺。

④ 魚骨圖 — 為什麼這個館收不到線上的錢?

最常被問的一句。六根骨頭把所有可能的原因一次攤開;由左往右愈接近使用者實際會遇到的那一步。

平台代收 沒有開 錢撥不出去 驗證程度不夠 場館還沒核准(none) 只到 ai:還沒人工核可 館主還沒確立 館主從缺,沒人來登記 登記還在審核中 所有權爭議中 → 凍結 文件不齊 身分證正反面沒傳 電費單/租約沒傳 門牌合照沒傳 館型走錯路 公立館被要求交電費單 (電費在市府/教育局名下) 流程被擋下 7 天內已送 3 次 已被退回,還沒重送 平台自己沒設好 公務信箱驗證碼寄不出去 網頁登入信寄不到

⭐ 下面兩根(館型走錯路平台自己沒設好)最容易被忽略, 因為它們看起來都像「館主不配合」,實際上是我們這邊的問題。 公立場館拿不到電費單,用同一套文件標準會把全台最大一批場館永遠鎖在館主從缺。

⑤ 三條上架路徑 — 你是誰,決定要交什麼

建館第一步的是非題「你是這間場館的老闆嗎?」就是在分這三條路。

球員代建

proxy · 回答「不是老闆」

  • 身分證正反面 — 建立者是誰要留紀錄,之後有爭議要追
  • 場館照片(含拍攝者與門牌) — 證明真的到過現場,不是憑空建館
  • 至少 1 個場地 + 1 個固定時段 — 防空殼館。沒有時段的館別人約不了,比搜尋不到更失望
落點:ownership = unclaimed(館主從缺)
他成為 admin,可以開場次、收現金。館主之後來登記時他保留管理員身分, 場館頁也永遠留著「由你建立」的標記。

私營場館

private · 回答「是老闆」→ 私營

  • 一期電費單 或 租約 — 常在公司、房東或前一手承租人名下
  • 身分證正反面 — 確認登記人是本人
  • 館主與場館門牌合照 — 證明人真的在那個地點
落點:ownership = claiming(待審)
⚠️ 電費單上的名字對不上要走人工,不可以自動退 —— 真實世界裡對不上才是常態。

公立 / 委外經營

public · 回答「是老闆」→ 公立

  • 單位公務信箱驗證碼 — 寄一次性碼到 @*.gov.tw / @*.edu.tw
  • 身分證正反面 — 確認登記人是本人
  • 委外經營契約(選填)— 委外廠商用,公司名要對得上登記人
落點:ownership = claiming(待審)
⭐ 用信箱取代文件審查,比人看文件可靠而且當下就完成。 ⚠️ 網域一定要比對結尾someone@gov.tw.attacker.com 裡面也有 gov.tw。

⑥ 身分一覽 — 誰是誰,各自能碰到什麼

「人」永遠是 user_profiles.id(身分大一統);per-gym 的角色記在 gym_members

球員

gym_members.role = member

看場館、報名場次、打卡入場。看不到任何審核文件。

管理員(含建館者)

role = admin

開場次、排時段、管成員、改場館資料、收現金入場費。 建館的人一律先是這個身分 —— 未經審核的所有權主張不可以直接拿到 owner。

館主

role = owner · ownership = owned

admin 的全部,再加上平台代收:教練開課、聯誼賽報名費會撥到他設定的帳戶。 只有 operator 人工核可才拿得到。

公立場館窗口

public · 用公務信箱證明

拿不到電費單(電費掛在市政府或教育局名下)。改用 @*.gov.tw / @*.edu.tw 收一次性驗證碼,全自動,不用人看文件。

私營館主

private · 電費單或租約

文件常在公司/房東/前手名下。名字對不上走人工判斷,不自動退件。

平台管理員(operator)

app_operators · 老闆本人

核准場館上線、裁決館主登記、處理爭議、合併場館。 唯一能改所有權欄位的身分 —— 其他人寫進去會被 server 直接還原。

⑦ 審核泳道 — 一件館主登記怎麼跑完

三條泳道:申請人做什麼、系統自動做什麼、operator 做什麼。

申請人
(App 或網頁)
1. 選館型私營 / 公立
2. 備齊文件照片上傳 · 公務信箱驗 6 碼
3. 送出大廳橫幅立刻變「審核中」
6. 收到結果退回會看到理由
系統
(server)
擋:頻率同館 7 天最多 3 次
擋:必填文件缺什麼講什麼
擋:公務信箱公立一定要驗過
4. 規則預審寫進 ai_verdict
operator
(審核台)
5. 看件預審結果 + 文件(signed URL)
核可升 owner · tier=human
要更多資料維持審核中
退回場館回到館主從缺

⚠️ 預審叫「系統預審」,不是 AI 審過文件

它只查得到機械性的關聯,沒有看過文件內容

  • 這個館是不是他建的(最強的正面訊號 —— 他到過現場、傳過球場照與身分證)
  • 他在這個館有沒有 active 身分
  • 公務信箱驗了沒
  • 有沒有別人也在搶(競爭件一定要人看)
  • 7 天內反覆送件

寫成「AI 審過了」會讓審件的人少看兩眼,而這正是最不能出錯的地方。 而且「沒查到疑點」也只代表機器沒看到問題,不代表可以自動核可 —— owner 就是收款帳戶控制權。

⑧ 其他一起做掉的機制

這些不在主流程上,但少了任何一個,主流程都會在真實世界裡壞掉。

附近 500 公尺偵測

填座標時自動列出附近已建好的場館,問「是不是這一間」。不硬擋,但這題一定要答。

⚠️ 重複建館的後果不是資料難看,是球員進錯館、打卡打到隔壁那間——而且不會報錯。

地圖同址集合

同一棟樓的好幾間館收成一個圖釘,點開靠樓層徽章 + 正面照挑。門牌優先、座標備援。

⚠️ 同一棟樓的 GPS 誤差常比 50 公尺大 → 純靠螢幕距離群集,放大就會拆成好幾個疊在一起的點。

樓層 + 正面照

同址多館時,列表上就只有這兩樣分得出來。正面照走公開 bucket(給球員認路)。

⚠️ 審核文件走私有 bucket,用途不同不可混放。

所有權欄位 server 守門

一般使用者改不動 verify_tier / ownership_status / status —— 寫進去會被還原成舊值。

⚠️ 補洞前 gyms 的 UPDATE policy 是 using(true):任何登入者都能把自己相中的館寫成 owned+human。

公務信箱一次性驗證碼

6 碼、15 分鐘、最多試 5 次、24 小時最多寄 5 封、兩封間隔 60 秒。只存 SHA-256,不存明碼。

⚠️ 沒有頻率限制的話,任何人都可以拿我們的寄信管道去騷擾公務信箱。

個資限期刪除

身分證這類文件在裁決後 30 天清除(doc_purge_at / id_doc_purge_at)。

⚠️ 讀取只給 operator 與上傳者本人。

純網頁登記(不綁 App)

chefsmate.app/gym/<代號>/claim。Email 收一封信就登入,不設密碼、不下載任何東西。

⚠️ 代號吃 slug 或 uuid —— 只認 slug 的話,還沒有 slug 的館這頁是死的。

合併:搬 / 留 / 重算三分法

:往後還會用到的(場地、成員、教練、時段)。:已發生的事實(比賽、分錄、評價)。重算:統計值。

⚠️ 統計值重算不是相加 —— 兩個半滿的館加起來不等於一個滿的館。

⑨ 已知缺口 — 誠實記錄

還沒有人實機走過一遍

程式全部在 main 上、DB 全部 apply 過、寄信設定也到位了,但兩封真的信(網頁登入 magic link、公務信箱 6 碼)都還沒有人實際收過。

測試債

文字正本:docs/ArenaMate_場館上架與所有權_交接.md · 規則層:Apps/arena_mate/lib/data/gym_ownership.dart · 測試地圖劇本 S75–S80:arena-testing.html
← 回 ChefsMate 主控台