Quote Request Copy Rule Catalog
這份表只保留精簡索引,方便掃描目前 POST /quote_requests/copy/{quote_request_id}.json parity 範圍。詳細背景看 rule_details.md,逐步 code 對照看 step_by_step_compare.md。
狀態定義:
已對齊:新舊規則一致,且已有測試或 baseline 證據。已對齊 / 需環境證據:主線一致,但仍需要特定區域或 production-like 環境驗證。待補獨立測試:已有實作,缺少單獨針對該規則的測試。待確認:仍需要更多 caller、payload 或 baseline 證據。
| 規則 | Parity 要求 | 現況 | 備註 |
|---|---|---|---|
| API session / request ownership 驗證 | 必做 | 已對齊 | session flow staging 已驗證;成功 response 含字串型 quote_request_id |
| hash 驗證複製 | 必做 | 已對齊 | body 帶 hash 可成功 copy;invalid hash 會 fallback session |
| blocked user 擋單 | 必做 | 已對齊 | legacy staging 實測是 error=5、message=Blocked User、不帶 quote_request_id |
reserve_type_a 過期不可複製 | 必做 | 已對齊 | 回 error=9、message=預約日期已過不可複製 |
| category 必須 active | 必做 | 已對齊 | quote_categories.is_active 必須是 2,否則 error=7 |
| 防重點擊 | 必做 | 待補獨立測試 | Redis key 為 copy_request__{id},TTL 20 秒 |
| 24 小時同 category 上限 | 必做 | 已對齊 | 同 user/category、非 archived、非 closed,24 小時內第 4 筆回 error=4 |
| 缺 category fee 設定 | 必做 | 已對齊 | 回 error=1、message=no site_fee info |
| booking user fee 歸零 | 必做 | 已對齊 | booking_shop_users 命中時 fee 全 0,match_type=BOOKING_ADMIN_USER;已有 baseline 14241 -> 14306 |
| 一般 user fee set / variable fee | 必做 | 已對齊 | 已修正 variable fee helper;baseline 20212 -> 20213 驗 fee、discount、site_fee |
建立新 quote_requests | 必做 | 已對齊 | 含 copied id、flags、tag、send_client、request_lang_id、expired_on |
建立 quote_form_submissions / 複製 fields | 必做 | 已對齊 | 新 submission + source fields 全量複製,field count 對齊 source |
| reload summary | 必做 | 已對齊 | copy 後重算 form_summary / language / job-center summary;baseline 有驗 |
recommend_source 紀錄 | 有帶才必做 | 已對齊 | 支援 top-level 與 QuoteRequest[recommend_source],寫 quote_request_recommend_logs |
| auto quote legacy gate | 必做 | 已對齊 | source 不能本來就是 copy,且 source created 必須晚於 getJPLastModified() |
| auto quote / matching side effects | 必做 | 已對齊 / 需環境證據 | baseline 驗 bid/activity shape;重跑同 source 仍可能受 provider 資料漂移影響 |
HK newQuoteRequest task | 必做 | 已對齊 / 需環境證據 | forced-HK integration test 已有;真 HK baseline 仍需 HK 區域環境 |
| abnormal / keyword / overseas phone 掃描 | 必做 | 已對齊 | 已有 forced case、abnormal baseline 14691 -> 17216、keyword baseline 10650 -> 10652 |
設定 expired_on | 必做 | 已對齊 | due_date override,否則 category request_expired_days,再 fallback 30 天 |
建立 CreateRequest activity | 必做 | 已對齊 | 成功路徑建立;不能假設一定是第一筆 activity |
更新 source last_copied_on | 必做 | 已對齊 | allow_copy 會讀這欄;copied request 自己維持 null |
寫入 copied_quote_request_id | 必做 | 已對齊 | copied request 指向 source request id |
重建 block_provider_ids | 必做 | 已對齊 / 需環境證據 | legacy 會加已報價 provider;新版只在 site_environment=production 追加,非 production 測試固定保留 source 值 |
| 強制重設 request flags | 必做 | 已對齊 | has_preserve=0、is_allow_contact_charge=0、is_expired=0 |
| 不沿用 source 特定欄位 | 必做 | 已對齊 | 一般 copy 不沿用 source match_type;specific_user_tag 清空 |
| 寫入 multi-request tag | 必做 | 已對齊 | ConstJobCenterLabel::MULTI_REQUEST 實際值是 回客,baseline 是 ["回客"] |
Parity Required
若目標是 legacy parity,以上表列規則都不能被視為 optional。
差別只在:
- 目前新專案是否已有穩定 code + test 證據
- 是否仍需要額外 baseline / DB / log 對表
- 現有行為是否已和 staging
20212 -> 20213完全一致- 不能把「歷史 baseline 形狀」和「今天重跑同一 source 必定同數字」混在一起
實作順序建議
- 先看同步主線:guard、建單、clone、fee、summary、expired_on。
- 再看 side effects:abnormal scan、auto quote、HK task、activity。
- 最後看 baseline:歷史資料形狀是否能解釋,以及今天重跑是否受資料漂移影響。
待確認 / 待補證據
以下不是可不做,而是目前仍需要額外證據或實作前釐清:
- hash copy 在舊流量中的實際使用情況
recommend_source的 caller 與 payload 形狀- HK / area 分支是否需要用區域 baseline 分開驗
- production 環境追加 quoted provider 到
block_provider_ids的實際 baseline - 更多非
20212 -> 20213的一般 copy baseline,確認 tag / summary / matching 在不同 category 下維持一致
編輯建議
若要頻繁補內容,優先改 rule_details.md。
這份 rule_catalog.md 只維持:
- 規則名稱
- parity 要求
- 現況一句話
- 備註一句話