Skip to content

Commit fb3b1a6

Browse files
authored
[Apb-10947] Incorporated list - bug fixes and improvements" (#214)
* [WG][APB-10947] Incorporated list - bug fixes * [WG][APB-10947] Incorporated list - better officer match with CH * [WG][APB-10947] Incorporated list - better officer match with CH, 2 --------- Co-authored-by: wojciech.gradzki <gitwojciech@users.noreply.github.com>
1 parent a732c1b commit fb3b1a6

File tree

11 files changed

+429
-79
lines changed

11 files changed

+429
-79
lines changed

app/uk/gov/hmrc/agentregistrationfrontend/controllers/applicant/listdetails/incorporated/ChangeCompaniesHouseOfficerController.scala

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,20 @@ extends FrontendController(mcc, actions):
8989
companiesHouseOfficers <- companiesHouseService
9090
.getActiveOfficers(agentApplication.getCrn, agentApplication.getCompaniesHouseOfficerRole)
9191

92-
companiesHouseOfficersNames = companiesHouseOfficers
92+
allCompaniesHouseOfficersNames = companiesHouseOfficers
9393
.map(x => CompaniesHouseOfficer.normaliseOfficerName(x.name))
9494
.map(IndividualName(_))
9595
.filter(_.isValidName)
96+
97+
existingNamesLower = individualsList.map(_.individualName.value.toLowerCase)
98+
99+
companiesHouseOfficersNames =
100+
allCompaniesHouseOfficersNames.foldLeft((Seq.empty[IndividualName], existingNamesLower)):
101+
case ((kept, remaining), chName) =>
102+
val idx = remaining.indexOf(chName.value.toLowerCase)
103+
if idx >= 0 then (kept, remaining.patch(idx, Nil, 1))
104+
else (kept :+ chName, remaining)
105+
._1
96106
yield request
97107
.add[List[IndividualProvidedDetails]](individualsList)
98108
.add[Seq[IndividualName]](companiesHouseOfficersNames)
@@ -153,11 +163,11 @@ extends FrontendController(mcc, actions):
153163
)
154164

155165
NameMatching.individualNameMatching(individualNameFromForm, companiesHouseOfficerList) match
156-
case Some(_) =>
166+
case Some(matchedOfficerName) =>
157167
individualProvideDetailsService.upsertForApplication(
158168
individualToChange
159169
.modify(_.individualName)
160-
.setTo(individualNameFromForm)
170+
.setTo(matchedOfficerName)
161171
)
162172
.map: _ =>
163173
Redirect(AppRoutes.apply.listdetails.incoporated.CheckYourAnswersController.show)

app/uk/gov/hmrc/agentregistrationfrontend/controllers/applicant/listdetails/incorporated/CheckYourAnswersController.scala

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,14 @@ extends FrontendController(mcc, actions):
6969
.findAllKeyIndividualsByApplicationId(
7070
agentApplication.agentApplicationId
7171
).map[RequestWithData[DataWithLists] | Result]:
72-
case Nil => request.add[List[IndividualProvidedDetails]](List.empty[IndividualProvidedDetails])
73-
case list: List[IndividualProvidedDetails] if list.size <= request.get[SixOrMoreOfficers].totalListSize =>
74-
request.add[List[IndividualProvidedDetails]](list)
75-
case _ => Redirect(AppRoutes.apply.listdetails.otherrelevantindividuals.CheckYourAnswersController.show.url)
72+
case Nil if request.get[SixOrMoreOfficers].totalListSize > 0 =>
73+
logger.warn(
74+
"Number of required companies house officers specified in application, but no officers found, redirecting to number of enter companies house officers page"
75+
)
76+
Redirect(AppRoutes.apply.listdetails.incoporated.EnterCompaniesHouseOfficerController.show.url)
77+
78+
case list: List[IndividualProvidedDetails] => request.add[List[IndividualProvidedDetails]](list)
79+
7680
def show: Action[AnyContent] = baseAction:
7781
implicit request =>
7882
val agentApplication: IsIncorporated = request.get[IsIncorporated]

app/uk/gov/hmrc/agentregistrationfrontend/controllers/applicant/listdetails/incorporated/CompaniesHouseOfficersController.scala

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,14 @@ extends FrontendController(mcc, actions):
8787
yield request
8888
.add[List[IndividualProvidedDetails]](individualsList)
8989
.add[Seq[IndividualName]](companiesHouseOfficersNames)
90-
90+
// .refine:
91+
// implicit request =>
92+
// val individuals = request.get[List[IndividualProvidedDetails]]
93+
// request.get[IsIncorporated].getNumberOfCompaniesHouseOfficers match
94+
// case Some(n: SixOrMoreOfficers) if (n. isValid && n.totalListSize === individuals.size) =>
95+
//
96+
//
97+
//
9198
def show: Action[AnyContent] = baseAction
9299
.async:
93100
implicit request =>
@@ -250,7 +257,7 @@ extends FrontendController(mcc, actions):
250257
)
251258

252259
for _ <- agentApplicationService.upsert(updatedApplication)
253-
yield Redirect(AppRoutes.apply.listdetails.incoporated.EnterCompaniesHouseOfficerController.show.url)
260+
yield Redirect(AppRoutes.apply.listdetails.incoporated.CheckYourAnswersController.show.url)
254261
.redirectIfSaveForLater
255262

256263
// Private helper methods

app/uk/gov/hmrc/agentregistrationfrontend/controllers/applicant/listdetails/incorporated/EnterCompaniesHouseOfficerController.scala

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,20 @@ extends FrontendController(mcc, actions):
7676
companiesHouseOfficers <- companiesHouseService
7777
.getActiveOfficers(agentApplication.getCrn, agentApplication.getCompaniesHouseOfficerRole)
7878

79-
companiesHouseOfficersNames = companiesHouseOfficers
79+
allCompaniesHouseOfficersNames = companiesHouseOfficers
8080
.map(x => CompaniesHouseOfficer.normaliseOfficerName(x.name))
8181
.map(IndividualName(_))
8282
.filter(_.isValidName)
83+
84+
existingNamesLower = individualsList.map(_.individualName.value.toLowerCase)
85+
86+
companiesHouseOfficersNames =
87+
allCompaniesHouseOfficersNames.foldLeft((Seq.empty[IndividualName], existingNamesLower)):
88+
case ((kept, remaining), chName) =>
89+
val idx = remaining.indexOf(chName.value.toLowerCase)
90+
if idx >= 0 then (kept, remaining.patch(idx, Nil, 1))
91+
else (kept :+ chName, remaining)
92+
._1
8393
yield request
8494
.add[List[IndividualProvidedDetails]](individualsList)
8595
.add[Seq[IndividualName]](companiesHouseOfficersNames)
@@ -149,11 +159,11 @@ extends FrontendController(mcc, actions):
149159
val companiesHouseOfficerList = request.get[Seq[IndividualName]]
150160

151161
NameMatching.individualNameMatching(individualName, companiesHouseOfficerList) match
152-
case Some(_) =>
162+
case Some(matchedOfficerName) =>
153163
individualProvideDetailsService
154164
.upsertForApplication(
155165
individualProvideDetailsService.create(
156-
individualName = individualName,
166+
individualName = matchedOfficerName,
157167
isPersonOfControl = true,
158168
agentApplicationId = agentApplication.agentApplicationId
159169
)

app/uk/gov/hmrc/agentregistrationfrontend/testonly/services/GrsStubService.scala

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,11 @@ class GrsStubService @Inject() (
7979
organisationType = "5T"
8080
))
8181
case _ => None,
82-
crn = businessType match
83-
case BusinessType.Partnership.LimitedLiabilityPartnership | BusinessType.LimitedCompany | BusinessType.Partnership.LimitedPartnership | BusinessType.Partnership.ScottishLimitedPartnership =>
84-
journeyData.companyProfile.map(_.companyNumber.value)
85-
case _ => None,
82+
crn =
83+
businessType match
84+
case BusinessType.Partnership.LimitedLiabilityPartnership | BusinessType.LimitedCompany | BusinessType.Partnership.LimitedPartnership | BusinessType.Partnership.ScottishLimitedPartnership =>
85+
journeyData.companyProfile.map(_.companyNumber.value)
86+
case _ => None,
8687
addressDetails = AddressDetails(
8788
addressLine1 = "1 Test Street",
8889
addressLine2 = Some("Test Area"),

app/uk/gov/hmrc/agentregistrationfrontend/views/applicant/listdetails/incorporated/CheckYourAnswersPage.scala.html

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ <h1 class="govuk-heading-l">@title</h1>
9090
rows = existingList.map { individualDetails =>
9191
SummaryListRow(
9292
key = Key(content = Text(individualDetails.individualName.value), classes = "govuk-!-font-weight-regular hmrc-summary-list__key"),
93-
actions = Some(Actions(items = Seq(
93+
actions = Some(Actions(items = if(individualDetails.isPrecreated) Seq(
9494
ActionItem(
9595
href = AppRoutes.apply.listdetails.incoporated.ChangeCompaniesHouseOfficerController.show(individualDetails._id).url,
9696
content = Text(messages("common.change")),
@@ -101,6 +101,12 @@ <h1 class="govuk-heading-l">@title</h1>
101101
content = Text(messages("common.remove")),
102102
visuallyHiddenText = Some(individualDetails.individualName.value)
103103
)
104+
) else Seq(
105+
ActionItem(
106+
href = AppRoutes.apply.listdetails.incoporated.RemoveCompaniesHouseOfficerController.show(individualDetails._id).url,
107+
content = Text(messages("common.remove")),
108+
visuallyHiddenText = Some(individualDetails.individualName.value)
109+
)
104110
), classes = "hmrc-summary-list__actions"))
105111
)
106112
}.toSeq,

test/uk/gov/hmrc/agentregistrationfrontend/controllers/applicant/listdetails/CheckYourAnswersControllerSpec.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@
1616

1717
package uk.gov.hmrc.agentregistrationfrontend.controllers.applicant.listdetails
1818

19+
import scala.jdk.CollectionConverters.*
20+
1921
import org.jsoup.nodes.Document
2022
import play.api.http.HeaderNames
2123
import play.api.libs.ws.DefaultBodyReadables.*
2224
import play.api.libs.ws.WSResponse
2325
import uk.gov.hmrc.agentregistration.shared.AgentApplicationGeneralPartnership
26+
import uk.gov.hmrc.agentregistration.shared.AgentApplicationLlp
2427
import uk.gov.hmrc.agentregistrationfrontend.controllers.applicant.ApplyStubHelper
2528
import uk.gov.hmrc.agentregistrationfrontend.testsupport.ControllerSpec
2629
import uk.gov.hmrc.agentregistrationfrontend.testsupport.wiremock.stubs.AgentRegistrationStubs
@@ -139,3 +142,28 @@ extends ControllerSpec:
139142

140143
ApplyStubHelper.verifyConnectorsForAuthAction()
141144
AgentRegistrationStubs.verifyFindIndividualsForApplication(agentApplication.afterConfirmOtherRelevantIndividualsYes.agentApplicationId)
145+
146+
s"GET $path for incorporated (LLP) should return 200 and Change link for LLP member names should go to incorporated CYA" in:
147+
val llpApplication: AgentApplicationLlp = tdAll.agentApplicationLlp.afterConfirmTwoChOfficers
148+
ApplyStubHelper.stubsForAuthAction(llpApplication)
149+
AgentRegistrationStubs.stubFindIndividualsForApplication(
150+
agentApplicationId = llpApplication.agentApplicationId,
151+
individuals = List(tdAll.individualProvidedDetails, tdAll.individualProvidedDetails2)
152+
)
153+
154+
val response: WSResponse = get(path)
155+
156+
response.status shouldBe Status.OK
157+
val doc: Document = response.parseBodyAsJsoupDocument
158+
doc.title() shouldBe "Check your answers - Apply for an agent services account - GOV.UK"
159+
doc.select("h1").text() shouldBe "Check your answers"
160+
161+
val changeLinks = doc.mainContent.select(".govuk-summary-list__actions a")
162+
val llpMemberNamesChangeLink = changeLinks.asScala.find(_.text().contains("LLP member names"))
163+
llpMemberNamesChangeLink shouldBe defined
164+
llpMemberNamesChangeLink.fold(fail("LLP member names change link not found"))(link =>
165+
link.attr("href") shouldBe AppRoutes.apply.listdetails.incoporated.CheckYourAnswersController.show.url
166+
)
167+
168+
ApplyStubHelper.verifyConnectorsForAuthAction()
169+
AgentRegistrationStubs.verifyFindIndividualsForApplication(llpApplication.agentApplicationId)

test/uk/gov/hmrc/agentregistrationfrontend/controllers/applicant/listdetails/incorporated/ChangeCompaniesHouseOfficerControllerSpec.scala

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,32 @@ extends ControllerSpec:
102102
AgentRegistrationStubs.verifyFindIndividualsForApplication(agentApplication.afterNumberOfConfirmCompaniesHouseOfficers.agentApplicationId)
103103
CompaniesHouseStubs.verifySixOfficersCalls()
104104

105+
s"POST $postPath should store the matched CH officer name, not the user-entered name" in:
106+
// User enters "alice" / "tester" (lowercase), but CH has "Alice Tester".
107+
// The stored name should be the CH officer name "Alice Tester", not "alice tester".
108+
ApplyStubHelper.stubsForAuthAction(agentApplication.afterNumberOfConfirmCompaniesHouseOfficers)
109+
AgentRegistrationStubs.stubFindIndividualsForApplication(
110+
agentApplicationId = agentApplication.afterNumberOfConfirmCompaniesHouseOfficers.agentApplicationId,
111+
individuals = List(tdAll.individualProvidedDetails)
112+
)
113+
AgentRegistrationStubs.stubUpsertIndividualProvidedDetails(
114+
individualProvidedDetails = tdAll.individualProvidedDetails.copy(individualName = IndividualName("Alice Tester"))
115+
)
116+
CompaniesHouseStubs.stubSixOfficers()
117+
118+
val response: WSResponse =
119+
post(postPath)(Map(
120+
CompaniesHouseIndividuaNameForm.firstNameKey -> Seq("alice"),
121+
CompaniesHouseIndividuaNameForm.lastNameKey -> Seq("tester")
122+
))
123+
124+
response.status shouldBe Status.SEE_OTHER
125+
response.header("Location").value shouldBe
126+
AppRoutes.apply.listdetails.incoporated.CheckYourAnswersController.show.url
127+
ApplyStubHelper.verifyConnectorsForAuthAction()
128+
AgentRegistrationStubs.verifyUpsertIndividualProvidedDetails()
129+
CompaniesHouseStubs.verifySixOfficersCalls()
130+
105131
s"POST $postPath with valid name matching a Companies House officer should update and redirect to CYA" in:
106132
ApplyStubHelper.stubsForAuthAction(agentApplication.afterNumberOfConfirmCompaniesHouseOfficers)
107133
AgentRegistrationStubs.stubFindIndividualsForApplication(

0 commit comments

Comments
 (0)