Skip to content

Commit eff32f9

Browse files
authored
Merge pull request #51 from indymoorcroft/DTR-2746
[DTR-2746 | DTR-2743 | DTR-2749]: Fix sorting for GetReturns
2 parents d3ff0b8 + d28bcf2 commit eff32f9

File tree

5 files changed

+247
-7
lines changed

5 files changed

+247
-7
lines changed

app/uk/gov/hmrc/formpproxy/sdlt/models/GetReturnRecordsRequest.scala

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,18 @@ case class GetReturnRecordsRequest(
2424
deletionFlag: Boolean,
2525
pageType: Option[String],
2626
pageNumber: Option[String]
27-
)
27+
) {
28+
29+
def sortSpec: (String, String) =
30+
val (order, orderBy) = (pageType.map(_.trim.toUpperCase), deletionFlag) match {
31+
case (Some("IN-PROGRESS"), false) => ("ret.last_update_date", "DESC")
32+
case (Some("SUBMITTED"), false) => ("submitted_date", "DESC")
33+
case (Some("IN-PROGRESS") | Some("SUBMITTED"), true) => ("ret.purge_date", "ASC")
34+
case _ => ("1", "ASC")
35+
}
36+
37+
(order, orderBy)
38+
}
2839

2940
object GetReturnRecordsRequest {
3041
implicit val format: OFormat[GetReturnRecordsRequest] = Json.format[GetReturnRecordsRequest]

app/uk/gov/hmrc/formpproxy/sdlt/repositories/SdltFormpRepository.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,9 @@ class SdltFormpRepository @Inject() (@NamedDatabase("sdlt") db: Database)(implic
237237
} else {
238238
cs.setString(7, "FALSE")
239239
}
240-
cs.setString(8, "1") // p_order
241-
cs.setString(9, "ASC") // p_order_by
240+
val (order, orderBy) = request.sortSpec
241+
cs.setString(8, order) // p_order
242+
cs.setString(9, orderBy) // p_order_by
242243
cs.setLong(10, request.pageNumber.map(_.toLong).getOrElse(1L))
243244
cs.setOptionalString(11, request.pageType)
244245
// Output
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
/*
2+
* Copyright 2026 HM Revenue & Customs
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
//package uk.gov.hmrc.formpproxy.sdlt.DONOTDELETE
18+
//
19+
//import org.scalatest.BeforeAndAfterEach
20+
//import org.scalatest.concurrent.{IntegrationPatience, ScalaFutures}
21+
//import org.scalatest.matchers.must.Matchers
22+
//import org.scalatest.wordspec.AnyWordSpec
23+
//import org.scalatestplus.play.guice.GuiceOneAppPerSuite
24+
//import play.api.db.{DBApi, Database}
25+
//import uk.gov.hmrc.formpproxy.sdlt.models.GetReturnRecordsRequest
26+
//import uk.gov.hmrc.formpproxy.sdlt.repositories.SdltFormpRepository
27+
//
28+
//class GetReturnsOrderingIntegrationSpec
29+
// extends AnyWordSpec
30+
// with Matchers
31+
// with ScalaFutures
32+
// with IntegrationPatience
33+
// with GuiceOneAppPerSuite
34+
// with BeforeAndAfterEach {
35+
//
36+
// private def db: Database =
37+
// app.injector.instanceOf[DBApi].database("sdlt")
38+
//
39+
// private lazy val repo = app.injector.instanceOf[SdltFormpRepository]
40+
//
41+
// override protected def beforeEach(): Unit = {
42+
// super.beforeEach()
43+
// cleanupTestReturns()
44+
// setupTestReturns()
45+
// }
46+
//
47+
// "getReturns" should {
48+
//
49+
// "returns correct number of IN-PROGRESS returns ordered by last update date DESC" in {
50+
// val request = GetReturnRecordsRequest(
51+
// storn = "STN001",
52+
// status = None,
53+
// deletionFlag = false,
54+
// pageType = Some("IN-PROGRESS"),
55+
// pageNumber = None
56+
// )
57+
//
58+
// val result = repo.sdltGetReturns(request).futureValue
59+
//
60+
// result.returnSummaryList.length mustBe 6
61+
// result.returnSummaryList.map(_.returnReference) mustBe Seq("5", "6", "4", "1", "2", "3")
62+
// }
63+
//
64+
// "returns correct number of SUBMITTED returns ordered by submitted date DESC" in {
65+
// val request = GetReturnRecordsRequest(
66+
// storn = "STN001",
67+
// status = None,
68+
// deletionFlag = false,
69+
// pageType = Some("SUBMITTED"),
70+
// pageNumber = None
71+
// )
72+
//
73+
// val result = repo.sdltGetReturns(request).futureValue
74+
//
75+
// result.returnSummaryList.length mustBe 3
76+
// result.returnSummaryList.map(_.returnReference) mustBe Seq("8", "9", "7")
77+
// }
78+
//
79+
// "returns correct number of DUE-FOR-DELETION returns ordered by purge date ASC" in {
80+
// val request = GetReturnRecordsRequest(
81+
// storn = "STN001",
82+
// status = None,
83+
// deletionFlag = true,
84+
// pageType = Some("IN-PROGRESS"),
85+
// pageNumber = None
86+
// )
87+
//
88+
// val result = repo.sdltGetReturns(request).futureValue
89+
//
90+
// result.returnSummaryList.length mustBe 3
91+
// result.returnSummaryList.map(_.returnReference) mustBe Seq("4", "6", "5")
92+
// }
93+
// }
94+
//
95+
// private def setupTestReturns(): Unit = {
96+
// db.withConnection { conn =>
97+
// val orgStatement = conn.prepareStatement(
98+
// """
99+
// |INSERT INTO SDLT_FILE_DATA.SDLT_ORGANISATION (STORN, CREATE_DATE, LAST_UPDATE_DATE)
100+
// |VALUES (?, SYSDATE, SYSDATE)""".stripMargin
101+
// )
102+
//
103+
// orgStatement.setString(1, "STN001")
104+
// orgStatement.execute()
105+
// orgStatement.close()
106+
//
107+
// val returnStatement = conn.prepareStatement(
108+
// """
109+
// |INSERT INTO SDLT_FILE_DATA.RETURN (RETURN_ID, STORN, PURCHASER_COUNTER, VENDOR_COUNTER, LAND_COUNTER, PURGE_DATE, RETURN_RESOURCE_REF, STATUS, CREATE_DATE, LAST_UPDATE_DATE)
110+
// |VALUES (?, 'STN001', 1, 1, 1, TO_DATE(?, 'YYYY-MM-DD'), ?, ?, TO_DATE(?, 'YYYY-MM-DD'), TO_DATE(?, 'YYYY-MM-DD'))
111+
// |""".stripMargin
112+
// )
113+
//
114+
// val returnTestData = Seq(
115+
// (1000001L, "2027-01-01", 1L, "STARTED", "2026-02-15", "2026-02-15"), // IN-PROGRESS
116+
// (1000002L, "2027-01-01", 2L, "ACCEPTED", "2026-02-10", "2026-02-10"),
117+
// (1000003L, "2027-01-01", 3L, "ACCEPTED", "2026-02-15", "2026-02-05"),
118+
// (1000004L, "2026-02-21", 4L, "STARTED", "2026-02-20", "2026-02-20"), // DUE-FOR-DELETION
119+
// (1000005L, "2026-03-01", 5L, "ACCEPTED", "2026-02-28", "2026-02-28"),
120+
// (1000006L, "2026-02-26", 6L, "STARTED", "2026-02-25", "2026-02-25"),
121+
// (1000007L, "2027-01-01", 7L, "SUBMITTED", "2026-02-08", "2026-02-08"), // SUBMITTED
122+
// (1000008L, "2027-01-01", 8L, "SUBMITTED", "2026-02-18", "2026-02-18"),
123+
// (1000009L, "2027-01-01", 9L, "SUBMITTED", "2026-02-13", "2026-02-13")
124+
// )
125+
//
126+
// returnTestData.foreach { case (returnId, purgeDate, resourceRef, status, createdDate, lastUpdateDate) =>
127+
// returnStatement.setLong(1, returnId)
128+
// returnStatement.setString(2, purgeDate)
129+
// returnStatement.setLong(3, resourceRef)
130+
// returnStatement.setString(4, status)
131+
// returnStatement.setString(5, createdDate)
132+
// returnStatement.setString(6, lastUpdateDate)
133+
// returnStatement.addBatch()
134+
// }
135+
// returnStatement.executeBatch()
136+
// returnStatement.close()
137+
//
138+
// val submissionStatement = conn.prepareStatement(
139+
// """
140+
// |INSERT INTO SDLT_FILE_DATA.SUBMISSION (SUBMISSION_ID, RETURN_ID, STORN, SUBMITTED_DATE, CREATE_DATE, LAST_UPDATE_DATE)
141+
// |VALUES (?, ?, 'STN001', TO_DATE(?, 'YYYY-MM-DD'), TO_DATE(?, 'YYYY-MM-DD'), TO_DATE(?, 'YYYY-MM-DD'))
142+
// |""".stripMargin
143+
// )
144+
//
145+
// val submissionTestData = Seq(
146+
// (2000001L, 1000007L, "2026-02-08", "2026-02-08", "2026-02-08"),
147+
// (2000002L, 1000008L, "2026-02-18", "2026-02-18", "2026-02-18"),
148+
// (2000003L, 1000009L, "2026-02-13", "2026-02-13", "2026-02-13")
149+
// )
150+
//
151+
// submissionTestData.foreach { case (submissionId, returnId, submittedDate, createdDate, lastUpdateDate) =>
152+
// submissionStatement.setLong(1, submissionId)
153+
// submissionStatement.setLong(2, returnId)
154+
// submissionStatement.setString(3, submittedDate)
155+
// submissionStatement.setString(4, createdDate)
156+
// submissionStatement.setString(5, lastUpdateDate)
157+
// submissionStatement.addBatch()
158+
// }
159+
// submissionStatement.executeBatch()
160+
// submissionStatement.close()
161+
// }
162+
// }
163+
//
164+
// private def cleanupTestReturns(): Unit = {
165+
// db.withConnection { conn =>
166+
// val cleanupSubmissionsStatement = conn.prepareStatement(
167+
// """
168+
// |DELETE FROM SDLT_FILE_DATA.SUBMISSION
169+
// |WHERE STORN = 'STN001'
170+
// |""".stripMargin
171+
// )
172+
// cleanupSubmissionsStatement.execute()
173+
// cleanupSubmissionsStatement.close()
174+
//
175+
// val cleanupReturnsStatement = conn.prepareStatement(
176+
// """
177+
// |DELETE FROM SDLT_FILE_DATA.RETURN
178+
// |WHERE STORN = 'STN001'
179+
// |""".stripMargin
180+
// )
181+
// cleanupReturnsStatement.execute()
182+
// cleanupReturnsStatement.close()
183+
//
184+
// val cleanupOrgStatement = conn.prepareStatement(
185+
// """
186+
// |DELETE FROM SDLT_FILE_DATA.SDLT_ORGANISATION
187+
// |WHERE STORN = 'STN001'
188+
// |""".stripMargin
189+
// )
190+
// cleanupOrgStatement.execute()
191+
// cleanupOrgStatement.close()
192+
// }
193+
// }
194+
//}

test/uk/gov/hmrc/formpproxy/sdlt/repositories/SdltFormpRepoDataHelper.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ trait SdltFormpRepoDataHelper {
2727
ReturnSummary(
2828
returnReference = "REF01",
2929
utrn = Some("UTR001"),
30-
status = "ACTIVE",
30+
status = "SUBMITTED",
3131
dateSubmitted = Some(LocalDate.parse("2025-01-01")),
3232
purchaserName = "purchaserName1",
3333
address = "Address 11",
@@ -57,7 +57,7 @@ trait SdltFormpRepoDataHelper {
5757
storn = "STORN12345",
5858
status = None,
5959
deletionFlag = false,
60-
pageType = None,
60+
pageType = Some("SUBMITTED"),
6161
pageNumber = None
6262
)
6363

test/uk/gov/hmrc/formpproxy/sdlt/repositories/SdltFormpRepositorySpec.scala

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,7 +1140,7 @@ final class SdltFormpRepositorySpec extends SpecBase with SdltFormpRepoDataHelpe
11401140
when(resRetSummary.next()).thenReturn(true, true, false) // read 2 rows
11411141
when(resRetSummary.getString("return_resource_ref")).thenReturn("REF01", "REF02")
11421142
when(resRetSummary.getString("utrn")).thenReturn("UTR001", "UTR003")
1143-
when(resRetSummary.getString("status")).thenReturn("ACTIVE", "SUBMITTED")
1143+
when(resRetSummary.getString("status")).thenReturn("SUBMITTED", "SUBMITTED")
11441144
when(resRetSummary.getString("submitted_date")).thenReturn("2025-01-01", "2025-02-03")
11451145

11461146
when(resRetSummary.getString("name")).thenReturn("purchaserName1", "purchaserName2")
@@ -1188,7 +1188,41 @@ final class SdltFormpRepositorySpec extends SpecBase with SdltFormpRepoDataHelpe
11881188
result.returnSummaryList.length mustBe 0
11891189
result.returnSummaryList mustBe expectedReturnsSummaryEmpty
11901190
}
1191-
"call::query_return - ..." in new ReturnsFixture {}
1191+
"call::query_return - generates correct sorting parameters" in new ReturnsFixture {
1192+
when(db.withConnection(anyArg[Connection => Any])).thenAnswer { inv =>
1193+
val f = inv.getArgument(0, classOf[Connection => Any]);
1194+
f(conn)
1195+
}
1196+
1197+
when(
1198+
conn.prepareCall(
1199+
eqTo("{ call RETURN_PROCS.query_return(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) }")
1200+
)
1201+
).thenReturn(cs)
1202+
1203+
when(cs.getLong(eqTo(13))).thenReturn(1017L)
1204+
when(cs.getObject(eqTo(12), eqTo(classOf[ResultSet]))).thenReturn(resRetSummary)
1205+
1206+
// Fetch data
1207+
when(resRetSummary.next()).thenReturn(true, true, false)
1208+
when(resRetSummary.getString("return_resource_ref")).thenReturn("REF01", "REF02")
1209+
when(resRetSummary.getString("utrn")).thenReturn("UTR001", "UTR003")
1210+
when(resRetSummary.getString("status")).thenReturn("SUBMITTED", "SUBMITTED")
1211+
when(resRetSummary.getString("submitted_date")).thenReturn("2025-01-01", "2025-02-03")
1212+
1213+
when(resRetSummary.getString("name")).thenReturn("purchaserName1", "purchaserName2")
1214+
1215+
when(resRetSummary.getString("address")).thenReturn("Address 11", "Address 22")
1216+
when(resRetSummary.getString("agent")).thenReturn("Agent 11", "Agent 22")
1217+
1218+
val repo = new SdltFormpRepository(db)
1219+
val result: SdltReturnRecordResponse = repo.sdltGetReturns(requestReturns).futureValue
1220+
1221+
verify(cs).setString(8, "submitted_date")
1222+
verify(cs).setString(9, "DESC")
1223+
verify(cs).execute()
1224+
verify(cs).close()
1225+
}
11921226
}
11931227

11941228
"sdltCreateVendor" - {

0 commit comments

Comments
 (0)