@prefix fhir: <http://hl7.org/fhir/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

# - resource -------------------------------------------------------------------

<http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs> a fhir:CodeSystem ;
  fhir:nodeRole fhir:treeRoot ;
  fhir:id [ fhir:v "vn-validation-rule-cs"] ; # 
  fhir:language [ fhir:v "vi"] ; # 
  fhir:text [
     fhir:status [ fhir:v "generated" ] ;
     fhir:div [ fhir:v "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p class=\"res-header-id\"><b>Generated Narrative: CodeSystem vn-validation-rule-cs</b></p><a name=\"vn-validation-rule-cs\"> </a><a name=\"hcvn-validation-rule-cs\"> </a><p><b>Properties</b></p><p><b>This code system defines the following properties for its concepts</b></p><table class=\"grid\"><tr><td><b>Name</b></td><td><b>Code</b></td><td><b>URI</b></td><td><b>Type</b></td><td><b>Description</b></td></tr><tr><td>severity</td><td>severity</td><td>http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#severity</td><td>string</td><td>Mức độ trả về trong OperationOutcome: error | warning | information</td></tr><tr><td>tier</td><td>tier</td><td>http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#tier</td><td>string</td><td>Tầng kiểm tra: tier-1 (FHIRPath invariant), tier-2 (server-side), tier-3 (business rule)</td></tr><tr><td>category</td><td>category</td><td>http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#category</td><td>string</td><td>Phân loại căn cứ: normative-data-standard | legal-business-rule | profile-conformance | technical-quality-guardrail | source-exception</td></tr><tr><td>expression</td><td>expression</td><td>http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#expression</td><td>string</td><td>Biểu thức FHIRPath hoặc tóm tắt quy tắc kiểm tra</td></tr><tr><td>invariant</td><td>invariant</td><td>http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#invariant</td><td>string</td><td>Tên FHIRPath invariant tương ứng trong profile (nếu là tier-1)</td></tr><tr><td>legalBasis</td><td>legalBasis</td><td>http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#legalBasis</td><td>string</td><td>Căn cứ pháp lý/chuẩn dữ liệu cho quy tắc</td></tr></table><p><b>Concepts</b></p><p>This case-sensitive code system <code>http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs</code> defines the following codes:</p><table class=\"codes\"><tr><td style=\"white-space:nowrap\"><b>Code</b></td><td><b>Display</b></td><td><b>Definition</b></td><td><b>severity</b></td><td><b>tier</b></td><td><b>category</b></td><td><b>expression</b></td><td><b>invariant</b></td><td><b>legalBasis</b></td><td><b>English (English, en)</b></td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-PAT-001<a name=\"vn-validation-rule-cs-VN-RULE-PAT-001\"> </a></td><td>Số CCCD phải đúng 12 chữ số</td><td>Giá trị identifier[CCCD] phải khớp [0-9]{12}. Sửa: chuẩn hóa số CCCD 12 số; nếu là CMND cũ 9 số dùng slice/identifier khác.</td><td>error</td><td>tier-1</td><td>normative-data-standard</td><td>Patient.identifier.where(system='.../sid/cccd').value.matches('[0-9]{12}')</td><td>vn-cccd-format</td><td>Luật Căn cước 2023 Điều 20</td><td>CCCD number must be exactly 12 digits</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-PAT-002<a name=\"vn-validation-rule-cs-VN-RULE-PAT-002\"> </a></td><td>Chữ số thứ 4 của CCCD không phù hợp giới tính</td><td>Chữ số thứ 4 mã hóa giới tính/thế kỷ: nam→chẵn, nữ→lẻ. Cảnh báo vì có thể có ca chuyển giới chưa cập nhật CCCD. Kiểm tra phía server.</td><td>warning</td><td>tier-2</td><td>technical-quality-guardrail</td><td/><td/><td>Luật Căn cước 2023</td><td>The 4th digit of CCCD does not match gender</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-PAT-003<a name=\"vn-validation-rule-cs-VN-RULE-PAT-003\"> </a></td><td>Mã xã/phường không thuộc tỉnh/TP đã chọn</td><td>Khi có cả extension[province] và extension[ward], mã xã (5 số) phải thuộc tỉnh (2 số). Tra bảng ĐVHC theo thời điểm hiệu lực. Kiểm tra phía server.</td><td>error</td><td>tier-2</td><td>normative-data-standard</td><td/><td/><td>QĐ 19/2025/QĐ-TTg; NQ 202/2025/QH15</td><td>Commune/ward code is not within selected province/city</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-PAT-004<a name=\"vn-validation-rule-cs-VN-RULE-PAT-004\"> </a></td><td>Cấp cứu: cho phép Patient chỉ có identifier tạm</td><td>Trong cấp cứu, KHÔNG chặn tạo hồ sơ vì thiếu CCCD. Cho phép POST Patient với identifier tạm (use=temp) để xử trí trước, định danh sau. Quy tắc cho phép (permissive), không phải lỗi.</td><td>information</td><td>tier-3</td><td>profile-conformance</td><td/><td/><td>QĐ 01/2008/QĐ-BYT (cấp cứu xử trí trước)</td><td>Emergency: allow Patient to have only a temporary identifier</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-PAT-005<a name=\"vn-validation-rule-cs-VN-RULE-PAT-005\"> </a></td><td>Hợp nhất hồ sơ phải dùng Patient.link, không tạo định danh trùng</td><td>Khi merge hồ sơ tạm với hồ sơ CCCD chính thức: dùng Patient.link (replaced-by/replaces), chuyển hồ sơ tạm active=false. KHÔNG xóa cứng, KHÔNG tạo định danh y tế (VHN) trùng. Kiểm tra phía server.</td><td>error</td><td>tier-2</td><td>profile-conformance</td><td/><td/><td/><td>Record merge shall use Patient.link, do not create duplicate identifiers</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-ADDR-001<a name=\"vn-validation-rule-cs-VN-RULE-ADDR-001\"> </a></td><td>Địa chỉ Việt Nam phải có extension:province</td><td>Địa chỉ có country='VN' nên có extension:province. Sửa: bổ sung mã tỉnh theo VNProvinceCS.</td><td>warning</td><td>tier-1</td><td>profile-conformance</td><td/><td>vn-addr-province</td><td/><td>Vietnam address must include extension:province</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-ENC-001<a name=\"vn-validation-rule-cs-VN-RULE-ENC-001\"> </a></td><td>Encounter.serviceProvider là bắt buộc</td><td>Lượt khám phải gắn cơ sở KCB chịu trách nhiệm. Sửa: thêm Encounter.serviceProvider trỏ VNCoreOrganization.</td><td>error</td><td>tier-1</td><td>profile-conformance</td><td>Encounter.serviceProvider.exists()</td><td/><td>QĐ 3176/QĐ-BYT</td><td>Encounter.serviceProvider is required</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-ENC-002<a name=\"vn-validation-rule-cs-VN-RULE-ENC-002\"> </a></td><td>Encounter.period không được chồng lấn cho cùng bệnh nhân</td><td>Trừ encounter lồng nhau, các period của cùng bệnh nhân không nên overlap. Kiểm tra phía server.</td><td>warning</td><td>tier-3</td><td>technical-quality-guardrail</td><td/><td/><td/><td>Encounter.period must not overlap for the same patient</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-CON-001<a name=\"vn-validation-rule-cs-VN-RULE-CON-001\"> </a></td><td>Mỗi Condition chỉ nên ghi 1 chẩn đoán</td><td>1 resource Condition = 1 mã chẩn đoán (không gộp đa chẩn đoán). Sửa: tách thành nhiều Condition.</td><td>warning</td><td>tier-3</td><td>profile-conformance</td><td/><td/><td/><td>Each Condition should contain only one diagnosis</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-MED-002<a name=\"vn-validation-rule-cs-VN-RULE-MED-002\"> </a></td><td>Cấp phát ngoại trú/bán lẻ phải có authorizingPrescription</td><td>Không cấp phát 'mồ côi': cấp phát ngoại trú/nhà thuốc bán lẻ (category=outpatient/community) phải trỏ về VNCoreMedicationRequest để bảo toàn chuỗi kê đơn → cấp phát → thanh toán BHYT. Cấp phát nội trú từ tủ trực/khoa Dược nên gắn y lệnh khi có y lệnh tương ứng (vd ExampleMedicationDispenseInpatientAntibiotic → ExampleMedicationRequestCefotaximeInpatient).</td><td>error</td><td>tier-3</td><td>profile-conformance</td><td>MedicationDispense.category.coding.where(code='outpatient' or code='community').exists() implies MedicationDispense.authorizingPrescription.exists()</td><td/><td>TT 26/2025/TT-BYT; QĐ 3176/QĐ-BYT</td><td>Outpatient/retail dispensing must include authorizingPrescription</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-MED-003<a name=\"vn-validation-rule-cs-VN-RULE-MED-003\"> </a></td><td>MedicationAdministration nên liên kết y lệnh (request)</td><td>Sự kiện dùng thuốc nên trỏ về MedicationRequest để khép chuỗi y lệnh → cấp phát → sử dụng. Sửa: thêm MedicationAdministration.request.</td><td>warning</td><td>tier-3</td><td>profile-conformance</td><td/><td/><td/><td>MedicationAdministration should reference medication request order</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-CLM-001<a name=\"vn-validation-rule-cs-VN-RULE-CLM-001\"> </a></td><td>Claim phải có đúng 1 thẻ BHYT chính (focal=true)</td><td>Một hồ sơ thanh toán có đúng 1 insurance.focal=true; thẻ bổ trợ dùng focal=false. Sửa: đánh dấu đúng thẻ chính.</td><td>error</td><td>tier-1</td><td>profile-conformance</td><td>Claim.insurance.where(focal=true).count() = 1</td><td/><td>QĐ 697/QĐ-BYT; NĐ 188/2025/NĐ-CP Đ22</td><td>Claim must have exactly one primary health insurance card (focal=true)</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-CLM-014<a name=\"vn-validation-rule-cs-VN-RULE-CLM-014\"> </a></td><td>Số ngày giường phải khớp số ngày nằm viện</td><td>Số lượng item nhóm chi phí ngày giường (cost-category 2.2) phải khớp số ngày Encounter.period.end − period.start. Kiểm tra phía server.</td><td>error</td><td>tier-2</td><td>legal-business-rule</td><td/><td/><td>QĐ 697/QĐ-BYT</td><td>Number of bed-days must match length of stay</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-BHYT-001<a name=\"vn-validation-rule-cs-VN-RULE-BHYT-001\"> </a></td><td>Thiếu SO_CCCD nhưng không có mã lý do bất khả kháng</td><td>Khi xuất dữ liệu BHXH (QĐ 3176), SO_CCCD bắt buộc; nếu trống phải có Patient.extension[force-majeure-reason]. Kiểm tra phía server/gateway.</td><td>error</td><td>tier-2</td><td>normative-data-standard</td><td/><td/><td>QĐ 3176/QĐ-BYT</td><td>Missing SO_CCCD without exemption reason code</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-BHYT-002<a name=\"vn-validation-rule-cs-VN-RULE-BHYT-002\"> </a></td><td>MA_LK phải nhất quán trên toàn bộ hồ sơ gửi</td><td>MA_LK là khóa liên kết hồ sơ một đợt KCB; Claim.identifier[MALK] và Bundle.identifier phải cùng giá trị cho mọi resource liên quan. Kiểm tra phía server.</td><td>error</td><td>tier-2</td><td>normative-data-standard</td><td/><td/><td>QĐ 3176/QĐ-BYT</td><td>MA_LK must be consistent across all submitted records</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-BHYT-003<a name=\"vn-validation-rule-cs-VN-RULE-BHYT-003\"> </a></td><td>Ngày giờ xuất cổng BHXH phải theo định dạng yyyyMMddHHmm</td><td>Trường ngày giờ xuất/gateway (NGAY_VAO, NGAY_RA, NGAY_YL...) phải đúng yyyyMMddHHmm ở lớp export. Kiểm tra phía server/gateway.</td><td>error</td><td>tier-2</td><td>normative-data-standard</td><td/><td/><td>QĐ 3176/QĐ-BYT</td><td>BHXH discharge timestamp must follow format yyyyMMddHHmm</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-BDL-001<a name=\"vn-validation-rule-cs-VN-RULE-BDL-001\"> </a></td><td>Mỗi entry trong transaction Bundle phải có request.method và request.url</td><td>Bundle.type=transaction yêu cầu mỗi entry có request.method + request.url (FHIR bdl-3). Sửa: bổ sung request cho mọi entry.</td><td>error</td><td>tier-1</td><td>profile-conformance</td><td>Bundle.where(type='transaction').entry.all(request.method.exists() and request.url.exists())</td><td/><td>FHIR R4 bdl-3; NĐ 164/2025/NĐ-CP</td><td>Each entry in a transaction Bundle must have request.method and request.url</td></tr><tr><td style=\"white-space:nowrap\">VN-RULE-TERM-001<a name=\"vn-validation-rule-cs-VN-RULE-TERM-001\"> </a></td><td>Mã không thuộc ValueSet có binding required</td><td>Mã coding không nằm trong ValueSet ràng buộc required của phần tử. Sửa: dùng mã hợp lệ từ ValueSet (vd ICD-10 VN, nhóm chi phí QĐ 697).</td><td>error</td><td>tier-1</td><td>normative-data-standard</td><td/><td/><td/><td>Code not in required-bound ValueSet</td></tr></table></div>"^^rdf:XMLLiteral ]
  ] ; # 
  fhir:url [
     fhir:v "http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs"^^xsd:anyURI ;
     fhir:l <http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs>
  ] ; # 
  fhir:version [ fhir:v "0.6.0"] ; # 
  fhir:name [ fhir:v "VNValidationRuleCS"] ; # 
  fhir:title [ fhir:v "Registry quy tắc kiểm tra hợp lệ VN Core — VN Core Validation Rule Registry"] ; # 
  fhir:status [ fhir:v "draft"] ; # 
  fhir:experimental [ fhir:v false] ; # 
  fhir:date [ fhir:v "2026-06-03"^^xsd:date] ; # 
  fhir:publisher [ fhir:v "Omi HealthTech / VN Core FHIR Community Initiative"] ; # 
  fhir:contact ( [
     fhir:name [ fhir:v "Omi HealthTech / VN Core FHIR Community Initiative" ] ;
     fhir:telecom ( [
       fhir:system [ fhir:v "url" ] ;
       fhir:value [ fhir:v "https://hl7.org.vn" ]
     ] [
       fhir:system [ fhir:v "email" ] ;
       fhir:value [ fhir:v "info@hl7.org.vn" ]
     ] )
  ] [
     fhir:name [ fhir:v "Omi HealthTech (OmiGroup)" ] ;
     fhir:telecom ( [
       fhir:system [ fhir:v "url" ] ;
       fhir:value [ fhir:v "https://omihealthtech.vn" ]
     ] [
       fhir:system [ fhir:v "url" ] ;
       fhir:value [ fhir:v "https://omigroup.vn" ]
     ] [
       fhir:system [ fhir:v "email" ] ;
       fhir:value [ fhir:v "info@hl7.org.vn" ]
     ] )
  ] ) ; # 
  fhir:description [ fhir:v "Danh mục mã quy tắc kiểm tra hợp lệ (rule code) của VN Core — registry machine-readable cho từng quy tắc validate, ánh xạ sang `OperationOutcome.issue.details.coding` khi máy chủ trả lỗi.\n\nThiết kế FHIR-native (CodeSystem có property) thay cho mô hình bảng tính phân tán: mỗi mã rule mang sẵn severity, tầng kiểm tra (tier), phân loại căn cứ, biểu thức FHIRPath/quy tắc, tên invariant (nếu có) và căn cứ pháp lý.\n\nCách dùng trong OperationOutcome:\n- `issue.details.coding.system` = `http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs`\n- `issue.details.coding.code` = mã rule (vd `VN-RULE-ENC-001`)\n- `issue.details.text` = thông điệp (display)\n- `issue.expression` = FHIR path vi phạm\n- `issue.severity` = theo property `severity` của mã\n\nBổ trợ cho trang [Hướng dẫn kiểm tra hợp lệ](validation-guidance.html) (chi tiết 3 tầng) và [OperationOutcome & Registry quy tắc](validation-and-operationoutcome.html) (quy ước phản hồi).\n/\nVN Core validation rule registry: a machine-readable CodeSystem mapping each validation rule to an OperationOutcome details coding, with severity, tier, category, FHIRPath expression, invariant name, and legal basis."] ; # 
  fhir:jurisdiction ( [
     fhir:coding ( [
       fhir:system [
         fhir:v "urn:iso:std:iso:3166"^^xsd:anyURI ;
         fhir:l <urn:iso:std:iso:3166>
       ] ;
       fhir:code [ fhir:v "VN" ] ;
       fhir:display [ fhir:v "Viet Nam" ]
     ] )
  ] ) ; # 
  fhir:caseSensitive [ fhir:v true] ; # 
  fhir:content [ fhir:v "complete"] ; # 
  fhir:count [ fhir:v "18"^^xsd:nonNegativeInteger] ; # 
  fhir:property ( [
     fhir:code [ fhir:v "severity" ] ;
     fhir:uri [
       fhir:v "http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#severity"^^xsd:anyURI ;
       fhir:l <http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#severity>
     ] ;
     fhir:description [ fhir:v "Mức độ trả về trong OperationOutcome: error | warning | information" ] ;
     fhir:type [ fhir:v "string" ]
  ] [
     fhir:code [ fhir:v "tier" ] ;
     fhir:uri [
       fhir:v "http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#tier"^^xsd:anyURI ;
       fhir:l <http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#tier>
     ] ;
     fhir:description [ fhir:v "Tầng kiểm tra: tier-1 (FHIRPath invariant), tier-2 (server-side), tier-3 (business rule)" ] ;
     fhir:type [ fhir:v "string" ]
  ] [
     fhir:code [ fhir:v "category" ] ;
     fhir:uri [
       fhir:v "http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#category"^^xsd:anyURI ;
       fhir:l <http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#category>
     ] ;
     fhir:description [ fhir:v "Phân loại căn cứ: normative-data-standard | legal-business-rule | profile-conformance | technical-quality-guardrail | source-exception" ] ;
     fhir:type [ fhir:v "string" ]
  ] [
     fhir:code [ fhir:v "expression" ] ;
     fhir:uri [
       fhir:v "http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#expression"^^xsd:anyURI ;
       fhir:l <http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#expression>
     ] ;
     fhir:description [ fhir:v "Biểu thức FHIRPath hoặc tóm tắt quy tắc kiểm tra" ] ;
     fhir:type [ fhir:v "string" ]
  ] [
     fhir:code [ fhir:v "invariant" ] ;
     fhir:uri [
       fhir:v "http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#invariant"^^xsd:anyURI ;
       fhir:l <http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#invariant>
     ] ;
     fhir:description [ fhir:v "Tên FHIRPath invariant tương ứng trong profile (nếu là tier-1)" ] ;
     fhir:type [ fhir:v "string" ]
  ] [
     fhir:code [ fhir:v "legalBasis" ] ;
     fhir:uri [
       fhir:v "http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#legalBasis"^^xsd:anyURI ;
       fhir:l <http://fhir.hl7.org.vn/core/CodeSystem/vn-validation-rule-cs#legalBasis>
     ] ;
     fhir:description [ fhir:v "Căn cứ pháp lý/chuẩn dữ liệu cho quy tắc" ] ;
     fhir:type [ fhir:v "string" ]
  ] ) ; # 
  fhir:concept ( [
     fhir:code [ fhir:v "VN-RULE-PAT-001" ] ;
     fhir:display [ fhir:v "Số CCCD phải đúng 12 chữ số" ] ;
     fhir:definition [ fhir:v "Giá trị identifier[CCCD] phải khớp [0-9]{12}. Sửa: chuẩn hóa số CCCD 12 số; nếu là CMND cũ 9 số dùng slice/identifier khác." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "CCCD number must be exactly 12 digits" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "error"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-1"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "normative-data-standard"
       ]
     ] [
       fhir:code [ fhir:v "expression" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "Patient.identifier.where(system='.../sid/cccd').value.matches('[0-9]{12}')"
       ]
     ] [
       fhir:code [ fhir:v "invariant" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "vn-cccd-format"
       ]
     ] [
       fhir:code [ fhir:v "legalBasis" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "Luật Căn cước 2023 Điều 20"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-PAT-002" ] ;
     fhir:display [ fhir:v "Chữ số thứ 4 của CCCD không phù hợp giới tính" ] ;
     fhir:definition [ fhir:v "Chữ số thứ 4 mã hóa giới tính/thế kỷ: nam→chẵn, nữ→lẻ. Cảnh báo vì có thể có ca chuyển giới chưa cập nhật CCCD. Kiểm tra phía server." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "The 4th digit of CCCD does not match gender" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "warning"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-2"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "technical-quality-guardrail"
       ]
     ] [
       fhir:code [ fhir:v "legalBasis" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "Luật Căn cước 2023"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-PAT-003" ] ;
     fhir:display [ fhir:v "Mã xã/phường không thuộc tỉnh/TP đã chọn" ] ;
     fhir:definition [ fhir:v "Khi có cả extension[province] và extension[ward], mã xã (5 số) phải thuộc tỉnh (2 số). Tra bảng ĐVHC theo thời điểm hiệu lực. Kiểm tra phía server." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "Commune/ward code is not within selected province/city" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "error"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-2"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "normative-data-standard"
       ]
     ] [
       fhir:code [ fhir:v "legalBasis" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "QĐ 19/2025/QĐ-TTg; NQ 202/2025/QH15"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-PAT-004" ] ;
     fhir:display [ fhir:v "Cấp cứu: cho phép Patient chỉ có identifier tạm" ] ;
     fhir:definition [ fhir:v "Trong cấp cứu, KHÔNG chặn tạo hồ sơ vì thiếu CCCD. Cho phép POST Patient với identifier tạm (use=temp) để xử trí trước, định danh sau. Quy tắc cho phép (permissive), không phải lỗi." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "Emergency: allow Patient to have only a temporary identifier" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "information"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-3"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "profile-conformance"
       ]
     ] [
       fhir:code [ fhir:v "legalBasis" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "QĐ 01/2008/QĐ-BYT (cấp cứu xử trí trước)"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-PAT-005" ] ;
     fhir:display [ fhir:v "Hợp nhất hồ sơ phải dùng Patient.link, không tạo định danh trùng" ] ;
     fhir:definition [ fhir:v "Khi merge hồ sơ tạm với hồ sơ CCCD chính thức: dùng Patient.link (replaced-by/replaces), chuyển hồ sơ tạm active=false. KHÔNG xóa cứng, KHÔNG tạo định danh y tế (VHN) trùng. Kiểm tra phía server." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "Record merge shall use Patient.link, do not create duplicate identifiers" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "error"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-2"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "profile-conformance"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-ADDR-001" ] ;
     fhir:display [ fhir:v "Địa chỉ Việt Nam phải có extension:province" ] ;
     fhir:definition [ fhir:v "Địa chỉ có country='VN' nên có extension:province. Sửa: bổ sung mã tỉnh theo VNProvinceCS." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "Vietnam address must include extension:province" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "warning"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-1"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "profile-conformance"
       ]
     ] [
       fhir:code [ fhir:v "invariant" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "vn-addr-province"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-ENC-001" ] ;
     fhir:display [ fhir:v "Encounter.serviceProvider là bắt buộc" ] ;
     fhir:definition [ fhir:v "Lượt khám phải gắn cơ sở KCB chịu trách nhiệm. Sửa: thêm Encounter.serviceProvider trỏ VNCoreOrganization." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "Encounter.serviceProvider is required" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "error"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-1"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "profile-conformance"
       ]
     ] [
       fhir:code [ fhir:v "expression" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "Encounter.serviceProvider.exists()"
       ]
     ] [
       fhir:code [ fhir:v "legalBasis" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "QĐ 3176/QĐ-BYT"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-ENC-002" ] ;
     fhir:display [ fhir:v "Encounter.period không được chồng lấn cho cùng bệnh nhân" ] ;
     fhir:definition [ fhir:v "Trừ encounter lồng nhau, các period của cùng bệnh nhân không nên overlap. Kiểm tra phía server." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "Encounter.period must not overlap for the same patient" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "warning"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-3"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "technical-quality-guardrail"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-CON-001" ] ;
     fhir:display [ fhir:v "Mỗi Condition chỉ nên ghi 1 chẩn đoán" ] ;
     fhir:definition [ fhir:v "1 resource Condition = 1 mã chẩn đoán (không gộp đa chẩn đoán). Sửa: tách thành nhiều Condition." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "Each Condition should contain only one diagnosis" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "warning"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-3"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "profile-conformance"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-MED-002" ] ;
     fhir:display [ fhir:v "Cấp phát ngoại trú/bán lẻ phải có authorizingPrescription" ] ;
     fhir:definition [ fhir:v "Không cấp phát 'mồ côi': cấp phát ngoại trú/nhà thuốc bán lẻ (category=outpatient/community) phải trỏ về VNCoreMedicationRequest để bảo toàn chuỗi kê đơn → cấp phát → thanh toán BHYT. Cấp phát nội trú từ tủ trực/khoa Dược nên gắn y lệnh khi có y lệnh tương ứng (vd ExampleMedicationDispenseInpatientAntibiotic → ExampleMedicationRequestCefotaximeInpatient)." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "Outpatient/retail dispensing must include authorizingPrescription" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "error"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-3"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "profile-conformance"
       ]
     ] [
       fhir:code [ fhir:v "expression" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "MedicationDispense.category.coding.where(code='outpatient' or code='community').exists() implies MedicationDispense.authorizingPrescription.exists()"
       ]
     ] [
       fhir:code [ fhir:v "legalBasis" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "TT 26/2025/TT-BYT; QĐ 3176/QĐ-BYT"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-MED-003" ] ;
     fhir:display [ fhir:v "MedicationAdministration nên liên kết y lệnh (request)" ] ;
     fhir:definition [ fhir:v "Sự kiện dùng thuốc nên trỏ về MedicationRequest để khép chuỗi y lệnh → cấp phát → sử dụng. Sửa: thêm MedicationAdministration.request." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "MedicationAdministration should reference medication request order" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "warning"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-3"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "profile-conformance"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-CLM-001" ] ;
     fhir:display [ fhir:v "Claim phải có đúng 1 thẻ BHYT chính (focal=true)" ] ;
     fhir:definition [ fhir:v "Một hồ sơ thanh toán có đúng 1 insurance.focal=true; thẻ bổ trợ dùng focal=false. Sửa: đánh dấu đúng thẻ chính." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "Claim must have exactly one primary health insurance card (focal=true)" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "error"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-1"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "profile-conformance"
       ]
     ] [
       fhir:code [ fhir:v "expression" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "Claim.insurance.where(focal=true).count() = 1"
       ]
     ] [
       fhir:code [ fhir:v "legalBasis" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "QĐ 697/QĐ-BYT; NĐ 188/2025/NĐ-CP Đ22"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-CLM-014" ] ;
     fhir:display [ fhir:v "Số ngày giường phải khớp số ngày nằm viện" ] ;
     fhir:definition [ fhir:v "Số lượng item nhóm chi phí ngày giường (cost-category 2.2) phải khớp số ngày Encounter.period.end − period.start. Kiểm tra phía server." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "Number of bed-days must match length of stay" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "error"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-2"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "legal-business-rule"
       ]
     ] [
       fhir:code [ fhir:v "legalBasis" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "QĐ 697/QĐ-BYT"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-BHYT-001" ] ;
     fhir:display [ fhir:v "Thiếu SO_CCCD nhưng không có mã lý do bất khả kháng" ] ;
     fhir:definition [ fhir:v "Khi xuất dữ liệu BHXH (QĐ 3176), SO_CCCD bắt buộc; nếu trống phải có Patient.extension[force-majeure-reason]. Kiểm tra phía server/gateway." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "Missing SO_CCCD without exemption reason code" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "error"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-2"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "normative-data-standard"
       ]
     ] [
       fhir:code [ fhir:v "legalBasis" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "QĐ 3176/QĐ-BYT"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-BHYT-002" ] ;
     fhir:display [ fhir:v "MA_LK phải nhất quán trên toàn bộ hồ sơ gửi" ] ;
     fhir:definition [ fhir:v "MA_LK là khóa liên kết hồ sơ một đợt KCB; Claim.identifier[MALK] và Bundle.identifier phải cùng giá trị cho mọi resource liên quan. Kiểm tra phía server." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "MA_LK must be consistent across all submitted records" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "error"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-2"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "normative-data-standard"
       ]
     ] [
       fhir:code [ fhir:v "legalBasis" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "QĐ 3176/QĐ-BYT"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-BHYT-003" ] ;
     fhir:display [ fhir:v "Ngày giờ xuất cổng BHXH phải theo định dạng yyyyMMddHHmm" ] ;
     fhir:definition [ fhir:v "Trường ngày giờ xuất/gateway (NGAY_VAO, NGAY_RA, NGAY_YL...) phải đúng yyyyMMddHHmm ở lớp export. Kiểm tra phía server/gateway." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "BHXH discharge timestamp must follow format yyyyMMddHHmm" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "error"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-2"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "normative-data-standard"
       ]
     ] [
       fhir:code [ fhir:v "legalBasis" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "QĐ 3176/QĐ-BYT"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-BDL-001" ] ;
     fhir:display [ fhir:v "Mỗi entry trong transaction Bundle phải có request.method và request.url" ] ;
     fhir:definition [ fhir:v "Bundle.type=transaction yêu cầu mỗi entry có request.method + request.url (FHIR bdl-3). Sửa: bổ sung request cho mọi entry." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "Each entry in a transaction Bundle must have request.method and request.url" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "error"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-1"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "profile-conformance"
       ]
     ] [
       fhir:code [ fhir:v "expression" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "Bundle.where(type='transaction').entry.all(request.method.exists() and request.url.exists())"
       ]
     ] [
       fhir:code [ fhir:v "legalBasis" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "FHIR R4 bdl-3; NĐ 164/2025/NĐ-CP"
       ]
     ] )
  ] [
     fhir:code [ fhir:v "VN-RULE-TERM-001" ] ;
     fhir:display [ fhir:v "Mã không thuộc ValueSet có binding required" ] ;
     fhir:definition [ fhir:v "Mã coding không nằm trong ValueSet ràng buộc required của phần tử. Sửa: dùng mã hợp lệ từ ValueSet (vd ICD-10 VN, nhóm chi phí QĐ 697)." ] ;
     fhir:designation ( [
       fhir:language [ fhir:v "en" ] ;
       fhir:value [ fhir:v "Code not in required-bound ValueSet" ]
     ] ) ;
     fhir:property ( [
       fhir:code [ fhir:v "severity" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "error"
       ]
     ] [
       fhir:code [ fhir:v "tier" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "tier-1"
       ]
     ] [
       fhir:code [ fhir:v "category" ] ;
       fhir:value [
         a fhir:String ;
         fhir:v "normative-data-standard"
       ]
     ] )
  ] ) . # 

# -------------------------------------------------------------------------------------

