Skip to content
Open
Show file tree
Hide file tree
Changes from 2 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
14 changes: 9 additions & 5 deletions app/controllers/TaxCodeChangeController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@ package controllers
import controllers.auth.{AuthJourney, AuthedUser}
import play.api.mvc.{Action, AnyContent, MessagesControllerComponents}
import uk.gov.hmrc.domain.Nino
import uk.gov.hmrc.http.UpstreamErrorResponse
import uk.gov.hmrc.tai.config.ApplicationConfig
import uk.gov.hmrc.tai.model.TaxYear
import uk.gov.hmrc.tai.service._
import uk.gov.hmrc.tai.service.*
import uk.gov.hmrc.tai.service.yourTaxFreeAmount.{DescribedYourTaxFreeAmountService, TaxCodeChangeReasonsService}
import uk.gov.hmrc.tai.util.yourTaxFreeAmount.{IabdTaxCodeChangeReasons, YourTaxFreeAmount}
import uk.gov.hmrc.tai.viewModels.taxCodeChange.TaxCodeChangeViewModel
Expand Down Expand Up @@ -50,11 +51,9 @@ class TaxCodeChangeController @Inject() (
def taxCodeComparison: Action[AnyContent] = authenticate.authWithValidatePerson.async { implicit request =>
val nino: Nino = request.taiUser.nino

val yourTaxFreeAmountComparisonFuture = yourTaxFreeAmountService.taxFreeAmountComparison(nino)

for {
yourTaxFreeAmountComparison <- yourTaxFreeAmountComparisonFuture
val returnResult = for {
taxCodeChange <- taxCodeChangeService.taxCodeChange(nino).toFutureOrThrow
yourTaxFreeAmountComparison <- yourTaxFreeAmountService.taxFreeAmountComparison(nino, taxCodeChange)
scottishTaxRateBands <- taxAccountService.scottishBandRates(nino, TaxYear(), taxCodeChange.uniqueTaxCodes)
} yield {
val iabdTaxCodeChangeReasons: IabdTaxCodeChangeReasons = new IabdTaxCodeChangeReasons
Expand All @@ -75,6 +74,11 @@ class TaxCodeChangeController @Inject() (
implicit val user: AuthedUser = request.taiUser
Ok(taxCodeComparisonView(viewModel, appConfig))
}

returnResult.recover {
case e: UpstreamErrorResponse if e.statusCode == BAD_REQUEST || e.statusCode == INTERNAL_SERVER_ERROR =>
Redirect(controllers.routes.TaxAccountSummaryController.onPageLoad())
}
}

def yourTaxFreeAmount: Action[AnyContent] = authenticate.authWithValidatePerson.async { implicit request =>
Expand Down
29 changes: 19 additions & 10 deletions app/uk/gov/hmrc/tai/service/YourTaxFreeAmountService.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,13 @@

package uk.gov.hmrc.tai.service

import cats.implicits._
import cats.implicits.*
import play.api.i18n.Messages
import uk.gov.hmrc.domain.Nino
import uk.gov.hmrc.http.HeaderCarrier
import uk.gov.hmrc.tai.model.domain.TaxCodeChange
import uk.gov.hmrc.tai.util.EitherTExtensions.EitherTThrowableOps
import uk.gov.hmrc.tai.util.yourTaxFreeAmount._
import uk.gov.hmrc.tai.util.yourTaxFreeAmount.*

import javax.inject.Inject
import scala.concurrent.{ExecutionContext, Future}
Expand All @@ -42,12 +43,20 @@ class YourTaxFreeAmountService @Inject() (
messages: Messages,
executionContext: ExecutionContext
): Future[YourTaxFreeAmountComparison] =
(taxCodeChangeService.taxCodeChange(nino).toFutureOrThrow, codingComponentService.taxFreeAmountComparison(nino))
.mapN { case (taxCodeChange, taxFreeAmountComparison) =>
buildTaxFreeAmount(
taxCodeChange.mostRecentTaxCodeChangeDate,
Some(taxFreeAmountComparison.previous),
taxFreeAmountComparison.current
)
}
taxCodeChangeService.taxCodeChange(nino).toFutureOrThrow.flatMap { taxCodeChange =>
taxFreeAmountComparison(nino, taxCodeChange)
}

def taxFreeAmountComparison(nino: Nino, taxCodeChange: TaxCodeChange)(implicit
hc: HeaderCarrier,
messages: Messages,
executionContext: ExecutionContext
): Future[YourTaxFreeAmountComparison] =
codingComponentService.taxFreeAmountComparison(nino).map { taxFreeAmountComparison =>
buildTaxFreeAmount(
taxCodeChange.mostRecentTaxCodeChangeDate,
Some(taxFreeAmountComparison.previous),
taxFreeAmountComparison.current
)
}
}
3 changes: 1 addition & 2 deletions app/uk/gov/hmrc/tai/util/DateHelper.scala
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ object DateHelper {

implicit val dateTimeOrdering: Ordering[LocalDate] = Ordering.fromLessThan(_ isAfter _)

def mostRecentDate(dates: Seq[LocalDate]): LocalDate =
dates.min
def mostRecentDate(dates: Seq[LocalDate]): LocalDate = dates.minOption.getOrElse(LocalDate.now)

def monthOfYear(date: String): String = {
val monthRegex = "[A-Za-z]+".r
Expand Down
23 changes: 19 additions & 4 deletions test/controllers/TaxCodeChangeControllerSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,17 @@ import builders.RequestBuilder
import cats.data.EitherT
import cats.instances.future.*
import controllers.auth.AuthenticatedRequest
import org.mockito.ArgumentMatchers.{any, eq => meq}
import org.mockito.ArgumentMatchers.{any, eq as meq}
import org.mockito.Mockito.when
import play.api.mvc.AnyContentAsFormUrlEncoded
import play.api.test.FakeRequest
import play.api.test.Helpers.{status, _}
import play.api.test.Helpers.{status, *}
import uk.gov.hmrc.http.UpstreamErrorResponse
import uk.gov.hmrc.tai.model.TaxYear
import uk.gov.hmrc.tai.model.domain.income.OtherBasisOfOperation
import uk.gov.hmrc.tai.model.domain.tax.TotalTax
import uk.gov.hmrc.tai.model.domain.{TaxCodeChange, TaxCodeRecord}
import uk.gov.hmrc.tai.service._
import uk.gov.hmrc.tai.service.*
import uk.gov.hmrc.tai.service.yourTaxFreeAmount.{DescribedYourTaxFreeAmountService, TaxCodeChangeReasonsService}
import uk.gov.hmrc.tai.util.yourTaxFreeAmount.TaxFreeInfo
import uk.gov.hmrc.tai.viewModels.taxCodeChange.{TaxCodeChangeViewModel, YourTaxFreeAmountViewModel}
Expand Down Expand Up @@ -102,7 +103,7 @@ class TaxCodeChangeControllerSpec extends BaseSpec with ControllerViewTestHelper
when(taxAccountService.totalTax(meq(FakeAuthRetrievals.nino), any())(any()))
.thenReturn(Future.successful(TotalTax(0, Seq.empty, None, None, None)))
when(taxCodeChangeService.taxCodeChange(any())(any())).thenReturn(EitherT.rightT(taxCodeChange))
when(yourTaxFreeAmountService.taxFreeAmountComparison(any())(any(), any(), any()))
when(yourTaxFreeAmountService.taxFreeAmountComparison(any(), any())(any(), any(), any()))
.thenReturn(Future.successful(mock[YourTaxFreeAmountComparison]))

val reasons = Seq("a reason")
Expand All @@ -124,6 +125,20 @@ class TaxCodeChangeControllerSpec extends BaseSpec with ControllerViewTestHelper
status(result) mustBe OK
result rendersTheSameViewAs taxCodeComparisonView(expectedViewModel, appConfig)
}
"show the tax account summary screen when an upstream error occurs while retrieving tax code changes." in {
implicit val request: FakeRequest[AnyContentAsFormUrlEncoded] = RequestBuilder.buildFakeRequestWithAuth("GET")

val taxCodeChange = TaxCodeChange(List(taxCodeRecord1), List(taxCodeRecord2))

when(taxCodeChangeService.taxCodeChange(any())(any())).thenReturn(EitherT.rightT(taxCodeChange))
when(yourTaxFreeAmountService.taxFreeAmountComparison(any(), any())(any(), any(), any()))
.thenReturn(Future.failed(UpstreamErrorResponse("Error from upstream", INTERNAL_SERVER_ERROR)))

val result = createController().taxCodeComparison()(request)

status(result) mustBe SEE_OTHER
redirectLocation(result) mustBe Some(controllers.routes.TaxAccountSummaryController.onPageLoad().url)
}
}

val giftAmount = 1000
Expand Down