Skip to content

Commit f3d588e

Browse files
CARF-435 Change Link- Do you have a Unique Taxpayer Reference? (#152)
* CARF-435 main impl finished * CARF-435 page tests done * CARF-435 match flag and safe id in ua tests * CARF-435 formatting
1 parent f0a69a4 commit f3d588e

37 files changed

Lines changed: 608 additions & 197 deletions

app/config/Constants.scala

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@
1717
package config
1818

1919
import models.countries.*
20+
import pages.IsThisYourBusinessPage
21+
import pages.individual.*
22+
import pages.individualWithoutId.*
23+
import pages.orgWithoutId.*
24+
import pages.organisation.*
25+
import queries.Settable
2026

2127
import scala.util.matching.Regex
2228

@@ -67,4 +73,31 @@ object Constants {
6773
val CARFID = "CARFID"
6874
val registrationSuccessfulEmailTemplateId: String = "carf_registration_successful"
6975

76+
val indGeneralPage: List[Settable[_]] = List(HaveNiNumberPage)
77+
val indWithNinoPages: List[Settable[_]] = List(NiNumberPage, WhatIsYourNameIndividualPage, RegisterDateOfBirthPage)
78+
val indWithoutIdPages: List[Settable[_]] = List(
79+
IndFindAddressAdditionalCallUa,
80+
IndFindAddressPage,
81+
WhereDoYouLivePage,
82+
AddressLookupPage,
83+
AddressUPRNUserAnswers,
84+
IndWithoutNinoNamePage,
85+
IndWithoutIdAddressNonUkPage,
86+
IndWithoutIdAddressPagePrePop,
87+
IndWithoutIdChooseAddressPage,
88+
IndWithoutIdDateOfBirthPage,
89+
IndWithoutIdSelectedChooseAddressPage,
90+
IndWithoutIdUkAddressInUserAnswers
91+
)
92+
val orgWithoutIdPages: List[Settable[_]] =
93+
List(HaveTradingNamePage, OrganisationBusinessAddressPage, OrgWithoutIdBusinessNamePage, TradingNamePage)
94+
95+
val withUtrPages: List[Settable[_]] =
96+
List(
97+
UniqueTaxpayerReferenceInUserAnswers,
98+
WhatIsYourNamePage,
99+
WhatIsTheNameOfYourBusinessPage,
100+
IsThisYourBusinessPage
101+
)
102+
70103
}

app/controllers/individualWithoutId/IndFindAddressController.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,9 @@ import controllers.actions.*
2020
import forms.individualWithoutId.IndFindAddressFormProvider
2121
import models.countries.CountryUk
2222
import models.requests.DataRequest
23-
import models.{AddressUk, AddressesAndUPRN, IndFindAddress, Mode}
23+
import models.{AddressAndUPRN, AddressUk, IndFindAddress, Mode}
2424
import navigation.Navigator
2525
import pages.individualWithoutId.*
26-
import pages.{AddressLookupPage, AddressUPRNUserAnswers}
2726
import play.api.Logging
2827
import play.api.data.{Form, FormError}
2928
import play.api.i18n.{I18nSupport, MessagesApi}
@@ -94,7 +93,7 @@ class IndFindAddressController @Inject() (
9493

9594
private def save(
9695
indFindAddress: IndFindAddress,
97-
addressesAndUPRNs: Seq[AddressesAndUPRN],
96+
addressesAndUPRNs: Seq[AddressAndUPRN],
9897
additionalCallMade: Boolean
9998
)(implicit
10099
request: DataRequest[AnyContent]

app/controllers/individualWithoutId/IndReviewConfirmAddressController.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ import controllers.actions.*
2020
import controllers.routes
2121
import models.{Mode, NormalMode}
2222
import navigation.Navigator
23-
import pages.AddressLookupPage
24-
import pages.individualWithoutId.{IndReviewConfirmAddressPageForNavigatorOnly, IndWithoutIdUkAddressInUserAnswers}
23+
import pages.individualWithoutId.{AddressLookupPage, IndReviewConfirmAddressPageForNavigatorOnly, IndWithoutIdUkAddressInUserAnswers}
2524
import play.api.Logging
2625
import play.api.i18n.{I18nSupport, MessagesApi}
2726
import play.api.mvc.{Action, AnyContent, MessagesControllerComponents}

app/controllers/individualWithoutId/IndWithoutChooseAddressController.scala

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,9 @@ import controllers.actions.*
2121
import forms.IndWithoutChooseAddressFormProvider
2222
import models.countries.CountryUk
2323
import models.requests.DataRequest
24-
import models.{format, AddressUk, AddressesAndUPRN, IndFindAddress, Mode, UserAnswers}
24+
import models.{format, AddressAndUPRN, AddressUk, IndFindAddress, Mode, UserAnswers}
2525
import navigation.Navigator
26-
import pages.{AddressLookupPage, AddressUPRNUserAnswers}
27-
import pages.individualWithoutId.{IndFindAddressAdditionalCallUa, IndFindAddressPage, IndWithoutIdAddressPagePrePop, IndWithoutIdChooseAddressPage, IndWithoutIdSelectedChooseAddressPage, IndWithoutIdUkAddressInUserAnswers}
26+
import pages.individualWithoutId.*
2827
import play.api.Logging
2928
import play.api.data.Form
3029
import play.api.i18n.{I18nSupport, Messages, MessagesApi}
@@ -54,7 +53,7 @@ class IndWithoutChooseAddressController @Inject() (
5453
with I18nSupport
5554
with Logging {
5655

57-
private case class WithRadiosResult(result: Result, addresses: Seq[AddressesAndUPRN])
56+
private case class WithRadiosResult(result: Result, addresses: Seq[AddressAndUPRN])
5857

5958
val form: Form[String] = formProvider()
6059

@@ -119,7 +118,7 @@ class IndWithoutChooseAddressController @Inject() (
119118
)
120119
}
121120

122-
private def storeAddress(addressToStore: AddressesAndUPRN, userAnswer: UserAnswers): Future[UserAnswers] =
121+
private def storeAddress(addressToStore: AddressAndUPRN, userAnswer: UserAnswers): Future[UserAnswers] =
123122
for {
124123
a <- Future.fromTry(userAnswer.set(IndWithoutIdSelectedChooseAddressPage, addressToStore.address))
125124
b <- Future.fromTry(a.set(IndWithoutIdUkAddressInUserAnswers, addressToStore.address))
@@ -128,7 +127,7 @@ class IndWithoutChooseAddressController @Inject() (
128127

129128
private def findAddressToStore(mode: Mode, value: String)(implicit
130129
request: DataRequest[AnyContent]
131-
): Future[Option[AddressesAndUPRN]] = Future.fromTry {
130+
): Future[Option[AddressAndUPRN]] = Future.fromTry {
132131
val WithRadiosResult(_, addresses) = resultWithRadios(mode) { (_, _) =>
133132
Redirect(call = controllers.routes.JourneyRecoveryController.onPageLoad())
134133
}
@@ -140,7 +139,7 @@ class IndWithoutChooseAddressController @Inject() (
140139
if (value == noneOfTheseValue) {
141140
Success(None)
142141
} else {
143-
Failure[Option[AddressesAndUPRN]](exception)
142+
Failure[Option[AddressAndUPRN]](exception)
144143
}
145144
}(address => Success(Some(address)))
146145
}

app/controllers/individualWithoutId/IndWithoutIdAddressController.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import forms.individualWithoutId.IndWithoutIdAddressFormProvider
2121
import models.requests.DataRequest
2222
import models.{AddressUk, Mode}
2323
import navigation.Navigator
24-
import pages.AddressUPRNUserAnswers
2524
import pages.individualWithoutId.*
2625
import play.api.data.Form
2726
import play.api.i18n.{I18nSupport, MessagesApi}

app/controllers/individualWithoutId/IndWithoutIdAddressNonUkController.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import controllers.actions.*
2020
import forms.individualWithoutId.IndWithoutIdAddressNonUkFormProvider
2121
import models.Mode
2222
import navigation.Navigator
23-
import pages.individualWithoutId.IndWithoutIdAddressNonUkPage
23+
import pages.individualWithoutId.{AddressUPRNUserAnswers, IndWithoutIdAddressNonUkPage}
2424
import play.api.Logging
2525
import play.api.i18n.{I18nSupport, MessagesApi}
2626
import play.api.mvc.{Action, AnyContent, MessagesControllerComponents}
@@ -32,7 +32,6 @@ import views.html.individualWithoutId.IndWithoutIdAddressNonUkView
3232
import javax.inject.Inject
3333
import scala.concurrent.{ExecutionContext, Future}
3434
import models.countries.Country
35-
import pages.AddressUPRNUserAnswers
3635

3736
class IndWithoutIdAddressNonUkController @Inject() (
3837
override val messagesApi: MessagesApi,

app/controllers/individualWithoutId/WhereDoYouLiveController.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import controllers.actions.*
2020
import forms.WhereDoYouLiveFormProvider
2121
import models.Mode
2222
import navigation.Navigator
23-
import pages.WhereDoYouLivePage
23+
import pages.individualWithoutId.WhereDoYouLivePage
2424
import play.api.Logging
2525
import play.api.data.Form
2626
import play.api.i18n.{I18nSupport, MessagesApi}

app/controllers/organisation/HaveUTRController.scala

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,19 @@
1717
package controllers.organisation
1818

1919
import controllers.actions.*
20+
import controllers.routes
2021
import forms.organisation.HaveUTRFormProvider
21-
import models.{Mode, UniqueTaxpayerReference}
22+
import models.{ChangeMode, Mode, NormalMode, ProvideMode, UserAnswers}
2223
import navigation.Navigator
24+
import pages.orgWithoutId.OrgWithoutIdBusinessNamePage
2325
import pages.organisation.HaveUTRPage
2426
import play.api.Logging
27+
import play.api.data.Form
2528
import play.api.i18n.{I18nSupport, MessagesApi}
26-
import play.api.mvc.{Action, AnyContent, MessagesControllerComponents}
29+
import play.api.mvc.{Action, AnyContent, Call, MessagesControllerComponents}
2730
import repositories.SessionRepository
28-
import services.RegistrationService
2931
import uk.gov.hmrc.play.bootstrap.frontend.controller.FrontendBaseController
32+
import utils.UserAnswersHelper
3033
import views.html.organisation.HaveUTRView
3134

3235
import javax.inject.Inject
@@ -40,17 +43,16 @@ class HaveUTRController @Inject() (
4043
getData: DataRetrievalAction,
4144
submissionLock: SubmissionLockAction,
4245
requireData: DataRequiredAction,
43-
service: RegistrationService,
44-
retrieveCtUTR: CtUtrRetrievalAction,
4546
formProvider: HaveUTRFormProvider,
4647
val controllerComponents: MessagesControllerComponents,
4748
view: HaveUTRView
4849
)(implicit ec: ExecutionContext)
4950
extends FrontendBaseController
5051
with I18nSupport
51-
with Logging {
52+
with Logging
53+
with UserAnswersHelper {
5254

53-
val form = formProvider()
55+
val form: Form[Boolean] = formProvider()
5456

5557
def onPageLoad(mode: Mode): Action[AnyContent] =
5658
(identify() andThen getData() andThen submissionLock andThen requireData) { implicit request =>
@@ -70,7 +72,45 @@ class HaveUTRController @Inject() (
7072
for {
7173
updatedAnswers <- Future.fromTry(request.userAnswers.set(HaveUTRPage, value))
7274
_ <- sessionRepository.set(updatedAnswers)
73-
} yield Redirect(navigator.nextPage(HaveUTRPage, mode, updatedAnswers))
75+
} yield Redirect(
76+
handleRedirect(
77+
mode = mode,
78+
oldUserAnswers = request.userAnswers,
79+
newUserAnswers = updatedAnswers,
80+
newValue = value
81+
)
82+
)
7483
)
7584
}
85+
86+
private def handleRedirect(
87+
mode: Mode,
88+
oldUserAnswers: UserAnswers,
89+
newUserAnswers: UserAnswers,
90+
newValue: Boolean
91+
): Call =
92+
mode match {
93+
case NormalMode => navigator.nextPage(HaveUTRPage, mode, newUserAnswers)
94+
case _ =>
95+
val hasChanged = !oldUserAnswers.get(HaveUTRPage).contains(newValue)
96+
changeModeNavigation(newValue = newValue, hasChanged = hasChanged, newUserAnswers)
97+
}
98+
99+
private def changeModeNavigation(newValue: Boolean, hasChanged: Boolean, newUserAnswers: UserAnswers): Call =
100+
if (newValue) {
101+
controllers.organisation.routes.YourUniqueTaxpayerReferenceController.onPageLoad(ChangeMode)
102+
} else {
103+
(hasChanged, isSoleTrader(newUserAnswers)) match {
104+
case (true, true) => controllers.individual.routes.HaveNiNumberController.onPageLoad(NormalMode)
105+
case (true, false) => controllers.orgWithoutId.routes.OrgWithoutIdBusinessNameController.onPageLoad(NormalMode)
106+
case (false, true) => controllers.individual.routes.HaveNiNumberController.onPageLoad(ChangeMode)
107+
case (false, false) =>
108+
if (newUserAnswers.get(OrgWithoutIdBusinessNamePage).isDefined) {
109+
controllers.routes.CheckYourAnswersController.onPageLoad()
110+
} else {
111+
controllers.orgWithoutId.routes.OrgWithoutIdBusinessNameController.onPageLoad(NormalMode)
112+
}
113+
}
114+
}
115+
76116
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ package models
1818

1919
import play.api.libs.json.{Json, OFormat}
2020

21-
case class AddressesAndUPRN(address: AddressUk, UPRN: Long)
21+
case class AddressAndUPRN(address: AddressUk, UPRN: Long)
2222

23-
object AddressesAndUPRN {
24-
implicit val format: OFormat[AddressesAndUPRN] = Json.format[AddressesAndUPRN]
23+
object AddressAndUPRN {
24+
implicit val format: OFormat[AddressAndUPRN] = Json.format[AddressAndUPRN]
2525
}

app/models/responses/AddressResponse.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package models.responses
1818

19-
import models.{AddressUk, AddressesAndUPRN}
19+
import models.{AddressAndUPRN, AddressUk}
2020
import models.countries.CountryUk
2121
import models.error.{CarfError, ConversionError}
2222
import play.api.libs.json.{Json, OFormat}
@@ -33,12 +33,12 @@ object AddressResponse {
3333
implicit val format: OFormat[AddressResponse] = Json.format[AddressResponse]
3434

3535
extension (addressResponse: AddressResponse)
36-
def toDomainAddressUk: Either[CarfError, AddressesAndUPRN] = {
36+
def toDomainAddressUk: Either[CarfError, AddressAndUPRN] = {
3737
val address = addressResponse.address
3838
address.lines match {
3939
case head :: next =>
4040
Right(
41-
AddressesAndUPRN(
41+
AddressAndUPRN(
4242
AddressUk(
4343
addressLine1 = head,
4444
addressLine2 = next.headOption,

0 commit comments

Comments
 (0)