diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Mappings/AlertTypeMapping.cs b/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Mappings/AlertTypeMapping.cs index 3157ab2f6..d8bcb4354 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Mappings/AlertTypeMapping.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Mappings/AlertTypeMapping.cs @@ -62,6 +62,6 @@ public void Configure(EntityTypeBuilder builder) new AlertType { AlertTypeId = new Guid("38db7946-2dbf-408e-bc48-1625829e7dfe"), AlertCategoryId = new Guid("cbf7633f-3904-407d-8371-42a473fa641f"), Name = "Restricted by the Secretary of State - Not Permitted to work as teacher", DqtSanctionCode = "B2B", ProhibitionLevel = ProhibitionLevel.Teaching, InternalOnly = true, IsActive = false }, new AlertType { AlertTypeId = new Guid("18e04dcb-fb86-4b05-8d5d-ff9c5da738dd"), AlertCategoryId = new Guid("cbf7633f-3904-407d-8371-42a473fa641f"), Name = "Restricted by the Secretary of State - Permitted to work as teacher", DqtSanctionCode = "B2A", ProhibitionLevel = ProhibitionLevel.Teaching, InternalOnly = true, IsActive = false }, new AlertType { AlertTypeId = new Guid("241eeb78-fac7-4c77-8059-c12e93dc2fae"), AlertCategoryId = new Guid("38df5a00-94ab-486f-8905-d5b2eac04000"), Name = "Section 128 barring direction", DqtSanctionCode = "T7", ProhibitionLevel = ProhibitionLevel.LeadershipPositions, InternalOnly = false, IsActive = true, DisplayOrder = 1 }, - new AlertType { AlertTypeId = new Guid("7924fe90-483c-49f8-84fc-674feddba848"), AlertCategoryId = new Guid("227b75e5-bb98-496c-8860-1baea37aa5c6"), Name = "Secretary of State decision- no prohibition", DqtSanctionCode = "T6", ProhibitionLevel = ProhibitionLevel.None, InternalOnly = false, IsActive = true, DisplayOrder = 1 }); + new AlertType { AlertTypeId = new Guid("7924fe90-483c-49f8-84fc-674feddba848"), AlertCategoryId = new Guid("227b75e5-bb98-496c-8860-1baea37aa5c6"), Name = "Secretary of State decision - no prohibition", DqtSanctionCode = "T6", ProhibitionLevel = ProhibitionLevel.None, InternalOnly = false, IsActive = true, DisplayOrder = 1 }); } } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Migrations/20241105153742_AlertTypeTypoFix.Designer.cs b/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Migrations/20241105153742_AlertTypeTypoFix.Designer.cs new file mode 100644 index 000000000..1e9bceab7 --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Migrations/20241105153742_AlertTypeTypoFix.Designer.cs @@ -0,0 +1,3163 @@ +// +using System; +using System.Collections.Generic; +using System.Text.Json; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using TeachingRecordSystem.Core.DataStore.Postgres; + +#nullable disable + +namespace TeachingRecordSystem.Core.DataStore.Postgres.Migrations +{ + [DbContext(typeof(TrsDbContext))] + [Migration("20241105153742_AlertTypeTypoFix")] + partial class AlertTypeTypoFix + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.8") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("ApplicationType") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("application_type"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("client_id"); + + b.Property("ClientSecret") + .HasColumnType("text") + .HasColumnName("client_secret"); + + b.Property("ClientType") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("client_type"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("concurrency_token"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("consent_type"); + + b.Property("DisplayName") + .HasColumnType("text") + .HasColumnName("display_name"); + + b.Property("DisplayNames") + .HasColumnType("text") + .HasColumnName("display_names"); + + b.Property("JsonWebKeySet") + .HasColumnType("text") + .HasColumnName("json_web_key_set"); + + b.Property("Permissions") + .HasColumnType("text") + .HasColumnName("permissions"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("text") + .HasColumnName("post_logout_redirect_uris"); + + b.Property("Properties") + .HasColumnType("text") + .HasColumnName("properties"); + + b.Property("RedirectUris") + .HasColumnType("text") + .HasColumnName("redirect_uris"); + + b.Property("Requirements") + .HasColumnType("text") + .HasColumnName("requirements"); + + b.Property("Settings") + .HasColumnType("text") + .HasColumnName("settings"); + + b.HasKey("Id") + .HasName("pk_oidc_applications"); + + b.HasIndex("ClientId") + .IsUnique() + .HasDatabaseName("ix_oidc_applications_client_id"); + + b.ToTable("oidc_applications", (string)null); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("ApplicationId") + .HasColumnType("uuid") + .HasColumnName("application_id"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("concurrency_token"); + + b.Property("CreationDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation_date"); + + b.Property("Properties") + .HasColumnType("text") + .HasColumnName("properties"); + + b.Property("Scopes") + .HasColumnType("text") + .HasColumnName("scopes"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("status"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)") + .HasColumnName("subject"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("type"); + + b.HasKey("Id") + .HasName("pk_oidc_authorizations"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type") + .HasDatabaseName("ix_oidc_authorizations_application_id_status_subject_type"); + + b.ToTable("oidc_authorizations", (string)null); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("concurrency_token"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("Descriptions") + .HasColumnType("text") + .HasColumnName("descriptions"); + + b.Property("DisplayName") + .HasColumnType("text") + .HasColumnName("display_name"); + + b.Property("DisplayNames") + .HasColumnType("text") + .HasColumnName("display_names"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("name"); + + b.Property("Properties") + .HasColumnType("text") + .HasColumnName("properties"); + + b.Property("Resources") + .HasColumnType("text") + .HasColumnName("resources"); + + b.HasKey("Id") + .HasName("pk_oidc_scopes"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("ix_oidc_scopes_name"); + + b.ToTable("oidc_scopes", (string)null); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("ApplicationId") + .HasColumnType("uuid") + .HasColumnName("application_id"); + + b.Property("AuthorizationId") + .HasColumnType("uuid") + .HasColumnName("authorization_id"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("concurrency_token"); + + b.Property("CreationDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation_date"); + + b.Property("ExpirationDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiration_date"); + + b.Property("Payload") + .HasColumnType("text") + .HasColumnName("payload"); + + b.Property("Properties") + .HasColumnType("text") + .HasColumnName("properties"); + + b.Property("RedemptionDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("redemption_date"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("reference_id"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("status"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("character varying(400)") + .HasColumnName("subject"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("type"); + + b.HasKey("Id") + .HasName("pk_oidc_tokens"); + + b.HasIndex("ReferenceId") + .IsUnique() + .HasDatabaseName("ix_oidc_tokens_reference_id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type") + .HasDatabaseName("ix_oidc_tokens_application_id_status_subject_type"); + + b.ToTable("oidc_tokens", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.Alert", b => + { + b.Property("AlertId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("alert_id"); + + b.Property("AlertTypeId") + .HasColumnType("uuid") + .HasColumnName("alert_type_id"); + + b.Property("CreatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_on"); + + b.Property("DeletedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_on"); + + b.Property("Details") + .HasColumnType("text") + .HasColumnName("details"); + + b.Property("DqtCreatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("dqt_created_on"); + + b.Property("DqtFirstSync") + .HasColumnType("timestamp with time zone") + .HasColumnName("dqt_first_sync"); + + b.Property("DqtLastSync") + .HasColumnType("timestamp with time zone") + .HasColumnName("dqt_last_sync"); + + b.Property("DqtModifiedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("dqt_modified_on"); + + b.Property("DqtSanctionId") + .HasColumnType("uuid") + .HasColumnName("dqt_sanction_id"); + + b.Property("DqtState") + .HasColumnType("integer") + .HasColumnName("dqt_state"); + + b.Property("EndDate") + .HasColumnType("date") + .HasColumnName("end_date"); + + b.Property("ExternalLink") + .HasColumnType("text") + .HasColumnName("external_link"); + + b.Property("PersonId") + .HasColumnType("uuid") + .HasColumnName("person_id"); + + b.Property("StartDate") + .HasColumnType("date") + .HasColumnName("start_date"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_on"); + + b.HasKey("AlertId") + .HasName("pk_alerts"); + + b.HasIndex("AlertTypeId") + .HasDatabaseName("ix_alerts_alert_type_id"); + + b.HasIndex("PersonId") + .HasDatabaseName("ix_alerts_person_id"); + + b.ToTable("alerts", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.AlertCategory", b => + { + b.Property("AlertCategoryId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("alert_category_id"); + + b.Property("DisplayOrder") + .HasColumnType("integer") + .HasColumnName("display_order"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("name") + .UseCollation("case_insensitive"); + + b.HasKey("AlertCategoryId") + .HasName("pk_alert_categories"); + + b.HasIndex("DisplayOrder") + .IsUnique() + .HasDatabaseName("ix_alert_categories_display_order"); + + b.ToTable("alert_categories", (string)null); + + b.HasData( + new + { + AlertCategoryId = new Guid("ee78d44d-abf8-44a9-b22b-87a821f8d3c9"), + DisplayOrder = 1, + Name = "EEA Decision" + }, + new + { + AlertCategoryId = new Guid("0ae0707b-1503-477d-bc0f-1505ed95dbdf"), + DisplayOrder = 2, + Name = "Failed induction" + }, + new + { + AlertCategoryId = new Guid("768c9eb4-355b-4491-bb20-67eb59a97579"), + DisplayOrder = 3, + Name = "Flag" + }, + new + { + AlertCategoryId = new Guid("06d98708-b52d-496a-aaa7-c1d7d2ca8b24"), + DisplayOrder = 4, + Name = "GTC Decision" + }, + new + { + AlertCategoryId = new Guid("70b7d473-2ec8-4643-bfd4-d4ab9a9a0988"), + DisplayOrder = 5, + Name = "GTC Prohibition from teaching" + }, + new + { + AlertCategoryId = new Guid("790410c1-b884-4cdd-8db9-64a042ab54ae"), + DisplayOrder = 6, + Name = "GTC Restriction" + }, + new + { + AlertCategoryId = new Guid("b2b19019-b165-47a3-8745-3297ff152581"), + DisplayOrder = 7, + Name = "Prohibition from teaching" + }, + new + { + AlertCategoryId = new Guid("e8a9ee91-bf7f-4f70-bc66-a644d522384e"), + DisplayOrder = 8, + Name = "Restricted/DBS" + }, + new + { + AlertCategoryId = new Guid("cbf7633f-3904-407d-8371-42a473fa641f"), + DisplayOrder = 9, + Name = "Restriction" + }, + new + { + AlertCategoryId = new Guid("38df5a00-94ab-486f-8905-d5b2eac04000"), + DisplayOrder = 10, + Name = "Section 128 (SoS)" + }, + new + { + AlertCategoryId = new Guid("227b75e5-bb98-496c-8860-1baea37aa5c6"), + DisplayOrder = 12, + Name = "TRA Decision (SoS)" + }, + new + { + AlertCategoryId = new Guid("e4057fc2-a010-42a9-8cb2-7dcc5c9b5fa7"), + DisplayOrder = 11, + Name = "SoS Restriction" + }); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.AlertType", b => + { + b.Property("AlertTypeId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("alert_type_id"); + + b.Property("AlertCategoryId") + .HasColumnType("uuid") + .HasColumnName("alert_category_id"); + + b.Property("DisplayOrder") + .HasColumnType("integer") + .HasColumnName("display_order"); + + b.Property("DqtSanctionCode") + .HasMaxLength(5) + .HasColumnType("character varying(5)") + .HasColumnName("dqt_sanction_code") + .UseCollation("case_insensitive"); + + b.Property("InternalOnly") + .HasColumnType("boolean") + .HasColumnName("internal_only"); + + b.Property("IsActive") + .HasColumnType("boolean") + .HasColumnName("is_active"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("name") + .UseCollation("case_insensitive"); + + b.Property("ProhibitionLevel") + .HasColumnType("integer") + .HasColumnName("prohibition_level"); + + b.HasKey("AlertTypeId") + .HasName("pk_alert_types"); + + b.HasIndex("AlertCategoryId") + .HasDatabaseName("ix_alert_types_alert_category_id"); + + b.HasIndex("AlertCategoryId", "DisplayOrder") + .IsUnique() + .HasDatabaseName("ix_alert_types_display_order") + .HasFilter("display_order is not null and is_active = true"); + + b.ToTable("alert_types", (string)null); + + b.HasData( + new + { + AlertTypeId = new Guid("2ca98658-1d5b-49d5-b05f-cc08c8b8502c"), + AlertCategoryId = new Guid("ee78d44d-abf8-44a9-b22b-87a821f8d3c9"), + DisplayOrder = 1, + DqtSanctionCode = "T8", + InternalOnly = true, + IsActive = true, + Name = "Teacher sanctioned in other EEA member state", + ProhibitionLevel = 3 + }, + new + { + AlertTypeId = new Guid("9fafaa80-f9f8-44a0-b7b3-cffedcbe0298"), + AlertCategoryId = new Guid("0ae0707b-1503-477d-bc0f-1505ed95dbdf"), + DisplayOrder = 1, + DqtSanctionCode = "C2", + InternalOnly = false, + IsActive = true, + Name = "Failed induction", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("651e1f56-3135-4961-bd7e-3f7b2c75cb04"), + AlertCategoryId = new Guid("0ae0707b-1503-477d-bc0f-1505ed95dbdf"), + DqtSanctionCode = "C1", + InternalOnly = false, + IsActive = false, + Name = "Prohibited by the Secretary of State - failed probation", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("5ea8bb68-4774-4ad8-b635-213a0cdda4c3"), + AlertCategoryId = new Guid("0ae0707b-1503-477d-bc0f-1505ed95dbdf"), + DqtSanctionCode = "C3", + InternalOnly = false, + IsActive = false, + Name = "Restricted by the Secretary of State - failed probation - permitted to carry out specified work for a period equal in length to a statutory induction period only", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("ae3e385d-03f8-4f12-9ce2-006afe827d23"), + AlertCategoryId = new Guid("768c9eb4-355b-4491-bb20-67eb59a97579"), + DisplayOrder = 1, + DqtSanctionCode = "T9", + InternalOnly = true, + IsActive = true, + Name = "FOR INTERNAL INFORMATION ONLY - see alert details", + ProhibitionLevel = 0 + }, + new + { + AlertTypeId = new Guid("12435c00-88cb-406b-b2b8-7400c1ced7b8"), + AlertCategoryId = new Guid("768c9eb4-355b-4491-bb20-67eb59a97579"), + DisplayOrder = 2, + DqtSanctionCode = "T10", + InternalOnly = true, + IsActive = true, + Name = "FOR INTERNAL USER ONLY – known duplicate record", + ProhibitionLevel = 0 + }, + new + { + AlertTypeId = new Guid("a6fc9f2e-8923-4163-978e-93bd901d146f"), + AlertCategoryId = new Guid("06d98708-b52d-496a-aaa7-c1d7d2ca8b24"), + DqtSanctionCode = "A18", + InternalOnly = false, + IsActive = false, + Name = "Conditional Registration Order - conviction of a relevant offence", + ProhibitionLevel = 2 + }, + new + { + AlertTypeId = new Guid("1ebd1620-293d-4169-ba78-0b41a6413ad9"), + AlertCategoryId = new Guid("06d98708-b52d-496a-aaa7-c1d7d2ca8b24"), + DqtSanctionCode = "A7", + InternalOnly = false, + IsActive = false, + Name = "Conditional Registration Order - serious professional incompetence", + ProhibitionLevel = 2 + }, + new + { + AlertTypeId = new Guid("3499860a-a0fb-43e3-878e-c226d14150b0"), + AlertCategoryId = new Guid("06d98708-b52d-496a-aaa7-c1d7d2ca8b24"), + DqtSanctionCode = "A3", + InternalOnly = false, + IsActive = false, + Name = "Conditional Registration Order - unacceptable professional conduct", + ProhibitionLevel = 2 + }, + new + { + AlertTypeId = new Guid("552ee226-a3a9-4dc3-8d04-0b7e4f641b51"), + AlertCategoryId = new Guid("06d98708-b52d-496a-aaa7-c1d7d2ca8b24"), + DqtSanctionCode = "A15", + InternalOnly = true, + IsActive = false, + Name = "For internal information only - historic GTC finding of unsuitable for registration", + ProhibitionLevel = 0 + }, + new + { + AlertTypeId = new Guid("33e00e46-6513-4136-adfd-1352cf34d8ec"), + AlertCategoryId = new Guid("06d98708-b52d-496a-aaa7-c1d7d2ca8b24"), + DqtSanctionCode = "A22", + InternalOnly = true, + IsActive = false, + Name = "No Sanction - breach of condition(s)", + ProhibitionLevel = 0 + }, + new + { + AlertTypeId = new Guid("0740f9eb-ece3-4394-a230-453da224d337"), + AlertCategoryId = new Guid("06d98708-b52d-496a-aaa7-c1d7d2ca8b24"), + DqtSanctionCode = "A16", + InternalOnly = true, + IsActive = false, + Name = "No Sanction - conviction for a relevant offence", + ProhibitionLevel = 0 + }, + new + { + AlertTypeId = new Guid("b6c8d8f1-723e-49a5-9551-25805e3e29b9"), + AlertCategoryId = new Guid("06d98708-b52d-496a-aaa7-c1d7d2ca8b24"), + DqtSanctionCode = "A12", + InternalOnly = true, + IsActive = false, + Name = "No Sanction - serious professional incompetence", + ProhibitionLevel = 0 + }, + new + { + AlertTypeId = new Guid("78f88de2-9ec1-41b8-948a-33bdff223206"), + AlertCategoryId = new Guid("06d98708-b52d-496a-aaa7-c1d7d2ca8b24"), + DqtSanctionCode = "A11", + InternalOnly = true, + IsActive = false, + Name = "No Sanction - unacceptable professional conduct", + ProhibitionLevel = 0 + }, + new + { + AlertTypeId = new Guid("fcff87d6-88f5-4fc5-ac81-5350b4fdd9e1"), + AlertCategoryId = new Guid("06d98708-b52d-496a-aaa7-c1d7d2ca8b24"), + DqtSanctionCode = "A17", + InternalOnly = true, + IsActive = false, + Name = "Reprimand - conviction of a relevant offence", + ProhibitionLevel = 0 + }, + new + { + AlertTypeId = new Guid("3f7de5fd-05a8-404f-a97c-428f54e81322"), + AlertCategoryId = new Guid("06d98708-b52d-496a-aaa7-c1d7d2ca8b24"), + DqtSanctionCode = "A8", + InternalOnly = true, + IsActive = false, + Name = "Reprimand - serious professional incompetence", + ProhibitionLevel = 0 + }, + new + { + AlertTypeId = new Guid("0ae8d4b6-ec9b-47ca-9338-6dae9192afe5"), + AlertCategoryId = new Guid("06d98708-b52d-496a-aaa7-c1d7d2ca8b24"), + DqtSanctionCode = "A4", + InternalOnly = true, + IsActive = false, + Name = "Reprimand - unacceptable professional conduct", + ProhibitionLevel = 0 + }, + new + { + AlertTypeId = new Guid("72e48b6a-e781-4bf3-910b-91f2d28f2eaa"), + AlertCategoryId = new Guid("70b7d473-2ec8-4643-bfd4-d4ab9a9a0988"), + DqtSanctionCode = "A21B", + InternalOnly = false, + IsActive = false, + Name = "Prohibition Order - conviction of a relevant offence - eligible to reapply after specified time", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("950d3eed-bef5-448a-b0f0-bf9c54f2103b"), + AlertCategoryId = new Guid("70b7d473-2ec8-4643-bfd4-d4ab9a9a0988"), + DqtSanctionCode = "A21A", + InternalOnly = false, + IsActive = false, + Name = "Prohibition Order - conviction of a relevant offence - ineligible to reapply", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("cac68337-3f95-4475-97cf-1381e6b74700"), + AlertCategoryId = new Guid("70b7d473-2ec8-4643-bfd4-d4ab9a9a0988"), + DqtSanctionCode = "A5B", + InternalOnly = false, + IsActive = false, + Name = "Prohibition Order - serious professional incompetence - Eligible to reapply after specified time", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("c02bdc3a-7a19-4034-aa23-3a23c54e1d34"), + AlertCategoryId = new Guid("70b7d473-2ec8-4643-bfd4-d4ab9a9a0988"), + DqtSanctionCode = "A5A", + InternalOnly = false, + IsActive = false, + Name = "Prohibition Order - serious professional incompetence - Ineligible to reapply", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("e3658a61-bee2-4df1-9a26-e010681ee310"), + AlertCategoryId = new Guid("70b7d473-2ec8-4643-bfd4-d4ab9a9a0988"), + DqtSanctionCode = "A1B", + InternalOnly = false, + IsActive = false, + Name = "Prohibition Order - unacceptable professional conduct - Eligible to reapply after specified time", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("fa6bd220-61b0-41fc-9066-421b3b9d7885"), + AlertCategoryId = new Guid("70b7d473-2ec8-4643-bfd4-d4ab9a9a0988"), + DqtSanctionCode = "A1A", + InternalOnly = false, + IsActive = false, + Name = "Prohibition Order - unacceptable professional conduct - Ineligible to reapply", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("d372fcfa-1c4a-4fed-84c8-4c7885575681"), + AlertCategoryId = new Guid("790410c1-b884-4cdd-8db9-64a042ab54ae"), + DqtSanctionCode = "A20", + InternalOnly = false, + IsActive = false, + Name = "Suspension order - conviction of a relevant offence - with conditions", + ProhibitionLevel = 2 + }, + new + { + AlertTypeId = new Guid("af65c236-47a6-427b-8e4b-930de6d256f0"), + AlertCategoryId = new Guid("790410c1-b884-4cdd-8db9-64a042ab54ae"), + DqtSanctionCode = "A19", + InternalOnly = false, + IsActive = false, + Name = "Suspension order - conviction of a relevant offence - without conditions", + ProhibitionLevel = 2 + }, + new + { + AlertTypeId = new Guid("50508749-7a6b-4175-8538-9a1e55692efd"), + AlertCategoryId = new Guid("790410c1-b884-4cdd-8db9-64a042ab54ae"), + DqtSanctionCode = "A14", + InternalOnly = false, + IsActive = false, + Name = "Suspension order - serious professional incompetence - with conditions", + ProhibitionLevel = 2 + }, + new + { + AlertTypeId = new Guid("a6f51ccc-a19c-4dc2-ba80-ffb7a95ff2ee"), + AlertCategoryId = new Guid("790410c1-b884-4cdd-8db9-64a042ab54ae"), + DqtSanctionCode = "A6", + InternalOnly = false, + IsActive = false, + Name = "Suspension order - serious professional incompetence - without conditions", + ProhibitionLevel = 2 + }, + new + { + AlertTypeId = new Guid("1a2b06ae-7e9f-4761-b95d-397ca5da4b13"), + AlertCategoryId = new Guid("790410c1-b884-4cdd-8db9-64a042ab54ae"), + DqtSanctionCode = "A13", + InternalOnly = false, + IsActive = false, + Name = "Suspension order - unacceptable professional conduct - with conditions", + ProhibitionLevel = 2 + }, + new + { + AlertTypeId = new Guid("872d7700-aa6f-435e-b5f9-821fb087962a"), + AlertCategoryId = new Guid("790410c1-b884-4cdd-8db9-64a042ab54ae"), + DqtSanctionCode = "A2", + InternalOnly = false, + IsActive = false, + Name = "Suspension order - unacceptable professional conduct - without conditions", + ProhibitionLevel = 2 + }, + new + { + AlertTypeId = new Guid("17b4fe26-7468-4702-92e5-785b861cf0fa"), + AlertCategoryId = new Guid("790410c1-b884-4cdd-8db9-64a042ab54ae"), + DqtSanctionCode = "A24", + InternalOnly = false, + IsActive = false, + Name = "Suspension order - with conditions - (arising from breach of previous condition(s))", + ProhibitionLevel = 2 + }, + new + { + AlertTypeId = new Guid("3c5fc83b-10e1-4a15-83e6-794fce3e0b45"), + AlertCategoryId = new Guid("790410c1-b884-4cdd-8db9-64a042ab54ae"), + DqtSanctionCode = "A23", + InternalOnly = false, + IsActive = false, + Name = "Suspension order - without conditions - (arising from breach of previous condition(s))", + ProhibitionLevel = 2 + }, + new + { + AlertTypeId = new Guid("eab8b66d-68d0-4cb9-8e4d-bbd245648fb6"), + AlertCategoryId = new Guid("b2b19019-b165-47a3-8745-3297ff152581"), + DqtSanctionCode = "B1", + InternalOnly = true, + IsActive = false, + Name = "Barring by the Secretary of State", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("2c496e3f-00d3-4f0d-81f3-21458fe707b3"), + AlertCategoryId = new Guid("b2b19019-b165-47a3-8745-3297ff152581"), + DqtSanctionCode = "G2", + InternalOnly = true, + IsActive = false, + Name = "Formerly barred by the Independent Safeguarding Authority", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("993daa42-96cb-4621-bd9e-d4b195076bbe"), + AlertCategoryId = new Guid("b2b19019-b165-47a3-8745-3297ff152581"), + DqtSanctionCode = "B6", + InternalOnly = true, + IsActive = false, + Name = "Formerly on List 99", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("a414283f-7d5b-4587-83bf-f6da8c05b8d5"), + AlertCategoryId = new Guid("b2b19019-b165-47a3-8745-3297ff152581"), + DisplayOrder = 1, + DqtSanctionCode = "T2", + InternalOnly = false, + IsActive = true, + Name = "Interim prohibition by the Secretary of State", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("ed0cd700-3fb2-4db0-9403-ba57126090ed"), + AlertCategoryId = new Guid("b2b19019-b165-47a3-8745-3297ff152581"), + DisplayOrder = 2, + DqtSanctionCode = "T1", + InternalOnly = false, + IsActive = true, + Name = "Prohibition by the Secretary of State - misconduct", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("8ef92c14-4b1f-4530-9189-779ad9f3cefd"), + AlertCategoryId = new Guid("b2b19019-b165-47a3-8745-3297ff152581"), + DqtSanctionCode = "B3", + InternalOnly = false, + IsActive = false, + Name = "Prohibited by an Independent Schools Tribunal or Secretary of State", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("50feafbc-5124-4189-b06c-6463c7ebb8a8"), + AlertCategoryId = new Guid("b2b19019-b165-47a3-8745-3297ff152581"), + DisplayOrder = 3, + DqtSanctionCode = "T3", + InternalOnly = false, + IsActive = true, + Name = "Prohibition by the Secretary of State - deregistered by GTC Scotland", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("5aa21b8f-2069-43c9-8afd-05b34b02505f"), + AlertCategoryId = new Guid("b2b19019-b165-47a3-8745-3297ff152581"), + DisplayOrder = 4, + DqtSanctionCode = "T5", + InternalOnly = false, + IsActive = true, + Name = "Prohibition by the Secretary of State - refer to GTC Northern Ireland", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("a5bd4352-2cec-4417-87a1-4b6b79d033c2"), + AlertCategoryId = new Guid("b2b19019-b165-47a3-8745-3297ff152581"), + DisplayOrder = 5, + DqtSanctionCode = "T4", + InternalOnly = false, + IsActive = true, + Name = "Prohibition by the Secretary of State - refer to the Education Workforce Council, Wales", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("40794ea8-eda2-40a8-a26a-5f447aae6c99"), + AlertCategoryId = new Guid("e8a9ee91-bf7f-4f70-bc66-a644d522384e"), + DisplayOrder = 1, + DqtSanctionCode = "G1", + InternalOnly = true, + IsActive = true, + Name = "A possible matching record was found. Please contact the DBS before employing this person", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("38db7946-2dbf-408e-bc48-1625829e7dfe"), + AlertCategoryId = new Guid("cbf7633f-3904-407d-8371-42a473fa641f"), + DqtSanctionCode = "B2B", + InternalOnly = true, + IsActive = false, + Name = "Restricted by the Secretary of State - Not Permitted to work as teacher", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("18e04dcb-fb86-4b05-8d5d-ff9c5da738dd"), + AlertCategoryId = new Guid("cbf7633f-3904-407d-8371-42a473fa641f"), + DqtSanctionCode = "B2A", + InternalOnly = true, + IsActive = false, + Name = "Restricted by the Secretary of State - Permitted to work as teacher", + ProhibitionLevel = 1 + }, + new + { + AlertTypeId = new Guid("241eeb78-fac7-4c77-8059-c12e93dc2fae"), + AlertCategoryId = new Guid("38df5a00-94ab-486f-8905-d5b2eac04000"), + DisplayOrder = 1, + DqtSanctionCode = "T7", + InternalOnly = false, + IsActive = true, + Name = "Section 128 barring direction", + ProhibitionLevel = 4 + }, + new + { + AlertTypeId = new Guid("7924fe90-483c-49f8-84fc-674feddba848"), + AlertCategoryId = new Guid("227b75e5-bb98-496c-8860-1baea37aa5c6"), + DisplayOrder = 1, + DqtSanctionCode = "T6", + InternalOnly = false, + IsActive = true, + Name = "Secretary of State decision - no prohibition", + ProhibitionLevel = 0 + }); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.ApiKey", b => + { + b.Property("ApiKeyId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("api_key_id"); + + b.Property("ApplicationUserId") + .HasColumnType("uuid") + .HasColumnName("application_user_id"); + + b.Property("CreatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_on"); + + b.Property("Expires") + .HasColumnType("timestamp with time zone") + .HasColumnName("expires"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("key"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_on"); + + b.HasKey("ApiKeyId") + .HasName("pk_api_keys"); + + b.HasIndex("ApplicationUserId") + .HasDatabaseName("ix_api_keys_application_user_id"); + + b.HasIndex("Key") + .IsUnique() + .HasDatabaseName("ix_api_keys_key"); + + b.ToTable("api_keys", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.Country", b => + { + b.Property("CountryId") + .HasMaxLength(4) + .HasColumnType("character varying(4)") + .HasColumnName("country_id"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("name"); + + b.HasKey("CountryId") + .HasName("pk_countries"); + + b.ToTable("countries", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.EntityChangesJournal", b => + { + b.Property("Key") + .HasColumnType("text") + .HasColumnName("key"); + + b.Property("EntityLogicalName") + .HasColumnType("text") + .HasColumnName("entity_logical_name"); + + b.Property("DataToken") + .HasColumnType("text") + .HasColumnName("data_token"); + + b.Property("LastUpdated") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_updated"); + + b.Property("LastUpdatedBy") + .HasColumnType("text") + .HasColumnName("last_updated_by"); + + b.Property("NextQueryPageNumber") + .HasColumnType("integer") + .HasColumnName("next_query_page_number"); + + b.Property("NextQueryPageSize") + .HasColumnType("integer") + .HasColumnName("next_query_page_size"); + + b.Property("NextQueryPagingCookie") + .HasColumnType("text") + .HasColumnName("next_query_paging_cookie"); + + b.HasKey("Key", "EntityLogicalName") + .HasName("pk_entity_changes_journals"); + + b.ToTable("entity_changes_journals", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.Establishment", b => + { + b.Property("EstablishmentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("establishment_id"); + + b.Property("Address3") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("address3") + .UseCollation("case_insensitive"); + + b.Property("County") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("county") + .UseCollation("case_insensitive"); + + b.Property("EstablishmentName") + .IsRequired() + .HasMaxLength(120) + .HasColumnType("character varying(120)") + .HasColumnName("establishment_name") + .UseCollation("case_insensitive"); + + b.Property("EstablishmentNumber") + .HasMaxLength(4) + .HasColumnType("character(4)") + .HasColumnName("establishment_number") + .IsFixedLength(); + + b.Property("EstablishmentSourceId") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(1) + .HasColumnName("establishment_source_id"); + + b.Property("EstablishmentStatusCode") + .HasColumnType("integer") + .HasColumnName("establishment_status_code"); + + b.Property("EstablishmentStatusName") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("establishment_status_name"); + + b.Property("EstablishmentTypeCode") + .HasMaxLength(3) + .HasColumnType("character varying(3)") + .HasColumnName("establishment_type_code"); + + b.Property("EstablishmentTypeGroupCode") + .HasColumnType("integer") + .HasColumnName("establishment_type_group_code"); + + b.Property("EstablishmentTypeGroupName") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("establishment_type_group_name"); + + b.Property("EstablishmentTypeName") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("establishment_type_name") + .UseCollation("case_insensitive"); + + b.Property("LaCode") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("character(3)") + .HasColumnName("la_code") + .IsFixedLength(); + + b.Property("LaName") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("la_name") + .UseCollation("case_insensitive"); + + b.Property("Locality") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("locality") + .UseCollation("case_insensitive"); + + b.Property("Postcode") + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("postcode") + .UseCollation("case_insensitive"); + + b.Property("Street") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("street") + .UseCollation("case_insensitive"); + + b.Property("Town") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("town") + .UseCollation("case_insensitive"); + + b.Property("Urn") + .HasMaxLength(6) + .HasColumnType("integer") + .HasColumnName("urn") + .IsFixedLength(); + + b.HasKey("EstablishmentId") + .HasName("pk_establishments"); + + b.HasIndex("EstablishmentSourceId") + .HasDatabaseName("ix_establishment_establishment_source_id"); + + b.HasIndex("Urn") + .HasDatabaseName("ix_establishment_urn"); + + b.HasIndex("LaCode", "EstablishmentNumber") + .HasDatabaseName("ix_establishment_la_code_establishment_number"); + + b.ToTable("establishments", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.EstablishmentSource", b => + { + b.Property("EstablishmentSourceId") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("establishment_source_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("EstablishmentSourceId")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("name") + .UseCollation("case_insensitive"); + + b.HasKey("EstablishmentSourceId") + .HasName("pk_establishment_sources"); + + b.ToTable("establishment_sources", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.Event", b => + { + b.Property("EventId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("event_id"); + + b.Property("AlertId") + .HasColumnType("uuid") + .HasColumnName("alert_id"); + + b.Property("Created") + .HasColumnType("timestamp with time zone") + .HasColumnName("created"); + + b.Property("EventName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("event_name"); + + b.Property("Inserted") + .HasColumnType("timestamp with time zone") + .HasColumnName("inserted"); + + b.Property("Key") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("key"); + + b.Property("Payload") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("payload"); + + b.Property("PersonId") + .HasColumnType("uuid") + .HasColumnName("person_id"); + + b.Property("Published") + .HasColumnType("boolean") + .HasColumnName("published"); + + b.Property("QualificationId") + .HasColumnType("uuid") + .HasColumnName("qualification_id"); + + b.HasKey("EventId") + .HasName("pk_events"); + + b.HasIndex("Key") + .IsUnique() + .HasDatabaseName("ix_events_key") + .HasFilter("key is not null"); + + b.HasIndex("Payload") + .HasDatabaseName("ix_events_payload"); + + NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("Payload"), "gin"); + + b.HasIndex("AlertId", "EventName") + .HasDatabaseName("ix_events_alert_id_event_name") + .HasFilter("alert_id is not null"); + + b.HasIndex("PersonId", "EventName") + .HasDatabaseName("ix_events_person_id_event_name") + .HasFilter("person_id is not null"); + + b.HasIndex("QualificationId", "EventName") + .HasDatabaseName("ix_events_qualification_id_event_name") + .HasFilter("qualification_id is not null"); + + b.ToTable("events", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.EytsAwardedEmailsJob", b => + { + b.Property("EytsAwardedEmailsJobId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("eyts_awarded_emails_job_id"); + + b.Property("AwardedToUtc") + .HasColumnType("timestamp with time zone") + .HasColumnName("awarded_to_utc"); + + b.Property("ExecutedUtc") + .HasColumnType("timestamp with time zone") + .HasColumnName("executed_utc"); + + b.HasKey("EytsAwardedEmailsJobId") + .HasName("pk_eyts_awarded_emails_jobs"); + + b.HasIndex("ExecutedUtc") + .HasDatabaseName("ix_eyts_awarded_emails_jobs_executed_utc"); + + b.ToTable("eyts_awarded_emails_jobs", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.EytsAwardedEmailsJobItem", b => + { + b.Property("EytsAwardedEmailsJobId") + .HasColumnType("uuid") + .HasColumnName("eyts_awarded_emails_job_id"); + + b.Property("PersonId") + .HasColumnType("uuid") + .HasColumnName("person_id"); + + b.Property("EmailAddress") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("email_address"); + + b.Property("EmailSent") + .HasColumnType("boolean") + .HasColumnName("email_sent"); + + b.Property("Personalization") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("personalization"); + + b.Property("Trn") + .IsRequired() + .HasMaxLength(7) + .HasColumnType("character(7)") + .HasColumnName("trn") + .IsFixedLength(); + + b.HasKey("EytsAwardedEmailsJobId", "PersonId") + .HasName("pk_eyts_awarded_emails_job_items"); + + b.HasIndex("Personalization") + .HasDatabaseName("ix_eyts_awarded_emails_job_items_personalization"); + + NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("Personalization"), "gin"); + + b.ToTable("eyts_awarded_emails_job_items", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.InductionCompletedEmailsJob", b => + { + b.Property("InductionCompletedEmailsJobId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("induction_completed_emails_job_id"); + + b.Property("AwardedToUtc") + .HasColumnType("timestamp with time zone") + .HasColumnName("awarded_to_utc"); + + b.Property("ExecutedUtc") + .HasColumnType("timestamp with time zone") + .HasColumnName("executed_utc"); + + b.HasKey("InductionCompletedEmailsJobId") + .HasName("pk_induction_completed_emails_jobs"); + + b.HasIndex("ExecutedUtc") + .HasDatabaseName("ix_induction_completed_emails_jobs_executed_utc"); + + b.ToTable("induction_completed_emails_jobs", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.InductionCompletedEmailsJobItem", b => + { + b.Property("InductionCompletedEmailsJobId") + .HasColumnType("uuid") + .HasColumnName("induction_completed_emails_job_id"); + + b.Property("PersonId") + .HasColumnType("uuid") + .HasColumnName("person_id"); + + b.Property("EmailAddress") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("email_address"); + + b.Property("EmailSent") + .HasColumnType("boolean") + .HasColumnName("email_sent"); + + b.Property("Personalization") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("personalization"); + + b.Property("Trn") + .IsRequired() + .HasMaxLength(7) + .HasColumnType("character(7)") + .HasColumnName("trn") + .IsFixedLength(); + + b.HasKey("InductionCompletedEmailsJobId", "PersonId") + .HasName("pk_induction_completed_emails_job_items"); + + b.HasIndex("Personalization") + .HasDatabaseName("ix_induction_completed_emails_job_items_personalization"); + + NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("Personalization"), "gin"); + + b.ToTable("induction_completed_emails_job_items", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.InternationalQtsAwardedEmailsJob", b => + { + b.Property("InternationalQtsAwardedEmailsJobId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("international_qts_awarded_emails_job_id"); + + b.Property("AwardedToUtc") + .HasColumnType("timestamp with time zone") + .HasColumnName("awarded_to_utc"); + + b.Property("ExecutedUtc") + .HasColumnType("timestamp with time zone") + .HasColumnName("executed_utc"); + + b.HasKey("InternationalQtsAwardedEmailsJobId") + .HasName("pk_international_qts_awarded_emails_jobs"); + + b.HasIndex("ExecutedUtc") + .HasDatabaseName("ix_international_qts_awarded_emails_jobs_executed_utc"); + + b.ToTable("international_qts_awarded_emails_jobs", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.InternationalQtsAwardedEmailsJobItem", b => + { + b.Property("InternationalQtsAwardedEmailsJobId") + .HasColumnType("uuid") + .HasColumnName("international_qts_awarded_emails_job_id"); + + b.Property("PersonId") + .HasColumnType("uuid") + .HasColumnName("person_id"); + + b.Property("EmailAddress") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("email_address"); + + b.Property("EmailSent") + .HasColumnType("boolean") + .HasColumnName("email_sent"); + + b.Property("Personalization") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("personalization"); + + b.Property("Trn") + .IsRequired() + .HasMaxLength(7) + .HasColumnType("character(7)") + .HasColumnName("trn") + .IsFixedLength(); + + b.HasKey("InternationalQtsAwardedEmailsJobId", "PersonId") + .HasName("pk_international_qts_awarded_emails_job_items"); + + b.HasIndex("Personalization") + .HasDatabaseName("ix_international_qts_awarded_emails_job_items_personalization"); + + NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("Personalization"), "gin"); + + b.ToTable("international_qts_awarded_emails_job_items", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.JourneyState", b => + { + b.Property("InstanceId") + .HasMaxLength(300) + .HasColumnType("character varying(300)") + .HasColumnName("instance_id"); + + b.Property("Completed") + .HasColumnType("timestamp with time zone") + .HasColumnName("completed"); + + b.Property("Created") + .HasColumnType("timestamp with time zone") + .HasColumnName("created"); + + b.Property("State") + .IsRequired() + .HasColumnType("text") + .HasColumnName("state"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated"); + + b.Property("UserId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("user_id"); + + b.HasKey("InstanceId") + .HasName("pk_journey_states"); + + b.ToTable("journey_states", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.MandatoryQualificationProvider", b => + { + b.Property("MandatoryQualificationProviderId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("mandatory_qualification_provider_id"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("name"); + + b.HasKey("MandatoryQualificationProviderId") + .HasName("pk_mandatory_qualification_providers"); + + b.ToTable("mandatory_qualification_providers", (string)null); + + b.HasData( + new + { + MandatoryQualificationProviderId = new Guid("e28ea41d-408d-4c89-90cc-8b9b04ac68f5"), + Name = "University of Birmingham" + }, + new + { + MandatoryQualificationProviderId = new Guid("89f9a1aa-3d68-4985-a4ce-403b6044c18c"), + Name = "University of Leeds" + }, + new + { + MandatoryQualificationProviderId = new Guid("aa5c300e-3b7c-456c-8183-3520b3d55dca"), + Name = "University of Manchester" + }, + new + { + MandatoryQualificationProviderId = new Guid("f417e73e-e2ad-40eb-85e3-55865be7f6be"), + Name = "Mary Hare School / University of Hertfordshire" + }, + new + { + MandatoryQualificationProviderId = new Guid("fbf22e04-b274-4c80-aba8-79fb6a7a32ce"), + Name = "University of Edinburgh" + }, + new + { + MandatoryQualificationProviderId = new Guid("26204149-349c-4ad6-9466-bb9b83723eae"), + Name = "Liverpool John Moores University" + }, + new + { + MandatoryQualificationProviderId = new Guid("0c30f666-647c-4ea8-8883-0fc6010b56be"), + Name = "University of Oxford/Oxford Polytechnic" + }, + new + { + MandatoryQualificationProviderId = new Guid("d0e6d54c-5e90-438a-945d-f97388c2b352"), + Name = "University of Cambridge" + }, + new + { + MandatoryQualificationProviderId = new Guid("aec32252-ef25-452e-a358-34a04e03369c"), + Name = "University of Newcastle-upon-Tyne" + }, + new + { + MandatoryQualificationProviderId = new Guid("d9ee7054-7fde-4cfd-9a5e-4b99511d1b3d"), + Name = "University of Plymouth" + }, + new + { + MandatoryQualificationProviderId = new Guid("707d58ca-1953-413b-9a46-41e9b0be885e"), + Name = "University of Hertfordshire" + }, + new + { + MandatoryQualificationProviderId = new Guid("3fc648a7-18e4-49e7-8a4b-1612616b72d5"), + Name = "University of London" + }, + new + { + MandatoryQualificationProviderId = new Guid("374dceb8-8224-45b8-b7dc-a6b0282b1065"), + Name = "Bristol Polytechnic" + }, + new + { + MandatoryQualificationProviderId = new Guid("d4fc958b-21de-47ec-9f03-36ae237a1b11"), + Name = "University College, Swansea" + }); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.NameSynonyms", b => + { + b.Property("NameSynonymsId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("name_synonyms_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("NameSynonymsId")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("name") + .UseCollation("case_insensitive"); + + b.Property("Synonyms") + .IsRequired() + .HasColumnType("text[]") + .HasColumnName("synonyms") + .UseCollation("case_insensitive"); + + b.HasKey("NameSynonymsId") + .HasName("pk_name_synonyms"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("ix_name_synonyms_name"); + + b.ToTable("name_synonyms", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.OneLoginUser", b => + { + b.Property("Subject") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("subject"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("email"); + + b.Property("FirstOneLoginSignIn") + .HasColumnType("timestamp with time zone") + .HasColumnName("first_one_login_sign_in"); + + b.Property("FirstSignIn") + .HasColumnType("timestamp with time zone") + .HasColumnName("first_sign_in"); + + b.Property("LastCoreIdentityVc") + .HasColumnType("jsonb") + .HasColumnName("last_core_identity_vc"); + + b.Property("LastOneLoginSignIn") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_one_login_sign_in"); + + b.Property("LastSignIn") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_sign_in"); + + b.Property("MatchRoute") + .HasColumnType("integer") + .HasColumnName("match_route"); + + b.Property("MatchedAttributes") + .HasColumnType("jsonb") + .HasColumnName("matched_attributes"); + + b.Property("PersonId") + .HasColumnType("uuid") + .HasColumnName("person_id"); + + b.Property("VerificationRoute") + .HasColumnType("integer") + .HasColumnName("verification_route"); + + b.Property("VerifiedDatesOfBirth") + .HasColumnType("jsonb") + .HasColumnName("verified_dates_of_birth"); + + b.Property("VerifiedNames") + .HasColumnType("jsonb") + .HasColumnName("verified_names"); + + b.Property("VerifiedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("verified_on"); + + b.HasKey("Subject") + .HasName("pk_one_login_users"); + + b.ToTable("one_login_users", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.Person", b => + { + b.Property("PersonId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("person_id"); + + b.Property("CreatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_on"); + + b.Property("DateOfBirth") + .HasColumnType("date") + .HasColumnName("date_of_birth"); + + b.Property("DeletedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_on"); + + b.Property("DqtContactId") + .HasColumnType("uuid") + .HasColumnName("dqt_contact_id"); + + b.Property("DqtCreatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("dqt_created_on"); + + b.Property("DqtFirstName") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("dqt_first_name") + .UseCollation("case_insensitive"); + + b.Property("DqtFirstSync") + .HasColumnType("timestamp with time zone") + .HasColumnName("dqt_first_sync"); + + b.Property("DqtLastName") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("dqt_last_name") + .UseCollation("case_insensitive"); + + b.Property("DqtLastSync") + .HasColumnType("timestamp with time zone") + .HasColumnName("dqt_last_sync"); + + b.Property("DqtMiddleName") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("dqt_middle_name") + .UseCollation("case_insensitive"); + + b.Property("DqtModifiedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("dqt_modified_on"); + + b.Property("DqtState") + .HasColumnType("integer") + .HasColumnName("dqt_state"); + + b.Property("EmailAddress") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("email_address") + .UseCollation("case_insensitive"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("first_name") + .UseCollation("case_insensitive"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("last_name") + .UseCollation("case_insensitive"); + + b.Property("MiddleName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("middle_name") + .UseCollation("case_insensitive"); + + b.Property("NationalInsuranceNumber") + .HasMaxLength(9) + .HasColumnType("character(9)") + .HasColumnName("national_insurance_number") + .IsFixedLength(); + + b.Property("Trn") + .HasMaxLength(7) + .HasColumnType("character(7)") + .HasColumnName("trn") + .IsFixedLength(); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_on"); + + b.HasKey("PersonId") + .HasName("pk_persons"); + + b.HasIndex("DqtContactId") + .IsUnique() + .HasDatabaseName("ix_persons_dqt_contact_id") + .HasFilter("dqt_contact_id is not null"); + + b.HasIndex("Trn") + .IsUnique() + .HasDatabaseName("ix_persons_trn") + .HasFilter("trn is not null"); + + b.ToTable("persons", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.PersonSearchAttribute", b => + { + b.Property("PersonSearchAttributeId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("person_search_attribute_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("PersonSearchAttributeId")); + + b.Property("AttributeKey") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("attribute_key") + .UseCollation("case_insensitive"); + + b.Property("AttributeType") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("attribute_type") + .UseCollation("case_insensitive"); + + b.Property("AttributeValue") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)") + .HasColumnName("attribute_value") + .UseCollation("case_insensitive"); + + b.Property("PersonId") + .HasColumnType("uuid") + .HasColumnName("person_id"); + + b.Property("Tags") + .IsRequired() + .HasColumnType("text[]") + .HasColumnName("tags"); + + b.HasKey("PersonSearchAttributeId") + .HasName("pk_person_search_attributes"); + + b.HasIndex("PersonId") + .HasDatabaseName("ix_person_search_attributes_person_id"); + + b.HasIndex("AttributeType", "AttributeValue") + .HasDatabaseName("ix_person_search_attributes_attribute_type_and_value"); + + b.ToTable("person_search_attributes", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.QtsAwardedEmailsJob", b => + { + b.Property("QtsAwardedEmailsJobId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("qts_awarded_emails_job_id"); + + b.Property("AwardedToUtc") + .HasColumnType("timestamp with time zone") + .HasColumnName("awarded_to_utc"); + + b.Property("ExecutedUtc") + .HasColumnType("timestamp with time zone") + .HasColumnName("executed_utc"); + + b.HasKey("QtsAwardedEmailsJobId") + .HasName("pk_qts_awarded_emails_jobs"); + + b.HasIndex("ExecutedUtc") + .HasDatabaseName("ix_qts_awarded_emails_jobs_executed_utc"); + + b.ToTable("qts_awarded_emails_jobs", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.QtsAwardedEmailsJobItem", b => + { + b.Property("QtsAwardedEmailsJobId") + .HasColumnType("uuid") + .HasColumnName("qts_awarded_emails_job_id"); + + b.Property("PersonId") + .HasColumnType("uuid") + .HasColumnName("person_id"); + + b.Property("EmailAddress") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("email_address"); + + b.Property("EmailSent") + .HasColumnType("boolean") + .HasColumnName("email_sent"); + + b.Property("Personalization") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("personalization"); + + b.Property("Trn") + .IsRequired() + .HasMaxLength(7) + .HasColumnType("character(7)") + .HasColumnName("trn") + .IsFixedLength(); + + b.HasKey("QtsAwardedEmailsJobId", "PersonId") + .HasName("pk_qts_awarded_emails_job_items"); + + b.HasIndex("Personalization") + .HasDatabaseName("ix_qts_awarded_emails_job_items_personalization"); + + NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("Personalization"), "gin"); + + b.ToTable("qts_awarded_emails_job_items", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.Qualification", b => + { + b.Property("QualificationId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("qualification_id"); + + b.Property("CreatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_on"); + + b.Property("DeletedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_on"); + + b.Property("DqtCreatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("dqt_created_on"); + + b.Property("DqtFirstSync") + .HasColumnType("timestamp with time zone") + .HasColumnName("dqt_first_sync"); + + b.Property("DqtLastSync") + .HasColumnType("timestamp with time zone") + .HasColumnName("dqt_last_sync"); + + b.Property("DqtModifiedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("dqt_modified_on"); + + b.Property("DqtQualificationId") + .HasColumnType("uuid") + .HasColumnName("dqt_qualification_id"); + + b.Property("DqtState") + .HasColumnType("integer") + .HasColumnName("dqt_state"); + + b.Property("PersonId") + .HasColumnType("uuid") + .HasColumnName("person_id"); + + b.Property("QualificationType") + .HasColumnType("integer") + .HasColumnName("qualification_type"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_on"); + + b.HasKey("QualificationId") + .HasName("pk_qualifications"); + + b.HasIndex("DqtQualificationId") + .IsUnique() + .HasDatabaseName("ix_qualifications_dqt_qualification_id") + .HasFilter("dqt_qualification_id is not null"); + + b.HasIndex("PersonId") + .HasDatabaseName("ix_qualifications_person_id"); + + b.ToTable("qualifications", (string)null); + + b.HasDiscriminator("QualificationType"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.Route", b => + { + b.Property("RouteId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("route_id"); + + b.Property("AgeRangeFrom") + .HasColumnType("integer") + .HasColumnName("age_range_from"); + + b.Property("AgeRangeTo") + .HasColumnType("integer") + .HasColumnName("age_range_to"); + + b.Property("CountryId") + .HasColumnType("character varying(4)") + .HasColumnName("country_id"); + + b.Property("ExternalReference") + .HasColumnType("text") + .HasColumnName("external_reference"); + + b.Property("InductionExemptionReason") + .HasColumnType("integer") + .HasColumnName("induction_exemption_reason"); + + b.Property("IttProviderId") + .HasColumnType("uuid") + .HasColumnName("itt_provider_id"); + + b.Property("PersonId") + .HasColumnType("uuid") + .HasColumnName("person_id"); + + b.Property("ProgrammeEndDate") + .HasColumnType("date") + .HasColumnName("programme_end_date"); + + b.Property("ProgrammeStartDate") + .HasColumnType("date") + .HasColumnName("programme_start_date"); + + b.Property("QualificationId") + .HasColumnType("uuid") + .HasColumnName("qualification_id"); + + b.Property("QualificationType") + .HasColumnType("integer") + .HasColumnName("qualification_type"); + + b.Property("RouteStatus") + .HasColumnType("integer") + .HasColumnName("route_status"); + + b.Property("RouteType") + .HasColumnType("integer") + .HasColumnName("route_type"); + + b.Property>("Subjects") + .IsRequired() + .HasColumnType("uuid[]") + .HasColumnName("subjects"); + + b.HasKey("RouteId") + .HasName("pk_routes"); + + b.HasIndex("PersonId") + .HasDatabaseName("ix_routes_person_id"); + + b.ToTable("routes", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.SupportTask", b => + { + b.Property("SupportTaskReference") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("support_task_reference"); + + b.Property("CreatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_on"); + + b.Property("OneLoginUserSubject") + .HasColumnType("character varying(255)") + .HasColumnName("one_login_user_subject"); + + b.Property("PersonId") + .HasColumnType("uuid") + .HasColumnName("person_id"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("SupportTaskType") + .HasColumnType("integer") + .HasColumnName("support_task_type"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_on"); + + b.Property("_data") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("data"); + + b.HasKey("SupportTaskReference") + .HasName("pk_support_tasks"); + + b.HasIndex("OneLoginUserSubject") + .HasDatabaseName("ix_support_tasks_one_login_user_subject"); + + b.HasIndex("PersonId") + .HasDatabaseName("ix_support_tasks_person_id"); + + b.ToTable("support_tasks", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.TpsCsvExtract", b => + { + b.Property("TpsCsvExtractId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("tps_csv_extract_id"); + + b.Property("CreatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_on"); + + b.Property("Filename") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("filename"); + + b.HasKey("TpsCsvExtractId") + .HasName("pk_tps_csv_extracts"); + + b.ToTable("tps_csv_extracts", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.TpsCsvExtractItem", b => + { + b.Property("TpsCsvExtractItemId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("tps_csv_extract_item_id"); + + b.Property("Created") + .HasColumnType("timestamp with time zone") + .HasColumnName("created"); + + b.Property("DateOfBirth") + .HasColumnType("date") + .HasColumnName("date_of_birth"); + + b.Property("DateOfDeath") + .HasColumnType("date") + .HasColumnName("date_of_death"); + + b.Property("EmploymentEndDate") + .HasColumnType("date") + .HasColumnName("employment_end_date"); + + b.Property("EmploymentStartDate") + .HasColumnType("date") + .HasColumnName("employment_start_date"); + + b.Property("EmploymentType") + .HasColumnType("integer") + .HasColumnName("employment_type"); + + b.Property("EstablishmentEmailAddress") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("establishment_email_address"); + + b.Property("EstablishmentNumber") + .HasMaxLength(4) + .HasColumnType("character(4)") + .HasColumnName("establishment_number") + .IsFixedLength(); + + b.Property("EstablishmentPostcode") + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("establishment_postcode"); + + b.Property("ExtractDate") + .HasColumnType("date") + .HasColumnName("extract_date"); + + b.Property("Gender") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("gender"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("key"); + + b.Property("LocalAuthorityCode") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("character(3)") + .HasColumnName("local_authority_code") + .IsFixedLength(); + + b.Property("MemberEmailAddress") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("member_email_address"); + + b.Property("MemberId") + .HasColumnType("integer") + .HasColumnName("member_id"); + + b.Property("MemberPostcode") + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("member_postcode"); + + b.Property("NationalInsuranceNumber") + .IsRequired() + .HasMaxLength(9) + .HasColumnType("character(9)") + .HasColumnName("national_insurance_number") + .IsFixedLength(); + + b.Property("Result") + .HasColumnType("integer") + .HasColumnName("result"); + + b.Property("TpsCsvExtractId") + .HasColumnType("uuid") + .HasColumnName("tps_csv_extract_id"); + + b.Property("TpsCsvExtractLoadItemId") + .HasColumnType("uuid") + .HasColumnName("tps_csv_extract_load_item_id"); + + b.Property("Trn") + .IsRequired() + .HasMaxLength(7) + .HasColumnType("character(7)") + .HasColumnName("trn") + .IsFixedLength(); + + b.Property("WithdrawalIndicator") + .HasMaxLength(1) + .HasColumnType("character(1)") + .HasColumnName("withdrawal_indicator") + .IsFixedLength(); + + b.HasKey("TpsCsvExtractItemId") + .HasName("pk_tps_csv_extract_items"); + + b.HasIndex("Key") + .HasDatabaseName("ix_tps_csv_extract_items_key"); + + b.HasIndex("TpsCsvExtractId") + .HasDatabaseName("ix_tps_csv_extract_items_tps_csv_extract_id"); + + b.HasIndex("TpsCsvExtractLoadItemId") + .HasDatabaseName("ix_tps_csv_extract_items_tps_csv_extract_load_item_id"); + + b.HasIndex("Trn") + .HasDatabaseName("ix_tps_csv_extract_items_trn"); + + b.HasIndex("LocalAuthorityCode", "EstablishmentNumber") + .HasDatabaseName("ix_tps_csv_extract_items_la_code_establishment_number"); + + b.ToTable("tps_csv_extract_items", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.TpsCsvExtractLoadItem", b => + { + b.Property("TpsCsvExtractLoadItemId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("tps_csv_extract_load_item_id"); + + b.Property("Created") + .HasColumnType("timestamp with time zone") + .HasColumnName("created"); + + b.Property("DateOfBirth") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("date_of_birth"); + + b.Property("DateOfDeath") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("date_of_death"); + + b.Property("EmploymentEndDate") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("employment_end_date"); + + b.Property("EmploymentStartDate") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("employment_start_date"); + + b.Property("Errors") + .HasColumnType("integer") + .HasColumnName("errors"); + + b.Property("EstablishmentEmailAddress") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("establishment_email_address"); + + b.Property("EstablishmentNumber") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("establishment_number"); + + b.Property("EstablishmentPostcode") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("establishment_postcode"); + + b.Property("ExtractDate") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("extract_date"); + + b.Property("FullOrPartTimeIndicator") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("full_or_part_time_indicator"); + + b.Property("Gender") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("gender"); + + b.Property("LocalAuthorityCode") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("local_authority_code"); + + b.Property("MemberEmailAddress") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("member_email_address"); + + b.Property("MemberId") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("member_id"); + + b.Property("MemberPostcode") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("member_postcode"); + + b.Property("NationalInsuranceNumber") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("national_insurance_number"); + + b.Property("TpsCsvExtractId") + .HasColumnType("uuid") + .HasColumnName("tps_csv_extract_id"); + + b.Property("Trn") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("trn"); + + b.Property("WithdrawalIndicator") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("withdrawal_indicator"); + + b.HasKey("TpsCsvExtractLoadItemId") + .HasName("pk_tps_csv_extract_load_items"); + + b.ToTable("tps_csv_extract_load_items", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.TpsEmployment", b => + { + b.Property("TpsEmploymentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("tps_employment_id"); + + b.Property("CreatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_on"); + + b.Property("EmploymentType") + .HasColumnType("integer") + .HasColumnName("employment_type"); + + b.Property("EndDate") + .HasColumnType("date") + .HasColumnName("end_date"); + + b.Property("EstablishmentId") + .HasColumnType("uuid") + .HasColumnName("establishment_id"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("key"); + + b.Property("LastExtractDate") + .HasColumnType("date") + .HasColumnName("last_extract_date"); + + b.Property("LastKnownTpsEmployedDate") + .HasColumnType("date") + .HasColumnName("last_known_tps_employed_date"); + + b.Property("NationalInsuranceNumber") + .HasMaxLength(9) + .HasColumnType("character(9)") + .HasColumnName("national_insurance_number") + .IsFixedLength(); + + b.Property("PersonId") + .HasColumnType("uuid") + .HasColumnName("person_id"); + + b.Property("PersonPostcode") + .HasMaxLength(10) + .HasColumnType("character varying(10)") + .HasColumnName("person_postcode"); + + b.Property("StartDate") + .HasColumnType("date") + .HasColumnName("start_date"); + + b.Property("UpdatedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("updated_on"); + + b.Property("WithdrawalConfirmed") + .HasColumnType("boolean") + .HasColumnName("withdrawal_confirmed"); + + b.HasKey("TpsEmploymentId") + .HasName("pk_tps_employments"); + + b.HasIndex("EstablishmentId") + .HasDatabaseName("ix_tps_employments_establishment_id"); + + b.HasIndex("Key") + .HasDatabaseName("ix_tps_employments_key"); + + b.HasIndex("PersonId") + .HasDatabaseName("ix_tps_employments_person_id"); + + b.ToTable("tps_employments", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.TpsEstablishment", b => + { + b.Property("TpsEstablishmentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("tps_establishment_id"); + + b.Property("EmployersName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("employers_name"); + + b.Property("EstablishmentCode") + .IsRequired() + .HasMaxLength(4) + .HasColumnType("character(4)") + .HasColumnName("establishment_code") + .IsFixedLength(); + + b.Property("LaCode") + .IsRequired() + .HasMaxLength(3) + .HasColumnType("character(3)") + .HasColumnName("la_code") + .IsFixedLength(); + + b.Property("SchoolClosedDate") + .HasColumnType("date") + .HasColumnName("school_closed_date"); + + b.Property("SchoolGiasName") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("school_gias_name"); + + b.HasKey("TpsEstablishmentId") + .HasName("pk_tps_establishments"); + + b.HasIndex("LaCode", "EstablishmentCode") + .HasDatabaseName("ix_tps_establishments_la_code_establishment_number"); + + b.ToTable("tps_establishments", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.TpsEstablishmentType", b => + { + b.Property("TpsEstablishmentTypeId") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("tps_establishment_type_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("TpsEstablishmentTypeId")); + + b.Property("Description") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)") + .HasColumnName("description"); + + b.Property("EstablishmentRangeFrom") + .IsRequired() + .HasMaxLength(4) + .HasColumnType("character(4)") + .HasColumnName("establishment_range_from") + .IsFixedLength(); + + b.Property("EstablishmentRangeTo") + .IsRequired() + .HasMaxLength(4) + .HasColumnType("character(4)") + .HasColumnName("establishment_range_to") + .IsFixedLength(); + + b.Property("ShortDescription") + .IsRequired() + .HasMaxLength(120) + .HasColumnType("character varying(120)") + .HasColumnName("short_description"); + + b.HasKey("TpsEstablishmentTypeId") + .HasName("pk_tps_establishment_types"); + + b.ToTable("tps_establishment_types", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.TrnRequest", b => + { + b.Property("TrnRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("trn_request_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("TrnRequestId")); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("client_id"); + + b.Property("IdentityUserId") + .HasColumnType("uuid") + .HasColumnName("identity_user_id"); + + b.Property("LinkedToIdentity") + .HasColumnType("boolean") + .HasColumnName("linked_to_identity"); + + b.Property("RequestId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("request_id"); + + b.Property("TeacherId") + .HasColumnType("uuid") + .HasColumnName("teacher_id"); + + b.Property("TrnToken") + .HasMaxLength(128) + .HasColumnType("character varying(128)") + .HasColumnName("trn_token"); + + b.HasKey("TrnRequestId") + .HasName("pk_trn_requests"); + + b.HasIndex("ClientId", "RequestId") + .IsUnique() + .HasDatabaseName("ix_trn_requests_client_id_request_id"); + + b.ToTable("trn_requests", (string)null); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.UserBase", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("Active") + .HasColumnType("boolean") + .HasColumnName("active"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("name"); + + b.Property("UserType") + .HasColumnType("integer") + .HasColumnName("user_type"); + + b.HasKey("UserId") + .HasName("pk_users"); + + b.ToTable("users", (string)null); + + b.HasDiscriminator("UserType"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.EarlyYearsTeacherStatusQualification", b => + { + b.HasBaseType("TeachingRecordSystem.Core.DataStore.Postgres.Models.Qualification"); + + b.Property("AwardedDate") + .HasColumnType("date") + .HasColumnName("awarded_date"); + + b.Property("DqtQtsRegistrationId") + .HasColumnType("uuid") + .HasColumnName("dqt_qts_registration_id"); + + b.HasDiscriminator().HasValue(2); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.MandatoryQualification", b => + { + b.HasBaseType("TeachingRecordSystem.Core.DataStore.Postgres.Models.Qualification"); + + b.Property("DqtMqEstablishmentId") + .HasColumnType("uuid") + .HasColumnName("dqt_mq_establishment_id"); + + b.Property("DqtSpecialismId") + .HasColumnType("uuid") + .HasColumnName("dqt_specialism_id"); + + b.Property("EndDate") + .HasColumnType("date") + .HasColumnName("end_date"); + + b.Property("ProviderId") + .HasColumnType("uuid") + .HasColumnName("mq_provider_id"); + + b.Property("Specialism") + .HasColumnType("integer") + .HasColumnName("mq_specialism"); + + b.Property("StartDate") + .HasColumnType("date") + .HasColumnName("start_date"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("mq_status"); + + b.HasDiscriminator().HasValue(0); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.QualifiedTeacherStatusQualification", b => + { + b.HasBaseType("TeachingRecordSystem.Core.DataStore.Postgres.Models.Qualification"); + + b.Property("AwardedDate") + .HasColumnType("date") + .HasColumnName("awarded_date"); + + b.Property("DqtQtsRegistrationId") + .HasColumnType("uuid") + .HasColumnName("dqt_qts_registration_id"); + + b.HasDiscriminator().HasValue(1); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.ApplicationUser", b => + { + b.HasBaseType("TeachingRecordSystem.Core.DataStore.Postgres.Models.UserBase"); + + b.Property("ApiRoles") + .HasColumnType("varchar[]") + .HasColumnName("api_roles"); + + b.Property("ClientId") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("client_id"); + + b.Property("ClientSecret") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("client_secret"); + + b.Property("IsOidcClient") + .HasColumnType("boolean") + .HasColumnName("is_oidc_client"); + + b.Property("OneLoginAuthenticationSchemeName") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("one_login_authentication_scheme_name"); + + b.Property("OneLoginClientId") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("one_login_client_id"); + + b.Property("OneLoginPostLogoutRedirectUriPath") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("one_login_post_logout_redirect_uri_path"); + + b.Property("OneLoginPrivateKeyPem") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)") + .HasColumnName("one_login_private_key_pem"); + + b.Property("OneLoginRedirectUriPath") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("one_login_redirect_uri_path"); + + b.Property>("PostLogoutRedirectUris") + .HasColumnType("varchar[]") + .HasColumnName("post_logout_redirect_uris"); + + b.Property>("RedirectUris") + .HasColumnType("varchar[]") + .HasColumnName("redirect_uris"); + + b.HasIndex("ClientId") + .IsUnique() + .HasDatabaseName("ix_users_client_id") + .HasFilter("client_id is not null"); + + b.HasIndex("OneLoginAuthenticationSchemeName") + .IsUnique() + .HasDatabaseName("ix_users_one_login_authentication_scheme_name") + .HasFilter("one_login_authentication_scheme_name is not null"); + + b.HasDiscriminator().HasValue(2); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.SystemUser", b => + { + b.HasBaseType("TeachingRecordSystem.Core.DataStore.Postgres.Models.UserBase"); + + b.ToTable("users", (string)null); + + b.HasDiscriminator().HasValue(3); + + b.HasData( + new + { + UserId = new Guid("a81394d1-a498-46d8-af3e-e077596ab303"), + Active = true, + Name = "System", + UserType = 0 + }); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.User", b => + { + b.HasBaseType("TeachingRecordSystem.Core.DataStore.Postgres.Models.UserBase"); + + b.Property("AzureAdUserId") + .HasMaxLength(100) + .HasColumnType("character varying(100)") + .HasColumnName("azure_ad_user_id"); + + b.Property("DqtUserId") + .HasColumnType("uuid") + .HasColumnName("dqt_user_id"); + + b.Property("Email") + .HasMaxLength(200) + .HasColumnType("character varying(200)") + .HasColumnName("email") + .UseCollation("case_insensitive"); + + b.Property("Roles") + .IsRequired() + .HasColumnType("varchar[]") + .HasColumnName("roles"); + + b.HasIndex("AzureAdUserId") + .IsUnique() + .HasDatabaseName("ix_users_azure_ad_user_id"); + + b.HasDiscriminator().HasValue(1); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") + .WithMany("Authorizations") + .HasForeignKey("ApplicationId") + .HasConstraintName("fk_oidc_authorizations_oidc_applications_application_id"); + + b.Navigation("Application"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => + { + b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") + .WithMany("Tokens") + .HasForeignKey("ApplicationId") + .HasConstraintName("fk_oidc_tokens_oidc_applications_application_id"); + + b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", "Authorization") + .WithMany("Tokens") + .HasForeignKey("AuthorizationId") + .HasConstraintName("fk_oidc_tokens_oidc_authorizations_authorization_id"); + + b.Navigation("Application"); + + b.Navigation("Authorization"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.Alert", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.AlertType", "AlertType") + .WithMany() + .HasForeignKey("AlertTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_alerts_alert_type"); + + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.Person", "Person") + .WithMany("Alerts") + .HasForeignKey("PersonId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_alerts_person"); + + b.Navigation("AlertType"); + + b.Navigation("Person"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.AlertType", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.AlertCategory", "AlertCategory") + .WithMany("AlertTypes") + .HasForeignKey("AlertCategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_alert_types_alert_category"); + + b.Navigation("AlertCategory"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.ApiKey", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.ApplicationUser", "ApplicationUser") + .WithMany("ApiKeys") + .HasForeignKey("ApplicationUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_api_key_application_user"); + + b.Navigation("ApplicationUser"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.Establishment", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.EstablishmentSource", null) + .WithMany() + .HasForeignKey("EstablishmentSourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_establishments_establishment_source_id"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.EytsAwardedEmailsJobItem", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.EytsAwardedEmailsJob", "EytsAwardedEmailsJob") + .WithMany("JobItems") + .HasForeignKey("EytsAwardedEmailsJobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_eyts_awarded_emails_job_items_eyts_awarded_emails_jobs_eyts"); + + b.Navigation("EytsAwardedEmailsJob"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.InductionCompletedEmailsJobItem", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.InductionCompletedEmailsJob", "InductionCompletedEmailsJob") + .WithMany("JobItems") + .HasForeignKey("InductionCompletedEmailsJobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_induction_completed_emails_job_items_induction_completed_em"); + + b.Navigation("InductionCompletedEmailsJob"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.InternationalQtsAwardedEmailsJobItem", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.InternationalQtsAwardedEmailsJob", "InternationalQtsAwardedEmailsJob") + .WithMany("JobItems") + .HasForeignKey("InternationalQtsAwardedEmailsJobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_international_qts_awarded_emails_job_items_international_qt"); + + b.Navigation("InternationalQtsAwardedEmailsJob"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.OneLoginUser", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.Person", "Person") + .WithOne() + .HasForeignKey("TeachingRecordSystem.Core.DataStore.Postgres.Models.OneLoginUser", "PersonId") + .HasConstraintName("fk_one_login_users_persons_person_id"); + + b.Navigation("Person"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.QtsAwardedEmailsJobItem", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.QtsAwardedEmailsJob", "QtsAwardedEmailsJob") + .WithMany("JobItems") + .HasForeignKey("QtsAwardedEmailsJobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_qts_awarded_emails_job_items_qts_awarded_emails_jobs_qts_aw"); + + b.Navigation("QtsAwardedEmailsJob"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.Qualification", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.Person", "Person") + .WithMany("Qualifications") + .HasForeignKey("PersonId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_qualifications_person"); + + b.Navigation("Person"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.Route", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.Country", null) + .WithMany() + .HasForeignKey("CountryId") + .HasConstraintName("fk_routes_countries_country_id"); + + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.Person", null) + .WithMany("Routes") + .HasForeignKey("PersonId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_routes_persons_person_id"); + + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.Qualification", "Qualification") + .WithOne("Route") + .HasForeignKey("TeachingRecordSystem.Core.DataStore.Postgres.Models.Route", "QualificationId") + .HasConstraintName("fk_routes_qualifications_qualification_id"); + + b.Navigation("Qualification"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.SupportTask", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.OneLoginUser", null) + .WithMany() + .HasForeignKey("OneLoginUserSubject") + .HasConstraintName("fk_support_tasks_one_login_user"); + + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.Person", null) + .WithMany() + .HasForeignKey("PersonId") + .HasConstraintName("fk_support_tasks_person"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.TpsCsvExtractItem", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.TpsCsvExtract", null) + .WithMany() + .HasForeignKey("TpsCsvExtractId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_tps_csv_extract_items_tps_csv_extract_id"); + + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.TpsCsvExtractLoadItem", null) + .WithMany() + .HasForeignKey("TpsCsvExtractLoadItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_tps_csv_extract_items_tps_csv_extract_load_item_id"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.TpsCsvExtractLoadItem", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.TpsCsvExtract", null) + .WithMany() + .HasForeignKey("TpsCsvExtractId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_tps_csv_extract_load_items_tps_csv_extract_id"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.TpsEmployment", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.Establishment", null) + .WithMany() + .HasForeignKey("EstablishmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_tps_employments_establishment_id"); + + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.Person", null) + .WithMany() + .HasForeignKey("PersonId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_tps_employments_person_id"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.MandatoryQualification", b => + { + b.HasOne("TeachingRecordSystem.Core.DataStore.Postgres.Models.MandatoryQualificationProvider", "Provider") + .WithMany() + .HasForeignKey("ProviderId") + .HasConstraintName("fk_qualifications_mandatory_qualification_provider"); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => + { + b.Navigation("Authorizations"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.AlertCategory", b => + { + b.Navigation("AlertTypes"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.EytsAwardedEmailsJob", b => + { + b.Navigation("JobItems"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.InductionCompletedEmailsJob", b => + { + b.Navigation("JobItems"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.InternationalQtsAwardedEmailsJob", b => + { + b.Navigation("JobItems"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.Person", b => + { + b.Navigation("Alerts"); + + b.Navigation("Qualifications"); + + b.Navigation("Routes"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.QtsAwardedEmailsJob", b => + { + b.Navigation("JobItems"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.Qualification", b => + { + b.Navigation("Route"); + }); + + modelBuilder.Entity("TeachingRecordSystem.Core.DataStore.Postgres.Models.ApplicationUser", b => + { + b.Navigation("ApiKeys"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Migrations/20241105153742_AlertTypeTypoFix.cs b/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Migrations/20241105153742_AlertTypeTypoFix.cs new file mode 100644 index 000000000..1fbd17924 --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Migrations/20241105153742_AlertTypeTypoFix.cs @@ -0,0 +1,33 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TeachingRecordSystem.Core.DataStore.Postgres.Migrations +{ + /// + public partial class AlertTypeTypoFix : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "alert_types", + keyColumn: "alert_type_id", + keyValue: new Guid("7924fe90-483c-49f8-84fc-674feddba848"), + column: "name", + value: "Secretary of State decision - no prohibition"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "alert_types", + keyColumn: "alert_type_id", + keyValue: new Guid("7924fe90-483c-49f8-84fc-674feddba848"), + column: "name", + value: "Secretary of State decision- no prohibition"); + } + } +} diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Migrations/TrsDbContextModelSnapshot.cs b/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Migrations/TrsDbContextModelSnapshot.cs index 870db519e..7d42ed40c 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Migrations/TrsDbContextModelSnapshot.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.Core/DataStore/Postgres/Migrations/TrsDbContextModelSnapshot.cs @@ -980,7 +980,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) DqtSanctionCode = "T6", InternalOnly = false, IsActive = true, - Name = "Secretary of State decision- no prohibition", + Name = "Secretary of State decision - no prohibition", ProhibitionLevel = 0 }); }); diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.Core/TrsUriHelper.cs b/TeachingRecordSystem/src/TeachingRecordSystem.Core/TrsUriHelper.cs new file mode 100644 index 000000000..006fcf152 --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.Core/TrsUriHelper.cs @@ -0,0 +1,14 @@ +namespace TeachingRecordSystem.Core; + +public static class TrsUriHelper +{ + public static bool TryCreateWebsiteUri(string? uriString, out Uri? uri) + { + var isValidUri = Uri.TryCreate(uriString, UriKind.Absolute, out var uri2) || + Uri.TryCreate("http://" + uriString, UriKind.Absolute, out uri2) && + (uri2.Scheme == "http" || uri2.Scheme == "https"); + + uri = uri2; + return isValidUri; + } +} diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/GlobalUsings.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/GlobalUsings.cs index d417a1f35..bc3657786 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/GlobalUsings.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/GlobalUsings.cs @@ -2,3 +2,4 @@ global using TeachingRecordSystem.UiCommon.FormFlow; global using ColumnSet = Microsoft.Xrm.Sdk.Query.ColumnSet; global using CrmTask = TeachingRecordSystem.Core.Dqt.Models.Task; +global using UiDefaults = TeachingRecordSystem.SupportUi.Pages.Common.UiDefaults; diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/CheckAnswers.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/CheckAnswers.cshtml index 8cf117156..df148738f 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/CheckAnswers.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/CheckAnswers.cshtml @@ -32,14 +32,14 @@ Link - @if (Model.Link is not null) - { - @($"{Model.Link} (opens in new tab)") - } - else - { - - } + @if (Model.Link is not null) + { + @($"{Model.Link} (opens in new tab)") + } + else + { + + } Change @@ -47,7 +47,7 @@ Start date - @Model.StartDate.ToString("d MMMM yyyy") + @Model.StartDate.ToString(UiDefaults.DateOnlyDisplayFormat) Change diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/CheckAnswers.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/CheckAnswers.cshtml.cs index a1cfadb00..85e68af1b 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/CheckAnswers.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/CheckAnswers.cshtml.cs @@ -13,8 +13,6 @@ public class CheckAnswersModel( IFileService fileService, IClock clock) : PageModel { - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromQuery] @@ -33,6 +31,8 @@ public class CheckAnswersModel( public string? Link { get; set; } + public Uri? LinkUri { get; set; } + public DateOnly StartDate { get; set; } public AddAlertReasonOption AddReason { get; set; } @@ -111,12 +111,13 @@ public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingConte AlertTypeName = JourneyInstance!.State.AlertTypeName; Details = JourneyInstance!.State.Details; Link = JourneyInstance!.State.Link; + LinkUri = TrsUriHelper.TryCreateWebsiteUri(Link, out var linkUri) ? linkUri : null; StartDate = JourneyInstance!.State.StartDate!.Value; AddReason = JourneyInstance!.State.AddReason!.Value; AddReasonDetail = JourneyInstance!.State.AddReasonDetail; EvidenceFileName = JourneyInstance.State.EvidenceFileName; UploadedEvidenceFileUrl = JourneyInstance!.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, AlertDefaults.FileUrlExpiry) : null; await next(); diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Details.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Details.cshtml index 037d254ba..14df5bed4 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Details.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Details.cshtml @@ -13,7 +13,7 @@
Add an alert - @Model.PersonName - + @ViewBag.Title diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Details.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Details.cshtml.cs index b8ed73dc0..7f2a8ea00 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Details.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Details.cshtml.cs @@ -8,8 +8,6 @@ namespace TeachingRecordSystem.SupportUi.Pages.Alerts.AddAlert; [Journey(JourneyNames.AddAlert), RequireJourneyInstance] public class DetailsModel(TrsLinkGenerator linkGenerator) : PageModel { - public const int DetailsMaxLength = 4000; - public JourneyInstance? JourneyInstance { get; set; } [FromQuery] @@ -25,7 +23,7 @@ public class DetailsModel(TrsLinkGenerator linkGenerator) : PageModel [BindProperty] [Required(ErrorMessage = "Enter details")] [Display(Description = "For example, include any restrictions it places on a teacher.")] - [MaxLength(DetailsMaxLength, ErrorMessage = "Details must be 4000 characters or less")] + [MaxLength(AlertDefaults.DetailMaxCharacterCount, ErrorMessage = "Details must be 4000 characters or less")] public string? Details { get; set; } public void OnGet() diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Link.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Link.cshtml index 0ade15ec9..969077153 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Link.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Link.cshtml @@ -17,8 +17,8 @@ - Panel outcomes (opens in a new tab) - include details about the allegation, the panel’s decision and reasons for it. The link will be seen internally. + Panel outcomes (opens in a new tab) + include details about the allegation, the panel’s decision and reasons for it. The link will only be seen internally. Yes diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Link.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Link.cshtml.cs index 471705fd1..9ab875de2 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Link.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Link.cshtml.cs @@ -35,9 +35,7 @@ public void OnGet() public async Task OnPost() { - if (AddLink == true && - (!Uri.TryCreate(Link, UriKind.Absolute, out var uri) || - (uri.Scheme != "http" && uri.Scheme != "https"))) + if (AddLink == true && !TrsUriHelper.TryCreateWebsiteUri(Link, out _)) { ModelState.AddModelError(nameof(Link), "Enter a valid URL"); } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Reason.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Reason.cshtml index 0d48a0fb8..041bcce66 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Reason.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Reason.cshtml @@ -35,7 +35,7 @@ Yes - + diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Reason.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Reason.cshtml.cs index c2571f4fb..ee27b6858 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Reason.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AddAlert/Reason.cshtml.cs @@ -11,11 +11,6 @@ namespace TeachingRecordSystem.SupportUi.Pages.Alerts.AddAlert; [Journey(JourneyNames.AddAlert), RequireJourneyInstance] public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileService) : PageModel { - public const int MaxFileSizeMb = 50; - public const int AddReasonDetailMaxLength = 4000; - - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromQuery] @@ -38,7 +33,7 @@ public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileServic [BindProperty] [Display(Name = "Add additional detail")] - [MaxLength(AddReasonDetailMaxLength, ErrorMessage = "Additional detail must be 4000 characters or less")] + [MaxLength(AlertDefaults.DetailMaxCharacterCount, ErrorMessage = "Additional detail must be 4000 characters or less")] public string? AddReasonDetail { get; set; } [BindProperty] @@ -48,7 +43,7 @@ public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileServic [BindProperty] [EvidenceFile] - [FileSize(MaxFileSizeMb * 1024 * 1024, ErrorMessage = "The selected file must be smaller than 50MB")] + [FileSize(AlertDefaults.MaxFileUploadSizeMb * 1024 * 1024, ErrorMessage = "The selected file must be smaller than 50MB")] public IFormFile? EvidenceFile { get; set; } public Guid? EvidenceFileId { get; set; } @@ -65,7 +60,7 @@ public async Task OnGet() HasAdditionalReasonDetail = JourneyInstance!.State.HasAdditionalReasonDetail; AddReasonDetail = JourneyInstance!.State.AddReasonDetail; UploadedEvidenceFileUrl = JourneyInstance?.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, AlertDefaults.FileUrlExpiry) : null; UploadEvidence = JourneyInstance?.State.UploadEvidence; } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AlertDefaults.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AlertDefaults.cs new file mode 100644 index 000000000..d251b6adc --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AlertDefaults.cs @@ -0,0 +1,9 @@ +namespace TeachingRecordSystem.SupportUi.Pages.Alerts; + +public static class AlertDefaults +{ + public const int MaxFileUploadSizeMb = 50; + public const int DetailMaxCharacterCount = 4000; + public const int DetailTextAreaMinimumRows = 10; + public static TimeSpan FileUrlExpiry { get; } = TimeSpan.FromMinutes(15); +} diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AlertDetail.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AlertDetail.cshtml index fdcc9b258..293d361b2 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AlertDetail.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AlertDetail.cshtml @@ -13,24 +13,37 @@ Details - @Model.Alert.Details + + @if (Model.Alert.Details is not null) + { + + } + else + { + + } + Link - + @if (Model.Alert.ExternalLink is not null) { - @Model.Alert.ExternalLink + @($"{Model.Alert.ExternalLink} (opens in new tab)") + } + else + { + } Start date - @Model.Alert.StartDate?.ToString("d MMMM yyyy") + @Model.Alert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) End date - @Model.Alert.EndDate?.ToString("d MMMM yyyy") + @Model.Alert.EndDate?.ToString(UiDefaults.DateOnlyDisplayFormat) @if (Model.CanEdit) { @@ -56,5 +69,18 @@ } + + Evidence + + @if (Model.UploadedEvidenceFileUrl is not null) + { + @($"{Model.EvidenceFileName} (opens in new tab)") + } + else + { + + } + + diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AlertDetail.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AlertDetail.cshtml.cs index 41b22c7ad..9410475d0 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AlertDetail.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/AlertDetail.cshtml.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using TeachingRecordSystem.Core.DataStore.Postgres; using TeachingRecordSystem.Core.DataStore.Postgres.Models; +using TeachingRecordSystem.Core.Services.Files; using TeachingRecordSystem.SupportUi.Infrastructure.Filters; using TeachingRecordSystem.SupportUi.Infrastructure.Security; @@ -11,14 +12,21 @@ namespace TeachingRecordSystem.SupportUi.Pages.Alerts; [CheckAlertExistsFilterFactory(requiredPermission: Permissions.Alerts.Read), ServiceFilter(typeof(RequireClosedAlertFilter))] public class AlertDetailModel( IAuthorizationService authorizationService, - TrsDbContext dbContext) : PageModel + TrsDbContext dbContext, + IFileService fileService) : PageModel { public Alert? Alert { get; set; } + public Uri? ExternalLinkUri { get; set; } + public string? ChangeReason { get; set; } public string? ChangeReasonDetail { get; set; } + public string? EvidenceFileName { get; set; } + + public string? UploadedEvidenceFileUrl { get; set; } + public bool CanEdit { get; set; } public async Task OnGet() @@ -30,7 +38,9 @@ public async Task OnGet() $""" SELECT payload ->> 'ChangeReason' as change_reason, - payload ->> 'ChangeReasonDetail' as change_reason_detail + payload ->> 'ChangeReasonDetail' as change_reason_detail, + (payload #>> Array['EvidenceFile', 'FileId'])::uuid as evidence_file_id, + payload #>> Array['EvidenceFile', 'Name'] as evidence_file_name FROM events WHERE @@ -46,11 +56,17 @@ created DESC ChangeReason = changeReasonInfo?.ChangeReason; ChangeReasonDetail = changeReasonInfo?.ChangeReasonDetail; + EvidenceFileName = changeReasonInfo?.EvidenceFileName; + UploadedEvidenceFileUrl = changeReasonInfo?.EvidenceFileId is not null ? + await fileService.GetFileUrl(changeReasonInfo.EvidenceFileId!.Value, AlertDefaults.FileUrlExpiry) : + null; + ExternalLinkUri = TrsUriHelper.TryCreateWebsiteUri(Alert.ExternalLink, out var linkUri) ? linkUri : null; + CanEdit = (await authorizationService.AuthorizeForAlertTypeAsync( User, Alert.AlertTypeId, Permissions.Alerts.Write)) is { Succeeded: true }; } - private record ChangeReasonInfo(string? ChangeReason, string? ChangeReasonDetail); + private record ChangeReasonInfo(string? ChangeReason, string? ChangeReasonDetail, Guid? EvidenceFileId, string? EvidenceFileName); } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/CheckAnswers.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/CheckAnswers.cshtml index 1b1523382..848b6b5cc 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/CheckAnswers.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/CheckAnswers.cshtml @@ -5,7 +5,7 @@ } @section BeforeContent { - Back + Back }
@@ -28,7 +28,7 @@ @if (Model.Link is not null) { - @($"{Model.Link} (opens in new tab)") + @($"{Model.Link} (opens in new tab)") } else { @@ -38,11 +38,11 @@ Start date - @Model.StartDate?.ToString("d MMMM yyyy") + @Model.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) End date - @Model.EndDate!.Value.ToString("d MMMM yyyy") + @Model.EndDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat) Change diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/CheckAnswers.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/CheckAnswers.cshtml.cs index 625132adf..29d6fc268 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/CheckAnswers.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/CheckAnswers.cshtml.cs @@ -13,8 +13,6 @@ public class CheckAnswersModel( IFileService fileService, IClock clock) : PageModel { - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -33,6 +31,8 @@ public class CheckAnswersModel( public string? Link { get; set; } + public Uri? LinkUri { get; set; } + public DateOnly? StartDate { get; set; } public DateOnly? EndDate { get; set; } @@ -110,13 +110,14 @@ public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingConte AlertTypeName = alertInfo.Alert.AlertType.Name; Details = alertInfo.Alert.Details; Link = alertInfo.Alert.ExternalLink; + LinkUri = TrsUriHelper.TryCreateWebsiteUri(Link, out var linkUri) ? linkUri : null; StartDate = alertInfo.Alert.StartDate; EndDate = JourneyInstance!.State.EndDate; ChangeReason = JourneyInstance.State.ChangeReason!.Value; ChangeReasonDetail = JourneyInstance.State.ChangeReasonDetail; EvidenceFileName = JourneyInstance.State.EvidenceFileName; UploadedEvidenceFileUrl = JourneyInstance!.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, AlertDefaults.FileUrlExpiry) : null; await next(); diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/Reason.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/Reason.cshtml index fe5b43482..2df1aeefa 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/Reason.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/Reason.cshtml @@ -38,7 +38,7 @@ Yes - + diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/Reason.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/Reason.cshtml.cs index a7303f45f..852278e1b 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/Reason.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/CloseAlert/Reason.cshtml.cs @@ -11,11 +11,6 @@ namespace TeachingRecordSystem.SupportUi.Pages.Alerts.CloseAlert; [Journey(JourneyNames.CloseAlert), RequireJourneyInstance] public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileService) : PageModel { - public const int MaxFileSizeMb = 50; - public const int ChangeReasonDetailMaxLength = 4000; - - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -40,7 +35,7 @@ public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileServic [BindProperty] [Display(Name = "Add additional detail")] - [MaxLength(ChangeReasonDetailMaxLength, ErrorMessage = "Additional detail must be 4000 characters or less")] + [MaxLength(AlertDefaults.DetailMaxCharacterCount, ErrorMessage = "Additional detail must be 4000 characters or less")] public string? ChangeReasonDetail { get; set; } [BindProperty] @@ -50,7 +45,7 @@ public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileServic [BindProperty] [EvidenceFile] - [FileSize(MaxFileSizeMb * 1024 * 1024, ErrorMessage = "The selected file must be smaller than 50MB")] + [FileSize(AlertDefaults.MaxFileUploadSizeMb * 1024 * 1024, ErrorMessage = "The selected file must be smaller than 50MB")] public IFormFile? EvidenceFile { get; set; } public Guid? EvidenceFileId { get; set; } @@ -68,7 +63,7 @@ public async Task OnGet() ChangeReasonDetail = JourneyInstance?.State.ChangeReasonDetail; UploadEvidence = JourneyInstance?.State.UploadEvidence; UploadedEvidenceFileUrl = JourneyInstance?.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, AlertDefaults.FileUrlExpiry) : null; } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/CheckAnswers.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/CheckAnswers.cshtml index 30127a8a0..181372cee 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/CheckAnswers.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/CheckAnswers.cshtml @@ -28,7 +28,7 @@ @if (Model.Link is not null) { - @($"{Model.Link} (opens in new tab)") + @($"{Model.Link} (opens in new tab)") } else { @@ -38,11 +38,11 @@ Start date - @Model.StartDate?.ToString("d MMMM yyyy") + @Model.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) End date - @Model.EndDate?.ToString("d MMMM yyyy") + @Model.EndDate?.ToString(UiDefaults.DateOnlyDisplayFormat) Reason for deleting alert diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/CheckAnswers.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/CheckAnswers.cshtml.cs index edf160131..7424b5b4e 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/CheckAnswers.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/CheckAnswers.cshtml.cs @@ -13,10 +13,6 @@ public class CheckAnswersModel( IFileService fileService, IClock clock) : PageModel { - public const int MaxFileSizeMb = 50; - - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -32,6 +28,8 @@ public class CheckAnswersModel( public string? Link { get; set; } + public Uri? LinkUri { get; set; } + public DateOnly? StartDate { get; set; } public DateOnly? EndDate { get; set; } @@ -104,12 +102,13 @@ public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingConte AlertTypeName = alertInfo.Alert.AlertType.Name; Details = alertInfo.Alert.Details; Link = alertInfo.Alert.ExternalLink; + LinkUri = TrsUriHelper.TryCreateWebsiteUri(Link, out var linkUri) ? linkUri : null; StartDate = alertInfo.Alert.StartDate; EndDate = alertInfo.Alert.EndDate; DeleteReasonDetail = JourneyInstance.State.DeleteReasonDetail; EvidenceFileName = JourneyInstance.State.EvidenceFileName; UploadedEvidenceFileUrl = JourneyInstance!.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, AlertDefaults.FileUrlExpiry) : null; await next(); diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/Index.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/Index.cshtml index 3f095e417..b6b833dbd 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/Index.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/Index.cshtml @@ -20,7 +20,7 @@ Yes - + diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/Index.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/Index.cshtml.cs index d34a5ce8c..9c495a3cf 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/Index.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/DeleteAlert/Index.cshtml.cs @@ -11,11 +11,6 @@ namespace TeachingRecordSystem.SupportUi.Pages.Alerts.DeleteAlert; [Journey(JourneyNames.DeleteAlert), ActivatesJourney, RequireJourneyInstance] public class IndexModel(TrsLinkGenerator linkGenerator, IFileService fileService) : PageModel { - public const int MaxFileSizeMb = 50; - public const int DeleteReasonDetailMaxLength = 4000; - - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -39,6 +34,7 @@ public class IndexModel(TrsLinkGenerator linkGenerator, IFileService fileService [BindProperty] [Display(Name = "Add additional detail")] + [MaxLength(AlertDefaults.DetailMaxCharacterCount, ErrorMessage = "Additional detail must be 4000 characters or less")] public string? DeleteReasonDetail { get; set; } [BindProperty] @@ -48,7 +44,7 @@ public class IndexModel(TrsLinkGenerator linkGenerator, IFileService fileService [BindProperty] [EvidenceFile] - [FileSize(MaxFileSizeMb * 1024 * 1024, ErrorMessage = "The selected file must be smaller than 50MB")] + [FileSize(AlertDefaults.MaxFileUploadSizeMb * 1024 * 1024, ErrorMessage = "The selected file must be smaller than 50MB")] public IFormFile? EvidenceFile { get; set; } public Guid? EvidenceFileId { get; set; } @@ -65,7 +61,7 @@ public async Task OnGet() DeleteReasonDetail = JourneyInstance!.State.DeleteReasonDetail; UploadEvidence = JourneyInstance!.State.UploadEvidence; UploadedEvidenceFileUrl = JourneyInstance?.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, AlertDefaults.FileUrlExpiry) : null; } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/CheckAnswers.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/CheckAnswers.cshtml.cs index b96e73065..21aba682f 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/CheckAnswers.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/CheckAnswers.cshtml.cs @@ -13,8 +13,6 @@ public class CheckAnswersModel( IFileService fileService, IClock clock) : PageModel { - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -115,7 +113,7 @@ public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingConte ChangeReasonDetail = JourneyInstance.State.ChangeReasonDetail; EvidenceFileName = JourneyInstance.State.EvidenceFileName; UploadedEvidenceFileUrl = JourneyInstance!.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, AlertDefaults.FileUrlExpiry) : null; await next(); diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/Index.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/Index.cshtml index 1e8e653df..56edbaf52 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/Index.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/Index.cshtml @@ -13,7 +13,7 @@ Change an alert - @Model.PersonName - + @ViewBag.Title diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/Reason.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/Reason.cshtml index f6c4ca342..2ff5888b5 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/Reason.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/Reason.cshtml @@ -35,7 +35,7 @@ Yes - + diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/Reason.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/Reason.cshtml.cs index 5322efd3e..0e4b162d0 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/Reason.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Details/Reason.cshtml.cs @@ -11,11 +11,6 @@ namespace TeachingRecordSystem.SupportUi.Pages.Alerts.EditAlert.Details; [Journey(JourneyNames.EditAlertDetails), RequireJourneyInstance] public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileService) : PageModel { - public const int MaxFileSizeMb = 50; - public const int ChangeReasonDetailMaxLength = 4000; - - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -40,7 +35,7 @@ public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileServic [BindProperty] [Display(Name = "Add additional detail")] - [MaxLength(ChangeReasonDetailMaxLength, ErrorMessage = "Additional detail must be 4000 characters or less")] + [MaxLength(AlertDefaults.DetailMaxCharacterCount, ErrorMessage = "Additional detail must be 4000 characters or less")] public string? ChangeReasonDetail { get; set; } [BindProperty] @@ -50,7 +45,7 @@ public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileServic [BindProperty] [EvidenceFile] - [FileSize(MaxFileSizeMb * 1024 * 1024, ErrorMessage = "The selected file must be smaller than 50MB")] + [FileSize(AlertDefaults.MaxFileUploadSizeMb * 1024 * 1024, ErrorMessage = "The selected file must be smaller than 50MB")] public IFormFile? EvidenceFile { get; set; } public Guid? EvidenceFileId { get; set; } @@ -68,7 +63,7 @@ public async Task OnGet() ChangeReasonDetail = JourneyInstance!.State.ChangeReasonDetail; UploadEvidence = JourneyInstance?.State.UploadEvidence; UploadedEvidenceFileUrl = JourneyInstance?.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, AlertDefaults.FileUrlExpiry) : null; } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/CheckAnswers.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/CheckAnswers.cshtml index b41fe39d9..28eeaa3fd 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/CheckAnswers.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/CheckAnswers.cshtml @@ -17,14 +17,14 @@ New end date - @Model.NewEndDate!.Value.ToString("d MMMM yyyy") + @Model.NewEndDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat) Change Current end date - @Model.CurrentEndDate?.ToString("d MMMM yyyy") + @Model.CurrentEndDate?.ToString(UiDefaults.DateOnlyDisplayFormat) Reason for change diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/CheckAnswers.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/CheckAnswers.cshtml.cs index 958bd5314..cedc354a5 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/CheckAnswers.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/CheckAnswers.cshtml.cs @@ -13,8 +13,6 @@ public class CheckAnswersModel( IFileService fileService, IClock clock) : PageModel { - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -115,7 +113,7 @@ public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingConte ChangeReasonDetail = JourneyInstance.State.ChangeReasonDetail; EvidenceFileName = JourneyInstance.State.EvidenceFileName; UploadedEvidenceFileUrl = JourneyInstance!.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, AlertDefaults.FileUrlExpiry) : null; await next(); diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/Reason.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/Reason.cshtml index 289ff96d9..b7a12653d 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/Reason.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/Reason.cshtml @@ -35,7 +35,7 @@ Yes - + diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/Reason.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/Reason.cshtml.cs index 60539f009..d30a14fb0 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/Reason.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/EndDate/Reason.cshtml.cs @@ -14,8 +14,6 @@ public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileServic public const int MaxFileSizeMb = 50; public const int ChangeReasonDetailMaxLength = 4000; - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -68,7 +66,7 @@ public async Task OnGet() ChangeReasonDetail = JourneyInstance?.State.ChangeReasonDetail; UploadEvidence = JourneyInstance?.State.UploadEvidence; UploadedEvidenceFileUrl = JourneyInstance?.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, AlertDefaults.FileUrlExpiry) : null; } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/CheckAnswers.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/CheckAnswers.cshtml index 1fb0b2eee..4b33a1f6c 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/CheckAnswers.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/CheckAnswers.cshtml @@ -20,7 +20,7 @@ @if (Model.NewLink is not null) { - @($"{Model.NewLink} (opens in new tab)") + @($"{Model.NewLink} (opens in new tab)") } else { @@ -36,7 +36,7 @@ @if (Model.CurrentLink is not null) { - @($"{Model.CurrentLink} (opens in new tab)") + @($"{Model.CurrentLink} (opens in new tab)") } else { diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/CheckAnswers.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/CheckAnswers.cshtml.cs index bf5e330b9..40cb7412d 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/CheckAnswers.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/CheckAnswers.cshtml.cs @@ -13,8 +13,6 @@ public class CheckAnswersModel( IFileService fileService, IClock clock) : PageModel { - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -29,8 +27,12 @@ public class CheckAnswersModel( public string? NewLink { get; set; } + public Uri? NewLinkUri { get; set; } + public string? CurrentLink { get; set; } + public Uri? CurrentLinkUri { get; set; } + public AlertChangeLinkReasonOption ChangeReason { get; set; } public string? ChangeReasonDetail { get; set; } @@ -110,12 +112,14 @@ public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingConte PersonId = personInfo.PersonId; PersonName = personInfo.Name; NewLink = JourneyInstance!.State.Link; + NewLinkUri = TrsUriHelper.TryCreateWebsiteUri(NewLink, out var newLinkUri) ? newLinkUri : null; CurrentLink = alertInfo.Alert.ExternalLink; + CurrentLinkUri = TrsUriHelper.TryCreateWebsiteUri(CurrentLink, out var currentLinkUri) ? currentLinkUri : null; ChangeReason = JourneyInstance.State.ChangeReason!.Value; ChangeReasonDetail = JourneyInstance.State.ChangeReasonDetail; EvidenceFileName = JourneyInstance.State.EvidenceFileName; UploadedEvidenceFileUrl = JourneyInstance!.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, AlertDefaults.FileUrlExpiry) : null; await next(); diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Index.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Index.cshtml index 2c8d90744..d61f890b5 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Index.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Index.cshtml @@ -16,8 +16,8 @@ Do you want to add a link to a panel outcome? - Panel outcomes (opens in a new tab) - include details about the allegation, the panel’s decision and reasons for it. The link will be seen internally. + Panel outcomes (opens in a new tab) + include details about the allegation, the panel’s decision and reasons for it. The link will only be seen internally. Yes @@ -37,8 +37,8 @@ Do you want to change or delete the link to the panel outcome? - Panel outcomes (opens in a new tab) - include details about the allegation, the panel’s decision and reasons for it. The link will be seen internally. + Panel outcomes (opens in a new tab) + include details about the allegation, the panel’s decision and reasons for it. The link will only be seen internally. Change link diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Index.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Index.cshtml.cs index 374eacbfa..91a3093b6 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Index.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Index.cshtml.cs @@ -50,8 +50,7 @@ public async Task OnPost() } else if (AddLink == true) { - if (!Uri.TryCreate(Link, UriKind.Absolute, out var uri) || - (uri.Scheme != "http" && uri.Scheme != "https")) + if (!TrsUriHelper.TryCreateWebsiteUri(Link, out _)) { ModelState.AddModelError(nameof(Link), "Enter a valid URL"); } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Reason.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Reason.cshtml index 9ba7c191a..ed9a76054 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Reason.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Reason.cshtml @@ -35,7 +35,7 @@ Yes - + diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Reason.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Reason.cshtml.cs index e26e5e547..949dc1643 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Reason.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/Link/Reason.cshtml.cs @@ -14,8 +14,6 @@ public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileServic public const int MaxFileSizeMb = 50; public const int ChangeReasonDetailMaxLength = 4000; - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -68,7 +66,7 @@ public async Task OnGet() ChangeReasonDetail = JourneyInstance!.State.ChangeReasonDetail; UploadEvidence = JourneyInstance?.State.UploadEvidence; UploadedEvidenceFileUrl = JourneyInstance?.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, AlertDefaults.FileUrlExpiry) : null; } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/CheckAnswers.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/CheckAnswers.cshtml index 08751a527..399c9656f 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/CheckAnswers.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/CheckAnswers.cshtml @@ -17,14 +17,14 @@ New start date - @Model.NewStartDate.ToString("d MMMM yyyy") + @Model.NewStartDate.ToString(UiDefaults.DateOnlyDisplayFormat) Change Current start date - @Model.CurrentStartDate.ToString("d MMMM yyyy") + @Model.CurrentStartDate.ToString(UiDefaults.DateOnlyDisplayFormat) Reason for change diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/CheckAnswers.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/CheckAnswers.cshtml.cs index 8ae550a54..ad5908c52 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/CheckAnswers.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/CheckAnswers.cshtml.cs @@ -13,8 +13,6 @@ public class CheckAnswersModel( IFileService fileService, IClock clock) : PageModel { - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -115,7 +113,7 @@ public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingConte ChangeReasonDetail = JourneyInstance.State.ChangeReasonDetail; EvidenceFileName = JourneyInstance.State.EvidenceFileName; UploadedEvidenceFileUrl = JourneyInstance!.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, AlertDefaults.FileUrlExpiry) : null; await next(); diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/Reason.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/Reason.cshtml index 15ac6147a..212cab2a9 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/Reason.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/Reason.cshtml @@ -35,7 +35,7 @@ Yes - + diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/Reason.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/Reason.cshtml.cs index d7b5daff3..3c280c6df 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/Reason.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/EditAlert/StartDate/Reason.cshtml.cs @@ -11,11 +11,6 @@ namespace TeachingRecordSystem.SupportUi.Pages.Alerts.EditAlert.StartDate; [Journey(JourneyNames.EditAlertStartDate), RequireJourneyInstance] public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileService) : PageModel { - public const int MaxFileSizeMb = 50; - public const int ChangeReasonDetailMaxLength = 4000; - - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -40,7 +35,7 @@ public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileServic [BindProperty] [Display(Name = "Add additional detail")] - [MaxLength(ChangeReasonDetailMaxLength, ErrorMessage = "Additional detail must be 4000 characters or less")] + [MaxLength(AlertDefaults.DetailMaxCharacterCount, ErrorMessage = "Additional detail must be 4000 characters or less")] public string? ChangeReasonDetail { get; set; } [BindProperty] @@ -50,7 +45,7 @@ public class ReasonModel(TrsLinkGenerator linkGenerator, IFileService fileServic [BindProperty] [EvidenceFile] - [FileSize(MaxFileSizeMb * 1024 * 1024, ErrorMessage = "The selected file must be smaller than 50MB")] + [FileSize(AlertDefaults.MaxFileUploadSizeMb * 1024 * 1024, ErrorMessage = "The selected file must be smaller than 50MB")] public IFormFile? EvidenceFile { get; set; } public Guid? EvidenceFileId { get; set; } @@ -68,7 +63,7 @@ public async Task OnGet() ChangeReasonDetail = JourneyInstance?.State.ChangeReasonDetail; UploadEvidence = JourneyInstance?.State.UploadEvidence; UploadedEvidenceFileUrl = JourneyInstance?.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, AlertDefaults.FileUrlExpiry) : null; } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/CheckAnswers.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/CheckAnswers.cshtml index 7add6814e..4932b304d 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/CheckAnswers.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/CheckAnswers.cshtml @@ -28,7 +28,7 @@ @if (Model.Link is not null) { - @($"{Model.Link} (opens in new tab)") + @($"{Model.Link} (opens in new tab)") } else { @@ -38,7 +38,7 @@ Start date - @Model.StartDate?.ToString("d MMMM yyyy") + @Model.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) Reason for change diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/CheckAnswers.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/CheckAnswers.cshtml.cs index c40b42b40..6d5cd8f04 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/CheckAnswers.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/CheckAnswers.cshtml.cs @@ -13,8 +13,6 @@ public class CheckAnswersModel( IFileService fileService, IClock clock) : PageModel { - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -33,6 +31,8 @@ public class CheckAnswersModel( public string? Link { get; set; } + public Uri? LinkUri { get; set; } + public DateOnly? StartDate { get; set; } public ReopenAlertReasonOption ChangeReason { get; set; } @@ -108,12 +108,13 @@ public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingConte AlertTypeName = alertInfo.Alert.AlertType.Name; Details = alertInfo.Alert.Details; Link = alertInfo.Alert.ExternalLink; + LinkUri = TrsUriHelper.TryCreateWebsiteUri(Link, out var linkUri) ? linkUri : null; StartDate = alertInfo.Alert.StartDate; ChangeReason = JourneyInstance.State.ChangeReason!.Value; ChangeReasonDetail = JourneyInstance.State.ChangeReasonDetail; EvidenceFileName = JourneyInstance.State.EvidenceFileName; UploadedEvidenceFileUrl = JourneyInstance!.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance!.State.EvidenceFileId!.Value, AlertDefaults.FileUrlExpiry) : null; await next(); diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/Index.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/Index.cshtml index 364331acf..89644cf59 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/Index.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/Index.cshtml @@ -32,7 +32,7 @@ Yes - + diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/Index.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/Index.cshtml.cs index 3db520934..6b3170375 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/Index.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Alerts/ReopenAlert/Index.cshtml.cs @@ -11,11 +11,6 @@ namespace TeachingRecordSystem.SupportUi.Pages.Alerts.ReopenAlert; [Journey(JourneyNames.ReopenAlert), ActivatesJourney, RequireJourneyInstance] public class IndexModel(TrsLinkGenerator linkGenerator, IFileService fileService) : PageModel { - public const int MaxFileSizeMb = 50; - public const int ChangeReasonDetailMaxLength = 4000; - - private static readonly TimeSpan _fileUrlExpiresAfter = TimeSpan.FromMinutes(15); - public JourneyInstance? JourneyInstance { get; set; } [FromRoute] @@ -40,7 +35,7 @@ public class IndexModel(TrsLinkGenerator linkGenerator, IFileService fileService [BindProperty] [Display(Name = "Add additional detail")] - [MaxLength(ChangeReasonDetailMaxLength, ErrorMessage = "Additional detail must be 4000 characters or less")] + [MaxLength(AlertDefaults.DetailMaxCharacterCount, ErrorMessage = "Additional detail must be 4000 characters or less")] public string? ChangeReasonDetail { get; set; } [BindProperty] @@ -50,7 +45,7 @@ public class IndexModel(TrsLinkGenerator linkGenerator, IFileService fileService [BindProperty] [EvidenceFile] - [FileSize(MaxFileSizeMb * 1024 * 1024, ErrorMessage = "The selected file must be smaller than 50MB")] + [FileSize(AlertDefaults.MaxFileUploadSizeMb * 1024 * 1024, ErrorMessage = "The selected file must be smaller than 50MB")] public IFormFile? EvidenceFile { get; set; } public Guid? EvidenceFileId { get; set; } @@ -68,7 +63,7 @@ public async Task OnGet() ChangeReasonDetail = JourneyInstance?.State.ChangeReasonDetail; UploadEvidence = JourneyInstance?.State.UploadEvidence; UploadedEvidenceFileUrl = JourneyInstance?.State.EvidenceFileId is not null ? - await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, _fileUrlExpiresAfter) : + await fileService.GetFileUrl(JourneyInstance.State.EvidenceFileId.Value, AlertDefaults.FileUrlExpiry) : null; } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/ChangeRequests/EditChangeRequest/Accept.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/ChangeRequests/EditChangeRequest/Accept.cshtml index d17ba27c4..fb1c0649a 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/ChangeRequests/EditChangeRequest/Accept.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/ChangeRequests/EditChangeRequest/Accept.cshtml @@ -56,8 +56,8 @@ Date of birth - @Model.DateOfBirthChangeRequest!.CurrentDateOfBirth.ToString("d MMMM yyyy") - @Model.DateOfBirthChangeRequest!.NewDateOfBirth.ToString("d MMMM yyyy") + @Model.DateOfBirthChangeRequest!.CurrentDateOfBirth.ToString(UiDefaults.DateOnlyDisplayFormat) + @Model.DateOfBirthChangeRequest!.NewDateOfBirth.ToString(UiDefaults.DateOnlyDisplayFormat) } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/ChangeRequests/EditChangeRequest/Index.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/ChangeRequests/EditChangeRequest/Index.cshtml index dbe44e49d..c71dc3955 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/ChangeRequests/EditChangeRequest/Index.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/ChangeRequests/EditChangeRequest/Index.cshtml @@ -55,8 +55,8 @@ Date of birth - @Model.DateOfBirthChangeRequest!.CurrentDateOfBirth.ToString("d MMMM yyyy") - @Model.DateOfBirthChangeRequest!.NewDateOfBirth.ToString("d MMMM yyyy") + @Model.DateOfBirthChangeRequest!.CurrentDateOfBirth.ToString(UiDefaults.DateOnlyDisplayFormat) + @Model.DateOfBirthChangeRequest!.NewDateOfBirth.ToString(UiDefaults.DateOnlyDisplayFormat) } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Common/UiDefaults.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Common/UiDefaults.cs new file mode 100644 index 000000000..2ce9e1520 --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Common/UiDefaults.cs @@ -0,0 +1,7 @@ +namespace TeachingRecordSystem.SupportUi.Pages.Common; + +public static class UiDefaults +{ + public const string EmptyDisplayContent = "Not provided"; + public const string DateOnlyDisplayFormat = "d MMMM yyyy"; +} diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/AddMq/CheckAnswers.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/AddMq/CheckAnswers.cshtml index ae1eb291a..aabaef8dc 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/AddMq/CheckAnswers.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/AddMq/CheckAnswers.cshtml @@ -32,7 +32,7 @@ Start date - @Model.StartDate.ToString("d MMMM yyyy") + @Model.StartDate.ToString(UiDefaults.DateOnlyDisplayFormat) Change @@ -46,7 +46,7 @@ End date - @(Model.EndDate.HasValue ? Model.EndDate.Value.ToString("d MMMM yyyy") : "None") + @(Model.EndDate.HasValue ? Model.EndDate.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : "None") Change diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/DeleteMq/Confirm.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/DeleteMq/Confirm.cshtml index beac24efd..f9dd9d71f 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/DeleteMq/Confirm.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/DeleteMq/Confirm.cshtml @@ -41,7 +41,7 @@ End date - @(Model.EndDate.HasValue ? Model.EndDate.Value.ToString("d MMMM yyyy") : "None") + @(Model.EndDate.HasValue ? Model.EndDate.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : "None") diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/EditMq/StartDate/Confirm.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/EditMq/StartDate/Confirm.cshtml index 58c4ef69d..73beab577 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/EditMq/StartDate/Confirm.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/EditMq/StartDate/Confirm.cshtml @@ -17,11 +17,11 @@ Current start date - @(Model.CurrentStartDate.HasValue ? Model.CurrentStartDate!.Value.ToString("d MMMM yyyy") : "None") + @(Model.CurrentStartDate.HasValue ? Model.CurrentStartDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : "None") New start date - @Model.NewStartDate!.Value.ToString("d MMMM yyyy") + @Model.NewStartDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat) Reason for change diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/EditMq/Status/Confirm.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/EditMq/Status/Confirm.cshtml index 3df38cf6f..0cc9d4b34 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/EditMq/Status/Confirm.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Mqs/EditMq/Status/Confirm.cshtml @@ -30,11 +30,11 @@ { Current end date - @(Model.CurrentEndDate.HasValue ? Model.CurrentEndDate!.Value.ToString("d MMMM yyyy") : "None") + @(Model.CurrentEndDate.HasValue ? Model.CurrentEndDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : "None") New end date - @(Model.NewEndDate.HasValue ? Model.NewEndDate!.Value.ToString("d MMMM yyyy") : "None") + @(Model.NewEndDate.HasValue ? Model.NewEndDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : "None") } @if (Model.IsEndDateChange!.Value && !Model.IsStatusChange!.Value) diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/Index.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/Index.cshtml index 32266093e..6843363d3 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/Index.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/Index.cshtml @@ -69,7 +69,7 @@ { @personInfo.Name - @(personInfo.DateOfBirth.HasValue ? personInfo.DateOfBirth.Value.ToString("dd/MM/yyyy") : string.Empty) + @(personInfo.DateOfBirth.HasValue ? personInfo.DateOfBirth.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : string.Empty) @personInfo.Trn @personInfo.NationalInsuranceNumber diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Alerts.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Alerts.cshtml index 7134507b5..fe99c41ab 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Alerts.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Alerts.cshtml @@ -33,20 +33,29 @@ } else { - @foreach (var (alert, canWrite) in Model.OpenAlerts) + @foreach (var (alert, externalLinkUri, canWrite) in Model.OpenAlerts) { @alert.AlertType.Name @if (canWrite) { - Delete alert + Delete } Details - @alert.Details + + @if (alert.Details is not null) + { + + } + else + { + + } + @if (canWrite) { @@ -56,10 +65,14 @@ Link - + @if (alert.ExternalLink is not null) { - @alert.ExternalLink + @($"{alert.ExternalLink} (opens in new tab)") + } + else + { + } @if (canWrite) @@ -71,7 +84,7 @@ Start date - @alert.StartDate?.ToString("d MMMM yyyy") + @alert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) @if (canWrite) { @@ -121,12 +134,12 @@ - @foreach (var (alert, canWrite) in Model.ClosedAlerts!) + @foreach (var (alert, externalLinkUri, canWrite) in Model.ClosedAlerts!) { @alert.AlertType.Name - @alert.StartDate?.ToString("d MMMM yyyy") - @alert.EndDate?.ToString("d MMMM yyyy") + @alert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) + @alert.EndDate?.ToString(UiDefaults.DateOnlyDisplayFormat) @if (canWrite) { diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Alerts.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Alerts.cshtml.cs index fea76098e..f2644439b 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Alerts.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Alerts.cshtml.cs @@ -41,7 +41,11 @@ public async Task OnGet() var authorizedAlerts = alerts .Where(a => alertTypePermissions[a.AlertTypeId].CanRead) - .Select(a => new AlertWithPermissions(a, alertTypePermissions[a.AlertTypeId].CanWrite)); + .Select(a => + { + TrsUriHelper.TryCreateWebsiteUri(a.ExternalLink, out var externalLinkUri); + return new AlertWithPermissions(a, externalLinkUri, alertTypePermissions[a.AlertTypeId].CanWrite); + }); OpenAlerts = authorizedAlerts.Where(a => a.Alert.IsOpen).OrderBy(a => a.Alert.StartDate).ThenBy(a => a.Alert.AlertType.Name).ToArray(); ClosedAlerts = authorizedAlerts.Where(a => !a.Alert.IsOpen).OrderBy(a => a.Alert.StartDate).ThenBy(a => a.Alert.EndDate).ThenBy(a => a.Alert.AlertType.Name).ToArray(); @@ -53,5 +57,5 @@ public async Task OnGet() ShowOpenAlertFlag = alerts.Any(a => a.IsOpen && alertTypePermissions[a.AlertTypeId] is { CanFlag: true, CanRead: false }); } - public record AlertWithPermissions(Alert Alert, bool CanWrite); + public record AlertWithPermissions(Alert Alert, Uri? ExternalLinkUri, bool CanWrite); } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/EditDateOfBirth/Confirm.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/EditDateOfBirth/Confirm.cshtml.cs index c5b7e7333..58b79ad68 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/EditDateOfBirth/Confirm.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/EditDateOfBirth/Confirm.cshtml.cs @@ -59,8 +59,8 @@ public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingConte Contact.PrimaryIdAttribute, Contact.Fields.BirthDate))); - CurrentValue = person!.Contact.BirthDate.ToDateOnlyWithDqtBstFix(isLocalTime: false)!.Value.ToString("dd/MM/yyyy"); - NewValue = state.DateOfBirth!.Value.ToString("dd/MM/yyyy"); + CurrentValue = person!.Contact.BirthDate.ToDateOnlyWithDqtBstFix(isLocalTime: false)!.Value.ToString(UiDefaults.DateOnlyDisplayFormat); + NewValue = state.DateOfBirth!.Value.ToString(UiDefaults.DateOnlyDisplayFormat); await next(); } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Qualifications.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Qualifications.cshtml index 6bd22de7b..bed2958b5 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Qualifications.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Qualifications.cshtml @@ -41,7 +41,7 @@ else Start date - @(mq.StartDate.HasValue ? mq.StartDate!.Value.ToString("d MMMM yyyy") : "None") + @(mq.StartDate.HasValue ? mq.StartDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : "None") Change @@ -55,7 +55,7 @@ else End date - @(mq.EndDate.HasValue ? mq.EndDate!.Value.ToString("d MMMM yyyy") : "None") + @(mq.EndDate.HasValue ? mq.EndDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : "None") Change diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertCreatedEvent.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertCreatedEvent.cshtml index 6741f8926..e74d77fa0 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertCreatedEvent.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertCreatedEvent.cshtml @@ -40,7 +40,7 @@ } Start date - @alert.StartDate?.ToString("d MMMM yyyy") + @alert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) @@ -57,11 +57,11 @@ @if (createdEvent.AddReasonDetail is not null) { - + } else { - + } @@ -74,7 +74,7 @@ } else { - + } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDeletedEvent.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDeletedEvent.cshtml index a790756a1..8142e4839 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDeletedEvent.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDeletedEvent.cshtml @@ -26,7 +26,7 @@ Start date - @alert.StartDate?.ToString("d MMMM yyyy") + @alert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) @@ -39,11 +39,11 @@ @if (deletedEvent.DeletionReasonDetail is not null) { - + } else { - + } @@ -56,7 +56,7 @@ } else { - + } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDqtDeactivatedEvent.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDqtDeactivatedEvent.cshtml index 75082460e..dd2d38ab7 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDqtDeactivatedEvent.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDqtDeactivatedEvent.cshtml @@ -8,7 +8,7 @@ var alert = dqtDeactivatedEvent.Alert; } -
+

Alert deactivated

@@ -31,7 +31,7 @@ Start date - @alert.StartDate?.ToString("d MMMM yyyy") + @alert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) Details @@ -39,11 +39,20 @@ External link - @alert.ExternalLink + + @if (alert.ExternalLink is not null) + { + @($"{alert.ExternalLink} (opens in new tab)") + } + else + { + + } + End date - @alert.EndDate?.ToString("d MMMM yyyy") + @alert.EndDate?.ToString(UiDefaults.DateOnlyDisplayFormat) DQT spent diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDqtImportedEvent.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDqtImportedEvent.cshtml index 5e710dfe9..cc1accad2 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDqtImportedEvent.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDqtImportedEvent.cshtml @@ -8,7 +8,7 @@ var alert = dqtImportedEvent.Alert; } -
+

Alert imported

@@ -28,7 +28,7 @@ Start date - @alert.StartDate?.ToString("d MMMM yyyy") + @alert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat)
diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDqtReactivatedEvent.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDqtReactivatedEvent.cshtml index bf737ce20..d47e68dfc 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDqtReactivatedEvent.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertDqtReactivatedEvent.cshtml @@ -8,7 +8,7 @@ var alert = dqtReactivatedEvent.Alert; } -
+

Alert reactivated

@@ -28,7 +28,7 @@ Start date - @alert.StartDate?.ToString("d MMMM yyyy") + @alert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat)
diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertMigratedEvent.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertMigratedEvent.cshtml index f7ebbdcbf..f02cfcf88 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertMigratedEvent.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertMigratedEvent.cshtml @@ -10,7 +10,7 @@ var alertType = alert.AlertTypeId is not null ? await ReferenceDataCache.GetAlertTypeById(alert.AlertTypeId.Value) : null; } -
+

Alert migrated

@@ -26,7 +26,7 @@ Start date - @alert.StartDate?.ToString("d MMMM yyyy") + @alert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertUpdatedEvent.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertUpdatedEvent.cshtml index 93bca79be..7e516d08c 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertUpdatedEvent.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/AlertUpdatedEvent.cshtml @@ -81,7 +81,7 @@ } Start date - @alert.StartDate?.ToString("d MMMM yyyy") + @alert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) @if (updatedEvent.Changes.HasFlag(AlertUpdatedEventChanges.Details)) { @@ -103,7 +103,7 @@ { End date - @alert.EndDate?.ToString("d MMMM yyyy") + @alert.EndDate?.ToString(UiDefaults.DateOnlyDisplayFormat) } @@ -145,13 +145,19 @@ } - @if (evidenceFileUrl is not null) - { - - Evidence - @($"{updatedEvent.EvidenceFile!.Name} (opens in new tab)") - - } + + Evidence + + @if (evidenceFileUrl is not null) + { + @($"{updatedEvent.EvidenceFile!.Name} (opens in new tab)") + } + else + { + + } + + @@ -166,7 +172,7 @@ { Start date - @oldAlert.StartDate?.ToString("d MMMM yyyy") + @oldAlert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) } @@ -190,7 +196,7 @@ { End date - @oldAlert.EndDate?.ToString("d MMMM yyyy") + @oldAlert.EndDate?.ToString(UiDefaults.DateOnlyDisplayFormat) } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/MandatoryQualificationDeletedEvent.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/MandatoryQualificationDeletedEvent.cshtml index 983c584dd..f65a71e50 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/MandatoryQualificationDeletedEvent.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/MandatoryQualificationDeletedEvent.cshtml @@ -53,7 +53,7 @@ Start date - @(mandatoryQualification.StartDate?.ToString("d MMMM yyyy") ?? "None") + @(mandatoryQualification.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) ?? "None") Status @@ -61,7 +61,7 @@ End date - @(mandatoryQualification.EndDate?.ToString("d MMMM yyyy") ?? "None") + @(mandatoryQualification.EndDate?.ToString(UiDefaults.DateOnlyDisplayFormat) ?? "None") diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/MandatoryQualificationDqtDeactivatedEvent.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/MandatoryQualificationDqtDeactivatedEvent.cshtml index a33dde536..74283f850 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/MandatoryQualificationDqtDeactivatedEvent.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/MandatoryQualificationDqtDeactivatedEvent.cshtml @@ -28,7 +28,7 @@ Start date - @(mandatoryQualification.StartDate?.ToString("d MMMM yyyy") ?? "None") + @(mandatoryQualification.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) ?? "None") Status @@ -36,7 +36,7 @@ End date - @(mandatoryQualification.EndDate?.ToString("d MMMM yyyy") ?? "None") + @(mandatoryQualification.EndDate?.ToString(UiDefaults.DateOnlyDisplayFormat) ?? "None") diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/MandatoryQualificationUpdatedEvent.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/MandatoryQualificationUpdatedEvent.cshtml index f9e802333..c49abb24a 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/MandatoryQualificationUpdatedEvent.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Persons/PersonDetail/Timeline/Events/MandatoryQualificationUpdatedEvent.cshtml @@ -67,7 +67,7 @@ { Start date - @(oldMandatoryQualification.StartDate?.ToString("d MMMM yyyy") ?? "None") + @(oldMandatoryQualification.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat) ?? "None") } @@ -83,7 +83,7 @@ { End date - @(oldMandatoryQualification.EndDate?.ToString("d MMMM yyyy") ?? "None") + @(oldMandatoryQualification.EndDate?.ToString(UiDefaults.DateOnlyDisplayFormat) ?? "None") } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Shared/_PersonDetail.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Shared/_PersonDetail.cshtml index 7aed7c5fa..dacaf48db 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Shared/_PersonDetail.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/Shared/_PersonDetail.cshtml @@ -1,3 +1,4 @@ +@using TeachingRecordSystem.SupportUi.Pages.Common @model PersonDetailViewModel @@ -29,7 +30,7 @@ } Date of birth - @Model.DateOfBirth?.ToString("dd/MM/yyyy") + @Model.DateOfBirth?.ToString(UiDefaults.DateOnlyDisplayFormat) @if (Model.Options.HasFlag(PersonDetailViewModelOptions.ShowChangeLinks)) { diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/SupportTasks/Index.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/SupportTasks/Index.cshtml index f1cb8eaf5..3c6cfe52f 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/SupportTasks/Index.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/Pages/SupportTasks/Index.cshtml @@ -78,7 +78,7 @@ @result.Reference @result.TypeTitle - @($"{result.RequestedOn.ToString("d MMMM yyyy")} at {result.RequestedOn:h:mmtt}") + @($"{result.RequestedOn.ToString(UiDefaults.DateOnlyDisplayFormat)} at {result.RequestedOn:h:mmtt}") } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/TagHelpers/UseEmptyFallbackTagHelper.cs b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/TagHelpers/UseEmptyFallbackTagHelper.cs index a99465d55..441c7520a 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/TagHelpers/UseEmptyFallbackTagHelper.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.SupportUi/TagHelpers/UseEmptyFallbackTagHelper.cs @@ -17,7 +17,7 @@ public override async Task ProcessAsync(TagHelperContext context, TagHelperOutpu if (content.IsEmptyOrWhiteSpace) { output.AddClass("trs-subtle-emphasis", HtmlEncoder.Default); - output.Content.SetContent("-"); + output.Content.SetContent(UiDefaults.EmptyDisplayContent); } } } diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/GlobalUsings.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/GlobalUsings.cs index 70a057476..25c633f23 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/GlobalUsings.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/GlobalUsings.cs @@ -1,4 +1,5 @@ global using TeachingRecordSystem.TestCommon; global using TeachingRecordSystem.UiCommon.FormFlow; global using TeachingRecordSystem.UiTestCommon; +global using UiDefaults = TeachingRecordSystem.SupportUi.Pages.Common.UiDefaults; global using AssertEx = TeachingRecordSystem.UiTestCommon.AssertEx; diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/AddAlert/CheckAnswersTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/AddAlert/CheckAnswersTests.cs index cea1dbe44..c6d54ab70 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/AddAlert/CheckAnswersTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/AddAlert/CheckAnswersTests.cs @@ -133,10 +133,10 @@ public async Task Get_WithPersonIdForValidPerson_ReturnsOk(bool populateOptional var doc = await AssertEx.HtmlResponse(response); Assert.Equal(alertType.Name, doc.GetSummaryListValueForKey("Alert type")); Assert.Equal(details, doc.GetSummaryListValueForKey("Details")); - Assert.Equal(populateOptional ? $"{link} (opens in new tab)" : "-", doc.GetSummaryListValueForKey("Link")); - Assert.Equal(startDate.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("Start date")); + Assert.Equal(populateOptional ? $"{link} (opens in new tab)" : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Link")); + Assert.Equal(startDate.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("Start date")); Assert.Equal(reason.GetDisplayName(), doc.GetSummaryListValueForKey("Reason for adding")); - Assert.Equal(populateOptional ? $"{evidenceFileName} (opens in new tab)" : "-", doc.GetSummaryListValueForKey("Evidence")); + Assert.Equal(populateOptional ? $"{evidenceFileName} (opens in new tab)" : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Evidence")); } [Fact] diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/AddAlert/LinkTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/AddAlert/LinkTests.cs index f9c105949..a2458dfa3 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/AddAlert/LinkTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/AddAlert/LinkTests.cs @@ -243,7 +243,7 @@ public async Task Post_WithInvalidLinkUrl_ReturnsError() Content = new FormUrlEncodedContentBuilder() { { "AddLink", bool.TrueString }, - { "Link", "badurl" } + { "Link", "bad..url" } } }; diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/AlertDetailsTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/AlertDetailsTests.cs index 8dce0f4e9..7bde2fc7a 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/AlertDetailsTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/AlertDetailsTests.cs @@ -63,8 +63,8 @@ public async Task Get_ValidRequest_RendersExpectedContent() Assert.Equal(alert.AlertType.Name, h1.TextContent); Assert.Equal(alert.Details, doc.GetSummaryListValueForKey("Details")); - Assert.Equal(alert.StartDate?.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("Start date")); - Assert.Equal(alert.EndDate?.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("End date")); + Assert.Equal(alert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("Start date")); + Assert.Equal(alert.EndDate?.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("End date")); } [Fact] diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/CloseAlert/CheckAnswersTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/CloseAlert/CheckAnswersTests.cs index 078560481..b1a893d19 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/CloseAlert/CheckAnswersTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/CloseAlert/CheckAnswersTests.cs @@ -151,12 +151,12 @@ public async Task Get_WithValidJourneyState_ReturnsOk(bool populateOptional) var doc = await AssertEx.HtmlResponse(response); Assert.Equal(alertType.Name, doc.GetSummaryListValueForKey("Alert type")); Assert.Equal(details, doc.GetSummaryListValueForKey("Details")); - Assert.Equal(populateOptional ? $"{link} (opens in new tab)" : "-", doc.GetSummaryListValueForKey("Link")); - Assert.Equal(startDate.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("Start date")); - Assert.Equal(journeyEndDate.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("End date")); + Assert.Equal(populateOptional ? $"{link} (opens in new tab)" : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Link")); + Assert.Equal(startDate.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("Start date")); + Assert.Equal(journeyEndDate.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("End date")); Assert.Equal(changeReason.GetDisplayName(), doc.GetSummaryListValueForKey("Reason for change")); - Assert.Equal(populateOptional ? changeReasonDetail : "-", doc.GetSummaryListValueForKey("Reason details")); - Assert.Equal(populateOptional ? $"{evidenceFileName} (opens in new tab)" : "-", doc.GetSummaryListValueForKey("Evidence")); + Assert.Equal(populateOptional ? changeReasonDetail : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Reason details")); + Assert.Equal(populateOptional ? $"{evidenceFileName} (opens in new tab)" : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Evidence")); } [Fact] diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/DeleteAlert/CheckAnswersTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/DeleteAlert/CheckAnswersTests.cs index 54523a4b0..1a9fb78d0 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/DeleteAlert/CheckAnswersTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/DeleteAlert/CheckAnswersTests.cs @@ -83,11 +83,11 @@ public async Task Get_WithValidJourneyState_ReturnsOk(bool isOpenAlert, bool pop var doc = await AssertEx.HtmlResponse(response); Assert.Equal(alert.AlertType.Name, doc.GetSummaryListValueForKey("Alert type")); Assert.Equal(alert.Details, doc.GetSummaryListValueForKey("Details")); - Assert.Equal(populateOptional ? $"{alert.ExternalLink} (opens in new tab)" : "-", doc.GetSummaryListValueForKey("Link")); - Assert.Equal(alert.StartDate!.Value.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("Start date")); - Assert.Equal(isOpenAlert ? "-" : alert.EndDate!.Value.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("End date")); - Assert.Equal(populateOptional ? journeyInstance.State.DeleteReasonDetail : "-", doc.GetSummaryListValueForKey("Reason for deleting alert")); - Assert.Equal(populateOptional ? $"{journeyInstance.State.EvidenceFileName} (opens in new tab)" : "-", doc.GetSummaryListValueForKey("Evidence")); + Assert.Equal(populateOptional ? $"{alert.ExternalLink} (opens in new tab)" : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Link")); + Assert.Equal(alert.StartDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("Start date")); + Assert.Equal(isOpenAlert ? UiDefaults.EmptyDisplayContent : alert.EndDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("End date")); + Assert.Equal(populateOptional ? journeyInstance.State.DeleteReasonDetail : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Reason for deleting alert")); + Assert.Equal(populateOptional ? $"{journeyInstance.State.EvidenceFileName} (opens in new tab)" : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Evidence")); } [Theory] diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/Details/CheckAnswersTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/Details/CheckAnswersTests.cs index 2a3a575ab..0de323cd5 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/Details/CheckAnswersTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/Details/CheckAnswersTests.cs @@ -139,10 +139,10 @@ public async Task Get_WithValidJourneyState_ReturnsOk(bool populateOptional) // Assert var doc = await AssertEx.HtmlResponse(response); Assert.Equal(journeyDetails, doc.GetSummaryListValueForKey("New details")); - Assert.Equal(populateOptional ? databaseDetails : "-", doc.GetSummaryListValueForKey("Current details")); + Assert.Equal(populateOptional ? databaseDetails : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Current details")); Assert.Equal(reason.GetDisplayName(), doc.GetSummaryListValueForKey("Reason for change")); - Assert.Equal(populateOptional ? reasonDetail : "-", doc.GetSummaryListValueForKey("Reason details")); - Assert.Equal(populateOptional ? $"{evidenceFileName} (opens in new tab)" : "-", doc.GetSummaryListValueForKey("Evidence")); + Assert.Equal(populateOptional ? reasonDetail : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Reason details")); + Assert.Equal(populateOptional ? $"{evidenceFileName} (opens in new tab)" : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Evidence")); } [Fact] diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/EndDate/CheckAnswersTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/EndDate/CheckAnswersTests.cs index d54779d74..d6a0220aa 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/EndDate/CheckAnswersTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/EndDate/CheckAnswersTests.cs @@ -120,11 +120,11 @@ public async Task Get_WithValidJourneyState_ReturnsOk(bool populateOptional) // Assert var doc = await AssertEx.HtmlResponse(response); - Assert.Equal(journeyEndDate.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("New end date")); - Assert.Equal(databaseEndDate.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("Current end date")); + Assert.Equal(journeyEndDate.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("New end date")); + Assert.Equal(databaseEndDate.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("Current end date")); Assert.Equal(changeReason.GetDisplayName(), doc.GetSummaryListValueForKey("Reason for change")); - Assert.Equal(populateOptional ? changeReasonDetail : "-", doc.GetSummaryListValueForKey("Reason details")); - Assert.Equal(populateOptional ? $"{evidenceFileName} (opens in new tab)" : "-", doc.GetSummaryListValueForKey("Evidence")); + Assert.Equal(populateOptional ? changeReasonDetail : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Reason details")); + Assert.Equal(populateOptional ? $"{evidenceFileName} (opens in new tab)" : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Evidence")); } [Fact] diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/Link/CheckAnswersTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/Link/CheckAnswersTests.cs index dd58706df..954b7db83 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/Link/CheckAnswersTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/Link/CheckAnswersTests.cs @@ -140,11 +140,11 @@ public async Task Get_WithValidJourneyState_ReturnsOk(bool populateOptional) // Assert var doc = await AssertEx.HtmlResponse(response); - Assert.Equal(populateOptional ? $"{journeyLink} (opens in new tab)" : "-", doc.GetSummaryListValueForKey("New link")); + Assert.Equal(populateOptional ? $"{journeyLink} (opens in new tab)" : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("New link")); Assert.Equal($"{databaseLink} (opens in new tab)", doc.GetSummaryListValueForKey("Current link")); Assert.Equal(reason.GetDisplayName(), doc.GetSummaryListValueForKey("Reason for change")); - Assert.Equal(populateOptional ? reasonDetail : "-", doc.GetSummaryListValueForKey("Reason details")); - Assert.Equal(populateOptional ? $"{evidenceFileName} (opens in new tab)" : "-", doc.GetSummaryListValueForKey("Evidence")); + Assert.Equal(populateOptional ? reasonDetail : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Reason details")); + Assert.Equal(populateOptional ? $"{evidenceFileName} (opens in new tab)" : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Evidence")); } [Fact] diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/StartDate/CheckAnswersTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/StartDate/CheckAnswersTests.cs index eb1bd19e4..374af0b55 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/StartDate/CheckAnswersTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/EditAlert/StartDate/CheckAnswersTests.cs @@ -94,11 +94,11 @@ public async Task Get_ValidJourneyState_ReturnsOk(bool populateOptional) // Assert var doc = await AssertEx.HtmlResponse(response); - Assert.Equal(journeyInstance.State.StartDate!.Value.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("New start date")); - Assert.Equal(alert.StartDate!.Value.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("Current start date")); + Assert.Equal(journeyInstance.State.StartDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("New start date")); + Assert.Equal(alert.StartDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("Current start date")); Assert.Equal(journeyInstance.State.ChangeReason!.Value.GetDisplayName(), doc.GetSummaryListValueForKey("Reason for change")); - Assert.Equal(populateOptional ? journeyInstance.State.ChangeReasonDetail : "-", doc.GetSummaryListValueForKey("Reason details")); - Assert.Equal(populateOptional ? $"{journeyInstance.State.EvidenceFileName} (opens in new tab)" : "-", doc.GetSummaryListValueForKey("Evidence")); + Assert.Equal(populateOptional ? journeyInstance.State.ChangeReasonDetail : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Reason details")); + Assert.Equal(populateOptional ? $"{journeyInstance.State.EvidenceFileName} (opens in new tab)" : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Evidence")); } [Theory] diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/ReopenAlert/CheckAnswersTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/ReopenAlert/CheckAnswersTests.cs index e6f817712..a562eb28d 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/ReopenAlert/CheckAnswersTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Alerts/ReopenAlert/CheckAnswersTests.cs @@ -96,11 +96,11 @@ public async Task Get_WithValidJourneyState_ReturnsOk(bool populateOptional) var doc = await AssertEx.HtmlResponse(response); Assert.Equal(alert.AlertType.Name, doc.GetSummaryListValueForKey("Alert type")); Assert.Equal(alert.Details, doc.GetSummaryListValueForKey("Details")); - Assert.Equal(populateOptional ? $"{alert.ExternalLink} (opens in new tab)" : "-", doc.GetSummaryListValueForKey("Link")); - Assert.Equal(alert.StartDate!.Value.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("Start date")); + Assert.Equal(populateOptional ? $"{alert.ExternalLink} (opens in new tab)" : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Link")); + Assert.Equal(alert.StartDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("Start date")); Assert.Equal(journeyInstance.State.ChangeReason!.Value.GetDisplayName(), doc.GetSummaryListValueForKey("Reason for change")); - Assert.Equal(populateOptional ? journeyInstance.State.ChangeReasonDetail : "-", doc.GetSummaryListValueForKey("Reason details")); - Assert.Equal(populateOptional ? $"{journeyInstance.State.EvidenceFileName} (opens in new tab)" : "-", doc.GetSummaryListValueForKey("Evidence")); + Assert.Equal(populateOptional ? journeyInstance.State.ChangeReasonDetail : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Reason details")); + Assert.Equal(populateOptional ? $"{journeyInstance.State.EvidenceFileName} (opens in new tab)" : UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Evidence")); } [Theory] diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/ChangeRequests/EditChangeRequest/IndexTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/ChangeRequests/EditChangeRequest/IndexTests.cs index c3d818bcc..27a099c1e 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/ChangeRequests/EditChangeRequest/IndexTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/ChangeRequests/EditChangeRequest/IndexTests.cs @@ -167,8 +167,8 @@ public async Task Get_WithTicketNumberForActiveDateOfBirthChangeIncident_Renders var dateOfBirthRow = doc.GetElementByTestId("date-of-birth"); Assert.NotNull(dateOfBirthRow); - Assert.Equal(createPersonResult.DateOfBirth.ToString("d MMMM yyyy"), dateOfBirthRow.GetElementByTestId("date-of-birth-current")!.TextContent); - Assert.Equal(createIncidentResult.NewDateOfBirth.ToString("d MMMM yyyy"), dateOfBirthRow.GetElementByTestId("date-of-birth-new")!.TextContent); + Assert.Equal(createPersonResult.DateOfBirth.ToString(UiDefaults.DateOnlyDisplayFormat), dateOfBirthRow.GetElementByTestId("date-of-birth-current")!.TextContent); + Assert.Equal(createIncidentResult.NewDateOfBirth.ToString(UiDefaults.DateOnlyDisplayFormat), dateOfBirthRow.GetElementByTestId("date-of-birth-new")!.TextContent); var imageDocument = doc.GetElementByTestId($"image-{createIncidentResult.Evidence.DocumentId}"); Assert.NotNull(imageDocument); diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/AddMq/CheckAnswersTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/AddMq/CheckAnswersTests.cs index 3e072e6d4..d11cf2088 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/AddMq/CheckAnswersTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/AddMq/CheckAnswersTests.cs @@ -86,11 +86,11 @@ public async Task Get_ValidRequestWithPopulatedDataInJourneyState_PopulatesModel var doc = await AssertEx.HtmlResponse(response); Assert.Equal(provider.Name, doc.GetElementByTestId("provider")!.TextContent); Assert.Equal(specialism.GetTitle(), doc.GetElementByTestId("specialism")!.TextContent); - Assert.Equal(startDate.ToString("d MMMM yyyy"), doc.GetElementByTestId("start-date")!.TextContent); + Assert.Equal(startDate.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetElementByTestId("start-date")!.TextContent); Assert.Equal(status.GetTitle(), doc.GetElementByTestId("status")!.TextContent); if (status == MandatoryQualificationStatus.Passed) { - Assert.Equal(endDate!.Value.ToString("d MMMM yyyy"), doc.GetElementByTestId("end-date")!.TextContent); + Assert.Equal(endDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetElementByTestId("end-date")!.TextContent); } else { diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/DeleteMq/ConfirmTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/DeleteMq/ConfirmTests.cs index a14e8b9e4..aaef3968c 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/DeleteMq/ConfirmTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/DeleteMq/ConfirmTests.cs @@ -80,8 +80,8 @@ public async Task Get_ValidRequest_DisplaysContentAsExpected( Assert.Equal(provider?.Name ?? "None", deletionSummary.GetElementByTestId("provider")!.TextContent); Assert.Equal(specialism?.GetTitle() ?? "None", deletionSummary.GetElementByTestId("specialism")!.TextContent); Assert.Equal(status is not null ? status.Value.ToString() : "None", deletionSummary.GetElementByTestId("status")!.TextContent); - Assert.Equal(startDate is not null ? startDate.Value.ToString("d MMMM yyyy") : "None", deletionSummary.GetElementByTestId("start-date")!.TextContent); - Assert.Equal(endDate is not null ? endDate.Value.ToString("d MMMM yyyy") : "None", deletionSummary.GetElementByTestId("end-date")!.TextContent); + Assert.Equal(startDate is not null ? startDate.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : "None", deletionSummary.GetElementByTestId("start-date")!.TextContent); + Assert.Equal(endDate is not null ? endDate.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : "None", deletionSummary.GetElementByTestId("end-date")!.TextContent); var uploadedEvidenceLink = doc.GetElementByTestId("uploaded-evidence-link"); if (uploadEvidence) { diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/EditMq/StartDate/ConfirmTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/EditMq/StartDate/ConfirmTests.cs index f8d8ec384..dd2d80c39 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/EditMq/StartDate/ConfirmTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/EditMq/StartDate/ConfirmTests.cs @@ -65,8 +65,8 @@ public async Task Get_ValidRequest_DisplaysContentAsExpected( var doc = await AssertEx.HtmlResponse(response); var changeSummary = doc.GetElementByTestId("change-summary"); Assert.NotNull(changeSummary); - Assert.Equal(oldStartDate.ToString("d MMMM yyyy"), changeSummary.GetElementByTestId("current-start-date")!.TextContent); - Assert.Equal(newStartDate.ToString("d MMMM yyyy"), changeSummary.GetElementByTestId("new-start-date")!.TextContent); + Assert.Equal(oldStartDate.ToString(UiDefaults.DateOnlyDisplayFormat), changeSummary.GetElementByTestId("current-start-date")!.TextContent); + Assert.Equal(newStartDate.ToString(UiDefaults.DateOnlyDisplayFormat), changeSummary.GetElementByTestId("new-start-date")!.TextContent); Assert.Equal(changeReason.GetDisplayName(), changeSummary.GetElementByTestId("change-reason")!.TextContent); Assert.Equal(!string.IsNullOrEmpty(changeReasonDetail) ? changeReasonDetail : "None", changeSummary.GetElementByTestId("change-reason-detail")!.TextContent); var uploadedEvidenceLink = changeSummary.GetElementByTestId("uploaded-evidence-link"); diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/EditMq/Status/ConfirmTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/EditMq/Status/ConfirmTests.cs index 03962b3ff..a63acd5e8 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/EditMq/Status/ConfirmTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Mqs/EditMq/Status/ConfirmTests.cs @@ -122,8 +122,8 @@ public async Task Get_ValidRequest_DisplaysContentAsExpected( if (isEndDateChange) { - Assert.Equal(oldEndDate.HasValue ? oldEndDate.Value.ToString("d MMMM yyyy") : "None", changeSummary.GetElementByTestId("current-end-date")!.TextContent); - Assert.Equal(newEndDate.HasValue ? newEndDate.Value.ToString("d MMMM yyyy") : "None", changeSummary.GetElementByTestId("new-end-date")!.TextContent); + Assert.Equal(oldEndDate.HasValue ? oldEndDate.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : "None", changeSummary.GetElementByTestId("current-end-date")!.TextContent); + Assert.Equal(newEndDate.HasValue ? newEndDate.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : "None", changeSummary.GetElementByTestId("new-end-date")!.TextContent); } else { diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/IndexTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/IndexTests.cs index 2eaeea237..0036094d2 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/IndexTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/IndexTests.cs @@ -81,7 +81,7 @@ public async Task Get_WithSearchThatLooksLikeADate_DisplaysMatchesOnDateOfBirth( var person1 = await TestData.CreatePerson(b => b.WithDateOfBirth(dateOfBirth)); var person2 = await TestData.CreatePerson(b => b.WithDateOfBirth(dateOfBirth)); var person3 = await TestData.CreatePerson(b => b.WithDateOfBirth(dateOfBirth)); - var search = dateOfBirth.ToString("dd/MM/yyyy"); + var search = dateOfBirth.ToString(UiDefaults.DateOnlyDisplayFormat); var request = new HttpRequestMessage(HttpMethod.Get, $"/persons?search={search}"); diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/AlertsTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/AlertsTests.cs index 33f339ba8..c790391ad 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/AlertsTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/AlertsTests.cs @@ -62,8 +62,8 @@ public async Task Get_PersonWithOpenAlert_ShowsCardWithExpectedContent() Assert.Equal(alert.Details, card.GetSummaryListValueForKey("Details")); Assert.Equal(alert.ExternalLink, card.GetSummaryListValueElementForKey("Link")?.GetElementsByTagName("a").FirstOrDefault()?.TextContent); - Assert.Equal(alert.StartDate?.ToString("d MMMM yyyy"), card.GetSummaryListValueForKey("Start date")); - Assert.Equal("-", card.GetSummaryListValueForKey("End date")); + Assert.Equal(alert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat), card.GetSummaryListValueForKey("Start date")); + Assert.Equal(UiDefaults.EmptyDisplayContent, card.GetSummaryListValueForKey("End date")); }); } @@ -109,8 +109,8 @@ public async Task Get_PersonWithClosedAlert_ShowsTableRowWithExpectedContent() row => Assert.Collection( row.GetElementsByTagName("td"), column => Assert.Equal(alert.AlertType.Name, column.TextContent), - column => Assert.Equal(alert.StartDate?.ToString("d MMMM yyyy"), column.TextContent), - column => Assert.Equal(alert.EndDate?.ToString("d MMMM yyyy"), column.TextContent), + column => Assert.Equal(alert.StartDate?.ToString(UiDefaults.DateOnlyDisplayFormat), column.TextContent), + column => Assert.Equal(alert.EndDate?.ToString(UiDefaults.DateOnlyDisplayFormat), column.TextContent), column => { })); } diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/ChangeLogMandatoryQualificationEventsTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/ChangeLogMandatoryQualificationEventsTests.cs index b5ca1f216..315b54f7f 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/ChangeLogMandatoryQualificationEventsTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/ChangeLogMandatoryQualificationEventsTests.cs @@ -93,9 +93,9 @@ public async Task Person_WithMandatoryQualificationDeletedEvent_RendersExpectedC Assert.Equal($"{evidenceFile.Name} (opens in new tab)", item.GetElementByTestId("evidence")?.TextContent); Assert.Equal(mq.Provider!.Name, item.GetElementByTestId("provider")?.TextContent.Trim()); Assert.Equal(mq.Specialism!.Value.GetTitle(), item.GetElementByTestId("specialism")?.TextContent.Trim()); - Assert.Equal(mq.StartDate!.Value.ToString("d MMMM yyyy"), item.GetElementByTestId("start-date")?.TextContent.Trim()); + Assert.Equal(mq.StartDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat), item.GetElementByTestId("start-date")?.TextContent.Trim()); Assert.Equal(mq.Status!.Value.GetTitle(), item.GetElementByTestId("status")?.TextContent.Trim()); - Assert.Equal(mq.EndDate!.Value.ToString("d MMMM yyyy"), item.GetElementByTestId("end-date")?.TextContent.Trim()); + Assert.Equal(mq.EndDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat), item.GetElementByTestId("end-date")?.TextContent.Trim()); }); } @@ -220,9 +220,9 @@ public async Task Person_WithMandatoryQualficationDqtDeactivatedEvent_RendersExp Assert.Equal(Clock.NowGmt.ToString(TimelineItem.TimestampFormat), item.GetElementByTestId("timeline-item-time")?.TextContent.Trim()); Assert.Equal(mq.Provider!.Name, item.GetElementByTestId("provider")?.TextContent.Trim()); Assert.Equal(mq.Specialism!.Value.GetTitle(), item.GetElementByTestId("specialism")?.TextContent.Trim()); - Assert.Equal(mq.StartDate!.Value.ToString("d MMMM yyyy"), item.GetElementByTestId("start-date")?.TextContent.Trim()); + Assert.Equal(mq.StartDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat), item.GetElementByTestId("start-date")?.TextContent.Trim()); Assert.Equal(mq.Status!.Value.GetTitle(), item.GetElementByTestId("status")?.TextContent.Trim()); - Assert.Equal(mq.EndDate!.Value.ToString("d MMMM yyyy"), item.GetElementByTestId("end-date")?.TextContent.Trim()); + Assert.Equal(mq.EndDate!.Value.ToString(UiDefaults.DateOnlyDisplayFormat), item.GetElementByTestId("end-date")?.TextContent.Trim()); }); } @@ -768,7 +768,7 @@ await UpdateMq( Assert.Collection( doc.GetAllElementsByTestId("timeline-item-mq-updated-event"), - item => Assert.Equal(oldStartDate.ToString("d MMMM yyyy"), item.GetElementByTestId("start-date")?.TextContent.Trim())); + item => Assert.Equal(oldStartDate.ToString(UiDefaults.DateOnlyDisplayFormat), item.GetElementByTestId("start-date")?.TextContent.Trim())); } [Fact] @@ -882,7 +882,7 @@ await UpdateMq( Assert.Collection( doc.GetAllElementsByTestId("timeline-item-mq-updated-event"), - item => Assert.Equal(oldEndDate.ToString("d MMMM yyyy"), item.GetElementByTestId("end-date")?.TextContent.Trim())); + item => Assert.Equal(oldEndDate.ToString(UiDefaults.DateOnlyDisplayFormat), item.GetElementByTestId("end-date")?.TextContent.Trim())); } //public async Task Person_WithMandatoryQualificationUpdatedEventWithoutChangedEndDate_DoesNotRenderEndDateRowWithinPreviousData() diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/EditDateOfBirth/ConfirmTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/EditDateOfBirth/ConfirmTests.cs index de5226d54..360ccef5e 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/EditDateOfBirth/ConfirmTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/EditDateOfBirth/ConfirmTests.cs @@ -68,8 +68,8 @@ public async Task Get_ValidRequest_RendersExpectedContent() // Assert var doc = await AssertEx.HtmlResponse(response); - Assert.Equal(person.DateOfBirth.ToString("dd/MM/yyyy"), doc.GetElementByTestId("current-value")!.TextContent); - Assert.Equal(newDateOfBirth.ToString("dd/MM/yyyy"), doc.GetElementByTestId("new-value")!.TextContent); + Assert.Equal(person.DateOfBirth.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetElementByTestId("current-value")!.TextContent); + Assert.Equal(newDateOfBirth.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetElementByTestId("new-value")!.TextContent); } [Fact] diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/IndexTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/IndexTests.cs index 647256dae..0ca651414 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/IndexTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/IndexTests.cs @@ -57,7 +57,7 @@ public async Task Get_WithPersonIdForExistingPersonWithAllPropertiesSet_ReturnsE var previousNames = doc.GetSummaryListValueElementForKey("Previous name(s)")?.QuerySelectorAll("li"); Assert.Equal($"{updatedFirstName} {updatedMiddleName} {createPersonResult.LastName}", previousNames?.First().TextContent); Assert.Equal($"{createPersonResult.FirstName} {createPersonResult.MiddleName} {createPersonResult.LastName}", previousNames?.Last().TextContent); - Assert.Equal(createPersonResult.DateOfBirth.ToString("dd/MM/yyyy"), doc.GetSummaryListValueForKey("Date of birth")); + Assert.Equal(createPersonResult.DateOfBirth.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("Date of birth")); Assert.Equal(createPersonResult.Gender, doc.GetSummaryListValueForKey("Gender")); Assert.Equal(createPersonResult.Trn, doc.GetSummaryListValueForKey("TRN")); Assert.Equal(createPersonResult.NationalInsuranceNumber, doc.GetSummaryListValueForKey("National Insurance number")); @@ -81,11 +81,11 @@ public async Task Get_WithPersonIdForExistingPersonWithMissingProperties_Returns Assert.Equal($"{createPersonResult.FirstName} {createPersonResult.MiddleName} {createPersonResult.LastName}", doc.GetElementByTestId("page-title")!.TextContent); Assert.Equal($"{createPersonResult.FirstName} {createPersonResult.MiddleName} {createPersonResult.LastName}", doc.GetSummaryListValueForKey("Name")); - Assert.Equal(createPersonResult.DateOfBirth.ToString("dd/MM/yyyy"), doc.GetSummaryListValueForKey("Date of birth")); - Assert.Equal("-", doc.GetSummaryListValueForKey("TRN")); - Assert.Equal("-", doc.GetSummaryListValueForKey("Email")); - Assert.Equal("-", doc.GetSummaryListValueForKey("National Insurance number")); - Assert.Equal("-", doc.GetSummaryListValueForKey("Mobile number")); + Assert.Equal(createPersonResult.DateOfBirth.ToString(UiDefaults.DateOnlyDisplayFormat), doc.GetSummaryListValueForKey("Date of birth")); + Assert.Equal(UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("TRN")); + Assert.Equal(UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Email")); + Assert.Equal(UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("National Insurance number")); + Assert.Equal(UiDefaults.EmptyDisplayContent, doc.GetSummaryListValueForKey("Mobile number")); } [Fact] diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/QualificationsTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/QualificationsTests.cs index 68e050841..691cbd664 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/QualificationsTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.SupportUi.Tests/PageTests/Persons/PersonDetail/QualificationsTests.cs @@ -74,8 +74,8 @@ public async Task Get_WithPersonIdForPersonWithMandatoryQualifications_DisplaysE Assert.NotNull(mandatoryQualificationSummary); Assert.Equal(provider?.Name ?? "None", mandatoryQualificationSummary.GetElementByTestId($"mq-provider-{qualificationId}")!.TextContent); Assert.Equal(specialism?.GetTitle() ?? "None", mandatoryQualificationSummary.GetElementByTestId($"mq-specialism-{qualificationId}")!.TextContent); - Assert.Equal(startDate is not null ? startDate.Value.ToString("d MMMM yyyy") : "None", mandatoryQualificationSummary.GetElementByTestId($"mq-start-date-{qualificationId}")!.TextContent); + Assert.Equal(startDate is not null ? startDate.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : "None", mandatoryQualificationSummary.GetElementByTestId($"mq-start-date-{qualificationId}")!.TextContent); Assert.Equal(status is not null ? status.Value.ToString() : "None", mandatoryQualificationSummary.GetElementByTestId($"mq-status-{qualificationId}")!.TextContent); - Assert.Equal(endDate is not null ? endDate.Value.ToString("d MMMM yyyy") : "None", mandatoryQualificationSummary.GetElementByTestId($"mq-end-date-{qualificationId}")!.TextContent); + Assert.Equal(endDate is not null ? endDate.Value.ToString(UiDefaults.DateOnlyDisplayFormat) : "None", mandatoryQualificationSummary.GetElementByTestId($"mq-end-date-{qualificationId}")!.TextContent); } }