Repository: hmrc/income-tax-view-change-frontend
Pull request #2813: MISUV-9284 - Charges due in 30 days tab
Author: login: BAmiriDev
Created: 2025-03-20T15:04:00Z | Merged: 2025-03-25T13:39:42Z



Diff:
diff --git a/app/controllers/YourSelfAssessmentChargesController.scala b/app/controllers/YourSelfAssessmentChargesController.scala
index 1d73a87034..beb965b18d 100644
--- a/app/controllers/YourSelfAssessmentChargesController.scala
+++ b/app/controllers/YourSelfAssessmentChargesController.scala
@@ -27,7 +27,9 @@ import forms.utils.SessionKeys.gatewayPage
 import models.admin._
 import models.core.Nino
 import models.financialDetails.YourSelfAssessmentChargesViewModel
+import models.incomeSourceDetails.TaxYear
 import models.nextPayments.viewmodels.WYOClaimToAdjustViewModel
+import models.taxYearAmount.EarliestDueCharge
 import play.api.Logger
 import play.api.i18n.{I18nSupport, Messages}
 import play.api.mvc.{Action, AnyContent, MessagesControllerComponents, Result}
@@ -66,6 +68,10 @@ class YourSelfAssessmentChargesController @Inject()(val authActions: AuthActions
 
       val hasOverdueCharges: Boolean = whatYouOweChargesList.chargesList.exists(_.isOverdue()(dateService))
       val hasAccruingInterestReviewAndReconcileCharges: Boolean = whatYouOweChargesList.chargesList.exists(_.isNotPaidAndNotOverduePoaReconciliationDebit()(dateService))
+      val earliestTaxYearAndAmount: Option[EarliestDueCharge] =
+        whatYouOweChargesList.getEarliestTaxYearAndAmountByDueDate
+          .map { case (year, amount) => EarliestDueCharge(TaxYear.forYearEnd(year), amount) }
+
       val viewModel: YourSelfAssessmentChargesViewModel = YourSelfAssessmentChargesViewModel(
         hasOverdueOrAccruingInterestCharges = hasOverdueCharges || hasAccruingInterestReviewAndReconcileCharges,
         whatYouOweChargesList = whatYouOweChargesList, hasLpiWithDunningLock = whatYouOweChargesList.hasLpiWithDunningLock,
@@ -73,6 +79,7 @@ class YourSelfAssessmentChargesController @Inject()(val authActions: AuthActions
         dunningLock = whatYouOweChargesList.hasDunningLock,
         reviewAndReconcileEnabled = isEnabled(ReviewAndReconcilePoa),
         creditAndRefundEnabled = isEnabled(CreditsRefundsRepay),
+        earliestTaxYearAndAmountByDueDate = earliestTaxYearAndAmount,
         claimToAdjustViewModel = ctaViewModel
       )
       Ok(view(
@@ -99,6 +106,7 @@ class YourSelfAssessmentChargesController @Inject()(val authActions: AuthActions
     }
   }
 
+
   def show(origin: Option[String] = None): Action[AnyContent] = authActions.asMTDIndividual.async {
     implicit user =>
       handleRequest(
diff --git a/app/models/financialDetails/WhatYouOweChargesList.scala b/app/models/financialDetails/WhatYouOweChargesList.scala
index 0f710ba37c..900bf0e0fb 100644
--- a/app/models/financialDetails/WhatYouOweChargesList.scala
+++ b/app/models/financialDetails/WhatYouOweChargesList.scala
@@ -28,6 +28,8 @@ case class WhatYouOweChargesList(balanceDetails: BalanceDetails, chargesList: Li
 
   lazy val overdueChargeList: List[ChargeItem] = chargesList.filter(x => x.isOverdue())
 
+  lazy val chargesDueWithin30DaysList: List[ChargeItem] = chargesList.filter(x => !x.isOverdue() && !x.hasAccruingInterest &&  x.dueDate.exists(dateService.isWithin30Days))
+
   def overdueOutstandingCharges: List[OutstandingChargeModel] = outstandingChargesModel.toList.flatMap(_.outstandingCharges)
     .filter(_.relevantDueDate.getOrElse(LocalDate.MAX).isBefore(dateService.getCurrentDate))
 
diff --git a/app/models/financialDetails/YourSelfAssessmentChargesViewModel.scala b/app/models/financialDetails/YourSelfAssessmentChargesViewModel.scala
index 3d498b786c..c71f9c673f 100644
--- a/app/models/financialDetails/YourSelfAssessmentChargesViewModel.scala
+++ b/app/models/financialDetails/YourSelfAssessmentChargesViewModel.scala
@@ -18,6 +18,7 @@ package models.financialDetails
 
 import models.incomeSourceDetails.TaxYear
 import models.nextPayments.viewmodels.WYOClaimToAdjustViewModel
+import models.taxYearAmount.EarliestDueCharge
 import services.DateServiceInterface
 
 import java.time.LocalDate
@@ -29,6 +30,7 @@ case class YourSelfAssessmentChargesViewModel(hasOverdueOrAccruingInterestCharge
                                               dunningLock: Boolean,
                                               reviewAndReconcileEnabled: Boolean,
                                               creditAndRefundEnabled: Boolean,
+                                              earliestTaxYearAndAmountByDueDate: Option[EarliestDueCharge],
                                               claimToAdjustViewModel: WYOClaimToAdjustViewModel)(implicit val dateService: DateServiceInterface) {
   lazy val currentTaxYear: TaxYear = dateService.getCurrentTaxYear
 
diff --git a/app/models/taxYearAmount/EarliestDueCharge.scala b/app/models/taxYearAmount/EarliestDueCharge.scala
new file mode 100644
index 0000000000..68609209d3
--- /dev/null
+++ b/app/models/taxYearAmount/EarliestDueCharge.scala
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2024 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 models.taxYearAmount
+
+import models.incomeSourceDetails.TaxYear
+
+case class EarliestDueCharge(
+                                     taxYear: TaxYear,
+                                     amount: BigDecimal
+                                   )
diff --git a/app/views/YourSelfAssessmentCharges.scala.html b/app/views/YourSelfAssessmentCharges.scala.html
index dd80da5e3a..dfb8c21747 100644
--- a/app/views/YourSelfAssessmentCharges.scala.html
+++ b/app/views/YourSelfAssessmentCharges.scala.html
@@ -131,13 +131,17 @@
     }
     }
 
-    @tableHead(headId: String) = {
+    @tableHead(headId: String, showInterest: Boolean) = {
         <thead class="govuk-table__head" id="@headId">
             <tr class="govuk-table__row">
                 <th scope="col" class="govuk-table__header">@getMessage("tableHead.due-date")</th>
                 <th scope="col" class="govuk-table__header">@getMessage("tableHead.type-of-charge")</th>
-                <th scope="col" class="govuk-table__header">@getMessage("tableHead.tax-year")</th>
-                <th scope="col" class="govuk-table__header govuk-table__header--numeric">@getMessage("tableHead.estimated-interest")</th>
+                <th scope="col" class="govuk-table__header govuk-table__header--numeric">@getMessage("tableHead.tax-year")</th>
+                @if(showInterest) {
+                <th scope="col" class="govuk-table__header govuk-table__header--numeric">
+                    @getMessage("tableHead.estimated-interest")
+                </th>
+                }
                 <th scope="col" class="govuk-table__header govuk-table__header--numeric">@getMessage("tableHead.amount").toNonBreaking</th>
             </tr>
         </thead>
@@ -235,6 +239,25 @@
         </tr>
     }
 
+@tableRowWithoutInterest(rowId: String, chargeItem: ChargeItem, index: Int, id: String) = {
+<tr class="govuk-table__row" id="@rowId">
+    <td class="govuk-table__cell">
+        @getDisplayDueDate(chargeItem).toLongDate.toNonBreaking
+    </td>
+    <td class="govuk-table__cell">
+        @getPaymentTypeEntry(chargeItem = chargeItem, isOverduePayment = false,
+        rowId = rowId, index = index)
+    </td>
+    <td class="govuk-table__cell govuk-table__cell--numeric">
+        @taxYearSummaryLink(chargeItem.taxYear.endYear, index, id)
+    </td>
+    <td class="govuk-table__cell govuk-table__cell--numeric">
+        @chargeItem.remainingToPay.toCurrency
+    </td>
+</tr>
+}
+
+
 
     @getNoPaymentsDueText = @{
         if(user.isAgent()) messages("whatYouOwe.no-payments-due-agent") else messages("whatYouOwe.no-payments-due")
@@ -285,8 +308,19 @@
                 target = Some("_blank"),
                 outerMessage = ".")
         </p>
-    }
 
+    @if(viewModel.claimToAdjustViewModel.adjustPaymentsOnAccountFSEnabled) {
+        @viewModel.claimToAdjustViewModel.claimToAdjustTaxYear.orElse(Some(viewModel.currentTaxYear)).map { taxYear =>
+            <p class="govuk-body" id="adjust-payments-on-account">
+                @link(
+                    link = controllers.claimToAdjustPoa.routes.AmendablePoaController.show(user.isAgent()).url,
+                    messageKey = getMessage("adjust-poa", taxYear.startYear.toString, taxYear.endYear.toString),
+                    id = Some("adjust-poa-link")
+                    )
+            </p>
+            }
+        }
+    }
 
     @mainTemplate(
         pageTitle = getMessage("heading"),
@@ -334,9 +368,22 @@ <h3 class="govuk-notification-banner__heading">
                                         </p>
                                     </div>
                                 </div>
+                            } else {
+                        <h2 class="govuk-heading-m">@getMessage("no-charges-due")</h2>
+                        <p class="govuk-body">
+                            @getMessage("adjust-poa.paid-1")
+                            @viewModel.whatYouOweChargesList.getEarliestTaxYearAndAmountByDueDate.fold(Html("")) { case (_, amount) =>
+                            @link(
+                            link = controllers.routes.PaymentController.paymentHandoff(amount.toPence, origin).url,
+                            messageKey = getMessage("pay-upcoming-charges"),
+                            id = Some("pay-upcoming-charges-link")
+                            )
                             }
+                        </p>
+                        <br>
+                        }
 
-                            <div class="govuk-tabs" data-module="govuk-tabs" id="self-assessment-charges-tabs">
+                        <div class="govuk-tabs" data-module="govuk-tabs" id="self-assessment-charges-tabs">
                                 <h2 class="govuk-tabs__title">
                                     Contents
                                 </h2>
@@ -348,16 +395,66 @@ <h2 class="govuk-tabs__title">
                                             </a>
                                         </li>
                                     }
+                                    @if(viewModel.whatYouOweChargesList.chargesDueWithin30DaysList.nonEmpty) {
+                                    <li class="govuk-tabs__list-item">
+                                        <a class="govuk-tabs__tab" href="#charges-due-in-30-days">
+                                            @getMessage("charges-due-in-30-days")
+                                        </a>
+                                    </li>
+                                    }
                                     <li class="govuk-tabs__list-item govuk-tabs__list-item--selected">
                                         <a class="govuk-tabs__tab" href="#placeholder">
                                             Placeholder
                                         </a>
                                     </li>
                                 </ul>
+
+                                @if(viewModel.whatYouOweChargesList.chargesDueWithin30DaysList.nonEmpty) {
+                                <div class="govuk-tabs__panel" id="charges-due-in-30-days">
+                                    <table class="govuk-table">
+                                        @tableHead("due-in-30-days-payments-table-head", false)
+                                        <tbody class="govuk-table__body">
+                                        @for((charge, index) <- ChargeItem.chargesDueWithin30DaysList(viewModel.whatYouOweChargesList).zipWithIndex) {
+                                        @tableRowWithoutInterest(s"due-30-days-$index", charge, index, "taxYearSummary-link")
+                                        }
+                                        <tr class="govuk-table__header">
+                                            <td class="govuk-table__header" colspan="2">
+                                                @getMessage("table.total-amount", viewModel.whatYouOweChargesList.balanceDetails.balanceDueWithin30Days.toCurrencyString)
+                                            </td>
+                                        </tr>
+                                        </tbody>
+                                    </table>
+
+                                    <div class="govuk-inset-text">
+                                        <div>
+                                            @getMessage("overdue-inset-text-1")
+                                        </div>
+                                        <br>
+                                        <div>
+                                            @getMessage("overdue-inset-text-2")
+                                        </div>
+                                    </div>
+
+                                    @if(user.saUtr.isDefined && !user.isAgent()) {
+                                        @viewModel.earliestTaxYearAndAmountByDueDate.map { taxYearWithAmount =>
+                                            <div id="payment-button">
+                                                @link(
+                                                    controllers.routes.PaymentController.paymentHandoff(taxYearWithAmount.amount.toPence, origin).url,
+                                                    messageKey = getPrefix("payNow"),
+                                                    classes = "govuk-button",
+                                                    role = Some("button"),
+                                                    id = Some("payment-button-link")
+                                                    )
+                                            </div>
+                                        }
+                                    }
+                                </div>
+                                }
+
                                 @if(ChargeItem.overdueOrAccruingInterestChargeList(viewModel.whatYouOweChargesList).nonEmpty || viewModel.whatYouOweChargesList.overdueOutstandingCharges.nonEmpty) {
                                     <div class="govuk-tabs__panel" id="charges-due-now">
                                         <table class="govuk-table" id="charges-due-now-table">
-                                            @tableHead("over-due-payments-table-head")
+                                            @tableHead("over-due-payments-table-head", true)
                                             <caption class="govuk-table__caption govuk-visually-hidden">@getMessage("charges-due-now")</caption>
                                             <tbody class="govuk-table__body">
                                                 @if(viewModel.whatYouOweChargesList.bcdChargeTypeDefinedAndGreaterThanZero) {
@@ -404,12 +501,18 @@ <h2 class="govuk-tabs__title">
                                             </div>
                                         </div>
 
-                                        @if(user.saUtr.isDefined && !user.isAgent() && viewModel.whatYouOweChargesList.getEarliestTaxYearAndAmountByDueDate.isDefined) {
-                                            <div id="payment-button">
-                                            @link(link = controllers.routes.PaymentController.paymentHandoff(viewModel.whatYouOweChargesList.getEarliestTaxYearAndAmountByDueDate.get._2.toPence, origin).url,
-                                                messageKey = getPrefix("payNow"), classes = "govuk-button", role = Some("button"),
-                                                id = Some("payment-button-link"))
-                                            </div>
+                                        @if(user.saUtr.isDefined && !user.isAgent()) {
+                                            @viewModel.earliestTaxYearAndAmountByDueDate.map { taxYearWithAmount =>
+                                                <div id="payment-button">
+                                                    @link(
+                                                        controllers.routes.PaymentController.paymentHandoff(taxYearWithAmount.amount.toPence, origin).url,
+                                                        messageKey = getPrefix("payNow"),
+                                                        classes = "govuk-button",
+                                                        role = Some("button"),
+                                                        id = Some("payment-button-link")
+                                                        )
+                                                </div>
+                                            }
                                         }
                                     </div>
                                 }
diff --git a/conf/messages b/conf/messages
index 2ce50db453..c40a6a04dd 100644
--- a/conf/messages
+++ b/conf/messages
@@ -899,6 +899,7 @@ selfAssessmentCharges.important                                    = Important
 selfAssessmentCharges.important-p1                                 = This is the total amount of overdue tax you need to pay. Any interest will increase daily until the overdue amount is paid.
 selfAssessmentCharges.important-p2                                 = You can
 selfAssessmentCharges.important-p2-link-text                       = pay the total amount needed now.
+selfAssessmentCharges.charges-due-in-30-days                       = Charges due in 30 days
 selfAssessmentCharges.charges-due-now-with-amount                  = Charges due now: {0}
 selfAssessmentCharges.no-payments-due                              = You have no payments due.
 selfAssessmentCharges.no-payments-due-agent                        = Your client has no payments due.
@@ -908,6 +909,8 @@ selfAssessmentCharges.tableHead.tax-year                           = Tax year
 selfAssessmentCharges.tableHead.type-of-charge                     = Type of charge
 selfAssessmentCharges.tableHead.estimated-interest                 = Estimated interest
 selfAssessmentCharges.tableHead.amount                             = Amount
+selfAssessmentCharges.no-charges-due                               = No charges due today
+selfAssessmentCharges.pay-upcoming-charges                         = pay your upcoming Self Assessment charges before the due date.
 selfAssessmentCharges.tax-year-summary.taxYear                                = {0} to {1}
 selfAssessmentCharges.paymentOnAccount1.text							      = First payment on account
 selfAssessmentCharges.paymentOnAccount2.text							      = Second payment on account
@@ -957,9 +960,9 @@ selfAssessmentCharges.moneyOnAccount-2                                        =
 selfAssessmentCharges.moneyOnAccount-3                                        = claim a refund
 selfAssessmentCharges.moneyOnAccount-agent                                    = Money in your client’s account
 selfAssessmentCharges.moneyOnAccount-agent-2                                  = in your client’s account. You can leave the money there to pay their next bill or
-selfAssessmentCharges.adjust-poa                                              = Adjust payments on account for the {0} to {1} tax year
+selfAssessmentCharges.adjust-poa                                              = Adjust your payments on account for the {0} to {1} tax year
 selfAssessmentCharges.adjust-poa.paid-1                                       = You can
-selfAssessmentCharges.adjust-poa.paid-2                                       = adjust your payments on account for the {0} to {1} tax year
+selfAssessmentCharges.adjust-poa.paid-2                                       = Adjust your payments on account for the {0} to {1} tax year
 selfAssessmentCharges.adjust-poa.paid-3                                       = at any point before submitting your tax return for {0} to {1}, and no later than
 selfAssessmentCharges.adjust-poa.paid-4                                       = 31 January {0}.
 selfAssessmentCharges.adjust-poa.paid-5                                       =
diff --git a/conf/messages.cy b/conf/messages.cy
index 2165bb01fd..7d14f4e034 100644
--- a/conf/messages.cy
+++ b/conf/messages.cy
@@ -899,6 +899,7 @@ selfAssessmentCharges.important                                    = Important
 selfAssessmentCharges.important-p1                                 = This is the total amount of overdue tax you need to pay. Any interest will increase daily until the overdue amount is paid.
 selfAssessmentCharges.important-p2                                 = You can
 selfAssessmentCharges.important-p2-link-text                       = pay the total amount needed now.
+selfAssessmentCharges.charges-due-in-30-days                       = Charges due in 30 days
 selfAssessmentCharges.charges-due-now-with-amount                  = Charges due now: {0}
 selfAssessmentCharges.no-payments-due                              = Nid oes gennych taliadau sy’n ddyledus.
 selfAssessmentCharges.no-payments-due-agent                        = Nid oes gan eich cleient daliadau sy’n ddyledus.
@@ -908,6 +909,8 @@ selfAssessmentCharges.tableHead.tax-year                           = Blwyddyn dr
 selfAssessmentCharges.tableHead.type-of-charge                     = Type of charge
 selfAssessmentCharges.tableHead.estimated-interest                 = Estimated interest
 selfAssessmentCharges.tableHead.amount                             = Amount
+selfAssessmentCharges.no-charges-due                               = No charges due today
+selfAssessmentCharges.pay-upcoming-charges                         = pay your upcoming Self Assessment charges before the due date.
 selfAssessmentCharges.tax-year-summary.taxYear                                = {0} i {1}
 selfAssessmentCharges.paymentOnAccount1.text							      = Taliad cyntaf ar gyfrif
 selfAssessmentCharges.paymentOnAccount2.text							      = Ail daliad ar gyfrif
diff --git a/test/controllers/YourSelfAssessmentChargesControllerSpec.scala b/test/controllers/YourSelfAssessmentChargesControllerSpec.scala
index d94d4c3170..772530bec5 100644
--- a/test/controllers/YourSelfAssessmentChargesControllerSpec.scala
+++ b/test/controllers/YourSelfAssessmentChargesControllerSpec.scala
@@ -235,7 +235,7 @@ class YourSelfAssessmentChargesControllerSpec extends MockAuthActions
                   .thenReturn(Future.successful(whatYouOweChargesListFull))
 
                 val result = action(fakeRequest)
-                contentAsString(result).contains("Adjust payments on account for the 2017 to 2018 tax year") shouldBe true
+                contentAsString(result).contains("Adjust your payments on account for the 2017 to 2018 tax year") shouldBe true
               }
               "the AdjustPaymentsOnAccount FS is enabled and there are no adjustable POAs" in {
                 enable(AdjustPaymentsOnAccount)
diff --git a/test/testConstants/ChargeConstants.scala b/test/testConstants/ChargeConstants.scala
index ef68e37960..ffd5835352 100644
--- a/test/testConstants/ChargeConstants.scala
+++ b/test/testConstants/ChargeConstants.scala
@@ -497,7 +497,7 @@ trait ChargeConstants {
   )
 
   def whatYouOweDataWithDataDueIn30Days(dunningLocks: List[Option[String]] = noDunningLocks)(implicit dateService: DateService): WhatYouOweChargesList = WhatYouOweChargesList(
-    balanceDetails = BalanceDetails(1.00, 0.00, 1.00, None, None, None, None, None),
+    balanceDetails = BalanceDetails(50.00, 0.00, 50.00, None, None, None, None, None),
     chargesList = financialDetailsDueIn30DaysCi(dunningLocks),
     outstandingChargesModel = Some(outstandingChargesDueIn30Days)
   )
diff --git a/test/testConstants/FinancialDetailsTestConstants.scala b/test/testConstants/FinancialDetailsTestConstants.scala
index 4ca7035758..cd8d4a42fe 100644
--- a/test/testConstants/FinancialDetailsTestConstants.scala
+++ b/test/testConstants/FinancialDetailsTestConstants.scala
@@ -1203,7 +1203,7 @@ object FinancialDetailsTestConstants {
   def financialDetailsDueIn30Days(dunningLocks: List[Option[String]] = noDunningLocks): FinancialDetailsModel = testFinancialDetailsModel(
     dueDate = dueDateDueIn30Days,
     dunningLock = dunningLocks,
-    balanceDetails = BalanceDetails(1.00, 0.00, 1.00, None, None, None, None, None)
+    balanceDetails = BalanceDetails(50.00, 0.00, 50.00, None, None, None, None, None)
   )
 
   def financialDetailsOverdueData(dunningLocks: List[Option[String]] = noDunningLocks): FinancialDetailsModel = testFinancialDetailsModel(
diff --git a/test/views/YourSelfAssessmentChargesViewSpec.scala b/test/views/YourSelfAssessmentChargesViewSpec.scala
index bf106e3de1..dec87b2d3e 100644
--- a/test/views/YourSelfAssessmentChargesViewSpec.scala
+++ b/test/views/YourSelfAssessmentChargesViewSpec.scala
@@ -25,6 +25,7 @@ import models.financialDetails.{BalanceDetails, DocumentDetail, WhatYouOweCharge
 import models.incomeSourceDetails.{IncomeSourceDetailsModel, TaxYear}
 import models.nextPayments.viewmodels.WYOClaimToAdjustViewModel
 import models.outstandingCharges.OutstandingChargesModel
+import models.taxYearAmount.EarliestDueCharge
 import org.jsoup.Jsoup
 import org.jsoup.nodes.{Document, Element}
 import play.api.test.FakeRequest
@@ -145,6 +146,7 @@ class YourSelfAssessmentChargesViewSpec extends TestSupport with FeatureSwitchin
       dunningLock = dunningLock,
       reviewAndReconcileEnabled = reviewAndReconcileEnabled,
       creditAndRefundEnabled = true,
+      earliestTaxYearAndAmountByDueDate = Some(EarliestDueCharge(TaxYear(2024, 2025), BigDecimal(100.00))),
       claimToAdjustViewModel = claimToAdjustViewModel.getOrElse(defaultClaimToAdjustViewModel)
     )
 
@@ -191,6 +193,7 @@ class YourSelfAssessmentChargesViewSpec extends TestSupport with FeatureSwitchin
       dunningLock = dunningLock,
       reviewAndReconcileEnabled = reviewAndReconcileEnabled,
       creditAndRefundEnabled = true,
+      earliestTaxYearAndAmountByDueDate = Some(EarliestDueCharge(TaxYear(2024, 2025), BigDecimal(100.00))),
       claimToAdjustViewModel = claimToAdjustViewModel.getOrElse(defaultClaimToAdjustViewModel))
     val html: HtmlFormat.Appendable = yourSelfAssessmentChargesView(
       viewModel
@@ -684,6 +687,7 @@ class YourSelfAssessmentChargesViewSpec extends TestSupport with FeatureSwitchin
 //
 //    }
 
+
     "AdjustPaymentsOnAccount is enabled" when {
 
       "user has a POA that can be adjusted" when {
@@ -759,15 +763,15 @@ class YourSelfAssessmentChargesViewSpec extends TestSupport with FeatureSwitchin
   "agent" when {
     "The What you owe view with financial details model" when {
 
-//      s"have the title '${ //TODO: Also deals with future charges, re-implement after charges due in 30 days tab is done
-//        messages("htmlTitle.agent", messages("selfAssessmentCharges.heading"))
-//      }'" in new AgentTestSetup(charges = whatYouOweDataWithDataDueIn30Days()(dateService)) {
-//        pageDocument.title() shouldBe messages("htmlTitle.agent", messages("selfAssessmentCharges.heading"))
-//        pageDocument.getElementById("due-0-link").attr("href") shouldBe controllers.routes.ChargeSummaryController.showAgent(fixedDate.getYear, "1040000124").url
-//        pageDocument.getElementById("taxYearSummary-link-0").attr("href") shouldBe controllers.routes.TaxYearSummaryController.renderAgentTaxYearSummaryPage(fixedDate.getYear).url
-//      }
+      s"have the title '${ //TODO: Also deals with future charges, re-implement after charges due in 30 days tab is done
+        messages("htmlTitle.agent", messages("selfAssessmentCharges.heading"))
+      }'" in new AgentTestSetup(charges = whatYouOweDataWithDataDueIn30Days()(dateService)) {
+      pageDocument.title() shouldBe messages("htmlTitle.agent", messages("selfAssessmentCharges.heading"))
+      pageDocument.getElementById("due-30-days-0-link").attr("href") shouldBe controllers.routes.ChargeSummaryController.showAgent(fixedDate.getYear, "1040000124").url
+      pageDocument.getElementById("taxYearSummary-link-0").attr("href") shouldBe controllers.routes.TaxYearSummaryController.renderAgentTaxYearSummaryPage(fixedDate.getYear).url
+    }
 
-      "not have button Pay now with no chagres" in new AgentTestSetup(charges = noChargesModel) {
+    "not have button Pay now with no chagres" in new AgentTestSetup(charges = noChargesModel) {
         findAgentElementById("payment-button") shouldBe None
       }
       "not have button Pay now with charges" in new AgentTestSetup(charges = whatYouOweDataWithDataDueIn30Days()) {
@@ -854,5 +858,84 @@ class YourSelfAssessmentChargesViewSpec extends TestSupport with FeatureSwitchin
       }
     }
   }
+  "charges are due in 30 days" should {
+
+    "display the charges due within 30 days section" when {
+      "there are charges due within 30 days" in new TestSetup(charges = whatYouOweDataWithDataDueIn30Days()) {
+        val tableHead = pageDocument.getElementById("due-in-30-days-payments-table-head")
+        tableHead should not be null
+        tableHead.select("th").get(0).text() shouldBe dueDate
+        tableHead.select("th").get(1).text() shouldBe chargeType
+        tableHead.select("th").get(2).text() shouldBe taxYear
+        tableHead.select("th").get(3).text() shouldBe amountDue
+
+        val chargeRow = pageDocument.getElementById("due-30-days-0")
+        chargeRow should not be null
+        chargeRow.select("td").get(0).text() should include("5 December 2023")
+        chargeRow.select("td").get(1).text() should include(poa1Text)
+        chargeRow.select("td").get(2).text() should include("Tax year")
+        chargeRow.select("td").get(3).text() shouldBe "£50.00"
+
+        val totalRow = pageDocument.select("#charges-due-in-30-days .govuk-table__header").last()
+        totalRow.text() should include("£50.00")
+      }
+
+      "display the payment button and content in the section" in new TestSetup(charges = whatYouOweDataWithDataDueIn30Days()) {
+        val button = pageDocument.getElementById("payment-button")
+        button.text() shouldBe payNow
+        val buttonLink = pageDocument.getElementById("payment-button-link")
+        buttonLink.attr("href") should include("/report-quarterly/income-and-expenses/view/payment")
+
+        val insetText = pageDocument.select(".govuk-inset-text").text()
+        insetText should include(messages("selfAssessmentCharges.overdue-inset-text-1"))
+        insetText should include(messages("selfAssessmentCharges.overdue-inset-text-2"))
+      }
+
+      "display the payment plan content and link in the section" in new TestSetup(charges = whatYouOweDataWithDataDueIn30Days()) {
+        val paymentPlan = pageDocument.getElementById("payment-plan")
+        paymentPlan.text() shouldBe paymentPlanText
+        paymentPlan.select("a").attr("href") shouldBe "https://www.gov.uk/difficulties-paying-hmrc"
+      }
 
+      "adjust payments on account link is present with correct href" when {
+        "the FS is enabled and viewModel has a tax year" in new TestSetup(
+          charges = whatYouOweDataWithDataDueIn30Days(),
+          adjustPaymentsOnAccountFSEnabled = true,
+          claimToAdjustViewModel = Some(ctaViewModel(true))
+        ) {
+          val adjustLink = pageDocument.getElementById("adjust-poa-link")
+          adjustLink.text shouldBe "Adjust your payments on account for the 2024 to 2025 tax year"
+          adjustLink.attr("href") shouldBe claimToAdjustLink(false)
+        }
+      }
+
+      "no charges due today heading is shown" when {
+        "there are charges only due in 30 days" in new TestSetup(charges = whatYouOweDataWithDataDueIn30Days()) {
+          val headings = pageDocument.select("h2").eachText()
+          headings should contain(messages("selfAssessmentCharges.no-charges-due"))
+        }
+      }
+    }
+
+    "not display the charges due within 30 days section" when {
+      "there are no charges due within 30 days" in new TestSetup(charges = noChargesModel) {
+        findElementById("charges-due-within-30-days") shouldBe None
+      }
+    }
+    "display the correct type of charge in 30-day section" in new TestSetup(charges = whatYouOweDataWithDataDueIn30Days()) {
+      val charge = pageDocument.select("#charges-due-in-30-days tbody tr").get(0).select("td").get(1).text()
+
+        charge.startsWith(poa1Text) ||
+        charge.startsWith(poa2Text) ||
+        charge.startsWith(remainingBalance) shouldBe true
+    }
+    "show the 'Pay upcoming charges' link when only charges due in 30 days exist" in new TestSetup(
+      charges = whatYouOweDataWithDataDueIn30Days()
+    ) {
+      val link = pageDocument.getElementById("pay-upcoming-charges-link")
+      link should not be null
+      link.text() shouldBe messages("selfAssessmentCharges.pay-upcoming-charges")
+      link.attr("href") shouldBe controllers.routes.PaymentController.paymentHandoff(5000).url
+    }
+  }
 }


Reviews:
user: login: avelx
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-21T10:26:45Z
user: login: avelx
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-21T10:27:46Z
user: login: avelx
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-21T10:32:00Z
user: login: avelx
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-21T10:36:12Z
user: login: avelx
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-21T10:41:03Z
user: login: avelx
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-21T10:42:37Z
user: login: BAmiriDev
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-21T14:43:39Z
user: login: avelx
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-21T14:46:40Z
user: login: BAmiriDev
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-21T14:47:10Z
user: login: avelx
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-21T16:46:44Z
user: login: avelx
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-21T16:48:54Z
user: login: avelx
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T10:16:04Z
user: login: avelx
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T10:17:12Z
user: login: avelx
body: approved with comments
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T10:25:47Z
user: login: avelx
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T11:40:54Z

Review comments:
diff_hunk: @@ -66,8 +66,10 @@ class YourSelfAssessmentChargesController @Inject()(val authActions: AuthActions
 
       val hasOverdueCharges: Boolean = whatYouOweChargesList.chargesList.exists(_.isOverdue()(dateService))
       val hasAccruingInterestReviewAndReconcileCharges: Boolean = whatYouOweChargesList.chargesList.exists(_.isNotPaidAndNotOverduePoaReconciliationDebit()(dateService))
+      val hasChargesDueWithin30Days: Boolean = whatYouOweChargesList.chargesDueWithin30DaysList.nonEmpty
path: app/controllers/YourSelfAssessmentChargesController.scala
user: login: avelx
body: should be fine to move this one on the level of WhatYouOweChargeList type, but really up to you if you keen to make this more concise 
created_at: 2025-03-21T10:26:44Z
author_association: CONTRIBUTOR
diff_hunk: @@ -23,6 +23,7 @@ import services.DateServiceInterface
 import java.time.LocalDate
 
 case class YourSelfAssessmentChargesViewModel(hasOverdueOrAccruingInterestCharges: Boolean,
+                                              hasChargesDueWithin30Days: Boolean,
path: app/models/financialDetails/YourSelfAssessmentChargesViewModel.scala
user: login: avelx
body: this can be resolved by what we have in  `whatYouOweChargesList: WhatYouOweChargesList ` ?
created_at: 2025-03-21T10:27:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -348,16 +393,60 @@ <h2 class="govuk-tabs__title">
                                             </a>
                                         </li>
                                     }
+                                    @if(viewModel.whatYouOweChargesList.chargesDueWithin30DaysList.nonEmpty) {
+                                    <li class="govuk-tabs__list-item">
+                                        <a class="govuk-tabs__tab" href="#charges-due-in-30-days">
+                                            @getMessage("charges-due-in-30-days")
+                                        </a>
+                                    </li>
+                                    }
                                     <li class="govuk-tabs__list-item govuk-tabs__list-item--selected">
                                         <a class="govuk-tabs__tab" href="#placeholder">
                                             Placeholder
                                         </a>
                                     </li>
                                 </ul>
+
+                                @if(viewModel.whatYouOweChargesList.chargesDueWithin30DaysList.nonEmpty) {
+                                <div class="govuk-tabs__panel" id="charges-due-in-30-days">
+                                    <table class="govuk-table">
+                                        @tableHead("due-in-30-days-payments-table-head", false)
+                                        <tbody class="govuk-table__body">
+                                        @for((charge, index) <- ChargeItem.chargesDueWithin30DaysList(viewModel.whatYouOweChargesList).zipWithIndex) {
+                                        @tableRowWithoutInterest(s"due-30-days-$index", charge, index, "taxYearSummary-link")
+                                        }
+                                        <tr class="govuk-table__header">
+                                            <td class="govuk-table__header" colspan="2">
+                                                @getMessage("table.total-amount", viewModel.whatYouOweChargesList.balanceDetails.balanceDueWithin30Days.toCurrencyString)
+                                            </td>
+                                        </tr>
+                                        </tbody>
+                                    </table>
+
+                                    <div class="govuk-inset-text">
+                                        <div>
+                                            @getMessage("overdue-inset-text-1")
+                                        </div>
+                                        <br>
+                                        <div>
+                                            @getMessage("overdue-inset-text-2")
+                                        </div>
+                                    </div>
+
+                                    @if(user.saUtr.isDefined && !user.isAgent() && viewModel.whatYouOweChargesList.getEarliestTaxYearAndAmountByDueDate.isDefined) {
+                                    <div id="payment-button">
+                                        @link(link = controllers.routes.PaymentController.paymentHandoff(viewModel.whatYouOweChargesList.getEarliestTaxYearAndAmountByDueDate.get._2.toPence, origin).url,
+                                        messageKey = getPrefix("payNow"), classes = "govuk-button", role = Some("button"),
+                                        id = Some("payment-button-link"))
+                                    </div>
+                                    }
+                                </div>
+                                }
+
                                 @if(ChargeItem.overdueOrAccruingInterestChargeList(viewModel.whatYouOweChargesList).nonEmpty || viewModel.whatYouOweChargesList.overdueOutstandingCharges.nonEmpty) {
                                     <div class="govuk-tabs__panel" id="charges-due-now">
                                         <table class="govuk-table" id="charges-due-now-table">
-                                            @tableHead("over-due-payments-table-head")
+                                            @tableHead("over-due-payments-table-head", true)
path: app/views/YourSelfAssessmentCharges.scala.html
user: login: avelx
body: in case of `showInterest` flag is always true, maybe we can drop it all as its not required? I don't see any case were its set externally 
created_at: 2025-03-21T10:31:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -285,8 +308,17 @@
                 target = Some("_blank"),
                 outerMessage = ".")
         </p>
-    }
 
+    @if(viewModel.claimToAdjustViewModel.adjustPaymentsOnAccountFSEnabled) {
+        <p class="govuk-body" id="adjust-payments-on-account">
+            @link(
+                link = controllers.claimToAdjustPoa.routes.AmendablePoaController.show(user.isAgent()).url,
+                messageKey = getMessage("adjust-poa", "2024", "2025"),
path: app/views/YourSelfAssessmentCharges.scala.html
user: login: avelx
body: not sure if this is a good idea for message to be resolved by specific tax years / calendar years
created_at: 2025-03-21T10:36:12Z
author_association: CONTRIBUTOR
diff_hunk: @@ -348,16 +393,60 @@ <h2 class="govuk-tabs__title">
                                             </a>
                                         </li>
                                     }
+                                    @if(viewModel.whatYouOweChargesList.chargesDueWithin30DaysList.nonEmpty) {
+                                    <li class="govuk-tabs__list-item">
+                                        <a class="govuk-tabs__tab" href="#charges-due-in-30-days">
+                                            @getMessage("charges-due-in-30-days")
+                                        </a>
+                                    </li>
+                                    }
                                     <li class="govuk-tabs__list-item govuk-tabs__list-item--selected">
                                         <a class="govuk-tabs__tab" href="#placeholder">
                                             Placeholder
                                         </a>
                                     </li>
                                 </ul>
+
+                                @if(viewModel.whatYouOweChargesList.chargesDueWithin30DaysList.nonEmpty) {
+                                <div class="govuk-tabs__panel" id="charges-due-in-30-days">
+                                    <table class="govuk-table">
+                                        @tableHead("due-in-30-days-payments-table-head", false)
+                                        <tbody class="govuk-table__body">
+                                        @for((charge, index) <- ChargeItem.chargesDueWithin30DaysList(viewModel.whatYouOweChargesList).zipWithIndex) {
+                                        @tableRowWithoutInterest(s"due-30-days-$index", charge, index, "taxYearSummary-link")
+                                        }
+                                        <tr class="govuk-table__header">
+                                            <td class="govuk-table__header" colspan="2">
+                                                @getMessage("table.total-amount", viewModel.whatYouOweChargesList.balanceDetails.balanceDueWithin30Days.toCurrencyString)
+                                            </td>
+                                        </tr>
+                                        </tbody>
+                                    </table>
+
+                                    <div class="govuk-inset-text">
+                                        <div>
+                                            @getMessage("overdue-inset-text-1")
+                                        </div>
+                                        <br>
+                                        <div>
+                                            @getMessage("overdue-inset-text-2")
+                                        </div>
+                                    </div>
+
+                                    @if(user.saUtr.isDefined && !user.isAgent() && viewModel.whatYouOweChargesList.getEarliestTaxYearAndAmountByDueDate.isDefined) {
+                                    <div id="payment-button">
+                                        @link(link = controllers.routes.PaymentController.paymentHandoff(viewModel.whatYouOweChargesList.getEarliestTaxYearAndAmountByDueDate.get._2.toPence, origin).url,
path: app/views/YourSelfAssessmentCharges.scala.html
user: login: avelx
body: Please avoid use of .get and/o .head in the views when resolving data provided by viewModel;
I would suggest to add next property to the viewModel and throw and error on the viewModel construction phase:
`val earliestTaxYearAndAmountByDueDate : (Int, BigDecimal) `

+ _might worth to use TaxYear type instead of the Int?_
created_at: 2025-03-21T10:41:03Z
author_association: CONTRIBUTOR
diff_hunk: @@ -899,6 +899,7 @@ selfAssessmentCharges.important                                    = Important
 selfAssessmentCharges.important-p1                                 = This is the total amount of overdue tax you need to pay. Any interest will increase daily until the overdue amount is paid.
 selfAssessmentCharges.important-p2                                 = You can
 selfAssessmentCharges.important-p2-link-text                       = pay the total amount needed now.
+selfAssessmentCharges.charges-due-in-30-days                       = Charges due in 30 days
path: conf/messages.cy
user: login: avelx
body: looks like we missed Welsh at some point, as this is an Welsh lang resource file; Or we are still awaiting for Welsh team reply??
created_at: 2025-03-21T10:42:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -899,6 +899,7 @@ selfAssessmentCharges.important                                    = Important
 selfAssessmentCharges.important-p1                                 = This is the total amount of overdue tax you need to pay. Any interest will increase daily until the overdue amount is paid.
 selfAssessmentCharges.important-p2                                 = You can
 selfAssessmentCharges.important-p2-link-text                       = pay the total amount needed now.
+selfAssessmentCharges.charges-due-in-30-days                       = Charges due in 30 days
path: conf/messages.cy
user: login: BAmiriDev
body: Rob is still finalising content; I believe Welsh translations will be handled in a future story. I added these more as a placeholder so the test passes 
created_at: 2025-03-21T14:43:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -899,6 +899,7 @@ selfAssessmentCharges.important                                    = Important
 selfAssessmentCharges.important-p1                                 = This is the total amount of overdue tax you need to pay. Any interest will increase daily until the overdue amount is paid.
 selfAssessmentCharges.important-p2                                 = You can
 selfAssessmentCharges.important-p2-link-text                       = pay the total amount needed now.
+selfAssessmentCharges.charges-due-in-30-days                       = Charges due in 30 days
path: conf/messages.cy
user: login: avelx
body: In this case we need to create a sub-task related to current story (Welsh translation **IsPending**?) , in case this part would slip into the next sprint we would have to create a story to track this change in the future
created_at: 2025-03-21T14:46:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -348,16 +393,60 @@ <h2 class="govuk-tabs__title">
                                             </a>
                                         </li>
                                     }
+                                    @if(viewModel.whatYouOweChargesList.chargesDueWithin30DaysList.nonEmpty) {
+                                    <li class="govuk-tabs__list-item">
+                                        <a class="govuk-tabs__tab" href="#charges-due-in-30-days">
+                                            @getMessage("charges-due-in-30-days")
+                                        </a>
+                                    </li>
+                                    }
                                     <li class="govuk-tabs__list-item govuk-tabs__list-item--selected">
                                         <a class="govuk-tabs__tab" href="#placeholder">
                                             Placeholder
                                         </a>
                                     </li>
                                 </ul>
+
+                                @if(viewModel.whatYouOweChargesList.chargesDueWithin30DaysList.nonEmpty) {
+                                <div class="govuk-tabs__panel" id="charges-due-in-30-days">
+                                    <table class="govuk-table">
+                                        @tableHead("due-in-30-days-payments-table-head", false)
+                                        <tbody class="govuk-table__body">
+                                        @for((charge, index) <- ChargeItem.chargesDueWithin30DaysList(viewModel.whatYouOweChargesList).zipWithIndex) {
+                                        @tableRowWithoutInterest(s"due-30-days-$index", charge, index, "taxYearSummary-link")
+                                        }
+                                        <tr class="govuk-table__header">
+                                            <td class="govuk-table__header" colspan="2">
+                                                @getMessage("table.total-amount", viewModel.whatYouOweChargesList.balanceDetails.balanceDueWithin30Days.toCurrencyString)
+                                            </td>
+                                        </tr>
+                                        </tbody>
+                                    </table>
+
+                                    <div class="govuk-inset-text">
+                                        <div>
+                                            @getMessage("overdue-inset-text-1")
+                                        </div>
+                                        <br>
+                                        <div>
+                                            @getMessage("overdue-inset-text-2")
+                                        </div>
+                                    </div>
+
+                                    @if(user.saUtr.isDefined && !user.isAgent() && viewModel.whatYouOweChargesList.getEarliestTaxYearAndAmountByDueDate.isDefined) {
+                                    <div id="payment-button">
+                                        @link(link = controllers.routes.PaymentController.paymentHandoff(viewModel.whatYouOweChargesList.getEarliestTaxYearAndAmountByDueDate.get._2.toPence, origin).url,
+                                        messageKey = getPrefix("payNow"), classes = "govuk-button", role = Some("button"),
+                                        id = Some("payment-button-link"))
+                                    </div>
+                                    }
+                                </div>
+                                }
+
                                 @if(ChargeItem.overdueOrAccruingInterestChargeList(viewModel.whatYouOweChargesList).nonEmpty || viewModel.whatYouOweChargesList.overdueOutstandingCharges.nonEmpty) {
                                     <div class="govuk-tabs__panel" id="charges-due-now">
                                         <table class="govuk-table" id="charges-due-now-table">
-                                            @tableHead("over-due-payments-table-head")
+                                            @tableHead("over-due-payments-table-head", true)
path: app/views/YourSelfAssessmentCharges.scala.html
user: login: BAmiriDev
body: The showInterest flag is used in @tableHead("due-in-30-days-payments-table-head", false) because the "Due in 30 days" tab doesn’t have estimated interest
created_at: 2025-03-21T14:47:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -29,6 +29,7 @@ case class YourSelfAssessmentChargesViewModel(hasOverdueOrAccruingInterestCharge
                                               dunningLock: Boolean,
                                               reviewAndReconcileEnabled: Boolean,
                                               creditAndRefundEnabled: Boolean,
+                                              earliestTaxYearAndAmountByDueDate: (TaxYear, BigDecimal),
path: app/models/financialDetails/YourSelfAssessmentChargesViewModel.scala
user: login: avelx
body: if we can avoid using tuples in this fashion as this would generate "not readable code";
feel free to create a new case class if you need to in order to improve code readability 
created_at: 2025-03-21T16:46:44Z
author_association: CONTRIBUTOR
diff_hunk: @@ -66,13 +67,19 @@ class YourSelfAssessmentChargesController @Inject()(val authActions: AuthActions
 
       val hasOverdueCharges: Boolean = whatYouOweChargesList.chargesList.exists(_.isOverdue()(dateService))
       val hasAccruingInterestReviewAndReconcileCharges: Boolean = whatYouOweChargesList.chargesList.exists(_.isNotPaidAndNotOverduePoaReconciliationDebit()(dateService))
+      val earliestTaxYearAndAmount: (TaxYear, BigDecimal) =
path: app/controllers/YourSelfAssessmentChargesController.scala
user: login: avelx
body: same here, fee free to create a new case class if you need to, as tuples  use is generally discouraged; if this is something used within a function and not exposed outside of it, than this should be fine
created_at: 2025-03-21T16:48:54Z
author_association: CONTRIBUTOR
diff_hunk: @@ -66,13 +68,18 @@ class YourSelfAssessmentChargesController @Inject()(val authActions: AuthActions
 
       val hasOverdueCharges: Boolean = whatYouOweChargesList.chargesList.exists(_.isOverdue()(dateService))
       val hasAccruingInterestReviewAndReconcileCharges: Boolean = whatYouOweChargesList.chargesList.exists(_.isNotPaidAndNotOverduePoaReconciliationDebit()(dateService))
+      val earliestTaxYearAndAmount: Option[TaxYearWithAmount] =
path: app/controllers/YourSelfAssessmentChargesController.scala
user: login: avelx
body: :+1:
created_at: 2025-03-25T10:16:03Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,24 @@
+/*
+ * Copyright 2024 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 models.taxYearAmount
+
+import models.incomeSourceDetails.TaxYear
+
+case class TaxYearWithAmount(
+                                     taxYear: TaxYear,
+                                     amount: BigDecimal
path: app/models/taxYearAmount/TaxYearWithAmount.scala
user: login: avelx
body: just wondering if we can be more specific in naming convention, ie if this amount is related to something?
created_at: 2025-03-25T10:17:12Z
author_association: CONTRIBUTOR

PR comments:
user: login: platops-pr-bot
created_at: 2025-03-20T15:07:50Z
body: - `SBT` can be updated to `1.10.10` in [project/build.properties](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/project/build.properties#L1)
- `Scala` can be updated from `2.13.12` to `2.13.16` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L87)
- `uk.gov.hmrc.sbt-distributables` can be updated to `2.6.0` in [project/plugins.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/project/plugins.sbt#L11)
- `uk.gov.hmrc:bootstrap-frontend-play-30` can be updated to `9.11.0` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L1).
- `uk.gov.hmrc:crypto-json-play-30` can be updated to `8.2.0` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L1).
- `uk.gov.hmrc:play-frontend-hmrc-play-30` can be updated to `11.12.0` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L1).
- `uk.gov.hmrc.mongo:hmrc-mongo-play-30` can be updated to `2.6.0` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L1).
- `uk.gov.hmrc:bootstrap-test-play-30` can be updated to `9.11.0` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L1).
- `uk.gov.hmrc.mongo:hmrc-mongo-test-play-30` can be updated to `2.6.0` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L1).
author_association: NONE
user: login: avelx
created_at: 2025-03-21T10:43:46Z
body: @BAmiriDev  - I would suspect we would need a bit more test coverage around ViewSpect / ITs tests; if you can double check this part pls;
author_association: CONTRIBUTOR
user: login: platops-pr-bot
created_at: 2025-03-25T11:08:23Z
body: - ~~`uk.gov.hmrc:play-frontend-hmrc-play-30` can be updated to `11.12.0` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L1).~~
- `SBT` can be updated to `1.10.10` in [project/build.properties](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/project/build.properties#L1)
- `Scala` can be updated from `2.13.12` to `2.13.16` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L87)
- `uk.gov.hmrc.sbt-distributables` can be updated to `2.6.0` in [project/plugins.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/project/plugins.sbt#L11)
- `uk.gov.hmrc:bootstrap-frontend-play-30` can be updated to `9.11.0` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L1).
- `uk.gov.hmrc:crypto-json-play-30` can be updated to `8.2.0` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L1).
- `uk.gov.hmrc:play-frontend-hmrc-play-30` can be updated to `11.13.0` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L1).
- `uk.gov.hmrc.mongo:hmrc-mongo-play-30` can be updated to `2.6.0` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L1).
- `uk.gov.hmrc:bootstrap-test-play-30` can be updated to `9.11.0` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L1).
- `uk.gov.hmrc.mongo:hmrc-mongo-test-play-30` can be updated to `2.6.0` in [build.sbt](https://github.com/hmrc/income-tax-view-change-frontend/blob/MISUV-9329/build.sbt#L1).
author_association: NONE