Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Man 340 requirements notes truncated #4589

Merged
merged 11 commits into from
Jan 28, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,11 @@ class DataLoader(
PersonGenerator.ADDITIONAL_OFFENCE_1,
PersonGenerator.ADD_OFF_2,
PersonGenerator.ADDITIONAL_OFFENCE_2,
PersonGenerator.UNIT,
PersonGenerator.MAIN_CAT_F,
PersonGenerator.MAIN_CAT_W,
PersonGenerator.MAIN_CAT_F_TYPE,
PersonGenerator.MAIN_CAT_W_TYPE,
PersonGenerator.REQUIREMENT,
PersonGenerator.REQUIREMENT_UNPAID_WORK,
PersonGenerator.REQUIREMENT_CONTACT_1,
Expand All @@ -171,8 +174,6 @@ class DataLoader(
PersonGenerator.REGISTRATION_REVIEW_2,
PersonGenerator.REGISTRATION_REVIEW_3,
PersonGenerator.DEREGISTRATION_1,
PersonGenerator.MAIN_CAT_F_TYPE,
PersonGenerator.MAIN_CAT_W_TYPE,
PersonGenerator.NSI_BREACH_TYPE,
PersonGenerator.NSI_OPD_TYPE,
PersonGenerator.NSI_STATUS,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,15 +128,24 @@ object PersonGenerator {
LocalDate.now()
)

val MAIN_CAT_F_SUB_ID = IdGenerator.getAndIncrement()
val MAIN_CAT_F_TYPE = ReferenceData(MAIN_CAT_F_SUB_ID, "G03", "High Intensity")
val MAIN_CAT_F = RequirementMainCategory(IdGenerator.getAndIncrement(), "F", "Main", 1)
val REQUIREMENT = generateRequirement(ACTIVE_ORDER, MAIN_CAT_F_SUB_ID, mainCategory = MAIN_CAT_F)
val MAIN_CAT_F_TYPE = ReferenceData(IdGenerator.getAndIncrement(), "G03", "High Intensity")
val UNIT = ReferenceData(IdGenerator.getAndIncrement(), "D", "Days")
val MAIN_CAT_F = RequirementMainCategory(IdGenerator.getAndIncrement(), "F", "Main", UNIT)
val REQUIREMENT = generateRequirement(
ACTIVE_ORDER,
subCategory = MAIN_CAT_F_TYPE,
mainCategory = MAIN_CAT_F,
terminationDetails = null
)

val MAIN_CAT_W_SUB_ID = IdGenerator.getAndIncrement()
val MAIN_CAT_W_TYPE = ReferenceData(MAIN_CAT_W_SUB_ID, "W02", "Intensive")
val MAIN_CAT_W = RequirementMainCategory(IdGenerator.getAndIncrement(), "W", "Unpaid Work", 1107)
val REQUIREMENT_UNPAID_WORK = generateRequirement(ACTIVE_ORDER, MAIN_CAT_W_SUB_ID, mainCategory = MAIN_CAT_W)
val MAIN_CAT_W_TYPE = ReferenceData(IdGenerator.getAndIncrement(), "W02", "Intensive")
val MAIN_CAT_W = RequirementMainCategory(IdGenerator.getAndIncrement(), "W", "Unpaid Work", UNIT)
val REQUIREMENT_UNPAID_WORK = generateRequirement(
ACTIVE_ORDER,
subCategory = MAIN_CAT_W_TYPE,
mainCategory = MAIN_CAT_W,
terminationDetails = null
)

val REQUIREMENT_CONTACT_1 = ContactGenerator.generateContact(
OVERVIEW,
Expand Down Expand Up @@ -365,7 +374,6 @@ object PersonGenerator {

fun generateRequirement(
disposal: Disposal,
subCategoryId: Long,
length: Long = 12,
notes: String? = "my notes",
mainCategory: RequirementMainCategory,
Expand All @@ -376,21 +384,22 @@ object PersonGenerator {
commencementDate: LocalDate? = LocalDate.now().minusDays(4),
expectedEndDate: LocalDate? = LocalDate.now().minusDays(2),
terminationDate: LocalDate? = LocalDate.now().minusDays(3),
rqmntTerminationReasonId: Long? = null,
subCategory: ReferenceData?,
terminationDetails: ReferenceData?,
id: Long = IdGenerator.getAndIncrement()
) = Requirement(
id,
length,
notes,
subCategoryId,
expectedStartDate,
startDate,
commencementDate,
expectedEndDate,
terminationDate,
rqmntTerminationReasonId,
disposal,
mainCategory,
subCategory,
terminationDetails,
active,
softDeleted
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ class RequirementIntegrationTest {
null,
"2 of 12 RAR days completed",
12,
null,
"Days",
requirementNote = NoteDetail(0, note = "my notes"),
rar = Rar(completed = 1, scheduled = 1, nsiCompleted = 0, totalDays = 2)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.TestPropertySource
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
import org.springframework.test.web.servlet.result.MockMvcResultMatchers
Expand Down Expand Up @@ -131,7 +132,7 @@ class SentenceIntegrationTest {
null,
"2 of 12 RAR days completed",
12,
null,
"Days",
listOf(NoteDetail(0, note = "my notes", hasNoteBeenTruncated = false)),
rar = Rar(completed = 1, scheduled = 1, nsiCompleted = 0, totalDays = 2)
),
Expand All @@ -145,7 +146,7 @@ class SentenceIntegrationTest {
null,
"Unpaid Work - Intensive",
12,
null,
"Days",
listOf(NoteDetail(0, note = "my notes", hasNoteBeenTruncated = false)),
null
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@ import org.hibernate.type.NumericBooleanConverter
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import uk.gov.justice.digital.hmpps.api.model.overview.Rar
import uk.gov.justice.digital.hmpps.integrations.delius.referencedata.entity.ReferenceData
import java.time.LocalDate

@Immutable
@Entity
@Table(name = "rqmnt")
@SQLRestriction("soft_deleted = 0 and active_flag = 1")
pmcphee77 marked this conversation as resolved.
Show resolved Hide resolved
@SQLRestriction("soft_deleted = 0")
class Requirement(
@Id
@Column(name = "rqmnt_id", nullable = false)
Expand All @@ -23,9 +24,6 @@ class Requirement(
@Column(name = "rqmnt_notes", columnDefinition = "clob")
val notes: String?,

@Column(name = "rqmnt_type_sub_category_id")
val subCategoryId: Long?,

val expectedStartDate: LocalDate?,

val startDate: LocalDate,
Expand All @@ -36,8 +34,6 @@ class Requirement(

val terminationDate: LocalDate?,

val rqmntTerminationReasonId: Long?,

@ManyToOne
@JoinColumn(name = "disposal_id")
val disposal: Disposal? = null,
Expand All @@ -46,6 +42,14 @@ class Requirement(
@JoinColumn(name = "rqmnt_type_main_category_id")
val mainCategory: RequirementMainCategory?,

@ManyToOne
@JoinColumn(name = "rqmnt_type_sub_category_id")
val subCategory: ReferenceData?,

@ManyToOne
@JoinColumn(name = "rqmnt_termination_reason_id")
val terminationDetails: ReferenceData?,

@Column(name = "active_flag", columnDefinition = "number", nullable = false)
@Convert(converter = NumericBooleanConverter::class)
val active: Boolean = true,
Expand Down Expand Up @@ -137,79 +141,35 @@ interface RequirementRepository : JpaRepository<Requirement, Long> {

@Query(
"""
SELECT r.rqmnt_id as id,
r.disposal_id as disposalId,
r.expected_start_date as expectedStartDate,
r.start_date as startDate,
r.commencement_date as commencementDate,
r.expected_end_date as expectedEndDate,
r.termination_date as terminationDate,
rsrl3.code_description as terminationReason,
r."LENGTH",
rsrl2.code_description as lengthUnitValue,
rrtmc.code,
rrtmc.description,
rsrl.code_description AS codeDescription,
TO_CHAR(SUBSTR(r.rqmnt_notes, 1, 4000)) AS notes
FROM rqmnt r
JOIN r_rqmnt_type_main_category rrtmc
ON rrtmc.rqmnt_type_main_category_id = r.rqmnt_type_main_category_id
JOIN disposal d
ON d.disposal_id = r.disposal_id
JOIN event e
ON e.event_id = d.event_id
LEFT JOIN r_standard_reference_list rsrl
ON rsrl.standard_reference_list_id = r.rqmnt_type_sub_category_id
LEFT JOIN r_standard_reference_list rsrl2
ON rsrl2.standard_reference_list_id = rrtmc.units_id
LEFT JOIN r_standard_reference_list rsrl3
ON rsrl3.standard_reference_list_id = r.rqmnt_termination_reason_id
WHERE e.event_id = :id
AND e.event_number = :eventNumber
AND e.soft_deleted = 0
AND e.active_flag = 1
AND r.soft_deleted = 0
ORDER BY rrtmc.description
""", nativeQuery = true
SELECT r, m, d, sc, td, ud
FROM Requirement r
JOIN r.mainCategory m
JOIN r.disposal d
JOIN d.event e
LEFT JOIN r.subCategory sc
LEFT JOIN r.terminationDetails td
LEFT JOIN m.unitDetails ud
WHERE e.id = :id
AND e.eventNumber = :eventNumber
ORDER BY m.description
"""
)
fun getRequirements(id: Long, eventNumber: String): List<RequirementDetails>
fun getRequirements(id: Long, eventNumber: String): List<Requirement>

@Query(
"""
SELECT r.rqmnt_id AS id,
r.disposal_id as disposalId,
r.expected_start_date as expectedStartDate,
r.start_date as startDate,
r.commencement_date as commencementDate,
r.expected_end_date as expectedEndDate,
r.termination_date as terminationDate,
rsrl3.code_description as terminationReason,
r."LENGTH",
rsrl2.code_description as lengthUnitValue,
rrtmc.code,
rrtmc.description,
rsrl.code_description AS codeDescription,
TO_CHAR(SUBSTR(r.rqmnt_notes, 1, 4000)) AS notes
FROM rqmnt r
JOIN r_rqmnt_type_main_category rrtmc
ON rrtmc.rqmnt_type_main_category_id = r.rqmnt_type_main_category_id
JOIN disposal d
ON d.disposal_id = r.disposal_id
JOIN event e
ON e.event_id = d.event_id
LEFT JOIN r_standard_reference_list rsrl
ON rsrl.standard_reference_list_id = r.rqmnt_type_sub_category_id
LEFT JOIN r_standard_reference_list rsrl2
ON rsrl2.standard_reference_list_id = rrtmc.units_id
LEFT JOIN r_standard_reference_list rsrl3
ON rsrl3.standard_reference_list_id = r.rqmnt_termination_reason_id
WHERE r.rqmnt_id = :id
AND e.soft_deleted = 0
AND e.active_flag = 1
AND r.soft_deleted = 0
""", nativeQuery = true
SELECT r, m, d, sc, td, ud
FROM Requirement r
JOIN r.mainCategory m
JOIN r.disposal d
JOIN d.event e
LEFT JOIN r.subCategory sc
LEFT JOIN r.terminationDetails td
LEFT JOIN m.unitDetails ud
WHERE r.id = :id
"""
)
fun getRequirement(id: Long): RequirementDetails?
fun getRequirement(id: Long): Requirement?

@Query(
"""
Expand Down Expand Up @@ -241,6 +201,9 @@ class RequirementMainCategory(
val id: Long,
val code: String,
val description: String,
val unitsId: Long?,

@ManyToOne
@JoinColumn(name = "units_id")
val unitDetails: ReferenceData? = null,
)

Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import uk.gov.justice.digital.hmpps.api.model.sentence.NoteDetail
import uk.gov.justice.digital.hmpps.api.model.sentence.Requirement
import uk.gov.justice.digital.hmpps.api.model.sentence.RequirementNoteDetail
import uk.gov.justice.digital.hmpps.integrations.delius.overview.entity.PersonRepository
import uk.gov.justice.digital.hmpps.integrations.delius.overview.entity.RequirementDetails
import uk.gov.justice.digital.hmpps.integrations.delius.overview.entity.RequirementRepository
import uk.gov.justice.digital.hmpps.integrations.delius.overview.entity.getPerson
import uk.gov.justice.digital.hmpps.integrations.delius.overview.entity.Requirement as RequirementEntity

@Service
class RequirementService(
Expand All @@ -26,20 +26,20 @@ class RequirementService(
)
}

fun RequirementDetails.toRequirementSingleNote(noteId: Int): Requirement {
val rar = getRar(disposalId, code)
fun RequirementEntity.toRequirementSingleNote(noteId: Int): Requirement {
val rar = getRar(disposal!!.id, mainCategory!!.code)

val requirement = Requirement(
id,
code,
mainCategory.code,
expectedStartDate,
startDate,
expectedEndDate,
terminationDate,
terminationReason,
populateRequirementDescription(description, codeDescription, length, rar),
terminationDetails?.description,
populateRequirementDescription(mainCategory.description, subCategory?.description, length, rar),
length,
lengthUnitValue,
mainCategory.unitDetails?.description,
requirementNote = toRequirementNote(false).elementAtOrNull(noteId),
rar = rar
)
Expand Down Expand Up @@ -75,7 +75,6 @@ fun populateRequirementDescription(
return description
}

fun RequirementDetails.toRequirementNote(truncateNote: Boolean): List<NoteDetail> {
fun RequirementEntity.toRequirementNote(truncateNote: Boolean): List<NoteDetail> {
return formatNote(notes, truncateNote)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import uk.gov.justice.digital.hmpps.api.model.sentence.*
import uk.gov.justice.digital.hmpps.api.model.sentence.Offence
import uk.gov.justice.digital.hmpps.api.model.sentence.Requirement
import uk.gov.justice.digital.hmpps.datetime.DeliusDateFormatter
import uk.gov.justice.digital.hmpps.integrations.delius.overview.entity.Requirement as RequirementEntity
import uk.gov.justice.digital.hmpps.integrations.delius.overview.entity.*
import uk.gov.justice.digital.hmpps.integrations.delius.personalDetails.entity.CourtDocumentDetails
import uk.gov.justice.digital.hmpps.integrations.delius.personalDetails.entity.DocumentRepository
Expand Down Expand Up @@ -142,30 +143,33 @@ class SentenceService(

fun Disposal.toMinimalOrder() = MinimalOrder(type.description, date, expectedEndDate())

fun RequirementDetails.toRequirement(): Requirement {
val rar = requirementService.getRar(disposalId, code)
fun RequirementEntity.toRequirement(): Requirement {
val rar = requirementService.getRar(disposal!!.id, mainCategory!!.code)

val requirement = Requirement(
id,
code,
mainCategory.code,
expectedStartDate,
startDate,
expectedEndDate,
terminationDate,
terminationReason,
populateRequirementDescription(description, codeDescription, length, rar),
terminationDetails?.description,
populateRequirementDescription(mainCategory.description, subCategory?.description, length, rar),
length,
lengthUnitValue,
mainCategory.unitDetails?.description,
toRequirementNote(true),
rar = rar
)

return requirement
}

fun RequirementDetails.toMinimalRequirement(): MinimalRequirement {
val rar = requirementService.getRar(disposalId, code)
return MinimalRequirement(id, populateRequirementDescription(description, codeDescription, length, rar))
fun RequirementEntity.toMinimalRequirement(): MinimalRequirement {
val rar = requirementService.getRar(disposal!!.id, mainCategory!!.code)
return MinimalRequirement(
id,
populateRequirementDescription(mainCategory.description, subCategory?.description, length, rar)
)
}

fun getUnpaidWorkTime(disposalId: Long): String? {
Expand Down
Loading
Loading