# Quote-to-Order E2E Scenario Test Plan

skip: true

**Source Document:** 针对性场景测试.pdf（业务方提供）
**Reference Issues:** #511, #563, #564, #565, #572, TO-001~TO-016
**Test Environment:** NexusCRM (Backend mode) — staging / UAT
**Credentials:** admin@test.com / L9jPkSaG5pdDRX7WPL3V!
**Date:** 2026-04-16

---

## Pre-conditions

| ID | Check | Expected | How to verify |
|----|-------|----------|---------------|
| PRE-01 | Account 存在 | Account: PROTO CORPORATION \| Oracle - Replace - FY27 已创建 | SOQL: SELECT Id FROM Account WHERE Name LIKE '%PROTO%' |
| PRE-02 | Opportunity 关联 Account | Opportunity 已创建，关联上述 Account | SOQL: SELECT Id FROM Opportunity WHERE AccountId = '{PRE-01}' |
| PRE-03 | Opportunity 有产品行 | OpportunityLineItems 非空 | SOQL: SELECT Id FROM OpportunityLineItem WHERE OpportunityId = '{PRE-02}' |
| PRE-04 | Account 有 Effective Contract | Account 下存在 CSA 或 MA，Status = Effective | SOQL: SELECT Id FROM Contract WHERE AccountId = '{PRE-01}' AND Status = 'Effective' |
| PRE-05 | Backend health | Backend API reachable | `curl http://localhost:8082/health` → `{"status":"ok"}` |
| PRE-06 | Connection mode | `nexus_connection_mode` === `"backend"` | Browser console: `localStorage.getItem('nexus_connection_mode')` |

---

## Scenario 1: 创建 Quote

> **PDF Step 1** | 对应 E2E API: TQ-001

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S1-01 | 从 Opportunity 点击 "Create Quote" | Quote 创建成功，导航至 Quote 详情页 | - Quote 成功创建，QuoteId 非空<br>- URL 变为 `/object/quote/{new_id}`<br>- Quote.OpportunityId == parent Opportunity.Id | TO-001 |
| S1-02 | 验证 Quote 自动带入 Account | Account 信息不可更改 | - Quote.AccountId 已填充<br>- Account 字段锁定，不可编辑 | TQ-001 |
| S1-03 | 验证 Quote 产品行完整性 | QuoteLineItems 包含完整字段 | 以下 8 个字段全部非空：<br>- Product（产品名称，如 TiDB Cloud）<br>- Unit List Price<br>- Discount<br>- Unit Net Price<br>- Quantity<br>- Net Fees<br>- Service Start Date<br>- Service End Date | R-564, R-572 |

---

## Scenario 2: Edit Product 搜索产品

> **PDF Step 3** | 对应 E2E API: R-572（部分）

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S2-01 | 在 Quote 详情页点击 "Edit Product" | 产品搜索框可用 | - 搜索输入框出现<br>- 可输入关键词（如 "TiDB"） | — |
| S2-02 | 输入 "TiDB" 进行搜索 | 下拉菜单显示产品名称列表 | 显示内容包括：<br>- TiDB Cloud<br>- TiDB Enterprise - Premium Subscription<br>- 其他相关产品 | R-572 |
| S2-03 | 选择产品并保存 | 产品成功添加到 QuoteLineItems | - 保存成功，无报错<br>- 回到 Quote 详情页<br>- Line Items 列表显示完整产品信息 | R-564 |

---

## Scenario 3: 验证 Quote 字段自动带入

> **PDF Step 5** | 对应 E2E API: R-565

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S3-01 | 检查 Quote 顶部字段 | 以下字段由系统根据产品信息自动填充 | - ACV：非空，自动计算<br>- TCV Amount：非空，自动计算<br>- Terms：非空，自动带入<br>- Average Discount：非空，自动计算<br>- Deepest Discount：非空，自动计算<br>- Net Fees：非空，自动计算<br>- Product Family：非空，自动带入<br>- Product Name：非空，自动带入 | R-565 |

---

## Scenario 4: 验证 Quote Status（Pending）

> **PDF Step 6** | 对应 E2E API: R-563

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S4-01 | 查看新创建未提交的 Quote 的 Status | Quote.Status == `Pending` | - Status 显示为 Pending<br>- 为系统自动判断写入，非人工编辑<br>- 字段不可编辑 | R-563 |

---

## Scenario 5: Quote 审批流程

> **PDF Step 7** | 对应 E2E API: APR-001, APR-002

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S5-01 | 提交 Quote 审批 | 提交后 Status 变为 Approved | - 点击 "Submit for Approval" 或类似按钮<br>- Status 自动变为 Approved<br>- 审批记录可见 | APR-001 |
| S5-02 | 验证 Approved Quote 才能创建 Order | 非 Approved Quote 无法创建 Order | - 尝试对 Pending Quote 创建 Order → 返回错误（400）<br>- 对 Approved Quote 创建 Order → 成功 | ORD-004 |

---

## Scenario 6: Order 创建前 Contract 校验

> **PDF Step 8** | 对应 E2E API: ORD-014, TO-002, TO-011

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S6-01 | 从 Approved Quote 创建 Order（有 Effective Contract） | Order 创建成功 | - 系统校验 Account 下有 Effective Contract（CSA/MA）<br>- 校验通过，Order 成功创建 | ORD-014 |
| S6-02 | 从 Approved Quote 创建 Order（无 Effective Contract） | Order 创建失败，返回错误 | - TiDB Cloud 产品需要 CSA<br>- TiDB Enterprise 产品需要 MA<br>- 无对应 Contract 时系统报错，不允许创建 | TO-002, TO-011 |

---

## Scenario 7: 验证 Order Name / Number 格式

> **PDF Step 9** | 对应 E2E API: TO-007, TO-008

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S7-01 | 查看新创建 Order 的 Name | Order.Name 格式为 `JP-OF-XXXXXXXX` | - Name 格式正确（JP-OF- + 8位数字）<br>- Name 字段锁定，不可编辑 | TO-007 |
| S7-02 | 查看新创建 Order 的 Number | Order.Number 自动生成，非空 | - Number 非空<br>- Number 字段锁定，不可编辑 | TO-008 |

---

## Scenario 8: 验证 Order 产品行与 Quote 一致

> **PDF Step 10** | 对应 E2E API: ORD-002

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S8-01 | 查看 Order 的 Line Items | Order.OrderItems 与 Quote.QuoteLineItems 一致 | - 产品行数量一致<br>- 每项产品信息（Product、Price、Discount、Quantity）与 Quote 完全一致 | ORD-002 |

---

## Scenario 9: 验证 Order 字段自动带入

> **PDF Step 11** | 对应 E2E API: ORD-001, ORD-005

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S9-01 | 检查 Order 顶部字段 | 以下字段从 Quote 自动带入 | - Account Name：Quote.AccountId 自动带入<br>- Product Family：Quote 产品信息自动带入<br>- Order Start Date：Quote.StartDate<br>- Order End Date：Quote.EndDate<br>- Net Fees：Quote.NetFees<br>- Average Discount：Quote.AverageDiscount<br>- Total Fees：自动计算 | ORD-001, ORD-005 |

---

## Scenario 10: 验证 Order Status

> **PDF Step 12** | 对应 E2E API: ORD-003

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S10-01 | 查看新创建 Order 的 Status | Order.Status == `Draft` | - Status 显示为 Draft<br>- 为系统自动判断写入，非人工编辑<br>- 字段不可编辑 | ORD-003 |

---

## Scenario 11: 上传 PDF 激活 Order

> **PDF Step 13** | 对应 E2E API: ORD-008, TO-010

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S11-01 | 验证 Order 中存在上传路径 | "Upload Archived OF" 路径/按钮存在 | - 上传入口可见 | — |
| S11-02 | 上传 PDF 文档 | 上传成功后 Order.Status 自动变为 Activated | - 上传 PDF 文件<br>- Status 自动从 Draft → Activated | ORD-008, TO-010 |

---

## Scenario 12: Order Files Tab

> **PDF Step 14** | 无对应 E2E API Case

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S12-01 | 在 Order 详情页查看 Files Tab | Files Tab 存在且可查看 | - Order 详情页存在 Files Tab<br>- 上传的 PDF 可在 Files 中查看 | — |

---

## Scenario 13: Order 与 Collection 信息挂钩（优化项）

> **PDF Step 15** | 无对应 E2E API Case

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S13-01 | 在 Order 详情页查看 Collection 信息 | Collection 信息可在 Order 中直接查看 | - Order 详情页可查看该 Order 关联的 Collection 信息<br>- Collection 信息展示完整<br>- 注：此为优化项，优先级可相对较低 | — |

---

## Scenario 14: 问题汇总与 Issue 提报

> **PDF Step 16**

| ID | Step | Expected | Checkpoints | Related Issue |
|----|------|----------|-------------|---------------|
| S14-01 | 汇总所有失败步骤 | 整理问题清单 | - 按 Step 编号列出所有失败项<br>- 评估每个问题的优先级（前 14 项影响业务→提高优先级，第 15 项→可较低） | — |
| S14-02 | 提报 GitHub Issue | 每个问题对应一个 Issue | - Issue 标题清晰描述问题<br>- 包含复现步骤、环境信息、预期 vs 实际结果 | — |

---

## 链路总览

```
Opportunity
    ↓ [S1] Create Quote
Quote（Pending）
    ↓ [S2] Edit Product + 保存
Quote（产品行完整，字段自动填充）
    ↓ [S5] Submit Approval
Quote（Approved）
    ↓ [S6] 创建 Order（校验 Account 下有 Effective Contract）
Order（Draft，Name=JP-OF-XXXXXXXX，产品行与 Quote 一致，字段自动带入）
    ↓ [S11] 上传 PDF
Order（Activated）
    ↓
[S12] Files Tab 查看 PDF / [S13] Collection 信息查看
```

---

## Issue 提报模板

```markdown
## 环境
- 环境：staging / UAT
- 日期：2026-04-16
- 测试人员：

## 问题清单

| # | Scenario | Step | 描述 | 优先级 | 影响程度 |
|---|----------|------|------|--------|---------|
| 1 | S1 | S1-03 | 描述 | P0/P1/P2 | 影响XXX |

## 详细描述

（每个问题的详细复现步骤）
```
