Skip to content

Commit

Permalink
Merge pull request #6311 from espoon-voltti/placement-tool-existing-a…
Browse files Browse the repository at this point in the history
…pplications

Lisätään ehdottavan esiopetushakemuksen luontiin tarkistus olemassa olevista hakemuksista
  • Loading branch information
patari authored Jan 30, 2025
2 parents cf12ef3 + 6f1d6cc commit 1ab5b24
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,10 @@ export default React.memo(function PlacementToolPage() {
files={[]}
validateHandler={placementFileValidate}
getValidationResult={(validation) =>
i18n.placementTool.validation(validation.count)
i18n.placementTool.validation(
validation.count,
validation.existing
)
}
uploadHandler={placementFileUpload}
getDownloadUrl={() => ''}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ const upload =

export interface PlacementToolValidation {
count: number
existing: number
}

export const placementFileValidate: ValidateHandler<PlacementToolValidation> = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5085,7 +5085,8 @@ export const fi = {
preschoolTermNotification: 'Hakemukset luodaan seuravaan esiopetuskauteen:',
preschoolTermWarning:
'eVakasta puuttuu seuraavan esiopetuskauden määrittely. Esiopetuskausi tarvitaan hakemusten luontia varten.',
validation: (count: number) => `Olet tuomassa ${count} sijoitusta, jatka?`
validation: (count: number, existing: number) =>
`Olet tuomassa ${count} sijoitusta${existing > 0 ? ` (joista ${existing} löytyy jo järjestelmästä)` : ''}, jatka?`
},
outOfOffice: {
menu: 'Johtajan poissaolojakso',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -446,11 +446,7 @@ class PlacementToolServiceIntegrationTest : FullApplicationTest(resetDbBeforeEac
)
)
db.transaction { tx -> tx.insert(testFeeThresholds) }

controller.createPlacementToolApplications(
dbInstance(),
admin,
clock,
val file =
MockMultipartFile(
"test.csv",
"""
Expand All @@ -459,8 +455,14 @@ ${child.ssn!!};${unit.id}
"""
.trimIndent()
.toByteArray(StandardCharsets.UTF_8),
),
)
)

val validationPre =
controller.validatePlacementToolApplications(dbInstance(), admin, clock, file)
assertEquals(1, validationPre.count)
assertEquals(0, validationPre.existing)

controller.createPlacementToolApplications(dbInstance(), admin, clock, file)
asyncJobRunner.runPendingJobsSync(clock)

val applicationSummaries =
Expand All @@ -473,6 +475,11 @@ ${child.ssn!!};${unit.id}
assertEquals(summary.preferredUnitId, unit.id)
val child = db.read { it.getPersonBySSN(child.ssn!!) }
assertEquals(summary.childId, child!!.id)

val validationPost =
controller.validatePlacementToolApplications(dbInstance(), admin, clock, file)
assertEquals(1, validationPost.count)
assertEquals(1, validationPost.existing)
}

@Test
Expand All @@ -487,11 +494,7 @@ ${child.ssn!!};${unit.id}
)
)
db.transaction { tx -> tx.insert(testFeeThresholds) }

controller.createPlacementToolApplications(
dbInstance(),
admin,
clock,
val file =
MockMultipartFile(
"test.csv",
"""
Expand All @@ -500,8 +503,14 @@ ${child.ssn!!};${unit.id}
"""
.trimIndent()
.toByteArray(StandardCharsets.UTF_8),
),
)
)

val validationPre =
controller.validatePlacementToolApplications(dbInstance(), admin, clock, file)
assertEquals(1, validationPre.count)
assertEquals(0, validationPre.existing)

controller.createPlacementToolApplications(dbInstance(), admin, clock, file)
asyncJobRunner.runPendingJobsSync(clock)

val applicationSummaries =
Expand All @@ -514,6 +523,11 @@ ${child.ssn!!};${unit.id}
assertEquals(summary.preferredUnitId, unit.id)
val child = db.read { it.getPersonBySSN(child.ssn!!) }
assertEquals(summary.childId, child!!.id)

val validationPost =
controller.validatePlacementToolApplications(dbInstance(), admin, clock, file)
assertEquals(1, validationPost.count)
assertEquals(1, validationPost.existing)
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,14 @@ class PlacementToolController(
@RequestPart("file") file: MultipartFile,
): PlacementToolValidation {
return db.connect { dbc ->
dbc.transaction { tx ->
dbc.read { tx ->
accessControl.requirePermissionFor(
tx,
user,
clock,
Action.Global.PLACEMENT_TOOL,
)
val placements = file.inputStream.use { parsePlacementToolCsv(it) }
PlacementToolValidation(count = placements.size)
placementToolService.validatePlacementToolApplications(tx, clock, file)
}
}
.also { Audit.PlacementToolValidate.log() }
Expand Down Expand Up @@ -101,4 +100,4 @@ class PlacementToolController(
}
}

data class PlacementToolValidation(val count: Int)
data class PlacementToolValidation(val count: Int, val existing: Int)
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,35 @@ class PlacementToolService(
asyncJobRunner.registerHandler(::createPlacementToolApplicationsFromSsn)
}

fun validatePlacementToolApplications(
tx: Database.Read,
clock: EvakaClock,
file: MultipartFile,
): PlacementToolValidation {
val placements = file.inputStream.use { parsePlacementToolCsv(it) }
val (socialSecurityNumbers, personIds) =
placements.keys
.partition { isValidSSN(it) }
.let { it.first to it.second.map { id -> PersonId(UUID.fromString(id)) } }
val term =
findNextPreschoolTerm(tx, clock.today()) ?: error("Next preschool term not found")
val existing =
tx.createQuery {
sql(
"""
SELECT count(DISTINCT child.id)
FROM application
JOIN person child ON application.child_id = child.id
WHERE application.type = 'PRESCHOOL'
AND (application.document ->> 'preferredStartDate')::date = ${bind(term.finnishPreschool.start)}
AND (child.social_security_number = ANY (${bind(socialSecurityNumbers)}) OR child.id = ANY(${bind(personIds)}))
"""
)
}
.exactlyOne<Int>()
return PlacementToolValidation(count = placements.size, existing = existing)
}

fun doCreatePlacementToolApplications(
db: Database.Connection,
clock: EvakaClock,
Expand Down

0 comments on commit 1ab5b24

Please sign in to comment.