HL7 Vietnam VN Core FHIR Implementation Guide

Hướng dẫn triển khai FHIR cốt lõi Việt Nam — VN Core FHIR Implementation Guide
0.10.0 - Draft for Community Review Viet Nam cờ

Hướng dẫn triển khai FHIR cốt lõi Việt Nam — VN Core FHIR Implementation Guide - Draft for Community Review (v0.10.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions

Hướng dẫn chung

Hướng dẫn chung — General Guidance

Các quy tắc nền dưới đây áp dụng chung cho VN Core: cách biểu diễn tên, địa chỉ, định danh, pattern datatype và ranh giới giữa guidance chung với các trang chuyên đề.

Baseline quốc tế trước, Việt hoá sau

VN Core hiện tại đi theo nguyên tắc: dùng baseline quốc tế trước, rồi chỉ Việt hoá ở nơi thật sự cần.

  • Với resource và datatype, ưu tiên FHIR R4, IPS và extension chuẩn của HL7 nếu đã diễn đạt đúng ngữ nghĩa.
  • Chỉ localize khi Việt Nam có khác biệt thật về pháp lý, luồng công việc, định danh, địa chỉ hành chính hoặc bộ mã vận hành.
  • Nếu một khác biệt chỉ là cách hiển thị, cách search hoặc cách ánh xạ gateway, nên giải quyết ở tài liệu hướng dẫn hoặc lớp triển khai trước khi tạo thêm profile/extension.

Pattern dùng lại xuyên suốt nhiều hồ sơ

Không để mỗi profile tự định nghĩa lại một pattern cho cùng một datatype. Các pattern dùng lại được giữ ở trang diễn giải và quản trị thay vì lặp lại trong từng profile:

Pattern Vai trò trong VN Core hiện tại Đọc ở đâu
Identifier Chốt trạng thái hiện hành/lịch sử/ngừng dùng, system URI, search và precedence Danh mục định danh, Ánh xạ URI/OID
Address Chốt mô hình 2 cấp mới, dữ liệu legacy cấp huyện và quy tắc địa chỉ Việt Nam Trang này, Kiểm tra hợp lệ
Coding / CodeableConcept Chốt cách kết hợp mã quốc tế, mã Việt Nam, text, display, translation Hướng dẫn thuật ngữ
Dosage Chốt đường hướng reusable ngữ nghĩa cho medication luồng công việc, không lặp tuỳ tiện ở từng profile Profile FHIR, Hướng dẫn thuật ngữ

Must Support (MS)

Chi tiết cách diễn giải và cẩm nang HIS -> FHIR đã được tách sang trang riêng: Hướng dẫn Must Support.

Định nghĩa

Trong VN Core IG, khi một element được đánh dấu Must Support (MS), nghĩa là:

  • Hệ thống gửi (Sender): Nếu có dữ liệu cho element đó, PHẢI gửi kèm trong resource
  • Hệ thống nhận (Receiver): PHẢI xử lý được dữ liệu của element đó mà không gây lỗi (SHALL:no-error + SHALL:handle). Nghĩa vụ lưu trữ (SHALL:persist) chỉ áp cho actor giữ kho — Kho hồ sơ EMR; actor chỉ đọc như Citizen App và Data Requester không mang nghĩa vụ này (xem Tuân thủ theo vai trò)

Must Support KHÔNG có nghĩa là element đó bắt buộc phải có giá trị (required). Một element có thể vừa MS vừa 0..1 — nghĩa là không bắt buộc có, nhưng nếu có thì phải hỗ trợ.

Ví dụ — Must Support

Element Cardinality MS Giải thích
Patient.identifier[CCCD] 0..1 MS Lát CCCD không bắt buộc có mặt. Ràng buộc thật nằm ở invariant vn-patient-identifier-minimum: hồ sơ phải có ít nhất một định danh dùng được — CCCD hoặc hộ chiếu (HC) hoặc giấy khai sinh (GKS); nếu không có định danh quốc gia nào thì phải có mã bệnh nhân của cơ sở KÈM lý do bất khả kháng. Khi lát CCCD có mặt thì value là 1..1 và vn-cccd-format áp dụng
Patient.name 1..* MS Bắt buộc có và phải hỗ trợ
Patient.birthDate 1..1 MS Bắt buộc có phần tử; khi chưa biết giá trị, dùng cơ chế thiếu dữ liệu được profile cho phép

Xử lý khi thiếu dữ liệu

Khi element MS không có giá trị, hệ thống cần phân biệt cardinality:

  • Với element có cardinality tối thiểu lớn hơn 0, vẫn phải khai phần tử và dùng Data Absent Reason extension (http://hl7.org/fhir/StructureDefinition/data-absent-reason) khi profile cho phép.
  • Với element tuỳ chọn (0..x), có thể bỏ phần tử; không tạo element rỗng chỉ để biểu thị thiếu dữ liệu.

Tên tiếng Việt trong FHIR

Cấu trúc HumanName

Tên tiếng Việt có cấu trúc: Họ + Tên đệm + Tên gọi. Ánh xạ sang FHIR:

Thành phần VN FHIR Element Ví dụ
Họ HumanName.family "Nguyễn"
Tên đệm + Tên gọi HumanName.given (mảng) ["Văn", "An"]
Họ tên đầy đủ HumanName.text "Nguyễn Văn An"

Quy tắc

  1. text nên được điền khi nguồn có họ tên đầy đủ chính thức; VN Core đánh dấu name.text là 0..1 MS, không phải phần tử bắt buộc.
  2. Ánh xạ family và given theo cấu trúc tên do nguồn có thẩm quyền cung cấp; không suy ra máy móc chỉ từ vị trí từ đầu tiên.
  3. Giữ nguyên thứ tự các thành phần trong given; dùng text để bảo toàn cách viết chính thức.
  4. Dấu tiếng Việt: PHẢI giữ nguyên dấu Unicode (UTF-8). Không bỏ dấu, không chuyển ASCII
  5. use = official cho tên chính thức trên CCCD/giấy tờ

Ví dụ — Tên

{
  "name": [{
    "use": "official",
    "text": "Nguyễn Văn An",
    "family": "Nguyễn",
    "given": ["Văn", "An"]
  }]
}

Trường hợp đặc biệt

  • Tên 2 chữ (không có đệm): given chỉ có 1 phần tử. Ví dụ: Bảo Đại → family: "Bảo", given: ["Đại"]
  • Họ kép: family chứa toàn bộ họ kép. Ví dụ: "Tôn Thất" → family: "Tôn Thất"
  • Người nước ngoài: Dùng tên theo hộ chiếu, use: "official"

Địa chỉ Việt Nam

Cấu trúc VNCoreAddress

Địa chỉ Việt Nam sau NQ 202/2025/QH15 có 2 cấp chính (tỉnh + xã), nhưng VN Core vẫn hỗ trợ tương thích ngược:

Cấp FHIR Element CodeSystem Ghi chú
Tỉnh/TP Extension vn-ext-province VNProvinceCS 0..1 MS, history binding; tập chọn hiện hành có 34 mã tại 20/09/2026
Huyện/Quận Address.district VNDistrictCS để tra mã nhà nước ba chữ số khi có bằng chứng Trường FHIR vẫn là tên dạng text, chỉ dùng cho dữ liệu lịch sử
Xã/Phường Extension vn-ext-ward VNWardCS Cấp 2 chính thức
Số nhà, đường Address.line — Text tự do
Quốc gia Address.country ISO 3166 "VN"

Địa chỉ chỉ có text

VNCoreAddress hỗ trợ chính thức địa chỉ chỉ có text, kể cả khi country = "VN". Không tạo mã giả, extension rỗng hoặc data-absent-reason chỉ để thay một mã tỉnh/xã chưa biết. province và ward là 0..1 MS: gửi mã đã xác minh khi nguồn có; bên nhận phải xử lý được khi mã được cung cấp. Bổ sung mã không làm mất hoặc tự thay đổi địa chỉ gốc. Tên xã/phường giữ trong text hoặc line; không dùng Address.city cho cấp xã.

Ví dụ: Patient có địa chỉ dạng chữ và Organization có địa chỉ dạng chữ.

Tương thích ngược

Giữ text, mã và ngày hồ sơ nguồn. Ba CodeSystem dùng chung canonical theo cấp cho mã đã thu nhận; history ValueSet không chứng minh hiệu lực tại một ngày. Danh sách chọn mới lấy từ vn-province-vs và vn-ward-vs tại mốc của bản dữ liệu. $lookup(date) chỉ trả tên/cha trong khoảng có bằng chứng; thiếu ngày hoặc thiếu khoảng trả không đủ căn cứ. Không tự dùng Address.period làm ngày hồ sơ.

Mã huyện nhà nước gồm ba chữ số. Với nguồn TMS hoặc mã ghép tỉnh+huyện năm chữ số, dùng registry chuyển biểu diễn với hệ mã và phiên bản tường minh; không cắt chuỗi để đoán mã. Danh mục content=fragment giữ 716 mã huyện quan sát được, không gán cùng ngày kết thúc cho mọi huyện. NQ 203/2025/QH15 Điều 2 khoản 2 quy định kết thúc hoạt động cấp huyện từ 01/07/2025; nghị quyết này không chứng minh từng huyện còn tồn tại ngay trước mốc đó. Xem hướng dẫn chuyển đổi.


Hệ thống định danh (Identifier)

Để tra cứu tập trung các NamingSystem, xem thêm Danh mục định danh. Để bắc cầu với OID hoặc hệ thống cũ, xem Ánh xạ URI/OID.

Thứ tự ưu tiên

Identifier NamingSystem Ưu tiên Ghi chú
Số CCCD $VN-CCCD Cao nhất 12 chữ số, trục định danh chính
Mã số BHXH — Cao 10 chữ số, liên thông BHXH
Số thẻ/mã số BHYT $VN-BHYT Cao 10 chữ số hiện hành (trùng giá trị mã số BHXH) hoặc 15 ký tự lịch sử; CCCD 12 chữ số dùng $VN-CCCD, không thuộc namespace BHYT
GPHN $VN-GPHN Trung bình Định danh hành nghề hiện hành cho người hành nghề
CCHN $VN-CCHN Chuyển tiếp Tiếp tục dùng như GPHN đến khi chuyển đổi (NĐ 96/2023/NĐ-CP Đ143.2, mốc 2030/2035); KHÔNG suy trạng thái từ loại định danh
Mã CSKCB $VN-CSKCB Trung bình Dùng cho cơ sở y tế
MRN $VN-MRN Bệnh viện Mã bệnh nhân nội bộ
XML1_ID / mã phản hồi gateway BHYT $VN-BHYT-GATEWAY-RESPONSE-ID Lớp BHYT Submission Dùng cho ClaimResponse.identifier, không thay thế MA_LK

CCCD: CCCD là định danh cá nhân lõi cho công dân Việt Nam trong VN Core.
VNeID: VNeID là tài khoản định danh điện tử và kênh truy cập của ứng dụng người dân; chỉ nên dùng ở lớp ứng dụng người dân, xác thực hoặc tích hợp, không dùng song song với CCCD như một định danh người bệnh chính.

Khi chưa có CCCD

CCCD là lát cắt định danh chính, nhưng không phải lát cắt bắt buộc: identifier[CCCD] là 0..1. Điều kiện phải thoả là invariant vn-patient-identifier-minimum — có ít nhất một định danh dùng được. Ba tình huống:

Tình huống Cách biểu diễn khuyến nghị
Trẻ sơ sinh / trẻ nhỏ chưa có CCCD nhưng đã có giấy khai sinh Bỏ hẳn lát identifier[CCCD]; dùng identifier[GKS]
Người nước ngoài hoặc người bệnh dùng định danh thay thế hợp lệ Bỏ hẳn lát identifier[CCCD]; dùng identifier[HC] và citizenship phù hợp
Ca cấp cứu / bất khả kháng / chưa xác định được danh tính Dùng mã bệnh nhân của cơ sở (identifier[MRN]) KÈM forceMajeureReason hợp lệ

Hai lưu ý dễ làm sai:

  • data-absent-reason trên CCCD không miễn được invariant. Nó nói "không có giá trị", không nói "vì sao được phép không có". Bơm một lát CCCD rỗng chỉ để giữ chỗ là thừa, và vì identifier[CCCD].value là 1..1 nên cách làm đó dễ sinh lỗi validate hơn là bỏ hẳn lát.
  • Không dùng forceMajeureReason để mô tả người bệnh có định danh thay thế hợp lệ như hộ chiếu hoặc giấy khai sinh — đó là ca có định danh, không phải ca bất khả kháng.

Cấu trúc CCCD

Số CCCD 12 chữ số mã hoá thông tin:

  • Vị trí 1-3: Mã prefix nơi đăng ký khai sinh theo danh mục BCA
  • Vị trí 4: Giới tính + thế kỷ sinh (0=Nam/19xx, 1=Nữ/19xx, 2=Nam/20xx, 3=Nữ/20xx)
  • Vị trí 5-6: 2 chữ số cuối năm sinh
  • Vị trí 7-12: Số ngẫu nhiên

Mã prefix BCA này là terminology hỗ trợ validation cho CCCD đã cấp và không thay thế cho VNProvinceCS dùng trong địa chỉ hành chính hiện hành.

Chi tiết kiểm tra hợp lệ: xem Hướng dẫn kiểm tra hợp lệ

Tìm kiếm và so khớp định danh

  • Với CCCD, BHYT, BHXH, GPHN, CCHN, MA_LK, MA_LUOT_KCB và mã phản hồi gateway BHYT, nên coi tìm kiếm là truy vấn nghiệp vụ chính xác theo kiểu token khi hệ thống công bố search tương ứng.
  • Không nên biến tìm kiếm theo định danh thành tìm kiếm mờ theo văn bản tự do.
  • Các hành vi normalize như bỏ khoảng trắng hoặc chuẩn hoá dấu gạch nối chỉ nên là hành vi nội bộ và cần công bố rõ nếu có.

Chi tiết xem Hành vi tìm kiếm.


Organization và Location

Không trộn 4 khái niệm khác nhau

Khi triển khai Organization và Location, VN Core tách riêng:

Khái niệm Tài nguyên Ghi chú
Hạng pháp lý của cơ sở KCB vn-ext-org-rank Chỉ cho cơ sở KCB theo TT 06/2024/TT-BYT
Hạng pháp lý của đơn vị y tế không phải cơ sở KCB vn-ext-health-unit-rank Cho y tế dự phòng, TTYT, kiểm nghiệm, kiểm định
Cấp KCB hiện hành vn-ext-facility-care-level 3 cấp theo Luật KCB 2023 + NĐ 96/2023/NĐ-CP
Tuyến chuyên môn kỹ thuật lịch sử vn-ext-legacy-technical-line Chỉ dùng cho dữ liệu cũ / chuyển đổi

vn-ext-org-level chỉ biểu diễn cấp quản lý hành chính y tế hiện hành, không thay cho tuyến kỹ thuật cũ.

Khuyến nghị điền dữ liệu

  • Bệnh viện/phòng khám: ưu tiên organizationType, organizationLevel, facilityCareLevel; chỉ điền organizationRank khi có căn cứ pháp lý rõ.
  • Trạm y tế: thường không có hạng pháp lý, nên dùng organizationRankStatus = not-applicable nếu cần diễn đạt rõ.
  • CDC/đơn vị dự phòng/kiểm nghiệm: dùng healthUnitRank, không dùng organizationRank.
  • Location không mang hạng pháp lý; chỉ nên mang facilityCareLevel khi địa điểm được quản trị như một phân hệ chuyên môn riêng.

Chi tiết: xem Quản trị Organization và Location.


Mức độ ràng buộc (Binding Strength)

VN Core IG sử dụng các mức binding theo FHIR:

Binding Ý nghĩa Ví dụ trong VN Core
Required Mã phải thuộc ValueSet VNEthnicityVS (54 dân tộc)
Extensible Nếu ValueSet có khái niệm phù hợp, phải dùng mã trong ValueSet; chỉ dùng mã ngoài khi không có khái niệm phù hợp VNConditionCodeVS (ICD-10 VN)
Preferred Khuyến khích dùng mã trong ValueSet; mã ngoài vẫn hợp lệ —
Example ValueSet chỉ dùng để minh hoạ —

Quy ước URL

Loại Mẫu URL Ví dụ
Profile FHIR http://fhir.hl7.org.vn/core/StructureDefinition/{id} .../vn-core-patient
Phần mở rộng (Extension) http://fhir.hl7.org.vn/core/StructureDefinition/{id} .../vn-ext-ethnicity
CodeSystem http://fhir.hl7.org.vn/core/CodeSystem/{id} .../vn-ethnicity-cs
ValueSet http://fhir.hl7.org.vn/core/ValueSet/{id} .../vn-ethnicity-vs
NamingSystem http://fhir.hl7.org.vn/core/NamingSystem/{id} .../vn-cccd-ns

Liên hệ với các trang khác

Nếu cần Nên đọc tiếp
Hiểu quy tắc tìm kiếm chuỗi có dấu tiếng Việt và chuẩn hoá Unicode Tìm kiếm chuỗi và Unicode
Nắm hành vi tìm kiếm của FHIR server và cách so khớp định danh Hành vi tìm kiếm
Tra cứu tập trung các NamingSystem và ánh xạ URI/OID Danh mục định danh
Diễn giải Must Support và cẩm nang ánh xạ HIS → FHIR Hướng dẫn Must Support
Quy trình phát hành, versioning và quản trị IG Phát hành và quản trị

English Summary

VN Core defines shared rules for Vietnamese names, addresses, identifiers, organizations, locations and terminology bindings. Administrative codes use stable canonicals; names and parentage require evidence at the record date. Text-only addresses remain supported. Historical membership does not establish temporal validity. Must Support requirements are explained separately.