/// <summary> /// Deserialize JSON into a FHIR MeasureReport#Group /// </summary> public static void DeserializeJson(this MeasureReport.GroupComponent current, ref Utf8JsonReader reader, JsonSerializerOptions options) { string propertyName; while (reader.Read()) { if (reader.TokenType == JsonTokenType.EndObject) { return; } if (reader.TokenType == JsonTokenType.PropertyName) { propertyName = reader.GetString(); if (Hl7.Fhir.Serialization.FhirSerializerOptions.Debug) { Console.WriteLine($"MeasureReport.GroupComponent >>> MeasureReport#Group.{propertyName}, depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}"); } reader.Read(); current.DeserializeJsonProperty(ref reader, options, propertyName); } } throw new JsonException($"MeasureReport.GroupComponent: invalid state! depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}"); }
/// <summary> /// Serialize a FHIR MeasureReport#Group into JSON /// </summary> public static void SerializeJson(this MeasureReport.GroupComponent current, Utf8JsonWriter writer, JsonSerializerOptions options, bool includeStartObject = true) { if (includeStartObject) { writer.WriteStartObject(); } // Component: MeasureReport#Group, Export: GroupComponent, Base: BackboneElement (BackboneElement) ((Hl7.Fhir.Model.BackboneElement)current).SerializeJson(writer, options, false); if (current.Code != null) { writer.WritePropertyName("code"); current.Code.SerializeJson(writer, options); } if ((current.Population != null) && (current.Population.Count != 0)) { writer.WritePropertyName("population"); writer.WriteStartArray(); foreach (MeasureReport.PopulationComponent val in current.Population) { val.SerializeJson(writer, options, true); } writer.WriteEndArray(); } if (current.MeasureScore != null) { writer.WritePropertyName("measureScore"); current.MeasureScore.SerializeJson(writer, options); } if ((current.Stratifier != null) && (current.Stratifier.Count != 0)) { writer.WritePropertyName("stratifier"); writer.WriteStartArray(); foreach (MeasureReport.StratifierComponent val in current.Stratifier) { val.SerializeJson(writer, options, true); } writer.WriteEndArray(); } if (includeStartObject) { writer.WriteEndObject(); } }
/// <summary>Adds a group to report to 'reportGroup'.</summary> /// <param name="report"> The report.</param> /// <param name="reportGroup">Group the report belongs to.</param> private static void AddGroupToReport( MeasureReport report, MeasureReport.GroupComponent reportGroup) { if (reportGroup.Population.Count == 0) { reportGroup.Population = null; } if (reportGroup.Stratifier.Count == 0) { reportGroup.Stratifier = null; } report.Group.Add(reportGroup); }
/// <summary>Generates a measure report.</summary> /// <param name="org"> The organization.</param> /// <param name="parentLocation">The parent location.</param> /// <param name="period"> The period.</param> /// <param name="bedsByConfig"> The beds by configuration.</param> /// <returns>The measure report.</returns> public static MeasureReport GenerateBedMeasureReportV01( Organization org, Location parentLocation, Period period, Dictionary <BedConfiguration, List <Location> > bedsByConfig) { if (org == null) { throw new ArgumentNullException(nameof(org)); } if (parentLocation == null) { throw new ArgumentNullException(nameof(parentLocation)); } if (period == null) { throw new ArgumentNullException(nameof(period)); } if (bedsByConfig == null) { throw new ArgumentNullException(nameof(bedsByConfig)); } int totalBedCount = 0; List <MeasureReport.StratifierGroupComponent> stratums = new List <MeasureReport.StratifierGroupComponent>(); foreach (BedConfiguration bedConfig in bedsByConfig.Keys) { if (bedsByConfig[bedConfig].Count == 0) { continue; } totalBedCount += bedsByConfig[bedConfig].Count; stratums.Add(new MeasureReport.StratifierGroupComponent() { MeasureScore = new Quantity(bedsByConfig[bedConfig].Count, "Number"), Component = new List <MeasureReport.ComponentComponent>() { new MeasureReport.ComponentComponent() { Code = FhirTriplet.SanerAvailabilityStatus.GetConcept(), Value = FhirTriplet.AvailabilityStatus(bedConfig.Availability).GetConcept(), }, new MeasureReport.ComponentComponent() { Code = FhirTriplet.SanerOperationalStatus.GetConcept(), Value = FhirTriplet.OperationalStatus(bedConfig.Status).GetConcept(), }, new MeasureReport.ComponentComponent() { Code = FhirTriplet.SanerType.GetConcept(), Value = FhirTriplet.BedType(bedConfig.Type).GetConcept(), }, new MeasureReport.ComponentComponent() { Code = FhirTriplet.SanerFeature.GetConcept(), Value = FhirTriplet.BedFeature(bedConfig.Feature).GetConcept(), }, new MeasureReport.ComponentComponent() { Code = FhirTriplet.SanerLocation.GetConcept(), Value = new CodeableConcept( $"{SystemLiterals.SanerCharacteristic}/partOf", $"{parentLocation.ResourceType}/{parentLocation.Id}"), }, }, }); } MeasureReport.GroupComponent component = new MeasureReport.GroupComponent() { MeasureScore = new Quantity(totalBedCount, "Number"), Stratifier = new List <MeasureReport.StratifierComponent>() { new MeasureReport.StratifierComponent() { Stratum = stratums, }, }, }; return(new MeasureReport() { Id = NextId, Status = MeasureReport.MeasureReportStatus.Complete, Type = MeasureReport.MeasureReportType.Summary, Date = new FhirDateTime(new DateTimeOffset(DateTime.Now)).ToString(), Period = period, Measure = SystemLiterals.MeasureReportMeasurement, Reporter = new ResourceReference($"{org.ResourceType}/{org.Id}"), Group = new List <MeasureReport.GroupComponent>() { component }, Text = new Narrative() { Div = $"<div xmlns=\"http://www.w3.org/1999/xhtml\">" + $" {org.Name} Bed report for" + $" {period.Start.ToString(CultureInfo.InvariantCulture)}" + $" to" + $" {period.End.ToString(CultureInfo.InvariantCulture)}</div>", }, }); }
/// <summary>Reports for cdc grouped measure.</summary> /// <param name="id"> [out] The identifier.</param> /// <param name="measure">The measure.</param> /// <param name="data"> The data.</param> /// <returns>A MeasureReport.</returns> private static MeasureReport ReportForMeasure( out string id, Measure measure, ReportData data) { id = FhirIds.NextId; MeasureReport report = new MeasureReport() { Meta = new Meta() { Profile = new string[] { FhirSystems.MeasureReport, }, Security = FhirTriplet.SecurityTest.GetCodingList(), }, Id = id, Status = MeasureReport.MeasureReportStatus.Complete, Type = MeasureReport.MeasureReportType.Summary, Date = new FhirDateTime(new DateTimeOffset(DateTime.Now)).ToString(), Period = data.FhirPeriod(), Measure = measure.Url, Group = new List <MeasureReport.GroupComponent>(), }; if (data.ReportDate != null) { report.Date = new FhirDateTime(new DateTimeOffset((DateTime)data.ReportDate !)).ToString(); } if (data.CoveredLocation != null) { report.Subject = new ResourceReference( $"Location/{data.CoveredLocation.Id}", data.CoveredLocation.Name); if (data.CoveredOrganization != null) { report.Subject.AddExtension( "http://build.fhir.org/ig/AudaciousInquiry/saner-ig/connectathon/locations", new FhirString(data.CoveredOrganization.Id)); } #if false // 2020.05.05 - figure out if we still want contained data.CoveredLocation.ToFhir( out ResourceReference resourceReference, out Resource contained); report.Subject = resourceReference; if (contained != null) { if (report.Contained == null) { report.Contained = new List <Resource>(); } report.Contained.Add(contained); } #endif } if (data.Reporter != null) { report.Reporter = new ResourceReference( $"Organization/{data.Reporter.Id}", data.Reporter.Name); #if false // 2020.05.05 - figure out if we still want contained data.Reporter.ToFhir( out ResourceReference resourceReference, out Resource contained); report.Reporter = resourceReference; if (contained != null) { if (report.Contained == null) { report.Contained = new List <Resource>(); } report.Contained.Add(contained); } #endif } if ((data.Reporter == null) && (data.CoveredOrganization != null)) { report.Reporter = new ResourceReference( $"Organization/{data.CoveredOrganization.Id}", data.CoveredOrganization.Name); #if false // 2020.05.05 - figure out if we still want contained data.CoveredOrganization.ToFhir( out ResourceReference resourceReference, out Resource contained); report.Reporter = resourceReference; if (contained != null) { if (report.Contained == null) { report.Contained = new List <Resource>(); } report.Contained.Add(contained); } #endif } foreach (Measure.GroupComponent measureGroup in measure.Group) { if ((measureGroup.Code == null) || (measureGroup.Code.Coding == null) || (measureGroup.Code.Coding.Count == 0)) { continue; } string groupName = measureGroup.Code.Coding[0].Code; MeasureReport.GroupComponent reportGroup = new MeasureReport.GroupComponent() { Code = measureGroup.Code, Population = new List <MeasureReport.PopulationComponent>(), Stratifier = new List <MeasureReport.StratifierComponent>(), }; if (data.Values.ContainsKey(groupName)) { if (data.Values[groupName].Score != null) { reportGroup.MeasureScore = new Quantity() { Value = data.Values[groupName].Score, }; } } if ((measureGroup.Population == null) || (measureGroup.Population.Count == 0)) { if (data.Values.ContainsKey(groupName)) { reportGroup.MeasureScore = new Quantity() { Value = data.Values[groupName].Score, }; } AddGroupToReport(report, reportGroup); continue; } foreach (Measure.PopulationComponent population in measureGroup.Population) { if ((population.Code == null) || (population.Code.Coding == null) || (population.Code.Coding.Count == 0)) { continue; } string populationSystem = null; string populationName = null; string populationCode = null; foreach (Coding popCoding in population.Code.Coding) { if ((popCoding.System == FhirSystems.MeasurePopulation) || (popCoding.System == FhirSystems.SanerAggregateBool) || (popCoding.System == FhirSystems.SanerAggregateChoice)) { populationSystem = popCoding.System; populationCode = popCoding.Code; } if (data.Values.ContainsKey(popCoding.Code)) { populationName = popCoding.Code; } } if (populationSystem == FhirSystems.SanerAggregateBool) { if (populationCode == "true") { reportGroup.Population.Add(new MeasureReport.PopulationComponent() { Code = population.Code, Count = (data.Values[groupName].BoolValue == true) ? 1 : 0, }); } else { { reportGroup.Population.Add(new MeasureReport.PopulationComponent() { Code = population.Code, Count = (data.Values[groupName].BoolValue == false) ? 1 : 0, }); } } continue; } if (!string.IsNullOrEmpty(populationName)) { switch (populationCode) { case "initial-population": reportGroup.Population.Add(new MeasureReport.PopulationComponent() { Code = population.Code, Count = (int)data.Values[populationName].Score, }); break; case "measure-population": reportGroup.Population.Add(new MeasureReport.PopulationComponent() { Code = population.Code, Count = (int)data.Values[populationName].Score, }); break; case "measure-observation": // ignore break; case "numerator": reportGroup.Population.Add(new MeasureReport.PopulationComponent() { Code = population.Code, Count = data.Values[populationName].Numerator ?? (int)data.Values[populationName].Score, }); break; case "denominator": reportGroup.Population.Add(new MeasureReport.PopulationComponent() { Code = population.Code, Count = data.Values[populationName].Denominator ?? (int?)data.Values[populationName].Score ?? 1, }); break; default: if (data.Values.ContainsKey(populationName)) { reportGroup.Population.Add(new MeasureReport.PopulationComponent() { Code = population.Code, Count = (int)data.Values[populationName].Score, }); } else { reportGroup.Population.Add(new MeasureReport.PopulationComponent() { Code = population.Code, }); } break; } } } AddGroupToReport(report, reportGroup); } return(report); }
/// <summary> /// Deserialize JSON into a FHIR MeasureReport#Group /// </summary> public static void DeserializeJsonProperty(this MeasureReport.GroupComponent current, ref Utf8JsonReader reader, JsonSerializerOptions options, string propertyName) { switch (propertyName) { case "code": current.Code = new Hl7.Fhir.Model.CodeableConcept(); ((Hl7.Fhir.Model.CodeableConcept)current.Code).DeserializeJson(ref reader, options); break; case "population": if ((reader.TokenType != JsonTokenType.StartArray) || (!reader.Read())) { throw new JsonException($"GroupComponent error reading 'population' expected StartArray, found {reader.TokenType}! depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}"); } current.Population = new List <MeasureReport.PopulationComponent>(); while (reader.TokenType != JsonTokenType.EndArray) { Hl7.Fhir.Model.MeasureReport.PopulationComponent v_Population = new Hl7.Fhir.Model.MeasureReport.PopulationComponent(); v_Population.DeserializeJson(ref reader, options); current.Population.Add(v_Population); if (!reader.Read()) { throw new JsonException($"GroupComponent error reading 'population' array, read failed! depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}"); } if (reader.TokenType == JsonTokenType.EndObject) { reader.Read(); } } if (current.Population.Count == 0) { current.Population = null; } break; case "measureScore": current.MeasureScore = new Hl7.Fhir.Model.Quantity(); ((Hl7.Fhir.Model.Quantity)current.MeasureScore).DeserializeJson(ref reader, options); break; case "stratifier": if ((reader.TokenType != JsonTokenType.StartArray) || (!reader.Read())) { throw new JsonException($"GroupComponent error reading 'stratifier' expected StartArray, found {reader.TokenType}! depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}"); } current.Stratifier = new List <MeasureReport.StratifierComponent>(); while (reader.TokenType != JsonTokenType.EndArray) { Hl7.Fhir.Model.MeasureReport.StratifierComponent v_Stratifier = new Hl7.Fhir.Model.MeasureReport.StratifierComponent(); v_Stratifier.DeserializeJson(ref reader, options); current.Stratifier.Add(v_Stratifier); if (!reader.Read()) { throw new JsonException($"GroupComponent error reading 'stratifier' array, read failed! depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}"); } if (reader.TokenType == JsonTokenType.EndObject) { reader.Read(); } } if (current.Stratifier.Count == 0) { current.Stratifier = null; } break; // Complex: group, Export: GroupComponent, Base: BackboneElement default: ((Hl7.Fhir.Model.BackboneElement)current).DeserializeJsonProperty(ref reader, options, propertyName); break; } }