Quote Request Copy
這組文件對應 legacy API POST /quote_requests/copy/{quote_request_id}.json,用來讓開發者快速理解「複製需求」不是單純 clone row,而是拿舊 request 當來源,重新跑一輪建單、fee、summary、異常掃描與配對後處理。
狀態:POST /quote_requests/copy/{quote_request_id}.json 已搬到新專案,由 Endpoint/V1/QuoteRequests.php::copy() 與 Lib/QuoteRequestCopy/ 主流程維護。後續看到 access log 流量時,不要重新列為待搬 API;應依本目錄文件做 parity / regression 判斷。
注意:主要公開 caller 使用 path id 形狀,例如 POST /quote_requests/copy/20212.json。文件中提到 copy.json 時,是指這個 copy action / 流程,不代表 source request id 不在 path 裡。
快速結論
- 舊專案入口:
get-lancer-php56/app/Plugin/Quotes/Controller/QuoteRequestsController.php::copy() - 新專案入口:
Endpoint/V1/QuoteRequests.php::copy() - 新專案主流程:
Lib/QuoteRequestCopy/CopyRequestHandler.php - 目前主流程 parity 已收斂:session/hash、guard、建新 request、clone form、fee/summary/expired_on、abnormal scan、auto quote gate、HK task、activity、
last_copied_on都已有 code 與測試或 baseline 證據。 - 仍需小心的不是「copy 是否能跑」,而是 baseline 是否可在今天的 live/reference DB 原樣重現;provider 資料、daily limit、worker timing 都可能造成重跑結果不同。
閱讀順序
- rule_catalog.md:先看規則矩陣與目前狀態。
- step_by_step_compare.md:從舊 controller 對照新版 handler。
- rule_details.md:查單一規則的背景、測試與 baseline 註記。
- implementation_plan.md:看落地進度、測試集合與剩餘風險。
心智模型
成功 copy 大致是這條路:
- 驗 hash 或 session,解析 user。
- 擋 blocked user、invalid request、過期
reserve_type_a、inactive category、連點與 24 小時同 category 上限。 - 讀來源
quote_requests與quote_form_submission_fields。 - 建一筆新的
quote_requests,寫copied_quote_request_id,重設部分 flags,設定 multi-request tag。 - 建新的
quote_form_submissions,複製所有 source fields。 - 重新計算 variable fee、discount、summary、
expired_on。 - 跑 abnormal / keyword / overseas phone scan;命中時停配對。
- 沒命中 abnormal 時,依 legacy gate 跑 auto quote;HK 區域另送
newQuoteRequesttask。 - 寫
CreateRequestactivity,更新 source request 的last_copied_on。 - 回
{"error":0,"message":"success","quote_request_id":"<new_id>"}。
現況摘要
舊專案
- 舊 method 性質:
- 不是單純 clone row
- 比較接近「拿既有 request 當來源,再跑一次 request 建立流程」
新專案
- 已有
/quote_requests/copy/{quote_request_id}.json對應 endpoint:Endpoint/V1/QuoteRequests.php::copy()
- 已有 copy 專用流程:
Lib/QuoteRequestCopy/CopyRequestHandler.phpLib/QuoteRequestCopy/SourceRequestLoader.phpLib/QuoteRequestCopy/FormSubmissionCloner.phpLib/QuoteRequestCopy/CopyRequestFeeUpdater.php
- 已存在可重用基礎:
Lib/SearchAdd/QuoteRequestCreator.phpLib/SearchAdd/FormSubmissionWriter.phpLib/SearchAdd/RequestActivityWriter.phpLib/Model/BlockedUser.phpLib/Model/QuoteActivity.php
- schema 已有 copy 相關欄位:
quote_requests.last_copied_onquote_requests.copied_quote_request_id
- 已有整合測試:
tests/QuoteRequestCopyIntegrationTest.phptests/QuoteRequestCopyGuardIntegrationTest.phptests/QuoteRequestCopyAbnormalIntegrationTest.phptests/QuoteRequestCopyBaselineIntegrationTest.php
現況判讀
- 目前不是「尚未開始實作」,而是已有可跑且有測試覆蓋的 copy 主流程。
- 文件判讀時要分清楚三件事:
- legacy source code parity:新版是否照舊 controller 的規則做。
- staging reference baseline:例如
20212 -> 20213這種歷史成功案例的資料形狀。 - today runtime reproducibility:今天用同一 source 重跑時,是否會因 provider 資料漂移、daily limit、worker timing 而不可能完全同數字。
文件使用原則
- 這裡先把規則拆成「入口 -> 主要表 -> 新專案現況 -> parity 要求 -> 測試」
- 若某規則目前證據不完整,會標成
待確認,不會直接降級成可不做 - 實作或測試有變更時,先更新
rule_catalog.md的狀態,再回補rule_details.md的細節