Id: IMMZD2DTHepatitisAInactivatedHAV2Doses Url: IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses Version: 1.0.0 Title: IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses Status: draft Type: system: http://terminology.hl7.org/CodeSystem/plan-definition-type code: eca-rule Date: 2026-03-31 13:54:17+0000 Publisher: WHO Description: IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses Inactivated hepatitis A virus (HAV), 2-dose schedule Knowledge Capability: computable Related Artifacts: References WHO recommendations for routine immunization - summary tables (January 2025) Libraries: IMMZD2DTHepatitisAInactivatedHAV2DosesLogic Actions: Determine if the client is due for HepatitisA.: Determine if the client is due for HepatitisA vaccine according to the national immunization protocol. Inactivated hepatitis A virus (HAV), 2-dose schedule If: Applicability: Client is due for Hepatitis A vaccination (Client is due for Hepatitis A vaccination) Then: Definition: IMMZD2DTMR Dynamic Values: status: ('draft') intent: ('proposal') medication: (Concept { codes: { Code { system: 'http://smart.who.int/immunizations/CodeSystem/IMMZ.Z', code: 'DE5', display: 'Hepatitis A-containing vaccines' } }, display: 'Hepatitis A-containing vaccines' }) Check for Guidance for the patient regarding IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses.: Show Guidance for the patient regarding IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses. If: Applicability: Has Guidance (Has Guidance) Then: Definition: IMMZ.D2.DT.CR Dynamic Values: status: ('active') payload.contentString: (Guidance) category.coding: (Code { system: 'http://terminology.hl7.org/CodeSystem/communication-category', code: 'alert' }) priority: (Code { system: 'http://hl7.org/fhir/request-priority', code: 'routine' })
/** * @dataElement Patient age in months */ define "Current Patient Age In Months": AgeInMonthsAt(Today)
/* @input: Client's age is less than 12 months @pseudocode: Today's date − "Date of birth" < 12 months @code: Client's age is less than 12 months-42 @decision: IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses: Inactivated hepatitis A virus (HAV), 2-dose schedule @decision: IMMZ.D2.DT.Hepatitis A.Inactivated HAV 1 dose: Inactivated hepatitis A virus (HAV), 1-dose schedule */ define "Client's age is less than 12 months": Encounter."Current Patient Age In Months" < 12
Client is not due for Hepatitis A vaccination Case 1
/* @output: Client is not due for Hepatitis A vaccination Case 1 @pseudocode: "Immunization recommendation status" = "Not due" */ define "Client is not due for Hepatitis A vaccination Case 1": Encounter."Client's age is less than 12 months"
/** * @dataElement All Doses Administered to Patient */ define "Doses Administered to Patient": [Immunization] I where I.status = 'completed' and I.isSubpotent is not true
/** * @dataElement All Doses Administered to Patient */ define "Doses Administered to Patient": Elements."Doses Administered to Patient" I where I.occurrence.toInterval() same day or before Today
Hepatitis A Doses Administered to Patient
/* @internal: Hepatitis A containing Doses Administered to Patient */ define "Hepatitis A Doses Administered to Patient": Encounter."Doses Administered to Patient" I where I.vaccineCode in Concepts."Hepatitis A-containing vaccines"
Hepatitis A Primary Series Doses Administered to Patient
/* @internal: Hepatitis A containing Doses Administered to Patient that are in the Primary series */ define "Hepatitis A Primary Series Doses Administered to Patient": "Hepatitis A Doses Administered to Patient".seriesPrimary()
Number of Hepatitis A Primary Series Doses Administered
/* @internal: Number of Hepatitis A Primary Series doses */ define "Number of Hepatitis A Primary Series Doses Administered": Count("Hepatitis A Primary Series Doses Administered to Patient")
One hepatitis A primary series dose was administered
/* @input: One hepatitis A primary series dose was administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Hepatitis A-containing vaccines" and "Type of dose" = "Primary series") = 1 @code: One hepatitis A primary series dose was administered-131 @decision: IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses: Inactivated hepatitis A virus (HAV), 2-dose schedule @decision: IMMZ.D2.DT.Hepatitis A.Inactivated HAV 1 dose: Inactivated hepatitis A virus (HAV), 1-dose schedule @decision: IMMZ.D2.DT.Hepatitis A.Live attenuated HAV 1 dose: Live attenuated hepatitis A virus (HAV), 1 dose schedule */ define "One hepatitis A primary series dose was administered": "Number of Hepatitis A Primary Series Doses Administered" = 1
/* @internal: Date of Latest Hepatitis A Dose */ define "Date of Latest Hepatitis A Dose": date from start of "Hepatitis A Doses Administered to Patient".mostRecent().occurrence.toInterval()
The latest Hepatitis A dose was administered less than 6 months ago
/* @input: The latest Hepatitis A dose was administered less than 6 months ago @pseudocode: Today's date − "Date and time of vaccination" (where "Vaccine type" = "Hepatitis A-containing vaccines") < 6 months @code: The latest Hepatitis A dose was administered less than 6 months ago-115 @decision: IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses: Inactivated hepatitis A virus (HAV), 2-dose schedule */ define "The latest Hepatitis A dose was administered less than 6 months ago": "Date of Latest Hepatitis A Dose" is not null and duration in months between "Date of Latest Hepatitis A Dose" and Today < 6
Client is not due for Hepatitis A vaccination Case 2
/* @output: Client is not due for Hepatitis A vaccination Case 2 @pseudocode: "Immunization recommendation status" = "Not due" */ define "Client is not due for Hepatitis A vaccination Case 2": Encounter."One hepatitis A primary series dose was administered" and Encounter."The latest Hepatitis A dose was administered less than 6 months ago"
Client is not due for Hepatitis A vaccination
/* @output: Client is not due for Hepatitis A vaccination @pseudocode: "Immunization recommendation status" = "Not due" */ define "Client is not due for Hepatitis A vaccination": "Client is not due for Hepatitis A vaccination Case 1" or "Client is not due for Hepatitis A vaccination Case 2"
Client is not due for Hepatitis A vaccination Guidance
/* @output: Client is not due for Hepatitis A vaccination Guidance @guidance = Should not vaccinate client with first hepatitis A dose as client's age is less than 12 months. Check for any other vaccines due and inform the caregiver of when to come back for the first dose. @guidance = Should not vaccinate client with second hepatitis A dose as the latest hepatitis A dose was administered less than 6 months ago. Check for any vaccines due and inform the caregiver of when to come back for the second dose. */ define "Client is not due for Hepatitis A vaccination Guidance": case when "Client is not due for Hepatitis A vaccination Case 1" then 'Should not vaccinate client with first hepatitis A dose as client\'s age is less than 12 months. Check for any other vaccines due and inform the caregiver of when to come back for the first dose.' when "Client is not due for Hepatitis A vaccination Case 2" then 'Should not vaccinate client with second hepatitis A dose as the latest hepatitis A dose was administered less than 6 months ago. Check for any vaccines due and inform the caregiver of when to come back for the second dose.' else '' end
No hepatitis A primary series doses were administered
/* @input: No hepatitis A primary series doses were administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Hepatitis A-containing vaccines" and "Type of dose" = "Primary series") = 0 @code: No hepatitis A primary series doses were administered-131 @decision: IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses: Inactivated hepatitis A virus (HAV), 2-dose schedule */ define "No hepatitis A primary series doses were administered": "Number of Hepatitis A Primary Series Doses Administered" = 0
Client's age is more than or equal to 12 months
/* @input: Client's age is more than or equal to 12 months @pseudocode: Today's date − "Date of birth" ≥ 12 months @code: Client's age is more than or equal to 12 months-42 @decision: IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses: Inactivated hepatitis A virus (HAV), 2-dose schedule @decision: IMMZ.D2.DT.Hepatitis A.Inactivated HAV 1 dose: Inactivated hepatitis A virus (HAV), 1-dose schedule */ define "Client's age is more than or equal to 12 months": Encounter."Current Patient Age In Months" >= 12
Client is due for Hepatitis A vaccination Case 1
/* @output: Client is due for Hepatitis A vaccination Case 1 @pseudocode: "Immunization recommendation status" = "Due" */ define "Client is due for Hepatitis A vaccination Case 1": Encounter."No hepatitis A primary series doses were administered" and Encounter."Client's age is more than or equal to 12 months"
The latest Hepatitis A dose was administered more than 6 months ago
/* @input: The latest Hepatitis A dose was administered more than 6 months ago @pseudocode: Today's date − "Date and time of vaccination" (where "Vaccine type" = "Hepatitis A-containing vaccines") ≥ 6 months @code: The latest Hepatitis A dose was administered more than 6 months ago-115 @decision: IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses: Inactivated hepatitis A virus (HAV), 2-dose schedule */ define "The latest Hepatitis A dose was administered more than 6 months ago": not "The latest Hepatitis A dose was administered less than 6 months ago"
Client is due for Hepatitis A vaccination Case 2
/* @output: Client is due for Hepatitis A vaccination Case 2 @pseudocode: "Immunization recommendation status" = "Due" */ define "Client is due for Hepatitis A vaccination Case 2": Encounter."One hepatitis A primary series dose was administered" and Encounter."The latest Hepatitis A dose was administered more than 6 months ago"
Client is due for Hepatitis A vaccination
/* @output: Client is due for Hepatitis A vaccination @pseudocode: "Immunization recommendation status" = "Due" */ define "Client is due for Hepatitis A vaccination": "Client is due for Hepatitis A vaccination Case 1" or "Client is due for Hepatitis A vaccination Case 2"
Client is due for Hepatitis A vaccination Guidance
/* @output: Client is due for Hepatitis A vaccination Guidance @guidance = Should vaccinate client with first hepatitis A dose as no Hepatitis A doses were administered and client is within the appropriate age range. Check for contraindications. @guidance = Should vaccinate client with second hepatitis A dose as the latest hepatitis A dose was administered more than 6 months ago. Check for contraindications. */ define "Client is due for Hepatitis A vaccination Guidance": case when "Client is due for Hepatitis A vaccination Case 1" then 'Should vaccinate client with first hepatitis A dose as no Hepatitis A doses were administered and client is within the appropriate age range. Check for contraindications.' when "Client is due for Hepatitis A vaccination Case 2" then 'Should vaccinate client with second hepatitis A dose as the latest hepatitis A dose was administered more than 6 months ago. Check for contraindications.' else '' end
Two hepatitis A primary series doses were administered
/* @input: Two hepatitis A primary series doses were administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Hepatitis A-containing vaccines" and "Type of dose" = "Primary series") = 2 @code: Two hepatitis A primary series doses were administered-131 @decision: IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses: Inactivated hepatitis A virus (HAV), 2-dose schedule */ define "Two hepatitis A primary series doses were administered": "Number of Hepatitis A Primary Series Doses Administered" = 2
Hepatitis A immunization schedule is complete
/* @output: Hepatitis A immunization schedule is complete @pseudocode: "Immunization recommendation status" = "Complete" "Completed the primary vaccination series" = TRUE (where "Vaccine type" = "Hepatitis A-containing vaccines") */ define "Hepatitis A immunization schedule is complete": Encounter."Two hepatitis A primary series doses were administered"
Hepatitis A immunization schedule is complete Guidance
/* @output: Hepatitis A immunization schedule is complete Guidance @guidance: Hepatitis A immunization schedule is complete. Two hepatitis A primary series doses were administered. Check for any other vaccines due. */ define "Hepatitis A immunization schedule is complete Guidance": 'Hepatitis A immunization schedule is complete. Two hepatitis A primary series doses were administered. Check for any other vaccines due.'
/* @dynamicValue: Guidance */ define "Guidance": case when "Client is not due for Hepatitis A vaccination" then "Client is not due for Hepatitis A vaccination Guidance" when "Client is due for Hepatitis A vaccination" then "Client is due for Hepatitis A vaccination Guidance" when "Hepatitis A immunization schedule is complete" then "Hepatitis A immunization schedule is complete Guidance" else '' end
define "Has Guidance": "Guidance" is not null and "Guidance" != ''
/** * @description: Gets the doses from the primary series */ define fluent function seriesPrimary(immunizations List<Immunization>): immunizations I where exists( I.protocolApplied pa where pa.series = 'Primary series' )
define function ToString(value string): value.value
define function ToString(value ImmunizationStatus): value.value
define function ToBoolean(value boolean): value.value
/* From FHIRCommon 4.1.0: */ /* @description: Normalizes a value that is a choice of timing-valued types to an equivalent interval @comment: Normalizes a choice type of FHIR.dateTime, FHIR.Period, FHIR.Timing, FHIR.instance, FHIR.string, FHIR.Age, or FHIR.Range types to an equivalent interval. This selection of choice types is a superset of the majority of choice types that are used as possible representations for timing-valued elements in FHIR, allowing this function to be used across any resource. The input can be provided as a dateTime, Period, Timing, instant, string, Age, or Range. The intent of this function is to provide a clear and concise mechanism to treat single elements that have multiple possible representations as intervals so that logic doesn't have to account for the variability. More complex calculations (such as medication request period or dispense period calculation) need specific guidance and consideration. That guidance may make use of this function, but the focus of this function is on single element calculations where the semantics are unambiguous. If the input is a dateTime, the result a DateTime Interval beginning and ending on that dateTime. If the input is a Period, the result is a DateTime Interval. If the input is a Timing, an error is raised indicating a single interval cannot be computed from a Timing. If the input is an instant, the result is a DateTime Interval beginning and ending on that instant. If the input is a string, an error is raised indicating a single interval cannot be computed from a string. If the input is an Age, the result is a DateTime Interval beginning when the patient was the given Age, and ending immediately prior to when the patient was the given Age plus one year. If the input is a Range, the result is a DateTime Interval beginning when the patient was the Age given by the low end of the Range, and ending immediately prior to when the patient was the Age given by the high end of the Range plus one year. NOTE: Due to the complexity of determining a single interval from a Timing or String type, this function will throw a run-time exception if it is used with a Timing or String. */ define fluent function toInterval(choice Choice<FHIR.dateTime, FHIR.Period, FHIR.Timing, FHIR.instant, FHIR.string, FHIR.Age, FHIR.Range>): case when choice is FHIR.dateTime then Interval[FHIRHelpers.ToDateTime(choice as FHIR.dateTime), FHIRHelpers.ToDateTime(choice as FHIR.dateTime)] when choice is FHIR.Period then FHIRHelpers.ToInterval(choice as FHIR.Period) when choice is FHIR.instant then Interval[FHIRHelpers.ToDateTime(choice as FHIR.instant), FHIRHelpers.ToDateTime(choice as FHIR.instant)] when choice is FHIR.Age then Interval[FHIRHelpers.ToDate(Patient.birthDate) + FHIRHelpers.ToQuantity(choice as FHIR.Age), FHIRHelpers.ToDate(Patient.birthDate) + FHIRHelpers.ToQuantity(choice as FHIR.Age) + 1 year) when choice is FHIR.Range then Interval[FHIRHelpers.ToDate(Patient.birthDate) + FHIRHelpers.ToQuantity((choice as FHIR.Range).low), FHIRHelpers.ToDate(Patient.birthDate) + FHIRHelpers.ToQuantity((choice as FHIR.Range).high) + 1 year) when choice is FHIR.Timing then Message(null as Interval<DateTime>, true, 'NOT_IMPLEMENTED', 'Error', 'Calculation of an interval from a Timing value is not supported') when choice is FHIR.string then Message(null as Interval<DateTime>, true, 'NOT_IMPLEMENTED', 'Error', 'Calculation of an interval from a String value is not supported') else null as Interval<DateTime> end
define function ToDateTime(value dateTime): value.value
define function ToInterval(period FHIR.Period): if period is null then null else if period."start" is null then Interval(period."start".value, period."end".value] else Interval[period."start".value, period."end".value]
define function ToDateTime(value instant): value.value
define function ToDate(value date): value.value
define function ToQuantity(quantity FHIR.Quantity): case when quantity is null then null when quantity.value is null then null when quantity.comparator is not null then Message(null, true, 'FHIRHelpers.ToQuantity.ComparatorQuantityNotSupported', 'Error', 'FHIR Quantity value has a comparator and cannot be converted to a System.Quantity value.') when quantity.system is null or quantity.system.value = 'http://unitsofmeasure.org' or quantity.system.value = 'http://hl7.org/fhirpath/CodeSystem/calendar-units' then System.Quantity { value: quantity.value.value, unit: ToCalendarUnit(Coalesce(quantity.code.value, quantity.unit.value, '1')) } else Message(null, true, 'FHIRHelpers.ToQuantity.InvalidFHIRQuantity', 'Error', 'Invalid FHIR Quantity code: ' & quantity.unit.value & ' (' & quantity.system.value & '|' & quantity.code.value & ')') end
define function ToCalendarUnit(unit System.String): case unit when 'ms' then 'millisecond' when 's' then 'second' when 'min' then 'minute' when 'h' then 'hour' when 'd' then 'day' when 'wk' then 'week' when 'mo' then 'month' when 'a' then 'year' else unit end
define function ToConcept(concept FHIR.CodeableConcept): if concept is null then null else System.Concept { codes: concept.coding C return ToCode(C), display: concept.text.value }
define function ToCode(coding FHIR.Coding): if coding is null then null else System.Code { code: coding.code.value, system: coding.system.value, version: coding.version.value, display: coding.display.value }
define fluent function mostRecent(immunizations List<Immunization>): Last( immunizations I sort by start of occurrence.toInterval() )
Value set Hepatitis A-containing vaccines
IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses
IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses Inactivated hepatitis A virus (HAV), 2-dose schedule
WHO recommendations for routine immunization - summary tables (January 2025)
For children, inactivated hepatitis A-containing vaccines can be given as a single-dose or 2-dose schedule, and administered intramuscularly. For adults aged over 40 years, vaccination with inactivated vaccines using the 2-dose schedule is preferred since there is insufficient evidence on the immunogenicity and long-term protection from a single dose in this age group. With a 2-dose schedule, the first dose should be given from ≥ 12 months of age. The interval between doses is flexible, from 6 months to 4–5 years or more, but is usually 6–18 months.
Determine if the client is due for HepatitisA.
Determine if the client is due for HepatitisA vaccine according to the national immunization protocol. Inactivated hepatitis A virus (HAV), 2-dose schedule
Concept { codes: { Code { system: 'http://smart.who.int/immunizations/CodeSystem/IMMZ.Z', code: 'DE5', display: 'Hepatitis A-containing vaccines' } }, display: 'Hepatitis A-containing vaccines' }
Check for Guidance for the patient regarding IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses.
Show Guidance for the patient regarding IMMZ.D2.DT.Hepatitis A.Inactivated HAV 2 doses.
Code { system: 'http://terminology.hl7.org/CodeSystem/communication-category', code: 'alert' }
Code { system: 'http://hl7.org/fhir/request-priority', code: 'routine' }