# T567 — accept-binds-or-creates-contact

> Status: `done`  
> Milestone: `M4`  
> Kind: `feat`  
> Est. change: `~150 lines`

## Goal

完成後系統應：商機 accept 時綁定或建立 Contact（`stage=new_found`），同一作者多筆商機收斂在同一 Contact。

## Depends on

- T547、T565、T566

## Inputs

- Spec：`../spec.md` §4.6.1、§4.6.2、§9.4（CR-01、CR-02）

## Outputs

### 程式變更（預期路徑）

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/internal/logic/radar/acceptOpportunityLogic.go` | edit | 呼叫 CRM usecase，回應加 `contact_id` |
| `apps/backend/internal/module/crm/usecase/intake.go` | add | 依（platform＋handle＋owner）FindOrCreate、AttachOpportunity、寫 `stage` touch |
| `apps/backend/internal/module/radar/repository/opportunity_mongo.go` | edit | 回寫 `contact_id` |

### 行為變更

- 已 accept 過的商機重複 accept 為 idempotent（回同一 `contact_id`，不重複建 touch）。
- 新建 Contact 寫一筆 `stage` touch（`from_stage` 空 → `new_found`）。
- 第二筆商機 accept：掛上同一 Contact，時間軸出現兩筆。

## Out of scope

- 階段推進 API（T568／T570）
- 前端（T574）

## Acceptance

- [x] CR-01：accept → Contact 建立、`stage=new_found`
- [x] CR-02：同作者第二筆 → 同一 Contact、時間軸兩筆
- [x] 指令：

```bash
cd apps/backend && go test ./internal/logic/radar/... ./internal/module/crm/... -count=1
```
