using Hangfire; using Microsoft.AspNetCore.SignalR; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Moq; using NUnit.Framework; using Strata.ContinuousImprovement.Biz.DbContexts; using Strata.ContinuousImprovement.Biz.DbContexts.Snowflake; using Strata.ContinuousImprovement.Biz.Exploration; using Strata.ContinuousImprovement.Biz.Exploration.Filters; using Strata.ContinuousImprovement.Biz.Notification; using Strata.ContinuousImprovement.Biz.Population; using Strata.ContinuousImprovement.Biz.Shared; using Strata.ContinuousImprovement.Biz.StrategicOpportunities; using Strata.ContinuousImprovement.Biz.StrategicOpportunities.DistributionProcess; using Strata.ContinuousImprovement.Biz.StrategicOpportunities.Enums; using Strata.ContinuousImprovement.Biz.StrategicOpportunities.Queries; using Strata.ContinuousImprovement.Biz.Test.Unit.DbContexts; using Strata.ContinuousImprovement.Biz.Test.Unit.Utilities; using Strata.DataSchema.Client; using Strata.DataSchema.Models.Query; using Strata.DataSchema.Models.Schema; using Strata.Schema.Client; using Strata.Schema.Client.Dtos; using Strata.Schema.Client.Dtos.Info; using Strata.SqlTools.Configuration.Common.AsyncFactory; using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Threading; using System.Threading.Tasks; using VerifyNUnit; using static Strata.ContinuousImprovement.Biz.Exploration.ExplorationService; namespace Strata.ContinuousImprovement.Biz.Test.Unit.StrategicOpportunities { [ExcludeFromCodeCoverage] [TestFixture, Category("Unit"), Category("CCI")] public class StrategicChargeCodeOpportunityDetailServiceTests : StrategicOpportunityTestsBase { private IStrategicChargeCodeOpportunityDetailService _strategicOpportunityDetailService; private Mock _mockDataSchemaService; private Mock _mockSchemaServiceClient; private Mock _mockSnowflakeContext; private Mock> _mockJazzDbContext; private Mock _mockExplorationService; private Mock _mockDistributionProcessFactory; private Mock _mockStrategicOpportunityDetailQueryBuilder; private Mock> _mockNotificationHubClient; private Mock> _mockLogger; private Mock _mockDimensionSyncService; private CentralDbContext _centralDbContext; [OneTimeSetUp] public void Setup() { // Create in-memory database var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(databaseName: "TestCentralDb_" + Guid.NewGuid()) .Options; _centralDbContext = new CentralDbContext(options); // Arrange mocks _mockSchemaServiceClient = new Mock(); _mockJazzDbContext = new Mock>(); _mockSnowflakeContext = new Mock(); _mockDataSchemaService = new Mock(); _mockExplorationService = new Mock(); _mockNotificationHubClient = new Mock>(); _mockLogger = new Mock>(); _mockDistributionProcessFactory = new Mock(); _mockStrategicOpportunityDetailQueryBuilder = new Mock(); _mockDimensionSyncService = new Mock(); _mockDimensionSyncService.Setup(x => x.UpsertAsync(It.IsAny(), It.IsAny())).Returns(Task.CompletedTask); _mockDimensionSyncService.Setup(x => x.DeleteAsync(It.IsAny())).Returns(Task.CompletedTask); // Seed ExplorationPopulation data for exploration test cases _centralDbContext.ExplorationPopulations.Add(new ExplorationPopulation { ExplorationPopulationId = 100, Name = "Test Exploration Population", CaseTypeFamilyId = 123, StrataId = 1, FiltersJSON = @"[{""ChipType"":4,""Key"":1,""DateRange"":[""2024-01-01T00:00:00"",""2024-12-31T00:00:00""]}]" }); _centralDbContext.SaveChanges(); // Create in-memory JazzDbContext options that will be reused var jazzOptions = new DbContextOptionsBuilder() .UseInMemoryDatabase(databaseName: "TestJazzDb_" + Guid.NewGuid()) .Options; // Seed the JazzDb with initial data using (var jazzDbContext = new JazzDbContext(jazzOptions)) { jazzDbContext.SystemSettings.Add(new SystemSetting { SystemSettingId = 1, Name = "Flexible Exploration Inpatient Case Type Family", Value = "0" }); jazzDbContext.SaveChanges(); } // Mock JazzDbContext factory to return a NEW context instance each time _mockJazzDbContext.Setup(x => x.CreateDbContextAsync(It.IsAny())) .ReturnsAsync(() => new JazzDbContext(jazzOptions)); // Mock ExplorationFilterService _mockExplorationService.Setup(x => x.GetFilterStringsAsync(It.IsAny>(), It.IsAny(), It.IsAny())) .ReturnsAsync(("WHERE DSSPES.dischargedatetime >= :DischargeDateStart AND DSSPES.dischargedatetime < :DischargeDateEnd\r\n", "AND fpes.EntityId = 1\r\n")); // Mock DataSchemaService var dataTableId = 12345; var dataColumnId = 67890; var testDataSourceId = 999; _mockDataSchemaService.Setup(x => x.GetDataSourcesAsync(It.IsAny())) .ReturnsAsync(new List { new Strata.DataSchema.Models.DataSourceManagement.DataSource { DataSourceId = testDataSourceId, Name = "DS Strata Encounter Cost Detail" } }); _mockDataSchemaService.Setup(x => x.GetDataTablesByDataSourceId(It.Is(dataSourceId => dataSourceId == testDataSourceId), It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync((int dsId, bool includeChildren, DataTableType? tableType, CancellationToken ct) => { var tableAliases = new[] { "dsspes", "pblid", "costdetail", "cc", "PATIENTTYPE", "physPrimary", "dsspeci", "explorationPopulationEncounter", "msdrg" }; return tableAliases.Select(alias => new DataTable { DataTableId = dataTableId, SqlAlias = alias }).ToList(); }); _mockDataSchemaService.Setup(x => x.GetDataColumnsBySqlColumnNameAsync(It.IsAny(), It.IsAny())) .ReturnsAsync((string columnName, CancellationToken ct) => new List { new DataColumn { DataColumnId = dataColumnId, DataTableId = dataTableId } }); _mockDataSchemaService.Setup(x => x.BuildSqlQuery(It.IsAny(), It.IsAny())) .ReturnsAsync(new SqlResponse { SqlQuery = _unitsOfServicePatPopQuery, Parameters = new List> { new(":dischargedatetime_Start_0", new DateTime(2024, 1, 1)), new(":dischargedatetime_End_1", new DateTime(2024, 12, 31)), new(":chargecodeid_2", 3541) } }); // Mock SchemaServiceClient _mockSchemaServiceClient.Setup(x => x.GetDimensionByGlobalIdAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new ScoreDimensionInfoDto { DimensionGuid = Guid.NewGuid() }); _mockSchemaServiceClient.Setup(x => x.GetDimensionMembersFromHierarchyPathsAsync(It.IsAny(), It.IsAny>(), It.IsAny())) .ReturnsAsync(new List { new MemberDto { Id = "777", Name = "Charge Code Stub" } }); _mockSchemaServiceClient.Setup(x => x.GetHierarchyNodesFromHierarchyPathsAsync(It.IsAny(), It.IsAny>(), It.IsAny())) .ReturnsAsync(new List()); // Mock Snowflake context _mockSnowflakeContext.Setup(x => x.QueryAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new List()); _mockSnowflakeContext.Setup(x => x.ExecuteScalarAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(123.45); _mockSnowflakeContext.Setup(x => x.ExecuteCommandAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(1); var claimsPrincipalAccessor = TestUtilities.GetClaimsPrincipalAccessor(); _strategicOpportunityDetailService = new StrategicChargeCodeOpportunityDetailService( _mockJazzDbContext.Object, _centralDbContext, claimsPrincipalAccessor, _mockDataSchemaService.Object, _mockSchemaServiceClient.Object, _mockSnowflakeContext.Object, _mockExplorationService.Object, _mockDistributionProcessFactory.Object, _mockStrategicOpportunityDetailQueryBuilder.Object, _mockNotificationHubClient.Object, _mockDimensionSyncService.Object, _mockLogger.Object); } [SetUp] public void TestSetup() { _centralDbContext.StrategicOpportunityMeasures.RemoveRange(_centralDbContext.StrategicOpportunityMeasures); _centralDbContext.StrategicOpportunityChargeCodes.RemoveRange(_centralDbContext.StrategicOpportunityChargeCodes); _centralDbContext.SaveChanges(); } private const string _unitsOfServicePatPopQuery = @"SELECT ""DischargeDateTime"", ZEROIFNULL(""Value"") AS ""Value"" FROM ( SELECT ""DischargeDateTime"", SUM(""Value"") AS ""Value"" FROM ( SELECT DSSPES.dischargedatetime AS ""DischargeDateTime"", SUM(PBLID.unitsofservice) AS ""Value"" FROM dss.FactPatientBillingLineItemDetail AS PBLID RIGHT JOIN clientdss.FactPatientEncounterSummary AS DSSPES ON DSSPES.encounterid = PBLID.encounterid WHERE (((DSSPES.dischargedatetime >= :dischargedatetime_Start_0 AND DSSPES.dischargedatetime <= :dischargedatetime_End_1) AND PBLID.departmentid = :departmentid_2) AND DSSPES.primaryphysicianid = :primaryphysicianid_3) GROUP BY ""DischargeDateTime"" ) GROUP BY ""DischargeDateTime"" ) ORDER BY ""DischargeDateTime"" ASC NULLS FIRST"; private const string _unitsOfServiceFlexPopQuery = @"SELECT ""DischargeDateTime"", ZEROIFNULL(""Value"") AS ""Value"" FROM ( SELECT ""DischargeDateTime"", SUM(""Value"") AS ""Value"" FROM ( SELECT DSSPES.dischargedatetime AS ""DischargeDateTime"", SUM(PBLID.unitsofservice) AS ""Value"" FROM dss.FactPatientBillingLineItemDetail AS PBLID RIGHT JOIN clientdss.FactPatientEncounterSummary AS DSSPES ON DSSPES.encounterid = PBLID.encounterid LEFT JOIN CCI.FACTEXPLORATIONPOPULATIONENCOUNTER AS EXPLORATIONPOPULATIONENCOUNTER ON EXPLORATIONPOPULATIONENCOUNTER.encounterid = PBLID.encounterid WHERE ((DSSPES.dischargedatetime >= :dischargedatetime_Start_0 AND DSSPES.dischargedatetime <= :dischargedatetime_End_1) AND EXPLORATIONPOPULATIONENCOUNTER.explorationpopulationid = :explorationpopulationid_2) GROUP BY ""DischargeDateTime"" ) GROUP BY ""DischargeDateTime"" ) ORDER BY ""DischargeDateTime"" ASC NULLS FIRST"; private const string _contributionMarginPatPopQuery = @"SELECT ""DischargeDateTime"", ""dsspesNetRevenue"", ZEROIFNULL(""Value"") AS ""Value"" FROM ( SELECT ""DischargeDateTime"", ""dsspesNetRevenue"", SUM(""Value"") AS ""Value"" FROM ( SELECT DSSPES.dischargedatetime AS ""DischargeDateTime"", DSSPES.netrevenue AS ""dsspesNetRevenue"", SUM(COSTDETAIL.variabledirectcost) AS ""Value"" FROM dss.FactPatientCostDetail AS COSTDETAIL RIGHT JOIN dss.FactPatientBillingLineItemDetail AS PBLID ON PBLID.rowid = COSTDETAIL.pblidrowid RIGHT JOIN clientdss.FactPatientEncounterSummary AS DSSPES ON DSSPES.encounterid = PBLID.encounterid WHERE ((DSSPES.dischargedatetime >= :dischargedatetime_Start_0 AND DSSPES.dischargedatetime <= :dischargedatetime_End_1)) GROUP BY ""DischargeDateTime"", ""dsspesNetRevenue"" ) GROUP BY ""DischargeDateTime"", ""dsspesNetRevenue"" ) ORDER BY ""DischargeDateTime"" ASC NULLS FIRST, ""dsspesNetRevenue"" ASC NULLS FIRST"; private const string _contributionMarginFlexPopQuery = @"SELECT ""DischargeDateTime"", ""dsspesNetRevenue"", ZEROIFNULL(""Value"") AS ""Value"" FROM ( SELECT ""DischargeDateTime"", ""dsspesNetRevenue"", SUM(""Value"") AS ""Value"" FROM ( SELECT DSSPES.dischargedatetime AS ""DischargeDateTime"", DSSPES.netrevenue AS ""dsspesNetRevenue"", SUM(COSTDETAIL.variabledirectcost) AS ""Value"" FROM dss.FactPatientCostDetail AS COSTDETAIL RIGHT JOIN dss.FactPatientBillingLineItemDetail AS PBLID ON PBLID.rowid = COSTDETAIL.pblidrowid RIGHT JOIN clientdss.FactPatientEncounterSummary AS DSSPES ON DSSPES.encounterid = PBLID.encounterid LEFT JOIN CCI.FACTEXPLORATIONPOPULATIONENCOUNTER AS EXPLORATIONPOPULATIONENCOUNTER ON EXPLORATIONPOPULATIONENCOUNTER.encounterid = PBLID.encounterid WHERE ((DSSPES.dischargedatetime >= :dischargedatetime_Start_0 AND DSSPES.dischargedatetime <= :dischargedatetime_End_1) AND EXPLORATIONPOPULATIONENCOUNTER.explorationpopulationid = :explorationpopulationid_2) GROUP BY ""DischargeDateTime"", ""dsspesNetRevenue"" ) GROUP BY ""DischargeDateTime"", ""dsspesNetRevenue"" ) ORDER BY ""DischargeDateTime"" ASC NULLS FIRST, ""dsspesNetRevenue"" ASC NULLS FIRST"; // SQL returned by BuildSqlQuery for the tracking merge path with clinical indicator population private const string _trackingPatPopQuery = @"SELECT ""dsspesEncounterId"", ""dsspesDischargeDateTime"", ""dsspesEntityID"", ""dsspesPhysicianId"", ""dsspesPrimaryServiceLineId"", ""dsspesCPTCodeCaseTypeFamilyId"", ""dsspesMSDRGCaseTypeFamilyId"", ""dsspesAPRDRGCaseTypeFamilyId"", ""pblidDepartmentId"", ""physPrimaryPhysicianSpecialtyId"", ""ccChargeCodeID"", ""ccCostDriver"", ""encounterPatientTypeRollupPatientTypeRollup"", ZEROIFNULL(""Units"") AS ""Units"", ZEROIFNULL(""Cost"") AS ""Cost"" FROM ( SELECT ""dsspesEncounterId"", ""dsspesDischargeDateTime"", ""dsspesEntityID"", ""dsspesPhysicianId"", ""dsspesPrimaryServiceLineId"", ""dsspesCPTCodeCaseTypeFamilyId"", ""dsspesMSDRGCaseTypeFamilyId"", ""dsspesAPRDRGCaseTypeFamilyId"", ""pblidDepartmentId"", ""physPrimaryPhysicianSpecialtyId"", ""ccChargeCodeID"", ""ccCostDriver"", ""encounterPatientTypeRollupPatientTypeRollup"", SUM(""Units"") AS ""Units"", SUM(""Cost"") AS ""Cost"" FROM ( SELECT DSSPES.encounterid AS ""dsspesEncounterId"", DSSPES.dischargedatetime AS ""dsspesDischargeDateTime"", DSSPES.entityid AS ""dsspesEntityID"", DSSPES.primaryphysicianid AS ""dsspesPhysicianId"", DSSPES.servicelineid AS ""dsspesPrimaryServiceLineId"", DSSPES.cptcodecasetypefamilyid AS ""dsspesCPTCodeCaseTypeFamilyId"", DSSPES.msdrgcasetypefamilyid AS ""dsspesMSDRGCaseTypeFamilyId"", DSSPES.aprdrgcasetypefamilyid AS ""dsspesAPRDRGCaseTypeFamilyId"", PBLID.departmentid AS ""pblidDepartmentId"", PHYSPRIMARY.physicianspecialtyid AS ""physPrimaryPhysicianSpecialtyId"", CC.chargecodeid AS ""ccChargeCodeID"", IFNULL(CC.costdriver::TEXT, '') AS ""ccCostDriver"", IFNULL(ENCOUNTERPATIENTTYPEROLLUP.patienttyperollup::TEXT, '') AS ""encounterPatientTypeRollupPatientTypeRollup"", NULL AS ""Cost"", SUM(PBLID.unitsofservice) AS ""Units"" FROM dss.FactPatientBillingLineItemDetail AS PBLID RIGHT JOIN clientdss.FactPatientEncounterSummary AS DSSPES ON DSSPES.encounterid = PBLID.encounterid LEFT JOIN dss.FactPatientEncounterClinicalIndicator AS DSSPECI ON DSSPECI.encounterid = PBLID.encounterid LEFT JOIN CCI.VIEWENCOUNTERPATIENTTYPEROLLUP AS ENCOUNTERPATIENTTYPEROLLUP ON ENCOUNTERPATIENTTYPEROLLUP.encounterid = PBLID.encounterid INNER JOIN FW.DIMCHARGECODE AS CC ON CC.chargecodeid = PBLID.chargecodeid INNER JOIN DSS.DIMPHYSICIAN AS PHYSPRIMARY ON PHYSPRIMARY.physicianid = DSSPES.primaryphysicianid WHERE ((DSSPES.dischargedatetime >= :dischargedatetime_Start_0 AND DSSPES.dischargedatetime <= :dischargedatetime_End_1) AND DSSPECI.clinicalindicatorid = :clinicalindicatorid_2) GROUP BY ""dsspesEncounterId"", ""dsspesDischargeDateTime"", ""dsspesEntityID"", ""dsspesPhysicianId"", ""dsspesPrimaryServiceLineId"", ""dsspesCPTCodeCaseTypeFamilyId"", ""dsspesMSDRGCaseTypeFamilyId"", ""dsspesAPRDRGCaseTypeFamilyId"", ""pblidDepartmentId"", ""physPrimaryPhysicianSpecialtyId"", ""ccChargeCodeID"", ""ccCostDriver"", ""encounterPatientTypeRollupPatientTypeRollup"" UNION ALL SELECT DSSPES.encounterid AS ""dsspesEncounterId"", DSSPES.dischargedatetime AS ""dsspesDischargeDateTime"", DSSPES.entityid AS ""dsspesEntityID"", DSSPES.primaryphysicianid AS ""dsspesPhysicianId"", DSSPES.servicelineid AS ""dsspesPrimaryServiceLineId"", DSSPES.cptcodecasetypefamilyid AS ""dsspesCPTCodeCaseTypeFamilyId"", DSSPES.msdrgcasetypefamilyid AS ""dsspesMSDRGCaseTypeFamilyId"", DSSPES.aprdrgcasetypefamilyid AS ""dsspesAPRDRGCaseTypeFamilyId"", PBLID.departmentid AS ""pblidDepartmentId"", PHYSPRIMARY.physicianspecialtyid AS ""physPrimaryPhysicianSpecialtyId"", CC.chargecodeid AS ""ccChargeCodeID"", IFNULL(CC.costdriver::TEXT, '') AS ""ccCostDriver"", IFNULL(ENCOUNTERPATIENTTYPEROLLUP.patienttyperollup::TEXT, '') AS ""encounterPatientTypeRollupPatientTypeRollup"", SUM(COSTDETAIL.variabledirectcost) AS ""Cost"", NULL AS ""Units"" FROM dss.FactPatientCostDetail AS COSTDETAIL RIGHT JOIN dss.FactPatientBillingLineItemDetail AS PBLID ON PBLID.rowid = COSTDETAIL.pblidrowid RIGHT JOIN clientdss.FactPatientEncounterSummary AS DSSPES ON DSSPES.encounterid = PBLID.encounterid LEFT JOIN dss.FactPatientEncounterClinicalIndicator AS DSSPECI ON DSSPECI.encounterid = PBLID.encounterid LEFT JOIN CCI.VIEWENCOUNTERPATIENTTYPEROLLUP AS ENCOUNTERPATIENTTYPEROLLUP ON ENCOUNTERPATIENTTYPEROLLUP.encounterid = PBLID.encounterid INNER JOIN FW.DIMCHARGECODE AS CC ON CC.chargecodeid = PBLID.chargecodeid INNER JOIN DSS.DIMPHYSICIAN AS PHYSPRIMARY ON PHYSPRIMARY.physicianid = DSSPES.primaryphysicianid WHERE ((DSSPES.dischargedatetime >= :dischargedatetime_Start_3 AND DSSPES.dischargedatetime <= :dischargedatetime_End_4) AND DSSPECI.clinicalindicatorid = :clinicalindicatorid_5) GROUP BY ""dsspesEncounterId"", ""dsspesDischargeDateTime"", ""dsspesEntityID"", ""dsspesPhysicianId"", ""dsspesPrimaryServiceLineId"", ""dsspesCPTCodeCaseTypeFamilyId"", ""dsspesMSDRGCaseTypeFamilyId"", ""dsspesAPRDRGCaseTypeFamilyId"", ""pblidDepartmentId"", ""physPrimaryPhysicianSpecialtyId"", ""ccChargeCodeID"", ""ccCostDriver"", ""encounterPatientTypeRollupPatientTypeRollup"" ) GROUP BY ""dsspesEncounterId"", ""dsspesDischargeDateTime"", ""dsspesEntityID"", ""dsspesPhysicianId"", ""dsspesPrimaryServiceLineId"", ""dsspesCPTCodeCaseTypeFamilyId"", ""dsspesMSDRGCaseTypeFamilyId"", ""dsspesAPRDRGCaseTypeFamilyId"", ""pblidDepartmentId"", ""physPrimaryPhysicianSpecialtyId"", ""ccChargeCodeID"", ""ccCostDriver"", ""encounterPatientTypeRollupPatientTypeRollup"" ) ORDER BY ""dsspesEncounterId"" ASC NULLS FIRST, ""dsspesDischargeDateTime"" ASC NULLS FIRST, ""dsspesEntityID"" ASC NULLS FIRST, ""dsspesPhysicianId"" ASC NULLS FIRST, ""dsspesPrimaryServiceLineId"" ASC NULLS FIRST, ""dsspesCPTCodeCaseTypeFamilyId"" ASC NULLS FIRST, ""dsspesMSDRGCaseTypeFamilyId"" ASC NULLS FIRST, ""dsspesAPRDRGCaseTypeFamilyId"" ASC NULLS FIRST, ""pblidDepartmentId"" ASC NULLS FIRST, ""physPrimaryPhysicianSpecialtyId"" ASC NULLS FIRST, ""ccChargeCodeID"" ASC NULLS FIRST, ""ccCostDriver"" ASC NULLS FIRST, ""encounterPatientTypeRollupPatientTypeRollup"" ASC NULLS FIRST"; // SQL returned by BuildSqlQuery for the tracking merge path with exploration population private const string _trackingFlexPopQuery = @"SELECT ""dsspesEncounterId"", ""dsspesDischargeDateTime"", ""dsspesEntityID"", ""dsspesPhysicianId"", ""dsspesPrimaryServiceLineId"", ""dsspesCPTCodeCaseTypeFamilyId"", ""dsspesMSDRGCaseTypeFamilyId"", ""dsspesAPRDRGCaseTypeFamilyId"", ""pblidDepartmentId"", ""physPrimaryPhysicianSpecialtyId"", ""ccChargeCodeID"", ""ccCostDriver"", ""encounterPatientTypeRollupPatientTypeRollup"", ZEROIFNULL(""Units"") AS ""Units"", ZEROIFNULL(""Cost"") AS ""Cost"" FROM ( SELECT ""dsspesEncounterId"", ""dsspesDischargeDateTime"", ""dsspesEntityID"", ""dsspesPhysicianId"", ""dsspesPrimaryServiceLineId"", ""dsspesCPTCodeCaseTypeFamilyId"", ""dsspesMSDRGCaseTypeFamilyId"", ""dsspesAPRDRGCaseTypeFamilyId"", ""pblidDepartmentId"", ""physPrimaryPhysicianSpecialtyId"", ""ccChargeCodeID"", ""ccCostDriver"", ""encounterPatientTypeRollupPatientTypeRollup"", SUM(""Units"") AS ""Units"", SUM(""Cost"") AS ""Cost"" FROM ( SELECT DSSPES.encounterid AS ""dsspesEncounterId"", DSSPES.dischargedatetime AS ""dsspesDischargeDateTime"", DSSPES.entityid AS ""dsspesEntityID"", DSSPES.primaryphysicianid AS ""dsspesPhysicianId"", DSSPES.servicelineid AS ""dsspesPrimaryServiceLineId"", DSSPES.cptcodecasetypefamilyid AS ""dsspesCPTCodeCaseTypeFamilyId"", DSSPES.msdrgcasetypefamilyid AS ""dsspesMSDRGCaseTypeFamilyId"", DSSPES.aprdrgcasetypefamilyid AS ""dsspesAPRDRGCaseTypeFamilyId"", PBLID.departmentid AS ""pblidDepartmentId"", PHYSPRIMARY.physicianspecialtyid AS ""physPrimaryPhysicianSpecialtyId"", CC.chargecodeid AS ""ccChargeCodeID"", IFNULL(CC.costdriver::TEXT, '') AS ""ccCostDriver"", IFNULL(ENCOUNTERPATIENTTYPEROLLUP.patienttyperollup::TEXT, '') AS ""encounterPatientTypeRollupPatientTypeRollup"", NULL AS ""Cost"", SUM(PBLID.unitsofservice) AS ""Units"" FROM dss.FactPatientBillingLineItemDetail AS PBLID RIGHT JOIN clientdss.FactPatientEncounterSummary AS DSSPES ON DSSPES.encounterid = PBLID.encounterid LEFT JOIN CCI.FACTEXPLORATIONPOPULATIONENCOUNTER AS EXPLORATIONPOPULATIONENCOUNTER ON EXPLORATIONPOPULATIONENCOUNTER.encounterid = PBLID.encounterid LEFT JOIN CCI.VIEWENCOUNTERPATIENTTYPEROLLUP AS ENCOUNTERPATIENTTYPEROLLUP ON ENCOUNTERPATIENTTYPEROLLUP.encounterid = PBLID.encounterid INNER JOIN FW.DIMCHARGECODE AS CC ON CC.chargecodeid = PBLID.chargecodeid INNER JOIN DSS.DIMPHYSICIAN AS PHYSPRIMARY ON PHYSPRIMARY.physicianid = DSSPES.primaryphysicianid WHERE ((DSSPES.dischargedatetime >= :dischargedatetime_Start_0 AND DSSPES.dischargedatetime <= :dischargedatetime_End_1) AND EXPLORATIONPOPULATIONENCOUNTER.explorationpopulationid = :explorationpopulationid_2) GROUP BY ""dsspesEncounterId"", ""dsspesDischargeDateTime"", ""dsspesEntityID"", ""dsspesPhysicianId"", ""dsspesPrimaryServiceLineId"", ""dsspesCPTCodeCaseTypeFamilyId"", ""dsspesMSDRGCaseTypeFamilyId"", ""dsspesAPRDRGCaseTypeFamilyId"", ""pblidDepartmentId"", ""physPrimaryPhysicianSpecialtyId"", ""ccChargeCodeID"", ""ccCostDriver"", ""encounterPatientTypeRollupPatientTypeRollup"" UNION ALL SELECT DSSPES.encounterid AS ""dsspesEncounterId"", DSSPES.dischargedatetime AS ""dsspesDischargeDateTime"", DSSPES.entityid AS ""dsspesEntityID"", DSSPES.primaryphysicianid AS ""dsspesPhysicianId"", DSSPES.servicelineid AS ""dsspesPrimaryServiceLineId"", DSSPES.cptcodecasetypefamilyid AS ""dsspesCPTCodeCaseTypeFamilyId"", DSSPES.msdrgcasetypefamilyid AS ""dsspesMSDRGCaseTypeFamilyId"", DSSPES.aprdrgcasetypefamilyid AS ""dsspesAPRDRGCaseTypeFamilyId"", PBLID.departmentid AS ""pblidDepartmentId"", PHYSPRIMARY.physicianspecialtyid AS ""physPrimaryPhysicianSpecialtyId"", CC.chargecodeid AS ""ccChargeCodeID"", IFNULL(CC.costdriver::TEXT, '') AS ""ccCostDriver"", IFNULL(ENCOUNTERPATIENTTYPEROLLUP.patienttyperollup::TEXT, '') AS ""encounterPatientTypeRollupPatientTypeRollup"", SUM(COSTDETAIL.variabledirectcost) AS ""Cost"", NULL AS ""Units"" FROM dss.FactPatientCostDetail AS COSTDETAIL RIGHT JOIN dss.FactPatientBillingLineItemDetail AS PBLID ON PBLID.rowid = COSTDETAIL.pblidrowid RIGHT JOIN clientdss.FactPatientEncounterSummary AS DSSPES ON DSSPES.encounterid = PBLID.encounterid LEFT JOIN CCI.FACTEXPLORATIONPOPULATIONENCOUNTER AS EXPLORATIONPOPULATIONENCOUNTER ON EXPLORATIONPOPULATIONENCOUNTER.encounterid = PBLID.encounterid LEFT JOIN CCI.VIEWENCOUNTERPATIENTTYPEROLLUP AS ENCOUNTERPATIENTTYPEROLLUP ON ENCOUNTERPATIENTTYPEROLLUP.encounterid = PBLID.encounterid INNER JOIN FW.DIMCHARGECODE AS CC ON CC.chargecodeid = PBLID.chargecodeid INNER JOIN DSS.DIMPHYSICIAN AS PHYSPRIMARY ON PHYSPRIMARY.physicianid = DSSPES.primaryphysicianid WHERE ((DSSPES.dischargedatetime >= :dischargedatetime_Start_3 AND DSSPES.dischargedatetime <= :dischargedatetime_End_4) AND EXPLORATIONPOPULATIONENCOUNTER.explorationpopulationid = :explorationpopulationid_5) GROUP BY ""dsspesEncounterId"", ""dsspesDischargeDateTime"", ""dsspesEntityID"", ""dsspesPhysicianId"", ""dsspesPrimaryServiceLineId"", ""dsspesCPTCodeCaseTypeFamilyId"", ""dsspesMSDRGCaseTypeFamilyId"", ""dsspesAPRDRGCaseTypeFamilyId"", ""pblidDepartmentId"", ""physPrimaryPhysicianSpecialtyId"", ""ccChargeCodeID"", ""ccCostDriver"", ""encounterPatientTypeRollupPatientTypeRollup"" ) GROUP BY ""dsspesEncounterId"", ""dsspesDischargeDateTime"", ""dsspesEntityID"", ""dsspesPhysicianId"", ""dsspesPrimaryServiceLineId"", ""dsspesCPTCodeCaseTypeFamilyId"", ""dsspesMSDRGCaseTypeFamilyId"", ""dsspesAPRDRGCaseTypeFamilyId"", ""pblidDepartmentId"", ""physPrimaryPhysicianSpecialtyId"", ""ccChargeCodeID"", ""ccCostDriver"", ""encounterPatientTypeRollupPatientTypeRollup"" ) ORDER BY ""dsspesEncounterId"" ASC NULLS FIRST, ""dsspesDischargeDateTime"" ASC NULLS FIRST, ""dsspesEntityID"" ASC NULLS FIRST, ""dsspesPhysicianId"" ASC NULLS FIRST, ""dsspesPrimaryServiceLineId"" ASC NULLS FIRST, ""dsspesCPTCodeCaseTypeFamilyId"" ASC NULLS FIRST, ""dsspesMSDRGCaseTypeFamilyId"" ASC NULLS FIRST, ""dsspesAPRDRGCaseTypeFamilyId"" ASC NULLS FIRST, ""pblidDepartmentId"" ASC NULLS FIRST, ""physPrimaryPhysicianSpecialtyId"" ASC NULLS FIRST, ""ccChargeCodeID"" ASC NULLS FIRST, ""ccCostDriver"" ASC NULLS FIRST, ""encounterPatientTypeRollupPatientTypeRollup"" ASC NULLS FIRST"; } }