案例:服務業入口帳號
目標:客戶付完款之後,能用自己的帳號到 /my 看歷史訂單與發票。三種登入身分的說明見 使用者及權限。本頁只寫「什麼時候開 Portal」。
兩條路線
| 路線 | 做法 | 取捨 |
|---|---|---|
| A. 先註冊再買 | 網站要求登入才能結帳 | 不用寫程式,首購摩擦較大 |
| B. 付款後再開通 | 允許訪客結帳,付款成功再開 Portal | 要一則自動化,購物較順 |
擇一即可,不要兩條同時開著除錯。
路線 A:先註冊再購買
- 網站 → 設定 → 客戶帳號(Customer Accounts) 設成 必填 或 免費註冊。
- 客戶先建立帳號(或用 Google/Microsoft 登入),再結帳。
- 之後可在
/my看訂單、發票、付款。
路線 B:付款成功後開通 Portal
先備:已安裝 portal、auth_signup、website_sale、payment、account 與金流外掛;客戶帳號設成 可選(Optional);寄信伺服器已測通,見 郵件設定。
開發者模式 → 設定 → 技術 → 自動化動作,擇一觸發:
方案 1:付款交易成功(網站刷卡)
- 模型:
Payment Transaction - 觸發:建立與更新時
- 條件:
state = 'done' - 動作:執行 Python
partners = set()
for tx in records:
partner = tx.partner_id or (tx.sale_order_ids[:1].partner_id)
if partner and partner.email:
partners.add(partner)
if not partners:
return
PortalWizard = env['portal.wizard'].sudo()
PortalWizardUser = env['portal.wizard.user'].sudo()
portal_group = env.ref('base.group_portal')
wiz = PortalWizard.create({'portal_id': portal_group.id})
for p in partners:
PortalWizardUser.create({
'wizard_id': wiz.id,
'partner_id': p.id,
'email': p.email,
'in_portal': True,
})
wiz.action_apply()
方案 2:發票已付款(含後台入帳)
- 模型:
account.move(日記帳分錄/發票) - 觸發:建立與更新時
- 條件:
move_type in ('out_invoice', 'out_receipt')且payment_state = 'paid' - 動作:執行 Python
partners = set(records.mapped('partner_id').filtered(lambda p: p.email))
if not partners:
return
PortalWizard = env['portal.wizard'].sudo()
PortalWizardUser = env['portal.wizard.user'].sudo()
portal_group = env.ref('base.group_portal')
wiz = PortalWizard.create({'portal_id': portal_group.id})
for p in partners:
PortalWizardUser.create({
'wizard_id': wiz.id,
'partner_id': p.id,
'email': p.email,
'in_portal': True,
})
wiz.action_apply()
portal.wizard 會:沒有使用者就建立 Portal 帳號(login 用 Email)並寄設定密碼信;已有使用者就確保他在 Portal 群組。
客戶在 /my 看得到什麼
依已安裝的 App,/my 會列出該聯絡人的訂單、報價、發票、付款與交貨。自訂資料要給客戶看時,必須加記錄規則,例如只允許 partner_id = 目前使用者的 partner。不要讓客戶變成內部使用者。
常見問題
- 沒收到啟用信:先測外寄伺服器;開發者模式 → 電子郵件 → 看佇列與失敗原因。
- 同一個 Email 對兩個聯絡人:使用者 login 必須唯一,第二筆會失敗。自動化裡先查
res.users是否已用該 Email。 - 只要一次性連結:付款信可附帶 token 的訂單/發票網址。若要長期查歷史,仍建議開 Portal。