diff --git a/application/CohortManager/src/Functions/Shared/DataServices.Migrations/Migrations/20251203173828_AddPowerBIViews.Designer.cs b/application/CohortManager/src/Functions/Shared/DataServices.Migrations/Migrations/20251203173828_AddPowerBIViews.Designer.cs
new file mode 100644
index 000000000..11f209126
--- /dev/null
+++ b/application/CohortManager/src/Functions/Shared/DataServices.Migrations/Migrations/20251203173828_AddPowerBIViews.Designer.cs
@@ -0,0 +1,1076 @@
+//
+using System;
+using DataServices.Database;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace DataServices.Migrations.Migrations
+{
+ [DbContext(typeof(DataServicesContext))]
+ [Migration("20251203173828_AddPowerBIViews")]
+ partial class AddPowerBIViews
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "9.0.2")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+ modelBuilder.Entity("Model.BsSelectGpPractice", b =>
+ {
+ b.Property("GpPracticeCode")
+ .HasColumnType("nvarchar(450)")
+ .HasColumnName("GP_PRACTICE_CODE");
+
+ b.Property("AuditCreatedTimeStamp")
+ .HasColumnType("datetime")
+ .HasColumnName("AUDIT_CREATED_TIMESTAMP");
+
+ b.Property("AuditId")
+ .HasColumnType("decimal(18,2)")
+ .HasColumnName("AUDIT_ID");
+
+ b.Property("AuditLastUpdatedTimeStamp")
+ .HasColumnType("datetime")
+ .HasColumnName("AUDIT_LAST_MODIFIED_TIMESTAMP");
+
+ b.Property("AuditText")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("AUDIT_TEXT");
+
+ b.Property("BsoCode")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("BSO");
+
+ b.Property("CountryCategory")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("COUNTRY_CATEGORY");
+
+ b.HasKey("GpPracticeCode");
+
+ b.ToTable("BS_SELECT_GP_PRACTICE_LKP", "dbo");
+ });
+
+ modelBuilder.Entity("Model.BsSelectOutCode", b =>
+ {
+ b.Property("Outcode")
+ .HasColumnType("nvarchar(450)")
+ .HasColumnName("OUTCODE");
+
+ b.Property("AuditCreatedTimeStamp")
+ .HasColumnType("datetime")
+ .HasColumnName("AUDIT_CREATED_TIMESTAMP");
+
+ b.Property("AuditId")
+ .HasColumnType("decimal(18,2)")
+ .HasColumnName("AUDIT_ID");
+
+ b.Property("AuditLastModifiedTimeStamp")
+ .HasColumnType("datetime")
+ .HasColumnName("AUDIT_LAST_MODIFIED_TIMESTAMP");
+
+ b.Property("AuditText")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("AUDIT_TEXT");
+
+ b.Property("BSO")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("BSO");
+
+ b.HasKey("Outcode");
+
+ b.ToTable("BS_SELECT_OUTCODE_MAPPING_LKP", "dbo");
+ });
+
+ modelBuilder.Entity("Model.BsSelectRequestAudit", b =>
+ {
+ b.Property("RequestId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("REQUEST_ID");
+
+ b.Property("CreatedDateTime")
+ .HasColumnType("datetime")
+ .HasColumnName("CREATED_DATETIME");
+
+ b.Property("StatusCode")
+ .IsRequired()
+ .HasMaxLength(3)
+ .HasColumnType("nvarchar(3)")
+ .HasColumnName("STATUS_CODE");
+
+ b.HasKey("RequestId");
+
+ b.ToTable("BS_SELECT_REQUEST_AUDIT", "dbo");
+ });
+
+ modelBuilder.Entity("Model.BsoOrganisation", b =>
+ {
+ b.Property("BsoOrganisationId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasColumnName("BSO_ORGANISATION_ID");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("BsoOrganisationId"));
+
+ b.Property("AddressLine1")
+ .HasMaxLength(35)
+ .HasColumnType("nvarchar(35)")
+ .HasColumnName("ADDRESS_LINE_1");
+
+ b.Property("AddressLine2")
+ .HasMaxLength(35)
+ .HasColumnType("nvarchar(35)")
+ .HasColumnName("ADDRESS_LINE_2");
+
+ b.Property("AddressLine3")
+ .HasMaxLength(35)
+ .HasColumnType("nvarchar(35)")
+ .HasColumnName("ADDRESS_LINE_3");
+
+ b.Property("AddressLine4")
+ .HasMaxLength(35)
+ .HasColumnType("nvarchar(35)")
+ .HasColumnName("ADDRESS_LINE_4");
+
+ b.Property("AddressLine5")
+ .HasMaxLength(35)
+ .HasColumnType("nvarchar(35)")
+ .HasColumnName("ADDRESS_LINE_5");
+
+ b.Property("AdminEmailAddress")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("ADMIN_EMAIL_ADDRESS");
+
+ b.Property("AutoBatchLastRun")
+ .HasColumnType("datetime2")
+ .HasColumnName("AUTO_BATCH_LAST_RUN");
+
+ b.Property("AutoBatchMaxDateTimeProcessed")
+ .HasColumnType("datetime2")
+ .HasColumnName("AUTO_BATCH_MAX_DATE_TIME_PROCESSED");
+
+ b.Property("BsoOrganisationCode")
+ .IsRequired()
+ .HasMaxLength(4)
+ .HasColumnType("nvarchar(4)")
+ .HasColumnName("BSO_ORGANISATION_CODE");
+
+ b.Property("BsoOrganisationName")
+ .IsRequired()
+ .HasMaxLength(60)
+ .HasColumnType("nvarchar(60)")
+ .HasColumnName("BSO_ORGANISATION_NAME");
+
+ b.Property("BsoRecallInterval")
+ .HasColumnType("tinyint")
+ .HasColumnName("BSO_RECALL_INTERVAL");
+
+ b.Property("BsoRegionId")
+ .HasColumnType("int")
+ .HasColumnName("BSO_REGION_ID");
+
+ b.Property("EmailAddress")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("EMAIL_ADDRESS");
+
+ b.Property("Extension")
+ .HasMaxLength(35)
+ .HasColumnType("nvarchar(35)")
+ .HasColumnName("EXTENSION");
+
+ b.Property("FailSafeDateOfMonth")
+ .HasColumnType("tinyint")
+ .HasColumnName("FAILSAFE_DATE_OF_MONTH");
+
+ b.Property("FailSafeLastRun")
+ .HasColumnType("datetime2")
+ .HasColumnName("FAILSAFE_LAST_RUN");
+
+ b.Property("FailSafeMaxAgeMonths")
+ .HasColumnType("tinyint")
+ .HasColumnName("FAILSAFE_MAX_AGE_MONTHS");
+
+ b.Property("FailSafeMaxAgeYears")
+ .HasColumnType("tinyint")
+ .HasColumnName("FAILSAFE_MAX_AGE_YEARS");
+
+ b.Property("FailSafeMinAgeMonths")
+ .HasColumnType("tinyint")
+ .HasColumnName("FAILSAFE_MIN_AGE_MONTHS");
+
+ b.Property("FailSafeMinAgeYears")
+ .HasColumnType("tinyint")
+ .HasColumnName("FAILSAFE_MIN_AGE_YEARS");
+
+ b.Property("FailSafeMonths")
+ .HasColumnType("tinyint")
+ .HasColumnName("FAILSAFE_MONTHS");
+
+ b.Property("FaxNumber")
+ .HasMaxLength(35)
+ .HasColumnType("nvarchar(35)")
+ .HasColumnName("FAX_NUMBER");
+
+ b.Property("FoaMaxOffset")
+ .HasColumnType("tinyint")
+ .HasColumnName("FOA_MAX_OFFSET");
+
+ b.Property("IepDetails")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("IEP_DETAILS");
+
+ b.Property("IgnoreEarlyRecall")
+ .HasColumnType("bit")
+ .HasColumnName("IGNORE_EARLY_RECALL");
+
+ b.Property("IgnoreGPReferrals")
+ .HasColumnType("bit")
+ .HasColumnName("IGNORE_GP_REFERRALS");
+
+ b.Property("IgnoreSelfReferrals")
+ .HasColumnType("bit")
+ .HasColumnName("IGNORE_SELF_REFERRALS");
+
+ b.Property("InviteListSequenceNumber")
+ .HasColumnType("int")
+ .HasColumnName("INVITE_LIST_SEQUENCE_NUMBER");
+
+ b.Property("IsActive")
+ .HasColumnType("bit")
+ .HasColumnName("IS_ACTIVE");
+
+ b.Property("IsAgex")
+ .HasColumnType("bit")
+ .HasColumnName("IS_AGEX");
+
+ b.Property("IsAgexActive")
+ .HasColumnType("bit")
+ .HasColumnName("IS_AGEX_ACTIVE");
+
+ b.Property("LinkCode")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("LINK_CODE");
+
+ b.Property("LowerAgeRange")
+ .HasColumnType("tinyint")
+ .HasColumnName("LOWER_AGE_RANGE");
+
+ b.Property("Notes")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("NOTES");
+
+ b.Property("OutgoingTransferNumber")
+ .HasColumnType("int")
+ .HasColumnName("OUTGOING_TRANSFER_NUMBER");
+
+ b.Property("PostCode")
+ .HasMaxLength(8)
+ .HasColumnType("nvarchar(8)")
+ .HasColumnName("POSTCODE");
+
+ b.Property("RispRecallInterval")
+ .HasColumnType("tinyint")
+ .HasColumnName("RISP_RECALL_INTERVAL");
+
+ b.Property("RlpDateEnabled")
+ .HasColumnType("datetime2")
+ .HasColumnName("RLP_DATE_ENABLED");
+
+ b.Property("SafetyPeriod")
+ .HasColumnType("tinyint")
+ .HasColumnName("SAFETY_PERIOD");
+
+ b.Property("TelephoneNumber")
+ .HasMaxLength(18)
+ .HasColumnType("nvarchar(18)")
+ .HasColumnName("TELEPHONE_NUMBER");
+
+ b.Property("TransactionAppDateTime")
+ .HasColumnType("datetime2")
+ .HasColumnName("TRANSACTION_APP_DATE_TIME");
+
+ b.Property("TransactionDbDateTime")
+ .HasColumnType("datetime2")
+ .HasColumnName("TRANSACTION_DB_DATE_TIME");
+
+ b.Property("TransactionId")
+ .HasColumnType("int")
+ .HasColumnName("TRANSACTION_ID");
+
+ b.Property("TransactionUserOrgRoleId")
+ .HasColumnType("int")
+ .HasColumnName("TRANSACTION_USER_ORG_ROLE_ID");
+
+ b.Property("UpperAgeRange")
+ .HasColumnType("tinyint")
+ .HasColumnName("UPPER_AGE_RANGE");
+
+ b.HasKey("BsoOrganisationId");
+
+ b.ToTable("BSO_ORGANISATIONS", "dbo");
+ });
+
+ modelBuilder.Entity("Model.CohortDistribution", b =>
+ {
+ b.Property("CohortDistributionId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasColumnName("BS_COHORT_DISTRIBUTION_ID");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("CohortDistributionId"));
+
+ b.Property("AddressLine1")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("ADDRESS_LINE_1");
+
+ b.Property("AddressLine2")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("ADDRESS_LINE_2");
+
+ b.Property("AddressLine3")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("ADDRESS_LINE_3");
+
+ b.Property("AddressLine4")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("ADDRESS_LINE_4");
+
+ b.Property("AddressLine5")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("ADDRESS_LINE_5");
+
+ b.Property("CurrentPosting")
+ .HasMaxLength(10)
+ .HasColumnType("nvarchar(10)")
+ .HasColumnName("CURRENT_POSTING");
+
+ b.Property("CurrentPostingFromDt")
+ .HasColumnType("datetime")
+ .HasColumnName("CURRENT_POSTING_FROM_DT");
+
+ b.Property("DateOfBirth")
+ .HasColumnType("datetime")
+ .HasColumnName("DATE_OF_BIRTH");
+
+ b.Property("DateOfDeath")
+ .HasColumnType("datetime")
+ .HasColumnName("DATE_OF_DEATH");
+
+ b.Property("EmailAddressHome")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("EMAIL_ADDRESS_HOME");
+
+ b.Property("EmailAddressHomeFromDt")
+ .HasColumnType("datetime")
+ .HasColumnName("EMAIL_ADDRESS_HOME_FROM_DT");
+
+ b.Property("FamilyName")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("FAMILY_NAME");
+
+ b.Property("Gender")
+ .HasColumnType("smallint")
+ .HasColumnName("GENDER");
+
+ b.Property("GivenName")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("GIVEN_NAME");
+
+ b.Property("InterpreterRequired")
+ .HasColumnType("smallint")
+ .HasColumnName("INTERPRETER_REQUIRED");
+
+ b.Property("IsExtracted")
+ .HasColumnType("smallint")
+ .HasColumnName("IS_EXTRACTED");
+
+ b.Property("NHSNumber")
+ .HasColumnType("bigint")
+ .HasColumnName("NHS_NUMBER");
+
+ b.Property("NamePrefix")
+ .HasMaxLength(35)
+ .HasColumnType("nvarchar(35)")
+ .HasColumnName("NAME_PREFIX");
+
+ b.Property("OtherGivenName")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("OTHER_GIVEN_NAME");
+
+ b.Property("ParticipantId")
+ .HasColumnType("bigint")
+ .HasColumnName("PARTICIPANT_ID");
+
+ b.Property("PostCode")
+ .HasMaxLength(10)
+ .HasColumnType("nvarchar(10)")
+ .HasColumnName("POST_CODE");
+
+ b.Property("PreferredLanguage")
+ .HasMaxLength(35)
+ .HasColumnType("nvarchar(35)")
+ .HasColumnName("PREFERRED_LANGUAGE");
+
+ b.Property("PreviousFamilyName")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("PREVIOUS_FAMILY_NAME");
+
+ b.Property("PrimaryCareProvider")
+ .HasMaxLength(10)
+ .HasColumnType("nvarchar(10)")
+ .HasColumnName("PRIMARY_CARE_PROVIDER");
+
+ b.Property("PrimaryCareProviderDate")
+ .HasColumnType("datetime")
+ .HasColumnName("PRIMARY_CARE_PROVIDER_FROM_DT");
+
+ b.Property("ReasonForRemoval")
+ .HasMaxLength(10)
+ .HasColumnType("nvarchar(10)")
+ .HasColumnName("REASON_FOR_REMOVAL");
+
+ b.Property("ReasonForRemovalDate")
+ .HasColumnType("datetime")
+ .HasColumnName("REASON_FOR_REMOVAL_FROM_DT");
+
+ b.Property("RecordInsertDateTime")
+ .HasColumnType("datetime")
+ .HasColumnName("RECORD_INSERT_DATETIME");
+
+ b.Property("RecordUpdateDateTime")
+ .HasColumnType("datetime")
+ .HasColumnName("RECORD_UPDATE_DATETIME");
+
+ b.Property("RequestId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("REQUEST_ID");
+
+ b.Property("SupersededNHSNumber")
+ .HasColumnType("bigint")
+ .HasColumnName("SUPERSEDED_NHS_NUMBER");
+
+ b.Property("TelephoneNumberHome")
+ .HasMaxLength(35)
+ .HasColumnType("nvarchar(35)")
+ .HasColumnName("TELEPHONE_NUMBER_HOME");
+
+ b.Property("TelephoneNumberHomeFromDt")
+ .HasColumnType("datetime")
+ .HasColumnName("TELEPHONE_NUMBER_HOME_FROM_DT");
+
+ b.Property("TelephoneNumberMob")
+ .HasMaxLength(35)
+ .HasColumnType("nvarchar(35)")
+ .HasColumnName("TELEPHONE_NUMBER_MOB");
+
+ b.Property("TelephoneNumberMobFromDt")
+ .HasColumnType("datetime")
+ .HasColumnName("TELEPHONE_NUMBER_MOB_FROM_DT");
+
+ b.Property("UsualAddressFromDt")
+ .HasColumnType("datetime")
+ .HasColumnName("USUAL_ADDRESS_FROM_DT");
+
+ b.HasKey("CohortDistributionId");
+
+ b.HasIndex(new[] { "IsExtracted", "RequestId" }, "IX_BSCOHORT_IS_EXTACTED_REQUESTID");
+
+ b.HasIndex(new[] { "NHSNumber" }, "IX_BS_COHORT_DISTRIBUTION_NHSNUMBER");
+
+ b.HasIndex(new[] { "ParticipantId" }, "IX_BS_COHORT_DISTRIBUTION_PARTICIPANTID");
+
+ b.ToTable("BS_COHORT_DISTRIBUTION", "dbo");
+ });
+
+ modelBuilder.Entity("Model.CurrentPosting", b =>
+ {
+ b.Property("Posting")
+ .HasColumnType("nvarchar(450)")
+ .HasColumnName("POSTING");
+
+ b.Property("InUse")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("IN_USE");
+
+ b.Property("IncludedInCohort")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("INCLUDED_IN_COHORT");
+
+ b.Property("PostingCategory")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("POSTING_CATEGORY");
+
+ b.HasKey("Posting");
+
+ b.ToTable("CURRENT_POSTING_LKP", "dbo");
+ });
+
+ modelBuilder.Entity("Model.ExceptionManagement", b =>
+ {
+ b.Property("ExceptionId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasColumnName("EXCEPTION_ID");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ExceptionId"));
+
+ b.Property("Category")
+ .HasColumnType("int")
+ .HasColumnName("CATEGORY");
+
+ b.Property("CohortName")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("COHORT_NAME");
+
+ b.Property("DateCreated")
+ .HasColumnType("datetime")
+ .HasColumnName("DATE_CREATED");
+
+ b.Property("DateResolved")
+ .HasColumnType("date")
+ .HasColumnName("DATE_RESOLVED");
+
+ b.Property("ErrorRecord")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ERROR_RECORD");
+
+ b.Property("ExceptionDate")
+ .HasColumnType("datetime")
+ .HasColumnName("EXCEPTION_DATE");
+
+ b.Property("FileName")
+ .HasMaxLength(250)
+ .HasColumnType("nvarchar(250)")
+ .HasColumnName("FILE_NAME");
+
+ b.Property("IsFatal")
+ .HasColumnType("smallint")
+ .HasColumnName("IS_FATAL");
+
+ b.Property("NhsNumber")
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)")
+ .HasColumnName("NHS_NUMBER");
+
+ b.Property("RecordUpdatedDate")
+ .HasColumnType("datetime")
+ .HasColumnName("RECORD_UPDATED_DATE");
+
+ b.Property("RuleDescription")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("RULE_DESCRIPTION");
+
+ b.Property("RuleId")
+ .HasColumnType("int")
+ .HasColumnName("RULE_ID");
+
+ b.Property("ScreeningName")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasColumnName("SCREENING_NAME");
+
+ b.Property("ServiceNowCreatedDate")
+ .HasColumnType("date")
+ .HasColumnName("SERVICENOW_CREATED_DATE");
+
+ b.Property("ServiceNowId")
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)")
+ .HasColumnName("SERVICENOW_ID");
+
+ b.HasKey("ExceptionId");
+
+ b.HasIndex(new[] { "NhsNumber", "ScreeningName" }, "IX_EXCEPTIONMGMT_NHSNUM_SCREENINGNAME");
+
+ b.ToTable("EXCEPTION_MANAGEMENT", "dbo");
+ });
+
+ modelBuilder.Entity("Model.ExcludedSMULookup", b =>
+ {
+ b.Property("GpPracticeCode")
+ .HasColumnType("nvarchar(450)")
+ .HasColumnName("GP_PRACTICE_CODE");
+
+ b.HasKey("GpPracticeCode");
+
+ b.ToTable("EXCLUDED_SMU_LKP", "dbo");
+ });
+
+ modelBuilder.Entity("Model.GenderMaster", b =>
+ {
+ b.Property("GenderCd")
+ .HasMaxLength(2)
+ .HasColumnType("nvarchar(2)")
+ .HasColumnName("GENDER_CD");
+
+ b.Property("GenderDesc")
+ .IsRequired()
+ .HasMaxLength(10)
+ .HasColumnType("nvarchar(10)")
+ .HasColumnName("GENDER_DESC");
+
+ b.HasKey("GenderCd");
+
+ b.ToTable("GENDER_MASTER", "dbo");
+ });
+
+ modelBuilder.Entity("Model.GeneCodeLkp", b =>
+ {
+ b.Property("GeneCodeId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasColumnName("GENE_CODE_ID");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("GeneCodeId"));
+
+ b.Property("GeneCode")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("GENE_CODE");
+
+ b.Property("GeneCodeDescription")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("GENE_CODE_DESCRIPTION");
+
+ b.HasKey("GeneCodeId");
+
+ b.ToTable("GENE_CODE_LKP", "dbo");
+ });
+
+ modelBuilder.Entity("Model.HigherRiskReferralReasonLkp", b =>
+ {
+ b.Property("HigherRiskReferralReasonId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasColumnName("HIGHER_RISK_REFERRAL_REASON_ID");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("HigherRiskReferralReasonId"));
+
+ b.Property("HigherRiskReferralReasonCode")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("HIGHER_RISK_REFERRAL_REASON_CODE");
+
+ b.Property("HigherRiskReferralReasonCodeDescription")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("HIGHER_RISK_REFERRAL_REASON_CODE_DESCRIPTION");
+
+ b.HasKey("HigherRiskReferralReasonId");
+
+ b.ToTable("HIGHER_RISK_REFERRAL_REASON_LKP", "dbo");
+ });
+
+ modelBuilder.Entity("Model.LanguageCode", b =>
+ {
+ b.Property("LanguageCodeId")
+ .HasColumnType("nvarchar(450)")
+ .HasColumnName("LANGUAGE_CODE");
+
+ b.Property("LanguageDescription")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("LANGUAGE_DESCRIPTION");
+
+ b.HasKey("LanguageCodeId");
+
+ b.ToTable("LANGUAGE_CODES", "dbo");
+ });
+
+ modelBuilder.Entity("Model.NemsSubscription", b =>
+ {
+ b.Property("SubscriptionId")
+ .HasColumnType("nvarchar(450)")
+ .HasColumnName("SUBSCRIPTION_ID");
+
+ b.Property("NhsNumber")
+ .HasColumnType("bigint")
+ .HasColumnName("NHS_NUMBER");
+
+ b.Property("RecordInsertDateTime")
+ .HasColumnType("datetime")
+ .HasColumnName("RECORD_INSERT_DATETIME");
+
+ b.Property("RecordUpdateDateTime")
+ .HasColumnType("datetime")
+ .HasColumnName("RECORD_UPDATE_DATETIME");
+
+ b.Property("SubscriptionSource")
+ .HasColumnType("int")
+ .HasColumnName("SUBSCRIPTION_SOURCE");
+
+ b.HasKey("SubscriptionId");
+
+ b.ToTable("NEMS_SUBSCRIPTION", "dbo");
+ });
+
+ modelBuilder.Entity("Model.ParticipantDemographic", b =>
+ {
+ b.Property("ParticipantId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint")
+ .HasColumnName("PARTICIPANT_ID");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ParticipantId"));
+
+ b.Property("AddressLine1")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ADDRESS_LINE_1");
+
+ b.Property("AddressLine2")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ADDRESS_LINE_2");
+
+ b.Property("AddressLine3")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ADDRESS_LINE_3");
+
+ b.Property("AddressLine4")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ADDRESS_LINE_4");
+
+ b.Property("AddressLine5")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ADDRESS_LINE_5");
+
+ b.Property("CurrentPosting")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("CURRENT_POSTING");
+
+ b.Property("CurrentPostingFromDate")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("CURRENT_POSTING_FROM_DT");
+
+ b.Property("DateOfBirth")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("DATE_OF_BIRTH");
+
+ b.Property("DateOfDeath")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("DATE_OF_DEATH");
+
+ b.Property("DeathStatus")
+ .HasColumnType("smallint")
+ .HasColumnName("DEATH_STATUS");
+
+ b.Property("EmailAddressHome")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("EMAIL_ADDRESS_HOME");
+
+ b.Property("EmailAddressHomeFromDate")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("EMAIL_ADDRESS_HOME_FROM_DT");
+
+ b.Property("FamilyName")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("FAMILY_NAME");
+
+ b.Property("Gender")
+ .HasColumnType("smallint")
+ .HasColumnName("GENDER");
+
+ b.Property("GivenName")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("GIVEN_NAME");
+
+ b.Property("InterpreterRequired")
+ .HasColumnType("smallint")
+ .HasColumnName("INTERPRETER_REQUIRED");
+
+ b.Property("InvalidFlag")
+ .HasColumnType("smallint")
+ .HasColumnName("INVALID_FLAG");
+
+ b.Property("NamePrefix")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("NAME_PREFIX");
+
+ b.Property("NhsNumber")
+ .HasColumnType("bigint")
+ .HasColumnName("NHS_NUMBER");
+
+ b.Property("OtherGivenName")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("OTHER_GIVEN_NAME");
+
+ b.Property("PafKey")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("PAF_KEY");
+
+ b.Property("PostCode")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("POST_CODE");
+
+ b.Property("PreferredLanguage")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("PREFERRED_LANGUAGE");
+
+ b.Property("PreviousFamilyName")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("PREVIOUS_FAMILY_NAME");
+
+ b.Property("PrimaryCareProvider")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("PRIMARY_CARE_PROVIDER");
+
+ b.Property("PrimaryCareProviderFromDate")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("PRIMARY_CARE_PROVIDER_FROM_DT");
+
+ b.Property("RecordInsertDateTime")
+ .HasColumnType("datetime")
+ .HasColumnName("RECORD_INSERT_DATETIME");
+
+ b.Property("RecordUpdateDateTime")
+ .HasColumnType("datetime")
+ .HasColumnName("RECORD_UPDATE_DATETIME");
+
+ b.Property("SupersededByNhsNumber")
+ .HasColumnType("bigint")
+ .HasColumnName("SUPERSEDED_BY_NHS_NUMBER");
+
+ b.Property("TelephoneNumberHome")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("TELEPHONE_NUMBER_HOME");
+
+ b.Property("TelephoneNumberHomeFromDate")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("TELEPHONE_NUMBER_HOME_FROM_DT");
+
+ b.Property("TelephoneNumberMob")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("TELEPHONE_NUMBER_MOB");
+
+ b.Property("TelephoneNumberMobFromDate")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("TELEPHONE_NUMBER_MOB_FROM_DT");
+
+ b.Property("UsualAddressFromDate")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("USUAL_ADDRESS_FROM_DT");
+
+ b.HasKey("ParticipantId");
+
+ b.HasIndex(new[] { "NhsNumber" }, "Index_PARTICIPANT_DEMOGRAPHIC_NhsNumber")
+ .IsUnique();
+
+ b.ToTable("PARTICIPANT_DEMOGRAPHIC", "dbo");
+ });
+
+ modelBuilder.Entity("Model.ParticipantManagement", b =>
+ {
+ b.Property("ParticipantId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint")
+ .HasColumnName("PARTICIPANT_ID");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ParticipantId"));
+
+ b.Property("BlockedFlag")
+ .HasColumnType("smallint")
+ .HasColumnName("BLOCKED_FLAG");
+
+ b.Property("BusinessRuleVersion")
+ .HasMaxLength(10)
+ .HasColumnType("nvarchar(10)")
+ .HasColumnName("BUSINESS_RULE_VERSION");
+
+ b.Property("DateIrradiated")
+ .HasColumnType("datetime")
+ .HasColumnName("DATE_IRRADIATED");
+
+ b.Property("EligibilityFlag")
+ .HasColumnType("smallint")
+ .HasColumnName("ELIGIBILITY_FLAG");
+
+ b.Property("ExceptionFlag")
+ .HasColumnType("smallint")
+ .HasColumnName("EXCEPTION_FLAG");
+
+ b.Property("GeneCodeId")
+ .HasColumnType("int")
+ .HasColumnName("GENE_CODE_ID");
+
+ b.Property("HigherRiskNextTestDueDate")
+ .HasColumnType("datetime")
+ .HasColumnName("HIGHER_RISK_NEXT_TEST_DUE_DATE");
+
+ b.Property("HigherRiskReferralReasonId")
+ .HasColumnType("int")
+ .HasColumnName("HIGHER_RISK_REFERRAL_REASON_ID");
+
+ b.Property("IsHigherRisk")
+ .HasColumnType("smallint")
+ .HasColumnName("IS_HIGHER_RISK");
+
+ b.Property("IsHigherRiskActive")
+ .HasColumnType("smallint")
+ .HasColumnName("IS_HIGHER_RISK_ACTIVE");
+
+ b.Property("NHSNumber")
+ .HasColumnType("bigint")
+ .HasColumnName("NHS_NUMBER");
+
+ b.Property("NextTestDueDate")
+ .HasColumnType("datetime")
+ .HasColumnName("NEXT_TEST_DUE_DATE");
+
+ b.Property("NextTestDueDateCalcMethod")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("NEXT_TEST_DUE_DATE_CALC_METHOD");
+
+ b.Property("ParticipantScreeningStatus")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("PARTICIPANT_SCREENING_STATUS");
+
+ b.Property("ReasonForRemoval")
+ .HasMaxLength(10)
+ .HasColumnType("nvarchar(10)")
+ .HasColumnName("REASON_FOR_REMOVAL");
+
+ b.Property("ReasonForRemovalDate")
+ .HasColumnType("datetime")
+ .HasColumnName("REASON_FOR_REMOVAL_FROM_DT");
+
+ b.Property("RecordInsertDateTime")
+ .HasColumnType("datetime")
+ .HasColumnName("RECORD_INSERT_DATETIME");
+
+ b.Property("RecordType")
+ .IsRequired()
+ .HasMaxLength(10)
+ .HasColumnType("nvarchar(10)")
+ .HasColumnName("RECORD_TYPE");
+
+ b.Property("RecordUpdateDateTime")
+ .HasColumnType("datetime")
+ .HasColumnName("RECORD_UPDATE_DATETIME");
+
+ b.Property("ReferralFlag")
+ .HasColumnType("smallint")
+ .HasColumnName("REFERRAL_FLAG");
+
+ b.Property("ScreeningCeasedReason")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("SCREENING_CEASED_REASON");
+
+ b.Property("ScreeningId")
+ .HasColumnType("bigint")
+ .HasColumnName("SCREENING_ID");
+
+ b.Property("SrcSysProcessedDateTime")
+ .HasColumnType("datetime")
+ .HasColumnName("SRC_SYSTEM_PROCESSED_DATETIME");
+
+ b.HasKey("ParticipantId");
+
+ b.HasIndex(new[] { "NHSNumber", "ScreeningId" }, "ix_PARTICIPANT_MANAGEMENT_screening_nhs")
+ .IsUnique();
+
+ b.ToTable("PARTICIPANT_MANAGEMENT", "dbo");
+ });
+
+ modelBuilder.Entity("Model.ScreeningLkp", b =>
+ {
+ b.Property("ScreeningWorkflowId")
+ .HasColumnType("nvarchar(450)")
+ .HasColumnName("SCREENING_WORKFLOW_ID");
+
+ b.Property("ScreeningAcronym")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("SCREENING_ACRONYM");
+
+ b.Property("ScreeningId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint")
+ .HasColumnName("SCREENING_ID");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ScreeningId"));
+
+ b.Property("ScreeningName")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("SCREENING_NAME");
+
+ b.Property("ScreeningType")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("SCREENING_TYPE");
+
+ b.HasKey("ScreeningWorkflowId");
+
+ b.ToTable("SCREENING_LKP", "dbo");
+ });
+
+ modelBuilder.Entity("Model.ServicenowCase", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("ID");
+
+ b.Property("NhsNumber")
+ .HasColumnType("bigint")
+ .HasColumnName("NHS_NUMBER");
+
+ b.Property("RecordInsertDatetime")
+ .HasColumnType("datetime")
+ .HasColumnName("RECORD_INSERT_DATETIME");
+
+ b.Property("RecordUpdateDatetime")
+ .HasColumnType("datetime")
+ .HasColumnName("RECORD_UPDATE_DATETIME");
+
+ b.Property("ServicenowId")
+ .IsRequired()
+ .HasMaxLength(10)
+ .HasColumnType("nvarchar(10)")
+ .HasColumnName("SERVICENOW_ID");
+
+ b.Property("Status")
+ .HasMaxLength(10)
+ .HasColumnType("nvarchar(10)")
+ .HasColumnName("STATUS");
+
+ b.HasKey("Id");
+
+ b.HasIndex(new[] { "ServicenowId" }, "IX_SERVICENOW_CASES_SERVICENOW_ID");
+
+ b.ToTable("SERVICENOW_CASES", "dbo");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/application/CohortManager/src/Functions/Shared/DataServices.Migrations/Migrations/20251203173828_AddPowerBIViews.cs b/application/CohortManager/src/Functions/Shared/DataServices.Migrations/Migrations/20251203173828_AddPowerBIViews.cs
new file mode 100644
index 000000000..69498f7de
--- /dev/null
+++ b/application/CohortManager/src/Functions/Shared/DataServices.Migrations/Migrations/20251203173828_AddPowerBIViews.cs
@@ -0,0 +1,108 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace DataServices.Migrations.Migrations
+{
+ ///
+ public partial class AddPowerBIViews : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.Sql(@"
+ CREATE VIEW vw_ServiceNowParticipants AS
+ SELECT
+ CAST(RECORD_INSERT_DATETIME AS DATE) AS Date,
+ IIF(IS_HIGHER_RISK = 1, 'High Risk Participant', 'Standard Risk Participant') AS Category,
+ COUNT(*) AS ServiceNow_Participants
+ FROM (
+ SELECT
+ RECORD_INSERT_DATETIME,
+ IS_HIGHER_RISK
+ FROM PARTICIPANT_MANAGEMENT
+ WHERE REFERRAL_FLAG = 1
+ AND RECORD_TYPE = 'ADD'
+ ) AS DateSelection
+ GROUP BY
+ CAST(RECORD_INSERT_DATETIME AS DATE),
+ IS_HIGHER_RISK;
+ ");
+
+ migrationBuilder.Sql(@"
+ CREATE VIEW vw_ParticipantManagementRecords AS
+ SELECT
+ Date,
+ COUNT(*) AS Participant_Management_Records
+ FROM (
+ SELECT DISTINCT
+ NHS_NUMBER,
+ CAST(COALESCE(RECORD_UPDATE_DATETIME, RECORD_INSERT_DATETIME) AS DATE) AS Date
+ FROM PARTICIPANT_MANAGEMENT
+ WHERE RECORD_INSERT_DATETIME IS NOT NULL
+ OR RECORD_UPDATE_DATETIME IS NOT NULL
+ ) unique_records
+ GROUP BY Date;
+ ");
+
+ migrationBuilder.Sql(@"
+ CREATE VIEW vw_ParticipantDemographic AS
+ SELECT
+ Date,
+ COUNT(*) AS Participant_Demographic_Records
+ FROM (
+ SELECT DISTINCT
+ NHS_NUMBER,
+ CAST(COALESCE(RECORD_UPDATE_DATETIME, RECORD_INSERT_DATETIME) AS DATE) AS Date
+ FROM PARTICIPANT_DEMOGRAPHIC
+ WHERE RECORD_INSERT_DATETIME IS NOT NULL
+ OR RECORD_UPDATE_DATETIME IS NOT NULL
+ ) unique_records
+ GROUP BY Date;
+ ");
+
+ migrationBuilder.Sql(@"
+ CREATE VIEW vw_ExceptionManagement AS
+ SELECT
+ CAST(DATE_CREATED AS DATE) AS Date,
+ RULE_ID AS RuleId,
+ CATEGORY AS Category,
+ COUNT(*) AS Number_Of_Exceptions,
+ NULLIF(MAX(DATE_RESOLVED), '9999-12-31') AS DATE_RESOLVED,
+ RULE_DESCRIPTION AS RULE_DESCRIPTION
+ FROM EXCEPTION_MANAGEMENT
+ WHERE RULE_ID >= 0
+ GROUP BY
+ CAST(DATE_CREATED AS DATE),
+ RULE_ID,
+ CATEGORY,
+ RULE_DESCRIPTION;
+ ");
+
+ migrationBuilder.Sql(@"
+ CREATE VIEW vw_CohortDistribution AS
+ SELECT
+ Date,
+ COUNT(DISTINCT NHS_NUMBER) AS Cohort_Distribution_Records
+ FROM (
+ SELECT DISTINCT
+ NHS_NUMBER,
+ CAST(COALESCE(RECORD_UPDATE_DATETIME, RECORD_INSERT_DATETIME) AS DATE) AS Date
+ FROM BS_COHORT_DISTRIBUTION
+ WHERE RECORD_INSERT_DATETIME IS NOT NULL
+ ) unique_records
+ GROUP BY Date;
+ ");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.Sql("DROP VIEW IF EXISTS vw_ServiceNowParticipants;");
+ migrationBuilder.Sql("DROP VIEW IF EXISTS vw_ParticipantManagementRecords;");
+ migrationBuilder.Sql("DROP VIEW IF EXISTS vw_ParticipantDemographic;");
+ migrationBuilder.Sql("DROP VIEW IF EXISTS vw_ExceptionManagement;");
+ migrationBuilder.Sql("DROP VIEW IF EXISTS vw_CohortDistribution;");
+ }
+ }
+}