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

PI-2266: Extra staff details for ap #3953

Merged
merged 5 commits into from
Jun 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions projects/approved-premises-and-delius/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@ dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.boot:spring-boot-starter-data-ldap")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation(libs.springdoc)

dev(project(":libs:dev-tools"))
dev("com.unboundid:unboundid-ldapsdk")
dev("com.h2database:h2")
dev("org.testcontainers:oracle-xe")

Expand Down
3 changes: 3 additions & 0 deletions projects/approved-premises-and-delius/deploy/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ generic-service:
namespace_secrets:
common:
SPRING_DATASOURCE_URL: DB_URL
SPRING_LDAP_URLS: LDAP_URL
SPRING_LDAP_USERNAME: LDAP_USERNAME
SPRING_LDAP_PASSWORD: LDAP_PASSWORD
approved-premises-and-delius-client-credentials:
OAUTH2_CLIENT-ID: CLIENT_ID
OAUTH2_CLIENT-SECRET: CLIENT_SECRET
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import uk.gov.justice.digital.hmpps.integrations.delius.contact.type.ContactType
import uk.gov.justice.digital.hmpps.integrations.delius.document.DocumentRepository
import uk.gov.justice.digital.hmpps.integrations.delius.location.OfficeLocationRepository
import uk.gov.justice.digital.hmpps.integrations.delius.nonstatutoryintervention.entity.*
import uk.gov.justice.digital.hmpps.integrations.delius.person.BoroughRepository
import uk.gov.justice.digital.hmpps.integrations.delius.person.PersonRepository
import uk.gov.justice.digital.hmpps.integrations.delius.person.address.PersonAddressRepository
import uk.gov.justice.digital.hmpps.integrations.delius.person.manager.probation.PersonManagerRepository
Expand Down Expand Up @@ -69,8 +70,10 @@ class DataLoader(
private val lduRepository: LduRepository,
private val staffUserRepository: StaffUserRepository,
private val documentRepository: DocumentRepository,
private val referralBookingDataLoader: ReferralBookingDataLoader
) : ApplicationListener<ApplicationReadyEvent> {
private val boroughRepository: BoroughRepository,
private val referralBookingDataLoader: ReferralBookingDataLoader,

) : ApplicationListener<ApplicationReadyEvent> {

@PostConstruct
fun saveAuditUser() {
Expand All @@ -85,7 +88,7 @@ class DataLoader(
registerTypeRepository.saveAll(ReferenceDataGenerator.REGISTER_TYPES.values)

addressRepository.saveAll(listOf(AddressGenerator.Q001, AddressGenerator.Q002, AddressGenerator.Q710))

boroughRepository.save(ProbationCaseGenerator.BOROUGH)
probationAreaRepository.save(ProbationAreaGenerator.DEFAULT)
approvedPremisesRepository.save(ApprovedPremisesGenerator.DEFAULT)
// add a duplicate AP for testing selectable query
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package uk.gov.justice.digital.hmpps.data.generator

import uk.gov.justice.digital.hmpps.integrations.approvedpremises.AssessedBy
import uk.gov.justice.digital.hmpps.integrations.approvedpremises.ProbationArea
import uk.gov.justice.digital.hmpps.integrations.approvedpremises.StaffMember
import uk.gov.justice.digital.hmpps.integrations.delius.probationarea.ProbationArea

object AssessedByGenerator {
fun generate(
staffMember: StaffMember = StaffMemberGenerator.DEFAULT,
probationArea: ProbationArea = ProbationAreaGenerator.DEFAULT
probationArea: ProbationArea = ProbationArea(
ProbationAreaGenerator.DEFAULT.code,
ProbationAreaGenerator.DEFAULT.description
)
) = AssessedBy(
staffMember = staffMember,
probationArea = probationArea
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,15 @@ package uk.gov.justice.digital.hmpps.data.generator
import uk.gov.justice.digital.hmpps.data.generator.ProbationCaseGenerator.COM_PROVIDER
import uk.gov.justice.digital.hmpps.data.generator.ProbationCaseGenerator.COM_TEAM
import uk.gov.justice.digital.hmpps.data.generator.ProbationCaseGenerator.COM_UNALLOCATED
import uk.gov.justice.digital.hmpps.integrations.delius.person.CommunityManager
import uk.gov.justice.digital.hmpps.integrations.delius.person.CommunityManagerTeam
import uk.gov.justice.digital.hmpps.integrations.delius.person.Ldu
import uk.gov.justice.digital.hmpps.integrations.delius.person.ProbationCase
import uk.gov.justice.digital.hmpps.integrations.delius.person.*
import uk.gov.justice.digital.hmpps.integrations.delius.referencedata.ReferenceData
import uk.gov.justice.digital.hmpps.integrations.delius.team.Team
import java.time.LocalDate

object ProbationCaseGenerator {
val COM_PROVIDER = ProbationAreaGenerator.generate("N01")
val COM_PROVIDER = ProbationAreaGenerator.generate(code = "N01", description = "N01 Description")
val BOROUGH = generateBorough("B1", "Borough 1")

val COM_LDU = generateLdu("N01LDU", "COM LDU")
val COM_TEAM = generateComTeam("N01COM", "Community Manager Team", COM_LDU)
val COM_UNALLOCATED = StaffGenerator.generate("Unallocated", "N01COMU")
Expand Down Expand Up @@ -88,11 +87,12 @@ object ProbationCaseGenerator {
id
)

fun generateBorough(code: String, description: String) = Borough(IdGenerator.getAndIncrement(), code, description)
fun generateLdu(code: String, description: String = "LDU of $code", id: Long = IdGenerator.getAndIncrement()) =
Ldu(code, description, id)
Ldu(code, description, BOROUGH, id)

fun generateComTeam(code: String, description: String, ldu: Ldu, id: Long = IdGenerator.getAndIncrement()) =
CommunityManagerTeam(code, description, ldu, id)
CommunityManagerTeam(code, description, ldu, LocalDate.now(), null, id)

fun generateManager(
pc: ProbationCase,
Expand All @@ -104,6 +104,6 @@ object ProbationCaseGenerator {
}

fun ProbationCase.asPerson() = PersonGenerator.generate(crn, id)
fun CommunityManagerTeam.asTeam() = Team(id, code, description, COM_PROVIDER, null, ldu.id)
fun CommunityManagerTeam.asTeam() = Team(id, code, description, COM_PROVIDER, null, ldu)
fun CommunityManager.asPersonManager() =
PersonManagerGenerator.generate(person.asPerson(), COM_TEAM.asTeam(), COM_UNALLOCATED, id)
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import java.util.concurrent.atomic.AtomicLong

object StaffGenerator {
private val staffCodeGenerator = AtomicLong(1)
val DEFAULT_STAFF = generate()
val DEFAULT_STAFF = generate(teams = listOf(TeamGenerator.NON_APPROVED_PREMISES_TEAM))
val JIM_SNOW = generate(
name = "Jim Snow"
)
Expand All @@ -19,7 +19,7 @@ object StaffGenerator {
val JIM_SNOW_USER = generateStaffUser("JIMSNOWLDAP", JIM_SNOW)

fun generate(
name: String = "TEST",
name: String = "Test",
code: String = "TEST${staffCodeGenerator.getAndIncrement().toString().padStart(3, '0')}",
teams: List<Team> = listOf(),
approvedPremises: List<ApprovedPremises> = listOf()
Expand All @@ -31,7 +31,8 @@ object StaffGenerator {
middleName = null,
surname = name,
teams = teams,
approvedPremises = approvedPremises
approvedPremises = approvedPremises,
probationArea = ProbationAreaGenerator.DEFAULT
)

fun generateStaffUser(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package uk.gov.justice.digital.hmpps.data.generator

import uk.gov.justice.digital.hmpps.integrations.approvedpremises.ProbationArea
import uk.gov.justice.digital.hmpps.integrations.approvedpremises.StaffMember
import uk.gov.justice.digital.hmpps.integrations.approvedpremises.SubmittedBy
import uk.gov.justice.digital.hmpps.integrations.delius.probationarea.ProbationArea

object SubmittedByGenerator {
fun generate(
staffMember: StaffMember = StaffMemberGenerator.DEFAULT,
probationArea: ProbationArea = ProbationAreaGenerator.DEFAULT
probationArea: ProbationArea = ProbationArea(
ProbationAreaGenerator.DEFAULT.code,
ProbationAreaGenerator.DEFAULT.description
)
) = SubmittedBy(
staffMember = staffMember,
probationArea = probationArea
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package uk.gov.justice.digital.hmpps.data.generator

import uk.gov.justice.digital.hmpps.integrations.delius.approvedpremises.entity.ApprovedPremises
import uk.gov.justice.digital.hmpps.integrations.delius.person.Ldu
import uk.gov.justice.digital.hmpps.integrations.delius.probationarea.ProbationArea
import uk.gov.justice.digital.hmpps.integrations.delius.team.Team
import java.util.concurrent.atomic.AtomicLong
Expand All @@ -19,20 +20,20 @@ object TeamGenerator {
approvedPremises: ApprovedPremises? = null,
code: String = "N54${teamCodeGenerator.getAndIncrement().toString().padStart(3, '0')}",
description: String = "Description of Team $code",
districtId: Long = AP_TEAM_LDU.id
district: Ldu = AP_TEAM_LDU
) = Team(
id = IdGenerator.getAndIncrement(),
code = code,
description = description,
probationArea = ProbationAreaGenerator.DEFAULT,
approvedPremises = approvedPremises,
districtId
district = district
)
}

object ProbationAreaGenerator {
val DEFAULT = generate("N54")
val DEFAULT = generate(code = "N54", description = "A description")

fun generate(code: String, id: Long = IdGenerator.getAndIncrement()) =
ProbationArea(id, code)
fun generate(code: String, id: Long = IdGenerator.getAndIncrement(), description: String) =
ProbationArea(id, code, description)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
dn: ou=Users,dc=moj,dc=com
objectclass: top
objectclass: organizationalUnit
ou: Users

dn: cn=john-smith,ou=Users,dc=moj,dc=com
objectclass: top
objectclass: inetOrgPerson
cn: john-smith
sn: Smith
givenname: John
mail: john.smith@moj.gov.uk
telephoneNumber: 07321165373
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,13 @@ class ProbationCaseIntegrationTest {
assertTrue(detail.case.currentRestriction)
assertThat(
detail.case.manager.team,
equalTo(Team(COM_TEAM.code, COM_TEAM.description, Ldu(COM_TEAM.ldu.code, COM_TEAM.ldu.description)))
equalTo(
Team(
COM_TEAM.code, COM_TEAM.description, Ldu(COM_TEAM.ldu.code, COM_TEAM.ldu.description), Borough(
COM_TEAM.ldu.borough.code, COM_TEAM.ldu.borough.description
), COM_TEAM.startDate, COM_TEAM.endDate
)
)
)
assertThat(detail.mappaDetail?.category, equalTo(3))
assertThat(detail.mappaDetail?.level, equalTo(2))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package uk.gov.justice.digital.hmpps

import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.equalTo
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
Expand All @@ -12,6 +13,8 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPat
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
import uk.gov.justice.digital.hmpps.data.generator.ApprovedPremisesGenerator
import uk.gov.justice.digital.hmpps.data.generator.StaffGenerator
import uk.gov.justice.digital.hmpps.model.StaffDetail
import uk.gov.justice.digital.hmpps.test.MockMvcExtensions.contentAsJson
import uk.gov.justice.digital.hmpps.test.MockMvcExtensions.withToken

@AutoConfigureMockMvc
Expand Down Expand Up @@ -69,11 +72,24 @@ class StaffControllerIntegrationTest {
@Test
fun `Get staff by username`() {
val username = StaffGenerator.DEFAULT_STAFF.user!!.username
mockMvc.perform(get("/staff/$username").withToken())
.andExpect(status().isOk)
.andExpect(jsonPath("$.username", equalTo(username)))
.andExpect(jsonPath("$.name.surname", equalTo(StaffGenerator.DEFAULT_STAFF.surname)))
.andExpect(jsonPath("$.name.forename", equalTo(StaffGenerator.DEFAULT_STAFF.forename)))
.andExpect(jsonPath("$.code", equalTo(StaffGenerator.DEFAULT_STAFF.code)))
val res = mockMvc.perform(get("/staff/$username").withToken())
.andExpect(status().isOk).andReturn().response.contentAsJson<StaffDetail>()
assertThat(res.username, equalTo(username))
assertThat(res.name.surname, equalTo(StaffGenerator.DEFAULT_STAFF.surname))
assertThat(res.name.forename, equalTo(StaffGenerator.DEFAULT_STAFF.forename))
assertThat(res.code, equalTo(StaffGenerator.DEFAULT_STAFF.code))
assertThat(res.email, equalTo("john.smith@moj.gov.uk"))
assertThat(res.telephoneNumber, equalTo("07321165373"))
assertThat(res.staffIdentifier, equalTo(StaffGenerator.DEFAULT_STAFF.id))
assertThat(res.teams[0].borough?.code, equalTo(StaffGenerator.DEFAULT_STAFF.teams[0].district.borough.code))
assertThat(
res.teams[0].borough?.description,
equalTo(StaffGenerator.DEFAULT_STAFF.teams[0].district.borough.description)
)
assertThat(res.teams[0].startDate, equalTo(StaffGenerator.DEFAULT_STAFF.teams[0].startDate))
assertThat(res.teams[0].endDate, equalTo(StaffGenerator.DEFAULT_STAFF.teams[0].endDate))
assertThat(res.probationArea.code, equalTo(StaffGenerator.DEFAULT_STAFF.probationArea.code))
assertThat(res.probationArea.description, equalTo(StaffGenerator.DEFAULT_STAFF.probationArea.description))
assertThat(res.active, equalTo(true))
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package uk.gov.justice.digital.hmpps.integrations.approvedpremises

import com.fasterxml.jackson.annotation.JsonAlias
import uk.gov.justice.digital.hmpps.integrations.delius.probationarea.ProbationArea
import uk.gov.justice.digital.hmpps.integrations.delius.referencedata.ReleaseType
import uk.gov.justice.digital.hmpps.integrations.delius.referencedata.SentenceType
import java.time.LocalDate
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ package uk.gov.justice.digital.hmpps.integrations.approvedpremises

data class ProbationArea(
val code: String,
val name: String
val name: String,
)
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
package uk.gov.justice.digital.hmpps.integrations.delius.person

import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.JoinColumn
import jakarta.persistence.ManyToOne
import jakarta.persistence.OneToMany
import jakarta.persistence.Table
import jakarta.persistence.*
import org.hibernate.annotations.Immutable
import org.hibernate.annotations.SQLRestriction
import org.springframework.data.jpa.repository.EntityGraph
Expand Down Expand Up @@ -124,6 +118,12 @@ class CommunityManagerTeam(
@JoinColumn(name = "district_id")
val ldu: Ldu,

@Column(name = "start_date")
val startDate: LocalDate = LocalDate.now(),

@Column(name = "end_date")
val endDate: LocalDate? = null,

@Id
@Column(name = "team_id")
val id: Long
Expand All @@ -139,11 +139,33 @@ class Ldu(

val description: String,

@ManyToOne
@JoinColumn(name = "borough_id")
val borough: Borough,

@Id
@Column(name = "district_id")
val id: Long
)

@Immutable
@Entity
@Table(name = "borough")
class Borough(

@Id
@Column(name = "borough_id")
val id: Long,

@Column(name = "code")
val code: String,

@Column(name = "description")
val description: String
)

interface BoroughRepository : JpaRepository<Borough, Long>

interface ProbationCaseRepository : JpaRepository<ProbationCase, Long> {
@EntityGraph(attributePaths = ["gender", "ethnicity", "nationality", "religion", "genderIdentity", "communityManagers.team.ldu"])
fun findByCrnIn(crns: List<String>): List<ProbationCase>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,7 @@ class ProbationArea(
val id: Long,

@Column(columnDefinition = "char(3)")
val code: String
val code: String,

val description: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package uk.gov.justice.digital.hmpps.integrations.delius.staff

import org.springframework.ldap.odm.annotations.Attribute
import org.springframework.ldap.odm.annotations.DnAttribute
import org.springframework.ldap.odm.annotations.Entry
import org.springframework.ldap.odm.annotations.Id
import javax.naming.Name

@Entry(objectClasses = ["inetOrgPerson", "top"])
class LdapUser(

@Id
val dn: Name,

@Attribute(name = "sn")
val surname: String,

@Attribute(name = "givenName")
val forename: String,

@Attribute(name = "cn")
@DnAttribute(value = "cn", index = 0)
val username: String,

@Attribute(name = "telephoneNumber")
val telephoneNumber: String?,

@Attribute(name = "mail")
val email: String?,
)
Loading