quote_user_subscription_log_id

意義

quote_bids.quote_user_subscription_log_id 用來標記這筆 bid 是否已經有「聯絡 provider 時產生的扣款 / 使用紀錄」。

在目前 want_to_contact_provider 主線中,這個欄位會寫入 processWantToContactCharge() 產生的 transactions.id

quote_bids.quote_user_subscription_log_id = transactions.id

雖然欄位名稱有 subscription_log,但排查時不要只靠名稱推論成某張 subscription log table。實際要以當前程式與 transactions 為準。

什麼時候寫入

常見來源:

  • /quote_bids/want_to_contact_provider/{quote_bid_id}.json
  • QuoteBid::processWantToContactProvider()

成功聯絡 provider 時,流程會先判斷這筆 bid 是否已經有扣款 / 使用紀錄。

判斷邏輯:

1. quote_bids.quote_user_subscription_log_id > 0
   -> 視為已有紀錄
 
2. 若欄位沒有值,再查 transactions
   class = QuoteBid
   foreign_id = quote_bid_id
   transaction_type_id = QuotePaymentForSubmissionAutoQuote
   -> 找到也視為已有紀錄

如果還沒有紀錄,才會進入扣款 / 建 transaction,並把 transaction id 回寫到:

quote_bids.quote_user_subscription_log_id

與 is_want_to_contact_provider 的關係

這兩個欄位常一起看,但意義不同。

欄位意義
is_want_to_contact_providerconsumer 是否正式聯絡 provider
quote_user_subscription_log_id這次聯絡是否已綁定扣款 / 使用紀錄

成功 contact flow 常見結果:

is_want_to_contact_provider = 1
contact_provider_on = NOW()
is_paid_for_subscription = 1
quote_user_subscription_log_id = transactions.id

但實務上仍要查 transactions,因為舊資料、特殊流程或既有 transaction 可能讓欄位與交易紀錄不是一眼就能對上。

與 transactions 的關係

auto quote contact 常見 transaction:

transactions.class = QuoteBid
transactions.foreign_id = quote_bids.id
transactions.transaction_type_id = 40

其中:

40 = QuotePaymentForSubmissionAutoQuote

常見情境:

情境transaction 狀態
月結 / auto quote debt可能先建 unpaid transaction
錢包餘額足夠可能直接 paid,real_pay_date 有值
信用卡 / auto refill可能先建 transaction,再執行後續 charge
已聯絡過不應重複建立新的 contact charge

常用 SQL

查 bid 是否已有扣款 / 使用紀錄

SELECT
  id,
  quote_request_id,
  provider_user_id,
  is_want_to_contact_provider,
  contact_provider_on,
  is_paid_for_subscription,
  total_site_fee,
  quote_user_subscription_log_id,
  reason
FROM quote_bids
WHERE id = <quote_bid_id>;

用欄位回查 transaction

SELECT
  id,
  created,
  user_id,
  foreign_id,
  class,
  transaction_type_id,
  amount,
  real_pay_amount,
  real_pay_date,
  wallet_balance,
  description
FROM transactions
WHERE id = <quote_user_subscription_log_id>;

用 quote bid 回查所有相關 transactions

SELECT
  id,
  created,
  user_id,
  foreign_id,
  class,
  transaction_type_id,
  amount,
  real_pay_amount,
  real_pay_date,
  wallet_balance,
  description
FROM transactions
WHERE class = 'QuoteBid'
  AND foreign_id = <quote_bid_id>
ORDER BY id DESC;

判斷是否已有 auto quote payment

SELECT
  id,
  created,
  transaction_type_id,
  amount,
  real_pay_date
FROM transactions
WHERE class = 'QuoteBid'
  AND foreign_id = <quote_bid_id>
  AND transaction_type_id = 40
ORDER BY id DESC;

排查重點

  • quote_user_subscription_log_id > 0 通常代表已經有 contact charge / 使用紀錄,不應重複收費。
  • 欄位沒值不代表一定沒 transaction,還要查 transactions
  • is_want_to_contact_provider = 1 代表聯絡成立;quote_user_subscription_log_id 是扣款 / 使用紀錄的線索。
  • 付款失敗時,先查 monolog processWantToContactProvider,再回查 transactions
  • 不要只看 API response 判斷金流結果。