# Jackyshen Gen Quotation

> 生成专业PDF报价单、培训提案和商业文档。当用户提及报价单、报价、提案、培训方案、商业文档、生成PDF，或提供培训服务、咨询费用、定价详情时触发。支持中英文内容。

- Skill: `mebusw/jackyshen-gen-quotation` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add mebusw/jackyshen-gen-quotation`
- Raw SKILL.md: https://api.skillmd.com/api/skills/mebusw/jackyshen-gen-quotation/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: mebusw (https://skillmd.com/u/mebusw)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/mebusw/jackyshen-gen-quotation

---


# 报价单 & 商业文档生成器

从自然语言、Markdown 或结构化数据生成品牌一致、风格专业的 PDF 报价单和培训提案。
始终使用 `scripts/render_quotation.py` 中的 Python 脚本，不要重写 Node.js 或 JavaScript 脚本。
Usage: `python scripts/render_quotation.py output/quotation_data.json templates/modern/quotation.html output/quotation.pdf `
中间渲染模版文件和最终输出都必须在当前工作路径下的  `./output`

## 核心流程

```
用户输入（自然语言 / Markdown / 结构化数据）
                ↓
    LLM 结构化提取
                ↓
  QuoteDocument Schema (Pydantic)
                ↓
     Jinja2 模板渲染
                ↓
        HTML 输出
                ↓
      Playwright PDF
                ↓
        PDF 输出
```

## 品牌主题：UPerform

**主色：** `#083A67`（深海蓝 Navy）
**辅色：** `#4F82BA`（钢蓝 Steel Blue）
**点缀色：** `#FFFFFF`（白色 White）
**背景色：** `#FFFFFF`（白色）

Logo 位置：**页面右上角**。

## 步骤一 — 识别文档类型

根据原始输入自动判断生成的类型，如果不确定，询问用户：**"请确认文档类型"**

| 类型 | "doc_title"值 | 关键字段 |
|------|------|----------|
| `quotation` | "报价单 / Quotation" | customer_company, pricing_items, total, payment_terms |
| `outline` | "培训大纲 / Outline" | outline, modules, objectives |
| `mixed` | "培训方案及报价 / Proposal" | 两者兼有 |

不明确时，默认为 `mixed`。

## 步骤二 — 收集信息

按顺序收集以下字段，如有缺失请询问用户。

### 任何类型都要有的必需信息

1. **我司信息**
   - 公司名称 company_name ("优普丰AI敏捷创新管理咨询")
   - 地址 company_address ("Room A2207, 333 Suhong Road, Minhang District, Shanghai")
   - 电话 company_tel ("+86-21-6380-9913")
   - 邮箱 company_email ("service@uperform.cn")
   - 口号 company_slogan ("Your AI & Agile Organization Performance Partner")
   - 品牌 logo_path（默认填 `logo.png`，脚本会自动在 skill 目录下查找）

2. **客户信息**
   - 客户名称 customer_name
   - 联系人 contact_person (可选)

3. **文档信息**
   - 文档标题 doc_title
   - doc_type: "quotation"（必须显式声明）
   - 日期 quotation_date (YYYY/M/D)


### `quotation`类型特有的必需信息

1. **文档信息**
   - 报价单号 quotation_no (格式: QL-YYYYMMDD-序号)
2. **报价项目** (至少1项)
   - 服务名称 service_name
   - 单价 unit_price (CNY)
   - 数量 quantity
   - 单位 unit (天/人/次/项)
   - 分类 category: training | travel | interview | consulting | material | other
3. **汇总信息**
   - 小计 subtotal
   - 税率 tax_rate (如: 6%)
   - 税费 tax_amount
   - 总计 total_amount
   - 币种 currency (默认 CNY)
   - 含税否 tax_included (可选)
4. **付款条款**
   - 付款方式 payment_method (可选)
   - 付款阶段 payment_schedule (可选)
5. **有效期**
   - 有效至 valid_until (默认为当前日期之后的第90天)
6. **签章信息**
   - 账户名称 account_name "上海优普丰企业管理有限公司"
   - 开户行 bank_name "第一银行南京路支行"
   - 银行账号 account_number "0000"
7. **备注**
   - Please keep the discounted price confidentially to any third party. 
   - 此优惠价请对第三方高度保密。
   - 常规培训时间: 9:00am-5:00pm, 1.5小时午餐休息。
   - Regular duration: 9:00am to 5:00pm with 1.5 hour lunch break on each days.
   - 该报价单覆盖了教材费等费用。
   - Quotation covers course materials etc.  


### `outline`类型的必需信息

1. **课程大纲** (CourseOutline)
   — 课程标题 title
   - modules[]
   - learning_objectives[] 
   - target_audience[]

### 可选字段 

- 备注 notes[]
- 品牌配置 branding{logo_path: 填 `logo.png` 即可，脚本会自动在 skill 目录下查找, primary_color, secondary_color, accent_color}

## 步骤三 — 按 QuoteDocument Schema 组织数据

输出必须匹配以下 Schema 的结构化 JSON：

```python
QuoteDocument:
  company: CompanyInfo         # 供方信息
  customer: CustomerInfo       # 需方信息
  quotation: QuotationInfo     # 文档基本信息
  doc_type: str               # "quotation" | "outline" | "mixed" — 控制模板条件渲染
  pricing_items: list[PricingItem]  # 报价明细（doc_type != "outline" 时显示）
  pricing_summary: PricingSummary  # subtotal, tax_rate, tax_amount, total_amount, currency, tax_included
  payment_terms: PaymentTerms  # 付款条款
  tax: TaxInfo                # 税费
  validity: ValidityInfo      # 有效期
  outline: CourseOutline | None  # 课程大纲（doc_type != "quotation" 时显示）
  notes: list[str] = []      # 备注
  signature: SignatureInfo   # 签章信息（doc_type != "outline" 时显示）
  branding: BrandingConfig   # 品牌配置
```

### PricingItem

```python
PricingItem:
  category: str       # training | travel | interview | consulting | material | other
  service_name: str  # 服务名称
  unit_price: float  # 单价
  quantity: float    # 数量
  unit: str          # 天/人/次/项
  days: float | None # 天数(可选)
  subtotal: float    # 小计
  remarks: str | None # 备注(可选)
```

### CourseOutline (可选)

```python
CourseOutline:
  title: str
  modules: list[CourseModule]
  learning_objectives: list[str] = []
  target_audience: list[str] = []

CourseModule:
  module_title: str
  duration: str | None  # 如 "2小时"
  topics: list[str]
  exercises: list[str] = []
```

### CompanyInfo

```python
CompanyInfo:
  name: str           # 公司名称
  address: str        # 地址
  tel: str            # 电话
  email: str | None   # 邮箱（可选）
  slogan: str | None  # 口号（可选）
```

### CustomerInfo

```python
CustomerInfo:
  name: str                 # 客户名称
  contact_person: str | None  # 联系人（可选）
```

### PricingSummary

```python
PricingSummary:
  subtotal: float     # 小计
  tax_rate: float     # 税率（默认 0）
  tax_amount: float   # 税费（默认 0）
  total_amount: float # 总计（必填，模板依赖此字段）
  currency: str       # 币种（默认 "CNY"）
  tax_included: bool  # 含税否（默认 false）
```

### PaymentTerms

```python
PaymentTerms:
  payment_method: str | None   # 付款方式（如"银行转账"）
  payment_schedule: str | None # 付款阶段（如"课程结束后结算"）
```

### ValidityInfo

```python
ValidityInfo:
  valid_until: str  # 有效期，格式 YYYY/M/D（默认当前日期+90天）
```

### SignatureInfo

```python
SignatureInfo:
  account_name: str  # 账户名称
  bank_name: str     # 开户行
  account_number: str # 银行账号
```

### BrandingConfig

```python
BrandingConfig:
  logo_path: str  # 填 "logo.png"，脚本自动在 skill 目录下查找
  primary_color: str   # 主色（默认 #083A67）
  secondary_color: str # 辅色（默认 #4F82BA）
  accent_color: str    # 点缀色（默认 #FFFFFF）
```

## 步骤四 — Jinja2 渲染为 HTML → PDF

使用 **Jinja2 模板**方式。禁止 LLM 直接生成 HTML。

**模板路径：** `templates/modern/quotation.html`
**渲染后的模版路径：** `output/quotation_output.html`

模板使用 UPerform 品牌主题：
- 页眉：深海蓝 (`#083A67`) + 白色背景
- 强调线：深海蓝 (`#083A67`)
- Logo：右上角
- 客户区域：白色背景 + 深海蓝边框
- 备注区域：白色背景 + 深海蓝边框
- 银行账户区域：白色背景 + 深海蓝边框
- 所有文字：黑色 (`#1a1a1a`) + 白色背景
- 字体：宋体 (SimSun) 用于中文
- 内容区域：左右各 20% 边距

**核心规则：** LLM 输出 JSON → JSON 传入 Jinja2 → Jinja2 生成 HTML → Playwright 渲染 PDF。LLM 绝不直接写 HTML。

## 步骤五 — 输出格式

**默认输出：PDF 文件**，通过 Playwright `page.pdf()` 生成。

仅预览 HTML 时，使用 `html` 输出。

## 快速开始模板

当用户说"生成报价单"或类似内容时，回复：

```markdown
好的，我来帮您生成专业报价单。

请提供以下信息（可以一次性全部提供，也可以逐项回答）：

1. **客户信息** — 客户名称、公司名
2. **服务项目** — 培训/咨询内容、人数、天数、单价
3. **文档标题** — 报价单标题
4. **报价日期** — YYYY/M/D
5. **付款信息** — 银行账户信息（可选）
```

## 分类参考

| category | 中文 | 示例 |
|----------|------|------|
| training | 培训 | 讲师授课、培训课程 |
| travel | 差旅 | 讲师差旅、交通住宿 |
| interview | 访谈 | 前期调研、访谈 |
| consulting | 咨询 | 咨询服务、顾问费 |
| material | 材料 | 教材、设计物料 |
| other | 其他 | 其他费用 |

## 文档类型条件渲染

模板根据 `doc_type` 字段决定显示哪些区块：

| 字段 | quotation | outline | mixed |
|------|-----------|---------|-------|
| 报价明细 pricing_items | ✅ | ❌ | ✅ |
| 银行账户 signature | ✅ | ❌ | ✅ |
| 课程大纲 outline | ❌ | ✅ | ✅ |
| 备注 notes | ✅ | ✅ | ✅ |

## 示例结构

**quotation 类型：**
```
公司: 上海优普丰企业管理有限公司
客户: 第一食品公司
日期: 2026/5/28
doc_type: "quotation"

报价项目:
| 项目 | 时长 | 人数 | 单价 | 小计 |
|------|------|------|------|------|
| 变革管理敏捷项目培训 | 2天 | 30人以内 | 45,000.00/天 | 90,000.00 |
| 课前访谈调研（线上） | 0.5天 | — | — | 10,000.00 |
| 讲师差旅 | 2天 | — | — | 10,000.00 |

共计: 110,000.00 CNY

备注:
- 培训时间: 9:00am-5:00pm, 1.5小时午餐
- 报价含讲师差旅、课程费、教材费等


```

**outline 类型：**
```
公司: 上海优普丰企业管理有限公司
客户: 第一食品公司
日期: 2026/5/28
doc_type: "outline"

课程目标:
1. 破冰融合——通过互动活动，促进ABC项目组跨职能成员相互认识、建立信任
2. 激活知识——基于ABC项目真实场景，演练敏捷项目管理工具
3. 建立共识——运用ADKAR变革管理模型，识别项目当前所处阶段

课程大纲:
模块一：第一天：敏捷项目管理实战演练（9:00-17:00）
- 开场与破冰
- 项目挑战共识
- 敏捷项目管理框架回顾
...

模块二：第二天：变革管理与项目推进共识（9:00-16:00）
...
```

## 重要原则

1. **LLM 输出 JSON，不输出 HTML** — 样式全部由模板控制
2. **Schema 是数据源** — 所有输入必须映射到 QuoteDocument
3. **doc_type 控制条件渲染** — 必须显式声明 `"quotation"` | `"outline"` | `"mixed"`，模板据此显示/隐藏对应区块
4. **品牌一致性** — Logo 右上角、深蓝页眉、蓝色点缀。`logo_path` 填 `logo.png` 即可，脚本会自动在 skill 目录下查找。
5. **中英双语** — 单文档支持中文和英文
6. **PDF 是最终输出** — 使用 Playwright 将 HTML 转为 PDF
7. **禁止直接注入 CSS** — 所有样式来自模板
8. **报价默认是不含税** - 不要主动增加税，或在备注里提到是否含税、税率、税额等任何税务相关信息。但如果用户明确要求含税报价，则：
   - 设置 `pricing_summary.tax_included = true`
   - 填入 `pricing_summary.tax_rate`（如 `6`，表示 6%）和 `pricing_summary.tax_amount`
   - 模板会自动在「报价项目」表格之后、总计行之前，渲染**两行**：税率 / Tax Rate、税费 / Tax Amount
   - 税前金额 = 各 `pricing_items` 小计之和（即 subtotal），税后金额 = 总计行（已显示）
   - **税务信息只能出现在金额汇总表格中，禁止写入 `REMARKS` / 备注段落**

## 错误处理

- 缺少必填字段 → 明确询问用户
- 分类不明确 → 请用户确认分类
- 模板缺失 → 回退到基础 HTML 结构
- 解析失败 → 展示原始文本并请用户修正
