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
15 changes: 11 additions & 4 deletions app/controllers/DirectDebitSummaryController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@ package controllers

import controllers.actions.*
import models.UserAnswers
import pages.{AmendPaymentAmountPage, AmendPlanEndDatePage, AmendPlanStartDatePage, ManagePaymentPlanTypePage, SuspensionPeriodRangeDatePage}
import play.api.i18n.{I18nSupport, MessagesApi}
import play.api.mvc.{Action, AnyContent, MessagesControllerComponents}
import services.NationalDirectDebitService
import queries.{DirectDebitReferenceQuery, PaymentPlanReferenceQuery, PaymentPlansCountQuery}
import queries.{DirectDebitReferenceQuery, PaymentPlanDetailsQuery, PaymentPlanReferenceQuery, PaymentPlansCountQuery}
import repositories.SessionRepository
import uk.gov.hmrc.play.bootstrap.frontend.controller.FrontendBaseController
import views.html.DirectDebitSummaryView
Expand All @@ -45,10 +46,10 @@ class DirectDebitSummaryController @Inject() (
val userAnswers = request.userAnswers.getOrElse(UserAnswers(request.userId))
userAnswers.get(DirectDebitReferenceQuery) match {
case Some(reference) =>
cleansePaymentReference(userAnswers).flatMap { _ =>
cleanseUserData(userAnswers).flatMap { cleansedUserAnswers =>
nddService.retrieveDirectDebitPaymentPlans(reference).flatMap { ddPaymentPlans =>
for {
updatedAnswers <- Future.fromTry(userAnswers.set(PaymentPlansCountQuery, ddPaymentPlans.paymentPlanCount))
updatedAnswers <- Future.fromTry(cleansedUserAnswers.set(PaymentPlansCountQuery, ddPaymentPlans.paymentPlanCount))
updatedAnswers <- Future.fromTry(updatedAnswers.set(DirectDebitReferenceQuery, reference))
_ <- sessionRepository.set(updatedAnswers)
} yield {
Expand All @@ -74,9 +75,15 @@ class DirectDebitSummaryController @Inject() (
} yield Redirect(routes.DirectDebitSummaryController.onPageLoad())
}

private def cleansePaymentReference(userAnswers: UserAnswers): Future[UserAnswers] =
private def cleanseUserData(userAnswers: UserAnswers): Future[UserAnswers] =
for {
updatedUserAnswers <- Future.fromTry(userAnswers.remove(PaymentPlanReferenceQuery))
updatedUserAnswers <- Future.fromTry(updatedUserAnswers.remove(PaymentPlanDetailsQuery))
updatedUserAnswers <- Future.fromTry(updatedUserAnswers.remove(ManagePaymentPlanTypePage))
updatedUserAnswers <- Future.fromTry(updatedUserAnswers.remove(AmendPaymentAmountPage))
updatedUserAnswers <- Future.fromTry(updatedUserAnswers.remove(AmendPlanStartDatePage))
updatedUserAnswers <- Future.fromTry(updatedUserAnswers.remove(AmendPlanEndDatePage))
updatedUserAnswers <- Future.fromTry(updatedUserAnswers.remove(SuspensionPeriodRangeDatePage))
_ <- sessionRepository.set(updatedUserAnswers)
} yield updatedUserAnswers
}
95 changes: 71 additions & 24 deletions app/controllers/PaymentPlanDetailsController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ import utils.Constants
import viewmodels.checkAnswers.*
import views.html.PaymentPlanDetailsView

import java.time.LocalDate
import java.time.format.DateTimeFormatter
import javax.inject.Inject
import scala.concurrent.duration.*
import scala.concurrent.{Await, ExecutionContext, Future}
Expand Down Expand Up @@ -59,28 +61,52 @@ class PaymentPlanDetailsController @Inject() (
updatedAnswers <- Future.fromTry(updatedAnswers.set(ManagePaymentPlanTypePage, planDetail.planType))
updatedAnswers <- planDetail.scheduledPaymentAmount match {
case Some(amount) => Future.fromTry(updatedAnswers.set(AmendPaymentAmountPage, amount))
case None => Future.successful(updatedAnswers)
case _ => Future.successful(updatedAnswers)
}
updatedAnswers <- (planDetail.suspensionStartDate, planDetail.suspensionEndDate) match {
case (Some(startDate), Some(endDate)) =>
Future.fromTry(updatedAnswers.set(SuspensionPeriodRangeDatePage, SuspensionPeriodRange(startDate, endDate)))
case _ => Future.successful(updatedAnswers)
}
updatedAnswers <- planDetail.scheduledPaymentEndDate match {
case Some(endDate) => Future.fromTry(updatedAnswers.set(AmendPlanEndDatePage, endDate))
case None => Future.successful(updatedAnswers)
updatedAnswers <- planDetail.scheduledPaymentStartDate match {
case Some(paymentStartDate) => Future.fromTry(updatedAnswers.set(AmendPlanEndDatePage, paymentStartDate))
case _ => Future.successful(updatedAnswers)
}
updatedAnswers <- planDetail.scheduledPaymentEndDate match {
case Some(endDate) => Future.fromTry(updatedAnswers.set(AmendPlanEndDatePage, endDate))
case None => Future.successful(updatedAnswers)
case Some(paymentEndDate) => Future.fromTry(updatedAnswers.set(AmendPlanEndDatePage, paymentEndDate))
case _ => Future.successful(updatedAnswers)
}
updatedAnswers <- cleanseCancelPaymentPlanPage(updatedAnswers)
_ <- sessionRepository.set(updatedAnswers)
updatedAnswers <- cleanseSessionPages(updatedAnswers)
showAllActionsFlag <- calculateShowAction(nddService, planDetail)
_ <- sessionRepository.set(updatedAnswers)
} yield {
val flag: Future[Boolean] = calculateShowAction(nddService, planDetail)
val showActions = Await.result(flag, 5.seconds)
val showAmendLink = isAmendLinkVisible(showAllActionsFlag, planDetail)
val showCancelLink = isCancelLinkVisible(showAllActionsFlag, planDetail)
val showSuspendLink = isSuspendLinkVisible(showAllActionsFlag, planDetail)
val summaryRows: Seq[SummaryListRow] = buildSummaryRows(planDetail)
Ok(view(planDetail.planType, paymentPlanReference, showActions, summaryRows))
val isSuspensionActive = isSuspendPeriodActive(planDetail)

val formattedSuspensionStartDate = planDetail.suspensionStartDate
.map(_.format(DateTimeFormatter.ofPattern(Constants.longDateTimeFormatPattern)))
.getOrElse("")

val formattedSuspensionEndDate = planDetail.suspensionEndDate
.map(_.format(DateTimeFormatter.ofPattern(Constants.longDateTimeFormatPattern)))
.getOrElse("")

Ok(
view(
planDetail.planType,
paymentPlanReference,
showAmendLink,
showCancelLink,
showSuspendLink,
isSuspensionActive,
formattedSuspensionStartDate,
formattedSuspensionEndDate,
summaryRows
)
)
}
}
case _ =>
Expand Down Expand Up @@ -117,10 +143,14 @@ class PaymentPlanDetailsController @Inject() (
AmendPlanStartDateSummary.row(planDetail.planType, planDetail.scheduledPaymentStartDate, Constants.shortDateTimeFormatPattern),
AmendPlanEndDateSummary.row(planDetail.scheduledPaymentEndDate, Constants.shortDateTimeFormatPattern),
PaymentsFrequencySummary.row(planDetail.scheduledPaymentFrequency),
AmendPaymentAmountSummary.row(planDetail.planType, planDetail.scheduledPaymentAmount),
AmendSuspendDateSummary.row(planDetail.suspensionStartDate, true), // true for start
AmendSuspendDateSummary.row(planDetail.suspensionEndDate, false) // false for end
)
AmendPaymentAmountSummary.row(planDetail.planType, planDetail.scheduledPaymentAmount)
) ++
(if (isSuspendPeriodActive(planDetail)) {
Seq(SuspensionPeriodRangeDateSummary.row(planDetail.suspensionStartDate, planDetail.suspensionEndDate))
} else {
Seq.empty
})

case _ => // For Variable and Tax repayment plan
Seq(
AmendPaymentPlanTypeSummary.row(planDetail.planType),
Expand All @@ -145,31 +175,48 @@ class PaymentPlanDetailsController @Inject() (
case Some(startDate) => nddService.isTwoDaysPriorPaymentDate(startDate)
case None => Future.successful(true)
}
case PaymentPlanType.BudgetPaymentPlan.toString =>
planDetail.scheduledPaymentEndDate match {
case Some(startDate) => nddService.isThreeDaysPriorPlanEndDate(startDate)
case None => Future.successful(true)
}
case PaymentPlanType.VariablePaymentPlan.toString =>
case PaymentPlanType.BudgetPaymentPlan.toString | PaymentPlanType.VariablePaymentPlan.toString =>
for {
isTwoDaysBeforeStart <- planDetail.scheduledPaymentStartDate match {
case Some(startDate) => nddService.isTwoDaysPriorPaymentDate(startDate)
case None => Future.successful(true)
case _ => Future.successful(true)
}
isThreeDaysBeforeEnd <- planDetail.scheduledPaymentEndDate match {
case Some(endDate) => nddService.isThreeDaysPriorPlanEndDate(endDate)
case None => Future.successful(true)
case _ => Future.successful(true)
}
} yield isTwoDaysBeforeStart && isThreeDaysBeforeEnd

case _ => Future.successful(false) // For TaxCredit repayment plan
}
}

private def cleanseCancelPaymentPlanPage(userAnswers: UserAnswers): Future[UserAnswers] =
private def cleanseSessionPages(userAnswers: UserAnswers): Future[UserAnswers] =
for {
updatedUserAnswers <- Future.fromTry(userAnswers.remove(CancelPaymentPlanPage))
updatedUserAnswers <- Future.fromTry(updatedUserAnswers.remove(DuplicateWarningPage))
_ <- sessionRepository.set(updatedUserAnswers)
} yield updatedUserAnswers

private def isAmendLinkVisible(showAllActionsFlag: Boolean, planDetail: PaymentPlanDetails): Boolean = {
showAllActionsFlag && (planDetail.planType == PaymentPlanType.SinglePaymentPlan.toString || planDetail.planType == PaymentPlanType.BudgetPaymentPlan.toString)
}

private def isCancelLinkVisible(showAllActionsFlag: Boolean, planDetail: PaymentPlanDetails): Boolean = {
showAllActionsFlag && planDetail.planType != PaymentPlanType.TaxCreditRepaymentPlan.toString
}

private def isSuspendLinkVisible(showAllActionsFlag: Boolean, planDetail: PaymentPlanDetails): Boolean = {
planDetail.planType match {
case planType if planType == PaymentPlanType.BudgetPaymentPlan.toString =>
showAllActionsFlag && !isSuspendPeriodActive(planDetail)
case _ => false
}
}

private def isSuspendPeriodActive(planDetail: PaymentPlanDetails): Boolean = {
(for {
suspensionEndDate <- planDetail.suspensionEndDate
} yield !LocalDate.now().isAfter(suspensionEndDate)).getOrElse(false)
}
}
10 changes: 5 additions & 5 deletions app/controllers/YourDirectDebitInstructionsController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import controllers.actions.*
import models.UserAnswers
import play.api.i18n.{I18nSupport, MessagesApi}
import play.api.mvc.{Action, AnyContent, MessagesControllerComponents}
import queries.{DirectDebitReferenceQuery, PaymentPlanReferenceQuery}
import queries.{DirectDebitReferenceQuery, PaymentPlansCountQuery}
import repositories.SessionRepository
import services.NationalDirectDebitService
import uk.gov.hmrc.play.bootstrap.frontend.controller.FrontendBaseController
Expand Down Expand Up @@ -55,8 +55,8 @@ class YourDirectDebitInstructionsController @Inject() (

private def cleanseDirectDebitReference(userAnswers: UserAnswers): Future[UserAnswers] =
for {
userAnswersWithoutDirectDebitReference <- Future.fromTry(userAnswers.remove(DirectDebitReferenceQuery))
userAnswersPaymentReference <- Future.fromTry(userAnswersWithoutDirectDebitReference.remove(PaymentPlanReferenceQuery))
_ <- sessionRepository.set(userAnswersPaymentReference)
} yield userAnswersPaymentReference
updatedUserAnswers <- Future.fromTry(userAnswers.remove(DirectDebitReferenceQuery))
updatedUserAnswers <- Future.fromTry(updatedUserAnswers.remove(PaymentPlansCountQuery))
_ <- sessionRepository.set(updatedUserAnswers)
} yield updatedUserAnswers
}
44 changes: 0 additions & 44 deletions app/viewmodels/checkAnswers/AmendSuspendDateSummary.scala

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,18 @@
package viewmodels.checkAnswers

import controllers.routes
import models.{CheckMode, SuspensionPeriodRange, UserAnswers}
import models.{CheckMode, NormalMode, SuspensionPeriodRange, UserAnswers}
import pages.SuspensionPeriodRangeDatePage
import play.api.i18n.{Lang, Messages}
import uk.gov.hmrc.govukfrontend.views.viewmodels.summarylist.SummaryListRow
import utils.Constants
import utils.DateTimeFormats.formattedDateTimeShort
import viewmodels.govuk.summarylist.*
import viewmodels.implicits.*

import java.time.LocalDate
import java.time.format.DateTimeFormatter

object SuspensionPeriodRangeDateSummary {
def row(answers: UserAnswers, showChange: Boolean = false)(implicit messages: Messages): Option[SummaryListRow] =
answers.get(SuspensionPeriodRangeDatePage).map { answer =>
Expand All @@ -62,4 +66,29 @@ object SuspensionPeriodRangeDateSummary {
}
)
}

def row(suspendStartDate: Option[LocalDate], suspendEndDate: Option[LocalDate])(implicit messages: Messages): SummaryListRow = {
val formattedStartDate = suspendStartDate
.map(_.format(DateTimeFormatter.ofPattern(Constants.shortDateTimeFormatPattern)))
.getOrElse("")

val formattedEndDate = suspendEndDate
.map(_.format(DateTimeFormatter.ofPattern(Constants.shortDateTimeFormatPattern)))
.getOrElse("")

val formattedValue =
s"$formattedStartDate ${messages("suspensionPeriodRangeDate.to")} $formattedEndDate"

SummaryListRowViewModel(
key = "suspensionPeriodRangeDate.checkYourAnswersLabel",
value = ValueViewModel(formattedValue),
actions = Seq(
ActionItemViewModel("site.change", routes.SuspensionPeriodRangeDateController.onPageLoad(NormalMode).url)
.withVisuallyHiddenText(messages("suspensionPeriodRangeDate.change.hidden")),
ActionItemViewModel("site.remove", routes.JourneyRecoveryController.onPageLoad().url) // TODO Updated after RM1
.withVisuallyHiddenText(messages("suspensionPeriodRangeDate.change.hidden"))
)
)
}

}
18 changes: 11 additions & 7 deletions app/views/PaymentPlanDetailsView.scala.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*@

@import models.responses.*
@import java.time.LocalDate
@import java.time.format.DateTimeFormatter
@import views.html.components.*
@import utils.MaskAndFormatUtils.*
Expand All @@ -29,14 +30,17 @@
govukSummaryList: GovukSummaryList
)

@(planType: String, paymentReference: String, showActions: Boolean, rows: Seq[SummaryListRow])(implicit request: Request[_], messages: Messages)
@(planType: String, paymentReference: String, showAmendLink: Boolean, showCancelLink: Boolean, showSuspendLink: Boolean, isSuspensionActive: Boolean, suspensionStartDate: String, suspensionEndDate: String, rows: Seq[SummaryListRow])(implicit request: Request[_], messages: Messages)

@layout(pageTitle = titleForManageJourneyNoForm(messages("paymentPlanDetails.title")), backLink = Some(routes.DirectDebitSummaryController.onPageLoad().url)) {
@header1("paymentPlanDetails.heading")
@paragraph("paymentPlanDetails.p1")
@paragraph("paymentPlanDetails.p2")
<p class="govuk-inset-text">@messages("paymentPlanDetails.inset.text")</p>
@header2("paymentPlanDetails.heading")

@if(isSuspensionActive) {
<p class="govuk-inset-text">
@messages("paymentPlanDetails.inset.text", suspensionStartDate, suspensionEndDate)
</p>
}

@govukSummaryList(SummaryList(
card = Some(Card(
Expand All @@ -46,17 +50,17 @@
actions =
Some(Actions(
items = Seq(
if (showActions && (planType == PaymentPlanType.SinglePaymentPlan.toString || planType == PaymentPlanType.BudgetPaymentPlan.toString)) ActionItem(
if (showAmendLink) ActionItem(
href = routes.AmendPaymentAmountController.onPageLoad(NormalMode).url,
content = messages("paymentPlanDetails.details.amend"),
visuallyHiddenText = Some(messages("Amend"))
) else null,
if (showActions && planType != PaymentPlanType.TaxCreditRepaymentPlan.toString) ActionItem(
if (showCancelLink) ActionItem(
href = routes.CancelPaymentPlanController.onPageLoad().url,
content = messages("paymentPlanDetails.details.cancel"),
visuallyHiddenText = Some(messages("Cancel"))
) else null,
if (showActions && planType == PaymentPlanType.BudgetPaymentPlan.toString) ActionItem(
if (showSuspendLink) ActionItem(
href = routes.SuspendPaymentPlanController.onPageLoad().url,
content = messages("paymentPlanDetails.details.suspend"),
visuallyHiddenText = Some(messages("Suspend"))
Expand Down
5 changes: 2 additions & 3 deletions conf/messages.en
Original file line number Diff line number Diff line change
Expand Up @@ -404,9 +404,8 @@ directDebitPaymentSummary.addPaymentButton = Add payment plan

paymentPlanDetails.title = Your payment plan details
paymentPlanDetails.heading = Your payment plan details
paymentPlanDetails.p1 = You can amend the details of your payment plan, or cancel it if it is no longer required, by following either the ''Amend payment plan'' or ''Cancel payment plan'' links below.
paymentPlanDetails.p2 = If you wish to suspend your payment plan please follow the ''Suspend payment plan'' link below.
paymentPlanDetails.inset.text = Payments due within the next 3 working days will not be affected by any changes made.
paymentPlanDetails.p1 = If a payment is due within the next 3 working days, you will not be able to make any changes.
paymentPlanDetails.inset.text = This payment plan is suspended from {0} to {1}.
paymentPlanDetails.details.paymentReference = Payment reference: {0}
paymentPlanDetails.details.amend = Amend
paymentPlanDetails.details.cancel = Cancel
Expand Down
Loading