From 1a1497d39335c6ccf2150f3f3cd73eb7baf567af Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Tue, 21 Jul 2026 11:44:01 +0100 Subject: [PATCH 01/17] PDJB-1168: add change links --- .../LandlordRegistrationOrgLandlordState.kt | 29 +--- .../states/LeadTrusteeState.kt | 16 +++ .../states/OrgCharityState.kt | 16 +++ .../states/OrgCompaniesHouseState.kt | 10 ++ .../OrgLandlordRegistrationCyaStepConfig.kt | 66 +++++---- .../tasks/LandlordRegistrationTask.kt | 70 ++++++++++ .../tasks/LeadTrusteeTask.kt | 55 ++++++++ .../tasks/OrgCharityTask.kt | 80 +++++++++++ .../tasks/OrgCompaniesHouseTask.kt | 48 +++++++ .../tasks/OrgLandlordRegistrationTask.kt | 130 ++++-------------- .../states/CheckYourAnswersJourneyState.kt | 6 +- .../LandlordRegistrationJourneyTests.kt | 76 ++++++++++ .../integration/pageObjects/Navigator.kt | 6 + 13 files changed, 453 insertions(+), 155 deletions(-) create mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LeadTrusteeState.kt create mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCharityState.kt create mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt create mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LeadTrusteeTask.kt create mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCharityTask.kt create mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt index 779a971416..87834daf59 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt @@ -2,18 +2,7 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states import uk.gov.communities.prsdb.webapp.journeys.JourneyState import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeDobStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeEmailStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeNameStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteePhoneStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgAddressStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberEnglandAndWalesStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberNorthernIrelandStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberScotlandStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityRegisteredWithStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompaniesHouseStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompanyNumberStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgEmailStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyDetailsStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep @@ -29,6 +18,9 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SaveGovBodyMemberStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SetStateForGovBodyMemberEditStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.YourDetailsStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.LeadTrusteeTask +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgCharityTask +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgCompaniesHouseTask import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.AddressTask import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel @@ -39,18 +31,9 @@ interface LandlordRegistrationOrgLandlordState : JourneyState { val orgEmailStep: OrgEmailStep val orgPhoneNumberStep: OrgPhoneNumberStep val orgTypeStep: OrgTypeStep - val orgCompaniesHouseStep: OrgCompaniesHouseStep - val orgCompanyNumberStep: OrgCompanyNumberStep - val orgCharityStep: OrgCharityStep - val orgCharityRegisteredWithStep: OrgCharityRegisteredWithStep - val orgCharityNumberEnglandAndWalesStep: OrgCharityNumberEnglandAndWalesStep - val orgCharityNumberNorthernIrelandStep: OrgCharityNumberNorthernIrelandStep - val orgCharityNumberScotlandStep: OrgCharityNumberScotlandStep - val leadTrusteeNameStep: LeadTrusteeNameStep - val leadTrusteeEmailStep: LeadTrusteeEmailStep - val leadTrusteePhoneStep: LeadTrusteePhoneStep - val leadTrusteeDobStep: LeadTrusteeDobStep - val trusteeAddressTask: AddressTask + val companiesHouseTask: OrgCompaniesHouseTask + val charityTask: OrgCharityTask + val leadTrusteeTask: LeadTrusteeTask val orgMainContactStep: OrgMainContactStep val orgGovBodyDetailsStep: OrgGovBodyDetailsStep val orgGovBodyMustProvideInfoStep: OrgGovBodyMustProvideInfoStep diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LeadTrusteeState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LeadTrusteeState.kt new file mode 100644 index 0000000000..5abfe91eb2 --- /dev/null +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LeadTrusteeState.kt @@ -0,0 +1,16 @@ +package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states + +import uk.gov.communities.prsdb.webapp.journeys.JourneyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeDobStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeEmailStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeNameStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteePhoneStep +import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.AddressTask + +interface LeadTrusteeState : JourneyState { + val leadTrusteeNameStep: LeadTrusteeNameStep + val leadTrusteeDobStep: LeadTrusteeDobStep + val leadTrusteeEmailStep: LeadTrusteeEmailStep + val leadTrusteePhoneStep: LeadTrusteePhoneStep + val trusteeAddressTask: AddressTask +} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCharityState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCharityState.kt new file mode 100644 index 0000000000..3a61095850 --- /dev/null +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCharityState.kt @@ -0,0 +1,16 @@ +package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states + +import uk.gov.communities.prsdb.webapp.journeys.JourneyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberEnglandAndWalesStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberNorthernIrelandStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberScotlandStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityRegisteredWithStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityStep + +interface OrgCharityState : JourneyState { + val orgCharityStep: OrgCharityStep + val orgCharityRegisteredWithStep: OrgCharityRegisteredWithStep + val orgCharityNumberEnglandAndWalesStep: OrgCharityNumberEnglandAndWalesStep + val orgCharityNumberNorthernIrelandStep: OrgCharityNumberNorthernIrelandStep + val orgCharityNumberScotlandStep: OrgCharityNumberScotlandStep +} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt new file mode 100644 index 0000000000..c613b00890 --- /dev/null +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt @@ -0,0 +1,10 @@ +package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states + +import uk.gov.communities.prsdb.webapp.journeys.JourneyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompaniesHouseStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompanyNumberStep + +interface OrgCompaniesHouseState : JourneyState { + val orgCompaniesHouseStep: OrgCompaniesHouseStep + val orgCompanyNumberStep: OrgCompanyNumberStep +} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgLandlordRegistrationCyaStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgLandlordRegistrationCyaStepConfig.kt index f47111bdf0..123b87c11d 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgLandlordRegistrationCyaStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgLandlordRegistrationCyaStepConfig.kt @@ -197,16 +197,21 @@ class OrgLandlordRegistrationCyaStepConfig( ), ) - val isRegisteredCharity = org.orgCharityStep.formModel.notNullValue(OrgCharityFormModel::charity) + val isRegisteredCharity = org.charityTask.orgCharityStep.formModel.notNullValue(OrgCharityFormModel::charity) add( SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.landlordDetails.registeredCharity", isRegisteredCharity, - Destination.VisitableStep(org.orgCharityStep, state.getCyaJourneyId(org.orgCharityStep)), + Destination.VisitableStep(org.charityTask.orgCharityStep, state.getCyaJourneyId(org.charityTask.orgCharityStep)), ), ) - val charityRegulator = if (isRegisteredCharity) org.orgCharityRegisteredWithStep.formModel.charityRegisteredWith else null + val charityRegulator = + if (isRegisteredCharity) { + org.charityTask.orgCharityRegisteredWithStep.formModel.charityRegisteredWith + } else { + null + } val showCharityRegulator = charityRegulator != null val showCharityNumber = charityRegulator != null && charityRegulator != CharityRegulator.NONE @@ -216,8 +221,8 @@ class OrgLandlordRegistrationCyaStepConfig( "registerAsALandlord.orgCheckAnswers.landlordDetails.charityCommission", regulatorMessageKey(charityRegulator!!), Destination.VisitableStep( - org.orgCharityRegisteredWithStep, - state.getCyaJourneyId(org.orgCharityRegisteredWithStep), + org.charityTask.orgCharityRegisteredWithStep, + state.getCyaJourneyId(org.charityTask.orgCharityRegisteredWithStep), ), ), ) @@ -227,22 +232,28 @@ class OrgLandlordRegistrationCyaStepConfig( } val registeredWithCompaniesHouse = - org.orgCompaniesHouseStep.formModel.notNullValue( + org.companiesHouseTask.orgCompaniesHouseStep.formModel.notNullValue( OrgCompaniesHouseFormModel::companiesHouse, ) add( SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.landlordDetails.registeredWithCompaniesHouse", registeredWithCompaniesHouse, - Destination.VisitableStep(org.orgCompaniesHouseStep, state.getCyaJourneyId(org.orgCompaniesHouseStep)), + Destination.VisitableStep( + org.companiesHouseTask.orgCompaniesHouseStep, + state.getCyaJourneyId(org.companiesHouseTask.orgCompaniesHouseStep), + ), ), ) if (registeredWithCompaniesHouse) { add( SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.landlordDetails.companiesHouseNumber", - org.orgCompanyNumberStep.formModel.notNullValue(OrgCompanyNumberFormModel::companyNumber), - Destination.VisitableStep(org.orgCompanyNumberStep, state.getCyaJourneyId(org.orgCompanyNumberStep)), + org.companiesHouseTask.orgCompanyNumberStep.formModel.notNullValue(OrgCompanyNumberFormModel::companyNumber), + Destination.VisitableStep( + org.companiesHouseTask.orgCompanyNumberStep, + state.getCyaJourneyId(org.companiesHouseTask.orgCompanyNumberStep), + ), ), ) } @@ -259,30 +270,34 @@ class OrgLandlordRegistrationCyaStepConfig( CharityRegulator.ENGLAND_AND_WALES -> SummaryListRowViewModel.forCheckYourAnswersPage( headingKey, - org.orgCharityNumberEnglandAndWalesStep.formModel.notNullValue(OrgCharityNumberEnglandAndWalesFormModel::charityNumber), + org.charityTask.orgCharityNumberEnglandAndWalesStep.formModel.notNullValue( + OrgCharityNumberEnglandAndWalesFormModel::charityNumber, + ), Destination.VisitableStep( - org.orgCharityNumberEnglandAndWalesStep, - state.getCyaJourneyId(org.orgCharityNumberEnglandAndWalesStep), + org.charityTask.orgCharityNumberEnglandAndWalesStep, + state.getCyaJourneyId(org.charityTask.orgCharityNumberEnglandAndWalesStep), ), ) CharityRegulator.NORTHERN_IRELAND -> SummaryListRowViewModel.forCheckYourAnswersPage( headingKey, - org.orgCharityNumberNorthernIrelandStep.formModel.notNullValue(OrgCharityNumberNorthernIrelandFormModel::charityNumber), + org.charityTask.orgCharityNumberNorthernIrelandStep.formModel.notNullValue( + OrgCharityNumberNorthernIrelandFormModel::charityNumber, + ), Destination.VisitableStep( - org.orgCharityNumberNorthernIrelandStep, - state.getCyaJourneyId(org.orgCharityNumberNorthernIrelandStep), + org.charityTask.orgCharityNumberNorthernIrelandStep, + state.getCyaJourneyId(org.charityTask.orgCharityNumberNorthernIrelandStep), ), ) CharityRegulator.SCOTLAND -> SummaryListRowViewModel.forCheckYourAnswersPage( headingKey, - org.orgCharityNumberScotlandStep.formModel.notNullValue(OrgCharityNumberScotlandFormModel::charityNumber), + org.charityTask.orgCharityNumberScotlandStep.formModel.notNullValue(OrgCharityNumberScotlandFormModel::charityNumber), Destination.VisitableStep( - org.orgCharityNumberScotlandStep, - state.getCyaJourneyId(org.orgCharityNumberScotlandStep), + org.charityTask.orgCharityNumberScotlandStep, + state.getCyaJourneyId(org.charityTask.orgCharityNumberScotlandStep), ), ) @@ -299,27 +314,27 @@ class OrgLandlordRegistrationCyaStepConfig( listOf( SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.name", - org.leadTrusteeNameStep.formModel.notNullValue(LeadTrusteeNameFormModel::name), + org.leadTrusteeTask.leadTrusteeNameStep.formModel.notNullValue(LeadTrusteeNameFormModel::name), Destination.Nowhere(), ), SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.dateOfBirth", - org.leadTrusteeDobStep.formModel.toLocalDateOrNull(), + org.leadTrusteeTask.leadTrusteeDobStep.formModel.toLocalDateOrNull(), Destination.Nowhere(), ), SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.email", - org.leadTrusteeEmailStep.formModel.notNullValue(LeadTrusteeEmailFormModel::emailAddress), + org.leadTrusteeTask.leadTrusteeEmailStep.formModel.notNullValue(LeadTrusteeEmailFormModel::emailAddress), Destination.Nowhere(), ), SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.phoneNumber", - org.leadTrusteePhoneStep.formModel.notNullValue(LeadTrusteePhoneFormModel::phoneNumber), + org.leadTrusteeTask.leadTrusteePhoneStep.formModel.notNullValue(LeadTrusteePhoneFormModel::phoneNumber), Destination.Nowhere(), ), SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.address", - org.trusteeAddressTask.getAddress().toMultiLineAddress().split("\n"), + org.leadTrusteeTask.trusteeAddressTask.getAddress().toMultiLineAddress().split("\n"), Destination.Nowhere(), ), ) @@ -328,7 +343,10 @@ class OrgLandlordRegistrationCyaStepConfig( summaryList = rows, actions = SummaryCardActionViewModel.changeAction( - Destination.VisitableStep(org.leadTrusteeNameStep, state.getCyaJourneyId(org.leadTrusteeNameStep)), + Destination.VisitableStep( + org.leadTrusteeTask.leadTrusteeNameStep, + state.getCyaJourneyId(org.leadTrusteeTask.leadTrusteeNameStep), + ), ), ) } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt index e3760ea00c..4b710d17b4 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt @@ -21,7 +21,21 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.IndividualLandlordRegistrationCyaStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LandlordTypeMode import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LandlordTypeStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeNameStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgAddressStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberEnglandAndWalesStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberNorthernIrelandStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberScotlandStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityRegisteredWithStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompaniesHouseStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompanyNumberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgEmailStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgLandlordRegistrationCyaStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgMainContactStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgNameStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgPhoneNumberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.PhoneNumberStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.PrivacyNoticeStep import uk.gov.communities.prsdb.webapp.journeys.propertyRegistration.steps.FinishCyaJourneyStep @@ -53,6 +67,15 @@ class LandlordRegistrationTask( override val taskState get() = this + override val activeCyaStep get() = + if (featureFlagManager.checkFeature(ORGANISATION_LANDLORD_REGISTRATION) && + landlordTypeStep.outcome == LandlordTypeMode.ORGANISATION + ) { + orgCyaStep + } else { + cyaStep + } + override fun makeSubJourney(state: LandlordRegistrationState) = if (featureFlagManager.checkFeature(ORGANISATION_LANDLORD_REGISTRATION)) { makeOrgLandlordSubJourney(state) @@ -165,6 +188,53 @@ class LandlordRegistrationTask( LookupAddressStep.ROUTE_SEGMENT -> { duplicableCheckAnswerTask(journey.individualLandlordRegistrationTask.addressTask, null) } + + LandlordTypeStep.ROUTE_SEGMENT -> { + checkAnswerStep(journey.landlordTypeStep, LandlordTypeStep.ROUTE_SEGMENT) + } + + OrgNameStep.ROUTE_SEGMENT -> { + checkAnswerStep(journey.orgLandlordRegistrationTask.orgNameStep, OrgNameStep.ROUTE_SEGMENT) + } + + OrgAddressStep.ROUTE_SEGMENT -> { + checkAnswerStep(journey.orgLandlordRegistrationTask.orgAddressStep, OrgAddressStep.ROUTE_SEGMENT) + } + + OrgEmailStep.ROUTE_SEGMENT -> { + checkAnswerStep(journey.orgLandlordRegistrationTask.orgEmailStep, OrgEmailStep.ROUTE_SEGMENT) + } + + OrgPhoneNumberStep.ROUTE_SEGMENT -> { + checkAnswerStep(journey.orgLandlordRegistrationTask.orgPhoneNumberStep, OrgPhoneNumberStep.ROUTE_SEGMENT) + } + + OrgTypeStep.ROUTE_SEGMENT -> { + checkAnswerStep(journey.orgLandlordRegistrationTask.orgTypeStep, OrgTypeStep.ROUTE_SEGMENT) + } + + OrgCharityStep.ROUTE_SEGMENT, + OrgCharityRegisteredWithStep.ROUTE_SEGMENT, + OrgCharityNumberEnglandAndWalesStep.ROUTE_SEGMENT, + OrgCharityNumberNorthernIrelandStep.ROUTE_SEGMENT, + OrgCharityNumberScotlandStep.ROUTE_SEGMENT, + -> { + duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.charityTask, null) + } + + OrgCompaniesHouseStep.ROUTE_SEGMENT, + OrgCompanyNumberStep.ROUTE_SEGMENT, + -> { + duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.companiesHouseTask, null) + } + + LeadTrusteeNameStep.ROUTE_SEGMENT -> { + duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.leadTrusteeTask, null) + } + + OrgMainContactStep.ROUTE_SEGMENT -> { + checkAnswerStep(journey.orgLandlordRegistrationTask.orgMainContactStep, OrgMainContactStep.ROUTE_SEGMENT) + } } step(journey.finishCyaStep) { initialStep() diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LeadTrusteeTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LeadTrusteeTask.kt new file mode 100644 index 0000000000..dad60046d6 --- /dev/null +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LeadTrusteeTask.kt @@ -0,0 +1,55 @@ +package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks + +import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent +import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask +import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService +import uk.gov.communities.prsdb.webapp.journeys.isComplete +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LeadTrusteeState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeDobStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeEmailStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeNameStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteePhoneStep +import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.TrusteeAddressTask + +@JourneyFrameworkComponent +class LeadTrusteeTask( + journeyStateService: JourneyStateService, + override val leadTrusteeNameStep: LeadTrusteeNameStep, + override val leadTrusteeDobStep: LeadTrusteeDobStep, + override val leadTrusteeEmailStep: LeadTrusteeEmailStep, + override val leadTrusteePhoneStep: LeadTrusteePhoneStep, + override val trusteeAddressTask: TrusteeAddressTask, +) : DuplicableTask(journeyStateService), + LeadTrusteeState { + override val taskState get() = this + + override fun makeSubJourney(state: LeadTrusteeState) = + subJourney(state) { + step(journey.leadTrusteeNameStep) { + routeSegment(LeadTrusteeNameStep.ROUTE_SEGMENT) + nextStep { journey.leadTrusteeDobStep } + } + step(journey.leadTrusteeDobStep) { + routeSegment(LeadTrusteeDobStep.ROUTE_SEGMENT) + parents { journey.leadTrusteeNameStep.isComplete() } + nextStep { journey.leadTrusteeEmailStep } + } + step(journey.leadTrusteeEmailStep) { + routeSegment(LeadTrusteeEmailStep.ROUTE_SEGMENT) + parents { journey.leadTrusteeDobStep.isComplete() } + nextStep { journey.leadTrusteePhoneStep } + } + step(journey.leadTrusteePhoneStep) { + routeSegment(LeadTrusteePhoneStep.ROUTE_SEGMENT) + parents { journey.leadTrusteeEmailStep.isComplete() } + nextStep { journey.trusteeAddressTask.firstStep } + } + duplicableTask(journey.trusteeAddressTask, TrusteeAddressTask.ROUTE_SEGMENT) { + parents { journey.leadTrusteePhoneStep.isComplete() } + nextStep { exitStep } + } + exitStep { + parents { journey.trusteeAddressTask.isComplete() } + } + } +} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCharityTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCharityTask.kt new file mode 100644 index 0000000000..c750e2880a --- /dev/null +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCharityTask.kt @@ -0,0 +1,80 @@ +package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks + +import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent +import uk.gov.communities.prsdb.webapp.constants.enums.CharityRegulator +import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask +import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService +import uk.gov.communities.prsdb.webapp.journeys.OrParents +import uk.gov.communities.prsdb.webapp.journeys.hasOutcome +import uk.gov.communities.prsdb.webapp.journeys.isComplete +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgCharityState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberEnglandAndWalesStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberNorthernIrelandStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberScotlandStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityRegisteredWithStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityStep +import uk.gov.communities.prsdb.webapp.journeys.shared.YesOrNo + +@JourneyFrameworkComponent +class OrgCharityTask( + journeyStateService: JourneyStateService, + override val orgCharityStep: OrgCharityStep, + override val orgCharityRegisteredWithStep: OrgCharityRegisteredWithStep, + override val orgCharityNumberEnglandAndWalesStep: OrgCharityNumberEnglandAndWalesStep, + override val orgCharityNumberNorthernIrelandStep: OrgCharityNumberNorthernIrelandStep, + override val orgCharityNumberScotlandStep: OrgCharityNumberScotlandStep, +) : DuplicableTask(journeyStateService), + OrgCharityState { + override val taskState get() = this + + override fun makeSubJourney(state: OrgCharityState) = + subJourney(state) { + step(journey.orgCharityStep) { + routeSegment(OrgCharityStep.ROUTE_SEGMENT) + nextStep { mode -> + when (mode) { + YesOrNo.YES -> journey.orgCharityRegisteredWithStep + YesOrNo.NO -> exitStep + } + } + } + step(journey.orgCharityRegisteredWithStep) { + routeSegment(OrgCharityRegisteredWithStep.ROUTE_SEGMENT) + parents { journey.orgCharityStep.hasOutcome(YesOrNo.YES) } + nextStep { mode -> + when (mode) { + CharityRegulator.ENGLAND_AND_WALES -> journey.orgCharityNumberEnglandAndWalesStep + CharityRegulator.NORTHERN_IRELAND -> journey.orgCharityNumberNorthernIrelandStep + CharityRegulator.SCOTLAND -> journey.orgCharityNumberScotlandStep + CharityRegulator.NONE -> exitStep + } + } + } + step(journey.orgCharityNumberEnglandAndWalesStep) { + routeSegment(OrgCharityNumberEnglandAndWalesStep.ROUTE_SEGMENT) + parents { journey.orgCharityRegisteredWithStep.hasOutcome(CharityRegulator.ENGLAND_AND_WALES) } + nextStep { exitStep } + } + step(journey.orgCharityNumberNorthernIrelandStep) { + routeSegment(OrgCharityNumberNorthernIrelandStep.ROUTE_SEGMENT) + parents { journey.orgCharityRegisteredWithStep.hasOutcome(CharityRegulator.NORTHERN_IRELAND) } + nextStep { exitStep } + } + step(journey.orgCharityNumberScotlandStep) { + routeSegment(OrgCharityNumberScotlandStep.ROUTE_SEGMENT) + parents { journey.orgCharityRegisteredWithStep.hasOutcome(CharityRegulator.SCOTLAND) } + nextStep { exitStep } + } + exitStep { + parents { + OrParents( + journey.orgCharityStep.hasOutcome(YesOrNo.NO), + journey.orgCharityRegisteredWithStep.hasOutcome(CharityRegulator.NONE), + journey.orgCharityNumberEnglandAndWalesStep.isComplete(), + journey.orgCharityNumberNorthernIrelandStep.isComplete(), + journey.orgCharityNumberScotlandStep.isComplete(), + ) + } + } + } +} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt new file mode 100644 index 0000000000..bcd50340e7 --- /dev/null +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt @@ -0,0 +1,48 @@ +package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks + +import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent +import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask +import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService +import uk.gov.communities.prsdb.webapp.journeys.OrParents +import uk.gov.communities.prsdb.webapp.journeys.hasOutcome +import uk.gov.communities.prsdb.webapp.journeys.isComplete +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgCompaniesHouseState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompaniesHouseStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompanyNumberStep +import uk.gov.communities.prsdb.webapp.journeys.shared.YesOrNo + +@JourneyFrameworkComponent +class OrgCompaniesHouseTask( + journeyStateService: JourneyStateService, + override val orgCompaniesHouseStep: OrgCompaniesHouseStep, + override val orgCompanyNumberStep: OrgCompanyNumberStep, +) : DuplicableTask(journeyStateService), + OrgCompaniesHouseState { + override val taskState get() = this + + override fun makeSubJourney(state: OrgCompaniesHouseState) = + subJourney(state) { + step(journey.orgCompaniesHouseStep) { + routeSegment(OrgCompaniesHouseStep.ROUTE_SEGMENT) + nextStep { mode -> + when (mode) { + YesOrNo.YES -> journey.orgCompanyNumberStep + YesOrNo.NO -> exitStep + } + } + } + step(journey.orgCompanyNumberStep) { + routeSegment(OrgCompanyNumberStep.ROUTE_SEGMENT) + parents { journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.YES) } + nextStep { exitStep } + } + exitStep { + parents { + OrParents( + journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO), + journey.orgCompanyNumberStep.isComplete(), + ) + } + } + } +} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt index 004ced580a..a0361fec6f 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt @@ -1,7 +1,7 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent -import uk.gov.communities.prsdb.webapp.constants.enums.CharityRegulator +import uk.gov.communities.prsdb.webapp.journeys.AndParents import uk.gov.communities.prsdb.webapp.journeys.Destination import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService @@ -10,18 +10,7 @@ import uk.gov.communities.prsdb.webapp.journeys.hasOutcome import uk.gov.communities.prsdb.webapp.journeys.isComplete import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationOrgLandlordState import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeDobStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeEmailStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeNameStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteePhoneStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgAddressStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberEnglandAndWalesStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberNorthernIrelandStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityNumberScotlandStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityRegisteredWithStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCharityStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompaniesHouseStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompanyNumberStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgEmailStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyDetailsStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep @@ -41,7 +30,6 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.shared.AnyMembers import uk.gov.communities.prsdb.webapp.journeys.shared.YesOrNo import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.GovBodyMemberAddressTask -import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.TrusteeAddressTask import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgGovBodyDetailsMode @@ -54,18 +42,9 @@ class OrgLandlordRegistrationTask( override val orgEmailStep: OrgEmailStep, override val orgPhoneNumberStep: OrgPhoneNumberStep, override val orgTypeStep: OrgTypeStep, - override val orgCompaniesHouseStep: OrgCompaniesHouseStep, - override val orgCompanyNumberStep: OrgCompanyNumberStep, - override val orgCharityStep: OrgCharityStep, - override val orgCharityRegisteredWithStep: OrgCharityRegisteredWithStep, - override val orgCharityNumberEnglandAndWalesStep: OrgCharityNumberEnglandAndWalesStep, - override val orgCharityNumberNorthernIrelandStep: OrgCharityNumberNorthernIrelandStep, - override val orgCharityNumberScotlandStep: OrgCharityNumberScotlandStep, - override val leadTrusteeNameStep: LeadTrusteeNameStep, - override val leadTrusteeEmailStep: LeadTrusteeEmailStep, - override val leadTrusteePhoneStep: LeadTrusteePhoneStep, - override val leadTrusteeDobStep: LeadTrusteeDobStep, - override val trusteeAddressTask: TrusteeAddressTask, + override val leadTrusteeTask: LeadTrusteeTask, + override val charityTask: OrgCharityTask, + override val companiesHouseTask: OrgCompaniesHouseTask, override val orgGovBodyDetailsStep: OrgGovBodyDetailsStep, override val orgGovBodyMustProvideInfoStep: OrgGovBodyMustProvideInfoStep, override val orgGovBodyWhoToProvideStep: OrgGovBodyWhoToProvideStep, @@ -119,103 +98,37 @@ class OrgLandlordRegistrationTask( parents { journey.orgPhoneNumberStep.isComplete() } nextDestination { mode -> when (mode) { - OrgTypeMode.INCLUDES_TRUST -> Destination(journey.leadTrusteeNameStep) - OrgTypeMode.EXCLUDES_TRUST -> Destination(journey.orgCharityStep) + OrgTypeMode.INCLUDES_TRUST -> Destination(journey.leadTrusteeTask.firstStep) + OrgTypeMode.EXCLUDES_TRUST -> Destination(journey.charityTask.firstStep) } } } - step(journey.leadTrusteeNameStep) { - routeSegment(LeadTrusteeNameStep.ROUTE_SEGMENT) + duplicableTask(journey.leadTrusteeTask) { parents { journey.orgTypeStep.hasOutcome(OrgTypeMode.INCLUDES_TRUST) } - nextStep { journey.leadTrusteeDobStep } + nextStep { journey.charityTask.firstStep } } - step(journey.leadTrusteeDobStep) { - routeSegment(LeadTrusteeDobStep.ROUTE_SEGMENT) - parents { journey.leadTrusteeNameStep.isComplete() } - nextStep { journey.leadTrusteeEmailStep } - } - step(journey.leadTrusteeEmailStep) { - routeSegment(LeadTrusteeEmailStep.ROUTE_SEGMENT) - parents { journey.leadTrusteeDobStep.isComplete() } - nextStep { journey.leadTrusteePhoneStep } - } - step(journey.leadTrusteePhoneStep) { - routeSegment(LeadTrusteePhoneStep.ROUTE_SEGMENT) - parents { journey.leadTrusteeEmailStep.isComplete() } - nextStep { journey.trusteeAddressTask.firstStep } - } - duplicableTask(journey.trusteeAddressTask, TrusteeAddressTask.ROUTE_SEGMENT) { - parents { journey.leadTrusteeDobStep.isComplete() } - nextStep { journey.orgCharityStep } - } - step(journey.orgCharityStep) { - routeSegment(OrgCharityStep.ROUTE_SEGMENT) + duplicableTask(journey.charityTask) { parents { OrParents( - journey.trusteeAddressTask.isComplete(), + journey.leadTrusteeTask.isComplete(), journey.orgTypeStep.hasOutcome(OrgTypeMode.EXCLUDES_TRUST), ) } - nextDestination { mode -> - when (mode) { - YesOrNo.YES -> Destination(journey.orgCharityRegisteredWithStep) - YesOrNo.NO -> Destination(journey.orgCompaniesHouseStep) - } - } - } - step(journey.orgCharityRegisteredWithStep) { - routeSegment(OrgCharityRegisteredWithStep.ROUTE_SEGMENT) - parents { journey.orgCharityStep.hasOutcome(YesOrNo.YES) } - nextDestination { mode -> - when (mode) { - CharityRegulator.ENGLAND_AND_WALES -> Destination(journey.orgCharityNumberEnglandAndWalesStep) - CharityRegulator.NORTHERN_IRELAND -> Destination(journey.orgCharityNumberNorthernIrelandStep) - CharityRegulator.SCOTLAND -> Destination(journey.orgCharityNumberScotlandStep) - CharityRegulator.NONE -> Destination(journey.orgCompaniesHouseStep) - } - } + nextStep { journey.companiesHouseTask.firstStep } } - step(journey.orgCharityNumberEnglandAndWalesStep) { - routeSegment(OrgCharityNumberEnglandAndWalesStep.ROUTE_SEGMENT) - parents { journey.orgCharityRegisteredWithStep.hasOutcome(CharityRegulator.ENGLAND_AND_WALES) } - nextStep { journey.orgCompaniesHouseStep } - } - step(journey.orgCharityNumberNorthernIrelandStep) { - routeSegment(OrgCharityNumberNorthernIrelandStep.ROUTE_SEGMENT) - parents { journey.orgCharityRegisteredWithStep.hasOutcome(CharityRegulator.NORTHERN_IRELAND) } - nextStep { journey.orgCompaniesHouseStep } - } - step(journey.orgCharityNumberScotlandStep) { - routeSegment(OrgCharityNumberScotlandStep.ROUTE_SEGMENT) - parents { journey.orgCharityRegisteredWithStep.hasOutcome(CharityRegulator.SCOTLAND) } - nextStep { journey.orgCompaniesHouseStep } - } - step(journey.orgCompaniesHouseStep) { - routeSegment(OrgCompaniesHouseStep.ROUTE_SEGMENT) - parents { - OrParents( - journey.orgCharityStep.hasOutcome(YesOrNo.NO), - journey.orgCharityRegisteredWithStep.hasOutcome(CharityRegulator.NONE), - journey.orgCharityNumberEnglandAndWalesStep.isComplete(), - journey.orgCharityNumberNorthernIrelandStep.isComplete(), - journey.orgCharityNumberScotlandStep.isComplete(), - ) - } - nextDestination { mode -> - when (mode) { - YesOrNo.YES -> Destination(journey.orgCompanyNumberStep) - YesOrNo.NO -> Destination(journey.orgGovBodyDetailsStep) + duplicableTask(journey.companiesHouseTask) { + parents { journey.charityTask.isComplete() } + nextDestination { + if (journey.companiesHouseTask.orgCompaniesHouseStep.outcome == YesOrNo.NO) { + Destination(journey.orgGovBodyDetailsStep) + } else { + Destination(journey.orgMainContactStep) } } } - step(journey.orgCompanyNumberStep) { - routeSegment(OrgCompanyNumberStep.ROUTE_SEGMENT) - parents { journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.YES) } - nextStep { journey.orgMainContactStep } - } step(journey.orgGovBodyDetailsStep) { routeSegment(OrgGovBodyDetailsStep.ROUTE_SEGMENT) - parents { journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO) } + parents { journey.companiesHouseTask.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO) } nextDestination { mode -> when (mode) { OrgGovBodyDetailsMode.HAS_DETAILS -> Destination(journey.hasAnyGovBodyMembersStep) @@ -298,7 +211,10 @@ class OrgLandlordRegistrationTask( routeSegment(OrgMainContactStep.ROUTE_SEGMENT) parents { OrParents( - journey.orgCompanyNumberStep.isComplete(), + AndParents( + journey.companiesHouseTask.isComplete(), + journey.companiesHouseTask.orgCompaniesHouseStep.hasOutcome(YesOrNo.YES), + ), journey.orgGovBodyMemberListStep.isComplete(), ) } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/shared/states/CheckYourAnswersJourneyState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/shared/states/CheckYourAnswersJourneyState.kt index d1fc83410b..e5bf941b86 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/shared/states/CheckYourAnswersJourneyState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/shared/states/CheckYourAnswersJourneyState.kt @@ -17,6 +17,10 @@ interface CheckYourAnswersJourneyState : JourneyState { val finishCyaStep: FinishCyaJourneyStep val cyaStep: JourneyStep.RequestableStep<*, *, *> + // The CYA step that "Change" links should return to. Defaults to cyaStep; journeys with more than one CYA page + // (e.g. organisation vs individual landlord registration) override this to return to the page currently in use. + val activeCyaStep: JourneyStep.RequestableStep<*, *, *> get() = cyaStep + var originalJourneyUpdated: Instant? var cyaJourneys: Map @@ -59,7 +63,7 @@ interface CheckYourAnswersJourneyState : JourneyState { val cyaJourneyId = generateJourneyId("$baseJourneyId-$urlPath") val childJourney = createChildJourneyState(cyaJourneyId) childJourney.checkingAnswersFor = urlPath - childJourney.returnToCyaPageDestination = Destination.VisitableStep(cyaStep, baseJourneyId) + childJourney.returnToCyaPageDestination = Destination.VisitableStep(activeCyaStep, baseJourneyId) childJourney.originalJourneyUpdated = journeyMetadata.lastUpdated return (urlPath to cyaJourneyId) diff --git a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/LandlordRegistrationJourneyTests.kt b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/LandlordRegistrationJourneyTests.kt index 5b0868946e..9248f9b596 100644 --- a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/LandlordRegistrationJourneyTests.kt +++ b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/LandlordRegistrationJourneyTests.kt @@ -357,6 +357,82 @@ class LandlordRegistrationJourneyTests : IntegrationTestWithMutableData("data-mo assertPageIs(page, OrgCharityFormPageLandlordRegistration::class) } + @Test + fun `The organisation name change link returns to the org check answers page with the updated value`(page: Page) { + featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION) + + val checkAnswersPage = navigator.skipToLandlordRegistrationOrgCheckAnswersPage() + checkAnswersPage.landlordDetails.organisationNameRow.clickNamedActionLinkAndWait("Change") + + val orgNamePage = assertPageIs(page, OrgNameFormPageLandlordRegistration::class) + orgNamePage.submitName("Updated Organisation Name") + + val updatedCheckAnswersPage = assertPageIs(page, OrgCheckAnswersPageLandlordRegistration::class) + assertThat(updatedCheckAnswersPage.landlordDetails.organisationNameRow).containsText("Updated Organisation Name") + } + + @Test + fun `The landlord type change link returns to the org check answers page when the organisation type is kept`(page: Page) { + featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION) + + val checkAnswersPage = navigator.skipToLandlordRegistrationOrgCheckAnswersPage() + checkAnswersPage.landlordDetails.landlordTypeRow.clickNamedActionLinkAndWait("Change") + + val landlordTypePage = assertPageIs(page, LandlordTypeFormPageLandlordRegistration::class) + landlordTypePage.submitOrganisation() + + assertPageIs(page, OrgCheckAnswersPageLandlordRegistration::class) + } + + @Test + fun `The registered charity change link re-walks the charity questions and returns to the org check answers page`(page: Page) { + featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION) + + val checkAnswersPage = navigator.skipToLandlordRegistrationOrgCheckAnswersPage() + checkAnswersPage.landlordDetails.registeredCharityRow.clickNamedActionLinkAndWait("Change") + + val orgCharityPage = assertPageIs(page, OrgCharityFormPageLandlordRegistration::class) + orgCharityPage.submitYes() + + val orgCharityRegisteredWithPage = assertPageIs(page, OrgCharityRegisteredWithFormPageLandlordRegistration::class) + orgCharityRegisteredWithPage.submitCharityRegisteredWith(CharityRegulator.ENGLAND_AND_WALES) + + val orgCharityNumberPage = assertPageIs(page, OrgCharityNumberEnglandAndWalesFormPageLandlordRegistration::class) + orgCharityNumberPage.submitCharityNumber("1234567") + + val updatedCheckAnswersPage = assertPageIs(page, OrgCheckAnswersPageLandlordRegistration::class) + assertThat(updatedCheckAnswersPage.landlordDetails.charityNumberRow).containsText("1234567") + } + + @Test + fun `The lead trustee card change link re-walks the trustee section and returns to the org check answers page`(page: Page) { + featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION) + + val checkAnswersPage = navigator.skipToLandlordRegistrationOrgCheckAnswersPage() + checkAnswersPage.leadTrusteeCard.getAction("Change").link.clickAndWait() + + val leadTrusteeNamePage = assertPageIs(page, LeadTrusteeNameFormPageLandlordRegistration::class) + leadTrusteeNamePage.submitName("Updated Lead Trustee Name") + + val leadTrusteeDobPage = assertPageIs(page, LeadTrusteeDobFormPageLandlordRegistration::class) + leadTrusteeDobPage.submitDate("15", "6", "1980") + + val leadTrusteeEmailPage = assertPageIs(page, LeadTrusteeEmailFormPageLandlordRegistration::class) + leadTrusteeEmailPage.submitEmail("trustee@test.com") + + val leadTrusteePhonePage = assertPageIs(page, LeadTrusteePhoneFormPageLandlordRegistration::class) + leadTrusteePhonePage.submitPhoneNumber("07123456789") + + val leadTrusteeLookupAddressPage = assertPageIs(page, LeadTrusteeAddressFormPageLandlordRegistration::class) + leadTrusteeLookupAddressPage.submitPostcodeAndBuildingNameOrNumber("EG1 2AA", "1") + + val leadTrusteeSelectAddressPage = + assertPageIs(page, LeadTrusteeSelectAddressFormPageLandlordRegistration::class) + leadTrusteeSelectAddressPage.selectAddressAndSubmit("1 PRSDB Square, EG1 2AA") + + assertPageIs(page, OrgCheckAnswersPageLandlordRegistration::class) + } + @Test fun `Selecting no on companies house skips the company number question and goes to the governing body journey`(page: Page) { featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION) diff --git a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/Navigator.kt b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/Navigator.kt index d6991fa4f0..c05cd02b60 100644 --- a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/Navigator.kt +++ b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/Navigator.kt @@ -346,6 +346,12 @@ class Navigator( return createValidPage(page, OrgCompanyNumberFormPageLandlordRegistration::class) } + fun skipToLandlordRegistrationOrgCheckAnswersPage(): OrgCheckAnswersPageLandlordRegistration { + setJourneyStateInSession(LandlordStateSessionBuilder.beforeOrgCheckAnswers().build()) + navigateToLandlordRegistrationJourneyStep(OrgLandlordRegistrationCyaStep.ROUTE_SEGMENT) + return createValidPage(page, OrgCheckAnswersPageLandlordRegistration::class) + } + fun goToLandlordRegistrationPrivacyNoticePage(): PrivacyNoticePageLandlordRegistration { navigate("$LANDLORD_REGISTRATION_ROUTE/${PrivacyNoticeStep.ROUTE_SEGMENT}") return createValidPage(page, PrivacyNoticePageLandlordRegistration::class) From d290cbd077939bf195dde2240bdf39e81ae96b4b Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Fri, 24 Jul 2026 12:21:24 +0100 Subject: [PATCH 02/17] PDJB-1168: recombine cyas --- .../states/LandlordRegistrationState.kt | 6 +- ...vidualLandlordRegistrationCyaStepConfig.kt | 145 ---------- ...t => LandlordRegistrationCyaStepConfig.kt} | 248 +++++++++++++----- .../tasks/LandlordRegistrationTask.kt | 31 +-- .../states/CheckYourAnswersJourneyState.kt | 6 +- .../integration/pageObjects/Navigator.kt | 5 +- ...OrgCheckAnswersPageLandlordRegistration.kt | 4 +- 7 files changed, 205 insertions(+), 240 deletions(-) delete mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/IndividualLandlordRegistrationCyaStepConfig.kt rename src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/{OrgLandlordRegistrationCyaStepConfig.kt => LandlordRegistrationCyaStepConfig.kt} (71%) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationState.kt index cc58f2cb87..8d51ce1808 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationState.kt @@ -1,8 +1,7 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.IndividualLandlordRegistrationCyaStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LandlordRegistrationCyaStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LandlordTypeStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgLandlordRegistrationCyaStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.PrivacyNoticeStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.IdentityTask import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.IndividualLandlordRegistrationTask @@ -18,6 +17,5 @@ interface LandlordRegistrationState : val privacyNoticeStep: PrivacyNoticeStep val identityTask: IdentityTask override val finishCyaStep: FinishCyaJourneyStep - override val cyaStep: IndividualLandlordRegistrationCyaStep - val orgCyaStep: OrgLandlordRegistrationCyaStep + override val cyaStep: LandlordRegistrationCyaStep } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/IndividualLandlordRegistrationCyaStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/IndividualLandlordRegistrationCyaStepConfig.kt deleted file mode 100644 index c2bf0c7945..0000000000 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/IndividualLandlordRegistrationCyaStepConfig.kt +++ /dev/null @@ -1,145 +0,0 @@ -package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig - -import org.springframework.security.core.context.SecurityContextHolder -import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent -import uk.gov.communities.prsdb.webapp.constants.ENGLAND_OR_WALES -import uk.gov.communities.prsdb.webapp.exceptions.NotNullFormModelValueIsNullException.Companion.notNullValue -import uk.gov.communities.prsdb.webapp.journeys.Destination -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationState -import uk.gov.communities.prsdb.webapp.journeys.shared.stepConfig.AbstractCheckYourAnswersStep -import uk.gov.communities.prsdb.webapp.journeys.shared.stepConfig.AbstractCheckYourAnswersStepConfig -import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.CountryOfResidenceFormModel -import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.EmailFormModel -import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.PhoneNumberFormModel -import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.PrivacyNoticeFormModel -import uk.gov.communities.prsdb.webapp.models.viewModels.summaryModels.SummaryListRowViewModel -import uk.gov.communities.prsdb.webapp.services.LandlordRegistrationService -import uk.gov.communities.prsdb.webapp.services.SecurityContextService - -@JourneyFrameworkComponent -class IndividualLandlordRegistrationCyaStepConfig( - private val landlordRegistrationService: LandlordRegistrationService, - private val securityContextService: SecurityContextService, -) : AbstractCheckYourAnswersStepConfig() { - override fun getStepSpecificContent(state: LandlordRegistrationState): Map = - mapOf( - "summaryName" to "registerAsALandlord.checkAnswers.summaryName", - "showWarning" to true, - "submitButtonText" to "forms.buttons.confirmAndContinue", - "insetText" to false, - "summaryListData" to getSummaryList(state), - ) - - override fun afterStepDataIsAdded(state: LandlordRegistrationState) { - landlordRegistrationService.registerIndividualLandlord( - baseUserId = SecurityContextHolder.getContext().authentication.name, - name = state.identityTask.getName(), - email = - state.individualLandlordRegistrationTask.emailStep.formModel - .notNullValue(EmailFormModel::emailAddress), - phoneNumber = - state.individualLandlordRegistrationTask.phoneNumberStep.formModel.notNullValue( - PhoneNumberFormModel::phoneNumber, - ), - address = state.individualLandlordRegistrationTask.addressTask.getAddress(), - countryOfResidence = ENGLAND_OR_WALES, - isVerified = state.identityTask.getIsIdentityVerified(), - hasAcceptedPrivacyNotice = state.privacyNoticeStep.formModel.notNullValue(PrivacyNoticeFormModel::agreesToPrivacyNotice), - nonEnglandOrWalesAddress = null, - dateOfBirth = state.identityTask.getDateOfBirth(), - ) - - securityContextService.refreshContext() - } - - // Overrides AbstractCheckYourAnswersStepConfig, which deleted the journey - // We don't want to delete the journey at this stage when this page is included within another journey, - // such as accepting a joint landlord invitation - override fun resolveNextDestination( - state: LandlordRegistrationState, - defaultDestination: Destination, - ): Destination = defaultDestination - - private fun getSummaryList(state: LandlordRegistrationState) = - getIdentityRows(state) + - getEmailAndPhoneRows(state) + - getAddressRows(state) - - private fun getIdentityRows(state: LandlordRegistrationState): List { - val isIdentityVerified = state.identityTask.getIsIdentityVerified() - return listOf( - SummaryListRowViewModel.forCheckYourAnswersPage( - "registerAsALandlord.checkAnswers.rowHeading.name", - state.identityTask.getName(), - if (isIdentityVerified) { - Destination.Nowhere() - } else { - Destination.VisitableStep(state.identityTask.nameStep, state.getCyaJourneyId(state.identityTask.nameStep)) - }, - ), - SummaryListRowViewModel.forCheckYourAnswersPage( - "registerAsALandlord.checkAnswers.rowHeading.dateOfBirth", - state.identityTask.getDateOfBirth(), - if (isIdentityVerified) { - Destination.Nowhere() - } else { - Destination.VisitableStep( - state.identityTask.dateOfBirthStep, - state.getCyaJourneyId(state.identityTask.dateOfBirthStep), - ) - }, - ), - ) - } - - private fun getEmailAndPhoneRows(state: LandlordRegistrationState): List = - listOf( - SummaryListRowViewModel.forCheckYourAnswersPage( - "registerAsALandlord.checkAnswers.rowHeading.email", - state.individualLandlordRegistrationTask.emailStep.formModel - .notNullValue(EmailFormModel::emailAddress), - Destination.VisitableStep( - state.individualLandlordRegistrationTask.emailStep, - state.getCyaJourneyId(state.individualLandlordRegistrationTask.emailStep), - ), - ), - SummaryListRowViewModel.forCheckYourAnswersPage( - "registerAsALandlord.checkAnswers.rowHeading.telephoneNumber", - state.individualLandlordRegistrationTask.phoneNumberStep.formModel - .notNullValue(PhoneNumberFormModel::phoneNumber), - Destination.VisitableStep( - state.individualLandlordRegistrationTask.phoneNumberStep, - state.getCyaJourneyId(state.individualLandlordRegistrationTask.phoneNumberStep), - ), - ), - ) - - private fun getAddressRows(state: LandlordRegistrationState): List = - listOf( - SummaryListRowViewModel.forCheckYourAnswersPage( - "registerAsALandlord.checkAnswers.rowHeading.englandOrWalesResident", - state.individualLandlordRegistrationTask.countryOfResidenceStep.formModel.notNullValue( - CountryOfResidenceFormModel::livesInEnglandOrWales, - ), - Destination.VisitableStep( - state.individualLandlordRegistrationTask.countryOfResidenceStep, - state.getCyaJourneyId(state.individualLandlordRegistrationTask.countryOfResidenceStep), - ), - ), - SummaryListRowViewModel.forCheckYourAnswersPage( - "registerAsALandlord.checkAnswers.rowHeading.contactAddress", - state.individualLandlordRegistrationTask.addressTask - .getAddress() - .singleLineAddress, - Destination.VisitableStep( - state.individualLandlordRegistrationTask.addressTask.lookupAddressStep, - state.getCyaJourneyId(state.individualLandlordRegistrationTask.addressTask.lookupAddressStep), - ), - ), - ) -} - -@JourneyFrameworkComponent -final class IndividualLandlordRegistrationCyaStep( - stepConfig: IndividualLandlordRegistrationCyaStepConfig, -) : AbstractCheckYourAnswersStep(stepConfig) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgLandlordRegistrationCyaStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt similarity index 71% rename from src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgLandlordRegistrationCyaStepConfig.kt rename to src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt index 123b87c11d..4eba8c9508 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgLandlordRegistrationCyaStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt @@ -2,6 +2,7 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig import org.springframework.security.core.context.SecurityContextHolder import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent +import uk.gov.communities.prsdb.webapp.constants.ENGLAND_OR_WALES import uk.gov.communities.prsdb.webapp.constants.enums.CharityRegulator import uk.gov.communities.prsdb.webapp.constants.enums.GoverningBodyMemberType import uk.gov.communities.prsdb.webapp.constants.enums.OrgType @@ -11,6 +12,7 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.Land import uk.gov.communities.prsdb.webapp.journeys.shared.stepConfig.AbstractCheckYourAnswersStep import uk.gov.communities.prsdb.webapp.journeys.shared.stepConfig.AbstractCheckYourAnswersStepConfig import uk.gov.communities.prsdb.webapp.models.dataModels.AddressDataModel +import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.CountryOfResidenceFormModel import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.EmailFormModel import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.LeadTrusteeEmailFormModel import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.LeadTrusteeNameFormModel @@ -25,6 +27,8 @@ import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgCompan import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgMainContactFormModel import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgNameFormModel import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgPhoneNumberFormModel +import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.PhoneNumberFormModel +import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.PrivacyNoticeFormModel import uk.gov.communities.prsdb.webapp.models.viewModels.summaryModels.SummaryCardActionViewModel import uk.gov.communities.prsdb.webapp.models.viewModels.summaryModels.SummaryCardViewModel import uk.gov.communities.prsdb.webapp.models.viewModels.summaryModels.SummaryListRowActionsViewModel @@ -33,69 +37,94 @@ import uk.gov.communities.prsdb.webapp.services.LandlordRegistrationService import uk.gov.communities.prsdb.webapp.services.SecurityContextService @JourneyFrameworkComponent -class OrgLandlordRegistrationCyaStepConfig( +class LandlordRegistrationCyaStepConfig( private val landlordRegistrationService: LandlordRegistrationService, private val securityContextService: SecurityContextService, ) : AbstractCheckYourAnswersStepConfig() { - override fun chooseTemplate(state: LandlordRegistrationState) = "forms/orgLandlordRegistrationCheckAnswersForm" + override fun chooseTemplate(state: LandlordRegistrationState) = + if (isOrgLandlord(state)) { + "forms/orgLandlordRegistrationCheckAnswersForm" + } else { + "forms/checkAnswersForm" + } override fun getStepSpecificContent(state: LandlordRegistrationState): Map = - mapOf( - "title" to "registerAsALandlord.title", - "submitButtonText" to "registerAsALandlord.orgCheckAnswers.submitButton", - "yourDetailsCard" to getYourDetailsCard(state), - "landlordDetails" to getLandlordDetailsRows(state), - "governingBodyMemberCards" to (listOfNotNull(getLeadTrusteeCard(state)) + getGovBodyMemberCards(state)), - "mainContactCard" to getMainContactCard(state), - ) + if (isOrgLandlord(state)) { + getOrgStepContent(state) + } else { + getIndividualStepContent(state) + } override fun afterStepDataIsAdded(state: LandlordRegistrationState) { - val org = state.orgLandlordRegistrationTask - - val organisationTypes = org.orgTypeStep.formModel.getSelectedOrgTypes() - val isTrust = OrgType.TRUST in organisationTypes - val isRegisteredCharity = org.orgCharityStep.formModel.notNullValue(OrgCharityFormModel::charity) - val hasCompanyNumber = org.orgCompaniesHouseStep.formModel.notNullValue(OrgCompaniesHouseFormModel::companiesHouse) - - val charityRegulator = if (isRegisteredCharity) org.orgCharityRegisteredWithStep.formModel.charityRegisteredWith else null - - val mainContact = org.orgMainContactStep.formModel + if (isOrgLandlord(state)) { + val org = state.orgLandlordRegistrationTask + + val organisationTypes = org.orgTypeStep.formModel.getSelectedOrgTypes() + val isTrust = OrgType.TRUST in organisationTypes + val isRegisteredCharity = org.orgCharityStep.formModel.notNullValue(OrgCharityFormModel::charity) + val hasCompanyNumber = org.orgCompaniesHouseStep.formModel.notNullValue(OrgCompaniesHouseFormModel::companiesHouse) + + val charityRegulator = if (isRegisteredCharity) org.orgCharityRegisteredWithStep.formModel.charityRegisteredWith else null + + val mainContact = org.orgMainContactStep.formModel + + val governingBodyMembers = + (org.governingBodyMembersMap ?: emptyMap()) + .values + .toList() + + landlordRegistrationService.registerOrganisationLandlord( + baseUserId = SecurityContextHolder.getContext().authentication.name, + organisationTypes = organisationTypes, + organisationHasCompanyNumber = hasCompanyNumber, + orgIsRegisteredCharity = isRegisteredCharity, + organisationName = org.orgNameStep.formModel.notNullValue(OrgNameFormModel::orgName), + organisationAddress = getOrgAddress(org.orgAddressStep.formModel), + organisationEmail = org.orgEmailStep.formModel.notNullValue(EmailFormModel::emailAddress), + organisationPhoneNumber = org.orgPhoneNumberStep.formModel.notNullValue(OrgPhoneNumberFormModel::phoneNumber), + organisationCompanyNumber = + if (hasCompanyNumber) org.orgCompanyNumberStep.formModel.notNullValue(OrgCompanyNumberFormModel::companyNumber) else null, + organisationCharityRegisteredWith = charityRegulator, + organisationCharityNumber = getCharityNumber(state, charityRegulator), + organisationLeadTrusteeName = + if (isTrust) org.leadTrusteeNameStep.formModel.notNullValue(LeadTrusteeNameFormModel::name) else null, + organisationLeadTrusteeDateOfBirth = if (isTrust) org.leadTrusteeDobStep.formModel.toLocalDateOrNull() else null, + organisationLeadTrusteeEmail = + if (isTrust) org.leadTrusteeEmailStep.formModel.notNullValue(LeadTrusteeEmailFormModel::emailAddress) else null, + organisationLeadTrusteePhoneNumber = + if (isTrust) org.leadTrusteePhoneStep.formModel.notNullValue(LeadTrusteePhoneFormModel::phoneNumber) else null, + organisationLeadTrusteeAddress = if (isTrust) org.trusteeAddressTask.getAddress() else null, + organisationMainContactName = mainContact.notNullValue(OrgMainContactFormModel::name), + organisationMainContactEmail = mainContact.notNullValue(OrgMainContactFormModel::emailAddress), + organisationMainContactPhoneNumber = mainContact.notNullValue(OrgMainContactFormModel::phoneNumber), + organisationRegistrantName = state.identityTask.getName(), + organisationRegistrantDateOfBirth = state.identityTask.getDateOfBirth(), + // TODO: PDJB-1282 - replace with real registrant email and phone once those steps exist + organisationRegistrantEmail = "", + organisationRegistrantPhoneNumber = "", + organisationGoverningBodyMembers = governingBodyMembers, + ) - val governingBodyMembers = - (org.governingBodyMembersMap ?: emptyMap()) - .values - .toList() + securityContextService.refreshContext() + return + } - landlordRegistrationService.registerOrganisationLandlord( + landlordRegistrationService.registerIndividualLandlord( baseUserId = SecurityContextHolder.getContext().authentication.name, - organisationTypes = organisationTypes, - organisationHasCompanyNumber = hasCompanyNumber, - orgIsRegisteredCharity = isRegisteredCharity, - organisationName = org.orgNameStep.formModel.notNullValue(OrgNameFormModel::orgName), - organisationAddress = getOrgAddress(org.orgAddressStep.formModel), - organisationEmail = org.orgEmailStep.formModel.notNullValue(EmailFormModel::emailAddress), - organisationPhoneNumber = org.orgPhoneNumberStep.formModel.notNullValue(OrgPhoneNumberFormModel::phoneNumber), - organisationCompanyNumber = - if (hasCompanyNumber) org.orgCompanyNumberStep.formModel.notNullValue(OrgCompanyNumberFormModel::companyNumber) else null, - organisationCharityRegisteredWith = charityRegulator, - organisationCharityNumber = getCharityNumber(state, charityRegulator), - organisationLeadTrusteeName = - if (isTrust) org.leadTrusteeNameStep.formModel.notNullValue(LeadTrusteeNameFormModel::name) else null, - organisationLeadTrusteeDateOfBirth = if (isTrust) org.leadTrusteeDobStep.formModel.toLocalDateOrNull() else null, - organisationLeadTrusteeEmail = - if (isTrust) org.leadTrusteeEmailStep.formModel.notNullValue(LeadTrusteeEmailFormModel::emailAddress) else null, - organisationLeadTrusteePhoneNumber = - if (isTrust) org.leadTrusteePhoneStep.formModel.notNullValue(LeadTrusteePhoneFormModel::phoneNumber) else null, - organisationLeadTrusteeAddress = if (isTrust) org.trusteeAddressTask.getAddress() else null, - organisationMainContactName = mainContact.notNullValue(OrgMainContactFormModel::name), - organisationMainContactEmail = mainContact.notNullValue(OrgMainContactFormModel::emailAddress), - organisationMainContactPhoneNumber = mainContact.notNullValue(OrgMainContactFormModel::phoneNumber), - organisationRegistrantName = state.identityTask.getName(), - organisationRegistrantDateOfBirth = state.identityTask.getDateOfBirth(), - // TODO: PDJB-1282 - replace with real registrant email and phone once those steps exist - organisationRegistrantEmail = "", - organisationRegistrantPhoneNumber = "", - organisationGoverningBodyMembers = governingBodyMembers, + name = state.identityTask.getName(), + email = + state.individualLandlordRegistrationTask.emailStep.formModel + .notNullValue(EmailFormModel::emailAddress), + phoneNumber = + state.individualLandlordRegistrationTask.phoneNumberStep.formModel.notNullValue( + PhoneNumberFormModel::phoneNumber, + ), + address = state.individualLandlordRegistrationTask.addressTask.getAddress(), + countryOfResidence = ENGLAND_OR_WALES, + isVerified = state.identityTask.getIsIdentityVerified(), + hasAcceptedPrivacyNotice = state.privacyNoticeStep.formModel.notNullValue(PrivacyNoticeFormModel::agreesToPrivacyNotice), + nonEnglandOrWalesAddress = null, + dateOfBirth = state.identityTask.getDateOfBirth(), ) securityContextService.refreshContext() @@ -109,6 +138,109 @@ class OrgLandlordRegistrationCyaStepConfig( defaultDestination: Destination, ): Destination = defaultDestination + private fun isOrgLandlord(state: LandlordRegistrationState) = state.landlordTypeStep.outcome == LandlordTypeMode.ORGANISATION + + // Individual landlord content + + private fun getIndividualStepContent(state: LandlordRegistrationState): Map = + mapOf( + "summaryName" to "registerAsALandlord.checkAnswers.summaryName", + "showWarning" to true, + "submitButtonText" to "forms.buttons.confirmAndContinue", + "insetText" to false, + "summaryListData" to getSummaryList(state), + ) + + private fun getSummaryList(state: LandlordRegistrationState) = + getIdentityRows(state) + + getEmailAndPhoneRows(state) + + getAddressRows(state) + + private fun getIdentityRows(state: LandlordRegistrationState): List { + val isIdentityVerified = state.identityTask.getIsIdentityVerified() + return listOf( + SummaryListRowViewModel.forCheckYourAnswersPage( + "registerAsALandlord.checkAnswers.rowHeading.name", + state.identityTask.getName(), + if (isIdentityVerified) { + Destination.Nowhere() + } else { + Destination.VisitableStep(state.identityTask.nameStep, state.getCyaJourneyId(state.identityTask.nameStep)) + }, + ), + SummaryListRowViewModel.forCheckYourAnswersPage( + "registerAsALandlord.checkAnswers.rowHeading.dateOfBirth", + state.identityTask.getDateOfBirth(), + if (isIdentityVerified) { + Destination.Nowhere() + } else { + Destination.VisitableStep( + state.identityTask.dateOfBirthStep, + state.getCyaJourneyId(state.identityTask.dateOfBirthStep), + ) + }, + ), + ) + } + + private fun getEmailAndPhoneRows(state: LandlordRegistrationState): List = + listOf( + SummaryListRowViewModel.forCheckYourAnswersPage( + "registerAsALandlord.checkAnswers.rowHeading.email", + state.individualLandlordRegistrationTask.emailStep.formModel + .notNullValue(EmailFormModel::emailAddress), + Destination.VisitableStep( + state.individualLandlordRegistrationTask.emailStep, + state.getCyaJourneyId(state.individualLandlordRegistrationTask.emailStep), + ), + ), + SummaryListRowViewModel.forCheckYourAnswersPage( + "registerAsALandlord.checkAnswers.rowHeading.telephoneNumber", + state.individualLandlordRegistrationTask.phoneNumberStep.formModel + .notNullValue(PhoneNumberFormModel::phoneNumber), + Destination.VisitableStep( + state.individualLandlordRegistrationTask.phoneNumberStep, + state.getCyaJourneyId(state.individualLandlordRegistrationTask.phoneNumberStep), + ), + ), + ) + + private fun getAddressRows(state: LandlordRegistrationState): List = + listOf( + SummaryListRowViewModel.forCheckYourAnswersPage( + "registerAsALandlord.checkAnswers.rowHeading.englandOrWalesResident", + state.individualLandlordRegistrationTask.countryOfResidenceStep.formModel.notNullValue( + CountryOfResidenceFormModel::livesInEnglandOrWales, + ), + Destination.VisitableStep( + state.individualLandlordRegistrationTask.countryOfResidenceStep, + state.getCyaJourneyId(state.individualLandlordRegistrationTask.countryOfResidenceStep), + ), + ), + SummaryListRowViewModel.forCheckYourAnswersPage( + "registerAsALandlord.checkAnswers.rowHeading.contactAddress", + state.individualLandlordRegistrationTask.addressTask + .getAddress() + .singleLineAddress, + Destination.VisitableStep( + state.individualLandlordRegistrationTask.addressTask.lookupAddressStep, + state.getCyaJourneyId(state.individualLandlordRegistrationTask.addressTask.lookupAddressStep), + ), + ), + ) + + // Organisation landlord content + + private fun getOrgStepContent(state: LandlordRegistrationState): Map = + mapOf( + "title" to "registerAsALandlord.title", + "submitButtonText" to "registerAsALandlord.orgCheckAnswers.submitButton", + "yourDetailsCard" to getYourDetailsCard(state), + "landlordDetails" to getLandlordDetailsRows(state), + "governingBodyMemberCards" to (listOfNotNull(getLeadTrusteeCard(state)) + getGovBodyMemberCards(state)), + "mainContactCard" to getMainContactCard(state), + ) + private fun getYourDetailsCard(state: LandlordRegistrationState): SummaryCardViewModel { // TODO: PDJB-1282 - review this identity-verification branch; whether organisation landlords can be // identity-verified at all (and so whether the name/date-of-birth Change links should ever be suppressed) @@ -511,10 +643,6 @@ class OrgLandlordRegistrationCyaStepConfig( } @JourneyFrameworkComponent -final class OrgLandlordRegistrationCyaStep( - stepConfig: OrgLandlordRegistrationCyaStepConfig, -) : AbstractCheckYourAnswersStep(stepConfig) { - companion object { - const val ROUTE_SEGMENT = "organisation-check-answers" - } -} +final class LandlordRegistrationCyaStep( + stepConfig: LandlordRegistrationCyaStepConfig, +) : AbstractCheckYourAnswersStep(stepConfig) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt index 4b710d17b4..19584c4ed1 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt @@ -18,7 +18,7 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.Land import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.CountryOfResidenceStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.DateOfBirthStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.EmailStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.IndividualLandlordRegistrationCyaStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LandlordRegistrationCyaStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LandlordTypeMode import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LandlordTypeStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.LeadTrusteeNameStep @@ -31,7 +31,6 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompaniesHouseStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompanyNumberStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgEmailStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgLandlordRegistrationCyaStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgMainContactStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgPhoneNumberStep @@ -53,8 +52,7 @@ class LandlordRegistrationTask( override val orgLandlordRegistrationTask: OrgLandlordRegistrationTask, override val landlordTypeStep: LandlordTypeStep, override val privacyNoticeStep: PrivacyNoticeStep, - override val cyaStep: IndividualLandlordRegistrationCyaStep, - override val orgCyaStep: OrgLandlordRegistrationCyaStep, + override val cyaStep: LandlordRegistrationCyaStep, override val finishCyaStep: FinishCyaJourneyStep, journeyStateService: JourneyStateService, override val stateFactory: ObjectFactory, @@ -67,15 +65,6 @@ class LandlordRegistrationTask( override val taskState get() = this - override val activeCyaStep get() = - if (featureFlagManager.checkFeature(ORGANISATION_LANDLORD_REGISTRATION) && - landlordTypeStep.outcome == LandlordTypeMode.ORGANISATION - ) { - orgCyaStep - } else { - cyaStep - } - override fun makeSubJourney(state: LandlordRegistrationState) = if (featureFlagManager.checkFeature(ORGANISATION_LANDLORD_REGISTRATION)) { makeOrgLandlordSubJourney(state) @@ -129,7 +118,7 @@ class LandlordRegistrationTask( } duplicableTask(journey.orgLandlordRegistrationTask) { parents { journey.landlordTypeStep.hasOutcome(LandlordTypeMode.ORGANISATION) } - nextStep { journey.orgCyaStep } + nextStep { journey.cyaStep } } duplicableTask(journey.individualLandlordRegistrationTask) { parents { journey.landlordTypeStep.hasOutcome(LandlordTypeMode.INDIVIDUAL) } @@ -137,16 +126,16 @@ class LandlordRegistrationTask( } step(journey.cyaStep) { routeSegment(AbstractCheckYourAnswersStep.ROUTE_SEGMENT) - parents { journey.individualLandlordRegistrationTask.isComplete() } - nextStep { exitStep } - } - step(journey.orgCyaStep) { - routeSegment(OrgLandlordRegistrationCyaStep.ROUTE_SEGMENT) - parents { journey.orgLandlordRegistrationTask.isComplete() } + parents { + OrParents( + journey.individualLandlordRegistrationTask.isComplete(), + journey.orgLandlordRegistrationTask.isComplete(), + ) + } nextStep { exitStep } } exitStep { - parents { OrParents(journey.cyaStep.isComplete(), journey.orgCyaStep.isComplete()) } + parents { journey.cyaStep.isComplete() } } } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/shared/states/CheckYourAnswersJourneyState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/shared/states/CheckYourAnswersJourneyState.kt index e5bf941b86..d1fc83410b 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/shared/states/CheckYourAnswersJourneyState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/shared/states/CheckYourAnswersJourneyState.kt @@ -17,10 +17,6 @@ interface CheckYourAnswersJourneyState : JourneyState { val finishCyaStep: FinishCyaJourneyStep val cyaStep: JourneyStep.RequestableStep<*, *, *> - // The CYA step that "Change" links should return to. Defaults to cyaStep; journeys with more than one CYA page - // (e.g. organisation vs individual landlord registration) override this to return to the page currently in use. - val activeCyaStep: JourneyStep.RequestableStep<*, *, *> get() = cyaStep - var originalJourneyUpdated: Instant? var cyaJourneys: Map @@ -63,7 +59,7 @@ interface CheckYourAnswersJourneyState : JourneyState { val cyaJourneyId = generateJourneyId("$baseJourneyId-$urlPath") val childJourney = createChildJourneyState(cyaJourneyId) childJourney.checkingAnswersFor = urlPath - childJourney.returnToCyaPageDestination = Destination.VisitableStep(activeCyaStep, baseJourneyId) + childJourney.returnToCyaPageDestination = Destination.VisitableStep(cyaStep, baseJourneyId) childJourney.originalJourneyUpdated = journeyMetadata.lastUpdated return (urlPath to cyaJourneyId) diff --git a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/Navigator.kt b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/Navigator.kt index c05cd02b60..66ef746b83 100644 --- a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/Navigator.kt +++ b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/Navigator.kt @@ -208,7 +208,6 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMustProvideInfoStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyWhoToProvideStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgLandlordRegistrationCyaStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgMainContactStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgPhoneNumberStep @@ -348,7 +347,7 @@ class Navigator( fun skipToLandlordRegistrationOrgCheckAnswersPage(): OrgCheckAnswersPageLandlordRegistration { setJourneyStateInSession(LandlordStateSessionBuilder.beforeOrgCheckAnswers().build()) - navigateToLandlordRegistrationJourneyStep(OrgLandlordRegistrationCyaStep.ROUTE_SEGMENT) + navigateToLandlordRegistrationJourneyStep(AbstractCheckYourAnswersStep.ROUTE_SEGMENT) return createValidPage(page, OrgCheckAnswersPageLandlordRegistration::class) } @@ -473,7 +472,7 @@ class Navigator( stateBuilder: LandlordStateSessionBuilder = LandlordStateSessionBuilder.beforeOrgCheckAnswers(), ): OrgCheckAnswersPageLandlordRegistration { setJourneyStateInSession(stateBuilder.build()) - navigateToLandlordRegistrationJourneyStep(OrgLandlordRegistrationCyaStep.ROUTE_SEGMENT) + navigateToLandlordRegistrationJourneyStep(AbstractCheckYourAnswersStep.ROUTE_SEGMENT) return createValidPage(page, OrgCheckAnswersPageLandlordRegistration::class) } diff --git a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/pages/landlordRegistrationJourneyPages/OrgCheckAnswersPageLandlordRegistration.kt b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/pages/landlordRegistrationJourneyPages/OrgCheckAnswersPageLandlordRegistration.kt index b2ca278e7d..6886a22ae1 100644 --- a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/pages/landlordRegistrationJourneyPages/OrgCheckAnswersPageLandlordRegistration.kt +++ b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/pages/landlordRegistrationJourneyPages/OrgCheckAnswersPageLandlordRegistration.kt @@ -7,13 +7,13 @@ import uk.gov.communities.prsdb.webapp.integration.pageObjects.components.PostFo import uk.gov.communities.prsdb.webapp.integration.pageObjects.components.SummaryCard import uk.gov.communities.prsdb.webapp.integration.pageObjects.components.SummaryList import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.basePages.BasePage -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgLandlordRegistrationCyaStep +import uk.gov.communities.prsdb.webapp.journeys.shared.stepConfig.AbstractCheckYourAnswersStep class OrgCheckAnswersPageLandlordRegistration( page: Page, ) : BasePage( page, - "${RegisterLandlordController.LANDLORD_REGISTRATION_ROUTE}/${OrgLandlordRegistrationCyaStep.ROUTE_SEGMENT}", + "${RegisterLandlordController.LANDLORD_REGISTRATION_ROUTE}/${AbstractCheckYourAnswersStep.ROUTE_SEGMENT}", ) { fun confirmAndSubmit() = form.submit() From 10858314fe3d9ea9a872173ddc1823eec980b5df Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Fri, 24 Jul 2026 13:59:50 +0100 Subject: [PATCH 03/17] PDJB-1168: fix org / individual change link --- .../tasks/LandlordRegistrationTask.kt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt index 19584c4ed1..647b222dc4 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt @@ -179,7 +179,20 @@ class LandlordRegistrationTask( } LandlordTypeStep.ROUTE_SEGMENT -> { - checkAnswerStep(journey.landlordTypeStep, LandlordTypeStep.ROUTE_SEGMENT) + step(journey.landlordTypeStep) { + initialStep() + routeSegment(LandlordTypeStep.ROUTE_SEGMENT) + nextStep { mode -> + when (mode) { + LandlordTypeMode.INDIVIDUAL -> journey.individualLandlordRegistrationTask.firstStep + LandlordTypeMode.ORGANISATION -> journey.finishCyaStep + } + } + } + duplicableTask(journey.individualLandlordRegistrationTask) { + parents { journey.landlordTypeStep.hasOutcome(LandlordTypeMode.INDIVIDUAL) } + nextStep { journey.finishCyaStep } + } } OrgNameStep.ROUTE_SEGMENT -> { From 9c80e75ce82cb1b58ca3b7fd056192bf202875e0 Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Fri, 24 Jul 2026 15:08:49 +0100 Subject: [PATCH 04/17] PDJB-1168: fix companys house CYA --- .../LandlordRegistrationOrgLandlordState.kt | 26 ---- .../states/OrgCompaniesHouseState.kt | 2 + .../states/OrgGovBodyState.kt | 32 +++++ .../HasAnyGovBodyMembersStepConfig.kt | 8 +- .../LandlordRegistrationCyaStepConfig.kt | 13 +- .../OrgGovBodyMemberDobStepConfig.kt | 16 +-- .../OrgGovBodyMemberListStepConfig.kt | 16 +-- .../OrgGovBodyMemberNameStepConfig.kt | 16 +-- .../OrgGovBodyWhoToProvideStepConfig.kt | 16 +-- .../RemoveGovBodyMemberStepConfig.kt | 16 +-- .../stepConfig/SaveGovBodyMemberStepConfig.kt | 10 +- .../SetStateForGovBodyMemberEditStepConfig.kt | 16 +-- .../tasks/LandlordRegistrationTask.kt | 7 + .../tasks/OrgCompaniesHouseTask.kt | 9 +- .../tasks/OrgGovBodyTask.kt | 135 ++++++++++++++++++ .../tasks/OrgLandlordRegistrationTask.kt | 130 +---------------- .../OrgGovBodyMemberListStepConfigTests.kt | 4 +- 17 files changed, 253 insertions(+), 219 deletions(-) create mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyState.kt create mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyTask.kt diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt index 87834daf59..878e566608 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt @@ -1,28 +1,16 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states import uk.gov.communities.prsdb.webapp.journeys.JourneyState -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgAddressStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgEmailStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyDetailsStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberListStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberNameStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMustProvideInfoStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyWhoToProvideStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgMainContactStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgPhoneNumberStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.RemoveGovBodyMemberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SaveGovBodyMemberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SetStateForGovBodyMemberEditStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.YourDetailsStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.LeadTrusteeTask import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgCharityTask import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgCompaniesHouseTask -import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.AddressTask -import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel interface LandlordRegistrationOrgLandlordState : JourneyState { val yourDetailsStep: YourDetailsStep @@ -35,18 +23,4 @@ interface LandlordRegistrationOrgLandlordState : JourneyState { val charityTask: OrgCharityTask val leadTrusteeTask: LeadTrusteeTask val orgMainContactStep: OrgMainContactStep - val orgGovBodyDetailsStep: OrgGovBodyDetailsStep - val orgGovBodyMustProvideInfoStep: OrgGovBodyMustProvideInfoStep - val orgGovBodyWhoToProvideStep: OrgGovBodyWhoToProvideStep - val orgGovBodyMemberNameStep: OrgGovBodyMemberNameStep - val orgGovBodyMemberDobStep: OrgGovBodyMemberDobStep - val govBodyMemberAddressTask: AddressTask - val orgGovBodyMemberListStep: OrgGovBodyMemberListStep - val hasAnyGovBodyMembersStep: HasAnyGovBodyMembersStep - val saveGovBodyMemberStep: SaveGovBodyMemberStep - val setStateForGovBodyMemberEditStep: SetStateForGovBodyMemberEditStep - val removeGovBodyMemberStep: RemoveGovBodyMemberStep - var governingBodyMembersMap: Map? - var nextGoverningBodyMemberId: Int? - var editingGovBodyMemberId: Int? } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt index c613b00890..87bc7df89d 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt @@ -3,8 +3,10 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states import uk.gov.communities.prsdb.webapp.journeys.JourneyState import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompaniesHouseStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompanyNumberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgGovBodyTask interface OrgCompaniesHouseState : JourneyState { val orgCompaniesHouseStep: OrgCompaniesHouseStep val orgCompanyNumberStep: OrgCompanyNumberStep + val orgGovBodyTask: OrgGovBodyTask } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyState.kt new file mode 100644 index 0000000000..721e2ca38d --- /dev/null +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyState.kt @@ -0,0 +1,32 @@ +package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states + +import uk.gov.communities.prsdb.webapp.journeys.JourneyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyDetailsStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberListStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberNameStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMustProvideInfoStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyWhoToProvideStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.RemoveGovBodyMemberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SaveGovBodyMemberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SetStateForGovBodyMemberEditStep +import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.AddressTask +import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel + +interface OrgGovBodyState : JourneyState { + val orgGovBodyDetailsStep: OrgGovBodyDetailsStep + val orgGovBodyMustProvideInfoStep: OrgGovBodyMustProvideInfoStep + val orgGovBodyWhoToProvideStep: OrgGovBodyWhoToProvideStep + val orgGovBodyMemberNameStep: OrgGovBodyMemberNameStep + val orgGovBodyMemberDobStep: OrgGovBodyMemberDobStep + val govBodyMemberAddressTask: AddressTask + val orgGovBodyMemberListStep: OrgGovBodyMemberListStep + val hasAnyGovBodyMembersStep: HasAnyGovBodyMembersStep + val saveGovBodyMemberStep: SaveGovBodyMemberStep + val setStateForGovBodyMemberEditStep: SetStateForGovBodyMemberEditStep + val removeGovBodyMemberStep: RemoveGovBodyMemberStep + var governingBodyMembersMap: Map? + var nextGoverningBodyMemberId: Int? + var editingGovBodyMemberId: Int? +} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/HasAnyGovBodyMembersStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/HasAnyGovBodyMembersStepConfig.kt index db70bf9b7c..e7591b1ff2 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/HasAnyGovBodyMembersStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/HasAnyGovBodyMembersStepConfig.kt @@ -3,16 +3,16 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent import uk.gov.communities.prsdb.webapp.journeys.AbstractInternalStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationOrgLandlordState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.AnyMembers @JourneyFrameworkComponent -class HasAnyGovBodyMembersStepConfig : AbstractInternalStepConfig() { - override fun mode(state: LandlordRegistrationOrgLandlordState) = +class HasAnyGovBodyMembersStepConfig : AbstractInternalStepConfig() { + override fun mode(state: OrgGovBodyState) = if (state.governingBodyMembersMap.isNullOrEmpty()) AnyMembers.NO_MEMBERS else AnyMembers.SOME_MEMBERS } @JourneyFrameworkComponent final class HasAnyGovBodyMembersStep( stepConfig: HasAnyGovBodyMembersStepConfig, -) : JourneyStep.InternalStep(stepConfig) +) : JourneyStep.InternalStep(stepConfig) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt index 4eba8c9508..1efc514cd1 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt @@ -484,7 +484,7 @@ class LandlordRegistrationCyaStepConfig( } private fun getGovBodyMemberCards(state: LandlordRegistrationState): List { - val members = state.orgLandlordRegistrationTask.governingBodyMembersMap ?: emptyMap() + val members = state.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask.governingBodyMembersMap ?: emptyMap() return members .toList() .sortedBy { it.first } @@ -515,8 +515,15 @@ class LandlordRegistrationCyaStepConfig( Destination.Nowhere(), ), ), - // TODO: PDJB-1168 (PR2) - wire this to the real governing-body-member edit round-trip that returns to the CYA page. - actions = listOf(SummaryCardActionViewModel(text = "forms.links.change", url = PLACEHOLDER_CHANGE_URL)), + actions = + SummaryCardActionViewModel.changeAction( + Destination.VisitableStep( + state.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask.orgGovBodyMemberListStep, + state.getCyaJourneyId( + state.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask.orgGovBodyMemberListStep, + ), + ), + ), ) } } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberDobStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberDobStepConfig.kt index a997508937..3d8dd58ea7 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberDobStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberDobStepConfig.kt @@ -4,16 +4,16 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.constants.FORM_MODEL_ATTR_NAME import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationOrgLandlordState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgGovBodyMemberDobFormModel @JourneyFrameworkComponent class OrgGovBodyMemberDobStepConfig : - AbstractRequestableStepConfig() { + AbstractRequestableStepConfig() { override val formModelClass = OrgGovBodyMemberDobFormModel::class - override fun getStepSpecificContent(state: LandlordRegistrationOrgLandlordState) = + override fun getStepSpecificContent(state: OrgGovBodyState) = mapOf( "fieldSetHeading" to "registerAsALandlord.orgGovBodyMemberDob.fieldSetHeading", "fieldSetHint" to "registerAsALandlord.orgGovBodyMemberDob.fieldSetHint", @@ -21,7 +21,7 @@ class OrgGovBodyMemberDobStepConfig : ) override fun resolvePageContent( - state: LandlordRegistrationOrgLandlordState, + state: OrgGovBodyState, defaultContent: Map, ): Map { val formModel = defaultContent[FORM_MODEL_ATTR_NAME] as? OrgGovBodyMemberDobFormModel @@ -35,18 +35,18 @@ class OrgGovBodyMemberDobStepConfig : return defaultContent + (FORM_MODEL_ATTR_NAME to prepopulatedFormModel) } - override fun chooseTemplate(state: LandlordRegistrationOrgLandlordState) = "forms/dateForm" + override fun chooseTemplate(state: OrgGovBodyState) = "forms/dateForm" - override fun mode(state: LandlordRegistrationOrgLandlordState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } + override fun mode(state: OrgGovBodyState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } - private fun getEditingMemberOrNull(state: LandlordRegistrationOrgLandlordState) = + private fun getEditingMemberOrNull(state: OrgGovBodyState) = state.editingGovBodyMemberId?.let { state.governingBodyMembersMap?.get(it) } } @JourneyFrameworkComponent final class OrgGovBodyMemberDobStep( stepConfig: OrgGovBodyMemberDobStepConfig, -) : RequestableStep(stepConfig) { +) : RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "organisation-governing-body-member-dob" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfig.kt index 68a88ff6ea..9ff25dd647 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfig.kt @@ -4,7 +4,7 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.Destination import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationOrgLandlordState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.NoInputFormModel import uk.gov.communities.prsdb.webapp.models.viewModels.summaryModels.SummaryListRowActionsInputWithDestination @@ -14,10 +14,10 @@ import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @JourneyFrameworkComponent class OrgGovBodyMemberListStepConfig( private val urlParameterService: CollectionKeyParameterService, -) : AbstractRequestableStepConfig() { +) : AbstractRequestableStepConfig() { override val formModelClass = NoInputFormModel::class - override fun getStepSpecificContent(state: LandlordRegistrationOrgLandlordState) = + override fun getStepSpecificContent(state: OrgGovBodyState) = mapOf( "addAnotherTitle" to "forms.orgGovBodyMemberList.heading", "optionalAddAnotherTitleParam" to (state.governingBodyMembersMap?.size ?: 0), @@ -29,13 +29,13 @@ class OrgGovBodyMemberListStepConfig( "addAnotherUrl" to Destination(state.orgGovBodyWhoToProvideStep).toUrlStringOrNull(), ) - override fun afterStepIsReached(state: LandlordRegistrationOrgLandlordState) { + override fun afterStepIsReached(state: OrgGovBodyState) { // ensure that if you ever get to this page we reset any state that is used by one of the buttons. // this means we can be certain all the buttons will always work even if you use the browser back buttons. state.editingGovBodyMemberId = null } - private fun getMemberRows(state: LandlordRegistrationOrgLandlordState): List { + private fun getMemberRows(state: OrgGovBodyState): List { val membersMap = state.governingBodyMembersMap ?: emptyMap() return membersMap .toList() @@ -64,15 +64,15 @@ class OrgGovBodyMemberListStepConfig( } } - override fun chooseTemplate(state: LandlordRegistrationOrgLandlordState): String = "forms/addAnotherForm" + override fun chooseTemplate(state: OrgGovBodyState): String = "forms/addAnotherForm" - override fun mode(state: LandlordRegistrationOrgLandlordState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } + override fun mode(state: OrgGovBodyState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } } @JourneyFrameworkComponent final class OrgGovBodyMemberListStep( stepConfig: OrgGovBodyMemberListStepConfig, -) : RequestableStep(stepConfig) { +) : RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "organisation-governing-body-member-list" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberNameStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberNameStepConfig.kt index 3816a558be..2a0eb2f45d 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberNameStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberNameStepConfig.kt @@ -4,23 +4,23 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.constants.FORM_MODEL_ATTR_NAME import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationOrgLandlordState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.GoverningBodyMemberNameFormModel @JourneyFrameworkComponent class OrgGovBodyMemberNameStepConfig : - AbstractRequestableStepConfig() { + AbstractRequestableStepConfig() { override val formModelClass = GoverningBodyMemberNameFormModel::class - override fun getStepSpecificContent(state: LandlordRegistrationOrgLandlordState) = + override fun getStepSpecificContent(state: OrgGovBodyState) = mapOf( "fieldSetHeading" to "forms.orgGovBodyMemberName.fieldSetHeading", "submitButtonText" to "forms.buttons.continue", ) override fun resolvePageContent( - state: LandlordRegistrationOrgLandlordState, + state: OrgGovBodyState, defaultContent: Map, ): Map { val formModel = defaultContent[FORM_MODEL_ATTR_NAME] as? GoverningBodyMemberNameFormModel @@ -32,18 +32,18 @@ class OrgGovBodyMemberNameStepConfig : return defaultContent + (FORM_MODEL_ATTR_NAME to prepopulatedFormModel) } - override fun chooseTemplate(state: LandlordRegistrationOrgLandlordState) = "forms/nameForm" + override fun chooseTemplate(state: OrgGovBodyState) = "forms/nameForm" - override fun mode(state: LandlordRegistrationOrgLandlordState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } + override fun mode(state: OrgGovBodyState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } - private fun getEditingMemberOrNull(state: LandlordRegistrationOrgLandlordState) = + private fun getEditingMemberOrNull(state: OrgGovBodyState) = state.editingGovBodyMemberId?.let { state.governingBodyMembersMap?.get(it) } } @JourneyFrameworkComponent final class OrgGovBodyMemberNameStep( stepConfig: OrgGovBodyMemberNameStepConfig, -) : RequestableStep(stepConfig) { +) : RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "organisation-governing-body-member-name" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyWhoToProvideStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyWhoToProvideStepConfig.kt index 70b872fc88..5ae0d26457 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyWhoToProvideStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyWhoToProvideStepConfig.kt @@ -5,17 +5,17 @@ import uk.gov.communities.prsdb.webapp.constants.FORM_MODEL_ATTR_NAME import uk.gov.communities.prsdb.webapp.constants.enums.GoverningBodyMemberType import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationOrgLandlordState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgGovBodyWhoToProvideFormModel import uk.gov.communities.prsdb.webapp.models.viewModels.formModels.RadiosButtonViewModel @JourneyFrameworkComponent class OrgGovBodyWhoToProvideStepConfig : - AbstractRequestableStepConfig() { + AbstractRequestableStepConfig() { override val formModelClass = OrgGovBodyWhoToProvideFormModel::class - override fun getStepSpecificContent(state: LandlordRegistrationOrgLandlordState) = + override fun getStepSpecificContent(state: OrgGovBodyState) = mapOf( "fieldSetHeading" to "registerAsALandlord.orgGovBodyWhoToProvide.fieldSetHeading", "fieldName" to "whoToProvide", @@ -41,7 +41,7 @@ class OrgGovBodyWhoToProvideStepConfig : ) override fun resolvePageContent( - state: LandlordRegistrationOrgLandlordState, + state: OrgGovBodyState, defaultContent: Map, ): Map { val formModel = defaultContent[FORM_MODEL_ATTR_NAME] as? OrgGovBodyWhoToProvideFormModel @@ -53,21 +53,21 @@ class OrgGovBodyWhoToProvideStepConfig : return defaultContent + (FORM_MODEL_ATTR_NAME to prepopulatedFormModel) } - override fun chooseTemplate(state: LandlordRegistrationOrgLandlordState) = "forms/orgGovBodyWhoToProvideForm" + override fun chooseTemplate(state: OrgGovBodyState) = "forms/orgGovBodyWhoToProvideForm" - override fun mode(state: LandlordRegistrationOrgLandlordState) = + override fun mode(state: OrgGovBodyState) = getFormModelFromStateOrNull( state, )?.whoToProvide?.let { Complete.COMPLETE } - private fun getEditingMemberOrNull(state: LandlordRegistrationOrgLandlordState) = + private fun getEditingMemberOrNull(state: OrgGovBodyState) = state.editingGovBodyMemberId?.let { state.governingBodyMembersMap?.get(it) } } @JourneyFrameworkComponent final class OrgGovBodyWhoToProvideStep( stepConfig: OrgGovBodyWhoToProvideStepConfig, -) : RequestableStep(stepConfig) { +) : RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "organisation-governing-body-who-to-provide" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/RemoveGovBodyMemberStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/RemoveGovBodyMemberStepConfig.kt index 9b40b7591a..65c0f767b4 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/RemoveGovBodyMemberStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/RemoveGovBodyMemberStepConfig.kt @@ -4,7 +4,7 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep import uk.gov.communities.prsdb.webapp.journeys.StepLifecycleOrchestrator.RedirectingStepLifecycleOrchestrator -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationOrgLandlordState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.AnyMembers import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.NoInputFormModel import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @@ -12,36 +12,36 @@ import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @JourneyFrameworkComponent class RemoveGovBodyMemberStepConfig( private val collectionKeyParameterService: CollectionKeyParameterService, -) : AbstractRequestableStepConfig() { +) : AbstractRequestableStepConfig() { override val formModelClass = NoInputFormModel::class override fun getStepLifecycleOrchestrator(journeyStep: JourneyStep<*, *, *>) = RedirectingStepLifecycleOrchestrator(journeyStep) - override fun getStepSpecificContent(state: LandlordRegistrationOrgLandlordState): Map = emptyMap() + override fun getStepSpecificContent(state: OrgGovBodyState): Map = emptyMap() - override fun chooseTemplate(state: LandlordRegistrationOrgLandlordState): String = "" + override fun chooseTemplate(state: OrgGovBodyState): String = "" - override fun beforeAttemptingToReachStep(state: LandlordRegistrationOrgLandlordState): Boolean { + override fun beforeAttemptingToReachStep(state: OrgGovBodyState): Boolean { val keyToRemove = collectionKeyParameterService.getParameterOrNull() val currentMap = state.governingBodyMembersMap ?: emptyMap() return keyToRemove != null && keyToRemove in currentMap.keys } - override fun afterStepIsReached(state: LandlordRegistrationOrgLandlordState) { + override fun afterStepIsReached(state: OrgGovBodyState) { val keyToRemove = collectionKeyParameterService.getParameterOrNull() ?: return val currentMap = state.governingBodyMembersMap?.toMutableMap() ?: return currentMap.remove(keyToRemove) state.governingBodyMembersMap = currentMap } - override fun mode(state: LandlordRegistrationOrgLandlordState): AnyMembers = + override fun mode(state: OrgGovBodyState): AnyMembers = if (state.governingBodyMembersMap.isNullOrEmpty()) AnyMembers.NO_MEMBERS else AnyMembers.SOME_MEMBERS } @JourneyFrameworkComponent final class RemoveGovBodyMemberStep( stepConfig: RemoveGovBodyMemberStepConfig, -) : JourneyStep.RequestableStep(stepConfig) { +) : JourneyStep.RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "remove-governing-body-member" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SaveGovBodyMemberStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SaveGovBodyMemberStepConfig.kt index 6ec0fb55e4..a45794863e 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SaveGovBodyMemberStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SaveGovBodyMemberStepConfig.kt @@ -5,15 +5,15 @@ import uk.gov.communities.prsdb.webapp.exceptions.PrsdbWebException import uk.gov.communities.prsdb.webapp.helpers.DateTimeHelper import uk.gov.communities.prsdb.webapp.journeys.AbstractInternalStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationOrgLandlordState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel @JourneyFrameworkComponent -class SaveGovBodyMemberStepConfig : AbstractInternalStepConfig() { - override fun mode(state: LandlordRegistrationOrgLandlordState): Complete = Complete.COMPLETE +class SaveGovBodyMemberStepConfig : AbstractInternalStepConfig() { + override fun mode(state: OrgGovBodyState): Complete = Complete.COMPLETE - override fun afterStepIsReached(state: LandlordRegistrationOrgLandlordState) { + override fun afterStepIsReached(state: OrgGovBodyState) { val name = state.orgGovBodyMemberNameStep.formModelOrNull?.name ?: throw PrsdbWebException("Governing body member name step data is missing") @@ -63,4 +63,4 @@ class SaveGovBodyMemberStepConfig : AbstractInternalStepConfig(stepConfig) +) : JourneyStep.InternalStep(stepConfig) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SetStateForGovBodyMemberEditStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SetStateForGovBodyMemberEditStepConfig.kt index ca2fde5790..2fce52fc40 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SetStateForGovBodyMemberEditStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SetStateForGovBodyMemberEditStepConfig.kt @@ -4,7 +4,7 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep import uk.gov.communities.prsdb.webapp.journeys.StepLifecycleOrchestrator.RedirectingStepLifecycleOrchestrator -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationOrgLandlordState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.NoInputFormModel import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @@ -12,33 +12,33 @@ import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @JourneyFrameworkComponent class SetStateForGovBodyMemberEditStepConfig( private val collectionKeyParameterService: CollectionKeyParameterService, -) : AbstractRequestableStepConfig() { +) : AbstractRequestableStepConfig() { override val formModelClass = NoInputFormModel::class override fun getStepLifecycleOrchestrator(journeyStep: JourneyStep<*, *, *>) = RedirectingStepLifecycleOrchestrator(journeyStep) - override fun getStepSpecificContent(state: LandlordRegistrationOrgLandlordState): Map = emptyMap() + override fun getStepSpecificContent(state: OrgGovBodyState): Map = emptyMap() - override fun chooseTemplate(state: LandlordRegistrationOrgLandlordState): String = "" + override fun chooseTemplate(state: OrgGovBodyState): String = "" - override fun beforeAttemptingToReachStep(state: LandlordRegistrationOrgLandlordState): Boolean { + override fun beforeAttemptingToReachStep(state: OrgGovBodyState): Boolean { val keyToEdit = collectionKeyParameterService.getParameterOrNull() val currentMap = state.governingBodyMembersMap ?: emptyMap() return keyToEdit != null && keyToEdit in currentMap.keys } - override fun afterStepIsReached(state: LandlordRegistrationOrgLandlordState) { + override fun afterStepIsReached(state: OrgGovBodyState) { val keyToEdit = collectionKeyParameterService.getParameterOrNull() ?: return state.editingGovBodyMemberId = keyToEdit } - override fun mode(state: LandlordRegistrationOrgLandlordState): Complete = Complete.COMPLETE + override fun mode(state: OrgGovBodyState): Complete = Complete.COMPLETE } @JourneyFrameworkComponent final class SetStateForGovBodyMemberEditStep( stepConfig: SetStateForGovBodyMemberEditStepConfig, -) : JourneyStep.RequestableStep(stepConfig) { +) : JourneyStep.RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "load-governing-body-member-for-edit" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt index 647b222dc4..40c9afe746 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt @@ -31,6 +31,7 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompaniesHouseStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompanyNumberStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgEmailStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberListStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgMainContactStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgPhoneNumberStep @@ -234,6 +235,12 @@ class LandlordRegistrationTask( duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.leadTrusteeTask, null) } + OrgGovBodyMemberListStep.ROUTE_SEGMENT -> { + fromTask(journey.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask) { + checkAnswerStep(task.orgGovBodyMemberListStep, OrgGovBodyMemberListStep.ROUTE_SEGMENT) + } + } + OrgMainContactStep.ROUTE_SEGMENT -> { checkAnswerStep(journey.orgLandlordRegistrationTask.orgMainContactStep, OrgMainContactStep.ROUTE_SEGMENT) } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt index bcd50340e7..07b8346199 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt @@ -16,6 +16,7 @@ class OrgCompaniesHouseTask( journeyStateService: JourneyStateService, override val orgCompaniesHouseStep: OrgCompaniesHouseStep, override val orgCompanyNumberStep: OrgCompanyNumberStep, + override val orgGovBodyTask: OrgGovBodyTask, ) : DuplicableTask(journeyStateService), OrgCompaniesHouseState { override val taskState get() = this @@ -27,7 +28,7 @@ class OrgCompaniesHouseTask( nextStep { mode -> when (mode) { YesOrNo.YES -> journey.orgCompanyNumberStep - YesOrNo.NO -> exitStep + YesOrNo.NO -> journey.orgGovBodyTask.firstStep } } } @@ -36,11 +37,15 @@ class OrgCompaniesHouseTask( parents { journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.YES) } nextStep { exitStep } } + duplicableTask(journey.orgGovBodyTask) { + parents { journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO) } + nextStep { exitStep } + } exitStep { parents { OrParents( - journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO), journey.orgCompanyNumberStep.isComplete(), + journey.orgGovBodyTask.isComplete(), ) } } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyTask.kt new file mode 100644 index 0000000000..f652fe6967 --- /dev/null +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyTask.kt @@ -0,0 +1,135 @@ +package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks + +import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent +import uk.gov.communities.prsdb.webapp.journeys.Destination +import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask +import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService +import uk.gov.communities.prsdb.webapp.journeys.hasOutcome +import uk.gov.communities.prsdb.webapp.journeys.isComplete +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyDetailsStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberListStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberNameStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMustProvideInfoStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyWhoToProvideStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.RemoveGovBodyMemberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SaveGovBodyMemberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SetStateForGovBodyMemberEditStep +import uk.gov.communities.prsdb.webapp.journeys.shared.AnyMembers +import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.GovBodyMemberAddressTask +import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel +import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgGovBodyDetailsMode + +@JourneyFrameworkComponent +class OrgGovBodyTask( + journeyStateService: JourneyStateService, + override val orgGovBodyDetailsStep: OrgGovBodyDetailsStep, + override val orgGovBodyMustProvideInfoStep: OrgGovBodyMustProvideInfoStep, + override val orgGovBodyWhoToProvideStep: OrgGovBodyWhoToProvideStep, + override val orgGovBodyMemberNameStep: OrgGovBodyMemberNameStep, + override val orgGovBodyMemberDobStep: OrgGovBodyMemberDobStep, + override val govBodyMemberAddressTask: GovBodyMemberAddressTask, + override val orgGovBodyMemberListStep: OrgGovBodyMemberListStep, + override val hasAnyGovBodyMembersStep: HasAnyGovBodyMembersStep, + override val saveGovBodyMemberStep: SaveGovBodyMemberStep, + override val setStateForGovBodyMemberEditStep: SetStateForGovBodyMemberEditStep, + override val removeGovBodyMemberStep: RemoveGovBodyMemberStep, +) : DuplicableTask(journeyStateService), + OrgGovBodyState { + override val taskState get() = this + + override var governingBodyMembersMap: Map? by delegateProvider.nullableDelegate( + "governingBodyMembersMap", + ) + override var nextGoverningBodyMemberId: Int? by delegateProvider.nullableDelegate("nextGoverningBodyMemberId") + override var editingGovBodyMemberId: Int? by delegateProvider.nullableDelegate("editingGovBodyMemberId") + + override fun makeSubJourney(state: OrgGovBodyState) = + subJourney(state) { + step(journey.orgGovBodyDetailsStep) { + routeSegment(OrgGovBodyDetailsStep.ROUTE_SEGMENT) + nextDestination { mode -> + when (mode) { + OrgGovBodyDetailsMode.HAS_DETAILS -> Destination(journey.hasAnyGovBodyMembersStep) + OrgGovBodyDetailsMode.NO_DETAILS -> Destination(journey.orgGovBodyMustProvideInfoStep) + } + } + } + step(journey.orgGovBodyMustProvideInfoStep) { + routeSegment(OrgGovBodyMustProvideInfoStep.ROUTE_SEGMENT) + parents { journey.orgGovBodyDetailsStep.hasOutcome(OrgGovBodyDetailsMode.NO_DETAILS) } + noNextDestination() + } + step(journey.hasAnyGovBodyMembersStep) { + parents { journey.orgGovBodyDetailsStep.hasOutcome(OrgGovBodyDetailsMode.HAS_DETAILS) } + nextStep { mode -> + when (mode) { + AnyMembers.NO_MEMBERS -> journey.orgGovBodyWhoToProvideStep + AnyMembers.SOME_MEMBERS -> journey.orgGovBodyMemberListStep + } + } + } + step(journey.setStateForGovBodyMemberEditStep) { + routeSegment(SetStateForGovBodyMemberEditStep.ROUTE_SEGMENT) + parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } + nextStep { journey.orgGovBodyWhoToProvideStep } + } + step(journey.removeGovBodyMemberStep) { + routeSegment(RemoveGovBodyMemberStep.ROUTE_SEGMENT) + parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } + nextStep { mode -> + when (mode) { + AnyMembers.SOME_MEMBERS -> journey.orgGovBodyMemberListStep + AnyMembers.NO_MEMBERS -> journey.orgGovBodyDetailsStep + } + } + } + step(journey.orgGovBodyWhoToProvideStep) { + routeSegment(OrgGovBodyWhoToProvideStep.ROUTE_SEGMENT) + parents { journey.orgGovBodyDetailsStep.hasOutcome(OrgGovBodyDetailsMode.HAS_DETAILS) } + backDestination { + if (journey.governingBodyMembersMap.isNullOrEmpty()) { + Destination(journey.orgGovBodyDetailsStep) + } else { + Destination(journey.orgGovBodyMemberListStep) + } + } + nextStep { journey.orgGovBodyMemberNameStep } + } + step(journey.orgGovBodyMemberNameStep) { + routeSegment(OrgGovBodyMemberNameStep.ROUTE_SEGMENT) + parents { journey.orgGovBodyWhoToProvideStep.isComplete() } + nextStep { journey.orgGovBodyMemberDobStep } + } + step(journey.orgGovBodyMemberDobStep) { + routeSegment(OrgGovBodyMemberDobStep.ROUTE_SEGMENT) + parents { journey.orgGovBodyMemberNameStep.isComplete() } + nextStep { journey.govBodyMemberAddressTask.firstStep } + } + duplicableTask(journey.govBodyMemberAddressTask, GovBodyMemberAddressTask.ROUTE_SEGMENT) { + parents { journey.orgGovBodyMemberDobStep.isComplete() } + nextStep { journey.saveGovBodyMemberStep } + } + step(journey.saveGovBodyMemberStep) { + parents { journey.govBodyMemberAddressTask.isComplete() } + nextStep { journey.orgGovBodyMemberListStep } + configureStep(journey.govBodyMemberAddressTask.selectAddressStep) { + withAdditionalContentProperties { + mapOf("fieldSetHeading" to "forms.selectAddress.govBodyMemberRegistration.fieldSetHeading") + } + } + } + step(journey.orgGovBodyMemberListStep) { + routeSegment(OrgGovBodyMemberListStep.ROUTE_SEGMENT) + parents { + journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) + } + nextStep { exitStep } + } + exitStep { + parents { journey.orgGovBodyMemberListStep.isComplete() } + } + } +} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt index a0361fec6f..91fd6f4554 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt @@ -1,7 +1,6 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent -import uk.gov.communities.prsdb.webapp.journeys.AndParents import uk.gov.communities.prsdb.webapp.journeys.Destination import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService @@ -9,29 +8,14 @@ import uk.gov.communities.prsdb.webapp.journeys.OrParents import uk.gov.communities.prsdb.webapp.journeys.hasOutcome import uk.gov.communities.prsdb.webapp.journeys.isComplete import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationOrgLandlordState -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgAddressStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgEmailStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyDetailsStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberListStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberNameStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMustProvideInfoStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyWhoToProvideStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgMainContactStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgPhoneNumberStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeMode import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.RemoveGovBodyMemberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SaveGovBodyMemberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SetStateForGovBodyMemberEditStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.YourDetailsStep -import uk.gov.communities.prsdb.webapp.journeys.shared.AnyMembers -import uk.gov.communities.prsdb.webapp.journeys.shared.YesOrNo -import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.GovBodyMemberAddressTask -import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel -import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgGovBodyDetailsMode @JourneyFrameworkComponent class OrgLandlordRegistrationTask( @@ -45,28 +29,11 @@ class OrgLandlordRegistrationTask( override val leadTrusteeTask: LeadTrusteeTask, override val charityTask: OrgCharityTask, override val companiesHouseTask: OrgCompaniesHouseTask, - override val orgGovBodyDetailsStep: OrgGovBodyDetailsStep, - override val orgGovBodyMustProvideInfoStep: OrgGovBodyMustProvideInfoStep, - override val orgGovBodyWhoToProvideStep: OrgGovBodyWhoToProvideStep, - override val orgGovBodyMemberNameStep: OrgGovBodyMemberNameStep, - override val orgGovBodyMemberDobStep: OrgGovBodyMemberDobStep, - override val govBodyMemberAddressTask: GovBodyMemberAddressTask, - override val orgGovBodyMemberListStep: OrgGovBodyMemberListStep, - override val hasAnyGovBodyMembersStep: HasAnyGovBodyMembersStep, - override val saveGovBodyMemberStep: SaveGovBodyMemberStep, - override val setStateForGovBodyMemberEditStep: SetStateForGovBodyMemberEditStep, - override val removeGovBodyMemberStep: RemoveGovBodyMemberStep, override val orgMainContactStep: OrgMainContactStep, ) : DuplicableTask(journeyStateService), LandlordRegistrationOrgLandlordState { override val taskState get() = this - override var governingBodyMembersMap: Map? by delegateProvider.nullableDelegate( - "governingBodyMembersMap", - ) - override var nextGoverningBodyMemberId: Int? by delegateProvider.nullableDelegate("nextGoverningBodyMemberId") - override var editingGovBodyMemberId: Int? by delegateProvider.nullableDelegate("editingGovBodyMemberId") - override fun makeSubJourney(state: LandlordRegistrationOrgLandlordState) = subJourney(state) { step(journey.yourDetailsStep) { @@ -118,106 +85,11 @@ class OrgLandlordRegistrationTask( } duplicableTask(journey.companiesHouseTask) { parents { journey.charityTask.isComplete() } - nextDestination { - if (journey.companiesHouseTask.orgCompaniesHouseStep.outcome == YesOrNo.NO) { - Destination(journey.orgGovBodyDetailsStep) - } else { - Destination(journey.orgMainContactStep) - } - } - } - step(journey.orgGovBodyDetailsStep) { - routeSegment(OrgGovBodyDetailsStep.ROUTE_SEGMENT) - parents { journey.companiesHouseTask.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO) } - nextDestination { mode -> - when (mode) { - OrgGovBodyDetailsMode.HAS_DETAILS -> Destination(journey.hasAnyGovBodyMembersStep) - OrgGovBodyDetailsMode.NO_DETAILS -> Destination(journey.orgGovBodyMustProvideInfoStep) - } - } - } - step(journey.orgGovBodyMustProvideInfoStep) { - routeSegment(OrgGovBodyMustProvideInfoStep.ROUTE_SEGMENT) - parents { journey.orgGovBodyDetailsStep.hasOutcome(OrgGovBodyDetailsMode.NO_DETAILS) } - noNextDestination() - } - step(journey.hasAnyGovBodyMembersStep) { - parents { journey.orgGovBodyDetailsStep.hasOutcome(OrgGovBodyDetailsMode.HAS_DETAILS) } - nextStep { mode -> - when (mode) { - AnyMembers.NO_MEMBERS -> journey.orgGovBodyWhoToProvideStep - AnyMembers.SOME_MEMBERS -> journey.orgGovBodyMemberListStep - } - } - } - step(journey.setStateForGovBodyMemberEditStep) { - routeSegment(SetStateForGovBodyMemberEditStep.ROUTE_SEGMENT) - parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } - nextStep { journey.orgGovBodyWhoToProvideStep } - } - step(journey.removeGovBodyMemberStep) { - routeSegment(RemoveGovBodyMemberStep.ROUTE_SEGMENT) - parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } - nextStep { mode -> - when (mode) { - AnyMembers.SOME_MEMBERS -> journey.orgGovBodyMemberListStep - AnyMembers.NO_MEMBERS -> journey.orgGovBodyDetailsStep - } - } - } - step(journey.orgGovBodyWhoToProvideStep) { - routeSegment(OrgGovBodyWhoToProvideStep.ROUTE_SEGMENT) - parents { journey.orgGovBodyDetailsStep.hasOutcome(OrgGovBodyDetailsMode.HAS_DETAILS) } - backDestination { - if (journey.governingBodyMembersMap.isNullOrEmpty()) { - Destination(journey.orgGovBodyDetailsStep) - } else { - Destination(journey.orgGovBodyMemberListStep) - } - } - nextStep { journey.orgGovBodyMemberNameStep } - } - step(journey.orgGovBodyMemberNameStep) { - routeSegment(OrgGovBodyMemberNameStep.ROUTE_SEGMENT) - parents { journey.orgGovBodyWhoToProvideStep.isComplete() } - nextStep { journey.orgGovBodyMemberDobStep } - } - step(journey.orgGovBodyMemberDobStep) { - routeSegment(OrgGovBodyMemberDobStep.ROUTE_SEGMENT) - parents { journey.orgGovBodyMemberNameStep.isComplete() } - nextStep { journey.govBodyMemberAddressTask.firstStep } - } - duplicableTask(journey.govBodyMemberAddressTask, GovBodyMemberAddressTask.ROUTE_SEGMENT) { - parents { journey.orgGovBodyMemberDobStep.isComplete() } - nextStep { journey.saveGovBodyMemberStep } - } - step(journey.saveGovBodyMemberStep) { - parents { journey.govBodyMemberAddressTask.isComplete() } - nextStep { journey.orgGovBodyMemberListStep } - configureStep(journey.govBodyMemberAddressTask.selectAddressStep) { - withAdditionalContentProperties { - mapOf("fieldSetHeading" to "forms.selectAddress.govBodyMemberRegistration.fieldSetHeading") - } - } - } - step(journey.orgGovBodyMemberListStep) { - routeSegment(OrgGovBodyMemberListStep.ROUTE_SEGMENT) - parents { - journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) - } nextStep { journey.orgMainContactStep } } step(journey.orgMainContactStep) { routeSegment(OrgMainContactStep.ROUTE_SEGMENT) - parents { - OrParents( - AndParents( - journey.companiesHouseTask.isComplete(), - journey.companiesHouseTask.orgCompaniesHouseStep.hasOutcome(YesOrNo.YES), - ), - journey.orgGovBodyMemberListStep.isComplete(), - ) - } + parents { journey.companiesHouseTask.isComplete() } nextStep { exitStep } } exitStep { diff --git a/src/test/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfigTests.kt b/src/test/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfigTests.kt index c5d8715729..fb2307986e 100644 --- a/src/test/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfigTests.kt +++ b/src/test/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfigTests.kt @@ -5,14 +5,14 @@ import org.junit.jupiter.api.extension.ExtendWith import org.mockito.Mock import org.mockito.junit.jupiter.MockitoExtension import org.mockito.kotlin.verify -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationOrgLandlordState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService import uk.gov.communities.prsdb.webapp.testHelpers.mockObjects.AlwaysTrueValidator @ExtendWith(MockitoExtension::class) class OrgGovBodyMemberListStepConfigTests { @Mock - lateinit var mockState: LandlordRegistrationOrgLandlordState + lateinit var mockState: OrgGovBodyState @Mock lateinit var urlParameterService: CollectionKeyParameterService From aa2d861fed2f885f888189e9feaeee40ff97421c Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Fri, 24 Jul 2026 15:23:39 +0100 Subject: [PATCH 05/17] PDJB-1168: fix gov body member change links --- .../landlordRegistration/tasks/LandlordRegistrationTask.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt index 40c9afe746..d4343a4d2b 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt @@ -236,9 +236,7 @@ class LandlordRegistrationTask( } OrgGovBodyMemberListStep.ROUTE_SEGMENT -> { - fromTask(journey.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask) { - checkAnswerStep(task.orgGovBodyMemberListStep, OrgGovBodyMemberListStep.ROUTE_SEGMENT) - } + duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask, null) } OrgMainContactStep.ROUTE_SEGMENT -> { From 4aa19dac1e8aa7da2fb9bf6a47321a69b4099ece Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Wed, 29 Jul 2026 09:33:56 +0100 Subject: [PATCH 06/17] PDJB-1168: rebase fixes --- .../LandlordRegistrationCyaStepConfig.kt | 49 ++++++++++++++----- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt index 1efc514cd1..0994068b40 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt @@ -61,15 +61,19 @@ class LandlordRegistrationCyaStepConfig( val organisationTypes = org.orgTypeStep.formModel.getSelectedOrgTypes() val isTrust = OrgType.TRUST in organisationTypes - val isRegisteredCharity = org.orgCharityStep.formModel.notNullValue(OrgCharityFormModel::charity) - val hasCompanyNumber = org.orgCompaniesHouseStep.formModel.notNullValue(OrgCompaniesHouseFormModel::companiesHouse) + val isRegisteredCharity = org.charityTask.orgCharityStep.formModel.notNullValue(OrgCharityFormModel::charity) + val hasCompanyNumber = + org.companiesHouseTask.orgCompaniesHouseStep.formModel.notNullValue( + OrgCompaniesHouseFormModel::companiesHouse, + ) - val charityRegulator = if (isRegisteredCharity) org.orgCharityRegisteredWithStep.formModel.charityRegisteredWith else null + val charityRegulator = + if (isRegisteredCharity) org.charityTask.orgCharityRegisteredWithStep.formModel.charityRegisteredWith else null val mainContact = org.orgMainContactStep.formModel val governingBodyMembers = - (org.governingBodyMembersMap ?: emptyMap()) + (org.companiesHouseTask.orgGovBodyTask.governingBodyMembersMap ?: emptyMap()) .values .toList() @@ -83,17 +87,36 @@ class LandlordRegistrationCyaStepConfig( organisationEmail = org.orgEmailStep.formModel.notNullValue(EmailFormModel::emailAddress), organisationPhoneNumber = org.orgPhoneNumberStep.formModel.notNullValue(OrgPhoneNumberFormModel::phoneNumber), organisationCompanyNumber = - if (hasCompanyNumber) org.orgCompanyNumberStep.formModel.notNullValue(OrgCompanyNumberFormModel::companyNumber) else null, + if (hasCompanyNumber) { + org.companiesHouseTask.orgCompanyNumberStep.formModel.notNullValue( + OrgCompanyNumberFormModel::companyNumber, + ) + } else { + null + }, organisationCharityRegisteredWith = charityRegulator, organisationCharityNumber = getCharityNumber(state, charityRegulator), organisationLeadTrusteeName = - if (isTrust) org.leadTrusteeNameStep.formModel.notNullValue(LeadTrusteeNameFormModel::name) else null, - organisationLeadTrusteeDateOfBirth = if (isTrust) org.leadTrusteeDobStep.formModel.toLocalDateOrNull() else null, + if (isTrust) org.leadTrusteeTask.leadTrusteeNameStep.formModel.notNullValue(LeadTrusteeNameFormModel::name) else null, + organisationLeadTrusteeDateOfBirth = + if (isTrust) org.leadTrusteeTask.leadTrusteeDobStep.formModel.toLocalDateOrNull() else null, organisationLeadTrusteeEmail = - if (isTrust) org.leadTrusteeEmailStep.formModel.notNullValue(LeadTrusteeEmailFormModel::emailAddress) else null, + if (isTrust) { + org.leadTrusteeTask.leadTrusteeEmailStep.formModel.notNullValue( + LeadTrusteeEmailFormModel::emailAddress, + ) + } else { + null + }, organisationLeadTrusteePhoneNumber = - if (isTrust) org.leadTrusteePhoneStep.formModel.notNullValue(LeadTrusteePhoneFormModel::phoneNumber) else null, - organisationLeadTrusteeAddress = if (isTrust) org.trusteeAddressTask.getAddress() else null, + if (isTrust) { + org.leadTrusteeTask.leadTrusteePhoneStep.formModel.notNullValue( + LeadTrusteePhoneFormModel::phoneNumber, + ) + } else { + null + }, + organisationLeadTrusteeAddress = if (isTrust) org.leadTrusteeTask.trusteeAddressTask.getAddress() else null, organisationMainContactName = mainContact.notNullValue(OrgMainContactFormModel::name), organisationMainContactEmail = mainContact.notNullValue(OrgMainContactFormModel::emailAddress), organisationMainContactPhoneNumber = mainContact.notNullValue(OrgMainContactFormModel::phoneNumber), @@ -608,17 +631,17 @@ class LandlordRegistrationCyaStepConfig( val org = state.orgLandlordRegistrationTask return when (charityRegulator) { CharityRegulator.ENGLAND_AND_WALES -> - org.orgCharityNumberEnglandAndWalesStep.formModel.notNullValue( + org.charityTask.orgCharityNumberEnglandAndWalesStep.formModel.notNullValue( OrgCharityNumberEnglandAndWalesFormModel::charityNumber, ) CharityRegulator.NORTHERN_IRELAND -> - org.orgCharityNumberNorthernIrelandStep.formModel.notNullValue( + org.charityTask.orgCharityNumberNorthernIrelandStep.formModel.notNullValue( OrgCharityNumberNorthernIrelandFormModel::charityNumber, ) CharityRegulator.SCOTLAND -> - org.orgCharityNumberScotlandStep.formModel.notNullValue( + org.charityTask.orgCharityNumberScotlandStep.formModel.notNullValue( OrgCharityNumberScotlandFormModel::charityNumber, ) From ecba2072469f0b7b2adec8fde6d47ce89b45137c Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Wed, 29 Jul 2026 09:50:18 +0100 Subject: [PATCH 07/17] PDJB-1168: extract out nested task and update TODOs --- .../LandlordRegistrationOrgLandlordState.kt | 2 ++ .../states/OrgCompaniesHouseState.kt | 2 -- .../LandlordRegistrationCyaStepConfig.kt | 8 +++---- .../tasks/LandlordRegistrationTask.kt | 6 ++--- .../tasks/OrgCompaniesHouseTask.kt | 9 ++------ .../tasks/OrgLandlordRegistrationTask.kt | 23 ++++++++++++++++++- 6 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt index 878e566608..a92150e394 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt @@ -11,6 +11,7 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.LeadTrusteeTask import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgCharityTask import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgCompaniesHouseTask +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgGovBodyTask interface LandlordRegistrationOrgLandlordState : JourneyState { val yourDetailsStep: YourDetailsStep @@ -20,6 +21,7 @@ interface LandlordRegistrationOrgLandlordState : JourneyState { val orgPhoneNumberStep: OrgPhoneNumberStep val orgTypeStep: OrgTypeStep val companiesHouseTask: OrgCompaniesHouseTask + val orgGovBodyTask: OrgGovBodyTask val charityTask: OrgCharityTask val leadTrusteeTask: LeadTrusteeTask val orgMainContactStep: OrgMainContactStep diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt index 87bc7df89d..c613b00890 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt @@ -3,10 +3,8 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states import uk.gov.communities.prsdb.webapp.journeys.JourneyState import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompaniesHouseStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompanyNumberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgGovBodyTask interface OrgCompaniesHouseState : JourneyState { val orgCompaniesHouseStep: OrgCompaniesHouseStep val orgCompanyNumberStep: OrgCompanyNumberStep - val orgGovBodyTask: OrgGovBodyTask } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt index 0994068b40..2b5e201baf 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt @@ -73,7 +73,7 @@ class LandlordRegistrationCyaStepConfig( val mainContact = org.orgMainContactStep.formModel val governingBodyMembers = - (org.companiesHouseTask.orgGovBodyTask.governingBodyMembersMap ?: emptyMap()) + (org.orgGovBodyTask.governingBodyMembersMap ?: emptyMap()) .values .toList() @@ -507,7 +507,7 @@ class LandlordRegistrationCyaStepConfig( } private fun getGovBodyMemberCards(state: LandlordRegistrationState): List { - val members = state.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask.governingBodyMembersMap ?: emptyMap() + val members = state.orgLandlordRegistrationTask.orgGovBodyTask.governingBodyMembersMap ?: emptyMap() return members .toList() .sortedBy { it.first } @@ -541,9 +541,9 @@ class LandlordRegistrationCyaStepConfig( actions = SummaryCardActionViewModel.changeAction( Destination.VisitableStep( - state.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask.orgGovBodyMemberListStep, + state.orgLandlordRegistrationTask.orgGovBodyTask.orgGovBodyMemberListStep, state.getCyaJourneyId( - state.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask.orgGovBodyMemberListStep, + state.orgLandlordRegistrationTask.orgGovBodyTask.orgGovBodyMemberListStep, ), ), ), diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt index d4343a4d2b..77e7da3e14 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt @@ -213,7 +213,7 @@ class LandlordRegistrationTask( } OrgTypeStep.ROUTE_SEGMENT -> { - checkAnswerStep(journey.orgLandlordRegistrationTask.orgTypeStep, OrgTypeStep.ROUTE_SEGMENT) + // TODO PDJB-1237 : use org type update journey here } OrgCharityStep.ROUTE_SEGMENT, @@ -228,7 +228,7 @@ class LandlordRegistrationTask( OrgCompaniesHouseStep.ROUTE_SEGMENT, OrgCompanyNumberStep.ROUTE_SEGMENT, -> { - duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.companiesHouseTask, null) + // TODO PDJB-1238 : use companies update journey here } LeadTrusteeNameStep.ROUTE_SEGMENT -> { @@ -236,7 +236,7 @@ class LandlordRegistrationTask( } OrgGovBodyMemberListStep.ROUTE_SEGMENT -> { - duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask, null) + duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.orgGovBodyTask, null) } OrgMainContactStep.ROUTE_SEGMENT -> { diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt index 07b8346199..bcd50340e7 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt @@ -16,7 +16,6 @@ class OrgCompaniesHouseTask( journeyStateService: JourneyStateService, override val orgCompaniesHouseStep: OrgCompaniesHouseStep, override val orgCompanyNumberStep: OrgCompanyNumberStep, - override val orgGovBodyTask: OrgGovBodyTask, ) : DuplicableTask(journeyStateService), OrgCompaniesHouseState { override val taskState get() = this @@ -28,7 +27,7 @@ class OrgCompaniesHouseTask( nextStep { mode -> when (mode) { YesOrNo.YES -> journey.orgCompanyNumberStep - YesOrNo.NO -> journey.orgGovBodyTask.firstStep + YesOrNo.NO -> exitStep } } } @@ -37,15 +36,11 @@ class OrgCompaniesHouseTask( parents { journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.YES) } nextStep { exitStep } } - duplicableTask(journey.orgGovBodyTask) { - parents { journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO) } - nextStep { exitStep } - } exitStep { parents { OrParents( + journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO), journey.orgCompanyNumberStep.isComplete(), - journey.orgGovBodyTask.isComplete(), ) } } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt index 91fd6f4554..5e587b4ebb 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt @@ -1,6 +1,7 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent +import uk.gov.communities.prsdb.webapp.journeys.AndParents import uk.gov.communities.prsdb.webapp.journeys.Destination import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService @@ -16,6 +17,7 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeMode import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.YourDetailsStep +import uk.gov.communities.prsdb.webapp.journeys.shared.YesOrNo @JourneyFrameworkComponent class OrgLandlordRegistrationTask( @@ -29,6 +31,7 @@ class OrgLandlordRegistrationTask( override val leadTrusteeTask: LeadTrusteeTask, override val charityTask: OrgCharityTask, override val companiesHouseTask: OrgCompaniesHouseTask, + override val orgGovBodyTask: OrgGovBodyTask, override val orgMainContactStep: OrgMainContactStep, ) : DuplicableTask(journeyStateService), LandlordRegistrationOrgLandlordState { @@ -85,11 +88,29 @@ class OrgLandlordRegistrationTask( } duplicableTask(journey.companiesHouseTask) { parents { journey.charityTask.isComplete() } + nextDestination { + if (journey.companiesHouseTask.orgCompaniesHouseStep.outcome == YesOrNo.NO) { + Destination(journey.orgGovBodyTask.firstStep) + } else { + Destination(journey.orgMainContactStep) + } + } + } + duplicableTask(journey.orgGovBodyTask) { + parents { journey.companiesHouseTask.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO) } nextStep { journey.orgMainContactStep } } step(journey.orgMainContactStep) { routeSegment(OrgMainContactStep.ROUTE_SEGMENT) - parents { journey.companiesHouseTask.isComplete() } + parents { + OrParents( + AndParents( + journey.companiesHouseTask.isComplete(), + journey.companiesHouseTask.orgCompaniesHouseStep.hasOutcome(YesOrNo.YES), + ), + journey.orgGovBodyTask.isComplete(), + ) + } nextStep { exitStep } } exitStep { From b60759afad92678fa6b38b874bd7bafe7a40daa9 Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Wed, 29 Jul 2026 11:08:42 +0100 Subject: [PATCH 08/17] PDJB-1168: WIP individual landlord change journey --- .../LandlordRegistrationCyaStepConfig.kt | 14 ++++++++++ .../tasks/LandlordRegistrationTask.kt | 28 +++++++++++++++---- .../messages/registerAsALandlord.yml | 2 ++ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt index 2b5e201baf..b31f81dc86 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt @@ -176,9 +176,23 @@ class LandlordRegistrationCyaStepConfig( private fun getSummaryList(state: LandlordRegistrationState) = getIdentityRows(state) + + getLandlordTypeRows(state) + getEmailAndPhoneRows(state) + getAddressRows(state) + private fun getLandlordTypeRows(state: LandlordRegistrationState): List = + if (state.landlordTypeStep.outcome == LandlordTypeMode.INDIVIDUAL) { + listOf( + SummaryListRowViewModel.forCheckYourAnswersPage( + "registerAsALandlord.checkAnswers.rowHeading.landlordType", + "registerAsALandlord.checkAnswers.landlordTypeValue", + Destination.VisitableStep(state.landlordTypeStep, state.getCyaJourneyId(state.landlordTypeStep)), + ), + ) + } else { + emptyList() + } + private fun getIdentityRows(state: LandlordRegistrationState): List { val isIdentityVerified = state.identityTask.getIsIdentityVerified() return listOf( diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt index 77e7da3e14..aab87a3d2d 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt @@ -10,6 +10,7 @@ import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService import uk.gov.communities.prsdb.webapp.journeys.OrParents import uk.gov.communities.prsdb.webapp.journeys.StepLifecycleOrchestrator +import uk.gov.communities.prsdb.webapp.journeys.SubjourneyComplete import uk.gov.communities.prsdb.webapp.journeys.builders.JourneyBuilder.Companion.journey import uk.gov.communities.prsdb.webapp.journeys.builders.SubJourneyBuilder import uk.gov.communities.prsdb.webapp.journeys.hasOutcome @@ -183,17 +184,16 @@ class LandlordRegistrationTask( step(journey.landlordTypeStep) { initialStep() routeSegment(LandlordTypeStep.ROUTE_SEGMENT) - nextStep { mode -> - when (mode) { - LandlordTypeMode.INDIVIDUAL -> journey.individualLandlordRegistrationTask.firstStep - LandlordTypeMode.ORGANISATION -> journey.finishCyaStep - } - } + nextDestination { mode -> destinationForSelectedLandlordType(journey, mode) } } duplicableTask(journey.individualLandlordRegistrationTask) { parents { journey.landlordTypeStep.hasOutcome(LandlordTypeMode.INDIVIDUAL) } nextStep { journey.finishCyaStep } } + duplicableTask(journey.orgLandlordRegistrationTask) { + parents { journey.landlordTypeStep.hasOutcome(LandlordTypeMode.ORGANISATION) } + nextStep { journey.finishCyaStep } + } } OrgNameStep.ROUTE_SEGMENT -> { @@ -248,5 +248,21 @@ class LandlordRegistrationTask( nextDestination { Destination.Nowhere() } } } + + private fun destinationForSelectedLandlordType( + journey: LandlordRegistrationState, + landlordType: LandlordTypeMode, + ): Destination { + val selectedTask = + when (landlordType) { + LandlordTypeMode.INDIVIDUAL -> journey.individualLandlordRegistrationTask + LandlordTypeMode.ORGANISATION -> journey.orgLandlordRegistrationTask + } + return if (selectedTask.exitStep.outcome == SubjourneyComplete.COMPLETE) { + Destination(journey.finishCyaStep) + } else { + Destination(selectedTask.firstStep) + } + } } } diff --git a/src/main/resources/messages/registerAsALandlord.yml b/src/main/resources/messages/registerAsALandlord.yml index 8239cad5d0..0d1132fff6 100644 --- a/src/main/resources/messages/registerAsALandlord.yml +++ b/src/main/resources/messages/registerAsALandlord.yml @@ -23,6 +23,7 @@ testTheService: three: Parts of the service may change during the private beta period. checkAnswers: summaryName: Your details + landlordTypeValue: Individual rowHeading: name: Name dateOfBirth: Date of birth @@ -31,6 +32,7 @@ checkAnswers: englandOrWalesResident: Resident in England or Wales contactAddress: Contact address localCouncil: Local Council + landlordType: Landlord type orgCheckAnswers: heading: Check your answers yourDetails: From 3c2b6616aa654892653c1a70fa93c9e6b1711ab8 Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Thu, 30 Jul 2026 10:21:18 +0100 Subject: [PATCH 09/17] PDJB-1168: flag off cya change properly --- .../stepConfig/LandlordRegistrationCyaStepConfig.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt index b31f81dc86..0077ee34cd 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt @@ -2,7 +2,9 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig import org.springframework.security.core.context.SecurityContextHolder import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent +import uk.gov.communities.prsdb.webapp.config.managers.FeatureFlagManager import uk.gov.communities.prsdb.webapp.constants.ENGLAND_OR_WALES +import uk.gov.communities.prsdb.webapp.constants.ORGANISATION_LANDLORD_REGISTRATION import uk.gov.communities.prsdb.webapp.constants.enums.CharityRegulator import uk.gov.communities.prsdb.webapp.constants.enums.GoverningBodyMemberType import uk.gov.communities.prsdb.webapp.constants.enums.OrgType @@ -40,6 +42,7 @@ import uk.gov.communities.prsdb.webapp.services.SecurityContextService class LandlordRegistrationCyaStepConfig( private val landlordRegistrationService: LandlordRegistrationService, private val securityContextService: SecurityContextService, + private val featureFlagManager: FeatureFlagManager, ) : AbstractCheckYourAnswersStepConfig() { override fun chooseTemplate(state: LandlordRegistrationState) = if (isOrgLandlord(state)) { @@ -161,7 +164,9 @@ class LandlordRegistrationCyaStepConfig( defaultDestination: Destination, ): Destination = defaultDestination - private fun isOrgLandlord(state: LandlordRegistrationState) = state.landlordTypeStep.outcome == LandlordTypeMode.ORGANISATION + private fun isOrgLandlord(state: LandlordRegistrationState) = + featureFlagManager.checkFeature(ORGANISATION_LANDLORD_REGISTRATION) && + state.landlordTypeStep.outcome == LandlordTypeMode.ORGANISATION // Individual landlord content @@ -181,7 +186,9 @@ class LandlordRegistrationCyaStepConfig( getAddressRows(state) private fun getLandlordTypeRows(state: LandlordRegistrationState): List = - if (state.landlordTypeStep.outcome == LandlordTypeMode.INDIVIDUAL) { + if (featureFlagManager.checkFeature(ORGANISATION_LANDLORD_REGISTRATION) && + state.landlordTypeStep.outcome == LandlordTypeMode.INDIVIDUAL + ) { listOf( SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.checkAnswers.rowHeading.landlordType", From b3b3bc1d883d9e27edfdc2255836572d14cad1b6 Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Thu, 30 Jul 2026 14:02:03 +0100 Subject: [PATCH 10/17] PDJB-1168: change link tests --- .../LandlordRegistrationJourneyTests.kt | 111 ++++++++++++++++++ .../integration/pageObjects/Navigator.kt | 6 +- .../CheckAnswersPageLandlordRegistration.kt | 1 + 3 files changed, 116 insertions(+), 2 deletions(-) diff --git a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/LandlordRegistrationJourneyTests.kt b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/LandlordRegistrationJourneyTests.kt index 9248f9b596..67a3d1bfc7 100644 --- a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/LandlordRegistrationJourneyTests.kt +++ b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/LandlordRegistrationJourneyTests.kt @@ -15,6 +15,7 @@ import uk.gov.communities.prsdb.webapp.constants.MANUAL_ADDRESS_CHOSEN import uk.gov.communities.prsdb.webapp.constants.ORGANISATION_LANDLORD_REGISTRATION import uk.gov.communities.prsdb.webapp.constants.enums.CharityRegulator import uk.gov.communities.prsdb.webapp.constants.enums.GoverningBodyMemberType +import uk.gov.communities.prsdb.webapp.constants.enums.LandlordType import uk.gov.communities.prsdb.webapp.integration.pageObjects.components.BackLink import uk.gov.communities.prsdb.webapp.integration.pageObjects.components.BaseComponent.Companion.assertThat import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.LandlordDashboardPage @@ -65,6 +66,7 @@ import uk.gov.communities.prsdb.webapp.models.viewModels.emailModels.LandlordReg import uk.gov.communities.prsdb.webapp.services.AbsoluteUrlProvider import uk.gov.communities.prsdb.webapp.services.EmailNotificationService import uk.gov.communities.prsdb.webapp.services.LandlordService +import uk.gov.communities.prsdb.webapp.testHelpers.builders.LandlordStateSessionBuilder import uk.gov.communities.prsdb.webapp.testHelpers.extensions.getFormattedUkPhoneNumber import java.net.URI import java.time.LocalDate @@ -433,6 +435,115 @@ class LandlordRegistrationJourneyTests : IntegrationTestWithMutableData("data-mo assertPageIs(page, OrgCheckAnswersPageLandlordRegistration::class) } + @Test + fun `The organisation address change link returns to the org check answers page with the updated value`(page: Page) { + featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION) + + val checkAnswersPage = navigator.skipToLandlordRegistrationOrgCheckAnswersPage() + checkAnswersPage.landlordDetails.organisationAddressRow.clickNamedActionLinkAndWait("Change") + + val orgAddressPage = assertPageIs(page, OrgAddressFormPageLandlordRegistration::class) + orgAddressPage.submitAddress( + addressLineOne = "2 Updated Street", + townOrCity = "Updatedton", + postcode = "UP1 2DD", + ) + + val updatedCheckAnswersPage = assertPageIs(page, OrgCheckAnswersPageLandlordRegistration::class) + assertThat(updatedCheckAnswersPage.landlordDetails.organisationAddressRow).containsText("2 Updated Street") + } + + @Test + fun `The organisation email change link returns to the org check answers page with the updated value`(page: Page) { + featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION) + + val checkAnswersPage = navigator.skipToLandlordRegistrationOrgCheckAnswersPage() + checkAnswersPage.landlordDetails.organisationEmailRow.clickNamedActionLinkAndWait("Change") + + val orgEmailPage = assertPageIs(page, OrgEmailFormPageLandlordRegistration::class) + orgEmailPage.submitEmail("updated.email@example.com") + + val updatedCheckAnswersPage = assertPageIs(page, OrgCheckAnswersPageLandlordRegistration::class) + assertThat(updatedCheckAnswersPage.landlordDetails.organisationEmailRow).containsText("updated.email@example.com") + } + + @Test + fun `The organisation phone number change link returns to the org check answers page with the updated value`(page: Page) { + featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION) + + val checkAnswersPage = navigator.skipToLandlordRegistrationOrgCheckAnswersPage() + checkAnswersPage.landlordDetails.organisationPhoneRow.clickNamedActionLinkAndWait("Change") + + val orgPhoneNumberPage = assertPageIs(page, OrgPhoneNumberFormPageLandlordRegistration::class) + orgPhoneNumberPage.submitPhoneNumber("07999999999") + + val updatedCheckAnswersPage = assertPageIs(page, OrgCheckAnswersPageLandlordRegistration::class) + assertThat(updatedCheckAnswersPage.landlordDetails.organisationPhoneRow).containsText("07999999999") + } + + @Test + fun `The governing body member card change link re-walks the member list and returns to the org check answers page`(page: Page) { + featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION) + + val checkAnswersPage = navigator.skipToLandlordRegistrationOrgCheckAnswersPage() + checkAnswersPage.governingBodyMemberCard.getAction("Change").link.clickAndWait() + + val memberListPage = assertPageIs(page, OrgGovBodyMemberListFormPageLandlordRegistration::class) + memberListPage.form.submit() + + assertPageIs(page, OrgCheckAnswersPageLandlordRegistration::class) + } + + @Test + fun `The main contact change link returns to the org check answers page with the updated value`(page: Page) { + featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION) + + val checkAnswersPage = navigator.skipToLandlordRegistrationOrgCheckAnswersPage() + checkAnswersPage.mainContactCard.getAction("Change").link.clickAndWait() + + val orgMainContactPage = assertPageIs(page, OrgMainContactFormPageLandlordRegistration::class) + orgMainContactPage.submit("Updated Contact Name", "updated.contact@example.com", "07888888888") + + val updatedCheckAnswersPage = assertPageIs(page, OrgCheckAnswersPageLandlordRegistration::class) + assertThat(updatedCheckAnswersPage.mainContactCard).containsText("Updated Contact Name") + } + + @Test + fun `The landlord type change link routes into the individual journey when switching to individual`(page: Page) { + featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION) + + val checkAnswersPage = navigator.skipToLandlordRegistrationOrgCheckAnswersPage() + checkAnswersPage.landlordDetails.landlordTypeRow.clickNamedActionLinkAndWait("Change") + + val landlordTypePage = assertPageIs(page, LandlordTypeFormPageLandlordRegistration::class) + landlordTypePage.submitIndividual() + + assertPageIs(page, EmailFormPageLandlordRegistration::class) + } + + @Test + fun `The landlord type change link routes into the organisation journey when switching to organisation`(page: Page) { + featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION) + + val checkAnswersPage = + navigator.skipToLandlordRegistrationCheckAnswersPage( + LandlordStateSessionBuilder.beforeCheckAnswers().withLandlordType(LandlordType.INDIVIDUAL), + ) + checkAnswersPage.summaryList.landlordTypeRow.clickNamedActionLinkAndWait("Change") + + val landlordTypePage = assertPageIs(page, LandlordTypeFormPageLandlordRegistration::class) + landlordTypePage.submitOrganisation() + + assertPageIs(page, YourDetailsPageLandlordRegistration::class) + } + + // TODO PDJB-1237: add a test for the organisation type change link once the org type update journey is wired into + // LandlordRegistrationTask.checkYourAnswersJourneyMap (the OrgTypeStep.ROUTE_SEGMENT branch is currently empty). + + // TODO PDJB-1238: add tests for the Companies House and company number change links once the companies update + // journey is wired into LandlordRegistrationTask.checkYourAnswersJourneyMap (the OrgCompaniesHouseStep / + // OrgCompanyNumberStep branch is currently empty). + @Test fun `Selecting no on companies house skips the company number question and goes to the governing body journey`(page: Page) { featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION) diff --git a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/Navigator.kt b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/Navigator.kt index 66ef746b83..a3d7faeaad 100644 --- a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/Navigator.kt +++ b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/Navigator.kt @@ -444,8 +444,10 @@ class Navigator( return createValidPage(page, ManualAddressFormPageLandlordRegistration::class) } - fun skipToLandlordRegistrationCheckAnswersPage(): CheckAnswersPageLandlordRegistration { - setJourneyStateInSession(LandlordStateSessionBuilder.beforeCheckAnswers().build()) + fun skipToLandlordRegistrationCheckAnswersPage( + stateBuilder: LandlordStateSessionBuilder = LandlordStateSessionBuilder.beforeCheckAnswers(), + ): CheckAnswersPageLandlordRegistration { + setJourneyStateInSession(stateBuilder.build()) navigateToLandlordRegistrationJourneyStep(AbstractCheckYourAnswersStep.ROUTE_SEGMENT) return createValidPage(page, CheckAnswersPageLandlordRegistration::class) } diff --git a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/pages/landlordRegistrationJourneyPages/CheckAnswersPageLandlordRegistration.kt b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/pages/landlordRegistrationJourneyPages/CheckAnswersPageLandlordRegistration.kt index 9b2df8462c..ae69f203b7 100644 --- a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/pages/landlordRegistrationJourneyPages/CheckAnswersPageLandlordRegistration.kt +++ b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/pageObjects/pages/landlordRegistrationJourneyPages/CheckAnswersPageLandlordRegistration.kt @@ -25,6 +25,7 @@ class CheckAnswersPageLandlordRegistration( class CheckAnswersLandlordRegistrationSummaryList( page: Page, ) : SummaryList(page) { + val landlordTypeRow = getRow("Landlord type") val emailRow = getRow("Email address") } } From c287e3b0bcddb45abf1294588b46e27d453ae74b Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Thu, 30 Jul 2026 15:15:05 +0100 Subject: [PATCH 11/17] PDJB-1168: add TODOs for change pages --- .../LandlordRegistrationOrgLandlordState.kt | 4 +++ .../stepConfig/UpdateDetailsTodoStepConfig.kt | 31 +++++++++++++++++++ .../tasks/LandlordRegistrationTask.kt | 10 ++++-- .../tasks/OrgLandlordRegistrationTask.kt | 3 ++ .../templates/forms/todoNoContinue.html | 10 ++++++ 5 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/UpdateDetailsTodoStepConfig.kt create mode 100644 src/main/resources/templates/forms/todoNoContinue.html diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt index a92150e394..1b459497fa 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt @@ -7,6 +7,7 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgPhoneNumberStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.UpdateDetailsTodoStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.YourDetailsStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.LeadTrusteeTask import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgCharityTask @@ -25,4 +26,7 @@ interface LandlordRegistrationOrgLandlordState : JourneyState { val charityTask: OrgCharityTask val leadTrusteeTask: LeadTrusteeTask val orgMainContactStep: OrgMainContactStep + + // TODO PDJB-1237 PDJB-1238: remove this placeholder once the org type and companies house update journeys exist. + val updateDetailsTodoStep: UpdateDetailsTodoStep } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/UpdateDetailsTodoStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/UpdateDetailsTodoStepConfig.kt new file mode 100644 index 0000000000..ac6fde6fb0 --- /dev/null +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/UpdateDetailsTodoStepConfig.kt @@ -0,0 +1,31 @@ +package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig + +import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent +import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig +import uk.gov.communities.prsdb.webapp.journeys.JourneyState +import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep +import uk.gov.communities.prsdb.webapp.journeys.shared.Complete +import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.NoInputFormModel + +// TODO PDJB-1237 PDJB-1238: remove this placeholder step once the organisation type and companies house update +// journeys exist. It renders a dead-end TODO page (no continue button) so the corresponding check-your-answers change +// links don't 404. The todoComment shown is supplied per branch where the step is wired into the journey map. +@JourneyFrameworkComponent +class UpdateDetailsTodoStepConfig : AbstractRequestableStepConfig() { + override val formModelClass = NoInputFormModel::class + + override fun getStepSpecificContent(state: JourneyState) = emptyMap() + + override fun chooseTemplate(state: JourneyState) = "forms/todoNoContinue" + + override fun mode(state: JourneyState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } +} + +@JourneyFrameworkComponent +final class UpdateDetailsTodoStep( + stepConfig: UpdateDetailsTodoStepConfig, +) : RequestableStep(stepConfig) { + companion object { + const val ROUTE_SEGMENT = "update-details-todo" + } +} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt index aab87a3d2d..4b1f099edd 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt @@ -213,7 +213,10 @@ class LandlordRegistrationTask( } OrgTypeStep.ROUTE_SEGMENT -> { - // TODO PDJB-1237 : use org type update journey here + // TODO PDJB-1237 : replace this placeholder with the org type update journey + checkAnswerStep(journey.orgLandlordRegistrationTask.updateDetailsTodoStep, OrgTypeStep.ROUTE_SEGMENT) { + withAdditionalContentProperty { "todoComment" to "TODO PDJB-1237: Organisation type update journey" } + } } OrgCharityStep.ROUTE_SEGMENT, @@ -228,7 +231,10 @@ class LandlordRegistrationTask( OrgCompaniesHouseStep.ROUTE_SEGMENT, OrgCompanyNumberStep.ROUTE_SEGMENT, -> { - // TODO PDJB-1238 : use companies update journey here + // TODO PDJB-1238 : replace this placeholder with the companies house update journey + checkAnswerStep(journey.orgLandlordRegistrationTask.updateDetailsTodoStep, checkingAnswersFor) { + withAdditionalContentProperty { "todoComment" to "TODO PDJB-1238: Companies House update journey" } + } } LeadTrusteeNameStep.ROUTE_SEGMENT -> { diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt index 5e587b4ebb..2b7dee575d 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt @@ -16,6 +16,7 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgPhoneNumberStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeMode import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.UpdateDetailsTodoStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.YourDetailsStep import uk.gov.communities.prsdb.webapp.journeys.shared.YesOrNo @@ -33,6 +34,8 @@ class OrgLandlordRegistrationTask( override val companiesHouseTask: OrgCompaniesHouseTask, override val orgGovBodyTask: OrgGovBodyTask, override val orgMainContactStep: OrgMainContactStep, + // TODO PDJB-1237 PDJB-1238: remove this placeholder once the org type and companies house update journeys exist. + override val updateDetailsTodoStep: UpdateDetailsTodoStep, ) : DuplicableTask(journeyStateService), LandlordRegistrationOrgLandlordState { override val taskState get() = this diff --git a/src/main/resources/templates/forms/todoNoContinue.html b/src/main/resources/templates/forms/todoNoContinue.html new file mode 100644 index 0000000000..76699b154f --- /dev/null +++ b/src/main/resources/templates/forms/todoNoContinue.html @@ -0,0 +1,10 @@ + + + + + + +
+

todoComment

+
+ From 4c9c6060bf5e89339e0d5e529f81ab56c92c78af Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Fri, 31 Jul 2026 11:52:24 +0100 Subject: [PATCH 12/17] PDJB-1168: restructure tasks to make them better for update journies --- .../LandlordRegistrationOrgLandlordState.kt | 8 +- .../states/OrgCompaniesHouseState.kt | 2 + .../states/OrgGovBodyMembersState.kt | 28 +++++ .../states/OrgGovBodyState.kt | 24 +--- .../states/OrgTypeState.kt | 10 ++ .../HasAnyGovBodyMembersStepConfig.kt | 8 +- .../LandlordRegistrationCyaStepConfig.kt | 50 ++++---- .../OrgGovBodyMemberDobStepConfig.kt | 16 +-- .../OrgGovBodyMemberListStepConfig.kt | 16 +-- .../OrgGovBodyMemberNameStepConfig.kt | 16 +-- .../OrgGovBodyWhoToProvideStepConfig.kt | 16 +-- .../RemoveGovBodyMemberStepConfig.kt | 16 +-- .../stepConfig/SaveGovBodyMemberStepConfig.kt | 10 +- .../SetStateForGovBodyMemberEditStepConfig.kt | 16 +-- .../tasks/LandlordRegistrationTask.kt | 7 +- .../tasks/OrgCompaniesHouseTask.kt | 9 +- .../tasks/OrgGovBodyMembersTask.kt | 111 ++++++++++++++++++ .../tasks/OrgGovBodyTask.kt | 95 +-------------- .../tasks/OrgLandlordRegistrationTask.kt | 52 +------- .../landlordRegistration/tasks/OrgTypeTask.kt | 46 ++++++++ .../OrgGovBodyMemberListStepConfigTests.kt | 4 +- 21 files changed, 311 insertions(+), 249 deletions(-) create mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyMembersState.kt create mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgTypeState.kt create mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyMembersTask.kt create mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgTypeTask.kt diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt index 6fac33c16d..b5b50e4155 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt @@ -6,23 +6,19 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgMainContactStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgPhoneNumberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.UpdateDetailsTodoStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.LeadTrusteeTask import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgCharityTask import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgCompaniesHouseTask -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgGovBodyTask +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgTypeTask interface LandlordRegistrationOrgLandlordState : JourneyState { val orgNameStep: OrgNameStep val orgAddressStep: OrgAddressStep val orgEmailStep: OrgEmailStep val orgPhoneNumberStep: OrgPhoneNumberStep - val orgTypeStep: OrgTypeStep + val orgTypeTask: OrgTypeTask val companiesHouseTask: OrgCompaniesHouseTask - val orgGovBodyTask: OrgGovBodyTask val charityTask: OrgCharityTask - val leadTrusteeTask: LeadTrusteeTask val orgMainContactStep: OrgMainContactStep // TODO PDJB-1237 PDJB-1238: remove this placeholder once the org type and companies house update journeys exist. diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt index c613b00890..87bc7df89d 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt @@ -3,8 +3,10 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states import uk.gov.communities.prsdb.webapp.journeys.JourneyState import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompaniesHouseStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompanyNumberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgGovBodyTask interface OrgCompaniesHouseState : JourneyState { val orgCompaniesHouseStep: OrgCompaniesHouseStep val orgCompanyNumberStep: OrgCompanyNumberStep + val orgGovBodyTask: OrgGovBodyTask } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyMembersState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyMembersState.kt new file mode 100644 index 0000000000..3646d784ce --- /dev/null +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyMembersState.kt @@ -0,0 +1,28 @@ +package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states + +import uk.gov.communities.prsdb.webapp.journeys.JourneyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberListStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberNameStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyWhoToProvideStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.RemoveGovBodyMemberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SaveGovBodyMemberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SetStateForGovBodyMemberEditStep +import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.AddressTask +import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel + +interface OrgGovBodyMembersState : JourneyState { + val hasAnyGovBodyMembersStep: HasAnyGovBodyMembersStep + val orgGovBodyWhoToProvideStep: OrgGovBodyWhoToProvideStep + val orgGovBodyMemberNameStep: OrgGovBodyMemberNameStep + val orgGovBodyMemberDobStep: OrgGovBodyMemberDobStep + val govBodyMemberAddressTask: AddressTask + val orgGovBodyMemberListStep: OrgGovBodyMemberListStep + val saveGovBodyMemberStep: SaveGovBodyMemberStep + val setStateForGovBodyMemberEditStep: SetStateForGovBodyMemberEditStep + val removeGovBodyMemberStep: RemoveGovBodyMemberStep + var governingBodyMembersMap: Map? + var nextGoverningBodyMemberId: Int? + var editingGovBodyMemberId: Int? +} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyState.kt index 721e2ca38d..779ef7aeed 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyState.kt @@ -1,32 +1,12 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states import uk.gov.communities.prsdb.webapp.journeys.JourneyState -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyDetailsStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberListStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMustProvideInfoStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyWhoToProvideStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.RemoveGovBodyMemberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SaveGovBodyMemberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SetStateForGovBodyMemberEditStep -import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.AddressTask -import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgGovBodyMembersTask interface OrgGovBodyState : JourneyState { val orgGovBodyDetailsStep: OrgGovBodyDetailsStep val orgGovBodyMustProvideInfoStep: OrgGovBodyMustProvideInfoStep - val orgGovBodyWhoToProvideStep: OrgGovBodyWhoToProvideStep - val orgGovBodyMemberNameStep: OrgGovBodyMemberNameStep - val orgGovBodyMemberDobStep: OrgGovBodyMemberDobStep - val govBodyMemberAddressTask: AddressTask - val orgGovBodyMemberListStep: OrgGovBodyMemberListStep - val hasAnyGovBodyMembersStep: HasAnyGovBodyMembersStep - val saveGovBodyMemberStep: SaveGovBodyMemberStep - val setStateForGovBodyMemberEditStep: SetStateForGovBodyMemberEditStep - val removeGovBodyMemberStep: RemoveGovBodyMemberStep - var governingBodyMembersMap: Map? - var nextGoverningBodyMemberId: Int? - var editingGovBodyMemberId: Int? + val orgGovBodyMembersTask: OrgGovBodyMembersTask } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgTypeState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgTypeState.kt new file mode 100644 index 0000000000..b0a3fca5b0 --- /dev/null +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgTypeState.kt @@ -0,0 +1,10 @@ +package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states + +import uk.gov.communities.prsdb.webapp.journeys.JourneyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.LeadTrusteeTask + +interface OrgTypeState : JourneyState { + val orgTypeStep: OrgTypeStep + val leadTrusteeTask: LeadTrusteeTask +} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/HasAnyGovBodyMembersStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/HasAnyGovBodyMembersStepConfig.kt index e7591b1ff2..2b1bbd6550 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/HasAnyGovBodyMembersStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/HasAnyGovBodyMembersStepConfig.kt @@ -3,16 +3,16 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent import uk.gov.communities.prsdb.webapp.journeys.AbstractInternalStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState import uk.gov.communities.prsdb.webapp.journeys.shared.AnyMembers @JourneyFrameworkComponent -class HasAnyGovBodyMembersStepConfig : AbstractInternalStepConfig() { - override fun mode(state: OrgGovBodyState) = +class HasAnyGovBodyMembersStepConfig : AbstractInternalStepConfig() { + override fun mode(state: OrgGovBodyMembersState) = if (state.governingBodyMembersMap.isNullOrEmpty()) AnyMembers.NO_MEMBERS else AnyMembers.SOME_MEMBERS } @JourneyFrameworkComponent final class HasAnyGovBodyMembersStep( stepConfig: HasAnyGovBodyMembersStepConfig, -) : JourneyStep.InternalStep(stepConfig) +) : JourneyStep.InternalStep(stepConfig) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt index 19a81f6a7b..dc783a79d5 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt @@ -61,7 +61,7 @@ class LandlordRegistrationCyaStepConfig( if (isOrgLandlord(state)) { val org = state.orgLandlordRegistrationTask - val organisationTypes = org.orgTypeStep.formModel.getSelectedOrgTypes() + val organisationTypes = org.orgTypeTask.orgTypeStep.formModel.getSelectedOrgTypes() val isTrust = OrgType.TRUST in organisationTypes val isRegisteredCharity = org.charityTask.orgCharityStep.formModel.notNullValue(OrgCharityFormModel::charity) val hasCompanyNumber = @@ -75,7 +75,7 @@ class LandlordRegistrationCyaStepConfig( val mainContact = org.orgMainContactStep.formModel val governingBodyMembers = - (org.orgGovBodyTask.governingBodyMembersMap ?: emptyMap()) + (org.companiesHouseTask.orgGovBodyTask.orgGovBodyMembersTask.governingBodyMembersMap ?: emptyMap()) .values .toList() @@ -99,12 +99,18 @@ class LandlordRegistrationCyaStepConfig( organisationCharityRegisteredWith = charityRegulator, organisationCharityNumber = getCharityNumber(state, charityRegulator), organisationLeadTrusteeName = - if (isTrust) org.leadTrusteeTask.leadTrusteeNameStep.formModel.notNullValue(LeadTrusteeNameFormModel::name) else null, + if (isTrust) { + org.orgTypeTask.leadTrusteeTask.leadTrusteeNameStep.formModel.notNullValue( + LeadTrusteeNameFormModel::name, + ) + } else { + null + }, organisationLeadTrusteeDateOfBirth = - if (isTrust) org.leadTrusteeTask.leadTrusteeDobStep.formModel.toLocalDateOrNull() else null, + if (isTrust) org.orgTypeTask.leadTrusteeTask.leadTrusteeDobStep.formModel.toLocalDateOrNull() else null, organisationLeadTrusteeEmail = if (isTrust) { - org.leadTrusteeTask.leadTrusteeEmailStep.formModel.notNullValue( + org.orgTypeTask.leadTrusteeTask.leadTrusteeEmailStep.formModel.notNullValue( LeadTrusteeEmailFormModel::emailAddress, ) } else { @@ -112,13 +118,13 @@ class LandlordRegistrationCyaStepConfig( }, organisationLeadTrusteePhoneNumber = if (isTrust) { - org.leadTrusteeTask.leadTrusteePhoneStep.formModel.notNullValue( + org.orgTypeTask.leadTrusteeTask.leadTrusteePhoneStep.formModel.notNullValue( LeadTrusteePhoneFormModel::phoneNumber, ) } else { null }, - organisationLeadTrusteeAddress = if (isTrust) org.leadTrusteeTask.trusteeAddressTask.getAddress() else null, + organisationLeadTrusteeAddress = if (isTrust) org.orgTypeTask.leadTrusteeTask.trusteeAddressTask.getAddress() else null, organisationMainContactName = mainContact.notNullValue(OrgMainContactFormModel::name), organisationMainContactEmail = mainContact.notNullValue(OrgMainContactFormModel::emailAddress), organisationMainContactPhoneNumber = mainContact.notNullValue(OrgMainContactFormModel::phoneNumber), @@ -373,11 +379,11 @@ class LandlordRegistrationCyaStepConfig( add( SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.landlordDetails.organisationType", - org.orgTypeStep.formModel.orgTypes + org.orgTypeTask.orgTypeStep.formModel.orgTypes .filterNotNull() .filter { it.isNotBlank() } .map { orgTypeMessageKey(it) }, - Destination.VisitableStep(org.orgTypeStep, state.getCyaJourneyId(org.orgTypeStep)), + Destination.VisitableStep(org.orgTypeTask.orgTypeStep, state.getCyaJourneyId(org.orgTypeTask.orgTypeStep)), ), ) @@ -491,34 +497,34 @@ class LandlordRegistrationCyaStepConfig( private fun getLeadTrusteeCard(state: LandlordRegistrationState): SummaryCardViewModel? { val org = state.orgLandlordRegistrationTask - if (OrgType.TRUST !in org.orgTypeStep.formModel.getSelectedOrgTypes()) { + if (OrgType.TRUST !in org.orgTypeTask.orgTypeStep.formModel.getSelectedOrgTypes()) { return null } val rows = listOf( SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.name", - org.leadTrusteeTask.leadTrusteeNameStep.formModel.notNullValue(LeadTrusteeNameFormModel::name), + org.orgTypeTask.leadTrusteeTask.leadTrusteeNameStep.formModel.notNullValue(LeadTrusteeNameFormModel::name), Destination.Nowhere(), ), SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.dateOfBirth", - org.leadTrusteeTask.leadTrusteeDobStep.formModel.toLocalDateOrNull(), + org.orgTypeTask.leadTrusteeTask.leadTrusteeDobStep.formModel.toLocalDateOrNull(), Destination.Nowhere(), ), SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.email", - org.leadTrusteeTask.leadTrusteeEmailStep.formModel.notNullValue(LeadTrusteeEmailFormModel::emailAddress), + org.orgTypeTask.leadTrusteeTask.leadTrusteeEmailStep.formModel.notNullValue(LeadTrusteeEmailFormModel::emailAddress), Destination.Nowhere(), ), SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.phoneNumber", - org.leadTrusteeTask.leadTrusteePhoneStep.formModel.notNullValue(LeadTrusteePhoneFormModel::phoneNumber), + org.orgTypeTask.leadTrusteeTask.leadTrusteePhoneStep.formModel.notNullValue(LeadTrusteePhoneFormModel::phoneNumber), Destination.Nowhere(), ), SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.address", - org.leadTrusteeTask.trusteeAddressTask.getAddress().toMultiLineAddress().split("\n"), + org.orgTypeTask.leadTrusteeTask.trusteeAddressTask.getAddress().toMultiLineAddress().split("\n"), Destination.Nowhere(), ), ) @@ -528,15 +534,17 @@ class LandlordRegistrationCyaStepConfig( actions = SummaryCardActionViewModel.changeAction( Destination.VisitableStep( - org.leadTrusteeTask.leadTrusteeNameStep, - state.getCyaJourneyId(org.leadTrusteeTask.leadTrusteeNameStep), + org.orgTypeTask.leadTrusteeTask.leadTrusteeNameStep, + state.getCyaJourneyId(org.orgTypeTask.leadTrusteeTask.leadTrusteeNameStep), ), ), ) } private fun getGovBodyMemberCards(state: LandlordRegistrationState): List { - val members = state.orgLandlordRegistrationTask.orgGovBodyTask.governingBodyMembersMap ?: emptyMap() + val members = + state.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask.orgGovBodyMembersTask.governingBodyMembersMap + ?: emptyMap() return members .toList() .sortedBy { it.first } @@ -570,9 +578,11 @@ class LandlordRegistrationCyaStepConfig( actions = SummaryCardActionViewModel.changeAction( Destination.VisitableStep( - state.orgLandlordRegistrationTask.orgGovBodyTask.orgGovBodyMemberListStep, + state.orgLandlordRegistrationTask + .companiesHouseTask.orgGovBodyTask.orgGovBodyMembersTask.orgGovBodyMemberListStep, state.getCyaJourneyId( - state.orgLandlordRegistrationTask.orgGovBodyTask.orgGovBodyMemberListStep, + state.orgLandlordRegistrationTask + .companiesHouseTask.orgGovBodyTask.orgGovBodyMembersTask.orgGovBodyMemberListStep, ), ), ), diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberDobStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberDobStepConfig.kt index 3d8dd58ea7..26fb121303 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberDobStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberDobStepConfig.kt @@ -4,16 +4,16 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.constants.FORM_MODEL_ATTR_NAME import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgGovBodyMemberDobFormModel @JourneyFrameworkComponent class OrgGovBodyMemberDobStepConfig : - AbstractRequestableStepConfig() { + AbstractRequestableStepConfig() { override val formModelClass = OrgGovBodyMemberDobFormModel::class - override fun getStepSpecificContent(state: OrgGovBodyState) = + override fun getStepSpecificContent(state: OrgGovBodyMembersState) = mapOf( "fieldSetHeading" to "registerAsALandlord.orgGovBodyMemberDob.fieldSetHeading", "fieldSetHint" to "registerAsALandlord.orgGovBodyMemberDob.fieldSetHint", @@ -21,7 +21,7 @@ class OrgGovBodyMemberDobStepConfig : ) override fun resolvePageContent( - state: OrgGovBodyState, + state: OrgGovBodyMembersState, defaultContent: Map, ): Map { val formModel = defaultContent[FORM_MODEL_ATTR_NAME] as? OrgGovBodyMemberDobFormModel @@ -35,18 +35,18 @@ class OrgGovBodyMemberDobStepConfig : return defaultContent + (FORM_MODEL_ATTR_NAME to prepopulatedFormModel) } - override fun chooseTemplate(state: OrgGovBodyState) = "forms/dateForm" + override fun chooseTemplate(state: OrgGovBodyMembersState) = "forms/dateForm" - override fun mode(state: OrgGovBodyState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } + override fun mode(state: OrgGovBodyMembersState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } - private fun getEditingMemberOrNull(state: OrgGovBodyState) = + private fun getEditingMemberOrNull(state: OrgGovBodyMembersState) = state.editingGovBodyMemberId?.let { state.governingBodyMembersMap?.get(it) } } @JourneyFrameworkComponent final class OrgGovBodyMemberDobStep( stepConfig: OrgGovBodyMemberDobStepConfig, -) : RequestableStep(stepConfig) { +) : RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "organisation-governing-body-member-dob" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfig.kt index 9ff25dd647..f807a7b48f 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfig.kt @@ -4,7 +4,7 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.Destination import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.NoInputFormModel import uk.gov.communities.prsdb.webapp.models.viewModels.summaryModels.SummaryListRowActionsInputWithDestination @@ -14,10 +14,10 @@ import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @JourneyFrameworkComponent class OrgGovBodyMemberListStepConfig( private val urlParameterService: CollectionKeyParameterService, -) : AbstractRequestableStepConfig() { +) : AbstractRequestableStepConfig() { override val formModelClass = NoInputFormModel::class - override fun getStepSpecificContent(state: OrgGovBodyState) = + override fun getStepSpecificContent(state: OrgGovBodyMembersState) = mapOf( "addAnotherTitle" to "forms.orgGovBodyMemberList.heading", "optionalAddAnotherTitleParam" to (state.governingBodyMembersMap?.size ?: 0), @@ -29,13 +29,13 @@ class OrgGovBodyMemberListStepConfig( "addAnotherUrl" to Destination(state.orgGovBodyWhoToProvideStep).toUrlStringOrNull(), ) - override fun afterStepIsReached(state: OrgGovBodyState) { + override fun afterStepIsReached(state: OrgGovBodyMembersState) { // ensure that if you ever get to this page we reset any state that is used by one of the buttons. // this means we can be certain all the buttons will always work even if you use the browser back buttons. state.editingGovBodyMemberId = null } - private fun getMemberRows(state: OrgGovBodyState): List { + private fun getMemberRows(state: OrgGovBodyMembersState): List { val membersMap = state.governingBodyMembersMap ?: emptyMap() return membersMap .toList() @@ -64,15 +64,15 @@ class OrgGovBodyMemberListStepConfig( } } - override fun chooseTemplate(state: OrgGovBodyState): String = "forms/addAnotherForm" + override fun chooseTemplate(state: OrgGovBodyMembersState): String = "forms/addAnotherForm" - override fun mode(state: OrgGovBodyState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } + override fun mode(state: OrgGovBodyMembersState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } } @JourneyFrameworkComponent final class OrgGovBodyMemberListStep( stepConfig: OrgGovBodyMemberListStepConfig, -) : RequestableStep(stepConfig) { +) : RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "organisation-governing-body-member-list" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberNameStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberNameStepConfig.kt index 2a0eb2f45d..4269234e05 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberNameStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberNameStepConfig.kt @@ -4,23 +4,23 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.constants.FORM_MODEL_ATTR_NAME import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.GoverningBodyMemberNameFormModel @JourneyFrameworkComponent class OrgGovBodyMemberNameStepConfig : - AbstractRequestableStepConfig() { + AbstractRequestableStepConfig() { override val formModelClass = GoverningBodyMemberNameFormModel::class - override fun getStepSpecificContent(state: OrgGovBodyState) = + override fun getStepSpecificContent(state: OrgGovBodyMembersState) = mapOf( "fieldSetHeading" to "forms.orgGovBodyMemberName.fieldSetHeading", "submitButtonText" to "forms.buttons.continue", ) override fun resolvePageContent( - state: OrgGovBodyState, + state: OrgGovBodyMembersState, defaultContent: Map, ): Map { val formModel = defaultContent[FORM_MODEL_ATTR_NAME] as? GoverningBodyMemberNameFormModel @@ -32,18 +32,18 @@ class OrgGovBodyMemberNameStepConfig : return defaultContent + (FORM_MODEL_ATTR_NAME to prepopulatedFormModel) } - override fun chooseTemplate(state: OrgGovBodyState) = "forms/nameForm" + override fun chooseTemplate(state: OrgGovBodyMembersState) = "forms/nameForm" - override fun mode(state: OrgGovBodyState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } + override fun mode(state: OrgGovBodyMembersState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } - private fun getEditingMemberOrNull(state: OrgGovBodyState) = + private fun getEditingMemberOrNull(state: OrgGovBodyMembersState) = state.editingGovBodyMemberId?.let { state.governingBodyMembersMap?.get(it) } } @JourneyFrameworkComponent final class OrgGovBodyMemberNameStep( stepConfig: OrgGovBodyMemberNameStepConfig, -) : RequestableStep(stepConfig) { +) : RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "organisation-governing-body-member-name" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyWhoToProvideStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyWhoToProvideStepConfig.kt index 5ae0d26457..8a05d5ad25 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyWhoToProvideStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyWhoToProvideStepConfig.kt @@ -5,17 +5,17 @@ import uk.gov.communities.prsdb.webapp.constants.FORM_MODEL_ATTR_NAME import uk.gov.communities.prsdb.webapp.constants.enums.GoverningBodyMemberType import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgGovBodyWhoToProvideFormModel import uk.gov.communities.prsdb.webapp.models.viewModels.formModels.RadiosButtonViewModel @JourneyFrameworkComponent class OrgGovBodyWhoToProvideStepConfig : - AbstractRequestableStepConfig() { + AbstractRequestableStepConfig() { override val formModelClass = OrgGovBodyWhoToProvideFormModel::class - override fun getStepSpecificContent(state: OrgGovBodyState) = + override fun getStepSpecificContent(state: OrgGovBodyMembersState) = mapOf( "fieldSetHeading" to "registerAsALandlord.orgGovBodyWhoToProvide.fieldSetHeading", "fieldName" to "whoToProvide", @@ -41,7 +41,7 @@ class OrgGovBodyWhoToProvideStepConfig : ) override fun resolvePageContent( - state: OrgGovBodyState, + state: OrgGovBodyMembersState, defaultContent: Map, ): Map { val formModel = defaultContent[FORM_MODEL_ATTR_NAME] as? OrgGovBodyWhoToProvideFormModel @@ -53,21 +53,21 @@ class OrgGovBodyWhoToProvideStepConfig : return defaultContent + (FORM_MODEL_ATTR_NAME to prepopulatedFormModel) } - override fun chooseTemplate(state: OrgGovBodyState) = "forms/orgGovBodyWhoToProvideForm" + override fun chooseTemplate(state: OrgGovBodyMembersState) = "forms/orgGovBodyWhoToProvideForm" - override fun mode(state: OrgGovBodyState) = + override fun mode(state: OrgGovBodyMembersState) = getFormModelFromStateOrNull( state, )?.whoToProvide?.let { Complete.COMPLETE } - private fun getEditingMemberOrNull(state: OrgGovBodyState) = + private fun getEditingMemberOrNull(state: OrgGovBodyMembersState) = state.editingGovBodyMemberId?.let { state.governingBodyMembersMap?.get(it) } } @JourneyFrameworkComponent final class OrgGovBodyWhoToProvideStep( stepConfig: OrgGovBodyWhoToProvideStepConfig, -) : RequestableStep(stepConfig) { +) : RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "organisation-governing-body-who-to-provide" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/RemoveGovBodyMemberStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/RemoveGovBodyMemberStepConfig.kt index 65c0f767b4..e945704865 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/RemoveGovBodyMemberStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/RemoveGovBodyMemberStepConfig.kt @@ -4,7 +4,7 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep import uk.gov.communities.prsdb.webapp.journeys.StepLifecycleOrchestrator.RedirectingStepLifecycleOrchestrator -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState import uk.gov.communities.prsdb.webapp.journeys.shared.AnyMembers import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.NoInputFormModel import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @@ -12,36 +12,36 @@ import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @JourneyFrameworkComponent class RemoveGovBodyMemberStepConfig( private val collectionKeyParameterService: CollectionKeyParameterService, -) : AbstractRequestableStepConfig() { +) : AbstractRequestableStepConfig() { override val formModelClass = NoInputFormModel::class override fun getStepLifecycleOrchestrator(journeyStep: JourneyStep<*, *, *>) = RedirectingStepLifecycleOrchestrator(journeyStep) - override fun getStepSpecificContent(state: OrgGovBodyState): Map = emptyMap() + override fun getStepSpecificContent(state: OrgGovBodyMembersState): Map = emptyMap() - override fun chooseTemplate(state: OrgGovBodyState): String = "" + override fun chooseTemplate(state: OrgGovBodyMembersState): String = "" - override fun beforeAttemptingToReachStep(state: OrgGovBodyState): Boolean { + override fun beforeAttemptingToReachStep(state: OrgGovBodyMembersState): Boolean { val keyToRemove = collectionKeyParameterService.getParameterOrNull() val currentMap = state.governingBodyMembersMap ?: emptyMap() return keyToRemove != null && keyToRemove in currentMap.keys } - override fun afterStepIsReached(state: OrgGovBodyState) { + override fun afterStepIsReached(state: OrgGovBodyMembersState) { val keyToRemove = collectionKeyParameterService.getParameterOrNull() ?: return val currentMap = state.governingBodyMembersMap?.toMutableMap() ?: return currentMap.remove(keyToRemove) state.governingBodyMembersMap = currentMap } - override fun mode(state: OrgGovBodyState): AnyMembers = + override fun mode(state: OrgGovBodyMembersState): AnyMembers = if (state.governingBodyMembersMap.isNullOrEmpty()) AnyMembers.NO_MEMBERS else AnyMembers.SOME_MEMBERS } @JourneyFrameworkComponent final class RemoveGovBodyMemberStep( stepConfig: RemoveGovBodyMemberStepConfig, -) : JourneyStep.RequestableStep(stepConfig) { +) : JourneyStep.RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "remove-governing-body-member" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SaveGovBodyMemberStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SaveGovBodyMemberStepConfig.kt index a45794863e..35d38fd08d 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SaveGovBodyMemberStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SaveGovBodyMemberStepConfig.kt @@ -5,15 +5,15 @@ import uk.gov.communities.prsdb.webapp.exceptions.PrsdbWebException import uk.gov.communities.prsdb.webapp.helpers.DateTimeHelper import uk.gov.communities.prsdb.webapp.journeys.AbstractInternalStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel @JourneyFrameworkComponent -class SaveGovBodyMemberStepConfig : AbstractInternalStepConfig() { - override fun mode(state: OrgGovBodyState): Complete = Complete.COMPLETE +class SaveGovBodyMemberStepConfig : AbstractInternalStepConfig() { + override fun mode(state: OrgGovBodyMembersState): Complete = Complete.COMPLETE - override fun afterStepIsReached(state: OrgGovBodyState) { + override fun afterStepIsReached(state: OrgGovBodyMembersState) { val name = state.orgGovBodyMemberNameStep.formModelOrNull?.name ?: throw PrsdbWebException("Governing body member name step data is missing") @@ -63,4 +63,4 @@ class SaveGovBodyMemberStepConfig : AbstractInternalStepConfig(stepConfig) +) : JourneyStep.InternalStep(stepConfig) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SetStateForGovBodyMemberEditStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SetStateForGovBodyMemberEditStepConfig.kt index 2fce52fc40..57bba85644 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SetStateForGovBodyMemberEditStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SetStateForGovBodyMemberEditStepConfig.kt @@ -4,7 +4,7 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep import uk.gov.communities.prsdb.webapp.journeys.StepLifecycleOrchestrator.RedirectingStepLifecycleOrchestrator -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.NoInputFormModel import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @@ -12,33 +12,33 @@ import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @JourneyFrameworkComponent class SetStateForGovBodyMemberEditStepConfig( private val collectionKeyParameterService: CollectionKeyParameterService, -) : AbstractRequestableStepConfig() { +) : AbstractRequestableStepConfig() { override val formModelClass = NoInputFormModel::class override fun getStepLifecycleOrchestrator(journeyStep: JourneyStep<*, *, *>) = RedirectingStepLifecycleOrchestrator(journeyStep) - override fun getStepSpecificContent(state: OrgGovBodyState): Map = emptyMap() + override fun getStepSpecificContent(state: OrgGovBodyMembersState): Map = emptyMap() - override fun chooseTemplate(state: OrgGovBodyState): String = "" + override fun chooseTemplate(state: OrgGovBodyMembersState): String = "" - override fun beforeAttemptingToReachStep(state: OrgGovBodyState): Boolean { + override fun beforeAttemptingToReachStep(state: OrgGovBodyMembersState): Boolean { val keyToEdit = collectionKeyParameterService.getParameterOrNull() val currentMap = state.governingBodyMembersMap ?: emptyMap() return keyToEdit != null && keyToEdit in currentMap.keys } - override fun afterStepIsReached(state: OrgGovBodyState) { + override fun afterStepIsReached(state: OrgGovBodyMembersState) { val keyToEdit = collectionKeyParameterService.getParameterOrNull() ?: return state.editingGovBodyMemberId = keyToEdit } - override fun mode(state: OrgGovBodyState): Complete = Complete.COMPLETE + override fun mode(state: OrgGovBodyMembersState): Complete = Complete.COMPLETE } @JourneyFrameworkComponent final class SetStateForGovBodyMemberEditStep( stepConfig: SetStateForGovBodyMemberEditStepConfig, -) : JourneyStep.RequestableStep(stepConfig) { +) : JourneyStep.RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "load-governing-body-member-for-edit" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt index f6c9057027..67629e99e3 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt @@ -261,11 +261,14 @@ class LandlordRegistrationTask( } LeadTrusteeNameStep.ROUTE_SEGMENT -> { - duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.leadTrusteeTask, null) + duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.orgTypeTask.leadTrusteeTask, null) } OrgGovBodyMemberListStep.ROUTE_SEGMENT -> { - duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.orgGovBodyTask, null) + duplicableCheckAnswerTask( + journey.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask.orgGovBodyMembersTask, + null, + ) } OrgMainContactStep.ROUTE_SEGMENT -> { diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt index bcd50340e7..07b8346199 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt @@ -16,6 +16,7 @@ class OrgCompaniesHouseTask( journeyStateService: JourneyStateService, override val orgCompaniesHouseStep: OrgCompaniesHouseStep, override val orgCompanyNumberStep: OrgCompanyNumberStep, + override val orgGovBodyTask: OrgGovBodyTask, ) : DuplicableTask(journeyStateService), OrgCompaniesHouseState { override val taskState get() = this @@ -27,7 +28,7 @@ class OrgCompaniesHouseTask( nextStep { mode -> when (mode) { YesOrNo.YES -> journey.orgCompanyNumberStep - YesOrNo.NO -> exitStep + YesOrNo.NO -> journey.orgGovBodyTask.firstStep } } } @@ -36,11 +37,15 @@ class OrgCompaniesHouseTask( parents { journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.YES) } nextStep { exitStep } } + duplicableTask(journey.orgGovBodyTask) { + parents { journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO) } + nextStep { exitStep } + } exitStep { parents { OrParents( - journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO), journey.orgCompanyNumberStep.isComplete(), + journey.orgGovBodyTask.isComplete(), ) } } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyMembersTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyMembersTask.kt new file mode 100644 index 0000000000..59445b69df --- /dev/null +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyMembersTask.kt @@ -0,0 +1,111 @@ +package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks + +import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent +import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask +import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService +import uk.gov.communities.prsdb.webapp.journeys.OrParents +import uk.gov.communities.prsdb.webapp.journeys.hasOutcome +import uk.gov.communities.prsdb.webapp.journeys.isComplete +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberListStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberNameStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyWhoToProvideStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.RemoveGovBodyMemberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SaveGovBodyMemberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SetStateForGovBodyMemberEditStep +import uk.gov.communities.prsdb.webapp.journeys.shared.AnyMembers +import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.GovBodyMemberAddressTask +import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel + +@JourneyFrameworkComponent +class OrgGovBodyMembersTask( + journeyStateService: JourneyStateService, + override val hasAnyGovBodyMembersStep: HasAnyGovBodyMembersStep, + override val orgGovBodyWhoToProvideStep: OrgGovBodyWhoToProvideStep, + override val orgGovBodyMemberNameStep: OrgGovBodyMemberNameStep, + override val orgGovBodyMemberDobStep: OrgGovBodyMemberDobStep, + override val govBodyMemberAddressTask: GovBodyMemberAddressTask, + override val orgGovBodyMemberListStep: OrgGovBodyMemberListStep, + override val saveGovBodyMemberStep: SaveGovBodyMemberStep, + override val setStateForGovBodyMemberEditStep: SetStateForGovBodyMemberEditStep, + override val removeGovBodyMemberStep: RemoveGovBodyMemberStep, +) : DuplicableTask(journeyStateService), + OrgGovBodyMembersState { + override val taskState get() = this + + override var governingBodyMembersMap: Map? by delegateProvider.nullableDelegate( + "governingBodyMembersMap", + ) + override var nextGoverningBodyMemberId: Int? by delegateProvider.nullableDelegate("nextGoverningBodyMemberId") + override var editingGovBodyMemberId: Int? by delegateProvider.nullableDelegate("editingGovBodyMemberId") + + override fun makeSubJourney(state: OrgGovBodyMembersState) = + subJourney(state) { + step(journey.hasAnyGovBodyMembersStep) { + nextStep { mode -> + when (mode) { + AnyMembers.NO_MEMBERS -> journey.orgGovBodyWhoToProvideStep + AnyMembers.SOME_MEMBERS -> journey.orgGovBodyMemberListStep + } + } + } + step(journey.orgGovBodyWhoToProvideStep) { + routeSegment(OrgGovBodyWhoToProvideStep.ROUTE_SEGMENT) + parents { + OrParents( + journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.NO_MEMBERS), + journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS), + ) + } + nextStep { journey.orgGovBodyMemberNameStep } + } + step(journey.orgGovBodyMemberNameStep) { + routeSegment(OrgGovBodyMemberNameStep.ROUTE_SEGMENT) + parents { journey.orgGovBodyWhoToProvideStep.isComplete() } + nextStep { journey.orgGovBodyMemberDobStep } + } + step(journey.orgGovBodyMemberDobStep) { + routeSegment(OrgGovBodyMemberDobStep.ROUTE_SEGMENT) + parents { journey.orgGovBodyMemberNameStep.isComplete() } + nextStep { journey.govBodyMemberAddressTask.firstStep } + } + duplicableTask(journey.govBodyMemberAddressTask, GovBodyMemberAddressTask.ROUTE_SEGMENT) { + parents { journey.orgGovBodyMemberDobStep.isComplete() } + nextStep { journey.saveGovBodyMemberStep } + } + step(journey.saveGovBodyMemberStep) { + parents { journey.govBodyMemberAddressTask.isComplete() } + nextStep { journey.orgGovBodyMemberListStep } + configureStep(journey.govBodyMemberAddressTask.selectAddressStep) { + withAdditionalContentProperties { + mapOf("fieldSetHeading" to "forms.selectAddress.govBodyMemberRegistration.fieldSetHeading") + } + } + } + step(journey.orgGovBodyMemberListStep) { + routeSegment(OrgGovBodyMemberListStep.ROUTE_SEGMENT) + parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } + nextStep { exitStep } + } + step(journey.setStateForGovBodyMemberEditStep) { + routeSegment(SetStateForGovBodyMemberEditStep.ROUTE_SEGMENT) + parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } + nextStep { journey.orgGovBodyWhoToProvideStep } + } + step(journey.removeGovBodyMemberStep) { + routeSegment(RemoveGovBodyMemberStep.ROUTE_SEGMENT) + parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } + nextStep { mode -> + when (mode) { + AnyMembers.SOME_MEMBERS -> journey.orgGovBodyMemberListStep + AnyMembers.NO_MEMBERS -> journey.orgGovBodyWhoToProvideStep + } + } + } + exitStep { + parents { journey.orgGovBodyMemberListStep.isComplete() } + } + } +} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyTask.kt index f652fe6967..5569b7f307 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyTask.kt @@ -7,19 +7,8 @@ import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService import uk.gov.communities.prsdb.webapp.journeys.hasOutcome import uk.gov.communities.prsdb.webapp.journeys.isComplete import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyDetailsStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberListStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMustProvideInfoStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyWhoToProvideStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.RemoveGovBodyMemberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SaveGovBodyMemberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SetStateForGovBodyMemberEditStep -import uk.gov.communities.prsdb.webapp.journeys.shared.AnyMembers -import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.GovBodyMemberAddressTask -import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgGovBodyDetailsMode @JourneyFrameworkComponent @@ -27,32 +16,18 @@ class OrgGovBodyTask( journeyStateService: JourneyStateService, override val orgGovBodyDetailsStep: OrgGovBodyDetailsStep, override val orgGovBodyMustProvideInfoStep: OrgGovBodyMustProvideInfoStep, - override val orgGovBodyWhoToProvideStep: OrgGovBodyWhoToProvideStep, - override val orgGovBodyMemberNameStep: OrgGovBodyMemberNameStep, - override val orgGovBodyMemberDobStep: OrgGovBodyMemberDobStep, - override val govBodyMemberAddressTask: GovBodyMemberAddressTask, - override val orgGovBodyMemberListStep: OrgGovBodyMemberListStep, - override val hasAnyGovBodyMembersStep: HasAnyGovBodyMembersStep, - override val saveGovBodyMemberStep: SaveGovBodyMemberStep, - override val setStateForGovBodyMemberEditStep: SetStateForGovBodyMemberEditStep, - override val removeGovBodyMemberStep: RemoveGovBodyMemberStep, + override val orgGovBodyMembersTask: OrgGovBodyMembersTask, ) : DuplicableTask(journeyStateService), OrgGovBodyState { override val taskState get() = this - override var governingBodyMembersMap: Map? by delegateProvider.nullableDelegate( - "governingBodyMembersMap", - ) - override var nextGoverningBodyMemberId: Int? by delegateProvider.nullableDelegate("nextGoverningBodyMemberId") - override var editingGovBodyMemberId: Int? by delegateProvider.nullableDelegate("editingGovBodyMemberId") - override fun makeSubJourney(state: OrgGovBodyState) = subJourney(state) { step(journey.orgGovBodyDetailsStep) { routeSegment(OrgGovBodyDetailsStep.ROUTE_SEGMENT) nextDestination { mode -> when (mode) { - OrgGovBodyDetailsMode.HAS_DETAILS -> Destination(journey.hasAnyGovBodyMembersStep) + OrgGovBodyDetailsMode.HAS_DETAILS -> Destination(journey.orgGovBodyMembersTask.firstStep) OrgGovBodyDetailsMode.NO_DETAILS -> Destination(journey.orgGovBodyMustProvideInfoStep) } } @@ -62,74 +37,12 @@ class OrgGovBodyTask( parents { journey.orgGovBodyDetailsStep.hasOutcome(OrgGovBodyDetailsMode.NO_DETAILS) } noNextDestination() } - step(journey.hasAnyGovBodyMembersStep) { - parents { journey.orgGovBodyDetailsStep.hasOutcome(OrgGovBodyDetailsMode.HAS_DETAILS) } - nextStep { mode -> - when (mode) { - AnyMembers.NO_MEMBERS -> journey.orgGovBodyWhoToProvideStep - AnyMembers.SOME_MEMBERS -> journey.orgGovBodyMemberListStep - } - } - } - step(journey.setStateForGovBodyMemberEditStep) { - routeSegment(SetStateForGovBodyMemberEditStep.ROUTE_SEGMENT) - parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } - nextStep { journey.orgGovBodyWhoToProvideStep } - } - step(journey.removeGovBodyMemberStep) { - routeSegment(RemoveGovBodyMemberStep.ROUTE_SEGMENT) - parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } - nextStep { mode -> - when (mode) { - AnyMembers.SOME_MEMBERS -> journey.orgGovBodyMemberListStep - AnyMembers.NO_MEMBERS -> journey.orgGovBodyDetailsStep - } - } - } - step(journey.orgGovBodyWhoToProvideStep) { - routeSegment(OrgGovBodyWhoToProvideStep.ROUTE_SEGMENT) + duplicableTask(journey.orgGovBodyMembersTask) { parents { journey.orgGovBodyDetailsStep.hasOutcome(OrgGovBodyDetailsMode.HAS_DETAILS) } - backDestination { - if (journey.governingBodyMembersMap.isNullOrEmpty()) { - Destination(journey.orgGovBodyDetailsStep) - } else { - Destination(journey.orgGovBodyMemberListStep) - } - } - nextStep { journey.orgGovBodyMemberNameStep } - } - step(journey.orgGovBodyMemberNameStep) { - routeSegment(OrgGovBodyMemberNameStep.ROUTE_SEGMENT) - parents { journey.orgGovBodyWhoToProvideStep.isComplete() } - nextStep { journey.orgGovBodyMemberDobStep } - } - step(journey.orgGovBodyMemberDobStep) { - routeSegment(OrgGovBodyMemberDobStep.ROUTE_SEGMENT) - parents { journey.orgGovBodyMemberNameStep.isComplete() } - nextStep { journey.govBodyMemberAddressTask.firstStep } - } - duplicableTask(journey.govBodyMemberAddressTask, GovBodyMemberAddressTask.ROUTE_SEGMENT) { - parents { journey.orgGovBodyMemberDobStep.isComplete() } - nextStep { journey.saveGovBodyMemberStep } - } - step(journey.saveGovBodyMemberStep) { - parents { journey.govBodyMemberAddressTask.isComplete() } - nextStep { journey.orgGovBodyMemberListStep } - configureStep(journey.govBodyMemberAddressTask.selectAddressStep) { - withAdditionalContentProperties { - mapOf("fieldSetHeading" to "forms.selectAddress.govBodyMemberRegistration.fieldSetHeading") - } - } - } - step(journey.orgGovBodyMemberListStep) { - routeSegment(OrgGovBodyMemberListStep.ROUTE_SEGMENT) - parents { - journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) - } nextStep { exitStep } } exitStep { - parents { journey.orgGovBodyMemberListStep.isComplete() } + parents { journey.orgGovBodyMembersTask.isComplete() } } } } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt index 61bc4c9018..e15a83e14a 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt @@ -1,12 +1,8 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent -import uk.gov.communities.prsdb.webapp.journeys.AndParents -import uk.gov.communities.prsdb.webapp.journeys.Destination import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService -import uk.gov.communities.prsdb.webapp.journeys.OrParents -import uk.gov.communities.prsdb.webapp.journeys.hasOutcome import uk.gov.communities.prsdb.webapp.journeys.isComplete import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationOrgLandlordState import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgAddressStep @@ -14,10 +10,7 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgMainContactStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgPhoneNumberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeMode -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.UpdateDetailsTodoStep -import uk.gov.communities.prsdb.webapp.journeys.shared.YesOrNo @JourneyFrameworkComponent class OrgLandlordRegistrationTask( @@ -26,11 +19,9 @@ class OrgLandlordRegistrationTask( override val orgAddressStep: OrgAddressStep, override val orgEmailStep: OrgEmailStep, override val orgPhoneNumberStep: OrgPhoneNumberStep, - override val orgTypeStep: OrgTypeStep, - override val leadTrusteeTask: LeadTrusteeTask, + override val orgTypeTask: OrgTypeTask, override val charityTask: OrgCharityTask, override val companiesHouseTask: OrgCompaniesHouseTask, - override val orgGovBodyTask: OrgGovBodyTask, override val orgMainContactStep: OrgMainContactStep, // TODO PDJB-1237 PDJB-1238: remove this placeholder once the org type and companies house update journeys exist. override val updateDetailsTodoStep: UpdateDetailsTodoStep, @@ -57,56 +48,23 @@ class OrgLandlordRegistrationTask( step(journey.orgPhoneNumberStep) { routeSegment(OrgPhoneNumberStep.ROUTE_SEGMENT) parents { journey.orgEmailStep.isComplete() } - nextStep { journey.orgTypeStep } + nextStep { journey.orgTypeTask.firstStep } } - step(journey.orgTypeStep) { - routeSegment(OrgTypeStep.ROUTE_SEGMENT) + duplicableTask(journey.orgTypeTask) { parents { journey.orgPhoneNumberStep.isComplete() } - nextDestination { mode -> - when (mode) { - OrgTypeMode.INCLUDES_TRUST -> Destination(journey.leadTrusteeTask.firstStep) - OrgTypeMode.EXCLUDES_TRUST -> Destination(journey.charityTask.firstStep) - } - } - } - duplicableTask(journey.leadTrusteeTask) { - parents { journey.orgTypeStep.hasOutcome(OrgTypeMode.INCLUDES_TRUST) } nextStep { journey.charityTask.firstStep } } duplicableTask(journey.charityTask) { - parents { - OrParents( - journey.leadTrusteeTask.isComplete(), - journey.orgTypeStep.hasOutcome(OrgTypeMode.EXCLUDES_TRUST), - ) - } + parents { journey.orgTypeTask.isComplete() } nextStep { journey.companiesHouseTask.firstStep } } duplicableTask(journey.companiesHouseTask) { parents { journey.charityTask.isComplete() } - nextDestination { - if (journey.companiesHouseTask.orgCompaniesHouseStep.outcome == YesOrNo.NO) { - Destination(journey.orgGovBodyTask.firstStep) - } else { - Destination(journey.orgMainContactStep) - } - } - } - duplicableTask(journey.orgGovBodyTask) { - parents { journey.companiesHouseTask.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO) } nextStep { journey.orgMainContactStep } } step(journey.orgMainContactStep) { routeSegment(OrgMainContactStep.ROUTE_SEGMENT) - parents { - OrParents( - AndParents( - journey.companiesHouseTask.isComplete(), - journey.companiesHouseTask.orgCompaniesHouseStep.hasOutcome(YesOrNo.YES), - ), - journey.orgGovBodyTask.isComplete(), - ) - } + parents { journey.companiesHouseTask.isComplete() } nextStep { exitStep } } exitStep { diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgTypeTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgTypeTask.kt new file mode 100644 index 0000000000..4ae55e59e0 --- /dev/null +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgTypeTask.kt @@ -0,0 +1,46 @@ +package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks + +import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent +import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask +import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService +import uk.gov.communities.prsdb.webapp.journeys.OrParents +import uk.gov.communities.prsdb.webapp.journeys.hasOutcome +import uk.gov.communities.prsdb.webapp.journeys.isComplete +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgTypeState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeMode +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep + +@JourneyFrameworkComponent +class OrgTypeTask( + journeyStateService: JourneyStateService, + override val orgTypeStep: OrgTypeStep, + override val leadTrusteeTask: LeadTrusteeTask, +) : DuplicableTask(journeyStateService), + OrgTypeState { + override val taskState get() = this + + override fun makeSubJourney(state: OrgTypeState) = + subJourney(state) { + step(journey.orgTypeStep) { + routeSegment(OrgTypeStep.ROUTE_SEGMENT) + nextStep { mode -> + when (mode) { + OrgTypeMode.INCLUDES_TRUST -> journey.leadTrusteeTask.firstStep + OrgTypeMode.EXCLUDES_TRUST -> exitStep + } + } + } + duplicableTask(journey.leadTrusteeTask) { + parents { journey.orgTypeStep.hasOutcome(OrgTypeMode.INCLUDES_TRUST) } + nextStep { exitStep } + } + exitStep { + parents { + OrParents( + journey.orgTypeStep.hasOutcome(OrgTypeMode.EXCLUDES_TRUST), + journey.leadTrusteeTask.isComplete(), + ) + } + } + } +} diff --git a/src/test/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfigTests.kt b/src/test/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfigTests.kt index fb2307986e..9e6acf348a 100644 --- a/src/test/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfigTests.kt +++ b/src/test/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfigTests.kt @@ -5,14 +5,14 @@ import org.junit.jupiter.api.extension.ExtendWith import org.mockito.Mock import org.mockito.junit.jupiter.MockitoExtension import org.mockito.kotlin.verify -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService import uk.gov.communities.prsdb.webapp.testHelpers.mockObjects.AlwaysTrueValidator @ExtendWith(MockitoExtension::class) class OrgGovBodyMemberListStepConfigTests { @Mock - lateinit var mockState: OrgGovBodyState + lateinit var mockState: OrgGovBodyMembersState @Mock lateinit var urlParameterService: CollectionKeyParameterService From 547989b6f4e0da24694717a8db4a99ec39bd828b Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Fri, 31 Jul 2026 14:52:53 +0100 Subject: [PATCH 13/17] PDJB-1168: fix tests --- .../webapp/integration/LandlordRegistrationJourneyTests.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/LandlordRegistrationJourneyTests.kt b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/LandlordRegistrationJourneyTests.kt index 4a8ae42255..8b905bc69a 100644 --- a/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/LandlordRegistrationJourneyTests.kt +++ b/src/test/kotlin/uk/gov/communities/prsdb/webapp/integration/LandlordRegistrationJourneyTests.kt @@ -788,7 +788,7 @@ class LandlordRegistrationJourneyTests : IntegrationTestWithMutableData("data-mo .getActionLink("Remove") .clickAndWait() - assertPageIs(page, OrgGovBodyDetailsFormPageLandlordRegistration::class) + assertPageIs(page, OrgGovBodyWhoToProvideFormPageLandlordRegistration::class) } @Test @@ -809,6 +809,9 @@ class LandlordRegistrationJourneyTests : IntegrationTestWithMutableData("data-mo assertPageIs(page, OrgGovBodyWhoToProvideFormPageLandlordRegistration::class) BackLink.default(page).clickAndWait() + val detailsPage = assertPageIs(page, OrgGovBodyDetailsFormPageLandlordRegistration::class) + detailsPage.submitHasDetails() + val returnedListPage = assertPageIs(page, OrgGovBodyMemberListFormPageLandlordRegistration::class) returnedListPage.addAnotherButton.click() From bea079e8d3267c99444de092310973e8390567e4 Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Fri, 31 Jul 2026 17:14:09 +0100 Subject: [PATCH 14/17] PDJB-1168: strengthen cya conditions --- .../tasks/LandlordRegistrationTask.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt index 3f527120be..6203be704f 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt @@ -5,6 +5,7 @@ import org.springframework.beans.factory.ObjectFactory import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent import uk.gov.communities.prsdb.webapp.config.managers.FeatureFlagManager import uk.gov.communities.prsdb.webapp.constants.ORGANISATION_LANDLORD_REGISTRATION +import uk.gov.communities.prsdb.webapp.journeys.AndParents import uk.gov.communities.prsdb.webapp.journeys.Destination import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService @@ -153,8 +154,14 @@ class LandlordRegistrationTask( routeSegment(AbstractCheckYourAnswersStep.ROUTE_SEGMENT) parents { OrParents( - journey.individualLandlordLocationTask.isComplete(), - journey.orgLandlordRegistrationTask.isComplete(), + AndParents( + journey.individualLandlordLocationTask.isComplete(), + journey.landlordTypeStep.hasOutcome(LandlordTypeMode.INDIVIDUAL), + ), + AndParents( + journey.orgLandlordRegistrationTask.isComplete(), + journey.landlordTypeStep.hasOutcome(LandlordTypeMode.ORGANISATION), + ), ) } nextStep { exitStep } From 58f50bf0a7c2d19b532cc45e8279dc5203369f10 Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Fri, 31 Jul 2026 17:18:31 +0100 Subject: [PATCH 15/17] PDJB-1168: revert task restructure --- .../LandlordRegistrationOrgLandlordState.kt | 8 +- .../states/OrgCompaniesHouseState.kt | 2 - .../states/OrgGovBodyMembersState.kt | 28 ----- .../states/OrgGovBodyState.kt | 24 +++- .../states/OrgTypeState.kt | 10 -- .../HasAnyGovBodyMembersStepConfig.kt | 8 +- .../LandlordRegistrationCyaStepConfig.kt | 54 ++++----- .../OrgGovBodyMemberDobStepConfig.kt | 16 +-- .../OrgGovBodyMemberListStepConfig.kt | 16 +-- .../OrgGovBodyMemberNameStepConfig.kt | 16 +-- .../OrgGovBodyWhoToProvideStepConfig.kt | 16 +-- .../RemoveGovBodyMemberStepConfig.kt | 16 +-- .../stepConfig/SaveGovBodyMemberStepConfig.kt | 10 +- .../SetStateForGovBodyMemberEditStepConfig.kt | 16 +-- .../tasks/LandlordRegistrationTask.kt | 7 +- .../tasks/OrgCompaniesHouseTask.kt | 9 +- .../tasks/OrgGovBodyMembersTask.kt | 111 ------------------ .../tasks/OrgGovBodyTask.kt | 95 ++++++++++++++- .../tasks/OrgLandlordRegistrationTask.kt | 52 +++++++- .../landlordRegistration/tasks/OrgTypeTask.kt | 46 -------- .../OrgGovBodyMemberListStepConfigTests.kt | 4 +- 21 files changed, 251 insertions(+), 313 deletions(-) delete mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyMembersState.kt delete mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgTypeState.kt delete mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyMembersTask.kt delete mode 100644 src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgTypeTask.kt diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt index b5b50e4155..6fac33c16d 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/LandlordRegistrationOrgLandlordState.kt @@ -6,19 +6,23 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgMainContactStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgPhoneNumberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.UpdateDetailsTodoStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.LeadTrusteeTask import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgCharityTask import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgCompaniesHouseTask -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgTypeTask +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgGovBodyTask interface LandlordRegistrationOrgLandlordState : JourneyState { val orgNameStep: OrgNameStep val orgAddressStep: OrgAddressStep val orgEmailStep: OrgEmailStep val orgPhoneNumberStep: OrgPhoneNumberStep - val orgTypeTask: OrgTypeTask + val orgTypeStep: OrgTypeStep val companiesHouseTask: OrgCompaniesHouseTask + val orgGovBodyTask: OrgGovBodyTask val charityTask: OrgCharityTask + val leadTrusteeTask: LeadTrusteeTask val orgMainContactStep: OrgMainContactStep // TODO PDJB-1237 PDJB-1238: remove this placeholder once the org type and companies house update journeys exist. diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt index d7e06d14c1..1d4d092c38 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt @@ -3,10 +3,8 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states import uk.gov.communities.prsdb.webapp.journeys.JourneyState import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgCompanyNumberStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgIsRegisteredCompanyStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgGovBodyTask interface OrgCompaniesHouseState : JourneyState { val orgCompaniesHouseStep: OrgIsRegisteredCompanyStep val orgCompanyNumberStep: OrgCompanyNumberStep - val orgGovBodyTask: OrgGovBodyTask } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyMembersState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyMembersState.kt deleted file mode 100644 index 3646d784ce..0000000000 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyMembersState.kt +++ /dev/null @@ -1,28 +0,0 @@ -package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states - -import uk.gov.communities.prsdb.webapp.journeys.JourneyState -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberListStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberNameStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyWhoToProvideStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.RemoveGovBodyMemberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SaveGovBodyMemberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SetStateForGovBodyMemberEditStep -import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.AddressTask -import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel - -interface OrgGovBodyMembersState : JourneyState { - val hasAnyGovBodyMembersStep: HasAnyGovBodyMembersStep - val orgGovBodyWhoToProvideStep: OrgGovBodyWhoToProvideStep - val orgGovBodyMemberNameStep: OrgGovBodyMemberNameStep - val orgGovBodyMemberDobStep: OrgGovBodyMemberDobStep - val govBodyMemberAddressTask: AddressTask - val orgGovBodyMemberListStep: OrgGovBodyMemberListStep - val saveGovBodyMemberStep: SaveGovBodyMemberStep - val setStateForGovBodyMemberEditStep: SetStateForGovBodyMemberEditStep - val removeGovBodyMemberStep: RemoveGovBodyMemberStep - var governingBodyMembersMap: Map? - var nextGoverningBodyMemberId: Int? - var editingGovBodyMemberId: Int? -} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyState.kt index 779ef7aeed..721e2ca38d 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgGovBodyState.kt @@ -1,12 +1,32 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states import uk.gov.communities.prsdb.webapp.journeys.JourneyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyDetailsStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberListStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMustProvideInfoStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.OrgGovBodyMembersTask +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyWhoToProvideStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.RemoveGovBodyMemberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SaveGovBodyMemberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SetStateForGovBodyMemberEditStep +import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.AddressTask +import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel interface OrgGovBodyState : JourneyState { val orgGovBodyDetailsStep: OrgGovBodyDetailsStep val orgGovBodyMustProvideInfoStep: OrgGovBodyMustProvideInfoStep - val orgGovBodyMembersTask: OrgGovBodyMembersTask + val orgGovBodyWhoToProvideStep: OrgGovBodyWhoToProvideStep + val orgGovBodyMemberNameStep: OrgGovBodyMemberNameStep + val orgGovBodyMemberDobStep: OrgGovBodyMemberDobStep + val govBodyMemberAddressTask: AddressTask + val orgGovBodyMemberListStep: OrgGovBodyMemberListStep + val hasAnyGovBodyMembersStep: HasAnyGovBodyMembersStep + val saveGovBodyMemberStep: SaveGovBodyMemberStep + val setStateForGovBodyMemberEditStep: SetStateForGovBodyMemberEditStep + val removeGovBodyMemberStep: RemoveGovBodyMemberStep + var governingBodyMembersMap: Map? + var nextGoverningBodyMemberId: Int? + var editingGovBodyMemberId: Int? } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgTypeState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgTypeState.kt deleted file mode 100644 index b0a3fca5b0..0000000000 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgTypeState.kt +++ /dev/null @@ -1,10 +0,0 @@ -package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states - -import uk.gov.communities.prsdb.webapp.journeys.JourneyState -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks.LeadTrusteeTask - -interface OrgTypeState : JourneyState { - val orgTypeStep: OrgTypeStep - val leadTrusteeTask: LeadTrusteeTask -} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/HasAnyGovBodyMembersStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/HasAnyGovBodyMembersStepConfig.kt index 2b1bbd6550..e7591b1ff2 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/HasAnyGovBodyMembersStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/HasAnyGovBodyMembersStepConfig.kt @@ -3,16 +3,16 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent import uk.gov.communities.prsdb.webapp.journeys.AbstractInternalStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.AnyMembers @JourneyFrameworkComponent -class HasAnyGovBodyMembersStepConfig : AbstractInternalStepConfig() { - override fun mode(state: OrgGovBodyMembersState) = +class HasAnyGovBodyMembersStepConfig : AbstractInternalStepConfig() { + override fun mode(state: OrgGovBodyState) = if (state.governingBodyMembersMap.isNullOrEmpty()) AnyMembers.NO_MEMBERS else AnyMembers.SOME_MEMBERS } @JourneyFrameworkComponent final class HasAnyGovBodyMembersStep( stepConfig: HasAnyGovBodyMembersStepConfig, -) : JourneyStep.InternalStep(stepConfig) +) : JourneyStep.InternalStep(stepConfig) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt index bca8bcb5f1..72513f2273 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt @@ -61,7 +61,7 @@ class LandlordRegistrationCyaStepConfig( if (isOrgLandlord(state)) { val org = state.orgLandlordRegistrationTask - val organisationTypes = org.orgTypeTask.orgTypeStep.formModel.getSelectedOrgTypes() + val organisationTypes = org.orgTypeStep.formModel.getSelectedOrgTypes() val isTrust = OrgType.TRUST in organisationTypes val isRegisteredCharity = org.charityTask.orgCharityStep.formModel.notNullValue(OrgIsRegisteredCharityFormModel::charity) val hasCompanyNumber = @@ -75,7 +75,7 @@ class LandlordRegistrationCyaStepConfig( val mainContact = org.orgMainContactStep.formModel val governingBodyMembers = - (org.companiesHouseTask.orgGovBodyTask.orgGovBodyMembersTask.governingBodyMembersMap ?: emptyMap()) + (org.orgGovBodyTask.governingBodyMembersMap ?: emptyMap()) .values .toList() @@ -99,18 +99,12 @@ class LandlordRegistrationCyaStepConfig( organisationCharityRegisteredWith = charityRegulator, organisationCharityNumber = getCharityNumber(state, charityRegulator), organisationLeadTrusteeName = - if (isTrust) { - org.orgTypeTask.leadTrusteeTask.leadTrusteeNameStep.formModel.notNullValue( - LeadTrusteeNameFormModel::name, - ) - } else { - null - }, + if (isTrust) org.leadTrusteeTask.leadTrusteeNameStep.formModel.notNullValue(LeadTrusteeNameFormModel::name) else null, organisationLeadTrusteeDateOfBirth = - if (isTrust) org.orgTypeTask.leadTrusteeTask.leadTrusteeDobStep.formModel.toLocalDateOrNull() else null, + if (isTrust) org.leadTrusteeTask.leadTrusteeDobStep.formModel.toLocalDateOrNull() else null, organisationLeadTrusteeEmail = if (isTrust) { - org.orgTypeTask.leadTrusteeTask.leadTrusteeEmailStep.formModel.notNullValue( + org.leadTrusteeTask.leadTrusteeEmailStep.formModel.notNullValue( LeadTrusteeEmailFormModel::emailAddress, ) } else { @@ -118,13 +112,13 @@ class LandlordRegistrationCyaStepConfig( }, organisationLeadTrusteePhoneNumber = if (isTrust) { - org.orgTypeTask.leadTrusteeTask.leadTrusteePhoneStep.formModel.notNullValue( + org.leadTrusteeTask.leadTrusteePhoneStep.formModel.notNullValue( LeadTrusteePhoneFormModel::phoneNumber, ) } else { null }, - organisationLeadTrusteeAddress = if (isTrust) org.orgTypeTask.leadTrusteeTask.trusteeAddressTask.getAddress() else null, + organisationLeadTrusteeAddress = if (isTrust) org.leadTrusteeTask.trusteeAddressTask.getAddress() else null, organisationMainContactName = mainContact.notNullValue(OrgMainContactFormModel::name), organisationMainContactEmail = mainContact.notNullValue(OrgMainContactFormModel::emailAddress), organisationMainContactPhoneNumber = mainContact.notNullValue(OrgMainContactFormModel::phoneNumber), @@ -379,11 +373,11 @@ class LandlordRegistrationCyaStepConfig( add( SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.landlordDetails.organisationType", - org.orgTypeTask.orgTypeStep.formModel.orgTypes + org.orgTypeStep.formModel.orgTypes .filterNotNull() .filter { it.isNotBlank() } .map { orgTypeMessageKey(it) }, - Destination.VisitableStep(org.orgTypeTask.orgTypeStep, state.getCyaJourneyId(org.orgTypeTask.orgTypeStep)), + Destination.VisitableStep(org.orgTypeStep, state.getCyaJourneyId(org.orgTypeStep)), ), ) @@ -409,7 +403,7 @@ class LandlordRegistrationCyaStepConfig( add( SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.landlordDetails.charityCommission", - regulatorMessageKey(charityRegulator!!), + regulatorMessageKey(charityRegulator), Destination.VisitableStep( org.charityTask.orgCharityRegisteredWithStep, state.getCyaJourneyId(org.charityTask.orgCharityRegisteredWithStep), @@ -418,7 +412,7 @@ class LandlordRegistrationCyaStepConfig( ) } if (showCharityNumber) { - add(charityNumberRow(state, charityRegulator!!)) + add(charityNumberRow(state, charityRegulator)) } val registeredWithCompaniesHouse = @@ -497,34 +491,34 @@ class LandlordRegistrationCyaStepConfig( private fun getLeadTrusteeCard(state: LandlordRegistrationState): SummaryCardViewModel? { val org = state.orgLandlordRegistrationTask - if (OrgType.TRUST !in org.orgTypeTask.orgTypeStep.formModel.getSelectedOrgTypes()) { + if (OrgType.TRUST !in org.orgTypeStep.formModel.getSelectedOrgTypes()) { return null } val rows = listOf( SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.name", - org.orgTypeTask.leadTrusteeTask.leadTrusteeNameStep.formModel.notNullValue(LeadTrusteeNameFormModel::name), + org.leadTrusteeTask.leadTrusteeNameStep.formModel.notNullValue(LeadTrusteeNameFormModel::name), Destination.Nowhere(), ), SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.dateOfBirth", - org.orgTypeTask.leadTrusteeTask.leadTrusteeDobStep.formModel.toLocalDateOrNull(), + org.leadTrusteeTask.leadTrusteeDobStep.formModel.toLocalDateOrNull(), Destination.Nowhere(), ), SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.email", - org.orgTypeTask.leadTrusteeTask.leadTrusteeEmailStep.formModel.notNullValue(LeadTrusteeEmailFormModel::emailAddress), + org.leadTrusteeTask.leadTrusteeEmailStep.formModel.notNullValue(LeadTrusteeEmailFormModel::emailAddress), Destination.Nowhere(), ), SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.phoneNumber", - org.orgTypeTask.leadTrusteeTask.leadTrusteePhoneStep.formModel.notNullValue(LeadTrusteePhoneFormModel::phoneNumber), + org.leadTrusteeTask.leadTrusteePhoneStep.formModel.notNullValue(LeadTrusteePhoneFormModel::phoneNumber), Destination.Nowhere(), ), SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.governingBody.address", - org.orgTypeTask.leadTrusteeTask.trusteeAddressTask.getAddress().toMultiLineAddress().split("\n"), + org.leadTrusteeTask.trusteeAddressTask.getAddress().toMultiLineAddress().split("\n"), Destination.Nowhere(), ), ) @@ -534,17 +528,15 @@ class LandlordRegistrationCyaStepConfig( actions = SummaryCardActionViewModel.changeAction( Destination.VisitableStep( - org.orgTypeTask.leadTrusteeTask.leadTrusteeNameStep, - state.getCyaJourneyId(org.orgTypeTask.leadTrusteeTask.leadTrusteeNameStep), + org.leadTrusteeTask.leadTrusteeNameStep, + state.getCyaJourneyId(org.leadTrusteeTask.leadTrusteeNameStep), ), ), ) } private fun getGovBodyMemberCards(state: LandlordRegistrationState): List { - val members = - state.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask.orgGovBodyMembersTask.governingBodyMembersMap - ?: emptyMap() + val members = state.orgLandlordRegistrationTask.orgGovBodyTask.governingBodyMembersMap ?: emptyMap() return members .toList() .sortedBy { it.first } @@ -578,11 +570,9 @@ class LandlordRegistrationCyaStepConfig( actions = SummaryCardActionViewModel.changeAction( Destination.VisitableStep( - state.orgLandlordRegistrationTask - .companiesHouseTask.orgGovBodyTask.orgGovBodyMembersTask.orgGovBodyMemberListStep, + state.orgLandlordRegistrationTask.orgGovBodyTask.orgGovBodyMemberListStep, state.getCyaJourneyId( - state.orgLandlordRegistrationTask - .companiesHouseTask.orgGovBodyTask.orgGovBodyMembersTask.orgGovBodyMemberListStep, + state.orgLandlordRegistrationTask.orgGovBodyTask.orgGovBodyMemberListStep, ), ), ), diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberDobStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberDobStepConfig.kt index 26fb121303..3d8dd58ea7 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberDobStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberDobStepConfig.kt @@ -4,16 +4,16 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.constants.FORM_MODEL_ATTR_NAME import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgGovBodyMemberDobFormModel @JourneyFrameworkComponent class OrgGovBodyMemberDobStepConfig : - AbstractRequestableStepConfig() { + AbstractRequestableStepConfig() { override val formModelClass = OrgGovBodyMemberDobFormModel::class - override fun getStepSpecificContent(state: OrgGovBodyMembersState) = + override fun getStepSpecificContent(state: OrgGovBodyState) = mapOf( "fieldSetHeading" to "registerAsALandlord.orgGovBodyMemberDob.fieldSetHeading", "fieldSetHint" to "registerAsALandlord.orgGovBodyMemberDob.fieldSetHint", @@ -21,7 +21,7 @@ class OrgGovBodyMemberDobStepConfig : ) override fun resolvePageContent( - state: OrgGovBodyMembersState, + state: OrgGovBodyState, defaultContent: Map, ): Map { val formModel = defaultContent[FORM_MODEL_ATTR_NAME] as? OrgGovBodyMemberDobFormModel @@ -35,18 +35,18 @@ class OrgGovBodyMemberDobStepConfig : return defaultContent + (FORM_MODEL_ATTR_NAME to prepopulatedFormModel) } - override fun chooseTemplate(state: OrgGovBodyMembersState) = "forms/dateForm" + override fun chooseTemplate(state: OrgGovBodyState) = "forms/dateForm" - override fun mode(state: OrgGovBodyMembersState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } + override fun mode(state: OrgGovBodyState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } - private fun getEditingMemberOrNull(state: OrgGovBodyMembersState) = + private fun getEditingMemberOrNull(state: OrgGovBodyState) = state.editingGovBodyMemberId?.let { state.governingBodyMembersMap?.get(it) } } @JourneyFrameworkComponent final class OrgGovBodyMemberDobStep( stepConfig: OrgGovBodyMemberDobStepConfig, -) : RequestableStep(stepConfig) { +) : RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "organisation-governing-body-member-dob" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfig.kt index f807a7b48f..9ff25dd647 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfig.kt @@ -4,7 +4,7 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.Destination import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.NoInputFormModel import uk.gov.communities.prsdb.webapp.models.viewModels.summaryModels.SummaryListRowActionsInputWithDestination @@ -14,10 +14,10 @@ import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @JourneyFrameworkComponent class OrgGovBodyMemberListStepConfig( private val urlParameterService: CollectionKeyParameterService, -) : AbstractRequestableStepConfig() { +) : AbstractRequestableStepConfig() { override val formModelClass = NoInputFormModel::class - override fun getStepSpecificContent(state: OrgGovBodyMembersState) = + override fun getStepSpecificContent(state: OrgGovBodyState) = mapOf( "addAnotherTitle" to "forms.orgGovBodyMemberList.heading", "optionalAddAnotherTitleParam" to (state.governingBodyMembersMap?.size ?: 0), @@ -29,13 +29,13 @@ class OrgGovBodyMemberListStepConfig( "addAnotherUrl" to Destination(state.orgGovBodyWhoToProvideStep).toUrlStringOrNull(), ) - override fun afterStepIsReached(state: OrgGovBodyMembersState) { + override fun afterStepIsReached(state: OrgGovBodyState) { // ensure that if you ever get to this page we reset any state that is used by one of the buttons. // this means we can be certain all the buttons will always work even if you use the browser back buttons. state.editingGovBodyMemberId = null } - private fun getMemberRows(state: OrgGovBodyMembersState): List { + private fun getMemberRows(state: OrgGovBodyState): List { val membersMap = state.governingBodyMembersMap ?: emptyMap() return membersMap .toList() @@ -64,15 +64,15 @@ class OrgGovBodyMemberListStepConfig( } } - override fun chooseTemplate(state: OrgGovBodyMembersState): String = "forms/addAnotherForm" + override fun chooseTemplate(state: OrgGovBodyState): String = "forms/addAnotherForm" - override fun mode(state: OrgGovBodyMembersState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } + override fun mode(state: OrgGovBodyState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } } @JourneyFrameworkComponent final class OrgGovBodyMemberListStep( stepConfig: OrgGovBodyMemberListStepConfig, -) : RequestableStep(stepConfig) { +) : RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "organisation-governing-body-member-list" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberNameStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberNameStepConfig.kt index 4269234e05..2a0eb2f45d 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberNameStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberNameStepConfig.kt @@ -4,23 +4,23 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.constants.FORM_MODEL_ATTR_NAME import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.GoverningBodyMemberNameFormModel @JourneyFrameworkComponent class OrgGovBodyMemberNameStepConfig : - AbstractRequestableStepConfig() { + AbstractRequestableStepConfig() { override val formModelClass = GoverningBodyMemberNameFormModel::class - override fun getStepSpecificContent(state: OrgGovBodyMembersState) = + override fun getStepSpecificContent(state: OrgGovBodyState) = mapOf( "fieldSetHeading" to "forms.orgGovBodyMemberName.fieldSetHeading", "submitButtonText" to "forms.buttons.continue", ) override fun resolvePageContent( - state: OrgGovBodyMembersState, + state: OrgGovBodyState, defaultContent: Map, ): Map { val formModel = defaultContent[FORM_MODEL_ATTR_NAME] as? GoverningBodyMemberNameFormModel @@ -32,18 +32,18 @@ class OrgGovBodyMemberNameStepConfig : return defaultContent + (FORM_MODEL_ATTR_NAME to prepopulatedFormModel) } - override fun chooseTemplate(state: OrgGovBodyMembersState) = "forms/nameForm" + override fun chooseTemplate(state: OrgGovBodyState) = "forms/nameForm" - override fun mode(state: OrgGovBodyMembersState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } + override fun mode(state: OrgGovBodyState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE } - private fun getEditingMemberOrNull(state: OrgGovBodyMembersState) = + private fun getEditingMemberOrNull(state: OrgGovBodyState) = state.editingGovBodyMemberId?.let { state.governingBodyMembersMap?.get(it) } } @JourneyFrameworkComponent final class OrgGovBodyMemberNameStep( stepConfig: OrgGovBodyMemberNameStepConfig, -) : RequestableStep(stepConfig) { +) : RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "organisation-governing-body-member-name" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyWhoToProvideStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyWhoToProvideStepConfig.kt index 8a05d5ad25..5ae0d26457 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyWhoToProvideStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyWhoToProvideStepConfig.kt @@ -5,17 +5,17 @@ import uk.gov.communities.prsdb.webapp.constants.FORM_MODEL_ATTR_NAME import uk.gov.communities.prsdb.webapp.constants.enums.GoverningBodyMemberType import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgGovBodyWhoToProvideFormModel import uk.gov.communities.prsdb.webapp.models.viewModels.formModels.RadiosButtonViewModel @JourneyFrameworkComponent class OrgGovBodyWhoToProvideStepConfig : - AbstractRequestableStepConfig() { + AbstractRequestableStepConfig() { override val formModelClass = OrgGovBodyWhoToProvideFormModel::class - override fun getStepSpecificContent(state: OrgGovBodyMembersState) = + override fun getStepSpecificContent(state: OrgGovBodyState) = mapOf( "fieldSetHeading" to "registerAsALandlord.orgGovBodyWhoToProvide.fieldSetHeading", "fieldName" to "whoToProvide", @@ -41,7 +41,7 @@ class OrgGovBodyWhoToProvideStepConfig : ) override fun resolvePageContent( - state: OrgGovBodyMembersState, + state: OrgGovBodyState, defaultContent: Map, ): Map { val formModel = defaultContent[FORM_MODEL_ATTR_NAME] as? OrgGovBodyWhoToProvideFormModel @@ -53,21 +53,21 @@ class OrgGovBodyWhoToProvideStepConfig : return defaultContent + (FORM_MODEL_ATTR_NAME to prepopulatedFormModel) } - override fun chooseTemplate(state: OrgGovBodyMembersState) = "forms/orgGovBodyWhoToProvideForm" + override fun chooseTemplate(state: OrgGovBodyState) = "forms/orgGovBodyWhoToProvideForm" - override fun mode(state: OrgGovBodyMembersState) = + override fun mode(state: OrgGovBodyState) = getFormModelFromStateOrNull( state, )?.whoToProvide?.let { Complete.COMPLETE } - private fun getEditingMemberOrNull(state: OrgGovBodyMembersState) = + private fun getEditingMemberOrNull(state: OrgGovBodyState) = state.editingGovBodyMemberId?.let { state.governingBodyMembersMap?.get(it) } } @JourneyFrameworkComponent final class OrgGovBodyWhoToProvideStep( stepConfig: OrgGovBodyWhoToProvideStepConfig, -) : RequestableStep(stepConfig) { +) : RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "organisation-governing-body-who-to-provide" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/RemoveGovBodyMemberStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/RemoveGovBodyMemberStepConfig.kt index e945704865..65c0f767b4 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/RemoveGovBodyMemberStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/RemoveGovBodyMemberStepConfig.kt @@ -4,7 +4,7 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep import uk.gov.communities.prsdb.webapp.journeys.StepLifecycleOrchestrator.RedirectingStepLifecycleOrchestrator -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.AnyMembers import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.NoInputFormModel import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @@ -12,36 +12,36 @@ import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @JourneyFrameworkComponent class RemoveGovBodyMemberStepConfig( private val collectionKeyParameterService: CollectionKeyParameterService, -) : AbstractRequestableStepConfig() { +) : AbstractRequestableStepConfig() { override val formModelClass = NoInputFormModel::class override fun getStepLifecycleOrchestrator(journeyStep: JourneyStep<*, *, *>) = RedirectingStepLifecycleOrchestrator(journeyStep) - override fun getStepSpecificContent(state: OrgGovBodyMembersState): Map = emptyMap() + override fun getStepSpecificContent(state: OrgGovBodyState): Map = emptyMap() - override fun chooseTemplate(state: OrgGovBodyMembersState): String = "" + override fun chooseTemplate(state: OrgGovBodyState): String = "" - override fun beforeAttemptingToReachStep(state: OrgGovBodyMembersState): Boolean { + override fun beforeAttemptingToReachStep(state: OrgGovBodyState): Boolean { val keyToRemove = collectionKeyParameterService.getParameterOrNull() val currentMap = state.governingBodyMembersMap ?: emptyMap() return keyToRemove != null && keyToRemove in currentMap.keys } - override fun afterStepIsReached(state: OrgGovBodyMembersState) { + override fun afterStepIsReached(state: OrgGovBodyState) { val keyToRemove = collectionKeyParameterService.getParameterOrNull() ?: return val currentMap = state.governingBodyMembersMap?.toMutableMap() ?: return currentMap.remove(keyToRemove) state.governingBodyMembersMap = currentMap } - override fun mode(state: OrgGovBodyMembersState): AnyMembers = + override fun mode(state: OrgGovBodyState): AnyMembers = if (state.governingBodyMembersMap.isNullOrEmpty()) AnyMembers.NO_MEMBERS else AnyMembers.SOME_MEMBERS } @JourneyFrameworkComponent final class RemoveGovBodyMemberStep( stepConfig: RemoveGovBodyMemberStepConfig, -) : JourneyStep.RequestableStep(stepConfig) { +) : JourneyStep.RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "remove-governing-body-member" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SaveGovBodyMemberStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SaveGovBodyMemberStepConfig.kt index 35d38fd08d..a45794863e 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SaveGovBodyMemberStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SaveGovBodyMemberStepConfig.kt @@ -5,15 +5,15 @@ import uk.gov.communities.prsdb.webapp.exceptions.PrsdbWebException import uk.gov.communities.prsdb.webapp.helpers.DateTimeHelper import uk.gov.communities.prsdb.webapp.journeys.AbstractInternalStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel @JourneyFrameworkComponent -class SaveGovBodyMemberStepConfig : AbstractInternalStepConfig() { - override fun mode(state: OrgGovBodyMembersState): Complete = Complete.COMPLETE +class SaveGovBodyMemberStepConfig : AbstractInternalStepConfig() { + override fun mode(state: OrgGovBodyState): Complete = Complete.COMPLETE - override fun afterStepIsReached(state: OrgGovBodyMembersState) { + override fun afterStepIsReached(state: OrgGovBodyState) { val name = state.orgGovBodyMemberNameStep.formModelOrNull?.name ?: throw PrsdbWebException("Governing body member name step data is missing") @@ -63,4 +63,4 @@ class SaveGovBodyMemberStepConfig : AbstractInternalStepConfig(stepConfig) +) : JourneyStep.InternalStep(stepConfig) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SetStateForGovBodyMemberEditStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SetStateForGovBodyMemberEditStepConfig.kt index 57bba85644..2fce52fc40 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SetStateForGovBodyMemberEditStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/SetStateForGovBodyMemberEditStepConfig.kt @@ -4,7 +4,7 @@ import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFramewo import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig import uk.gov.communities.prsdb.webapp.journeys.JourneyStep import uk.gov.communities.prsdb.webapp.journeys.StepLifecycleOrchestrator.RedirectingStepLifecycleOrchestrator -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.journeys.shared.Complete import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.NoInputFormModel import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @@ -12,33 +12,33 @@ import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService @JourneyFrameworkComponent class SetStateForGovBodyMemberEditStepConfig( private val collectionKeyParameterService: CollectionKeyParameterService, -) : AbstractRequestableStepConfig() { +) : AbstractRequestableStepConfig() { override val formModelClass = NoInputFormModel::class override fun getStepLifecycleOrchestrator(journeyStep: JourneyStep<*, *, *>) = RedirectingStepLifecycleOrchestrator(journeyStep) - override fun getStepSpecificContent(state: OrgGovBodyMembersState): Map = emptyMap() + override fun getStepSpecificContent(state: OrgGovBodyState): Map = emptyMap() - override fun chooseTemplate(state: OrgGovBodyMembersState): String = "" + override fun chooseTemplate(state: OrgGovBodyState): String = "" - override fun beforeAttemptingToReachStep(state: OrgGovBodyMembersState): Boolean { + override fun beforeAttemptingToReachStep(state: OrgGovBodyState): Boolean { val keyToEdit = collectionKeyParameterService.getParameterOrNull() val currentMap = state.governingBodyMembersMap ?: emptyMap() return keyToEdit != null && keyToEdit in currentMap.keys } - override fun afterStepIsReached(state: OrgGovBodyMembersState) { + override fun afterStepIsReached(state: OrgGovBodyState) { val keyToEdit = collectionKeyParameterService.getParameterOrNull() ?: return state.editingGovBodyMemberId = keyToEdit } - override fun mode(state: OrgGovBodyMembersState): Complete = Complete.COMPLETE + override fun mode(state: OrgGovBodyState): Complete = Complete.COMPLETE } @JourneyFrameworkComponent final class SetStateForGovBodyMemberEditStep( stepConfig: SetStateForGovBodyMemberEditStepConfig, -) : JourneyStep.RequestableStep(stepConfig) { +) : JourneyStep.RequestableStep(stepConfig) { companion object { const val ROUTE_SEGMENT = "load-governing-body-member-for-edit" } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt index 6203be704f..db45027eaa 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt @@ -268,14 +268,11 @@ class LandlordRegistrationTask( } LeadTrusteeNameStep.ROUTE_SEGMENT -> { - duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.orgTypeTask.leadTrusteeTask, null) + duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.leadTrusteeTask, null) } OrgGovBodyMemberListStep.ROUTE_SEGMENT -> { - duplicableCheckAnswerTask( - journey.orgLandlordRegistrationTask.companiesHouseTask.orgGovBodyTask.orgGovBodyMembersTask, - null, - ) + duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.orgGovBodyTask, null) } OrgMainContactStep.ROUTE_SEGMENT -> { diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt index f9636f238e..9a5457774b 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt @@ -16,7 +16,6 @@ class OrgCompaniesHouseTask( journeyStateService: JourneyStateService, override val orgCompaniesHouseStep: OrgIsRegisteredCompanyStep, override val orgCompanyNumberStep: OrgCompanyNumberStep, - override val orgGovBodyTask: OrgGovBodyTask, ) : DuplicableTask(journeyStateService), OrgCompaniesHouseState { override val taskState get() = this @@ -28,7 +27,7 @@ class OrgCompaniesHouseTask( nextStep { mode -> when (mode) { YesOrNo.YES -> journey.orgCompanyNumberStep - YesOrNo.NO -> journey.orgGovBodyTask.firstStep + YesOrNo.NO -> exitStep } } } @@ -37,15 +36,11 @@ class OrgCompaniesHouseTask( parents { journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.YES) } nextStep { exitStep } } - duplicableTask(journey.orgGovBodyTask) { - parents { journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO) } - nextStep { exitStep } - } exitStep { parents { OrParents( + journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO), journey.orgCompanyNumberStep.isComplete(), - journey.orgGovBodyTask.isComplete(), ) } } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyMembersTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyMembersTask.kt deleted file mode 100644 index 59445b69df..0000000000 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyMembersTask.kt +++ /dev/null @@ -1,111 +0,0 @@ -package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks - -import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent -import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask -import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService -import uk.gov.communities.prsdb.webapp.journeys.OrParents -import uk.gov.communities.prsdb.webapp.journeys.hasOutcome -import uk.gov.communities.prsdb.webapp.journeys.isComplete -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberListStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberNameStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyWhoToProvideStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.RemoveGovBodyMemberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SaveGovBodyMemberStep -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SetStateForGovBodyMemberEditStep -import uk.gov.communities.prsdb.webapp.journeys.shared.AnyMembers -import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.GovBodyMemberAddressTask -import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel - -@JourneyFrameworkComponent -class OrgGovBodyMembersTask( - journeyStateService: JourneyStateService, - override val hasAnyGovBodyMembersStep: HasAnyGovBodyMembersStep, - override val orgGovBodyWhoToProvideStep: OrgGovBodyWhoToProvideStep, - override val orgGovBodyMemberNameStep: OrgGovBodyMemberNameStep, - override val orgGovBodyMemberDobStep: OrgGovBodyMemberDobStep, - override val govBodyMemberAddressTask: GovBodyMemberAddressTask, - override val orgGovBodyMemberListStep: OrgGovBodyMemberListStep, - override val saveGovBodyMemberStep: SaveGovBodyMemberStep, - override val setStateForGovBodyMemberEditStep: SetStateForGovBodyMemberEditStep, - override val removeGovBodyMemberStep: RemoveGovBodyMemberStep, -) : DuplicableTask(journeyStateService), - OrgGovBodyMembersState { - override val taskState get() = this - - override var governingBodyMembersMap: Map? by delegateProvider.nullableDelegate( - "governingBodyMembersMap", - ) - override var nextGoverningBodyMemberId: Int? by delegateProvider.nullableDelegate("nextGoverningBodyMemberId") - override var editingGovBodyMemberId: Int? by delegateProvider.nullableDelegate("editingGovBodyMemberId") - - override fun makeSubJourney(state: OrgGovBodyMembersState) = - subJourney(state) { - step(journey.hasAnyGovBodyMembersStep) { - nextStep { mode -> - when (mode) { - AnyMembers.NO_MEMBERS -> journey.orgGovBodyWhoToProvideStep - AnyMembers.SOME_MEMBERS -> journey.orgGovBodyMemberListStep - } - } - } - step(journey.orgGovBodyWhoToProvideStep) { - routeSegment(OrgGovBodyWhoToProvideStep.ROUTE_SEGMENT) - parents { - OrParents( - journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.NO_MEMBERS), - journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS), - ) - } - nextStep { journey.orgGovBodyMemberNameStep } - } - step(journey.orgGovBodyMemberNameStep) { - routeSegment(OrgGovBodyMemberNameStep.ROUTE_SEGMENT) - parents { journey.orgGovBodyWhoToProvideStep.isComplete() } - nextStep { journey.orgGovBodyMemberDobStep } - } - step(journey.orgGovBodyMemberDobStep) { - routeSegment(OrgGovBodyMemberDobStep.ROUTE_SEGMENT) - parents { journey.orgGovBodyMemberNameStep.isComplete() } - nextStep { journey.govBodyMemberAddressTask.firstStep } - } - duplicableTask(journey.govBodyMemberAddressTask, GovBodyMemberAddressTask.ROUTE_SEGMENT) { - parents { journey.orgGovBodyMemberDobStep.isComplete() } - nextStep { journey.saveGovBodyMemberStep } - } - step(journey.saveGovBodyMemberStep) { - parents { journey.govBodyMemberAddressTask.isComplete() } - nextStep { journey.orgGovBodyMemberListStep } - configureStep(journey.govBodyMemberAddressTask.selectAddressStep) { - withAdditionalContentProperties { - mapOf("fieldSetHeading" to "forms.selectAddress.govBodyMemberRegistration.fieldSetHeading") - } - } - } - step(journey.orgGovBodyMemberListStep) { - routeSegment(OrgGovBodyMemberListStep.ROUTE_SEGMENT) - parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } - nextStep { exitStep } - } - step(journey.setStateForGovBodyMemberEditStep) { - routeSegment(SetStateForGovBodyMemberEditStep.ROUTE_SEGMENT) - parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } - nextStep { journey.orgGovBodyWhoToProvideStep } - } - step(journey.removeGovBodyMemberStep) { - routeSegment(RemoveGovBodyMemberStep.ROUTE_SEGMENT) - parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } - nextStep { mode -> - when (mode) { - AnyMembers.SOME_MEMBERS -> journey.orgGovBodyMemberListStep - AnyMembers.NO_MEMBERS -> journey.orgGovBodyWhoToProvideStep - } - } - } - exitStep { - parents { journey.orgGovBodyMemberListStep.isComplete() } - } - } -} diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyTask.kt index 5569b7f307..f652fe6967 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgGovBodyTask.kt @@ -7,8 +7,19 @@ import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService import uk.gov.communities.prsdb.webapp.journeys.hasOutcome import uk.gov.communities.prsdb.webapp.journeys.isComplete import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.HasAnyGovBodyMembersStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyDetailsStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberDobStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberListStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMemberNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyMustProvideInfoStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgGovBodyWhoToProvideStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.RemoveGovBodyMemberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SaveGovBodyMemberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.SetStateForGovBodyMemberEditStep +import uk.gov.communities.prsdb.webapp.journeys.shared.AnyMembers +import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.GovBodyMemberAddressTask +import uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel import uk.gov.communities.prsdb.webapp.models.requestModels.formModels.OrgGovBodyDetailsMode @JourneyFrameworkComponent @@ -16,18 +27,32 @@ class OrgGovBodyTask( journeyStateService: JourneyStateService, override val orgGovBodyDetailsStep: OrgGovBodyDetailsStep, override val orgGovBodyMustProvideInfoStep: OrgGovBodyMustProvideInfoStep, - override val orgGovBodyMembersTask: OrgGovBodyMembersTask, + override val orgGovBodyWhoToProvideStep: OrgGovBodyWhoToProvideStep, + override val orgGovBodyMemberNameStep: OrgGovBodyMemberNameStep, + override val orgGovBodyMemberDobStep: OrgGovBodyMemberDobStep, + override val govBodyMemberAddressTask: GovBodyMemberAddressTask, + override val orgGovBodyMemberListStep: OrgGovBodyMemberListStep, + override val hasAnyGovBodyMembersStep: HasAnyGovBodyMembersStep, + override val saveGovBodyMemberStep: SaveGovBodyMemberStep, + override val setStateForGovBodyMemberEditStep: SetStateForGovBodyMemberEditStep, + override val removeGovBodyMemberStep: RemoveGovBodyMemberStep, ) : DuplicableTask(journeyStateService), OrgGovBodyState { override val taskState get() = this + override var governingBodyMembersMap: Map? by delegateProvider.nullableDelegate( + "governingBodyMembersMap", + ) + override var nextGoverningBodyMemberId: Int? by delegateProvider.nullableDelegate("nextGoverningBodyMemberId") + override var editingGovBodyMemberId: Int? by delegateProvider.nullableDelegate("editingGovBodyMemberId") + override fun makeSubJourney(state: OrgGovBodyState) = subJourney(state) { step(journey.orgGovBodyDetailsStep) { routeSegment(OrgGovBodyDetailsStep.ROUTE_SEGMENT) nextDestination { mode -> when (mode) { - OrgGovBodyDetailsMode.HAS_DETAILS -> Destination(journey.orgGovBodyMembersTask.firstStep) + OrgGovBodyDetailsMode.HAS_DETAILS -> Destination(journey.hasAnyGovBodyMembersStep) OrgGovBodyDetailsMode.NO_DETAILS -> Destination(journey.orgGovBodyMustProvideInfoStep) } } @@ -37,12 +62,74 @@ class OrgGovBodyTask( parents { journey.orgGovBodyDetailsStep.hasOutcome(OrgGovBodyDetailsMode.NO_DETAILS) } noNextDestination() } - duplicableTask(journey.orgGovBodyMembersTask) { + step(journey.hasAnyGovBodyMembersStep) { + parents { journey.orgGovBodyDetailsStep.hasOutcome(OrgGovBodyDetailsMode.HAS_DETAILS) } + nextStep { mode -> + when (mode) { + AnyMembers.NO_MEMBERS -> journey.orgGovBodyWhoToProvideStep + AnyMembers.SOME_MEMBERS -> journey.orgGovBodyMemberListStep + } + } + } + step(journey.setStateForGovBodyMemberEditStep) { + routeSegment(SetStateForGovBodyMemberEditStep.ROUTE_SEGMENT) + parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } + nextStep { journey.orgGovBodyWhoToProvideStep } + } + step(journey.removeGovBodyMemberStep) { + routeSegment(RemoveGovBodyMemberStep.ROUTE_SEGMENT) + parents { journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) } + nextStep { mode -> + when (mode) { + AnyMembers.SOME_MEMBERS -> journey.orgGovBodyMemberListStep + AnyMembers.NO_MEMBERS -> journey.orgGovBodyDetailsStep + } + } + } + step(journey.orgGovBodyWhoToProvideStep) { + routeSegment(OrgGovBodyWhoToProvideStep.ROUTE_SEGMENT) parents { journey.orgGovBodyDetailsStep.hasOutcome(OrgGovBodyDetailsMode.HAS_DETAILS) } + backDestination { + if (journey.governingBodyMembersMap.isNullOrEmpty()) { + Destination(journey.orgGovBodyDetailsStep) + } else { + Destination(journey.orgGovBodyMemberListStep) + } + } + nextStep { journey.orgGovBodyMemberNameStep } + } + step(journey.orgGovBodyMemberNameStep) { + routeSegment(OrgGovBodyMemberNameStep.ROUTE_SEGMENT) + parents { journey.orgGovBodyWhoToProvideStep.isComplete() } + nextStep { journey.orgGovBodyMemberDobStep } + } + step(journey.orgGovBodyMemberDobStep) { + routeSegment(OrgGovBodyMemberDobStep.ROUTE_SEGMENT) + parents { journey.orgGovBodyMemberNameStep.isComplete() } + nextStep { journey.govBodyMemberAddressTask.firstStep } + } + duplicableTask(journey.govBodyMemberAddressTask, GovBodyMemberAddressTask.ROUTE_SEGMENT) { + parents { journey.orgGovBodyMemberDobStep.isComplete() } + nextStep { journey.saveGovBodyMemberStep } + } + step(journey.saveGovBodyMemberStep) { + parents { journey.govBodyMemberAddressTask.isComplete() } + nextStep { journey.orgGovBodyMemberListStep } + configureStep(journey.govBodyMemberAddressTask.selectAddressStep) { + withAdditionalContentProperties { + mapOf("fieldSetHeading" to "forms.selectAddress.govBodyMemberRegistration.fieldSetHeading") + } + } + } + step(journey.orgGovBodyMemberListStep) { + routeSegment(OrgGovBodyMemberListStep.ROUTE_SEGMENT) + parents { + journey.hasAnyGovBodyMembersStep.hasOutcome(AnyMembers.SOME_MEMBERS) + } nextStep { exitStep } } exitStep { - parents { journey.orgGovBodyMembersTask.isComplete() } + parents { journey.orgGovBodyMemberListStep.isComplete() } } } } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt index e15a83e14a..61bc4c9018 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt @@ -1,8 +1,12 @@ package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent +import uk.gov.communities.prsdb.webapp.journeys.AndParents +import uk.gov.communities.prsdb.webapp.journeys.Destination import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService +import uk.gov.communities.prsdb.webapp.journeys.OrParents +import uk.gov.communities.prsdb.webapp.journeys.hasOutcome import uk.gov.communities.prsdb.webapp.journeys.isComplete import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.LandlordRegistrationOrgLandlordState import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgAddressStep @@ -10,7 +14,10 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgMainContactStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgNameStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgPhoneNumberStep +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeMode +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.UpdateDetailsTodoStep +import uk.gov.communities.prsdb.webapp.journeys.shared.YesOrNo @JourneyFrameworkComponent class OrgLandlordRegistrationTask( @@ -19,9 +26,11 @@ class OrgLandlordRegistrationTask( override val orgAddressStep: OrgAddressStep, override val orgEmailStep: OrgEmailStep, override val orgPhoneNumberStep: OrgPhoneNumberStep, - override val orgTypeTask: OrgTypeTask, + override val orgTypeStep: OrgTypeStep, + override val leadTrusteeTask: LeadTrusteeTask, override val charityTask: OrgCharityTask, override val companiesHouseTask: OrgCompaniesHouseTask, + override val orgGovBodyTask: OrgGovBodyTask, override val orgMainContactStep: OrgMainContactStep, // TODO PDJB-1237 PDJB-1238: remove this placeholder once the org type and companies house update journeys exist. override val updateDetailsTodoStep: UpdateDetailsTodoStep, @@ -48,23 +57,56 @@ class OrgLandlordRegistrationTask( step(journey.orgPhoneNumberStep) { routeSegment(OrgPhoneNumberStep.ROUTE_SEGMENT) parents { journey.orgEmailStep.isComplete() } - nextStep { journey.orgTypeTask.firstStep } + nextStep { journey.orgTypeStep } } - duplicableTask(journey.orgTypeTask) { + step(journey.orgTypeStep) { + routeSegment(OrgTypeStep.ROUTE_SEGMENT) parents { journey.orgPhoneNumberStep.isComplete() } + nextDestination { mode -> + when (mode) { + OrgTypeMode.INCLUDES_TRUST -> Destination(journey.leadTrusteeTask.firstStep) + OrgTypeMode.EXCLUDES_TRUST -> Destination(journey.charityTask.firstStep) + } + } + } + duplicableTask(journey.leadTrusteeTask) { + parents { journey.orgTypeStep.hasOutcome(OrgTypeMode.INCLUDES_TRUST) } nextStep { journey.charityTask.firstStep } } duplicableTask(journey.charityTask) { - parents { journey.orgTypeTask.isComplete() } + parents { + OrParents( + journey.leadTrusteeTask.isComplete(), + journey.orgTypeStep.hasOutcome(OrgTypeMode.EXCLUDES_TRUST), + ) + } nextStep { journey.companiesHouseTask.firstStep } } duplicableTask(journey.companiesHouseTask) { parents { journey.charityTask.isComplete() } + nextDestination { + if (journey.companiesHouseTask.orgCompaniesHouseStep.outcome == YesOrNo.NO) { + Destination(journey.orgGovBodyTask.firstStep) + } else { + Destination(journey.orgMainContactStep) + } + } + } + duplicableTask(journey.orgGovBodyTask) { + parents { journey.companiesHouseTask.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO) } nextStep { journey.orgMainContactStep } } step(journey.orgMainContactStep) { routeSegment(OrgMainContactStep.ROUTE_SEGMENT) - parents { journey.companiesHouseTask.isComplete() } + parents { + OrParents( + AndParents( + journey.companiesHouseTask.isComplete(), + journey.companiesHouseTask.orgCompaniesHouseStep.hasOutcome(YesOrNo.YES), + ), + journey.orgGovBodyTask.isComplete(), + ) + } nextStep { exitStep } } exitStep { diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgTypeTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgTypeTask.kt deleted file mode 100644 index 4ae55e59e0..0000000000 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgTypeTask.kt +++ /dev/null @@ -1,46 +0,0 @@ -package uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.tasks - -import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent -import uk.gov.communities.prsdb.webapp.journeys.DuplicableTask -import uk.gov.communities.prsdb.webapp.journeys.JourneyStateService -import uk.gov.communities.prsdb.webapp.journeys.OrParents -import uk.gov.communities.prsdb.webapp.journeys.hasOutcome -import uk.gov.communities.prsdb.webapp.journeys.isComplete -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgTypeState -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeMode -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgTypeStep - -@JourneyFrameworkComponent -class OrgTypeTask( - journeyStateService: JourneyStateService, - override val orgTypeStep: OrgTypeStep, - override val leadTrusteeTask: LeadTrusteeTask, -) : DuplicableTask(journeyStateService), - OrgTypeState { - override val taskState get() = this - - override fun makeSubJourney(state: OrgTypeState) = - subJourney(state) { - step(journey.orgTypeStep) { - routeSegment(OrgTypeStep.ROUTE_SEGMENT) - nextStep { mode -> - when (mode) { - OrgTypeMode.INCLUDES_TRUST -> journey.leadTrusteeTask.firstStep - OrgTypeMode.EXCLUDES_TRUST -> exitStep - } - } - } - duplicableTask(journey.leadTrusteeTask) { - parents { journey.orgTypeStep.hasOutcome(OrgTypeMode.INCLUDES_TRUST) } - nextStep { exitStep } - } - exitStep { - parents { - OrParents( - journey.orgTypeStep.hasOutcome(OrgTypeMode.EXCLUDES_TRUST), - journey.leadTrusteeTask.isComplete(), - ) - } - } - } -} diff --git a/src/test/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfigTests.kt b/src/test/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfigTests.kt index 9e6acf348a..fb2307986e 100644 --- a/src/test/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfigTests.kt +++ b/src/test/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/OrgGovBodyMemberListStepConfigTests.kt @@ -5,14 +5,14 @@ import org.junit.jupiter.api.extension.ExtendWith import org.mockito.Mock import org.mockito.junit.jupiter.MockitoExtension import org.mockito.kotlin.verify -import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyMembersState +import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.states.OrgGovBodyState import uk.gov.communities.prsdb.webapp.services.CollectionKeyParameterService import uk.gov.communities.prsdb.webapp.testHelpers.mockObjects.AlwaysTrueValidator @ExtendWith(MockitoExtension::class) class OrgGovBodyMemberListStepConfigTests { @Mock - lateinit var mockState: OrgGovBodyMembersState + lateinit var mockState: OrgGovBodyState @Mock lateinit var urlParameterService: CollectionKeyParameterService From bdf0a1a6c6e1f5d504272454eb7f7468e402c9b8 Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Fri, 31 Jul 2026 17:23:48 +0100 Subject: [PATCH 16/17] PDJB-1168: naming fixes --- .../states/OrgCharityState.kt | 2 +- .../states/OrgCompaniesHouseState.kt | 2 +- .../LandlordRegistrationCyaStepConfig.kt | 23 +++++++++++++------ .../tasks/OrgCharityTask.kt | 8 +++---- .../tasks/OrgCompaniesHouseTask.kt | 8 +++---- .../tasks/OrgLandlordRegistrationTask.kt | 6 ++--- 6 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCharityState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCharityState.kt index 509edbb8f3..37f41f4b53 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCharityState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCharityState.kt @@ -8,7 +8,7 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgIsRegisteredCharityStep interface OrgCharityState : JourneyState { - val orgCharityStep: OrgIsRegisteredCharityStep + val orgIsRegisteredCharityStep: OrgIsRegisteredCharityStep val orgCharityRegisteredWithStep: OrgCharityRegisteredWithStep val orgCharityNumberEnglandAndWalesStep: OrgCharityNumberEnglandAndWalesStep val orgCharityNumberNorthernIrelandStep: OrgCharityNumberNorthernIrelandStep diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt index 1d4d092c38..c29c6606cf 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/states/OrgCompaniesHouseState.kt @@ -5,6 +5,6 @@ import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig. import uk.gov.communities.prsdb.webapp.journeys.landlordRegistration.stepConfig.OrgIsRegisteredCompanyStep interface OrgCompaniesHouseState : JourneyState { - val orgCompaniesHouseStep: OrgIsRegisteredCompanyStep + val orgIsRegisteredCompanyStep: OrgIsRegisteredCompanyStep val orgCompanyNumberStep: OrgCompanyNumberStep } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt index 72513f2273..c2d1b3d435 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/stepConfig/LandlordRegistrationCyaStepConfig.kt @@ -63,9 +63,12 @@ class LandlordRegistrationCyaStepConfig( val organisationTypes = org.orgTypeStep.formModel.getSelectedOrgTypes() val isTrust = OrgType.TRUST in organisationTypes - val isRegisteredCharity = org.charityTask.orgCharityStep.formModel.notNullValue(OrgIsRegisteredCharityFormModel::charity) + val isRegisteredCharity = + org.charityTask.orgIsRegisteredCharityStep.formModel.notNullValue( + OrgIsRegisteredCharityFormModel::charity, + ) val hasCompanyNumber = - org.companiesHouseTask.orgCompaniesHouseStep.formModel.notNullValue( + org.companiesHouseTask.orgIsRegisteredCompanyStep.formModel.notNullValue( OrgIsRegisteredCompanyFormModel::companiesHouse, ) @@ -381,12 +384,18 @@ class LandlordRegistrationCyaStepConfig( ), ) - val isRegisteredCharity = org.charityTask.orgCharityStep.formModel.notNullValue(OrgIsRegisteredCharityFormModel::charity) + val isRegisteredCharity = + org.charityTask.orgIsRegisteredCharityStep.formModel.notNullValue( + OrgIsRegisteredCharityFormModel::charity, + ) add( SummaryListRowViewModel.forCheckYourAnswersPage( "registerAsALandlord.orgCheckAnswers.landlordDetails.registeredCharity", isRegisteredCharity, - Destination.VisitableStep(org.charityTask.orgCharityStep, state.getCyaJourneyId(org.charityTask.orgCharityStep)), + Destination.VisitableStep( + org.charityTask.orgIsRegisteredCharityStep, + state.getCyaJourneyId(org.charityTask.orgIsRegisteredCharityStep), + ), ), ) @@ -416,7 +425,7 @@ class LandlordRegistrationCyaStepConfig( } val registeredWithCompaniesHouse = - org.companiesHouseTask.orgCompaniesHouseStep.formModel.notNullValue( + org.companiesHouseTask.orgIsRegisteredCompanyStep.formModel.notNullValue( OrgIsRegisteredCompanyFormModel::companiesHouse, ) add( @@ -424,8 +433,8 @@ class LandlordRegistrationCyaStepConfig( "registerAsALandlord.orgCheckAnswers.landlordDetails.registeredWithCompaniesHouse", registeredWithCompaniesHouse, Destination.VisitableStep( - org.companiesHouseTask.orgCompaniesHouseStep, - state.getCyaJourneyId(org.companiesHouseTask.orgCompaniesHouseStep), + org.companiesHouseTask.orgIsRegisteredCompanyStep, + state.getCyaJourneyId(org.companiesHouseTask.orgIsRegisteredCompanyStep), ), ), ) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCharityTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCharityTask.kt index 7d7c86d05e..d4f7ea4b61 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCharityTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCharityTask.kt @@ -18,7 +18,7 @@ import uk.gov.communities.prsdb.webapp.journeys.shared.YesOrNo @JourneyFrameworkComponent class OrgCharityTask( journeyStateService: JourneyStateService, - override val orgCharityStep: OrgIsRegisteredCharityStep, + override val orgIsRegisteredCharityStep: OrgIsRegisteredCharityStep, override val orgCharityRegisteredWithStep: OrgCharityRegisteredWithStep, override val orgCharityNumberEnglandAndWalesStep: OrgCharityNumberEnglandAndWalesStep, override val orgCharityNumberNorthernIrelandStep: OrgCharityNumberNorthernIrelandStep, @@ -29,7 +29,7 @@ class OrgCharityTask( override fun makeSubJourney(state: OrgCharityState) = subJourney(state) { - step(journey.orgCharityStep) { + step(journey.orgIsRegisteredCharityStep) { routeSegment(OrgIsRegisteredCharityStep.ROUTE_SEGMENT) nextStep { mode -> when (mode) { @@ -40,7 +40,7 @@ class OrgCharityTask( } step(journey.orgCharityRegisteredWithStep) { routeSegment(OrgCharityRegisteredWithStep.ROUTE_SEGMENT) - parents { journey.orgCharityStep.hasOutcome(YesOrNo.YES) } + parents { journey.orgIsRegisteredCharityStep.hasOutcome(YesOrNo.YES) } nextStep { mode -> when (mode) { CharityRegulator.ENGLAND_AND_WALES -> journey.orgCharityNumberEnglandAndWalesStep @@ -68,7 +68,7 @@ class OrgCharityTask( exitStep { parents { OrParents( - journey.orgCharityStep.hasOutcome(YesOrNo.NO), + journey.orgIsRegisteredCharityStep.hasOutcome(YesOrNo.NO), journey.orgCharityRegisteredWithStep.hasOutcome(CharityRegulator.NONE), journey.orgCharityNumberEnglandAndWalesStep.isComplete(), journey.orgCharityNumberNorthernIrelandStep.isComplete(), diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt index 9a5457774b..52e391d147 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgCompaniesHouseTask.kt @@ -14,7 +14,7 @@ import uk.gov.communities.prsdb.webapp.journeys.shared.YesOrNo @JourneyFrameworkComponent class OrgCompaniesHouseTask( journeyStateService: JourneyStateService, - override val orgCompaniesHouseStep: OrgIsRegisteredCompanyStep, + override val orgIsRegisteredCompanyStep: OrgIsRegisteredCompanyStep, override val orgCompanyNumberStep: OrgCompanyNumberStep, ) : DuplicableTask(journeyStateService), OrgCompaniesHouseState { @@ -22,7 +22,7 @@ class OrgCompaniesHouseTask( override fun makeSubJourney(state: OrgCompaniesHouseState) = subJourney(state) { - step(journey.orgCompaniesHouseStep) { + step(journey.orgIsRegisteredCompanyStep) { routeSegment(OrgIsRegisteredCompanyStep.ROUTE_SEGMENT) nextStep { mode -> when (mode) { @@ -33,13 +33,13 @@ class OrgCompaniesHouseTask( } step(journey.orgCompanyNumberStep) { routeSegment(OrgCompanyNumberStep.ROUTE_SEGMENT) - parents { journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.YES) } + parents { journey.orgIsRegisteredCompanyStep.hasOutcome(YesOrNo.YES) } nextStep { exitStep } } exitStep { parents { OrParents( - journey.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO), + journey.orgIsRegisteredCompanyStep.hasOutcome(YesOrNo.NO), journey.orgCompanyNumberStep.isComplete(), ) } diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt index 61bc4c9018..7b87215a40 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/OrgLandlordRegistrationTask.kt @@ -85,7 +85,7 @@ class OrgLandlordRegistrationTask( duplicableTask(journey.companiesHouseTask) { parents { journey.charityTask.isComplete() } nextDestination { - if (journey.companiesHouseTask.orgCompaniesHouseStep.outcome == YesOrNo.NO) { + if (journey.companiesHouseTask.orgIsRegisteredCompanyStep.outcome == YesOrNo.NO) { Destination(journey.orgGovBodyTask.firstStep) } else { Destination(journey.orgMainContactStep) @@ -93,7 +93,7 @@ class OrgLandlordRegistrationTask( } } duplicableTask(journey.orgGovBodyTask) { - parents { journey.companiesHouseTask.orgCompaniesHouseStep.hasOutcome(YesOrNo.NO) } + parents { journey.companiesHouseTask.orgIsRegisteredCompanyStep.hasOutcome(YesOrNo.NO) } nextStep { journey.orgMainContactStep } } step(journey.orgMainContactStep) { @@ -102,7 +102,7 @@ class OrgLandlordRegistrationTask( OrParents( AndParents( journey.companiesHouseTask.isComplete(), - journey.companiesHouseTask.orgCompaniesHouseStep.hasOutcome(YesOrNo.YES), + journey.companiesHouseTask.orgIsRegisteredCompanyStep.hasOutcome(YesOrNo.YES), ), journey.orgGovBodyTask.isComplete(), ) From 68748738df222ac75e35e78084e022fd3454cc41 Mon Sep 17 00:00:00 2001 From: Tom Hanmer Date: Fri, 31 Jul 2026 17:34:02 +0100 Subject: [PATCH 17/17] PDJB-1168: improve change link granularity --- .../tasks/LandlordRegistrationTask.kt | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt index db45027eaa..8075866ced 100644 --- a/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt +++ b/src/main/kotlin/uk/gov/communities/prsdb/webapp/journeys/landlordRegistration/tasks/LandlordRegistrationTask.kt @@ -251,15 +251,35 @@ class LandlordRegistrationTask( OrgIsRegisteredCharityStep.ROUTE_SEGMENT, OrgCharityRegisteredWithStep.ROUTE_SEGMENT, + -> { + duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.charityTask, null) + } + OrgCharityNumberEnglandAndWalesStep.ROUTE_SEGMENT, + -> { + checkAnswerStep( + journey.orgLandlordRegistrationTask.charityTask.orgCharityNumberEnglandAndWalesStep, + OrgCharityNumberEnglandAndWalesStep.ROUTE_SEGMENT, + ) + } + OrgCharityNumberNorthernIrelandStep.ROUTE_SEGMENT, + -> { + checkAnswerStep( + journey.orgLandlordRegistrationTask.charityTask.orgCharityNumberNorthernIrelandStep, + OrgCharityNumberNorthernIrelandStep.ROUTE_SEGMENT, + ) + } + OrgCharityNumberScotlandStep.ROUTE_SEGMENT, -> { - duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.charityTask, null) + checkAnswerStep( + journey.orgLandlordRegistrationTask.charityTask.orgCharityNumberScotlandStep, + OrgCharityNumberScotlandStep.ROUTE_SEGMENT, + ) } OrgIsRegisteredCompanyStep.ROUTE_SEGMENT, - OrgCompanyNumberStep.ROUTE_SEGMENT, -> { // TODO PDJB-1238 : replace this placeholder with the companies house update journey checkAnswerStep(journey.orgLandlordRegistrationTask.updateDetailsTodoStep, checkingAnswersFor) { @@ -267,6 +287,14 @@ class LandlordRegistrationTask( } } + OrgCompanyNumberStep.ROUTE_SEGMENT, + -> { + checkAnswerStep( + journey.orgLandlordRegistrationTask.companiesHouseTask.orgCompanyNumberStep, + OrgCompanyNumberStep.ROUTE_SEGMENT, + ) + } + LeadTrusteeNameStep.ROUTE_SEGMENT -> { duplicableCheckAnswerTask(journey.orgLandlordRegistrationTask.leadTrusteeTask, null) }