# FRIDAY SaaS Cold Import Manifest(首版 — 仅 patient 试跑)
#
# 数据源:FRIDAY SaaS MySQL(customer 库)。cold-import 不支持 MySQL 直连,
#   走 CSV 文件模式:host 端**纯导原始表**(SELECT * FROM tb),不做任何 join。
#   电话在 1:N 的 customer_contacts 里 → 由 transforms.lookup 按 customer_id join、
#   挑默认号(is_default→本人→最早)填成 patient.phone 标量。宿主零特殊处理。
#
# ── 方案 B:合成"市场"集团 tenant;品牌降为 source_unit 命名空间 ──
#   FRIDAY 是多品牌 SaaS(30+ 独立品牌 tenant_id,各含 1-8 诊所 organization_id)。
#   PAC tenant = 合成 friday-market(整个市场一个租户,便于 FRIDAY 作为运营方跨品牌召回);
#   品牌(源 brand_id 列)→ patients.source_unit(集团内给 external_id 消歧:同号不同品牌=不同人);
#   诊所 organization_id → 后续 orgScope 隔离维度。
#   ⚠️ 隔离靠 orgScope/source_unit,非 tenant 边界 → 生产必须「禁止空 orgScope」。
#      若要品牌级硬隔离,改为 tenant_field: brand_id(每品牌一个 PAC tenant)。
#
# 跑法:
#   pnpm sync -- --dir=./data/friday --dry-run     # 看翻译效果,不写库
#   pnpm sync -- --dir=./data/friday --no-recompute

host_name:    friday
display_name: FRIDAY SaaS(多品牌市场)
auto_sync:    false

tenant_id:                friday-market   # PAC 租户 = 合成市场根(静态)
identity_namespace_field: brand_id        # patients.source_unit ← 源品牌列(customer.tenant_id 导出别名)

amount_unit: yuan
timezone:    Asia/Shanghai

tables:
  - { table: customer_basic_info, file: customer_basic_info.csv }   # 患者主档(原始)
  - { table: customer_contacts,   file: customer_contacts.csv }     # 联系方式 1:N(原始)
  - { table: appointment_base,    file: appointment_base.csv }      # 预约(原始,全状态)

transforms:
  # ── 患者:把 1:N 联系方式归约成 patient.phone 标量(无需源侧 join)──
  - kind: lookup
    input: customer_basic_info
    output: customer_basic_info        # in-place 附加 phone 列
    from: customer_contacts
    left_key: id                       # 患者主键
    right_key: customer_id             # 联系方式指向患者的外键
    where:
      contacts_tel: { not_empty: true } # 空号候选剔除
    order_by:                          # 挑一条:默认号 → 本人(type=1) → 最早 id
      - { field: is_default,    dir: desc }
      - { field: contacts_type, dir: asc }
      - { field: id,            dir: asc }
    select:
      phone: contacts_tel              # patient.phone ← 选中候选的 contacts_tel

  # ── 预约:丢草稿 → 全部预约(拼 scheduledAt)+ 已到诊拆成接诊事件(→ encounter)──
  # 与 jvs-dw 同款设计:一个预约源喂两张 canonical(appointment / encounter)。
  # status 编码两家一致(1正常/2改约/3取消/4到诊/5接诊/6结算/8walkin/9爽约);10=草稿丢弃。
  - kind: filter
    input: appointment_base
    output: _appt_valid
    where:
      appointment_status: { in: ['1', '2', '3', '4', '5', '6', '8', '9'] }   # 丢草稿 10
  # 全部预约:拼精确预约时刻(appointment_datetime_str 是区间且 14% 空 → 用 date + start)
  - kind: derive
    input: _appt_valid
    output: appointment_all_rows
    fields:
      scheduled_at_ts:
        op: concat
        parts: ['${appointment_date}', ' ', '${appointment_start}']   # "2026-07-13 15:30:00"
  # 已到诊(4/5/6)且有到诊时刻 → 接诊事件(startedAt = in_time)
  - kind: filter
    input: _appt_valid
    output: appointment_encounter_rows
    where:
      appointment_status: { in: ['4', '5', '6'] }
      in_time: { not_empty: true }

assemblers:
  - { file: assemblers/patient.yaml }
  - { file: assemblers/appointment.yaml }
  - { file: assemblers/encounter.yaml }
