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

Playbook Dược

Playbook Dược — Kê đơn điện tử & Cấp phát (Pharmacy)

Hướng dẫn tích hợp cho chuỗi kê đơn → (liên thông đơn thuốc quốc gia) → cấp phát → (sử dụng) → thanh toán BHYT. Trang minh hoạ phương án gửi bằng Bundle.type = transaction khi CapabilityStatement áp dụng cho máy chủ công bố hỗ trợ transaction.

Cùng bộ playbook: Ngoại trú · Cấp cứu · Nội trú · Chuyển tuyến.

Điểm khác biệt VN cốt lõi: đơn thuốc điện tử liên thông Hệ thống đơn thuốc quốc gia (mỗi đơn có mã đơn quốc gia); mã thuốc theo ATC + số đăng ký lưu hành + DM thuốc BHYT; phân biệt hoá dược (TT 26/2025/TT-BYT) vs YHCT (TT 27/2025/TT-BYT); cấp phát nội trú (khoa Dược) vs ngoại trú/nhà thuốc bán lẻ.

Ca minh hoạ tổng hợp: Nguyễn Văn An (tăng huyết áp) được kê Amlodipine 5mg × 30 viên, cấp phát BHYT 80% tại BV Chợ Rẫy ngày 22/3/2026. Tất cả Example Instance là dữ liệu tổng hợp, không phải hồ sơ người bệnh thật.

1. Phạm vi

Kê đơn → liên thông đơn quốc gia → cấp phát → (nội trú: sử dụng) → chi phí thuốc trong Claim. Áp dụng cho ngoại trú/cấp cứu/nội trú và nhà thuốc bán lẻ.

2. Vai trò triển khai và hệ thống

Bác sĩ kê đơn (HIS/EMR), Hệ thống đơn thuốc quốc gia (liên thông), khoa Dược/nhà thuốc (cấp phát), điều dưỡng (sử dụng nội trú), cổng BHXH.

3. Căn cứ pháp lý

TT 26/2025/TT-BYT (kê đơn hoá dược ngoại trú, hiệu lực 01/7/2025; Điều 12 liên thông đơn quốc gia + lĩnh thuốc trong 05 ngày); TT 27/2025/TT-BYT (thuốc dược liệu/YHCT BHYT); Luật Dược 105/2016 + Luật 44/2024/QH15; NĐ 163/2025/NĐ-CP; QĐ 3176/QĐ-BYT (MA_THUOC, SO_DANG_KY, NGAY_CAP, NGAY_TH_YL); QĐ 697/QĐ-BYT (chi phí thuốc).

4. Điều kiện tiên quyết

| # | Resource | Profile | Ghi chú VN | |—|—|—|—| | P1 | Bệnh nhân | VNCorePatient | CCCD là định danh cốt lõi; VNeID chỉ dùng cho xác thực/tích hợp | | P2 | Bác sĩ kê đơn | VNCorePractitioner | GPHN hiện hành, hoặc CCHN mang trạng thái cchn-transition-continued (NĐ 96/2023/NĐ-CP Điều 143 khoản 2) | | P3 | Cơ sở/nhà thuốc | VNCoreOrganization | mã cơ sở/nhà thuốc | | P4 | Thẻ BHYT (nếu có) | VNCoreCoverage | mức hưởng | | P5 | Danh mục thuốc | VNCoreMedication | ATC + số ĐKLH + mã thuốc BHYT |

5. Phương án gửi bằng Transaction Bundle

Khi máy chủ công bố hỗ trợ transaction, có thể gửi chuỗi kê đơn → cấp phát bằng transaction Bundle để áp dụng atomic. Ví dụ tổng hợp: Bundle-ExampleBundlePharmacyDispenseTransaction (Patient, Coverage, Encounter, MedicationRequest, MedicationDispense — PUT update-as-create). Hệ thống MAY dùng tương tác khác nếu CapabilityStatement và hợp đồng tích hợp cho phép. Đơn thuốc điện tử trọn bộ: ExampleBundleEPrescription. Chi tiết pattern xem Playbook Nội trú §5.

6. Sơ đồ luồng

MedicationRequest(kê đơn) ──▶ [Liên thông Hệ thống đơn thuốc quốc gia: gán mã đơn]
        │  identifier (mã đơn quốc gia), requester (GPHN hiện hành), medicationCodeableConcept (ATC + mã BHYT)
        ▼
MedicationDispense(cấp phát) ── authorizingPrescription ─▶ (lại) MedicationRequest
        │  whenHandedOver (NGAY_CAP), quantity, performer (dược sĩ/khoa/nhà thuốc)
        ▼
(nội trú) MedicationAdministration(sử dụng) ── request ─▶ MedicationRequest
        ▼
(BHYT) Claim.item.category = "thuốc" ─▶ ClaimResponse/EOB

7. Các bước gửi dữ liệu

| # | Bước | Profile | Element chính | Example | |—|—|—|—|—| | 1 | Thuốc (danh mục) | VNCoreMedication | code (ATC + số ĐKLH + mã BHYT), dạng bào chế | Amlodipine | | 2 | Kê đơn | VNCoreMedicationRequest | medicationCodeableConcept, dosageInstruction, requester (Practitioner/PractitionerRole có GPHN hiện hành), intent=order | Hypertension · YHCT: YHCT | | 3 | Mã đơn quốc gia | MedicationRequest.groupIdentifier (không phải identifier) | system = http://fhir.hl7.org.vn/core/sid/don-thuoc-quoc-gia (14 ký tự — VNPrescriptionCode NamingSystem) | QĐ 808/QĐ-BYT | | 4 | Cấp phát | VNCoreMedicationDispense | authorizingPrescription→MedicationRequest, whenHandedOver, quantity, performer.actor | OutpatientBHYT · Nội trú | | 5 | Sử dụng (nội trú) | VNCoreMedicationAdministration | effective[x] (NGAY_TH_YL), request→MedicationRequest | Nội trú | | 6 | BHYT | VNCoreClaim | item.category = thuốc (QĐ 697/QĐ-BYT) | BHYTSubmission |

Vì sao groupIdentifier chứ không phải identifier. Một đơn thuốc ngoại trú gồm NHIỀU MedicationRequest — mỗi thuốc một resource — nhưng chỉ có MỘT mã đơn quốc gia. identifier định danh từng dòng thuốc; groupIdentifier định danh cả đơn. VNCoreOutpatientPrescription đặt groupIdentifier 1..1 MS với system cố định và invariant định dạng vn-rx-outpatient-code-format, nên đặt mã vào identifier sẽ khiến resource không hợp lệ (thiếu phần tử bắt buộc). Đính chính 16/08/2026 — bản trước của bảng này chỉ sai chỗ.

8. Phụ lục terminology

ATC; số đăng ký lưu hành (VD/VS/QLĐB); DM thuốc BHYT; đơn vị UCUM; đường dùng (vn-medication-route-vs); YHCT vị thuốc/bài thuốc (QĐ 2552/3080, TT 27/2025/TT-BYT).

8b. Điều trị mạn tính — tái khám và lĩnh thuốc hằng tháng

Bổ sung 16/08/2026 sau khi rà từ góc người triển khai. Đây là ca chiếm phần lớn lượt ngoại trú (tăng huyết áp, đái tháo đường) nhưng trước đó IG chỉ mô tả một lượt kê đơn đơn lẻ.

Giới hạn số ngày — TT 26/2025/TT-BYT Điều 6 khoản 8 (thuốc hoá dược, sinh phẩm thông thường): mỗi thuốc tối đa 30 ngày; riêng bệnh thuộc Phụ lục VII của chính thông tư thì người kê đơn quyết định theo tình trạng lâm sàng và mức độ ổn định của người bệnh, tối đa 90 ngày. Điều 6 khoản 8 điểm a nêu rõ ngoại lệ này còn áp cho các điều 7, 8 và 9.

Thuốc gây nghiện — Điều 7 có chế độ riêng: mỗi lần kê tối đa 30 ngày nhưng phải ghi rõ ba đợt điều trị liên tiếp trên một đơn, mỗi đợt không quá 10 ngày, có ngày bắt đầu và kết thúc từng đợt. Thuốc hướng thần và tiền chất theo Điều 8, thuốc dạng phối hợp theo Điều 9 — tra thẳng thông tư, đừng suy từ giới hạn của Điều 6.

Điều 6 khoản 9 — nguyên văn: cần sửa chữa hay điều chỉnh thuốc trong đơn thì người kê đơn kê đơn mới thay thế đơn cũ. Quy định này nói về việc SỬA ĐƠN, không nói về việc tái khám định kỳ; văn bản không quy định mỗi lượt tái khám bắt buộc sinh mã đơn quốc gia mới.

Khuyến nghị thiết kế của IG (không phải quy định pháp luật): với mô hình khám định kỳ ở Việt Nam, mỗi lượt khám thường sinh một MedicationRequest mới gắn encounter của lượt đó, thay vì dùng dispenseRequest.numberOfRepeatsAllowed. Lý do là thực tế: mỗi lượt có chẩn đoán, chỉ định và hồ sơ BHYT riêng, nên một y lệnh "được cấp phát nhiều lần" khó đối chiếu với dữ liệu thanh toán theo lượt. Đây là khuyến nghị — nếu hợp đồng tích hợp của bạn dùng numberOfRepeatsAllowed một cách nhất quán thì IG không cấm.

Nối các lượt lại thành một quá trình điều trị:

Cần thể hiện Dùng gì
Quá trình điều trị dài hạn VNCoreEpisodeOfCare — gom mọi lượt khám của cùng một bệnh mạn tính
Kế hoạch điều trị và mục tiêu VNCoreCarePlan + VNCoreGoal (vd HbA1c mục tiêu)
Đơn của từng lượt VNCoreOutpatientPrescription mới mỗi lần, encounter trỏ lượt khám tương ứng
Quan hệ đơn mới thay đơn cũ MedicationRequest.priorPrescription trỏ đơn liền trước
Thuốc người bệnh đang thực dùng VNCoreMedicationStatement — khác MedicationRequest (y lệnh)
Theo dõi chỉ số qua các lần VNCoreObservationLab / sinh hiệu, cùng subject, khác effective[x]

Đừng nhầm priorPrescription với basedOn: priorPrescription nói "đơn này thay đơn kia", đúng nghĩa Điều 6 khoản 9; basedOn nói "thực hiện theo một yêu cầu khác".

8c. Mẫu bệnh phẩm bị từ chối và phải lấy lại

Ca thường gặp ở khoa xét nghiệm, trước đây chỉ nằm trong chú thích của một ví dụ.

Bước Biểu diễn
Chỉ định lần đầu VNCoreServiceRequest (status = active)
Mẫu không đạt VNCoreSpecimen với status = #unsatisfactory, condition ghi tình trạng (vd huyết tán)
Kết quả không thực hiện được VNCoreObservationLab status = #cancelled + dataAbsentReason = #error — xem ExampleObservationSpecimenError
Lấy lại mẫu VNCoreSpecimen mới. Hai cách đều hợp lệ, chọn theo quy trình của cơ sở: giữ cùng ServiceRequest nếu y lệnh chưa đóng, hoặc ra y lệnh mới (xem hàng dưới)
Ra y lệnh mới ServiceRequest mới với replaces trỏ chỉ định cũ — FHIR chỉ cho replaces khi request cũ đã completed hoặc terminated, nên phải đóng y lệnh cũ trước, không dùng replaces khi nó còn active
Kết quả đạt VNCoreObservationLab status = #final, specimen trỏ mẫu lấy lại

Hai khuyến nghị (không phải ràng buộc của IG — IG không có invariant nào cưỡng chế chúng): giữ lại Observation của lần hỏng thay vì xoá hay sửa đè, vì nó giải thích vì sao có hai lần lấy mẫu và vì sao thời gian trả kết quả kéo dài; và cân nhắc không tạo DiagnosticReport cho lần hỏng, vì báo cáo không mang kết quả nào thường ít giá trị cho bên đọc — trừ khi hợp đồng với LIS yêu cầu.

Lưu ý về ví dụ: chú thích trong ExampleObservationSpecimenError mô tả quy trình "tạo ServiceRequest mới". Đó là một trong hai cách nêu ở bảng trên, không phải cách duy nhất được phép.

Invariant hoàn thiện kết quả của VNCoreObservationLab chỉ áp cho final/amended/corrected, nên cancelled kèm dataAbsentReason là hợp lệ — đây là thiết kế có chủ ý, không phải lỗ hổng.

9. Danh sách kiểm tra hợp lệ + lỗi thường gặp

  • MedicationRequest có requester là Practitioner hoặc PractitionerRole liên kết người hành nghề có credential còn giá trị: GPHN đang hiệu lực, hoặc CCHN mang trạng thái cchn-transition-continued theo NĐ 96/2023/NĐ-CP Điều 143 khoản 2.
  • MedicationDispense.authorizingPrescription trỏ đúng MedicationRequest — không "cấp phát mồ côi" cho cấp phát ngoại trú/bán lẻ (VN-RULE-MED-002); nội trú gắn y lệnh khi có.
  • MedicationAdministration nên có request khép chuỗi (VN-RULE-MED-003).
  • quantity cấp phát ≤ số lượng kê (trừ quy tắc riêng).
  • Thuốc BHYT có mã DM thuốc BHYT hợp lệ khi đưa vào Claim.

Ví dụ OperationOutcome — cấp phát mồ côi:

{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"required",
"details":{"coding":[{"system":"http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs","code":"VN-RULE-MED-002"}],
"text":"MedicationDispense.authorizingPrescription là bắt buộc cho cấp phát ngoại trú/bán lẻ để bảo toàn chuỗi BHYT"},
"expression":["Bundle.entry[4].resource.authorizingPrescription"]}]}

10. Khoảng trống profile (GAP)

| GAP | Ảnh hưởng | Priority | |—|—|—| | Medication.batch (số lô/hạn dùng) | ✅ Đã đánh dấu MS trong VNCoreMedication (batch.lotNumber, batch.expirationDate) | resolved | | System mã đơn thuốc quốc gia | ✅ Đã bổ sung VNPrescriptionCode NamingSystem (QĐ 808/QĐ-BYT) | resolved | | MedicationStatement (tiền sử dùng thuốc) | ✅ Đã bổ sung VNCoreMedicationStatement | resolved |

✅ MedicationAdministration (sử dụng thuốc nội trú) đã có — VNCoreMedicationAdministration.

11. Liên thông Hệ thống CSDL về dược

Ngoài Hệ thống đơn thuốc quốc gia, cơ sở bán lẻ thuốc — bao gồm nhà thuốc bệnh viện — phải liên thông giao dịch nhập – xuất – kiểm kê với Hệ thống cơ sở dữ liệu về dược (api.csdlduoc.com.vn/v2) theo TT 11/2025/TT-BYT (Điều 5 khoản 2, từ 01/01/2026) và đặc tả API v1.1 ban hành kèm QĐ 232/QĐ-TTYQG (thay QĐ 522/QĐ-TTYQG). VN Core không profile hoá API này (chuẩn REST/JSON riêng, không phải FHIR); thay vào đó cung cấp bộ logical model làm field catalog + bảng ánh xạ hai chiều với các profile thuốc hiện có:

Nghiệp vụ Logical model Đích FHIR chủ đạo
Danh mục thuốc quốc gia (đồng bộ về) VNPharmacyDrugCatalogLM VNCoreMedication
Phiếu nhập hàng VNPharmacyStockInLM SupplyDelivery — ví dụ phiếu nhập từ nhà cung cấp
Phiếu xuất hàng (gồm bán lẻ) VNPharmacyStockOutLM VNCoreMedicationDispense (sale-retail) — ví dụ bán lẻ theo đơn điện tử; SupplyDelivery (nghiệp vụ khác)
Phiếu kiểm kho VNPharmacyStockTakingLM Không có resource R4 tương ứng (InventoryReport từ R5)

Lưu ý triển khai: cơ sở phải khai báo phiếu nhập tồn đầu kỳ trước khi liên thông giao dịch khác; xử lý bất đồng bộ (poll trạng thái accepted/processing/completed/error/rejected); ngày giờ API theo GMT+7 không ghi offset trong khi FHIR dateTime bắt buộc offset +07:00. Bảng ánh xạ chi tiết từng trường và các gap đã ghi nhận: xem wiki mapping "Liên thông Hệ thống CSDL về dược" trong kho tri thức dự án.

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

| Nếu cần | Đọc tiếp | |—|—| | Sử dụng thuốc nội trú | Playbook Nội trú | | Quy ước OperationOutcome | OperationOutcome & Registry | | Danh mục định danh | Registry định danh |

English Summary

Pharmacy integration playbook covering the prescribe → (national ePrescription interoperability) → dispense → administer → BHYT chain through a coherent synthetic Amlodipine scenario. It illustrates an atomic transaction Bundle (ExampleBundlePharmacyDispenseTransaction) when the applicable server CapabilityStatement advertises transaction support. Key Vietnamese specifics include the national prescription code, current GPHN-based practitioner identification, ATC/marketing-authorization/BHYT drug coding, and the distinction between conventional medicines and traditional medicines. The dispense-to-prescription link is enforced for outpatient/retail dispensing; inpatient administration is covered by VNCoreMedicationAdministration.