From 461475c813608266a2b956f8910f72a1862c202d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20H=C3=A4nninen?= Date: Tue, 8 Oct 2024 14:37:32 +0300 Subject: [PATCH] =?UTF-8?q?Mahdollisuus=20rajata=20csv-kyselyst=C3=A4=20po?= =?UTF-8?q?is=20aikajaksot=20ja=20osasuoritukset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ueryOrganisaationOpiskeluoikeudetCsv.scala | 19 +++++++++--- .../OpiskeluoikeusLoaderRowBuilder.scala | 22 ++++++++------ .../massaluovutus/MassaluovutusSpec.scala | 30 ++++++++++++++++++- .../oph/koski/migration/MigrationSpec.scala | 2 +- 4 files changed, 58 insertions(+), 15 deletions(-) diff --git a/src/main/scala/fi/oph/koski/massaluovutus/organisaationopiskeluoikeudet/MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv.scala b/src/main/scala/fi/oph/koski/massaluovutus/organisaationopiskeluoikeudet/MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv.scala index 7d6b7924b0..615099889c 100644 --- a/src/main/scala/fi/oph/koski/massaluovutus/organisaationopiskeluoikeudet/MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv.scala +++ b/src/main/scala/fi/oph/koski/massaluovutus/organisaationopiskeluoikeudet/MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv.scala @@ -39,6 +39,10 @@ case class MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv( muuttunutJälkeen: Option[LocalDateTime] = None, koulutusmuoto: Option[String] = None, mitätöidyt: Option[Boolean] = None, + @Description("Jos true, ei kyselyllä luoda osasuoritustiedostoja") + eiOsasuorituksia: Option[Boolean] = None, + @Description("Jos true, ei kyselyllä luoda opiskeluoikeuden aikajaksotiedostoja") + eiAikajaksoja: Option[Boolean] = None, ) extends MassaluovutusQueryOrganisaationOpiskeluoikeudet { def withOrganisaatioOid(organisaatioOid: Oid): MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv = copy(organisaatioOid = Some(organisaatioOid)) @@ -62,6 +66,9 @@ case class MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv( val esiopetuksenAikajaksoCsv = CsvResultFile.esiopetuksenOpiskeluoikeudenAikajaksot.create(writer, partitionSize) val mitätöityOpiskeluoikeusCsv = CsvResultFile.mitätöidytOpiskeluoikeudet.create(writer, partitionSize) + val includeAikajaksot = !eiAikajaksoja.contains(true) + val includeOsasuoritukset = !eiOsasuorituksia.contains(true) + forEachOpiskeluoikeus(application, filters, oppijaOids) { row => if (row.mitätöity) { OpiskeluoikeusLoaderRowBuilder @@ -69,13 +76,17 @@ case class MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv( .foreach(mitätöityOpiskeluoikeusCsv.put) } else { OpiskeluoikeusLoaderRowBuilder - .buildKoskiRow(row) + .buildKoskiRow(row, includeAikajaksot, includeOsasuoritukset) .foreach { rows => opiskeluoikeusCsv.put(rows.rOpiskeluoikeusRow) rows.rPäätasonSuoritusRows.foreach(row => päätasonSuoritusCsv.put(new CsvPäätasonSuoritus(row))) - rows.rOsasuoritusRows.foreach(row => osasuoritusCsv.put(new CsvOsauoritus(row))) - opiskeluoikeudenAikajaksoCsv.put(rows.rOpiskeluoikeusAikajaksoRows) - esiopetuksenAikajaksoCsv.put(rows.esiopetusOpiskeluoikeusAikajaksoRows) + if (includeOsasuoritukset) { + rows.rOsasuoritusRows.foreach(row => osasuoritusCsv.put(new CsvOsauoritus(row))) + } + if (includeAikajaksot) { + opiskeluoikeudenAikajaksoCsv.put(rows.rOpiskeluoikeusAikajaksoRows) + esiopetuksenAikajaksoCsv.put(rows.esiopetusOpiskeluoikeusAikajaksoRows) + } } } } diff --git a/src/main/scala/fi/oph/koski/raportointikanta/OpiskeluoikeusLoaderRowBuilder.scala b/src/main/scala/fi/oph/koski/raportointikanta/OpiskeluoikeusLoaderRowBuilder.scala index d850a0b855..fb0a3f90b8 100644 --- a/src/main/scala/fi/oph/koski/raportointikanta/OpiskeluoikeusLoaderRowBuilder.scala +++ b/src/main/scala/fi/oph/koski/raportointikanta/OpiskeluoikeusLoaderRowBuilder.scala @@ -38,14 +38,14 @@ object OpiskeluoikeusLoaderRowBuilder extends Logging { sisältyvätKokeet: List[YlioppilastutkinnonSisältyväKoe] ) - def buildKoskiRow(inputRow: OpiskeluoikeusRow): Either[LoadErrorResult, KoskiOutputRows] = { + def buildKoskiRow(inputRow: OpiskeluoikeusRow, includeAikajaksot: Boolean = true, includeOsasuoritukset: Boolean = true): Either[LoadErrorResult, KoskiOutputRows] = { Try { val toOpiskeluoikeusUnsafeStartTime = System.nanoTime() val oo = inputRow.toOpiskeluoikeusUnsafe(KoskiSpecificSession.systemUser) val toOpiskeluoikeusUnsafeDuration = System.nanoTime() - toOpiskeluoikeusUnsafeStartTime val ooRow = buildROpiskeluoikeusRow(inputRow.oppijaOid, inputRow.aikaleima, oo, inputRow.data) - val aikajaksoRows: AikajaksoRows = buildAikajaksoRows(inputRow.oid, oo) + val aikajaksoRows: AikajaksoRows = if (includeAikajaksot) buildAikajaksoRows(inputRow.oid, oo) else (Nil, Nil) val suoritusRows: KoskiSuoritusRows = oo.suoritukset.zipWithIndex.map { case (ps, i) => OpiskeluoikeusLoaderRowBuilder.buildKoskiSuoritusRows( inputRow.oid, @@ -53,7 +53,8 @@ object OpiskeluoikeusLoaderRowBuilder extends Logging { oo.getOppilaitos, ps, (inputRow.data \ "suoritukset") (i), - suoritusIds.incrementAndGet + suoritusIds.incrementAndGet, + includeOsasuoritukset ) } KoskiOutputRows( @@ -200,7 +201,8 @@ object OpiskeluoikeusLoaderRowBuilder extends Logging { oppilaitos: OrganisaatioWithOid, ps: PäätasonSuoritus, data: JValue, - idGenerator: => Long + idGenerator: => Long, + includeOsasuoritukset: Boolean = true ): ( RPäätasonSuoritusRow, List[ROsasuoritusRow], @@ -210,15 +212,17 @@ object OpiskeluoikeusLoaderRowBuilder extends Logging { { val päätasonSuoritusId: Long = idGenerator val päätaso = buildRPäätasonSuoritusRow(opiskeluoikeusOid, sisältyyOpiskeluoikeuteenOid, oppilaitos, ps, data, päätasonSuoritusId) - val osat = ps.osasuoritukset.getOrElse(List.empty).zipWithIndex.flatMap { - case (os, i) => buildROsasuoritusRow(päätasonSuoritusId, None, opiskeluoikeusOid, sisältyyOpiskeluoikeuteenOid, os, (data \ "osasuoritukset")(i), idGenerator) - } + val osat = if (includeOsasuoritukset) { + ps.osasuoritukset.getOrElse(List.empty).zipWithIndex.flatMap { + case (os, i) => buildROsasuoritusRow(päätasonSuoritusId, None, opiskeluoikeusOid, sisältyyOpiskeluoikeuteenOid, os, (data \ "osasuoritukset")(i), idGenerator) + } + } else { Nil } val muuAmmatillinenRaportointi = ps match { - case s: MuunAmmatillisenKoulutuksenSuoritus => s.rekursiivisetOsasuoritukset.map(MuuAmmatillinenRaporttiRowBuilder.build(opiskeluoikeusOid, päätasonSuoritusId, _)) + case s: MuunAmmatillisenKoulutuksenSuoritus if includeOsasuoritukset => s.rekursiivisetOsasuoritukset.map(MuuAmmatillinenRaporttiRowBuilder.build(opiskeluoikeusOid, päätasonSuoritusId, _)) case _ => Nil } val topksAmmatillinenRaportointi = ps match { - case s: TutkinnonOsaaPienemmistäKokonaisuuksistaKoostuvaSuoritus => s.rekursiivisetOsasuoritukset.map(TOPKSAmmatillinenRaporttiRowBuilder.build(opiskeluoikeusOid, päätasonSuoritusId, _)) + case s: TutkinnonOsaaPienemmistäKokonaisuuksistaKoostuvaSuoritus if includeOsasuoritukset => s.rekursiivisetOsasuoritukset.map(TOPKSAmmatillinenRaporttiRowBuilder.build(opiskeluoikeusOid, päätasonSuoritusId, _)) case _ => Nil } (päätaso, osat, muuAmmatillinenRaportointi, topksAmmatillinenRaportointi) diff --git a/src/test/scala/fi/oph/koski/massaluovutus/MassaluovutusSpec.scala b/src/test/scala/fi/oph/koski/massaluovutus/MassaluovutusSpec.scala index 93ea7d7f77..b8dc479026 100644 --- a/src/test/scala/fi/oph/koski/massaluovutus/MassaluovutusSpec.scala +++ b/src/test/scala/fi/oph/koski/massaluovutus/MassaluovutusSpec.scala @@ -26,6 +26,7 @@ import java.net.URL import java.sql.Timestamp import java.time.{Duration, LocalDate, LocalDateTime} import java.util.UUID +import scala.util.matching.Regex class MassaluovutusSpec extends AnyFreeSpec with KoskiHttpSpec with Matchers with BeforeAndAfterAll with BeforeAndAfterEach { val app = KoskiApplicationForTests @@ -259,7 +260,6 @@ class MassaluovutusSpec extends AnyFreeSpec with KoskiHttpSpec with Matchers wit } "Partitioitu kysely palauttaa oikean määrän tiedostoja" in { - AuditLogTester.clearMessages() val user = MockUsers.helsinkiKatselija val partitionedQuery = query.copy(format = QueryFormat.csvPartition) val queryId = addQuerySuccessfully(partitionedQuery, user) { response => @@ -272,6 +272,34 @@ class MassaluovutusSpec extends AnyFreeSpec with KoskiHttpSpec with Matchers wit complete.files should have length 18 complete.files.foreach(verifyResult(_, user)) } + + "Osasuorituksia ei palauteta, jos niistä ollaan opt-outattu" in { + val user = MockUsers.helsinkiKatselija + val eiOsasuorituksiaQuery = query.copy(eiOsasuorituksia = Some(true)) + val queryId = addQuerySuccessfully(eiOsasuorituksiaQuery, user) { response => + response.status should equal(QueryState.pending) + response.query.asInstanceOf[MassaluovutusQueryOrganisaationOpiskeluoikeudet].organisaatioOid should contain(MockOrganisaatiot.helsinginKaupunki) + response.queryId + } + val complete = waitForCompletion(queryId, user) + + complete.files.filter(_.contains("osasuoritus")) should equal(List.empty) + complete.files.filter(_.contains("aikajakso")) should have length 2 + } + + "Aikajaksoja ei palauteta, jos niistä ollaan opt-outattu" in { + val user = MockUsers.helsinkiKatselija + val eiAikajaksojaQuery = query.copy(eiAikajaksoja = Some(true)) + val queryId = addQuerySuccessfully(eiAikajaksojaQuery, user) { response => + response.status should equal(QueryState.pending) + response.query.asInstanceOf[MassaluovutusQueryOrganisaationOpiskeluoikeudet].organisaatioOid should contain(MockOrganisaatiot.helsinginKaupunki) + response.queryId + } + val complete = waitForCompletion(queryId, user) + + complete.files.filter(_.contains("aikajakso")) should equal(List.empty) + complete.files.filter(_.contains("osasuoritus")) should have length 1 + } } } diff --git a/src/test/scala/fi/oph/koski/migration/MigrationSpec.scala b/src/test/scala/fi/oph/koski/migration/MigrationSpec.scala index 5610679643..6acdcca55d 100644 --- a/src/test/scala/fi/oph/koski/migration/MigrationSpec.scala +++ b/src/test/scala/fi/oph/koski/migration/MigrationSpec.scala @@ -56,7 +56,7 @@ class MigrationSpec extends AnyFreeSpec with Matchers with RaportointikantaTestM "RaportointikantaTestServlet.scala" -> "d457be86e60dd84545378ae415236d26", "RaportointikantaTableQueries.scala" -> "f2f26c217992539c1e61dcbd031fc642", "TOPKSAmmatillinenRaporttiRowBuilder.scala" -> "a9c26a13385ff576810f3ef831240437", - "OpiskeluoikeusLoaderRowBuilder.scala" -> "e3a98a9b54db53d331c19289de89b99", + "OpiskeluoikeusLoaderRowBuilder.scala" -> "1fbd065ec7c936bbd900b5b8b45473c9", "IncrementalUpdateOpiskeluoikeusLoader.scala" -> "60c3fe0ffb2e2cde5dfc013954c491be", "FullReloadOpiskeluoikeusLoader.scala" -> "319c856f45120917695493852bfda577", "VipunenExport.scala" -> "9563ec86b4214f871fbd085e44c048cb",