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 都可能造成重跑結果不同。

閱讀順序

  1. rule_catalog.md:先看規則矩陣與目前狀態。
  2. step_by_step_compare.md:從舊 controller 對照新版 handler。
  3. rule_details.md:查單一規則的背景、測試與 baseline 註記。
  4. implementation_plan.md:看落地進度、測試集合與剩餘風險。

心智模型

成功 copy 大致是這條路:

  1. 驗 hash 或 session,解析 user。
  2. 擋 blocked user、invalid request、過期 reserve_type_a、inactive category、連點與 24 小時同 category 上限。
  3. 讀來源 quote_requestsquote_form_submission_fields
  4. 建一筆新的 quote_requests,寫 copied_quote_request_id,重設部分 flags,設定 multi-request tag。
  5. 建新的 quote_form_submissions,複製所有 source fields。
  6. 重新計算 variable fee、discount、summary、expired_on
  7. 跑 abnormal / keyword / overseas phone scan;命中時停配對。
  8. 沒命中 abnormal 時,依 legacy gate 跑 auto quote;HK 區域另送 newQuoteRequest task。
  9. CreateRequest activity,更新 source request 的 last_copied_on
  10. {"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.php
    • Lib/QuoteRequestCopy/SourceRequestLoader.php
    • Lib/QuoteRequestCopy/FormSubmissionCloner.php
    • Lib/QuoteRequestCopy/CopyRequestFeeUpdater.php
  • 已存在可重用基礎:
    • Lib/SearchAdd/QuoteRequestCreator.php
    • Lib/SearchAdd/FormSubmissionWriter.php
    • Lib/SearchAdd/RequestActivityWriter.php
    • Lib/Model/BlockedUser.php
    • Lib/Model/QuoteActivity.php
  • schema 已有 copy 相關欄位:
    • quote_requests.last_copied_on
    • quote_requests.copied_quote_request_id
  • 已有整合測試:
    • tests/QuoteRequestCopyIntegrationTest.php
    • tests/QuoteRequestCopyGuardIntegrationTest.php
    • tests/QuoteRequestCopyAbnormalIntegrationTest.php
    • tests/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 的細節

4 items under this folder.