diff --git a/build.gradle.kts b/build.gradle.kts index f5edf5181..1f4001724 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,7 +16,7 @@ dependencies { val springdocVersion = "2.6.0" val sentryVersion = "8.0.0" val jsonWebtokenVersion = "0.12.6" - val springSecurityVersion = "6.4.0" + val springSecurityVersion = "6.4.2" implementation("uk.gov.justice.service.hmpps:hmpps-kotlin-spring-boot-starter:1.0.8") // Override netty-common version to address https://osv.dev/vulnerability/GHSA-xq3w-v528-46rv diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/domain/entity/create/ReferralEntity.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/domain/entity/create/ReferralEntity.kt index 8325007d7..33663ba03 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/domain/entity/create/ReferralEntity.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/domain/entity/create/ReferralEntity.kt @@ -53,4 +53,6 @@ data class ReferralEntity( var primaryPomStaffId: BigInteger? = null, @Column(name = "secondary_pom_staff_id") var secondaryPomStaffId: BigInteger? = null, + + var overrideReason: String? = null, ) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/domain/entity/update/ReferralUpdate.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/domain/entity/update/ReferralUpdate.kt index 228097d33..20763ad21 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/domain/entity/update/ReferralUpdate.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/domain/entity/update/ReferralUpdate.kt @@ -4,4 +4,5 @@ data class ReferralUpdate( val additionalInformation: String?, val oasysConfirmed: Boolean, val hasReviewedProgrammeHistory: Boolean, + val overrideReason: String? = null, ) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/restapi/model/Referral.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/restapi/model/Referral.kt index 39008c1ec..f87d207ec 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/restapi/model/Referral.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/restapi/model/Referral.kt @@ -19,6 +19,7 @@ import uk.gov.justice.digital.hmpps.hmppsaccreditedprogrammesapi.restapi.model.S * @param statusDescription The status description. * @param statusColour The colour to display status description. * @param submittedOn + * @param overrideReason */ data class Referral( @@ -58,7 +59,9 @@ data class Referral( @Schema(example = "null", description = "") @get:JsonProperty("submittedOn") val submittedOn: String? = null, + @Schema(example = "The reason for going with the recommended course is...", description = "Reason for overriding the recommended course") + @get:JsonProperty("overrideReason") val overrideReason: String? = null, + @Schema(example = "null", description = "") @get:JsonProperty("primaryPrisonOffenderManager") val primaryPrisonOffenderManager: PrisonOffenderManager? = null, - ) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/restapi/model/ReferralUpdate.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/restapi/model/ReferralUpdate.kt index 550beac93..481a5c6ec 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/restapi/model/ReferralUpdate.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/restapi/model/ReferralUpdate.kt @@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.media.Schema * @param oasysConfirmed * @param hasReviewedProgrammeHistory * @param additionalInformation + * @param overrideReason */ data class ReferralUpdate( @@ -19,4 +20,7 @@ data class ReferralUpdate( @Schema(example = "null", description = "") @get:JsonProperty("additionalInformation") val additionalInformation: String? = null, + + @Schema(example = "The reason for going with the recommended course is...", description = "Reason for overriding the recommended course") + @get:JsonProperty("overrideReason") val overrideReason: String? = null, ) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/restapi/transformer/ReferralTransformers.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/restapi/transformer/ReferralTransformers.kt index 511dfb79e..49405f38c 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/restapi/transformer/ReferralTransformers.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/restapi/transformer/ReferralTransformers.kt @@ -26,6 +26,7 @@ fun ReferralEntity.toApi(status: ReferralStatusRefData, staffDetail: StaffDetail statusColour = status.colour, submittedOn = submittedOn?.toString(), primaryPrisonOffenderManager = staffDetail, + overrideReason = overrideReason, ) fun ReferralEntity.toApi(): ApiReferral = ApiReferral( @@ -37,6 +38,7 @@ fun ReferralEntity.toApi(): ApiReferral = ApiReferral( hasReviewedProgrammeHistory = hasReviewedProgrammeHistory, additionalInformation = additionalInformation, status = status, + overrideReason = overrideReason, ) fun StaffEntity.toApi() = StaffDetail( @@ -52,12 +54,14 @@ fun ApiReferralUpdate.toDomain() = ReferralUpdate( additionalInformation = additionalInformation, oasysConfirmed = oasysConfirmed, hasReviewedProgrammeHistory = hasReviewedProgrammeHistory, + overrideReason = overrideReason, ) fun ReferralUpdate.toApi() = ApiReferralUpdate( additionalInformation = additionalInformation, oasysConfirmed = oasysConfirmed, hasReviewedProgrammeHistory = hasReviewedProgrammeHistory, + overrideReason = overrideReason, ) fun ReferralViewEntity.toApi() = ReferralView( diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/service/ReferralService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/service/ReferralService.kt index e8588219d..d8e31c085 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/service/ReferralService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/service/ReferralService.kt @@ -115,6 +115,7 @@ constructor( referral.additionalInformation = update.additionalInformation referral.oasysConfirmed = update.oasysConfirmed referral.hasReviewedProgrammeHistory = update.hasReviewedProgrammeHistory + referral.overrideReason = update.overrideReason } fun updateReferralStatusById(referralId: UUID, referralStatusUpdate: ReferralStatusUpdate) { diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/service/SubjectAccessRequestService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/service/SubjectAccessRequestService.kt index 1ff80980b..64d5a0c8c 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/service/SubjectAccessRequestService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/service/SubjectAccessRequestService.kt @@ -50,6 +50,7 @@ data class SarReferral( val hasReviewedProgrammeHistory: Boolean?, val additionalInformation: String?, val submittedOn: LocalDateTime?, + val overrideReason: String?, val referrerUsername: String?, val courseName: String?, val audience: String?, @@ -101,6 +102,7 @@ private fun List.toSarReferral(): List { it.hasReviewedProgrammeHistory, it.additionalInformation, it.submittedOn, + it.overrideReason, it.referrer.username, it.offering.course.name, it.offering.course.audience, diff --git a/src/main/resources/db/migration/V113__update_referral_add_overrride_reason.sql b/src/main/resources/db/migration/V113__update_referral_add_overrride_reason.sql new file mode 100644 index 000000000..21208f3f0 --- /dev/null +++ b/src/main/resources/db/migration/V113__update_referral_add_overrride_reason.sql @@ -0,0 +1,3 @@ + +ALTER TABLE referral + ADD COLUMN override_reason text; \ No newline at end of file diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/common/config/PersistenceHelper.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/common/config/PersistenceHelper.kt index b2f097c31..71b0e126b 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/common/config/PersistenceHelper.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/common/config/PersistenceHelper.kt @@ -90,8 +90,8 @@ class PersistenceHelper { .executeUpdate() } - fun createReferral(referralId: UUID, offeringId: UUID, prisonNumber: String, referrerUsername: String, additionalInformation: String, oasysConfirmed: Boolean, hasReviewedProgrammeHistory: Boolean, status: String, submittedOn: LocalDateTime?, primaryPomStaffId: BigInteger = "1".toBigInteger(), secondaryPomStaffId: BigInteger = "2".toBigInteger()) { - entityManager.createNativeQuery("INSERT INTO referral (referral_id, offering_id, prison_number, referrer_username, additional_information, oasys_confirmed, has_reviewed_programme_history, status, submitted_on, primary_pom_staff_id, secondary_pom_staff_id) VALUES (:id, :offeringId, :prisonNumber, :referrerUsername, :additionalInformation, :oasysConfirmed, :hasReviewedProgrammeHistory, :status, :submittedOn, :primaryPomStaffId, :secondaryPomStaffId)") + fun createReferral(referralId: UUID, offeringId: UUID, prisonNumber: String, referrerUsername: String, additionalInformation: String, oasysConfirmed: Boolean, hasReviewedProgrammeHistory: Boolean, status: String, submittedOn: LocalDateTime?, primaryPomStaffId: BigInteger = "1".toBigInteger(), secondaryPomStaffId: BigInteger = "2".toBigInteger(), overrideReason: String? = null) { + entityManager.createNativeQuery("INSERT INTO referral (referral_id, offering_id, prison_number, referrer_username, additional_information, oasys_confirmed, has_reviewed_programme_history, status, submitted_on, primary_pom_staff_id, secondary_pom_staff_id, override_reason) VALUES (:id, :offeringId, :prisonNumber, :referrerUsername, :additionalInformation, :oasysConfirmed, :hasReviewedProgrammeHistory, :status, :submittedOn, :primaryPomStaffId, :secondaryPomStaffId, :overrideReason)") .setParameter("id", referralId) .setParameter("offeringId", offeringId) .setParameter("prisonNumber", prisonNumber) @@ -103,6 +103,7 @@ class PersistenceHelper { .setParameter("submittedOn", submittedOn) .setParameter("primaryPomStaffId", primaryPomStaffId) .setParameter("secondaryPomStaffId", secondaryPomStaffId) + .setParameter("overrideReason", overrideReason) .executeUpdate() } diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/integration/ReferralControllerIntegrationTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/integration/ReferralControllerIntegrationTest.kt index 1e2cb9c31..4aee1f578 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/integration/ReferralControllerIntegrationTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/integration/ReferralControllerIntegrationTest.kt @@ -180,6 +180,7 @@ class ReferralControllerIntegrationTest : IntegrationTestBase() { hasReviewedProgrammeHistory = false, submittedOn = null, primaryPrisonOffenderManager = null, + overrideReason = null, ) val auditEntity = auditRepository.findAll() @@ -211,6 +212,7 @@ class ReferralControllerIntegrationTest : IntegrationTestBase() { oasysConfirmed = true, hasReviewedProgrammeHistory = true, additionalInformation = "test", + overrideReason = "Scored higher in OSP, should go onto Kaizen", ), ) submitReferral(referralCreated.id) @@ -276,6 +278,7 @@ class ReferralControllerIntegrationTest : IntegrationTestBase() { oasysConfirmed = false, hasReviewedProgrammeHistory = false, submittedOn = null, + overrideReason = null, ) val auditEntity = auditRepository.findAll() @@ -295,6 +298,7 @@ class ReferralControllerIntegrationTest : IntegrationTestBase() { additionalInformation = "Additional information", oasysConfirmed = true, hasReviewedProgrammeHistory = true, + overrideReason = "Override reason", ) updateReferral(referralCreated.id, referralUpdate) @@ -314,6 +318,7 @@ class ReferralControllerIntegrationTest : IntegrationTestBase() { oasysConfirmed = true, hasReviewedProgrammeHistory = true, submittedOn = null, + overrideReason = "Override reason", ) } @@ -329,6 +334,7 @@ class ReferralControllerIntegrationTest : IntegrationTestBase() { additionalInformation = "Additional information", oasysConfirmed = true, hasReviewedProgrammeHistory = true, + overrideReason = "Override reason", ), ) .exchange().expectStatus().isNotFound @@ -380,6 +386,7 @@ class ReferralControllerIntegrationTest : IntegrationTestBase() { oasysConfirmed = false, additionalInformation = null, submittedOn = null, + overrideReason = null, ) } @@ -761,6 +768,7 @@ class ReferralControllerIntegrationTest : IntegrationTestBase() { additionalInformation = "Additional information", oasysConfirmed = true, hasReviewedProgrammeHistory = true, + overrideReason = "Override reason", ) updateReferral(referralCreated.id, referralUpdate) @@ -789,6 +797,7 @@ class ReferralControllerIntegrationTest : IntegrationTestBase() { additionalInformation = "Additional information", oasysConfirmed = true, hasReviewedProgrammeHistory = true, + overrideReason = "Override reason", ) updateReferral(referralCreated.id, referralUpdate) @@ -817,6 +826,7 @@ class ReferralControllerIntegrationTest : IntegrationTestBase() { additionalInformation = "Additional information", oasysConfirmed = true, hasReviewedProgrammeHistory = true, + overrideReason = null, ) updateReferral(referralCreated.id, referralUpdate) @@ -1564,6 +1574,7 @@ class ReferralControllerIntegrationTest : IntegrationTestBase() { courseOrganisation shouldBe offering.organisationId oasysConfirmed shouldBe referralEntity.oasysConfirmed additionalInformation shouldBe referralEntity.additionalInformation + overrideReason shouldBe referralEntity.overrideReason hasReviewedProgrammeHistory shouldBe referralEntity.hasReviewedProgrammeHistory statusCode shouldBe referralEntity.status referrerUsername shouldBe referralEntity.referrer.username diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/unit/domain/entity/factory/ReferralEntityFactory.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/unit/domain/entity/factory/ReferralEntityFactory.kt index 4a2c802bd..201842a47 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/unit/domain/entity/factory/ReferralEntityFactory.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/unit/domain/entity/factory/ReferralEntityFactory.kt @@ -17,6 +17,7 @@ class ReferralEntityFactory { private var hasReviewedProgrammeHistory: Boolean = false private var status: String = REFERRAL_STARTED private var submittedOn: LocalDateTime? = null + private var overrideReason: String? = null fun withId(id: UUID?) = apply { this.id = id } fun withOffering(offering: OfferingEntity) = apply { this.offering = offering } @@ -26,6 +27,7 @@ class ReferralEntityFactory { fun withOasysConfirmed(oasysConfirmed: Boolean) = apply { this.oasysConfirmed = oasysConfirmed } fun withHasReviewedProgrammeHistory(hasReviewedProgrammeHistory: Boolean) = apply { this.hasReviewedProgrammeHistory = hasReviewedProgrammeHistory } fun withStatus(status: String) = apply { this.status = status } + fun withOverrideReason(overrideReason: String?) = apply { this.overrideReason = overrideReason } fun produce() = ReferralEntity( id = this.id, @@ -37,5 +39,6 @@ class ReferralEntityFactory { hasReviewedProgrammeHistory = this.hasReviewedProgrammeHistory, status = this.status, submittedOn = this.submittedOn, + overrideReason = this.overrideReason, ) } diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/unit/restapi/controller/ReferralControllerTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/unit/restapi/controller/ReferralControllerTest.kt index d8e47ad36..29f2c7881 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/unit/restapi/controller/ReferralControllerTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/unit/restapi/controller/ReferralControllerTest.kt @@ -309,6 +309,7 @@ constructor( .withAdditionalInformation("Additional Info") .withOasysConfirmed(true) .withHasReviewedProgrammeHistory(true) + .withOverrideReason("Override Reason") .produce() every { referralService.getReferralById(referral.id!!) } returns referral diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/unit/service/ReferralServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/unit/service/ReferralServiceTest.kt index eeef7c342..08aec793b 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/unit/service/ReferralServiceTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsaccreditedprogrammesapi/unit/service/ReferralServiceTest.kt @@ -466,6 +466,7 @@ class ReferralServiceTest { .withAdditionalInformation("additional info") .withId(referralId) .withStatus(REFERRAL_STARTED) + .withOverrideReason("override reason") .produce() every { referralRepository.getReferenceById(referralId) } returns referral