# QBD / LianTai 表格工作流

## 适用场景

当当前邮件、附件、发件人、主题、表格、OCR 或抽取证据显示 QBD/LianTai 工作流时读取。

常见信号：

- QBD / LianTai 发件人或渠道。
- Excel/table 附件。
- `BOOKING UPDATE`、`NEW BOOKING`、`AMEND`、`AMD`、`AMD ALLOTMENT`、`CXL`、`CFM`。
- 黄色/高亮行、红字、删除线、hotel status column、泰文 `โรงแรม` 或酒店回应/状态单元格。

## 当前行规则

- 只有当前有效行可以触发事件。
- 当前邮件附件中业务列被 yellow/highlight 的行全部视为当前有效行，不要求 `action_date_raw` 匹配邮件标题日期。
- 业务列包括 group code、人数、行程、酒店、备注、酒店状态等列；只有序号列、标题、说明区或装饰单元格上色，不单独触发事件。
- 每个当前有效行必须独立处理，不得跨行合并。普通情况下每行、每目标生成一个主事件；Parent split 的 parent `Cancel Allotment` candidate、linked Trace 和其他契约明确的 linked/derived events 可以额外产生。
- 不得用汇总字段或数组型 `case_keys.group_code` 合并多行。
- 行的业务类型和 subtype 已知，但 highlight、sheet、status 或其他必需行证据不安全时，保留该业务事件并附非空 `manual_review`；只有类型或 subtype 无法确定时才输出 `Need Manual Review` Fallback。
- 某一行不安全，不得阻塞其他安全行。

## 行证据

保留：

- attachment/file name
- workbook/sheet
- row index / row label
- highlight / yellow / red text / strikethrough
- action/status cell raw text，包括 `action_date_raw`
- hotel date raw text、tour date raw text、sheet month/year、raw nights
- raw room type / room quantity
- raw price / rate marker
- hotel status text
- before/after evidence
- OCR/table confidence，如有

## 日期识别

酒店入住、离店和晚数必须按 `54-stay-date-parsing.md` 解析。

- 酒店列开头住期范围优先，例如 `14-15`、`15-17`、`31-02`。
- 行程日期列用于补全年/月和校验，不得直接覆盖酒店住期。
- `action_date_raw` 只作为动作证据，不是入住日期，也不是标黄行过滤条件。

## 新订行

当前行明确 `NEW BOOKING`、`NEW`、新增、จองใหม่，且目标和最小字段清楚时，可路由 `New Booking`。新订创建前通常没有 confirmation number；缺 confirmation number 不是复核原因。

## 修改行

Amendment 行需要可靠 current amendment 和 before/after evidence，除非实质是 parent-to-child allocation creation。

标准 OP 联系兜底文字不应当作业务 amendment，除非包含具体可执行请求。

明确的部分 Allotment / Control Block 维护或保留 parent 余量继续使用当前不受支持，不得路由为 Update 或 `Allotment Maintenance`。整封邮件只有该意图时走 S10；混合邮件按 `03-current-content-completeness.md` 保留为 `unhandled_current_intents`。

## 取消行

`CXL`、cancel、release、cancel block 可路由 `Cancel Booking` / `Cancel Allotment`，前提是动作来自当前有效行且目标清楚。

## Parent-To-Child Allocation

当当前证据明确显示 Parent Group 完整拆成 Child Groups，parent 不保留余量，并列出 child group code 及日期、晚数、房型、房量：

- 每个 child group 固定路由为 `New Booking`，`booking_object_type=Group Block`；不得归为 Allotment / Control Block creation。
- 一个 child group code 一个主事件；同一来源行列出多个 children 时仍按 child 分开。
- parent 放入 `parent_group_code` 或 `parent_allocation_context`。
- 不得把 parent group 写成 child event 的 `case_keys.group_code`。
- 不要求普通 amendment 的 before/after。
- Allotment / Control Block 就是 Parent Group；其 Allotment code、Parent Group code、`case_keys.group_code` 与 `case_keys.block_code` 是同一 code。
- parent group code 清楚时，必须额外生成一个独立 linked parent cancel candidate：`event_type=Cancel Allotment`、`cancel_scope=entire_allotment_control_block`、`relationship_type=linked_parent_release_after_child_split`、`requires_downstream_hard_validation=true`。
- parent candidate 的 `related_source_event_indices[]` 必须指向该 split cluster 的全部 child New Booking events。
- parent release/cancel candidate 是候选事件，不代表 PMS 已取消成功。
- 同一 parent 的字面 `Cancel Allotment` 与 split 派生取消合并为一个事件；不同 parent 才分别输出。当前 producer 不得生成 linked Parent `Cancel Booking`。

如果某 child line 只有 generic `SUITE` 且无法唯一映射必需 PMS 房型，保留 `room_type_raw=SUITE`、令 PMS 房型 code 为 `null`，保留该 child 的 `New Booking + Group Block` 判别字段，并附非空 `manual_review`；不得用 downstream hard validation 代替人工确认。该 child 的复核不阻塞其他安全行。

明确只转移部分房量或保留 parent 余量继续使用时，不属于 Parent split；不得生成 parent Cancel candidate。完整 split 已确定但 parent key 或关系字段不安全时，保留 `Cancel Allotment` 同卡复核；无法判断是完整 split 还是部分维护时，类型/subtype 未确定，输出 `Need Manual Review` Fallback。

## 行内 Trace 补充信息

extra bed / 加床 / `เตียงเสริม` / `U-เตียงเสริม`：

- 不计入 room quantity。
- 不决定 FIT/Group。
- 不映射 PMS room type。
- 不决定 Rate Code。
- 与主事件同现时，生成 linked `Trace`。

当前有效行或同邮件中与该行目标明确关联的 Meeting、meal、arrival notice、room preference/setup、已确定的 payment information 或其他具体预订补充信息，也生成 linked `Trace`。信息即使只是告知也保留；同一目标的多条补充信息合并为一个 Trace，多个 group code 分别生成 Trace。主事件已完整承接的核心字段不得重复写入 Trace。

## 价格 Marker

`U-<number>` 是 price/rate marker，不是 confirmation、reservation 或 booking reference。可用于 Rate Code / settlement price 判断。

## 名单边界

Rooming List / Name List 文件不得与 QBD/LianTai booking update 表混淆。看文件内容，而不是只看 Excel 载体。
