# Từ điển dữ liệu — tuyensinh.com

> Mô tả mọi bảng & cột của database (Supabase Postgres). Sinh tự động bằng `pnpm --filter @tuyensinh/db export:dictionary` — **đừng sửa tay**.
> Bản CSV tương đương: [`database-dictionary.csv`](./database-dictionary.csv).
> ⚠️ Dữ liệu trong DB hiện là **mẫu/đại diện** (điểm chuẩn, đánh giá, học phí…) — chưa đối chiếu nguồn chính thức.

**26 bảng · 380 cột · 10 kiểu enum.**

## Mục lục

- [Điểm chuẩn (lịch sử) — `admission_cutoffs`](#admission-cutoffs)
- [Kỳ tuyển sinh — `admission_cycles`](#admission-cycles)
- [Số đăng ký & tỷ lệ chọi — `admission_demand`](#admission-demand)
- [Phương thức tuyển sinh — `admission_methods`](#admission-methods)
- [Chỉ tiêu tuyển sinh — `admission_quotas`](#admission-quotas)
- [Phân bổ lead — `attributions`](#attributions)
- [Nhật ký kiểm toán — `audit_logs`](#audit-logs)
- [Sổ cái consent — `consent_ledger`](#consent-ledger)
- [Consent (hiện trạng) — `consents`](#consents)
- [Yêu cầu DSR (PDPL) — `dsr_requests`](#dsr-requests)
- [Bậc học (danh mục) — `education_levels`](#education-levels)
- [Lộ trình chuyển cấp — `education_pathway_edges`](#education-pathway-edges)
- [Liên kết giám hộ — `guardian_links`](#guardian-links)
- [Lead — `leads`](#leads)
- [Thành viên/RBAC — `memberships`](#memberships)
- [Loại hình tổ chức — `organization_types`](#organization-types)
- [Tổ chức (tenant B2B) — `organizations`](#organizations)
- [Điểm chuẩn (theo ngành) — `program_cutoffs`](#program-cutoffs)
- [Chương trình / ngành — `programs`](#programs)
- [Học bổng — `scholarships`](#scholarships)
- [Độ phù hợp học sinh — `school_fit_profiles`](#school-fit-profiles)
- [Kết quả đầu ra — `school_outcomes`](#school-outcomes)
- [Rủi ro & độ tin cậy — `school_trust_flags`](#school-trust-flags)
- [Cơ sở giáo dục — `schools`](#schools)
- [Tổ hợp xét tuyển — `subject_combinations`](#subject-combinations)
- [Người dùng — `users`](#users)
- [Phụ lục: schools.attributes theo bậc](#phu-luc-schoolsattributes-theo-bac)
- [Phụ lục: giá trị enum](#phu-luc-gia-tri-enum)

## admission_cutoffs

**Điểm chuẩn (lịch sử)**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `school_id` | uuid | FK | `schools.id` | không |  | Trường/cơ sở liên quan |  |
| `program_id` | uuid | FK | `programs.id` | có |  | Chương trình/ngành liên quan |  |
| `admission_cycle_id` | uuid | FK | `admission_cycles.id` | có |  | Kỳ tuyển sinh liên quan |  |
| `year` | integer |  |  | không |  | Năm tuyển sinh | `2026` |
| `grade_or_level` | text |  |  | có |  | Cấp/bậc áp dụng | `lop_10 / dai_hoc` |
| `method_code` | text |  |  | có |  | Phương thức xét tuyển | `exam / thpt_score` |
| `round` | text |  |  | có |  | Đợt/nguyện vọng | `nv1 / nv2 / bo_sung` |
| `cutoff_score` | numeric |  |  | có |  | Điểm chuẩn | `25.5` |
| `score_scale` | integer |  |  | có |  | Thang điểm | `30` |
| `subject_combination_code` | text |  |  | có |  | Mã tổ hợp | `A00` |
| `priority_note` | text |  |  | có |  | Ghi chú ưu tiên (KV/ĐT) |  |
| `specialized_subject` | text |  |  | có |  | Môn chuyên (trường chuyên) |  |
| `condition_note` | text |  |  | có |  | Điều kiện phụ | `Tiếng Anh ≥ 5.0` |
| `number_registered` | integer |  |  | có |  | Số đăng ký | `1280` |
| `number_admitted` | integer |  |  | có |  | Số trúng tuyển / chỉ tiêu | `675` |
| `competition_ratio` | numeric |  |  | có |  | Tỷ lệ chọi | `1.9` |
| `cutoff_change_yoy` | numeric |  |  | có |  | Chênh lệch so năm trước | `+0.5` |
| `cutoff_avg_3y` | numeric |  |  | có |  | Điểm chuẩn TB 3 năm | `25.17` |
| `cutoff_avg_5y` | numeric |  |  | có |  | Điểm chuẩn TB 5 năm | `25.35` |
| `trend_label` | text |  |  | có |  | Nhãn xu hướng | `tang / giam / on_dinh` |
| `source_url` | text |  |  | có |  | Link nguồn | `https://hanoi.edu.vn/...` |
| `source_file_url` | text |  |  | có |  | Link file gốc (PDF/XLS) |  |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## admission_cycles

**Kỳ tuyển sinh**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `academic_year` | text |  |  | không |  | Năm học | `2026-2027` |
| `transition_stage` | text |  |  | không |  | Kỳ chuyển cấp | `vao_lop_10 / vao_dai_hoc` |
| `province` | text |  |  | có |  | Tỉnh/Thành áp dụng | `Hà Nội` |
| `governing_body` | text |  |  | có |  | Cơ quan chủ quản | `Sở GDĐT Hà Nội` |
| `application_start_date` | date |  |  | có |  | Ngày bắt đầu đăng ký | `2026-05-01` |
| `application_end_date` | date |  |  | có |  | Hạn đăng ký | `2026-05-15` |
| `exam_dates` | jsonb |  |  | có |  | Ngày thi (jsonb) | `["2026-06-08"]` |
| `result_date` | date |  |  | có |  | Ngày công bố kết quả | `2026-07-01` |
| `confirmation_deadline` | date |  |  | có |  | Hạn xác nhận nhập học | `2026-07-10` |
| `rules_summary` | text |  |  | có |  | Tóm tắt quy chế |  |
| `source_url` | text |  |  | có |  | Link nguồn | `https://hanoi.edu.vn/...` |
| `source_file_url` | text |  |  | có |  | Link file gốc (PDF/XLS) |  |
| `last_checked_at` | timestamp with time zone |  |  | có |  | Lần kiểm tra gần nhất |  |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## admission_demand

**Số đăng ký & tỷ lệ chọi**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `school_id` | uuid | FK | `schools.id` | không |  | Trường/cơ sở liên quan |  |
| `admission_cycle_id` | uuid | FK | `admission_cycles.id` | có |  | Kỳ tuyển sinh liên quan |  |
| `grade_or_level` | text |  |  | có |  | Cấp/bậc áp dụng | `lop_10 / dai_hoc` |
| `registered_total` | integer |  |  | có |  | Tổng số đăng ký | `1280` |
| `registered_nv1` | integer |  |  | có |  | Đăng ký NV1 | `1280` |
| `registered_nv2` | integer |  |  | có |  | Đăng ký NV2 |  |
| `registered_nv3` | integer |  |  | có |  | Đăng ký NV3 |  |
| `competition_ratio_total` | numeric |  |  | có |  | Tỷ lệ chọi tổng | `1.9` |
| `competition_ratio_nv1` | numeric |  |  | có |  | Tỷ lệ chọi NV1 | `1.9` |
| `source` | text |  |  | có |  | Nguồn dữ liệu / provenance | `Sở GDĐT Hà Nội` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## admission_methods

**Phương thức tuyển sinh**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `method_code` | text | UQ |  | không |  | Mã phương thức (duy nhất) | `thpt_score` |
| `method_name_vn` | text |  |  | không |  | Tên phương thức | `Điểm thi THPT` |
| `applicable_levels` | jsonb |  |  | có |  | Cấp/bậc áp dụng (jsonb) | `["vao_dai_hoc"]` |
| `required_documents` | text |  |  | có |  | Hồ sơ yêu cầu |  |
| `score_formula` | text |  |  | có |  | Công thức tính điểm | `Tổng điểm tổ hợp 3 môn` |
| `priority_policy` | text |  |  | có |  | Chính sách ưu tiên |  |
| `pros_cons_for_students` | text |  |  | có |  | Ưu/nhược điểm cho học sinh | `Phổ biến; cạnh tranh cao` |
| `parent_notes` | text |  |  | có |  | Lưu ý cho phụ huynh | `So điểm chuẩn 3–5 năm` |
| `display_order` | integer |  |  | không | 0 | Thứ tự hiển thị (nhỏ → trước) | `10` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## admission_quotas

**Chỉ tiêu tuyển sinh**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `school_id` | uuid | FK | `schools.id` | không |  | Trường/cơ sở liên quan |  |
| `program_id` | uuid | FK | `programs.id` | có |  | Chương trình/ngành liên quan |  |
| `admission_cycle_id` | uuid | FK | `admission_cycles.id` | có |  | Kỳ tuyển sinh liên quan |  |
| `grade_or_level` | text |  |  | có |  | Cấp/bậc áp dụng | `lop_10 / dai_hoc` |
| `quota_total` | integer |  |  | có |  | Tổng chỉ tiêu | `675` |
| `quota_classes` | integer |  |  | có |  | Số lớp | `15` |
| `quota_by_method` | jsonb |  |  | có |  | Chỉ tiêu theo phương thức (jsonb) | `{"thpt":400}` |
| `quota_by_major` | jsonb |  |  | có |  | Chỉ tiêu theo ngành (jsonb) |  |
| `planned_class_size` | integer |  |  | có |  | Sĩ số dự kiến/lớp | `45` |
| `actual_enrolled` | integer |  |  | có |  | Số nhập học thực tế | `672` |
| `fill_rate` | numeric |  |  | có |  | Tỷ lệ lấp đầy (%) | `99.5` |
| `source` | text |  |  | có |  | Nguồn dữ liệu / provenance | `Sở GDĐT Hà Nội` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## attributions

**Phân bổ lead**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `lead_id` | uuid | FK | `leads.id` | không |  | Lead liên quan |  |
| `school_id` | uuid | FK | `schools.id` | không |  | Trường/cơ sở liên quan |  |
| `source` | text |  |  | có |  | Nguồn dữ liệu / provenance | `Sở GDĐT Hà Nội` |
| `first_agent` | text |  |  | có |  | Tư vấn viên đầu tiên (first-touch) |  |
| `basis` | jsonb |  |  | có |  | Cơ sở phân bổ | `first_touch` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## audit_logs

**Nhật ký kiểm toán**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `organization_id` | uuid | FK | `organizations.id` | có |  | Tổ chức (tenant B2B) liên quan |  |
| `actor_user_id` | uuid | FK | `users.id` | có |  | Người thực hiện hành động |  |
| `entity_type` | text |  |  | không |  | Loại đối tượng tác động | `schools` |
| `entity_id` | text |  |  | có |  | ID đối tượng |  |
| `action` | text |  |  | không |  | Hành động | `update / delete` |
| `before_json` | jsonb |  |  | có |  | Trạng thái trước (jsonb) |  |
| `after_json` | jsonb |  |  | có |  | Trạng thái sau (jsonb) |  |
| `ip_address` | text |  |  | có |  | IP |  |
| `user_agent` | text |  |  | có |  | User-Agent |  |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |

## consent_ledger

**Sổ cái consent**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `user_id` | uuid | FK | `users.id` | không |  | Người dùng liên quan |  |
| `type` | consent_type |  |  | không |  | Loại consent | `data_share` |
| `school_id` | uuid | FK | `schools.id` | có |  | Trường/cơ sở liên quan |  |
| `action` | text |  |  | không |  | Hành động (sổ cái bất biến) | `granted / withdrawn` |
| `version` | text |  |  | không |  | Phiên bản điều khoản | `v1.2` |
| `channel` | consent_channel |  |  | không |  | Kênh thu thập | `web / app` |
| `ip_address` | text |  |  | có |  | IP khi thực hiện |  |
| `user_agent` | text |  |  | có |  | User-Agent |  |
| `metadata` | jsonb |  |  | có |  | Metadata (jsonb) |  |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |

## consents

**Consent (hiện trạng)**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `user_id` | uuid | FK | `users.id` | không |  | Người dùng liên quan |  |
| `type` | consent_type |  |  | không |  | Loại consent | `marketing / data_share` |
| `school_id` | uuid | FK | `schools.id` | có |  | Trường/cơ sở liên quan |  |
| `granted` | text |  |  | không | 'true'::text | Đã đồng ý? | `true/false` |
| `version` | text |  |  | không |  | Phiên bản điều khoản | `v1.2` |
| `granted_at` | timestamp with time zone |  |  | có |  | Thời điểm đồng ý |  |
| `withdrawn_at` | timestamp with time zone |  |  | có |  | Thời điểm rút lại |  |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## dsr_requests

**Yêu cầu DSR (PDPL)**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `user_id` | uuid | FK | `users.id` | không |  | Người dùng liên quan |  |
| `type` | dsr_type |  |  | không |  | Loại yêu cầu DSR (PDPL) | `access / erase` |
| `status` | dsr_status |  |  | không | 'received'::dsr_status | Trạng thái xử lý | `pending / resolved` |
| `details` | text |  |  | có |  | Chi tiết yêu cầu |  |
| `due_at` | timestamp with time zone |  |  | có |  | Hạn xử lý |  |
| `resolved_at` | timestamp with time zone |  |  | có |  | Thời điểm hoàn tất |  |
| `handled_by` | uuid | FK | `users.id` | có |  | Người xử lý (DPO) |  |
| `resolution` | jsonb |  |  | có |  | Kết quả xử lý |  |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## education_levels

**Bậc học (danh mục)**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `level_code` | text | UQ |  | không |  | Mã bậc (duy nhất) | `thpt` |
| `enum_level` | education_level |  |  | có |  | Giá trị enum education_level | `thpt` |
| `slug` | text | UQ |  | không |  | Định danh URL | `trung-hoc-pho-thong` |
| `display_order` | integer |  |  | không | 0 | Thứ tự hiển thị (nhỏ → trước) | `10` |
| `level_name_vn` | text |  |  | không |  | Tên bậc (Tiếng Việt) | `Trung học phổ thông` |
| `level_name_en` | text |  |  | có |  | Tên bậc (English) | `Upper secondary` |
| `education_category` | text |  |  | có |  | Nhóm giáo dục | `Phổ thông` |
| `isced_level` | integer |  |  | có |  | Mã ISCED (UNESCO) 0–8 | `3` |
| `proposed_framework_2026` | text |  |  | có |  | Khung đề xuất 2026 |  |
| `age_min` | numeric |  |  | có |  | Tuổi bắt đầu | `15` |
| `age_max` | numeric |  |  | có |  | Tuổi kết thúc | `17` |
| `grades_or_age_group` | text |  |  | có |  | Lớp/nhóm tuổi | `Lớp 10–12` |
| `duration_years` | numeric |  |  | có |  | Số năm học | `3` |
| `compulsory_status` | text |  |  | có |  | Bắt buộc? | `Không bắt buộc` |
| `qualification_awarded` | text |  |  | có |  | Bằng cấp đạt được | `Bằng tốt nghiệp THPT` |
| `main_objectives` | text |  |  | có |  | Mục tiêu chính |  |
| `key_competencies` | jsonb |  |  | có |  | Năng lực cốt lõi (jsonb) | `["tư duy phản biện"]` |
| `entry_requirements` | text |  |  | có |  | Điều kiện đầu vào | `Tốt nghiệp THCS` |
| `progression_pathways` | jsonb |  |  | có |  | Lộ trình tiếp theo (jsonb) | `["đại học","nghề"]` |
| `important_assessments` | text |  |  | có |  | Kỳ thi/đánh giá quan trọng | `Thi tốt nghiệp THPT` |
| `enrollment_process_for_parents` | text |  |  | có |  | Quy trình nhập học cho phụ huynh |  |
| `cost_info` | text |  |  | có |  | Thông tin chi phí |  |
| `international_options` | text |  |  | có |  | Lựa chọn quốc tế |  |
| `parent_tips_notes` | text |  |  | có |  | Lưu ý cho phụ huynh |  |
| `latest_reforms` | text |  |  | có |  | Cải cách mới nhất |  |
| `statistics_summary` | jsonb |  |  | có |  | Thống kê tóm tắt (jsonb) |  |
| `data_source` | text |  |  | có |  | Nguồn dữ liệu | `Bộ GDĐT` |
| `last_updated` | date |  |  | có |  | Cập nhật lần cuối | `2026-01-15` |
| `notes` | text |  |  | có |  | Ghi chú thêm |  |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## education_pathway_edges

**Lộ trình chuyển cấp**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `from_level` | text |  |  | không |  | Bậc xuất phát | `thcs` |
| `to_level` | text |  |  | không |  | Bậc đích | `thpt` |
| `pathway_type` | text |  |  | có |  | Loại lộ trình | `Thi tuyển vào lớp 10 công lập` |
| `decision_factors` | jsonb |  |  | có |  | Yếu tố quyết định (jsonb) | `["điểm chuẩn","chỉ tiêu"]` |
| `risk_factors` | jsonb |  |  | có |  | Yếu tố rủi ro (jsonb) | `["điểm biến động"]` |
| `recommended_content` | text |  |  | có |  | Nội dung gợi ý | `Chiến lược NV1/NV2/NV3` |
| `display_order` | integer |  |  | không | 0 | Thứ tự hiển thị (nhỏ → trước) | `10` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## guardian_links

**Liên kết giám hộ**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `guardian_user_id` | uuid | FK | `users.id` | không |  | Người giám hộ |  |
| `minor_user_id` | uuid | FK | `users.id` | không |  | Trẻ vị thành niên |  |
| `verified_at` | timestamp with time zone |  |  | có |  | Thời điểm xác minh giám hộ |  |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## leads

**Lead**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `user_id` | uuid | FK | `users.id` | có |  | Người dùng liên quan |  |
| `school_id` | uuid | FK | `schools.id` | có |  | Trường/cơ sở liên quan |  |
| `segment` | segment |  |  | không |  | Nhóm thô (legacy) | `university` |
| `status` | lead_status |  |  | không | 'new'::lead_status | Trạng thái lead | `new / routed / won` |
| `consent_ledger_id` | uuid | FK | `consent_ledger.id` | có |  | Consent gắn với lead (audit-first) |  |
| `firewall` | jsonb |  |  | có |  | Cờ firewall chống rò rỉ PII | `true/false` |
| `ghl_contact_id` | text |  |  | có |  | ID contact bên GoHighLevel |  |
| `ghl_opportunity_id` | text |  |  | có |  | ID opportunity bên GHL |  |
| `routed_at` | timestamp with time zone |  |  | có |  | Thời điểm định tuyến |  |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |
| `assigned_to_user_id` | uuid | FK | `users.id` | có |  | Tư vấn viên được phân (RLS row-scope) |  |

## memberships

**Thành viên/RBAC**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `organization_id` | uuid | FK | `organizations.id` | không |  | Tổ chức (tenant B2B) liên quan |  |
| `user_id` | uuid | FK | `users.id` | không |  | Người dùng liên quan |  |
| `role` | role |  |  | không | 'member'::role | Vai trò RBAC | `ts_data_ops` |
| `status` | membership_status |  |  | không | 'invited'::membership_status | Trạng thái thành viên | `active` |
| `invited_by` | uuid | FK | `users.id` | có |  | Người mời |  |
| `joined_at` | timestamp with time zone |  |  | có |  | Thời điểm tham gia |  |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## organization_types

**Loại hình tổ chức**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `type_code` | text | UQ |  | không |  | Mã loại hình (duy nhất) | `thpt_cong_lap` |
| `type_group` | text |  |  | không |  | Nhóm loại hình | `Phổ thông` |
| `name_vn` | text |  |  | không |  | Tên (Tiếng Việt) | `THPT công lập` |
| `name_en` | text |  |  | có |  | Tên (English) | `Public high school` |
| `legal_category` | text |  |  | có |  | Phân loại pháp lý | `Cơ sở giáo dục công lập` |
| `managing_authority` | text |  |  | có |  | Cơ quan quản lý | `Sở GDĐT` |
| `license_required` | boolean |  |  | không | true | Cần giấy phép? | `true/false` |
| `license_type` | text |  |  | có |  | Loại giấy phép | `Quyết định thành lập` |
| `is_formal_education` | boolean |  |  | không | false | Giáo dục chính quy? | `true/false` |
| `is_regulated_training` | boolean |  |  | không | false | Đào tạo có điều kiện? | `true/false` |
| `description` | text |  |  | có |  | Mô tả |  |
| `display_order` | integer |  |  | không | 0 | Thứ tự hiển thị (nhỏ → trước) | `10` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## organizations

**Tổ chức (tenant B2B)**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `name` | text |  |  | không |  | Tên tổ chức (tenant B2B) | `Trường ABC` |
| `slug` | text | UQ |  | không |  | Định danh URL (duy nhất) | `truong-abc` |
| `timezone` | text |  |  | không | 'Asia/Ho_Chi_Minh'::text | Múi giờ | `Asia/Ho_Chi_Minh` |
| `currency` | text |  |  | không | 'VND'::text | Tiền tệ mặc định | `VND` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |
| `deleted_at` | timestamp with time zone |  |  | có |  | Thời điểm xóa mềm (null = đang hoạt động) |  |

## program_cutoffs

**Điểm chuẩn (theo ngành)**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `program_id` | uuid | FK | `programs.id` | không |  | Chương trình/ngành liên quan |  |
| `year` | integer |  |  | không |  | Năm tuyển sinh | `2026` |
| `method` | text |  |  | không | 'thpt'::text | Phương thức của mức điểm chuẩn | `thpt` |
| `score` | numeric |  |  | không |  | Điểm chuẩn thang 30 theo năm/phương thức | `28.29` |
| `source` | text |  |  | có |  | Nguồn dữ liệu / provenance | `Sở GDĐT Hà Nội` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## programs

**Chương trình / ngành**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `school_id` | uuid | FK | `schools.id` | không |  | Trường/cơ sở liên quan |  |
| `name` | text |  |  | không |  | Tên ngành/chương trình | `Khoa học máy tính` |
| `slug` | text |  |  | không |  | Định danh URL trong trường | `khoa-hoc-may-tinh` |
| `segment` | segment |  |  | không |  | Nhóm thô (legacy) | `university` |
| `description` | text |  |  | có |  | Mô tả ngành |  |
| `tuition_per_year` | numeric |  |  | có |  | Học phí/năm (VND) | `30000000` |
| `currency` | text |  |  | không | 'VND'::text | Đơn vị tiền | `VND` |
| `admission_methods` | jsonb |  |  | có |  | Phương thức xét tuyển (jsonb) | `["thpt","dgnl"]` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |
| `deleted_at` | timestamp with time zone |  |  | có |  | Thời điểm xóa mềm (null = đang hoạt động) |  |
| `admission_combos` | jsonb |  |  | có |  | Tổ hợp xét tuyển [{code,subjects}] | `[{"code":"A00","subjects":["toan","ly","hoa"]}]` |

## scholarships

**Học bổng**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `school_id` | uuid | FK | `schools.id` | có |  | Trường/cơ sở liên quan |  |
| `name` | text |  |  | không |  | Tên học bổng | `Học bổng Vallet` |
| `slug` | text | UQ |  | không |  | Định danh URL (duy nhất) | `hoc-bong-vallet` |
| `provider` | text |  |  | có |  | Đơn vị cấp | `Quỹ Vallet` |
| `segment` | segment |  |  | có |  | Nhóm thô (legacy) | `university` |
| `coverage_type` | text |  |  | không | 'amount'::text | Loại hỗ trợ | `full / percent / amount` |
| `value` | numeric |  |  | có |  | Giá trị (VND nếu amount, % nếu percent) | `25000000` |
| `field` | text |  |  | có |  | Lĩnh vực/ngành áp dụng | `STEM` |
| `region` | text |  |  | có |  | Khu vực áp dụng | `Toàn quốc` |
| `criteria` | jsonb |  |  | có |  | Điều kiện {minGpa,notes} | `{"minGpa":8.0}` |
| `deadline` | timestamp with time zone |  |  | có |  | Hạn nộp | `2026-08-31` |
| `source` | text |  |  | có |  | Nguồn dữ liệu / provenance | `Sở GDĐT Hà Nội` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |
| `deleted_at` | timestamp with time zone |  |  | có |  | Thời điểm xóa mềm (null = đang hoạt động) |  |

## school_fit_profiles

**Độ phù hợp học sinh**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `school_id` | uuid | UQ, FK | `schools.id` | không |  | Trường/cơ sở liên quan |  |
| `academic_intensity` | text |  |  | có |  | Áp lực học thuật | `thap / trung_binh / cao` |
| `homework_load` | text |  |  | có |  | Khối lượng bài tập | `trung_binh` |
| `exam_pressure_level` | text |  |  | có |  | Áp lực thi cử | `cao` |
| `english_intensity` | text |  |  | có |  | Mức độ tiếng Anh | `cao` |
| `stem_strength` | text |  |  | có |  | Thế mạnh STEM | `cao` |
| `arts_sports_strength` | text |  |  | có |  | Thế mạnh nghệ thuật/thể thao | `trung_binh` |
| `discipline_style` | text |  |  | có |  | Phong cách kỷ luật | `nghiem / than_thien / tu_chu` |
| `student_support_level` | text |  |  | có |  | Mức hỗ trợ học sinh | `cao` |
| `best_for_student_type` | text |  |  | có |  | Phù hợp kiểu học sinh | `Học sinh khá–giỏi, định hướng ĐH` |
| `not_best_for_student_type` | text |  |  | có |  | Không phù hợp kiểu | `HS cần nhịp nhẹ nhàng` |
| `parent_expectation_fit` | jsonb |  |  | có |  | Phù hợp kỳ vọng phụ huynh (jsonb) | `["học thuật","du học"]` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## school_outcomes

**Kết quả đầu ra**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `school_id` | uuid | FK | `schools.id` | không |  | Trường/cơ sở liên quan |  |
| `year` | integer |  |  | không |  | Năm tuyển sinh | `2026` |
| `level` | text |  |  | có |  | Bậc/cấp | `thpt` |
| `graduation_rate` | numeric |  |  | có |  | Tỷ lệ tốt nghiệp (%) | `99.5` |
| `university_admission_rate` | numeric |  |  | có |  | Tỷ lệ đỗ đại học (%) | `85.0` |
| `public_high_school_admission_rate` | numeric |  |  | có |  | Tỷ lệ đỗ THPT công lập (%) | `78.0` |
| `specialized_school_admission_count` | integer |  |  | có |  | Số HS đỗ chuyên | `42` |
| `top_university_admission_count` | integer |  |  | có |  | Số HS đỗ ĐH top | `120` |
| `average_exam_score` | numeric |  |  | có |  | Điểm thi trung bình | `24.5` |
| `subject_score_breakdown` | jsonb |  |  | có |  | Điểm theo môn (jsonb) | `{"toan":8.2}` |
| `english_certificate_rate` | numeric |  |  | có |  | Tỷ lệ có IELTS/TOEFL (%) | `35.0` |
| `scholarship_results` | text |  |  | có |  | Kết quả học bổng |  |
| `employment_rate` | numeric |  |  | có |  | Tỷ lệ việc làm (%) | `92.0` |
| `avg_starting_salary` | numeric |  |  | có |  | Lương khởi điểm TB (VND) | `12000000` |
| `source` | text |  |  | có |  | Nguồn dữ liệu / provenance | `Sở GDĐT Hà Nội` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## school_trust_flags

**Rủi ro & độ tin cậy**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `school_id` | uuid | UQ, FK | `schools.id` | không |  | Trường/cơ sở liên quan |  |
| `license_verified` | boolean |  |  | không | false | Đã xác minh giấy phép? | `true/false` |
| `license_expiry_date` | date |  |  | có |  | Ngày hết hạn giấy phép | `2028-12-31` |
| `accreditation_verified` | boolean |  |  | không | false | Đã xác minh kiểm định? | `true/false` |
| `fee_transparency_score` | integer |  |  | có |  | Điểm minh bạch học phí 0–100 | `80` |
| `outcome_claim_verified` | boolean |  |  | không | false | Cam kết đầu ra có kiểm chứng? | `true/false` |
| `review_manipulation_risk` | text |  |  | có |  | Rủi ro review ảo | `thap / trung_binh / cao` |
| `complaint_count` | integer |  |  | không | 0 | Số phản ánh/khiếu nại | `0` |
| `complaint_resolution_rate` | numeric |  |  | có |  | Tỷ lệ xử lý khiếu nại (%) | `100` |
| `data_confidence_score` | integer |  |  | có |  | Điểm tin cậy dữ liệu 0–100 | `40` |
| `last_verified_at` | timestamp with time zone |  |  | có |  | Lần xác minh gần nhất |  |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## schools

**Cơ sở giáo dục**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `organization_id` | uuid | FK | `organizations.id` | có |  | Tổ chức (tenant B2B) liên quan |  |
| `name` | text |  |  | không |  | Tên cơ sở giáo dục | `THPT Chu Văn An` |
| `slug` | text | UQ |  | không |  | Định danh URL (duy nhất) | `thpt-chu-van-an-hn` |
| `segment` | segment |  |  | không |  | Nhóm thô (legacy) | `university` |
| `province` | text |  |  | có |  | Tỉnh/Thành phố | `Hà Nội` |
| `district` | text |  |  | có |  | Quận/Huyện | `Tây Hồ` |
| `address` | text |  |  | có |  | Địa chỉ đầy đủ | `240 Nguyễn Văn Luông, Q.6` |
| `description` | text |  |  | có |  | Giới thiệu chung |  |
| `media` | jsonb |  |  | có |  | Ảnh/video (jsonb {images,videos}) | `{"images":["..."]}` |
| `verification_status` | verification_status |  |  | không | 'unverified'::verification_status | Trạng thái xác minh | `unverified / claimed / verified` |
| `confidence_score` | integer |  |  | không | 0 | Điểm tin cậy dữ liệu 0–100 (FR-TRS-01) | `40` |
| `verified_at` | timestamp with time zone |  |  | có |  | Thời điểm xác minh gần nhất |  |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |
| `deleted_at` | timestamp with time zone |  |  | có |  | Thời điểm xóa mềm (null = đang hoạt động) |  |
| `levels` | education_level[] |  |  | không | ARRAY[]::education_level[] | Bậc học (liên cấp = nhiều bậc) — trục tìm kiếm | `{thpt}` |
| `primary_level` | education_level |  |  | có |  | Bậc chính cho URL/breadcrumb | `thpt` |
| `attributes` | jsonb |  |  | có |  | Field riêng theo bậc (jsonb — xem các dòng schools.attributes.*) |  |
| `organization_types` | text[] |  |  | không | ARRAY[]::text[] | Loại hình tổ chức (1 cơ sở có thể nhiều) | `{thpt_cong_lap}` |
| `program_categories` | text[] |  |  | không | ARRAY[]::text[] | Dịch vụ/chương trình cung cấp | `{ngoai_ngu,luyen_thi}` |
| `target_learners` | text[] |  |  | không | ARRAY[]::text[] | Đối tượng phục vụ | `{thpt}` |
| `delivery_mode` | text[] |  |  | không | ARRAY[]::text[] | Hình thức học | `{offline,hybrid}` |
| `risk_flags` | jsonb |  |  | có |  | Cảnh báo chất lượng dữ liệu (jsonb) | `["thiếu giấy phép"]` |
| `phuong_xa` | text |  |  | có |  | Phường/Xã | `Trung Hòa` |
| `vi_do` | numeric |  |  | có |  | Vĩ độ (toạ độ) | `21.0136` |
| `kinh_do` | numeric |  |  | có |  | Kinh độ (toạ độ) | `105.7993` |
| `do_tuoi_text` | text |  |  | có |  | Độ tuổi nhận (dạng chữ) | `18 tháng - 6 tuổi` |
| `so_dien_thoai` | text |  |  | có |  | Số điện thoại liên hệ | `0241234567` |
| `email` | text |  |  | có |  | Email liên hệ | `info@truong.edu.vn` |
| `website` | text |  |  | có |  | Website | `https://truong.edu.vn` |
| `zalo` | text |  |  | có |  | Zalo OA |  |
| `hoc_phi_toi_thieu` | numeric |  |  | có |  | Học phí tối thiểu (VND) | `3500000` |
| `hoc_phi_toi_da` | numeric |  |  | có |  | Học phí tối đa (VND) | `5500000` |
| `chu_ky_hoc_phi` | text |  |  | không | 'thang'::text | Chu kỳ học phí | `thang / nam / khoa` |
| `co_thong_tin_hoc_phi` | boolean |  |  | không | false | Có công bố học phí? | `true/false` |
| `uu_dai_tieu_de` | text |  |  | có |  | Tên ưu đãi | `Ưu đãi nhập học giữa năm` |
| `uu_dai_chi_tiet` | text |  |  | có |  | Chi tiết ưu đãi | `Giảm 100% học phí tháng đầu` |
| `dang_uu_dai` | boolean |  |  | không | false | Đang có ưu đãi? | `true/false` |
| `uu_dai_het_han` | date |  |  | có |  | Hạn ưu đãi | `2026-09-30` |
| `diem_danh_gia` | numeric |  |  | có |  | Điểm đánh giá (thang 5) | `4.8` |
| `luot_danh_gia` | integer |  |  | không | 0 | Số lượt đánh giá | `32` |
| `luot_khuyen_hoc` | integer |  |  | không | 0 | Lượt khuyên học | `120` |
| `luot_dang_ky` | integer |  |  | không | 0 | Lượt đăng ký/tư vấn | `210` |
| `luot_quan_tam` | integer |  |  | không | 0 | Lượt quan tâm | `340` |
| `luot_yeu_thich` | integer |  |  | không | 0 | Lượt yêu thích | `28` |
| `so_cau_hoi` | integer |  |  | không | 0 | Số câu hỏi (Q&A) | `5` |
| `ma_ngoai` | text |  |  | có |  | ID/slug nguồn ngoài (vd KiddiHub) | `vuoncotich` |
| `nguon_url` | text |  |  | có |  | Link hồ sơ nguồn | `https://kiddihub.com/...` |

## subject_combinations

**Tổ hợp xét tuyển**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `combo_code` | text | UQ |  | không |  | Mã tổ hợp (duy nhất) | `A00` |
| `subjects` | text[] |  |  | không |  | Danh sách môn | `{toan,ly,hoa}` |
| `level` | text |  |  | có |  | Bậc áp dụng | `dai_hoc` |
| `career_paths` | jsonb |  |  | có |  | Nhóm ngành phù hợp (jsonb) | `["Kỹ thuật, công nghệ"]` |
| `student_profile_fit` | text |  |  | có |  | Học sinh phù hợp | `Mạnh tự nhiên (Toán–Lý–Hóa)` |
| `note` | text |  |  | có |  | Ghi chú thêm |  |
| `display_order` | integer |  |  | không | 0 | Thứ tự hiển thị (nhỏ → trước) | `10` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |

## users

**Người dùng**

| Trường | Kiểu | Khóa | Tham chiếu | NULL? | Mặc định | Mô tả | Ví dụ |
|---|---|---|---|---|---|---|---|
| `id` | uuid | PK |  | không | gen_random_uuid() | Khóa chính (UUID) |  |
| `email` | text | UQ |  | có |  | Email đăng nhập (duy nhất) | `a@truong.edu.vn` |
| `phone` | text | UQ |  | có |  | Số điện thoại | `0901234567` |
| `full_name` | text |  |  | có |  | Họ tên | `Nguyễn Văn A` |
| `avatar_url` | text |  |  | có |  | Ảnh đại diện |  |
| `locale` | text |  |  | không | 'vi'::text | Ngôn ngữ | `vi` |
| `timezone` | text |  |  | không | 'Asia/Ho_Chi_Minh'::text | Múi giờ | `Asia/Ho_Chi_Minh` |
| `birth_year` | text |  |  | có |  | Năm sinh | `2008` |
| `is_minor` | boolean |  |  | không | false | Là trẻ vị thành niên? (consent giám hộ) | `true/false` |
| `created_at` | timestamp with time zone |  |  | không | now() | Thời điểm tạo bản ghi |  |
| `updated_at` | timestamp with time zone |  |  | không | now() | Thời điểm cập nhật gần nhất |  |
| `deleted_at` | timestamp with time zone |  |  | có |  | Thời điểm xóa mềm (null = đang hoạt động) |  |

## Phụ lục: schools.attributes theo bậc

`schools.attributes` là cột `jsonb` chứa field riêng theo từng bậc (validate bằng zod, xem `field-catalog.ts`).

### Mầm non (preschool)

| Field | Kiểu | Đơn vị | Tiêu đề | Ví dụ | Lọc |
|---|---|---|---|---|---|
| `ageFromMonths` | int | tháng | Tuổi nhận từ | `18` | range |
| `ageToMonths` | int | tháng | Tuổi nhận đến | `72` | range |
| `tuitionMonthly` | money | VND | Học phí/tháng | `4500000` | range |
| `enrollmentFee` | money | VND | Phí ghi danh | `2000000` | range |
| `pedagogy` | enum |  | Phương pháp (Montessori/Reggio/STEAM/…) | `montessori` | facet |
| `bilingual` | boolean |  | Song ngữ | `true` | boolean |
| `languages` | array |  | Ngôn ngữ giảng dạy | `{vi,en}` | facet |
| `mealIncluded` | boolean |  | Bữa ăn/bán trú | `true` | boolean |
| `mealMenuUrl` | url |  | Thực đơn |  | none |
| `hasCamera` | boolean |  | Camera lớp học | `true` | boolean |
| `shuttleBus` | boolean |  | Xe đưa đón | `false` | boolean |
| `healthcareOnsite` | boolean |  | Y tế tại trường | `true` | boolean |
| `classSize` | int |  | Sĩ số/lớp | `20` | range |
| `teacherChildRatio` | text |  | Tỉ lệ GV/trẻ | `1:8` | none |
| `operatingHours` | text |  | Giờ đón–trả | `7:00–17:30` | none |
| `daysPerWeek` | int |  | Số ngày/tuần | `5` | none |
| `facilities` | array |  | Cơ sở vật chất | `{san_choi,ho_boi}` | facet |
| `trialAvailable` | boolean |  | Cho học thử | `true` | boolean |
| `summerProgram` | boolean |  | Chương trình hè | `true` | boolean |

### Phổ thông (tieu_hoc/thcs/thpt)

| Field | Kiểu | Đơn vị | Tiêu đề | Ví dụ | Lọc |
|---|---|---|---|---|---|
| `curriculum` | enum |  | Chương trình (VN/Song ngữ/Quốc tế/Cambridge/IB) | `cambridge` | facet |
| `tuitionPerYear` | money | VND | Học phí/năm | `60000000` | range |
| `enrollmentFee` | money | VND | Phí nhập học | `5000000` | range |
| `otherFeesPerYear` | money | VND | Phí khác/năm | `3000000` | range |
| `boarding` | enum |  | Nội/Bán trú/Không | `ban_tru` | facet |
| `englishProgram` | text |  | Chương trình tiếng Anh | `Cambridge` | none |
| `foreignTeacherRatio` | text |  | Tỉ lệ GV nước ngoài | `30%` | none |
| `classSize` | int |  | Sĩ số/lớp | `35` | range |
| `capacity` | int |  | Chỉ tiêu tuyển | `675` | range |
| `admissionMethod` | multi_enum |  | Phương thức tuyển | `{thi_tuyen}` | facet |
| `entranceScore` | number |  | Điểm chuẩn vào (THPT) | `25.5` | range |
| `intakeGrade` | int |  | Tuyển sinh lớp (1/6/10) | `10` | facet |
| `streams` | multi_enum |  | Ban KHTN/KHXH (THPT) | `{khtn}` | facet |
| `shuttleBus` | boolean |  | Xe đưa đón | `true` | boolean |
| `mealIncluded` | boolean |  | Bán trú | `true` | boolean |
| `scholarshipAvailable` | boolean |  | Có học bổng | `true` | boolean |
| `extracurricular` | array |  | Ngoại khóa | `{robotics,bong_ro}` | facet |
| `facilities` | array |  | Cơ sở vật chất | `{thu_vien,lab}` | facet |

### Sau phổ thông (trung_cap/cao_dang/dai_hoc)

| Field | Kiểu | Đơn vị | Tiêu đề | Ví dụ | Lọc |
|---|---|---|---|---|---|
| `institutionType` | enum |  | Loại trường (Công lập/Tư thục/Quốc tế) | `cong_lap` | facet |
| `intakeQuota` | int |  | Chỉ tiêu | `5000` | range |
| `studentCount` | int |  | Quy mô sinh viên | `35000` | range |
| `campusCount` | int |  | Số cơ sở | `3` | none |
| `accreditation` | array |  | Kiểm định | `{AUN-QA}` | facet |
| `ranking` | text |  | Xếp hạng | `Top 5 VN` | none |
| `tuitionPerYear` | money | VND | Học phí/năm | `30000000` | range |
| `employmentRate` | percent | % | Tỉ lệ việc làm | `95` | range |
| `avgStartingSalary` | money | VND | Lương khởi điểm TB | `15000000` | range |
| `dormAvailable` | boolean |  | Ký túc xá | `true` | boolean |
| `internationalProgram` | boolean |  | Chương trình quốc tế | `true` | boolean |
| `durationMonths` | int | tháng | Thời lượng (TC/CĐ) | `24` | range |
| `occupation` | text |  | Nghề đào tạo (TC) | `Điện công nghiệp` | facet |
| `articulation` | boolean |  | Liên thông lên ĐH | `true` | boolean |
| `practiceRatio` | percent | % | Tỉ lệ thực hành | `70` | range |
| `jobGuarantee` | boolean |  | Cam kết việc làm | `true` | boolean |

### Sau đại học (thac_si/tien_si)

| Field | Kiểu | Đơn vị | Tiêu đề | Ví dụ | Lọc |
|---|---|---|---|---|---|
| `degreeType` | enum |  | Bậc (MBA/MSc/MA/DBA/PhD) | `mba` | facet |
| `format` | enum |  | Hình thức (Online/Offline/Hybrid) | `hybrid` | facet |
| `durationMonths` | int | tháng | Thời lượng | `18` | range |
| `minExperienceYears` | int | năm | KN tối thiểu | `2` | range |
| `tuitionTotal` | money | VND | Tổng học phí | `250000000` | range |
| `accreditation` | array |  | Kiểm định (AACSB/AMBA/EQUIS) | `{AMBA}` | facet |
| `ieltsRequired` | number |  | IELTS yêu cầu | `6.5` | range |
| `intakeMonths` | array |  | Tháng khai giảng | `{3,9}` | facet |
| `avgSalaryAfter` | money | VND | Lương sau tốt nghiệp (ROI) | `40000000` | range |
| `thesisRequired` | boolean |  | Yêu cầu luận văn | `true` | boolean |
| `partTimeOption` | boolean |  | Học bán thời gian | `true` | boolean |
| `researchAreas` | array |  | Hướng nghiên cứu (PhD) | `{AI,ML}` | facet |
| `fundingAvailable` | boolean |  | Có học bổng/funding | `true` | boolean |
| `supervisorCount` | int |  | Số GVHD | `2` | none |

### Du học (du_hoc)

| Field | Kiểu | Đơn vị | Tiêu đề | Ví dụ | Lọc |
|---|---|---|---|---|---|
| `countries` | array |  | Quốc gia | `{Mỹ,Úc,Anh}` | facet |
| `services` | multi_enum |  | Dịch vụ (tư vấn/hồ sơ/visa/IELTS) | `{tu_van,visa}` | facet |
| `estCostPerYear` | money | VND | Chi phí ước tính/năm | `600000000` | range |
| `ieltsRequired` | number |  | IELTS tối thiểu | `6.0` | range |
| `intakeSeasons` | multi_enum |  | Kỳ nhập học | `{fall,spring}` | facet |
| `visaSupport` | boolean |  | Hỗ trợ visa | `true` | boolean |
| `scholarshipSupport` | boolean |  | Hỗ trợ học bổng | `true` | boolean |
| `partnerUniversities` | int |  | Số trường đối tác | `120` | range |
| `successRate` | percent | % | Tỉ lệ thành công | `98` | range |
| `depositRequired` | boolean |  | Yêu cầu đặt cọc | `true` | boolean |
| `branches` | int |  | Số văn phòng | `5` | none |

### Trung tâm (trung_tam)

| Field | Kiểu | Đơn vị | Tiêu đề | Ví dụ | Lọc |
|---|---|---|---|---|---|
| `courseTypes` | array |  | Loại khóa học | `{IELTS,giao_tiep}` | facet |
| `targetOutcome` | text |  | Cam kết đầu ra | `IELTS 6.5` | facet |
| `tuitionPerCourse` | money | VND | Học phí/khóa | `8000000` | range |
| `courseDurationWeeks` | int | tuần | Thời lượng khóa | `12` | range |
| `schedule` | multi_enum |  | Lịch học (tối/cuối tuần) | `{toi,cuoi_tuan}` | facet |
| `teacherType` | enum |  | Giáo viên (bản ngữ/VN/cả hai) | `ca_hai` | facet |
| `classSize` | int |  | Sĩ số/lớp | `15` | range |
| `placementTest` | boolean |  | Test xếp lớp | `true` | boolean |
| `trialClass` | boolean |  | Học thử | `true` | boolean |
| `onlineOption` | boolean |  | Học online | `true` | boolean |
| `outcomeCommitment` | boolean |  | Cam kết đầu ra | `true` | boolean |
| `branches` | int |  | Số chi nhánh | `8` | none |

## Phụ lục: giá trị enum

| Enum | Giá trị |
|---|---|
| `consent_channel` | `web`, `zalo`, `sms`, `email`, `miniapp`, `import` |
| `consent_type` | `ai_matching`, `ts_consulting`, `share_with_school`, `messaging`, `community`, `scholarship_offers`, `aggregate_analytics` |
| `dsr_status` | `received`, `in_progress`, `completed`, `rejected` |
| `dsr_type` | `access`, `rectify`, `erase`, `withdraw`, `export` |
| `education_level` | `mam_non`, `tieu_hoc`, `thcs`, `thpt`, `trung_cap`, `cao_dang`, `dai_hoc`, `thac_si`, `tien_si`, `du_hoc`, `trung_tam`, `gdtx` |
| `lead_status` | `new`, `firewalled`, `routed`, `accepted`, `rejected`, `contacted`, `booked`, `enrolled`, `lost` |
| `membership_status` | `invited`, `active`, `suspended` |
| `role` | `owner`, `admin`, `manager`, `member`, `client_viewer`, `partner`, `ts_internal`, `ts_data_ops`, `ts_dpo`, `ts_super_admin` |
| `segment` | `preschool`, `k12`, `university`, `study_abroad`, `mba`, `language_center` |
| `verification_status` | `unverified`, `claimed`, `verified` |

