Id: IMMZD18SSeasonalinfluenzaSeasonalInfluenza Url: IMMZ.D18.S.Seasonal influenza schedule Version: 1.0.0 Title: IMMZ.D18.S.Seasonal influenza schedule 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.D18.S.Seasonal influenza schedule Inactivated trivalent and quadrivalent vaccines, 2-dose schedule for children aged under 9 years Knowledge Capability: computable Related Artifacts: References WHO recommendations for routine immunization - summary tables (January 2025) Libraries: IMMZD18SSeasonalinfluenzaSeasonalInfluenzaLogic Actions: Seasonal influenza dose 1: Provision of the seasonal influenza vaccine dose 1 Trigger event: Child's birth Trigger pseudo: Trigger date: "Date of birth" Create condition: Influenza vaccines are safe and effective in children from 6 months of age If: Applicability: Seasonal influenza dose 1 (Seasonal influenza dose 1) Then: Definition: IMMZ.D2.DT.CR Dynamic Values: status: ('active') payload.contentString: (Seasonal influenza dose 1 Create) category.coding: (Code { system: 'http://terminology.hl7.org/CodeSystem/communication-category', code: 'alert' }) priority: (Code { system: 'http://hl7.org/fhir/request-priority', code: 'routine' }) Seasonal influenza dose 2: Provision of the seasonal influenza vaccine dose 2 Trigger event: First seasonal influenza dose from the primary series was administered and client is less than 9 years Trigger pseudo: Count of vaccines administered (where "Vaccine type" = "Seasonal influenza vaccines" and "Type of dose" = "Primary series") = 1 AND (Today's date − "Date of birth" < 9 years) Trigger date: "Date and time of vaccination" (where "Vaccine type" = "Seasonal influenza vaccines") Create condition: Children aged 6 months to 8 years should receive 2 doses at least 4 weeks apart If: Applicability: Seasonal influenza dose 2 (Seasonal influenza dose 2) Then: Definition: IMMZ.D2.DT.CR Dynamic Values: status: ('active') payload.contentString: (Seasonal influenza dose 2 Create) category.coding: (Code { system: 'http://terminology.hl7.org/CodeSystem/communication-category', code: 'alert' }) priority: (Code { system: 'http://hl7.org/fhir/request-priority', code: 'routine' }) Seasonal influenza annual dose: Provision of the seasonal influenza vaccine annual dose Trigger event: The primary series has been completed Trigger pseudo: "Completed the primary vaccination series" = TRUE (where "Vaccine type" = "Seasonal influenza vaccines") Trigger date: Latest "Date and time of vaccination" (where "Vaccine type" = "Seasonal influenza vaccines") Create condition: Seasonal influenza vaccine annual dose should be provided 1 year after the previous dose If: Applicability: Seasonal influenza annual dose (Seasonal influenza annual dose) Then: Definition: IMMZ.D2.DT.CR Dynamic Values: status: ('active') payload.contentString: (Seasonal influenza annual dose Create) 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 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
Seasonal influenza Doses Administered to Patient
/* @internal: Seasonal influenza containing Doses Administered to Patient */ define "Seasonal influenza Doses Administered to Patient": Encounter."Doses Administered to Patient" I where I.vaccineCode in Concepts."Seasonal influenza vaccines"
Seasonal influenza Primary Series Doses Administered to Patient
/* @internal: Seasonal influenza containing Doses Administered to Patient that are in the Primary series */ define "Seasonal influenza Primary Series Doses Administered to Patient": "Seasonal influenza Doses Administered to Patient".seriesPrimary()
Number of Seasonal influenza Primary Series Doses Administered
/* @internal: Number of Seasonal influenza Primary Series doses */ define "Number of Seasonal influenza Primary Series Doses Administered": Count("Seasonal influenza Primary Series Doses Administered to Patient")
One seasonal influenza primary series doses were administered
/* @input: One seasonal influenza primary series doses were administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Seasonal influenza vaccines" and "Type of dose" = "Primary series") = 1 @code: One seasonal influenza primary series doses were administered-127 @decision: IMMZ.D2.DT.Seasonal influenza: Inactivated trivalent and quadrivalent vaccines, 2-dose schedule */ define "One seasonal influenza primary series doses were administered": "Number of Seasonal influenza Primary Series Doses Administered" = 1
First seasonal influenza dose from the primary series was administered
/* @complete: First seasonal influenza dose from the primary series was administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Seasonal influenza vaccines" and "Type of dose" = "Primary series") = 1 */ define "First seasonal influenza dose from the primary series was administered": Encounter."One seasonal influenza primary series doses were administered"
/** * @dataElement Patient age in years */ define "Current Patient Age In Years": AgeInYearsAt(Today)
/* @input: Client's age is less than 9 years @pseudocode: Today's date − "Date of birth" < 9 years @code: Client's age is less than 9 years-40 @decision: IMMZ.D2.DT.Seasonal influenza: Inactivated trivalent and quadrivalent vaccines, 2-dose schedule */ define "Client's age is less than 9 years": Encounter."Current Patient Age In Years" < 9
Two seasonal influenza primary series doses were administered
/* @input: Two seasonal influenza primary series doses were administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Seasonal influenza vaccines" and "Type of dose" = "Primary series") = 2 @code: Two seasonal influenza primary series doses were administered-127 @decision: IMMZ.D2.DT.Seasonal influenza: Inactivated trivalent and quadrivalent vaccines, 2-dose schedule */ define "Two seasonal influenza primary series doses were administered": "Number of Seasonal influenza Primary Series Doses Administered" = 2
Second seasonal influenza dose from the primary series was administered. The primary series has been completed
/* @complete: Second seasonal influenza dose from the primary series was administered. The primary series has been completed @pseudocode: "Completed the primary vaccination series" = TRUE (where "Vaccine type" = "Seasonal influenza vaccines") */ define "Second seasonal influenza dose from the primary series was administered. The primary series has been completed": Encounter."Two seasonal influenza primary series doses were administered"
/* @output: Seasonal influenza dose 2 @description: Provision of the seasonal influenza vaccine dose 2 @trigger: First seasonal influenza dose from the primary series was administered and client is less than 9 years @pseudo: Count of vaccines administered (where "Vaccine type" = "Seasonal influenza vaccines" and "Type of dose" = "Primary series") = 1 AND (Today's date − "Date of birth" < 9 years) @triggerDate: "Date and time of vaccination" (where "Vaccine type" = "Seasonal influenza vaccines") */ define "Seasonal influenza dose 2": "First seasonal influenza dose from the primary series was administered" and Encounter."Client's age is less than 9 years" and not "Second seasonal influenza dose from the primary series was administered. The primary series has been completed"
/* @internal: Date of Latest Seasonal influenza Dose */ define "Date of Latest Seasonal influenza Dose": date from start of "Seasonal influenza Doses Administered to Patient".mostRecent().occurrence.toInterval()
/* @dynamicValue: Seasonal influenza dose 2 Due Date @pseudocode: "Date and time of vaccination" (where "Vaccine type" = "Seasonal influenza vaccines") + 4 weeks */ define "Seasonal influenza dose 2 Due Date": if "Seasonal influenza dose 2" then Encounter."Date of Latest Seasonal influenza Dose" + 4 weeks else null
/* @dynamicValue: Seasonal influenza dose 2 Expiration @pseudocode: "Date of birth" + 9 years */ define "Seasonal influenza dose 2 Expiration": if "Seasonal influenza dose 2" then Patient.birthDate + 9 years else null
/* @output: Seasonal influenza dose 2 Create @create: Children aged 6 months to 8 years should receive 2 doses at least 4 weeks apart */ define "Seasonal influenza dose 2 Create": if "Seasonal influenza dose 2" then 'Children aged 6 months to 8 years should receive 2 doses at least 4 weeks apart' + ' Due Date: ' + ToString("Seasonal influenza dose 2 Due Date") + ' Expiration: ' + ToString("Seasonal influenza dose 2 Expiration") else ''
No seasonal influenza primary series doses were administered
/* @input: No seasonal influenza primary series doses were administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Seasonal influenza vaccines" and "Type of dose" = "Primary series") = 0 @code: No seasonal influenza primary series doses were administered-127 @decision: IMMZ.D2.DT.Seasonal influenza: Inactivated trivalent and quadrivalent vaccines, 2-dose schedule */ define "No seasonal influenza primary series doses were administered": "Number of Seasonal influenza Primary Series Doses Administered" = 0
/* @output: Seasonal influenza dose 1 @description: Provision of the seasonal influenza vaccine dose 1 @trigger: Child's birth @pseudo: @triggerDate: "Date of birth" */ define "Seasonal influenza dose 1": Encounter."No seasonal influenza primary series doses were administered" and not "First seasonal influenza dose from the primary series was administered"
/* @dynamicValue: Seasonal influenza dose 1 Due Date @pseudocode: "Date of birth" + 6 months */ define "Seasonal influenza dose 1 Due Date": if "Seasonal influenza dose 1" then Patient.birthDate + 6 months else null
/* @output: Seasonal influenza dose 1 Create @create: Influenza vaccines are safe and effective in children from 6 months of age */ define "Seasonal influenza dose 1 Create": if "Seasonal influenza dose 1" then 'Influenza vaccines are safe and effective in children from 6 months of age' + ' Due Date: ' + ToString("Seasonal influenza dose 1 Due Date") else ''
Client's age is more than or equal to 9 years
/* @input: Client's age is more than or equal to 9 years @pseudocode: Today's date − "Date of birth" ≥ 9 years @code: Client's age is more than or equal to 9 years-40 @decision: IMMZ.D2.DT.Seasonal influenza: Inactivated trivalent and quadrivalent vaccines, 2-dose schedule */ define "Client's age is more than or equal to 9 years": Encounter."Current Patient Age In Years" >= 9
/* @output: Seasonal influenza annual dose @description: Provision of the seasonal influenza vaccine annual dose @trigger: The primary series has been completed @pseudo: "Completed the primary vaccination series" = TRUE (where "Vaccine type" = "Seasonal influenza vaccines") @triggerDate: Latest "Date and time of vaccination" (where "Vaccine type" = "Seasonal influenza vaccines") */ define "Seasonal influenza annual dose": ( "Second seasonal influenza dose from the primary series was administered. The primary series has been completed" or ( "First seasonal influenza dose from the primary series was administered" and Encounter."Client's age is more than or equal to 9 years" ) )
/* @dynamicValue: Seasonal influenza annual dose Due Date @pseudocode: Latest "Date and time of vaccination" (where "Vaccine type" = "Seasonal influenza vaccines") + 1 year */ define "Seasonal influenza annual dose Due Date": if "Seasonal influenza annual dose" then Encounter."Date of Latest Seasonal influenza Dose" + 1 year else null
/* @output: Seasonal influenza annual dose Create @create: Seasonal influenza vaccine annual dose should be provided 1 year after the previous dose */ define "Seasonal influenza annual dose Create": if "Seasonal influenza annual dose" then 'Seasonal influenza vaccine annual dose should be provided 1 year after the previous dose' + ' Due Date: ' + ToString("Seasonal influenza annual dose Due Date") else ''
/** * @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() )
IMMZ.D18.S.Seasonal influenza schedule Inactivated trivalent and quadrivalent vaccines, 2-dose schedule for children aged under 9 years
WHO recommendations for routine immunization - summary tables (January 2025)
Provision of the seasonal influenza vaccine dose 1 Trigger event: Child's birth Trigger pseudo: Trigger date: "Date of birth" Create condition: Influenza vaccines are safe and effective in children from 6 months of age
Code { system: 'http://terminology.hl7.org/CodeSystem/communication-category', code: 'alert' }
Code { system: 'http://hl7.org/fhir/request-priority', code: 'routine' }
Provision of the seasonal influenza vaccine dose 2 Trigger event: First seasonal influenza dose from the primary series was administered and client is less than 9 years Trigger pseudo: Count of vaccines administered (where "Vaccine type" = "Seasonal influenza vaccines" and "Type of dose" = "Primary series") = 1 AND (Today's date − "Date of birth" < 9 years) Trigger date: "Date and time of vaccination" (where "Vaccine type" = "Seasonal influenza vaccines") Create condition: Children aged 6 months to 8 years should receive 2 doses at least 4 weeks apart
Provision of the seasonal influenza vaccine annual dose Trigger event: The primary series has been completed Trigger pseudo: "Completed the primary vaccination series" = TRUE (where "Vaccine type" = "Seasonal influenza vaccines") Trigger date: Latest "Date and time of vaccination" (where "Vaccine type" = "Seasonal influenza vaccines") Create condition: Seasonal influenza vaccine annual dose should be provided 1 year after the previous dose