export const HELP_SECTIONS = [
  { id: 'overview', title: '同步中心总览' },
  { id: 'annual-leave', title: '年假余额总览' },
  { id: 'employees', title: '员工管理与司龄' },
  { id: 'sap-purchases', title: 'SAP 采购同步' },
  { id: 'faq', title: '常见问题' },
];

export const HEADING_ID_MAP: Record<string, string> = {
  '同步中心总览': 'overview',
  '年假余额总览': 'annual-leave',
  '员工管理与司龄': 'employees',
  'SAP 采购同步': 'sap-purchases',
  '常见问题': 'faq',
};

export const HELP_MARKDOWN = `
# 钉钉同步中心 · 使用说明

本系统负责钉钉、宜搭、SAP 三方数据同步，提供年假余额管理、员工信息管理、SAP 采购审批同步等能力。

---

## 同步中心总览

同步中心聚合了多个定时/手动同步任务：

| 任务 | 作用 | 触发方式 |
|------|------|---------|
| 出差同步 | 宜搭出差申请 → 钉钉考勤 | 每小时 :15 / :45 |
| 出差变更同步 | 处理出差行程变更/取消 | 每小时 :15 / :45 |
| 外勤同步 | 宜搭外勤申请 → 钉钉考勤 | 每小时 :15 / :45 |
| 加班同步 | 宜搭加班确认 → 钉钉（转调休） | 每小时 :15 / :45 |
| 假期延期 | 处理假期有效期延长 | 每小时 :45 |
| 年假释放 | 按计划释放年假 | 每天凌晨 |
| 员工信息同步 | 钉钉 HR → 本地 + 宜搭 | 每天 01:11 |
| SAP 采购同步 | 宜搭审批通过的采购申请 → SAP 创建 PR | 每半小时 |
| EntraID 用户同步 | Azure AD → 本地用户表 | 每小时 |

**执行历史**：主页下方展示最近的执行记录，支持按任务、日期筛选。

**手动触发**：主页上方每个任务卡片可以单独手动执行。

---

## 年假余额总览

### 数据来源

| 数据 | 来源 |
|------|------|
| 配额（总额/已用/剩余） | 钉钉 API \`searchLeaveQuota\`，100% 与钉钉一致 |
| 使用记录（请假明细） | 钉钉新版 API \`getLeaveRecords\` |
| 释放/撤销记录 | 钉钉配额变更记录（\`cal_type\`） |
| 有效期范围 | 钉钉配额返回的 start/end |
| 司龄 | **本系统维护**（见员工管理） |

### 页面字段

**格子**（年假类型 × 员工）：
- 大数字：**剩余天数**
- 小字：**释** X / **用** X / **过** X
  - 释（蓝色）：释放总天数
  - 用（紫色）：使用总天数
  - 过（橙色）：过期天数（历史年假 remainingDays=0 时显示）
  - 0 值显示灰色

### 点击详情

点击任何格子（包括 0 天）打开详情面板：
- 四格摘要：释放 / 使用 / 过期 / 剩余
- 进度条：按使用/过期/剩余三色显示
- 释放记录时间线：操作日期 + ±天数 + 有效期范围 + 备注（含反释放/撤销）
- 使用记录时间线：请假时间段 + 天数 + 状态

### 过期判断

根据**假期类型的年份**判断（如 "2024年年假" 在 2026 年自然过期），不依赖钉钉的 endDate（钉钉 endDate 会被误操作改动）。

### 钉钉无记录的情况

**部分员工某些年假在钉钉上没有任何配额变更记录**，通常原因：
- 该员工还没入职（应有但未释放）
- 管理员手动设置过余额（钉钉不对外暴露这类操作）
- 历史数据被钉钉清理

系统只展示钉钉返回的记录，**不再用本地计划做 fallback**，确保与钉钉完全一致。

### 刷新配额

点击「刷新」按钮会：
1. 同步员工和假期类型
2. 逐假期类型拉取配额（\`searchLeaveQuota\`）
3. 批量拉取使用/释放记录（每批 50 人，含完整历史）
4. 存入本地快照（后续查看详情从快照读取，秒级响应）

全量刷新约需 1 分钟。

---

## 员工管理与司龄

### 司龄计算规则

**我们完全自己维护司龄**，不从钉钉取（钉钉的司龄不支持离职再入职累加）。

#### 单段在职（常规情况）

\`\`\`
司龄天数 = 今天 - 入职日期
\`\`\`

#### 多段在职（离职再入职）

在「在职历史」里可配置多段，每段可选择是否计入司龄：

\`\`\`
累计司龄 = 所有勾选 "计入司龄" 段的天数总和（leaveDate − joinDate）
\`\`\`

离职到再入职之间的 gap 自动排除（不属于任何在职段）。

#### 停薪留职口径（2026-05-08 HR 确认）

- **停薪留职计入司龄**——员工身份未中断，停薪期间继续累计司龄。
- **停薪留职不释放年假**——年假同步会按停薪区间切割窗口，停薪当年的对应天数不释放。
- 钉钉自带的司龄字段会扣停薪，但本系统口径与之不同，请以本系统的「司龄」为准。

### 年假天数规则

基于累计司龄（不是当前段司龄）：

| 累计司龄 | 年假天数 |
|---------|---------|
| < 1 年 | 按工龄假 |
| 1~4 年 | 15 天 |
| 5~9 年 | 司龄 + 11（即 16~20 天） |
| ≥ 10 年 | 20 天 |

工龄假（首次参加工作至今）兜底：

| 累计工龄 | 工龄假 |
|---------|-------|
| < 1 年 | 0 天 |
| 1~9 年 | 5 天 |
| 10~19 年 | 10 天 |
| ≥ 20 年 | 15 天 |

### 在职历史编辑

员工表格「司龄」列，点击打开「在职历史」对话框：

1. **添加一段**：新增在职周期（如离职再入职）
2. **编辑段**：修改入职/离职日期、是否计入司龄、备注
3. **删除段**：移除错误记录

**字段说明**：
- **入职日期**：这一段的入职日
- **离职日期**：留空表示「当前在职」
- **计入司龄**：勾选则累加到总司龄；取消勾选可用于「短期合同不计」等场景
- **备注**：说明这段的原因（如 "首次在职"、"二次入职"）

### 司龄缓存机制

- 编辑在职段后，系统**自动重算该员工的司龄**并写回 \`tenure_days\`
- 停薪留职 CRUD 不影响司龄（不触发重算）
- 列表页直接读缓存字段，无额外请求
- 可通过运维接口批量重算（处理"今天在职中"等日度变化）

---

## SAP 采购同步

### 流程

\`\`\`
宜搭审批通过的采购申请
    ↓（每半小时自动拉取到本地缓存）
本地 SAP 采购缓存
    ↓（点击「同步到 SAP 生产/测试」）
SAP SOAP 接口
    ↓
生成 PR 号
\`\`\`

### 页面说明

**列表**：展示本地缓存的采购申请，含申请人、预算、部门、同步状态。

**筛选**：按状态（待同步/已同步/失败）和关键字（流水号/申请人/预算号）过滤。

**操作**：
- **从宜搭拉取**：增量拉取最新审批通过的采购申请到本地缓存
- **刷新列表**：从数据库重新读取（不调宜搭）
- **同步到 SAP**：勾选待同步记录后，批量推送到 SAP
- **重新同步**：已同步记录也可点击「重新同步」重试

### 展开详情

点击任何一行展开查看：
- **申请信息**：工号、申请人、部门、需求发起人、采购员等
- **采购与财务**：预算号、金额、物料组、总账科目、成本中心等
- **采购描述**：原始申请描述
- **SAP 同步信息**：PR 号、同步时间、状态
- **SAP 请求数据**：发送给 SAP 的 IM_HEADER 和 T_PUR_ITEM（JSON）
- **SAP 返回消息**：SAP 返回的消息列表（[S]/[W]/[E] 分类）
- **SAP 原始响应**：完整的 SOAP 响应 JSON（调试用）

### 时间范围

增量拉取用**中国时间**（钉钉/宜搭 API 要求），不受服务器时区影响。

---

## 常见问题

### 为什么我的年假余额和钉钉导出的 xls 不一致？

- **xls 显示余额**（总额 - 已用），**我们显示当前状态**（与钉钉 API 一致）
- 可能时间差：xls 导出是某个时刻快照，我们可能更新更及时
- 如果差 1~2 天：刷新快照后再对比

### 为什么有人应有年假但显示 0？

两种可能：
1. 钉钉端本来就没释放（如入职时未配置释放程序）— 在员工管理查"司龄"和计划
2. 年假已全部使用或过期 — 查看详情里的"使用记录"

可以查看[待办记录](./leave-todo)确认需要补发的员工。

### 离职再入职的员工司龄怎么处理？

在员工管理页面，点击员工的「司龄」列打开「在职历史」对话框，添加多段记录，勾选/取消"计入司龄"即可。

### SAP 同步失败怎么办？

展开失败行查看：
1. **SAP 返回消息** — 钉钉返回的具体错误（最常见）
2. **SAP 原始响应** — 完整 SOAP 返回（深度调试）
3. **SAP 请求数据** — 确认发送字段是否正确

常见错误：
- **Tracking number ... already exists** — 已经同步过，PR 号已回写
- **SOAP Fault** — 网络/认证问题，检查 SAP 隧道状态

### 数据同步延迟多久？

| 数据 | 延迟 |
|------|------|
| 钉钉 → 宜搭审批 | 审批通过后立即可用 |
| 宜搭 → 本地缓存 | 最多 30 分钟（SAP/年假）/ 1 小时（出差等）|
| 本地 → SAP | 需手动触发 |
| 年假释放 | 每天一次 |

---

## 联系与反馈

如发现数据异常或操作问题：
1. 记录员工 userId、假期类型、时间点
2. 截图同步任务执行记录
3. 联系系统管理员
`;
