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_1ECFD801["Service: Report Service"]
nReportService_1ECFD801 -->|produces| nAuditableEventOccurred_2E7ED8D7["Event: AuditableEventOccurred"]
nReportService_1ECFD801 -->|produces| nReadyForValidation_293CC34C["Event: ReadyForValidation"]
nReportService_1ECFD801 -->|produces| nSubmitPayload_2F556666["Event: SubmitPayload"]
nValidationComplete_7F3C0D47["Event: ValidationComplete"] -->|consumed by| nReportService_1ECFD801
nMeasureReportGenerated_38AFFB54["Event: MeasureReportGenerated"] -->|consumed by| nReportService_1ECFD801
nPatientEvent_34D33665["Event: PatientEvent"] -->|consumed by| nReportService_1ECFD801
nReportScheduled_BC6D32E["Event: ReportScheduled"] -->|consumed by| nReportService_1ECFD801
nPayloadSubmitted_2E346CAB["Event: PayloadSubmitted"] -->|consumed by| nReportService_1ECFD801
nReportService_1ECFD801 -->|sends| nDataAcquisitionRequested_4BBEB8F8["Command: DataAcquisitionRequested"]
nReportService_1ECFD801 -->|sends| nEvaluationRequested_7F27B0ED["Command: EvaluationRequested"]
nGenerateReportRequested_7BC99734["Command: GenerateReportRequested"] -->|handled by| nReportService_1ECFD801
nReportService_1ECFD801 -->|provides| nGetFacilityConfig_32C58A79["Query: GetFacilityConfig"]
nReportService_1ECFD801 -->|provides| nGetServiceInfo_13F02E06["Query: GetServiceInfo"]
subgraph nCompliance_DBAE25D_domain["Domain: Compliance"]
nAuditableEventOccurred_2E7ED8D7
nEvaluationRequested_7F27B0ED
nMeasureReportGenerated_38AFFB54
nReadyForValidation_293CC34C
nValidationComplete_7F3C0D47
end
subgraph nDataAccess_2A523756_domain["Domain: Data Access"]
nDataAcquisitionRequested_4BBEB8F8
end
subgraph nReport_4D4FBBDA_domain["Domain: Report"]
nGenerateReportRequested_7BC99734
nPatientEvent_34D33665
nPayloadSubmitted_2E346CAB
nReportScheduled_BC6D32E
nReportService_1ECFD801
nSubmitPayload_2F556666
end
subgraph nTenant_379CD514_domain["Domain: Tenant"]
nGetFacilityConfig_32C58A79
nGetServiceInfo_13F02E06
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_1ECFD801["Service: Report Service"]
nReportService_1ECFD801 -->|produces| nAuditableEventOccurred_2E7ED8D7["Event: AuditableEventOccurred"]
nReportService_1ECFD801 -->|produces| nReadyForValidation_293CC34C["Event: ReadyForValidation"]
nReportService_1ECFD801 -->|produces| nSubmitPayload_2F556666["Event: SubmitPayload"]
nValidationComplete_7F3C0D47["Event: ValidationComplete"] -->|consumed by| nReportService_1ECFD801
nMeasureReportGenerated_38AFFB54["Event: MeasureReportGenerated"] -->|consumed by| nReportService_1ECFD801
nPatientEvent_34D33665["Event: PatientEvent"] -->|consumed by| nReportService_1ECFD801
nReportScheduled_BC6D32E["Event: ReportScheduled"] -->|consumed by| nReportService_1ECFD801
nPayloadSubmitted_2E346CAB["Event: PayloadSubmitted"] -->|consumed by| nReportService_1ECFD801
nReportService_1ECFD801 -->|sends| nDataAcquisitionRequested_4BBEB8F8["Command: DataAcquisitionRequested"]
nReportService_1ECFD801 -->|sends| nEvaluationRequested_7F27B0ED["Command: EvaluationRequested"]
nGenerateReportRequested_7BC99734["Command: GenerateReportRequested"] -->|handled by| nReportService_1ECFD801
nReportService_1ECFD801 -->|provides| nGetFacilityConfig_32C58A79["Query: GetFacilityConfig"]
nReportService_1ECFD801 -->|provides| nGetServiceInfo_13F02E06["Query: GetServiceInfo"]
subgraph nCompliance_DBAE25D_domain["Domain: Compliance"]
nAuditableEventOccurred_2E7ED8D7
nEvaluationRequested_7F27B0ED
nMeasureReportGenerated_38AFFB54
nReadyForValidation_293CC34C
nValidationComplete_7F3C0D47
end
subgraph nDataAccess_2A523756_domain["Domain: Data Access"]
nDataAcquisitionRequested_4BBEB8F8
end
subgraph nReport_4D4FBBDA_domain["Domain: Report"]
nGenerateReportRequested_7BC99734
nPatientEvent_34D33665
nPayloadSubmitted_2E346CAB
nReportScheduled_BC6D32E
nReportService_1ECFD801
nSubmitPayload_2F556666
end
subgraph nTenant_379CD514_domain["Domain: Tenant"]
nGetFacilityConfig_32C58A79
nGetServiceInfo_13F02E06
end