Skip to content

Commit 838a4d3

Browse files
Merge pull request #75 from hmrc/DTR-3146
DTR-3146: Screen AS-C4c What is the mobile number for [Company]?
2 parents 3585326 + c507c13 commit 838a4d3

File tree

13 files changed

+343
-44
lines changed

13 files changed

+343
-44
lines changed

app/controllers/add/company/CompanyMobileNumberController.scala

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import controllers.actions.*
2020
import forms.add.company.CompanyMobileNumberFormProvider
2121
import models.Mode
2222
import navigation.Navigator
23-
import pages.add.company.CompanyMobileNumberPage
23+
import pages.add.company.{CompanyMobileNumberPage, CompanyNamePage}
2424
import play.api.i18n.{I18nSupport, MessagesApi}
2525
import play.api.mvc.{Action, AnyContent, MessagesControllerComponents}
2626
import repositories.SessionRepository
@@ -47,26 +47,35 @@ class CompanyMobileNumberController @Inject() (
4747
val form = formProvider()
4848

4949
def onPageLoad(mode: Mode): Action[AnyContent] = (identify andThen getData andThen requireData) { implicit request =>
50+
request.userAnswers
51+
.get(CompanyNamePage)
52+
.map { companyName =>
53+
val preparedForm = request.userAnswers.get(CompanyMobileNumberPage) match {
54+
case None => form
55+
case Some(value) => form.fill(value)
56+
}
5057

51-
val preparedForm = request.userAnswers.get(CompanyMobileNumberPage) match {
52-
case None => form
53-
case Some(value) => form.fill(value)
54-
}
55-
56-
Ok(view(preparedForm, mode))
58+
Ok(view(preparedForm, mode, companyName))
59+
}
60+
.getOrElse(Redirect(controllers.routes.JourneyRecoveryController.onPageLoad()))
5761
}
5862

5963
def onSubmit(mode: Mode): Action[AnyContent] = (identify andThen getData andThen requireData).async {
6064
implicit request =>
61-
form
62-
.bindFromRequest()
63-
.fold(
64-
formWithErrors => Future.successful(BadRequest(view(formWithErrors, mode))),
65-
value =>
66-
for {
67-
updatedAnswers <- Future.fromTry(request.userAnswers.set(CompanyMobileNumberPage, value))
68-
_ <- sessionRepository.set(updatedAnswers)
69-
} yield Redirect(navigator.nextPage(CompanyMobileNumberPage, mode, updatedAnswers))
70-
)
65+
request.userAnswers
66+
.get(CompanyNamePage)
67+
.map { companyName =>
68+
form
69+
.bindFromRequest()
70+
.fold(
71+
formWithErrors => Future.successful(BadRequest(view(formWithErrors, mode, companyName))),
72+
value =>
73+
for {
74+
updatedAnswers <- Future.fromTry(request.userAnswers.set(CompanyMobileNumberPage, value))
75+
_ <- sessionRepository.set(updatedAnswers)
76+
} yield Redirect(navigator.nextPage(CompanyMobileNumberPage, mode, updatedAnswers))
77+
)
78+
}
79+
.getOrElse(Future.successful(Redirect(controllers.routes.JourneyRecoveryController.onPageLoad())))
7180
}
7281
}

app/forms/add/company/CompanyMobileNumberFormProvider.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package forms.add.company
1818

19+
import forms.Validation
20+
import forms.mappings.Constants.MaxLength35
1921
import forms.mappings.Mappings
2022
import play.api.data.Form
2123

@@ -26,6 +28,11 @@ class CompanyMobileNumberFormProvider @Inject() extends Mappings {
2628
def apply(): Form[String] =
2729
Form(
2830
"value" -> text("companyMobileNumber.error.required")
29-
.verifying(maxLength(100, "companyMobileNumber.error.length"))
31+
.verifying(
32+
firstError(
33+
maxLength(MaxLength35, "companyMobileNumber.error.length"),
34+
regexp(Validation.mobileRegex, "companyMobileNumber.error.invalid")
35+
)
36+
)
3037
)
3138
}

app/navigation/Navigator.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ class Navigator @Inject() () {
6262
userAnswers => navigatorFromCompanyContactOptionsPage(NormalMode)(userAnswers)
6363
case CompanyEmailAddressPage =>
6464
_ => controllers.add.company.routes.CompanyEmailAddressController.onPageLoad(NormalMode)
65+
case CompanyMobileNumberPage =>
66+
_ => controllers.add.company.routes.CompanyMobileNumberController.onPageLoad(NormalMode)
6567
case PartnershipNamePage =>
6668
_ => controllers.add.partnership.routes.PartnershipHasUtrYesNoController.onPageLoad(NormalMode)
6769
case PartnershipHasUtrYesNoPage => userAnswers => navigatorFromPartnershipHasUtrYesNoPage(NormalMode)(userAnswers)
@@ -155,6 +157,8 @@ class Navigator @Inject() () {
155157
_ => controllers.add.company.routes.CompanyCheckYourAnswersController.onPageLoad()
156158
case CompanyUtrPage =>
157159
_ => controllers.add.company.routes.CompanyCheckYourAnswersController.onPageLoad()
160+
case CompanyMobileNumberPage =>
161+
_ => controllers.add.company.routes.CompanyMobileNumberController.onPageLoad(CheckMode)
158162
case _ => _ => controllers.add.routes.CheckYourAnswersController.onPageLoad()
159163
}
160164

app/views/add/company/CompanyMobileNumberView.scala.html

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*@
1616

1717
@import viewmodels.InputWidth._
18+
@import viewmodels.LabelSize.Large
1819

1920
@this(
2021
layout: templates.Layout,
@@ -24,7 +25,7 @@
2425
govukButton: GovukButton
2526
)
2627

27-
@(form: Form[_], mode: Mode)(implicit request: Request[_], messages: Messages)
28+
@(form: Form[_], mode: Mode, companyName: String)(implicit request: Request[_], messages: Messages)
2829

2930
@layout(pageTitle = title(form, messages("companyMobileNumber.title"))) {
3031

@@ -37,9 +38,13 @@
3738
@govukInput(
3839
InputViewModel(
3940
field = form("value"),
40-
label = LabelViewModel(messages("companyMobileNumber.heading")).asPageHeading()
41+
label = LabelViewModel(messages("companyMobileNumber.heading", companyName)).asPageHeading(Large)
4142
)
43+
.withHint(HintViewModel(messages("companyMobileNumber.hintText")))
4244
.withWidth(Full)
45+
.withInputType("tel")
46+
.withSpellcheck(false)
47+
.withAutocomplete("tel")
4348
)
4449

4550
@govukButton(

conf/app.routes

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,10 @@ POST /add/company/phone-number controllers.add.
230230
GET /add/company/change-phone-number controllers.add.company.CompanyPhoneNumberController.onPageLoad(mode: Mode = CheckMode)
231231
POST /add/company/change-phone-number controllers.add.company.CompanyPhoneNumberController.onSubmit(mode: Mode = CheckMode)
232232

233-
GET /companyMobileNumber controllers.add.company.CompanyMobileNumberController.onPageLoad(mode: Mode = NormalMode)
234-
POST /companyMobileNumber controllers.add.company.CompanyMobileNumberController.onSubmit(mode: Mode = NormalMode)
235-
GET /changeCompanyMobileNumber controllers.add.company.CompanyMobileNumberController.onPageLoad(mode: Mode = CheckMode)
236-
POST /changeCompanyMobileNumber controllers.add.company.CompanyMobileNumberController.onSubmit(mode: Mode = CheckMode)
233+
GET /add/company/mobile-number controllers.add.company.CompanyMobileNumberController.onPageLoad(mode: Mode = NormalMode)
234+
POST /add/company/mobile-number controllers.add.company.CompanyMobileNumberController.onSubmit(mode: Mode = NormalMode)
235+
GET /add/company/change-mobile-number controllers.add.company.CompanyMobileNumberController.onPageLoad(mode: Mode = CheckMode)
236+
POST /add/company/change-mobile-number controllers.add.company.CompanyMobileNumberController.onSubmit(mode: Mode = CheckMode)
237237

238238
GET /add/company/company-has-utr controllers.add.company.CompanyUtrYesNoController.onPageLoad(mode: Mode = NormalMode)
239239
POST /add/company/company-has-utr controllers.add.company.CompanyUtrYesNoController.onSubmit(mode: Mode = NormalMode)

conf/messages.en

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -544,12 +544,14 @@ companyPhoneNumber.error.length = Enter a valid phone number, like 01632 960 001
544544
companyPhoneNumber.checkYourAnswersLabel = Phone number
545545
companyPhoneNumber.change.hidden = phone number
546546

547-
companyMobileNumber.title = companyMobileNumber
548-
companyMobileNumber.heading = companyMobileNumber
549-
companyMobileNumber.checkYourAnswersLabel = companyMobileNumber
550-
companyMobileNumber.error.required = Enter companyMobileNumber
551-
companyMobileNumber.error.length = CompanyMobileNumber must be 100 characters or less
552-
companyMobileNumber.change.hidden = CompanyMobileNumber
547+
companyMobileNumber.title = What is the mobile number for this company?
548+
companyMobileNumber.heading = What is the mobile number for {0}?
549+
companyMobileNumber.hintText = HMRC will never use this mobile number to contact this subcontractor
550+
companyMobileNumber.checkYourAnswersLabel = Mobile Number
551+
companyMobileNumber.error.required = Enter a mobile number
552+
companyMobileNumber.error.invalid = Enter a valid mobile number, like 07700 900 982 or +44 7700 900 999
553+
companyMobileNumber.error.length = Enter a valid mobile number, like 07700 900 982 or +44 7700 900 999
554+
companyMobileNumber.change.hidden = mobile Number
553555

554556
companyUtrYesNo.title = Do you know the Unique Taxpayer Reference for this company?
555557
companyUtrYesNo.heading = Do you know the Unique Taxpayer Reference for {0}?

test/controllers/add/company/CompanyMobileNumberControllerSpec.scala

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import navigation.{FakeNavigator, Navigator}
2424
import org.mockito.ArgumentMatchers.any
2525
import org.mockito.Mockito.when
2626
import org.scalatestplus.mockito.MockitoSugar
27-
import pages.add.company.CompanyMobileNumberPage
27+
import pages.add.company.{CompanyMobileNumberPage, CompanyNamePage}
2828
import play.api.inject.bind
2929
import play.api.mvc.Call
3030
import play.api.test.FakeRequest
@@ -41,14 +41,19 @@ class CompanyMobileNumberControllerSpec extends SpecBase with MockitoSugar {
4141
val formProvider = new CompanyMobileNumberFormProvider()
4242
val form = formProvider()
4343

44+
private val companyName = "Test Company"
45+
4446
lazy val companyMobileNumberRoute =
4547
controllers.add.company.routes.CompanyMobileNumberController.onPageLoad(NormalMode).url
4648

49+
private def uaWithName: UserAnswers =
50+
emptyUserAnswers.set(CompanyNamePage, companyName).success.value
51+
4752
"CompanyMobileNumber Controller" - {
4853

4954
"must return OK and the correct view for a GET" in {
5055

51-
val application = applicationBuilder(userAnswers = Some(emptyUserAnswers)).build()
56+
val application = applicationBuilder(userAnswers = Some(uaWithName)).build()
5257

5358
running(application) {
5459
val request = FakeRequest(GET, companyMobileNumberRoute)
@@ -58,13 +63,13 @@ class CompanyMobileNumberControllerSpec extends SpecBase with MockitoSugar {
5863
val view = application.injector.instanceOf[CompanyMobileNumberView]
5964

6065
status(result) mustEqual OK
61-
contentAsString(result) mustEqual view(form, NormalMode)(request, messages(application)).toString
66+
contentAsString(result) mustEqual view(form, NormalMode, companyName)(request, messages(application)).toString
6267
}
6368
}
6469

6570
"must populate the view correctly on a GET when the question has previously been answered" in {
6671

67-
val userAnswers = UserAnswers(userAnswersId).set(CompanyMobileNumberPage, "answer").success.value
72+
val userAnswers = uaWithName.set(CompanyMobileNumberPage, "+44 7700 900 999").success.value
6873

6974
val application = applicationBuilder(userAnswers = Some(userAnswers)).build()
7075

@@ -76,7 +81,7 @@ class CompanyMobileNumberControllerSpec extends SpecBase with MockitoSugar {
7681
val result = route(application, request).value
7782

7883
status(result) mustEqual OK
79-
contentAsString(result) mustEqual view(form.fill("answer"), NormalMode)(request, messages(application)).toString
84+
contentAsString(result) mustEqual view(form.fill("+44 7700 900 999"), NormalMode, companyName)(request, messages(application)).toString
8085
}
8186
}
8287

@@ -87,7 +92,7 @@ class CompanyMobileNumberControllerSpec extends SpecBase with MockitoSugar {
8792
when(mockSessionRepository.set(any())) thenReturn Future.successful(true)
8893

8994
val application =
90-
applicationBuilder(userAnswers = Some(emptyUserAnswers))
95+
applicationBuilder(userAnswers = Some(uaWithName))
9196
.overrides(
9297
bind[Navigator].toInstance(new FakeNavigator(onwardRoute)),
9398
bind[SessionRepository].toInstance(mockSessionRepository)
@@ -97,7 +102,7 @@ class CompanyMobileNumberControllerSpec extends SpecBase with MockitoSugar {
97102
running(application) {
98103
val request =
99104
FakeRequest(POST, companyMobileNumberRoute)
100-
.withFormUrlEncodedBody(("value", "answer"))
105+
.withFormUrlEncodedBody(("value", "+44 7700 900 999"))
101106

102107
val result = route(application, request).value
103108

@@ -108,7 +113,7 @@ class CompanyMobileNumberControllerSpec extends SpecBase with MockitoSugar {
108113

109114
"must return a Bad Request and errors when invalid data is submitted" in {
110115

111-
val application = applicationBuilder(userAnswers = Some(emptyUserAnswers)).build()
116+
val application = applicationBuilder(userAnswers = Some(uaWithName)).build()
112117

113118
running(application) {
114119
val request =
@@ -122,7 +127,7 @@ class CompanyMobileNumberControllerSpec extends SpecBase with MockitoSugar {
122127
val result = route(application, request).value
123128

124129
status(result) mustEqual BAD_REQUEST
125-
contentAsString(result) mustEqual view(boundForm, NormalMode)(request, messages(application)).toString
130+
contentAsString(result) mustEqual view(boundForm, NormalMode, companyName)(request, messages(application)).toString
126131
}
127132
}
128133

@@ -147,13 +152,44 @@ class CompanyMobileNumberControllerSpec extends SpecBase with MockitoSugar {
147152
running(application) {
148153
val request =
149154
FakeRequest(POST, companyMobileNumberRoute)
150-
.withFormUrlEncodedBody(("value", "answer"))
155+
.withFormUrlEncodedBody(("value", "+44 7700 900 999"))
151156

152157
val result = route(application, request).value
153158

154159
status(result) mustEqual SEE_OTHER
155160
redirectLocation(result).value mustEqual routes.JourneyRecoveryController.onPageLoad().url
156161
}
157162
}
163+
164+
"must redirect to JourneyRecovery if CompanyName is missing for a GET" in {
165+
166+
val application = applicationBuilder(userAnswers = Some(emptyUserAnswers)).build()
167+
168+
running(application) {
169+
val request = FakeRequest(GET, companyMobileNumberRoute)
170+
val result = route(application, request).value
171+
172+
status(result) mustEqual SEE_OTHER
173+
redirectLocation(result).value mustEqual
174+
controllers.routes.JourneyRecoveryController.onPageLoad().url
175+
}
176+
}
177+
178+
"must redirect to JourneyRecovery if CompanyName is missing for a POST" in {
179+
180+
val application = applicationBuilder(userAnswers = Some(emptyUserAnswers)).build()
181+
182+
running(application) {
183+
val request =
184+
FakeRequest(POST, companyMobileNumberRoute)
185+
.withFormUrlEncodedBody(("value", "+44 7700 900 999"))
186+
187+
val result = route(application, request).value
188+
189+
status(result) mustEqual SEE_OTHER
190+
redirectLocation(result).value mustEqual
191+
controllers.routes.JourneyRecoveryController.onPageLoad().url
192+
}
193+
}
158194
}
159195
}

test/forms/add/company/CompanyMobileNumberFormProviderSpec.scala

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@
1616

1717
package forms.add.company
1818

19+
import forms.Validation
1920
import forms.behaviours.StringFieldBehaviours
21+
import forms.mappings.Constants.MaxLength35
22+
import org.scalacheck.Gen
2023
import play.api.data.FormError
2124

2225
class CompanyMobileNumberFormProviderSpec extends StringFieldBehaviours {
2326

2427
val requiredKey = "companyMobileNumber.error.required"
2528
val lengthKey = "companyMobileNumber.error.length"
26-
val maxLength = 100
29+
val invalidKey = "companyMobileNumber.error.invalid"
2730

2831
val form = new CompanyMobileNumberFormProvider()()
2932

@@ -34,20 +37,31 @@ class CompanyMobileNumberFormProviderSpec extends StringFieldBehaviours {
3437
behave like fieldThatBindsValidData(
3538
form,
3639
fieldName,
37-
stringsWithMaxLength(maxLength)
40+
Gen.oneOf(
41+
"+44 7700 900 999",
42+
"+44 7700 900 111",
43+
"07700 900 982"
44+
)
3845
)
3946

4047
behave like fieldWithMaxLength(
4148
form,
4249
fieldName,
43-
maxLength = maxLength,
44-
lengthError = FormError(fieldName, lengthKey, Seq(maxLength))
50+
maxLength = MaxLength35,
51+
lengthError = FormError(fieldName, lengthKey, Seq(MaxLength35))
4552
)
4653

4754
behave like mandatoryField(
4855
form,
4956
fieldName,
5057
requiredError = FormError(fieldName, requiredKey)
5158
)
59+
60+
behave like fieldWithRegex(
61+
form,
62+
fieldName,
63+
invalidKey,
64+
regex = Validation.mobileRegex
65+
)
5266
}
5367
}

test/forms/behaviours/StringFieldBehaviours.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package forms.behaviours
1818

1919
import org.scalacheck.Gen
20+
import org.scalatest.matchers.should.Matchers.should
2021
import play.api.data.{Form, FormError}
2122

2223
trait StringFieldBehaviours extends FieldBehaviours {
@@ -55,4 +56,13 @@ trait StringFieldBehaviours extends FieldBehaviours {
5556
result.errors mustEqual Seq(error)
5657
}
5758
}
59+
60+
def fieldWithRegex(form: Form[_], fieldName: String, errorKey: String, regex: String): Unit = {
61+
"must match the pattern" in {
62+
val invalidData = "12345abc"
63+
val result = form.bind(Map(fieldName -> invalidData))
64+
result.errors should contain(FormError(fieldName, errorKey, Seq(regex)))
65+
}
66+
}
67+
5868
}

0 commit comments

Comments
 (0)