Report Service
Overview
The Report service is responsible for persisting the Measure Reports and FHIR resources that the Measure Eval service generates after evaluating a patient against a measure. When a tenant's reporting period end date has been met, the Report Service performs various workflows to determine if all of the patient MeasureReports are accounted for that period prior to initiating the submission process.
flowchart LR
nReportService_7E534222["Service: Report Service"]
nReportService_7E534222 -->|produces| nAuditableEventOccurred_AF8D6F7["Event: AuditableEventOccurred"]
nReportService_7E534222 -->|produces| nReadyForValidation_6EC229A8["Event: ReadyForValidation"]
nReportService_7E534222 -->|produces| nSubmitPayload_6536AAAF["Event: SubmitPayload"]
nValidationComplete_6C766152["Event: ValidationComplete"] -->|consumed by| nReportService_7E534222
nMeasureReportGenerated_2395ABFF["Event: MeasureReportGenerated"] -->|consumed by| nReportService_7E534222
nPatientEvent_5A657A5A["Event: PatientEvent"] -->|consumed by| nReportService_7E534222
nReportScheduled_4CB82B8["Event: ReportScheduled"] -->|consumed by| nReportService_7E534222
nPayloadSubmitted_1D7D15C7["Event: PayloadSubmitted"] -->|consumed by| nReportService_7E534222
nReportService_7E534222 -->|sends| nDataAcquisitionRequested_2BDBDA78["Command: DataAcquisitionRequested"]
nReportService_7E534222 -->|sends| nEvaluationRequested_5C898DCC["Command: EvaluationRequested"]
nGenerateReportRequested_5FF13A3F["Command: GenerateReportRequested"] -->|handled by| nReportService_7E534222
nReportService_7E534222 -->|provides| nGetFacilityConfig_3026B4B5["Query: GetFacilityConfig"]
nReportService_7E534222 -->|provides| nGetServiceInfo_56528670["Query: GetServiceInfo"]
subgraph nCompliance_11EAF98F_domain["Domain: Compliance"]
nAuditableEventOccurred_AF8D6F7
nEvaluationRequested_5C898DCC
nMeasureReportGenerated_2395ABFF
nReadyForValidation_6EC229A8
nValidationComplete_6C766152
end
subgraph nDataAccess_43BF0C8B_domain["Domain: Data Access"]
nDataAcquisitionRequested_2BDBDA78
end
subgraph nReport_523BC237_domain["Domain: Report"]
nGenerateReportRequested_5FF13A3F
nPatientEvent_5A657A5A
nPayloadSubmitted_1D7D15C7
nReportScheduled_4CB82B8
nReportService_7E534222
nSubmitPayload_6536AAAF
end
subgraph nTenant_223E8F95_domain["Domain: Tenant"]
nGetFacilityConfig_3026B4B5
nGetServiceInfo_56528670
end
Configuration
The following environment variables and settings are used for the Report Service:
| Variable | Description |
|---|---|
ASPNETCORE_ENVIRONMENT |
The .NET environment (e.g., Docker, Development, Production) |
ServiceInformation__ServiceName |
The name of the service |
ServiceInformation__ProductVersion |
The product version |
EnableSwagger |
Enables Swagger API documentation |
KafkaConnection__BootstrapServers__0 |
Kafka broker address |
KafkaConnection__ClientId |
Kafka client ID |
KafkaConnection__SaslProtocolEnabled |
Enables SASL protocol for Kafka |
KafkaConnection__SaslUsername |
Kafka SASL username |
KafkaConnection__SaslPassword |
Kafka SASL password |
ConnectionStrings__DatabaseConnection |
SQL connection string |
Quartz__Scheduler__InstanceName |
Quartz scheduler instance name |
Quartz__Scheduler__InstanceId |
Quartz scheduler instance ID |
ConnectionStrings__Redis |
Redis connection string |
Redis__Password |
Redis password |
Authentication__EnableAnonymousAccess |
Enables anonymous authentication |
Authentication__Schemas__LinkBearer__Authority |
Authority for LinkBearer authentication |
Authentication__Schemas__LinkBearer__ValidateToken |
Validate LinkBearer tokens |
LinkTokenService__Authority |
Authority for LinkTokenService |
LinkTokenService__LinkAdminEmail |
Admin email for LinkTokenService |
LinkTokenService__TokenLifespan |
Token lifespan for LinkTokenService |
LinkTokenService__SigningKey |
Signing key for LinkTokenService |
CORS__AllowAllOrigins |
Allow all origins for CORS |
CORS__AllowedOrigins |
List of allowed origins for CORS |
CORS__AllowAllMethods |
Allow all HTTP methods for CORS |
CORS__AllowedMethods |
List of allowed HTTP methods for CORS |
CORS__AllowAllHeaders |
Allow all headers for CORS |
CORS__AllowedHeaders |
List of allowed headers for CORS |
CORS__AllowedExposedHeaders |
List of exposed headers for CORS |
CORS__AllowCredentials |
Allow credentials for CORS |
CORS__MaxAge |
Max age for CORS preflight requests |
Telemetry__EnableTelemetry |
Enables telemetry |
Telemetry__EnableRuntimeInstrumentation |
Enables runtime instrumentation for telemetry |
Telemetry__EnableOtelCollector |
Enables OpenTelemetry collector integration |
Telemetry__OtelCollectorEndpoint |
OpenTelemetry collector endpoint |
Telemetry__EnableAzureMonitor |
Enables Azure Monitor integration |
Logging__LogLevel__Default |
Default log level |
Logging__LogLevel__Microsoft.AspNetCore |
Log level for Microsoft.AspNetCore |
Logging__LogLevel__System |
Log level for System |
Serilog__Using__0 |
Serilog sink (e.g., Console, Grafana.Loki) |
Serilog__MinimumLevel__Default |
Serilog minimum log level |
Serilog__MinimumLevel__Override__Microsoft |
Serilog override for Microsoft |
Serilog__MinimumLevel__Override__System |
Serilog override for System |
Serilog__WriteTo__0__Name |
Serilog sink name (e.g., GrafanaLoki) |
Serilog__WriteTo__0__Args__uri |
Loki logging endpoint |
Serilog__WriteTo__0__Args__labels__0__key |
Serilog label key (e.g., app) |
Serilog__WriteTo__0__Args__labels__0__value |
Serilog label value (e.g., link-cloud) |
Serilog__WriteTo__0__Args__labels__1__key |
Serilog label key (e.g., component) |
Serilog__WriteTo__0__Args__labels__1__value |
Serilog label value (e.g., Report) |
Serilog__WriteTo__0__Args__propertiesAsLabels__0 |
Serilog property as label (e.g., app) |
Serilog__WriteTo__0__Args__propertiesAsLabels__1 |
Serilog property as label (e.g., component) |
Serilog__WriteTo__1__Name |
Serilog sink name (e.g., Console) |
ServiceRegistry__TenantService__TenantServiceUrl |
Tenant service URL |
ServiceRegistry__TenantService__CheckIfTenantExists |
Whether to check if tenant exists |
ServiceRegistry__TenantService__GetTenantRelativeEndpoint |
Relative endpoint for tenant service |
ConsumerSettings__ConsumerRetryDuration |
Retry durations for Kafka consumers |
ConsumerSettings__DisableRetryConsumer |
Disable retry consumer |
ConsumerSettings__DisableConsumer |
Disable consumer |
InternalBlobStorage__ConnectionString |
Connection string for internal blob storage |
InternalBlobStorage__BlobContainerName |
Blob container name for internal storage |
AllowReflection |
Allow reflection in the service |
AllowedHosts |
Allowed hosts for the service |
ports |
Exposed port for the service (default: 8072) |
For a full list of environment variables and their usage, see the docker-compose.yml file and the
appsettings.jsonfile.
Common Configurations
- Swagger
- Azure App Configuration
- Kafka Configuration
- Kafka Consumer Retry Configuration
- Service Registry Configuration
- CORS Configuration
- Token Service Configuration
- Service Authentication
- SQL Server Database Configuration
Features and Functionality
Retry Scheduling in the Report Service:
Within the Report service, retries are scheduled using Quartz.NET's in-memory scheduler. The retry jobs are managed by a dedicated RetryScheduleService that uses the "InMemoryScheduler" (registered via keyed dependency injection) to schedule and execute retry operations. This approach ensures that retry jobs are lightweight, fast, and do not persist across service restarts making them ideal for transient, short-lived retry logic where durability is not required.
Impact of InMemory vs. SQL Persistence:
Using the in-memory scheduler for retries means that retry jobs are lost if the service restarts or crashes, but this is often acceptable for retry logic that can be safely re-queued or recalculated. In contrast, SQL persistence (used for report scheduling) ensures that jobs survive restarts, support clustering, and provide fault tolerance critical for business workflows that must not be lost. This dual approach allows the Report service to balance reliability and performance: persistent scheduling for essential workflows, and fast, resource-efficient in-memory scheduling for retries and transient operations.
Different types of report generation methods:
- Scheduled Reports - Scheduling system used to automatically create reports (aka: ScheduledReport events) based on schedule routine (ie. a CRON specification)
- Adhoc Report - Create a ScheduledReport event manually for a one-time configuration of tenant, measures and reporting period (dates). You may optionally specify the list of patients for the report; if not specified, it will ask the census service for the patients of interest during the reporting period dates.
- Regenerate Report - Provide a previously created report ID to re-generate the report, bypassing data acquisition and normalization, and skipping straight to evaluation. This is useful in cases where the measure has changed and a report needs to be re-evaluated against the new measure version.
Database Schema
| Name | Type | Required? | Length |
|---|---|---|---|
| MigrationId | string | Yes | 150 |
| ProductVersion | string | Yes | 32 |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | integer | Yes | |
| ReportEntryId | string | Yes | |
| MeasureReportId | string | No | 100 |
| Status | string | Yes | 50 |
| ReportType | string | Yes | 100 |
| MeasureReportUri | string | No | 1024 |
| MeasureReportFileName | string | No | 500 |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | integer | Yes | |
| ReportPopulationId | string | Yes | |
| PopulationId | string | No | 100 |
| PopulationCodeJson | string | No | |
| TotalPopulationCount | integer | Yes |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | integer | Yes | |
| GroupPopulationId | integer | Yes | |
| MeasureReportId | string | Yes | 100 |
| PopulationCount | integer | Yes |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | string | Yes | |
| CreateDate | string (date-time) | Yes | |
| ModifyDate | string (date-time) | No | |
| FacilityId | string | Yes | 100 |
| ReportScheduleId | string | Yes | |
| PatientId | string | Yes | 100 |
| ReportingStatus | string | Yes | 50 |
| SubmissionStatus | string | No | 50 |
| SubmitReportDateTime | string (date-time) | No | |
| AggregateReportUri | string | No | 1024 |
| AggregateReportBlobName | string | No | 500 |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | string | Yes | |
| CreateDate | string (date-time) | Yes | |
| ModifyDate | string (date-time) | No | |
| FacilityId | string | Yes | 100 |
| ReportScheduleId | string | Yes | |
| Measure | string | No | 200 |
| ReportType | string | Yes | 100 |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | string | Yes | |
| CreateDate | string (date-time) | Yes | |
| ModifyDate | string (date-time) | No | |
| FacilityId | string | Yes | 100 |
| ReportScheduleId | string | Yes | |
| PatientId | string | Yes | 100 |
| MeasureReportId | string | Yes | 100 |
| ResourceType | string | Yes | 100 |
| ResourceId | string | Yes | 100 |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | string | Yes | |
| CreateDate | string (date-time) | Yes | |
| ModifyDate | string (date-time) | No | |
| FacilityId | string | Yes | 100 |
| ReportStartDate | string (date-time) | Yes | |
| ReportEndDate | string (date-time) | Yes | |
| SubmitReportDateTime | string (date-time) | No | |
| EnableSubmission | boolean | Yes | |
| EndOfReportPeriodJobHasRun | boolean | Yes | |
| AdHocType | string | No | 50 |
| Frequency | string | Yes | 50 |
| PayloadRootUri | string | No | 1024 |
| Status | string | Yes | 50 |
| IsDeleted | boolean | No |
| Name | Type | Required? | Length |
|---|---|---|---|
| MeasureReportId | integer | Yes | |
| ResourceType | string | Yes | 100 |
| ResourceCount | integer | Yes |
| Name | Type | Required? | Length |
|---|---|---|---|
| ReportScheduleId | string | Yes | |
| ReportType | string | Yes | 100 |
| Name | Type | Required? | Length |
|---|---|---|---|
| SCHED_NAME | string | Yes | 120 |
| TRIGGER_NAME | string | Yes | 150 |
| TRIGGER_GROUP | string | Yes | 150 |
| BLOB_DATA | string | No |
| Name | Type | Required? | Length |
|---|---|---|---|
| SCHED_NAME | string | Yes | 120 |
| CALENDAR_NAME | string | Yes | 200 |
| CALENDAR | string | Yes |
| Name | Type | Required? | Length |
|---|---|---|---|
| SCHED_NAME | string | Yes | 120 |
| TRIGGER_NAME | string | Yes | 150 |
| TRIGGER_GROUP | string | Yes | 150 |
| CRON_EXPRESSION | string | Yes | 120 |
| TIME_ZONE_ID | string | No | 120 |
| Name | Type | Required? | Length |
|---|---|---|---|
| SCHED_NAME | string | Yes | 120 |
| ENTRY_ID | string | Yes | 140 |
| TRIGGER_NAME | string | Yes | 150 |
| TRIGGER_GROUP | string | Yes | 150 |
| INSTANCE_NAME | string | Yes | 150 |
| FIRED_TIME | integer | Yes | |
| SCHED_TIME | integer | Yes | |
| PRIORITY | integer | Yes | |
| STATE | string | Yes | 16 |
| JOB_NAME | string | No | 150 |
| JOB_GROUP | string | No | 150 |
| IS_NONCONCURRENT | boolean | Yes | |
| REQUESTS_RECOVERY | boolean | No |
| Name | Type | Required? | Length |
|---|---|---|---|
| SCHED_NAME | string | Yes | 120 |
| JOB_NAME | string | Yes | 150 |
| JOB_GROUP | string | Yes | 150 |
| DESCRIPTION | string | No | 250 |
| JOB_CLASS_NAME | string | Yes | 250 |
| IS_DURABLE | boolean | Yes | |
| IS_NONCONCURRENT | boolean | Yes | |
| IS_UPDATE_DATA | boolean | Yes | |
| REQUESTS_RECOVERY | boolean | Yes | |
| JOB_DATA | string | No |
| Name | Type | Required? | Length |
|---|---|---|---|
| SCHED_NAME | string | Yes | 120 |
| LOCK_NAME | string | Yes | 40 |
| Name | Type | Required? | Length |
|---|---|---|---|
| SCHED_NAME | string | Yes | 120 |
| TRIGGER_GROUP | string | Yes | 150 |
| Name | Type | Required? | Length |
|---|---|---|---|
| SCHED_NAME | string | Yes | 120 |
| INSTANCE_NAME | string | Yes | 200 |
| LAST_CHECKIN_TIME | integer | Yes | |
| CHECKIN_INTERVAL | integer | Yes |
| Name | Type | Required? | Length |
|---|---|---|---|
| SCHED_NAME | string | Yes | 120 |
| TRIGGER_NAME | string | Yes | 150 |
| TRIGGER_GROUP | string | Yes | 150 |
| REPEAT_COUNT | integer | Yes | |
| REPEAT_INTERVAL | integer | Yes | |
| TIMES_TRIGGERED | integer | Yes |
| Name | Type | Required? | Length |
|---|---|---|---|
| SCHED_NAME | string | Yes | 120 |
| TRIGGER_NAME | string | Yes | 150 |
| TRIGGER_GROUP | string | Yes | 150 |
| STR_PROP_1 | string | Yes | 512 |
| STR_PROP_2 | string | Yes | 512 |
| STR_PROP_3 | string | Yes | 512 |
| INT_PROP_1 | integer | No | |
| INT_PROP_2 | integer | No | |
| LONG_PROP_1 | integer | No | |
| LONG_PROP_2 | integer | No | |
| DEC_PROP_1 | number | No | |
| DEC_PROP_2 | number | No | |
| BOOL_PROP_1 | boolean | No | |
| BOOL_PROP_2 | boolean | No | |
| TIME_ZONE_ID | string | No | 80 |
| Name | Type | Required? | Length |
|---|---|---|---|
| SCHED_NAME | string | Yes | 120 |
| TRIGGER_NAME | string | Yes | 150 |
| TRIGGER_GROUP | string | Yes | 150 |
| JOB_NAME | string | Yes | 150 |
| JOB_GROUP | string | Yes | 150 |
| DESCRIPTION | string | No | 250 |
| NEXT_FIRE_TIME | integer | No | |
| PREV_FIRE_TIME | integer | No | |
| PRIORITY | integer | No | |
| TRIGGER_STATE | string | Yes | 16 |
| TRIGGER_TYPE | string | Yes | 8 |
| START_TIME | integer | Yes | |
| END_TIME | integer | No | |
| CALENDAR_NAME | string | No | 200 |
| MISFIRE_INSTR | integer | No | |
| JOB_DATA | string | No |
OpenAPI Operations
Route Parameters
None
Query Parameters
None
Returns a report entry record for the given entry Id
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| id | Yes |
Query Parameters
None
Returns report entries for the given entry report schedule Id.
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| reportScheduleId | Yes |
Query Parameters
None
Returns a report entry record for the given entry report schedule Id and patient Id.
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| reportScheduleId | Yes | ||
| patientId | Yes |
Query Parameters
None
Returns the count of report entries for the given report schedule Id.
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| reportScheduleId | Yes |
Query Parameters
None
Returns a summary count of report types, reporting statuses, and submission statuses for the given report schedule Id.
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| reportScheduleId | Yes |
Query Parameters
None
Returns report entry records for the given patient Id.
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| patientId | Yes |
Query Parameters
None
Returns paged report entries with optional filters
Route Parameters
None
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| facilityId | No | Optional facility ID filter | |
| patientId | No | Optional patient ID filter | |
| reportScheduleId | No | Optional report schedule ID filter | |
| reportingStatuses | No | ||
| submissionStatuses | No | ||
| submissionStatusIsNull | No | Optional flag to filter entries with no submission status | |
| reportType | No | Optional report type filter | |
| sortBy | No | Optional sort field (e.g., "CreateDate", "PatientId") | |
| sortOrder | No | Optional sort order (Ascending or Descending) | |
| pageSize | No | Number of records per page (default: 10) | |
| pageNumber | No | Page number (default: 1) |
Returns a report population record for the given Id
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| id | Yes |
Query Parameters
None
Returns report population records for the given report schedule Id. An optional 'reportType' parameter is available to specify which associated report type the returned population should be for.
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| reportScheduleId | Yes |
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| reportType | No |
Returns the count of MeasureReportPopulations in the initial population for the given report schedule Id
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| reportScheduleId | Yes |
Query Parameters
None
Returns a report resource record for the given report resource Id
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| id | Yes |
Query Parameters
None
Returns report resource entries for the given report schedule Id.
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| reportScheduleId | Yes |
Query Parameters
None
Returns report resource records for the given report schedule Id and patient Id.
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| reportScheduleId | Yes | ||
| patientId | Yes |
Query Parameters
None
Returns report resource records for the given patient Id.
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| patientId | Yes |
Query Parameters
None
Returns paged report resources with optional filters
Route Parameters
None
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| facilityId | No | Optional facility ID filter | |
| reportScheduleId | No | Optional report schedule ID filter | |
| patientId | No | Optional patient ID filter | |
| measureReportId | No | Optional measure report ID filter | |
| resourceType | No | Optional resource type filter | |
| resourceId | No | Optional resource ID filter | |
| sortBy | No | Optional sort field (e.g., "CreateDate", "ResourceType") | |
| sortOrder | No | Optional sort order (Ascending or Descending) | |
| pageSize | No | Number of records per page (default: 10) | |
| pageNumber | No | Page number (default: 1) |
Returns a scheduled report record for the given report schedule Id
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| id | Yes |
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| includeDeleted | No | When set to `true`, includes soft-deleted report schedules. Defaults to `false`. |
Soft deletes a single report schedule by its ID.
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| id | Yes | The ID of the report schedule to soft delete. |
Query Parameters
None
Returns scheduled reports for the given facility Id. An optional 'active' parameter is available to only return current active reports. An optional 'blocking' parameter filters to only reports with statuses that block facility deletion (New, EndOfPeriod). An optional 'includeDeleted' parameter is available to include soft-deleted reports.
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| facilityId | Yes |
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| active | No | ||
| blocking | No | When set to `true`, returns only report schedules with a status of `New` or `EndOfPeriod` � the statuses that indicate a report is actively in progress and would block a facility soft-delete. Defaults to `false`. | |
| includeDeleted | No | When set to `true`, includes soft-deleted report schedules. Defaults to `false`. |
Restores a single soft-deleted report schedule by its ID.
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| id | Yes | The ID of the report schedule to restore. |
Query Parameters
None
Sets the deleted status for all report schedules associated with a facility.
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| facilityId | Yes | The unique identifier of the facility. |
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| deleted | No | When set to `true`, marks all report schedules for the facility as deleted. When set to `false`, restores all previously deleted report schedules. |
Returns paged scheduled reports with optional filters
Route Parameters
None
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| facilityId | No | Optional facility ID filter | |
| frequency | No | Optional frequency filter | |
| reportType | No | Optional report type filter | |
| reportStartDate | No | Optional report start date filter (inclusive) | |
| reportEndDate | No | Optional report end date filter (inclusive) | |
| status | No | Optional status filter � supports multiple values (e.g. status=New&status=Submitted) | |
| endOfReportPeriodJobHasRun | No | Optional end of report period job flag filter | |
| includeDeleted | No | Optional include deleted filter | |
| sortBy | No | Optional sort field (e.g., "CreateDate", "ReportStartDate") | |
| sortOrder | No | Optional sort order (Ascending or Descending) | |
| pageSize | No | Number of records per page (default: 10) | |
| pageNumber | No | Page number (default: 1) | |
| createDate | No | ||
| id | No |
Health check endpoint
Route Parameters
None
Query Parameters
None
Relationships
flowchart LR
nReportService_7E534222["Service: Report Service"]
nReportService_7E534222 -->|produces| nAuditableEventOccurred_AF8D6F7["Event: AuditableEventOccurred"]
nReportService_7E534222 -->|produces| nReadyForValidation_6EC229A8["Event: ReadyForValidation"]
nReportService_7E534222 -->|produces| nSubmitPayload_6536AAAF["Event: SubmitPayload"]
nValidationComplete_6C766152["Event: ValidationComplete"] -->|consumed by| nReportService_7E534222
nMeasureReportGenerated_2395ABFF["Event: MeasureReportGenerated"] -->|consumed by| nReportService_7E534222
nPatientEvent_5A657A5A["Event: PatientEvent"] -->|consumed by| nReportService_7E534222
nReportScheduled_4CB82B8["Event: ReportScheduled"] -->|consumed by| nReportService_7E534222
nPayloadSubmitted_1D7D15C7["Event: PayloadSubmitted"] -->|consumed by| nReportService_7E534222
nReportService_7E534222 -->|sends| nDataAcquisitionRequested_2BDBDA78["Command: DataAcquisitionRequested"]
nReportService_7E534222 -->|sends| nEvaluationRequested_5C898DCC["Command: EvaluationRequested"]
nGenerateReportRequested_5FF13A3F["Command: GenerateReportRequested"] -->|handled by| nReportService_7E534222
nReportService_7E534222 -->|provides| nGetFacilityConfig_3026B4B5["Query: GetFacilityConfig"]
nReportService_7E534222 -->|provides| nGetServiceInfo_56528670["Query: GetServiceInfo"]
subgraph nCompliance_11EAF98F_domain["Domain: Compliance"]
nAuditableEventOccurred_AF8D6F7
nEvaluationRequested_5C898DCC
nMeasureReportGenerated_2395ABFF
nReadyForValidation_6EC229A8
nValidationComplete_6C766152
end
subgraph nDataAccess_43BF0C8B_domain["Domain: Data Access"]
nDataAcquisitionRequested_2BDBDA78
end
subgraph nReport_523BC237_domain["Domain: Report"]
nGenerateReportRequested_5FF13A3F
nPatientEvent_5A657A5A
nPayloadSubmitted_1D7D15C7
nReportScheduled_4CB82B8
nReportService_7E534222
nSubmitPayload_6536AAAF
end
subgraph nTenant_223E8F95_domain["Domain: Tenant"]
nGetFacilityConfig_3026B4B5
nGetServiceInfo_56528670
end