Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/controllers/CheckYourSuspensionDetailsController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class CheckYourSuspensionDetailsController @Inject() (
def onPageLoad(mode: Mode): Action[AnyContent] = (identify andThen getData andThen requireData) { implicit request =>
logger.info("Display suspension details confirmation page")
val summaryList = buildSummaryList(request.userAnswers)
Ok(view(summaryList, mode, routes.SuspensionPeriodRangeDateController.onPageLoad(mode)))
Ok(view(summaryList, mode, routes.PaymentPlanSuspendedController.onPageLoad()))
}

def onSubmit(mode: Mode): Action[AnyContent] =
Expand Down
75 changes: 75 additions & 0 deletions app/controllers/PaymentPlanSuspendedController.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
* Copyright 2025 HM Revenue & Customs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package controllers

import controllers.actions.*
import models.UserAnswers
import models.responses.PaymentPlanDetails
import pages.SuspensionPeriodRangeDatePage

import javax.inject.Inject
import play.api.i18n.{I18nSupport, Messages, MessagesApi}
import play.api.mvc.{Action, AnyContent, MessagesControllerComponents}
import queries.{PaymentPlanDetailsQuery, PaymentPlanReferenceQuery}
import uk.gov.hmrc.govukfrontend.views.viewmodels.summarylist.SummaryListRow
import uk.gov.hmrc.play.bootstrap.frontend.controller.FrontendBaseController
import utils.Constants
import viewmodels.checkAnswers.{AmendPaymentAmountSummary, PaymentReferenceSummary, SuspensionPeriodRangeDateSummary}
import views.html.PaymentPlanSuspendedView

import java.time.format.DateTimeFormatter

class PaymentPlanSuspendedController @Inject() (
override val messagesApi: MessagesApi,
identify: IdentifierAction,
getData: DataRetrievalAction,
requireData: DataRequiredAction,
val controllerComponents: MessagesControllerComponents,
view: PaymentPlanSuspendedView
) extends FrontendBaseController
with I18nSupport {

def onPageLoad: Action[AnyContent] = (identify andThen getData andThen requireData) { implicit request =>
val userAnswers = request.userAnswers

val maybeResult = for {
planDetails <- userAnswers.get(PaymentPlanDetailsQuery)
paymentPlanReference <- userAnswers.get(PaymentPlanReferenceQuery)
suspensionPeriodRange <- userAnswers.get(SuspensionPeriodRangeDatePage)
} yield {
val formattedStartDate = suspensionPeriodRange.startDate.format(DateTimeFormatter.ofPattern(Constants.longDateTimeFormatPattern))
val formattedEndDate = suspensionPeriodRange.endDate.format(DateTimeFormatter.ofPattern(Constants.longDateTimeFormatPattern))
val rows = buildRows(paymentPlanReference, userAnswers, planDetails.paymentPlanDetails)
Ok(view(paymentPlanReference, formattedStartDate, formattedEndDate, routes.PaymentPlanDetailsController.onPageLoad(), rows))
}

maybeResult match {
case Some(result) => result
case _ => Redirect(routes.JourneyRecoveryController.onPageLoad())
}
}

private def buildRows(paymentPlanReference: String, userAnswers: UserAnswers, paymentPlanDetails: PaymentPlanDetails)(implicit
messages: Messages
): Seq[SummaryListRow] =
Seq(
Some(PaymentReferenceSummary.row(paymentPlanReference)),
Some(AmendPaymentAmountSummary.row(paymentPlanDetails.planType, paymentPlanDetails.scheduledPaymentAmount)),
SuspensionPeriodRangeDateSummary.row(userAnswers)
).flatten

}
80 changes: 41 additions & 39 deletions app/navigation/Navigator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -28,48 +28,50 @@ import models.PaymentPlanType.*
class Navigator @Inject() () {

private val normalRoutes: Page => UserAnswers => Call = {
case PaymentDatePage => _ => routes.CheckYourAnswersController.onPageLoad()
case PaymentReferencePage => userAnswers => checkPaymentReferenceLogic(userAnswers)
case PaymentAmountPage => _ => routes.PaymentDateController.onPageLoad(NormalMode)
case PersonalOrBusinessAccountPage => _ => routes.YourBankDetailsController.onPageLoad(NormalMode)
case YourBankDetailsPage => _ => routes.BankDetailsCheckYourAnswerController.onPageLoad(NormalMode)
case BankDetailsCheckYourAnswerPage => _ => routes.ConfirmAuthorityController.onPageLoad(NormalMode)
case ConfirmAuthorityPage => nextAfterConfirmAuthority(NormalMode)
case DirectDebitSourcePage => checkDirectDebitSource
case PaymentPlanTypePage => _ => routes.PaymentReferenceController.onPageLoad(NormalMode)
case PaymentsFrequencyPage => _ => routes.RegularPaymentAmountController.onPageLoad(NormalMode)
case RegularPaymentAmountPage => _ => routes.PlanStartDateController.onPageLoad(NormalMode)
case TotalAmountDuePage => _ => routes.PlanStartDateController.onPageLoad(NormalMode)
case PlanStartDatePage => userAnswers => checkPlanStartDateLogic(userAnswers)
case PlanEndDatePage => _ => routes.CheckYourAnswersController.onPageLoad()
case YearEndAndMonthPage => _ => routes.PaymentAmountController.onPageLoad(NormalMode)
case AmendPaymentAmountPage => userAnswers => checkPaymentPlanLogic(userAnswers, NormalMode)
case AmendPlanStartDatePage => _ => routes.AmendPaymentPlanConfirmationController.onPageLoad(NormalMode)
case AmendPlanEndDatePage => _ => routes.AmendPaymentPlanConfirmationController.onPageLoad(NormalMode)
case SuspensionPeriodRangeDatePage => _ => routes.CheckYourSuspensionDetailsController.onPageLoad(NormalMode)
case CancelPaymentPlanPage => navigateFromCancelPaymentPlanPage
case _ => _ => routes.LandingController.onPageLoad()
case PaymentDatePage => _ => routes.CheckYourAnswersController.onPageLoad()
case PaymentReferencePage => userAnswers => checkPaymentReferenceLogic(userAnswers)
case PaymentAmountPage => _ => routes.PaymentDateController.onPageLoad(NormalMode)
case PersonalOrBusinessAccountPage => _ => routes.YourBankDetailsController.onPageLoad(NormalMode)
case YourBankDetailsPage => _ => routes.BankDetailsCheckYourAnswerController.onPageLoad(NormalMode)
case BankDetailsCheckYourAnswerPage => _ => routes.ConfirmAuthorityController.onPageLoad(NormalMode)
case ConfirmAuthorityPage => nextAfterConfirmAuthority(NormalMode)
case DirectDebitSourcePage => checkDirectDebitSource
case PaymentPlanTypePage => _ => routes.PaymentReferenceController.onPageLoad(NormalMode)
case PaymentsFrequencyPage => _ => routes.RegularPaymentAmountController.onPageLoad(NormalMode)
case RegularPaymentAmountPage => _ => routes.PlanStartDateController.onPageLoad(NormalMode)
case TotalAmountDuePage => _ => routes.PlanStartDateController.onPageLoad(NormalMode)
case PlanStartDatePage => userAnswers => checkPlanStartDateLogic(userAnswers)
case PlanEndDatePage => _ => routes.CheckYourAnswersController.onPageLoad()
case YearEndAndMonthPage => _ => routes.PaymentAmountController.onPageLoad(NormalMode)
case AmendPaymentAmountPage => userAnswers => checkPaymentPlanLogic(userAnswers, NormalMode)
case AmendPlanStartDatePage => _ => routes.AmendPaymentPlanConfirmationController.onPageLoad(NormalMode)
case AmendPlanEndDatePage => _ => routes.AmendPaymentPlanConfirmationController.onPageLoad(NormalMode)
case SuspensionPeriodRangeDatePage => _ => routes.CheckYourSuspensionDetailsController.onPageLoad(NormalMode)
case SuspensionDetailsCheckYourAnswerPage => _ => routes.PaymentPlanSuspendedController.onPageLoad()
case CancelPaymentPlanPage => navigateFromCancelPaymentPlanPage
case _ => _ => routes.LandingController.onPageLoad()
}

private val checkRouteMap: Page => UserAnswers => Call = {
case YourBankDetailsPage => _ => routes.BankDetailsCheckYourAnswerController.onPageLoad(CheckMode)
case BankDetailsCheckYourAnswerPage => _ => routes.ConfirmAuthorityController.onPageLoad(CheckMode)
case ConfirmAuthorityPage => nextAfterConfirmAuthority(CheckMode)
case DirectDebitSourcePage => checkDirectDebitSource
case PaymentReferencePage => _ => routes.CheckYourAnswersController.onPageLoad()
case PaymentAmountPage => _ => routes.CheckYourAnswersController.onPageLoad()
case PaymentDatePage => _ => routes.CheckYourAnswersController.onPageLoad()
case PlanStartDatePage => _ => routes.CheckYourAnswersController.onPageLoad()
case PlanEndDatePage => _ => routes.CheckYourAnswersController.onPageLoad()
case TotalAmountDuePage => _ => routes.CheckYourAnswersController.onPageLoad()
case PaymentsFrequencyPage => _ => routes.CheckYourAnswersController.onPageLoad()
case RegularPaymentAmountPage => _ => routes.CheckYourAnswersController.onPageLoad()
case YearEndAndMonthPage => _ => routes.CheckYourAnswersController.onPageLoad()
case AmendPaymentAmountPage => userAnswers => checkPaymentPlanLogic(userAnswers, CheckMode)
case AmendPlanStartDatePage => _ => routes.AmendPaymentPlanConfirmationController.onPageLoad(CheckMode)
case AmendPlanEndDatePage => _ => routes.AmendPaymentPlanConfirmationController.onPageLoad(CheckMode)
case SuspensionPeriodRangeDatePage => _ => routes.CheckYourSuspensionDetailsController.onPageLoad(CheckMode)
case _ => _ => routes.LandingController.onPageLoad()
case YourBankDetailsPage => _ => routes.BankDetailsCheckYourAnswerController.onPageLoad(CheckMode)
case BankDetailsCheckYourAnswerPage => _ => routes.ConfirmAuthorityController.onPageLoad(CheckMode)
case ConfirmAuthorityPage => nextAfterConfirmAuthority(CheckMode)
case DirectDebitSourcePage => checkDirectDebitSource
case PaymentReferencePage => _ => routes.CheckYourAnswersController.onPageLoad()
case PaymentAmountPage => _ => routes.CheckYourAnswersController.onPageLoad()
case PaymentDatePage => _ => routes.CheckYourAnswersController.onPageLoad()
case PlanStartDatePage => _ => routes.CheckYourAnswersController.onPageLoad()
case PlanEndDatePage => _ => routes.CheckYourAnswersController.onPageLoad()
case TotalAmountDuePage => _ => routes.CheckYourAnswersController.onPageLoad()
case PaymentsFrequencyPage => _ => routes.CheckYourAnswersController.onPageLoad()
case RegularPaymentAmountPage => _ => routes.CheckYourAnswersController.onPageLoad()
case YearEndAndMonthPage => _ => routes.CheckYourAnswersController.onPageLoad()
case AmendPaymentAmountPage => userAnswers => checkPaymentPlanLogic(userAnswers, CheckMode)
case AmendPlanStartDatePage => _ => routes.AmendPaymentPlanConfirmationController.onPageLoad(CheckMode)
case AmendPlanEndDatePage => _ => routes.AmendPaymentPlanConfirmationController.onPageLoad(CheckMode)
case SuspensionPeriodRangeDatePage => _ => routes.CheckYourSuspensionDetailsController.onPageLoad(CheckMode)
case SuspensionDetailsCheckYourAnswerPage => _ => routes.PaymentPlanSuspendedController.onPageLoad()
case _ => _ => routes.LandingController.onPageLoad()
}

def nextPage(page: Page, mode: Mode, userAnswers: UserAnswers): Call = mode match {
Expand Down
61 changes: 61 additions & 0 deletions app/views/PaymentPlanSuspendedView.scala.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
@*
* Copyright 2025 HM Revenue & Customs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*@

@import views.html.components.*

@this(
layout: templates.Layout,
confirmationPanel: ConfirmationPanel,
govukInsetText: GovukInsetText,
header2: Header2,
paragraph: Paragraph,
govukSummaryList: GovukSummaryList,
link: Link
)

@(paymentPlanReference: String, startDate: String, endDate: String, call: Call, rows:Seq[SummaryListRow])(implicit request: Request[_], messages: Messages)

@layout(pageTitle = titleForManageJourneyNoForm(messages("paymentPlanSuspended.title")), showBackLink = false) {

@confirmationPanel(
title = messages("paymentPlanSuspended.panel.title"),
body = Html(
s"${messages("paymentPlanSuspended.panel.p", startDate, endDate)}"
),
classes = "govuk-!-margin-bottom-2",
isAllContentStrong = false
)

@header2("paymentPlanSuspended.h1")

@paragraph(messages("paymentPlanSuspended.p1", startDate, endDate))

@paragraph(messages("paymentPlanSuspended.p2"))

@header2("paymentPlanSuspended.h2")

@govukSummaryList(SummaryList(
rows = rows
))

@govukInsetText(
InsetText(
content = Text(messages("paymentPlanSuspended.pleaseNote"))
)
)

@link("paymentPlanSuspended.link", call.url)
}
7 changes: 5 additions & 2 deletions app/views/components/ConfirmationPanel.scala.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,15 @@

@this(govukPanel: GovukPanel)

@(title: String, body: Html = Html(emptyString), classes: String = emptyString)
@(title: String, body: Html = Html(emptyString), classes: String = emptyString, isAllContentStrong: Boolean = true)

@govukPanel(
Panel(
title = HtmlContent(title),
content = HtmlContent(s"<strong>${body.body}</strong>"),
content = if (isAllContentStrong)
HtmlContent(s"<strong>${body.body}</strong>")
else
HtmlContent(body.body),
classes = classes
)
)
2 changes: 2 additions & 0 deletions conf/app.routes
Original file line number Diff line number Diff line change
Expand Up @@ -159,3 +159,5 @@ POST /check-suspension-details controllers.CheckYou
GET /change-check-suspension-details controllers.CheckYourSuspensionDetailsController.onPageLoad(mode: Mode = CheckMode)
POST /change-check-suspension-details controllers.CheckYourSuspensionDetailsController.onSubmit(mode: Mode = CheckMode)


GET /payment-plan-suspended controllers.PaymentPlanSuspendedController.onPageLoad()
11 changes: 11 additions & 0 deletions conf/messages.en
Original file line number Diff line number Diff line change
Expand Up @@ -571,3 +571,14 @@ checkYourSuspensionDetails.heading = Check your suspension details
checkYourSuspensionDetails.confirm = Confirm and continue



paymentPlanSuspended.title = Payment plan suspended
paymentPlanSuspended.panel.title = Payment plan suspended
paymentPlanSuspended.panel.p = From <br><strong>{0}</strong> to <strong>{1}</strong>
paymentPlanSuspended.pleaseNote = You can print this page for your records using the print function on your browser.
paymentPlanSuspended.h1 = What happens next
paymentPlanSuspended.p1 = This payment plan has now been suspended. No payments will be taken from {0} to {1}.
paymentPlanSuspended.p2 = When the suspension period ends, your payment plan will resume on the next working day. It may take up to 36 hours for this suspension to appear in your account.
paymentPlanSuspended.h2 = Suspension details
paymentPlanSuspended.paymentReference = Payment reference
paymentPlanSuspended.link = Return to payment plan
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ class CheckYourSuspensionDetailsControllerSpec extends SpecBase with MockitoSuga
val result = route(application, request).value

status(result) mustEqual SEE_OTHER
redirectLocation(result).value mustEqual controllers.routes.LandingController.onPageLoad().url
redirectLocation(result).value mustEqual controllers.routes.PaymentPlanSuspendedController.onPageLoad().url
}
}

Expand Down
Loading