# Stay Date Parsing

## 用途

统一解析 QBD/LianTai 表格里的酒店入住、离店和晚数。适用于当前邮件附件、表格、OCR 或抽取证据中出现的酒店日期、行程日期和动作日期。

## 字段

保留以下日期证据：

- `hotel_date_raw`：酒店列开头的住期范围，例如 `14-15`、`15-17`、`31-02`。
- `tour_date_raw`：行程日期列原文，例如 `2026/05/11\n2026/05/16`。
- `action_date_raw`：备注或状态中的动作日期，例如 `11/05 AMD`、`12/05 NEW BOOKING`。
- `sheet_month_year`：workbook sheet 名中的月份年份，例如 `BOOKING 05-2026`。
- `arrival_date`
- `departure_date`
- `nights`
- `date_inference_basis`

## 识别优先级

1. 优先使用酒店列开头的酒店住期范围作为 `arrival_date` / `departure_date`。
2. 酒店列内有完整日期时，使用该完整日期范围。
3. 行程日期列用于补全年/月和校验，不得直接覆盖酒店住期。
4. sheet 名用于补全年/月；当行程日期可读时，优先用行程日期选择能落在行程范围内的酒店住期。
5. 备注中的动作日期只作为 `action_date_raw`，不是入住日期，也不是标黄行过滤条件。

## 年月补全

- `15-17` 在 `BOOKING 05-2026` 且行程日期落在 2026 年 5 月时，解析为 `2026-05-15` 到 `2026-05-17`。
- `31-02` 这类跨月范围必须按跨月处理；如果行程日期或 sheet 名无法唯一确定跨到哪个月，按本节“业务复核”处理。
- 当酒店日期范围缺年/月时，用行程日期补全；行程日期缺失时，用 sheet 名补全。
- 如果补全后酒店住期不在行程日期范围内，保留 raw evidence 并按本节“业务复核”处理。

## 晚数

- `15-17` 表示入住 15 日、离店 17 日，`nights=2`。
- `14-15` 表示入住 14 日、离店 15 日，`nights=1`。
- `nights = departure_date - arrival_date`。
- 表格里的 `5N6D`、`5N7D` 是行程晚数线索，不得覆盖酒店住期晚数。

## 业务复核

以下日期问题 reason code 使用 `stay_date_inference_unclear`：

- 酒店日期范围不可读。
- 酒店日期、行程日期和 sheet 名无法唯一补全年/月。
- 酒店住期与行程日期明显冲突且无法解释。
- 跨月、跨年或格式异常导致 arrival / departure 无法安全确定。

当所属业务 `event_type` 和 subtype 已知时，保留原业务事件、全部 raw date evidence 和已确认日期字段，并附非空、完整的 `manual_review`；无法确定的日期字段为 `null`，`manual_review.missing_fields[]` 使用对应字段的 RFC 6901 JSON Pointer。不得仅因日期不安全改成 Fallback。

只有当前行或材料不可读到连业务类型或 subtype 也无法确定时，才输出 `event_type=Need Manual Review` 的 Fallback 复核。
