plans-plus · KYC 訂閱欄位與租用邏輯分析

釐清 plans-plus.html 續費查詢頁「上次訂閱資訊」中的 KYC 欄位到底代表什麼、KYC 功能是否受「有沒有租設備」限制、以及是否每個租戶預設開啟;並記錄本次為此做的文案修正。

範圍:AML_BackendiCON.Abp.AMLPortal / iCON.Abp.AML)· AML_Frontend(KYC section)· justsolutionsWebV2(plans-plus 前端文案)

結論一句話:「上次訂閱資訊」的 KYC = 上次訂閱是否含「KYC 讀卡設備租用」加購項;租不租設備只影響前端的「機器掃描」入口,不影響上傳/手動錄入 KYC,且非每個租戶預設開啟

一、結論速覽

問題答案說明
「上次訂閱資訊」的 KYC 應該是「是否租用 KYC 設備」嗎? 基本是 該值 = TenantProperty.EnableKYC,而它由「下單方案是否含 Tag1Code = KYC 的方案行」決定;此方案行在 plans-plus 對應加購項「KYC 讀卡設備租用」。故它實質表示「上次訂閱有無租 KYC 讀卡設備」。
有沒有租 KYC 設備,會影響用戶在系統中使用 KYC 功能嗎? 只影響掃描入口 enableKYC 在前端只控制「ID Scan/機器掃描」按鈕的顯隱。「上傳」與「手動錄入」兩條路徑始終可用;後端 KYCService/KYCController 完全不校驗 EnableKYC。
「能否使用 KYC 功能」是每個租戶預設開啟的嗎? 不是 EnableKYC 對一般租戶預設 false,僅在下單方案含 KYC 加購時為 true(續費沿用上次值)。唯一預設 true 的是 Host 宿主租戶。但因前端僅擋掃描按鈕,所有租戶預設仍可用「上傳/錄入」做 KYC。

二、欄位資料鏈路(前端 → 後端)

plans-plus 續費頁「上次訂閱資訊」卡片的「已購增值 / Add-ons」列,經由這條鏈路取得 KYC 標記:

plans-plus.js previousAddonText()currentSubscription.addons.kyc → BFF 直通 → CurrentSubscriptionAddonsDto.Kyctp.EnableKYC
內容
前端顯示
plans-plus.js:570-581 / plans-plus.html:347
showTenantInfo()previousAddonText(s) 寫入 #ppTiAddons;當 addons.kyc === true 時,列表加入一個 KYC 標籤。
續費查詢 DTO
RenewableTenantByEmailDto.cs:46-54
CurrentSubscriptionAddonsDto.Kyc,欄位註解明寫「是否已購 KYC(TenantProperty.EnableKYC)」。
後端聚合
OrderService.cs:2460
Addons = new CurrentSubscriptionAddonsDto { Kyc = tp.EnableKYC }——直接取當前生效 TenantProperty.EnableKYC
底層欄位
TenantProperty.cs:69-71
public bool EnableKYC,註解「是否啟用了 KYC 功能」。命名雖是「功能開關」,但賦值來源只綁定「有沒有買 KYC 設備加購」(見下節)。

加購項對應:plans-plus 第 4 步的 KYC 加購項在 plans-plus.html:468 標題為「KYC ID Reader Rental / KYC 身份讀取設備租用」——一台實體讀卡機,按訂閱期租用。這正是產生 Tag1Code = KYC 方案行、進而把 EnableKYC 置 true 的東西。

三、EnableKYC 何時被賦值為 true

EnableKYC 全庫僅有 3 種寫入來源(其餘皆為 EF 遷移快照),沒有任何「按功能開關」的入口

場景代碼取值
新租戶下單 OrderService.cs:763 EnableKYC = checkHasEnableKYCInPlan(purchasePlanDetailList)
續費(新開訂單路徑) OrderService.cs:2633 EnableKYC = checkHasEnableKYCInPlan(purchasePlanDetailList)
續費(事件隊列生效路徑) OrderService.cs:872 EnableKYC = lastTenantProperty.EnableKYC沿用上一份
Host 宿主初始化 TenantPropertyDataSeeder.cs:63-79 EnableKYC = true僅當 currentTenant.Id == null,即 Host

判定函式只看方案的 Tag1:

// OrderService.cs:2694-2697
private bool checkHasEnableKYCInPlan(List<PlanDetail> purchasePlanDetailList)
{
    return purchasePlanDetailList
        .Where(a => a.Plan.Tag1Code == PlanTag1Enums.KYC.ToString()).Any();
}

推論:EnableKYC 語義上等同「該訂閱是否含 KYC 讀卡設備租用」,而不是一個獨立的「KYC 功能總開關」。所以把「上次訂閱資訊」裡的它讀作「是否租用 KYC 設備」是準確的。

四、租設備是否影響「使用 KYC 功能」

4.1 前端:只擋「機器掃描」按鈕

AML_Frontend 的 KYC section 讀取當前租戶的 enableKYC

// kyc-section.component.ts:147-148
this.amlTenant.getCurrentTenantProperty$().subscribe(res => {
  this.enableKYC = res?.enableKYC ?? false
})

而它只作用在「ID Scan(機器讀卡掃描)」這一個按鈕上(switchType === 1):

按鈕switchType受 enableKYC 控制?說明
ID Scan(機器掃描)1是(*ngIf="enableKYC")插實體讀卡機掃描證件;未租設備則隱藏。kyc-section.component.html:10
Upload2(上傳)2否 · 始終顯示上傳證件圖片走 OCR/校驗。kyc-section.component.html:18-24
Input(手動錄入)3否 · 始終顯示手動輸入證件資訊。kyc-section.component.html:26-32

4.2 後端:無任何門檻

後端 KYCService / KYCController 從不讀取 EnableKYC。全庫對該欄位的非遷移讀取僅有兩處:續費沿用(OrderService.cs:872)與續費查詢上報(OrderService.cs:2460)。因此它純粹是前端那顆掃描按鈕的顯隱旗標,不構成服務端鑑權。

結論:沒租設備的租戶照樣能用完整 KYC(上傳 / 手動錄入 → OCR、校驗、檢索),只是看不到「插讀卡機掃證件」這個入口。
「租 KYC 設備」= 解鎖前端硬體掃描按鈕,而非解鎖 KYC 功能本身。

五、是否每個租戶預設開啟

一句話:廣義 KYC(上傳/錄入)對所有租戶預設可用;EnableKYC(=是否租了 KYC 讀卡設備)預設關閉,它只額外解鎖前端「機器掃描證件」按鈕。

六、本次文案修正

原本 plans-plus「上次訂閱資訊」把 KYC 加購項顯示為含糊的「KYC/KYB」(易被誤解成一種核查功能)。已改為與加購項一致的「KYC 設備租用」表述,以準確反映「是否租用 KYC 設備」。後端無改動。

位置修改前修改後
plans-plus.js:575
previousAddonText,「已購增值」列)
parts.push('KYC/KYB') parts.push(tr('ppx_addon_kyc_label'))
plans-plus.html:579
(訂單摘要 #ppSumKyc 靜態回退文字)
KYC/KYB Verification KYC ID Reader Rental

改用的 i18n 鍵 ppx_addon_kyc_label 三語皆已是租用表述:繁中「KYC 身份讀取設備租用」/ EN「KYC ID Reader Rental」/ 日「KYC IDリーダー機器レンタル」,故翻譯本體無需改動。訂單摘要 ppx_sum_kyc 的翻譯值原本就已是租用表述,本次僅同步修正其過期的 HTML 靜態回退文字。

驗證:本地以 npm run start:local 啟動 justsolutionsWebV2 即可看到「上次訂閱資訊 → 已購增值」與訂單摘要處的 KYC 顯示為「KYC 設備租用」表述。

七、關鍵代碼位置索引

角色檔案 : 行
底層欄位定義AML_Backend/modules/iCON.Abp.AMLPortal/…/Domain/DbEntity/TenantProperty.cs:69-71
賦值:新租戶 / 續費 / 判定函式…/AMLPortal.Application/OrderService.cs:763、2633、872、2694-2697
續費查詢上報 KYC…/AMLPortal.Application/OrderService.cs:2460
續費查詢 DTO…/AMLPortal.Application.Contracts/OrderAppLayer/RenewableTenantByEmailDto.cs:46-54
Host 預設 true…/AMLPortal.Domain/Seeders/TenantPropertyDataSeeder.cs:63-79
前端讀 enableKYC / 掃描按鈕門檻AML_Frontend/…/kyc-section/kyc-section.component.ts:147-148、.html:10
AML DTO 映射…/iCON.Abp.AML.Application/AMLAppAutoMapperProfile.cs:78 · …/TenantConfigLayer/TenantPropertyDto.cs:118
plans-plus 顯示 / 加購項justsolutionsWebV2/public/js/plans-plus.js:570-581 · public/plans-plus.html:468、579

本文為程式碼閱讀分析結論,隨代碼演進可能變動;引用行號以撰寫時的倉庫狀態為準。