Id: IMMZD18SRotavirus Url: IMMZ.D18.S.Rotavirus schedule Version: 0.2.0 Title: IMMZ.D18.S.Rotavirus schedule Status: draft Type: system: http://terminology.hl7.org/CodeSystem/plan-definition-type code: eca-rule Date: 2026-03-29 17:23:09+0000 Publisher: WHO Description: IMMZ.D18.S.Rotavirus schedule IMMZ.D18.S.Rotavirus schedule Knowledge Capability: computable Related Artifacts: References WHO recommendations for routine immunization - summary tables (January 2025) Libraries: IMMZD18SRotavirusLogic Actions: Rotavirus dose 1: Provision of the rotavirus first dose Trigger event: Child's birth Trigger pseudo: Trigger date: "Date of birth" Create condition: WHO recommends that the first dose of rotavirus vaccine be administered as soon as possible after 6 weeks of age. If: Applicability: Rotavirus dose 1 (Rotavirus dose 1) Then: Definition: IMMZ.D2.DT.CR Dynamic Values: status: ('active') payload.contentString: (Rotavirus 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' }) Rotavirus dose 2: Provision of the rotavirus second dose Trigger event: First rotavirus dose from the primary series was administered Trigger pseudo: Count of vaccines administered (where "Vaccine type" = "Rotavirus vaccines" and "Type of dose" = "Primary series") = 1 Trigger date: Latest "Date and time of vaccination" where "Vaccine type" = "Rotavirus vaccines" Create condition: A minimum interval of 4 weeks should be maintained between doses. If: Applicability: Rotavirus dose 2 (Rotavirus dose 2) Then: Definition: IMMZ.D2.DT.CR Dynamic Values: status: ('active') payload.contentString: (Rotavirus 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' }) Rotavirus dose 3: Provision of a rotavirus third dose Trigger event: For a series containing more than two doses, two rotavirus primary series doses of mixed series or a series with unknown vaccine products were administered Trigger pseudo: Count of vaccines administered (where "Vaccine type" = "Rotavirus vaccines"and "Type of dose" = "Primary series" ) = 2 AND "Vaccine brand" (where "Vaccine type" = "Rotavirus vaccines" AND "Dose number" = 1) ≠ "Vaccine brand" (where "Vaccine type" = "Rotavirus vaccines" AND "Dose number" = 2) OR "Total doses in series" > 2 Trigger date: Latest "Date and time of vaccination" where "Vaccine type" = "Rotavirus vaccines" Create condition: For a mixed series or a series with any unknown vaccine products, a total of 3 doses of rotavirus vaccine should be administered for a complete vaccination series. RotaTeq, Rotavac and Rotasiil should be administered in a 3-dose schedule. If: Applicability: Rotavirus dose 3 (Rotavirus dose 3) Then: Definition: IMMZ.D2.DT.CR Dynamic Values: status: ('active') payload.contentString: (Rotavirus dose 3 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
/* @internal: Rotavirus containing Doses Administered to Patient */ define "Rotavirus Doses Administered to Patient": Encounter."Doses Administered to Patient" I where I.vaccineCode in Concepts."Rotavirus vaccines"
Rotavirus Primary Series Doses Administered to Patient
/* @internal: Rotavirus containing Doses Administered to Patient that are in the Primary series */ define "Rotavirus Primary Series Doses Administered to Patient": "Rotavirus Doses Administered to Patient".seriesPrimary()
Number of Rotavirus Primary Series Doses Administered
/* @internal: Number of Rotavirus Primary Series doses */ define "Number of Rotavirus Primary Series Doses Administered": Count("Rotavirus Primary Series Doses Administered to Patient")
Two rotavirus primary series doses were administered
/* @input: Two rotavirus primary series doses were administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Rotavirus vaccines" and "Type of dose" = "Primary series") = 2 @code: Two rotavirus primary series doses were administered-118 @decision: IMMZ.D2.DT.Rotavirus */ define "Two rotavirus primary series doses were administered": "Number of Rotavirus Primary Series Doses Administered" = 2
Second rotavirus dose from the primary series was administered
/* @complete: Second rotavirus dose from the primary series was administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Rotavirus vaccines" and "Type of dose" = "Primary series") = 2 */ define "Second rotavirus dose from the primary series was administered": Encounter."Two rotavirus primary series doses were administered"
/* @internal: Brand of First Dose */ define "Brand of First Dose": First("Rotavirus Doses Administered to Patient".getDose('1')).brand()
/* @internal: Brand of Second Dose */ define "Brand of Second Dose": First("Rotavirus Doses Administered to Patient".getDose('2')).brand()
The series administered to the client contains the same product
/* @input: The series administered to the client contains the same product @pseudocode: "Vaccine brand" (where "Vaccine type" = "Rotavirus vaccines" AND "Dose number" = 1) = "Vaccine brand" (where "Vaccine type" = "Rotavirus vaccines" AND "Dose number" = 2) @code: The series administered to the client contains the same product-169 @decision: IMMZ.D2.DT.Rotavirus */ define "The series administered to the client contains the same product": "Brand of First Dose" is not null and "Brand of First Dose" ~ "Brand of Second Dose"
The series administered to the client is a mixed series or a series with unknown vaccine products
/* @input: The series administered to the client is a mixed series or a series with unknown vaccine products @pseudocode: "Vaccine brand" (where "Vaccine type" = "Rotavirus vaccines" AND "Dose number" = 1) ≠ "Vaccine brand" (where "Vaccine type" = "Rotavirus vaccines" AND "Dose number" = 2) @code: The series administered to the client is a mixed series or a series with unknown vaccine products-169 @decision: IMMZ.D2.DT.Rotavirus */ define "The series administered to the client is a mixed series or a series with unknown vaccine products": not "The series administered to the client contains the same product"
/* @input: The series contain more than two doses @pseudocode: "Total doses in series" > 2 @code: The series contain more than two doses-27 @decision: IMMZ.D2.DT.Rotavirus */ define "The series contain more than two doses": ToInteger("Rotavirus Doses Administered to Patient".mostRecent().seriesDoses()) > 2
/* @dynamicValue: Rotavirus dose 3 Expiration @pseudocode: "Date of birth" + 24 months */ define "Rotavirus dose 3 Expiration": Patient.birthDate + 24 months
Three rotavirus primary series doses were administered
/* @input: Three rotavirus primary series doses were administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Rotavirus vaccines" and "Type of dose" = "Primary series") = 3 @code: Three rotavirus primary series doses were administered-118 @decision: IMMZ.D2.DT.Rotavirus */ define "Three rotavirus primary series doses were administered": "Number of Rotavirus Primary Series Doses Administered" = 3
Third rotavirus dose from the primary series was administered
/* @complete: Third rotavirus dose from the primary series was administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Rotavirus vaccines" and "Type of dose" = "Primary series") = 3 */ define "Third rotavirus dose from the primary series was administered": Encounter."Three rotavirus primary series doses were administered"
/* @output: Rotavirus dose 3 @description: Provision of a rotavirus third dose @trigger: For a series containing more than two doses, two rotavirus primary series doses of mixed series or a series with unknown vaccine products were administered @pseudo: Count of vaccines administered (where "Vaccine type" = "Rotavirus vaccines"and "Type of dose" = "Primary series" ) = 2 AND "Vaccine brand" (where "Vaccine type" = "Rotavirus vaccines" AND "Dose number" = 1) ≠ "Vaccine brand" (where "Vaccine type" = "Rotavirus vaccines" AND "Dose number" = 2) OR "Total doses in series" > 2 @triggerDate: Latest "Date and time of vaccination" where "Vaccine type" = "Rotavirus vaccines" */ define "Rotavirus dose 3": "Second rotavirus dose from the primary series was administered" and ( Encounter."The series administered to the client is a mixed series or a series with unknown vaccine products" or Encounter."The series contain more than two doses" ) and "Rotavirus dose 3 Expiration" after day of Today and not "Third rotavirus dose from the primary series was administered"
/* @internal: Date of Latest Rotavirus Dose */ define "Date of Latest Rotavirus Dose": date from start of "Rotavirus Doses Administered to Patient".mostRecent().occurrence.toInterval()
/* @dynamicValue: Rotavirus dose 3 Due Date @pseudocode: Latest "Date and time of vaccination" (where "Vaccine type" = "Rotavirus vaccines") + 4 weeks */ define "Rotavirus dose 3 Due Date": if "Rotavirus dose 3" then Encounter."Date of Latest Rotavirus Dose" + 4 weeks else null
/* @output: Rotavirus dose 3 Create @create: For a mixed series or a series with any unknown vaccine products, a total of 3 doses of rotavirus vaccine should be administered for a complete vaccination series. RotaTeq, Rotavac and Rotasiil should be administered in a 3-dose schedule. */ define "Rotavirus dose 3 Create": if "Rotavirus dose 3" then 'For a mixed series or a series with any unknown vaccine products, a total of 3 doses of rotavirus vaccine should be administered for a complete vaccination series. RotaTeq, Rotavac and Rotasiil should be administered in a 3-dose schedule.' + ' Due Date: ' + ToString("Rotavirus dose 3 Due Date") + ' Expiration: ' + ToString("Rotavirus dose 3 Expiration") else ''
No rotavirus primary series doses were administered
/* @input: No rotavirus primary series doses were administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Rotavirus vaccines" and "Type of dose" = "Primary series") = 0 @code: No rotavirus primary series doses were administered-118 @decision: IMMZ.D2.DT.Rotavirus */ define "No rotavirus primary series doses were administered": "Number of Rotavirus Primary Series Doses Administered" = 0
/* @dynamicValue: Rotavirus dose 1 Expiration @pseudocode: "Date of birth" + 24 months */ define "Rotavirus dose 1 Expiration": Patient.birthDate + 24 months
One rotavirus primary series dose was administered
/* @input: One rotavirus primary series dose was administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Rotavirus vaccines" and "Type of dose" = "Primary series") = 1 @code: One rotavirus primary series dose was administered-118 @decision: IMMZ.D2.DT.Rotavirus */ define "One rotavirus primary series dose was administered": "Number of Rotavirus Primary Series Doses Administered" = 1
First rotavirus dose from the primary series was administered
/* @complete: First rotavirus dose from the primary series was administered @pseudocode: Count of vaccines administered (where "Vaccine type" = "Rotavirus vaccines" and "Type of dose" = "Primary series") = 1 */ define "First rotavirus dose from the primary series was administered": Encounter."One rotavirus primary series dose was administered"
/* @output: Rotavirus dose 1 @description: Provision of the rotavirus first dose @trigger: Child's birth @pseudo: @triggerDate: "Date of birth" */ define "Rotavirus dose 1": Encounter."No rotavirus primary series doses were administered" and "Rotavirus dose 1 Expiration" after day of Today and not "First rotavirus dose from the primary series was administered"
/* @dynamicValue: Rotavirus dose 1 Due Date @pseudocode: "Date of birth" + 6 weeks */ define "Rotavirus dose 1 Due Date": if "Rotavirus dose 1" then Patient.birthDate + 6 weeks else null
/* @output: Rotavirus dose 1 Create @create: WHO recommends that the first dose of rotavirus vaccine be administered as soon as possible after 6 weeks of age. */ define "Rotavirus dose 1 Create": if "Rotavirus dose 1" then 'WHO recommends that the first dose of rotavirus vaccine be administered as soon as possible after 6 weeks of age.' + ' Due Date: ' + ToString("Rotavirus dose 1 Due Date") + ' Expiration: ' + ToString("Rotavirus dose 1 Expiration") else ''
/* @dynamicValue: Rotavirus dose 2 Expiration @pseudocode: "Date of birth" + 24 months */ define "Rotavirus dose 2 Expiration": Patient.birthDate + 24 months
/* @output: Rotavirus dose 2 @description: Provision of the rotavirus second dose @trigger: First rotavirus dose from the primary series was administered @pseudo: Count of vaccines administered (where "Vaccine type" = "Rotavirus vaccines" and "Type of dose" = "Primary series") = 1 @triggerDate: Latest "Date and time of vaccination" where "Vaccine type" = "Rotavirus vaccines" */ define "Rotavirus dose 2": "First rotavirus dose from the primary series was administered" and "Rotavirus dose 2 Expiration" after day of Today and not "Second rotavirus dose from the primary series was administered"
/* @dynamicValue: Rotavirus dose 2 Due Date @pseudocode: Latest "Date and time of vaccination" (where "Vaccine type" = "Rotavirus vaccines") + 4 weeks */ define "Rotavirus dose 2 Due Date": if "Rotavirus dose 2" then Encounter."Date of Latest Rotavirus Dose" + 4 weeks else null
/* @output: Rotavirus dose 2 Create @create: A minimum interval of 4 weeks should be maintained between doses. */ define "Rotavirus dose 2 Create": if "Rotavirus dose 2" then 'A minimum interval of 4 weeks should be maintained between doses.' + ' Due Date: ' + ToString("Rotavirus dose 2 Due Date") + ' Expiration: ' + ToString("Rotavirus dose 2 Expiration") 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
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 }
/** * @description: Gets the type of antigen dose extension value from an Immunization */ define fluent function brand(immz Immunization): (First( immz.extension E where E.url = 'http://smart.who.int/immunizations/StructureDefinition/IMMZVaccineBrand' )).value as FHIR.CodeableConcept
define function ToString(value uri): value.value
/** * @description: Gets a given immunization from a list that matches the dose number */ define fluent function getDose(immunizations List<Immunization>, doseNumber String): immunizations I where exists( I.protocolApplied pa where pa.doseNumber = doseNumber )
/** * @description: Gets the series doses from an immunization */ define fluent function seriesDoses(immunization Immunization): First(immunization.protocolApplied pa where pa.seriesDoses is not null).seriesDoses
define fluent function mostRecent(immunizations List<Immunization>): Last( immunizations I sort by start of occurrence.toInterval() )
define function ToDate(value date): value.value
IMMZ.D18.S.Rotavirus schedule IMMZ.D18.S.Rotavirus schedule
WHO recommendations for routine immunization - summary tables (January 2025)
Provision of the rotavirus first dose Trigger event: Child's birth Trigger pseudo: Trigger date: "Date of birth" Create condition: WHO recommends that the first dose of rotavirus vaccine be administered as soon as possible after 6 weeks 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 rotavirus second dose Trigger event: First rotavirus dose from the primary series was administered Trigger pseudo: Count of vaccines administered (where "Vaccine type" = "Rotavirus vaccines" and "Type of dose" = "Primary series") = 1 Trigger date: Latest "Date and time of vaccination" where "Vaccine type" = "Rotavirus vaccines" Create condition: A minimum interval of 4 weeks should be maintained between doses.
Provision of a rotavirus third dose Trigger event: For a series containing more than two doses, two rotavirus primary series doses of mixed series or a series with unknown vaccine products were administered Trigger pseudo: Count of vaccines administered (where "Vaccine type" = "Rotavirus vaccines"and "Type of dose" = "Primary series" ) = 2 AND "Vaccine brand" (where "Vaccine type" = "Rotavirus vaccines" AND "Dose number" = 1) ≠ "Vaccine brand" (where "Vaccine type" = "Rotavirus vaccines" AND "Dose number" = 2) OR "Total doses in series" > 2 Trigger date: Latest "Date and time of vaccination" where "Vaccine type" = "Rotavirus vaccines" Create condition: For a mixed series or a series with any unknown vaccine products, a total of 3 doses of rotavirus vaccine should be administered for a complete vaccination series. RotaTeq, Rotavac and Rotasiil should be administered in a 3-dose schedule.