Skip to content

Commit

Permalink
OY-4825 ei huomioida koskidatan jääluokalle-tietoa 9-luokalla jos on …
Browse files Browse the repository at this point in the history
…perusopetuksen oppimäärä valmis
  • Loading branch information
marjakari committed May 14, 2024
1 parent e8266f4 commit dfd23a9
Show file tree
Hide file tree
Showing 7 changed files with 9,237 additions and 144 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,6 @@ class KoskiDataHandler(

implicit val localDateOrdering: Ordering[LocalDate] = _ compareTo _

private def loytyykoHylattyja(suoritus: KoskiSuoritus): Boolean = {
suoritus.osasuoritukset.exists(_.arviointi.exists(_.hyväksytty.contains(false)))
}

private def shouldSaveSuoritus(
henkiloOid: String,
suoritus: KoskiSuoritus,
Expand Down Expand Up @@ -379,13 +375,6 @@ class KoskiDataHandler(
}
}

private def arvosanaForSuoritus(
arvosana: Arvosana,
s: Suoritus with Identified[UUID]
): Arvosana = {
arvosana.copy(suoritus = s.id)
}

private def saveArvosana(arvosana: Arvosana): Future[Any] = {
(arvosanaRekisteri ? arvosana).recoverWith { case t: AskTimeoutException =>
logger.error(
Expand All @@ -396,14 +385,6 @@ class KoskiDataHandler(
}
}

private def arvosanaToInsertResource(
arvosana: Arvosana,
suoritus: Suoritus with Identified[UUID],
personOidsWithAliases: PersonOidsWithAliases
) = {
InsertResource[UUID, Arvosana](arvosanaForSuoritus(arvosana, suoritus), personOidsWithAliases)
}

private def getAliases(personOidsWithAliases: PersonOidsWithAliases): Set[String] = {
// assuming that there is only one personOid in the structure
personOidsWithAliases.aliasesByPersonOids.values.head
Expand Down Expand Up @@ -908,8 +889,3 @@ case class SuoritusLuokka(
lasnaDate: LocalDate,
luokkataso: Option[String] = None
)

case class MultipleSuoritusException(henkiloOid: String, myontaja: String, komo: String)
extends Exception(
s"Multiple suoritus found for henkilo $henkiloOid by myontaja $myontaja with komo $komo."
)
Original file line number Diff line number Diff line change
Expand Up @@ -329,13 +329,40 @@ class KoskiSuoritusArvosanaParser {
}
}

private def isFailedNinthGrade(suoritukset: Seq[KoskiSuoritus]): Boolean = {
private def hasFailedNinthGrade(suoritukset: Seq[KoskiSuoritus]): Boolean = {
val ysiluokat = suoritukset.filter(_.koulutusmoduuli.isNinthGrade())
val failed = ysiluokat.exists(_.jääLuokalle.getOrElse(false))
// tämä taitaa olla turha koska uusittuna läpäisty 9-luokka ei oletettavasti näy 9-luokan suorituksena
// vaan päättötodistuksena
val succeeded = ysiluokat.exists(_.jääLuokalle.getOrElse(false) == false)
failed && !succeeded
}

private def isFailedNinthGrade(suoritus: KoskiSuoritus): Boolean = {
val ysiluokka = suoritus.koulutusmoduuli.isNinthGrade()
val jaaluokalle = suoritus.jääLuokalle.getOrElse(false) == true
ysiluokka && jaaluokalle
}

private def isVahvistettuPerusopetus(suoritukset: Seq[KoskiSuoritus]): Boolean = {
val vahvistettuPerusopetus = suoritukset
.filter(_.isPerusopetuksenoppimaara())
.filter(s =>
s.vahvistus.isDefined &&
s.vahvistus.exists(v => {
val valmistumispaiva = parseLocalDate(v.päivä)
!valmistumispaiva.isAfter(KoskiUtil.deadlineDate)
})
)
!vahvistettuPerusopetus.isEmpty
}
private def isValmisPerusopetus(opiskeluoikeus: KoskiOpiskeluoikeus): Boolean = {
opiskeluoikeus.tyyppi.exists(
_.koodiarvo == "perusopetus"
) && opiskeluoikeus.tila.opiskeluoikeusjaksot.exists(jakso =>
jakso.tila.koodiarvo.contentEquals("valmistunut")
)
}
private def perusopetuksenArvosanatSisaltavatNelosia(arvosanat: Seq[Arvosana]): Boolean = {
arvosanat.exists(a =>
a.arvio match {
Expand All @@ -352,7 +379,10 @@ class KoskiSuoritusArvosanaParser {
opiskeluoikeus: KoskiOpiskeluoikeus
): Seq[SuoritusArvosanat] = {
var result = Seq[SuoritusArvosanat]()
val failedNinthGrade = isFailedNinthGrade(suoritukset)
val valmisPerusopetus = isValmisPerusopetus(opiskeluoikeus)
val vahvistettuPerusopetuksenOppimaara = isVahvistettuPerusopetus(suoritukset)
val failedNinthGrade =
hasFailedNinthGrade(suoritukset) && !(valmisPerusopetus || vahvistettuPerusopetuksenOppimaara)
var lahdeArvot: Map[String, String] = Map[String, String]()
lahdeArvot += ("last modified" -> System.currentTimeMillis().toString)
for {
Expand Down Expand Up @@ -409,8 +439,8 @@ class KoskiSuoritusArvosanaParser {
suorituksenValmistumispäivä = valmistuminen.valmistumisPaiva,
isAikuistenPerusopetus = isAikuistenPerusopetus
)

if (failedNinthGrade) {
// ei tuoda luokalle jäädyn 9-luokan arvosanoja
if (isFailedNinthGrade(suoritus)) {
as = Seq.empty
}

Expand Down Expand Up @@ -553,7 +583,7 @@ class KoskiSuoritusArvosanaParser {

case Oids.perusopetusKomoOid =>
val arvosanoissaNelosia = perusopetuksenArvosanatSisaltavatNelosia(arvosanat)
if (failedNinthGrade || suoritus.jääLuokalle.contains(true)) {
if (failedNinthGrade) {
logger.info(
s"Perusopetuksen tilapäättely - henkilö $personOid: merkitään luokalle jääväksi merkitty perusopetuksen suoritus tilaan KESKEYTYNYT (aiempi tila $suoritusTila)"
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,11 @@ case class KoskiSuoritus(
tyyppi.exists(_.koodiarvo == "aikuistenperusopetuksenoppimaara")
}

def isPerusopetuksenoppimaara(): Boolean = {
tyyppi.exists(_.koodiarvo == "perusopetuksenoppimaara") ||
tyyppi.exists(_.koodiarvo == "aikuistenperusopetuksenoppimaara")
}

def laajuusVahintaan(min: BigDecimal): Boolean = {
val sum =
if (isOpistovuosi) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ class KoskiDataHandlerTest
lasnaOpiskeluOikeudet should have length 1
}

it should "parse peruskoulu_9_luokka_päättötodistus_jää_luokalle.json data as keskeytynyt after deadline" in {
it should "parse peruskoulu_9_luokka_päättötodistus_jää_luokalle.json data as valmis after deadline" in {
val json: String = scala.io.Source
.fromFile(jsonDir + "peruskoulu_9_luokka_päättötodistus_jää_luokalle.json")
.mkString
Expand All @@ -401,13 +401,13 @@ class KoskiDataHandlerTest

val virallinenpaattotodistus = paattotodistus.suoritus
virallinenpaattotodistus.komo shouldNot be("luokka")
paattotodistus.arvosanat should have length 0
virallinenpaattotodistus.tila should equal("KESKEYTYNYT")
paattotodistus.arvosanat should have length 18
virallinenpaattotodistus.tila should equal("VALMIS")

peruskouluB2KieletShouldNotBeValinnainen(result)
}

it should "parse peruskoulu_9_luokka_päättötodistus_jää_luokalle.json data as keskeytynyt if set jää luokalle in koski before deadline" in {
it should "parse peruskoulu_9_luokka_päättötodistus_jää_luokalle.json data as valmis if set jää luokalle in koski before deadline" in {
val json: String = scala.io.Source
.fromFile(jsonDir + "peruskoulu_9_luokka_päättötodistus_jää_luokalle.json")
.mkString
Expand All @@ -428,8 +428,8 @@ class KoskiDataHandlerTest

val virallinenpaattotodistus = paattotodistus.suoritus
virallinenpaattotodistus.komo shouldNot be("luokka")
paattotodistus.arvosanat should have length 0
virallinenpaattotodistus.tila should equal("KESKEYTYNYT")
paattotodistus.arvosanat should have length 18
virallinenpaattotodistus.tila should equal("VALMIS")

peruskouluB2KieletShouldNotBeValinnainen(result)
}
Expand Down Expand Up @@ -466,6 +466,82 @@ class KoskiDataHandlerTest
pt.arvosanat should have length 18
}

it should "store valmis perusopetuksen erityinen tutkinto as valmis even if jääluokalle is true in 9luokka" in {
val json: String = scala.io.Source
.fromFile(jsonDir + "koskidata_perusopetus_valmis_erityinen_jaanyt_9luokalle.json")
.mkString
val henkilo: KoskiHenkiloContainer = parse(json).extract[KoskiHenkiloContainer]
henkilo should not be null
henkilo.opiskeluoikeudet.head.tyyppi should not be empty
KoskiUtil.deadlineDate = LocalDate.now().plusDays(1)

val arvosanat1 = run(database.run(sql"select count(*) from arvosana".as[String]))
arvosanat1.head should equal("0")

Await.result(
koskiDatahandler.processHenkilonTiedotKoskesta(
henkilo,
PersonOidsWithAliases(henkilo.henkilö.oid.toSet),
new KoskiSuoritusHakuParams(saveLukio = true, saveAmmatillinen = true)
),
5.seconds
)
//komo
val suorituskomot = run(database.run(sql"select komo from suoritus".as[String]))
suorituskomot.size should equal(1)
suorituskomot.head should equal("1.2.246.562.13.62959769647")
val suoritustilat = run(database.run(sql"select tila from suoritus".as[String]))
suoritustilat.size should equal(1)
suoritustilat.head should equal("VALMIS")
val arvosanat = run(database.run(sql"select count(*) from arvosana".as[String]))
arvosanat.head should equal("17")
}

it should "parse valmis perusopetus as valmis even if jääluokalle is true in 9luokka" in {
val json: String = scala.io.Source
.fromFile(jsonDir + "koskidata_perusopetus_valmis_jaanyt_9luokalle.json")
.mkString
val henkilo: KoskiHenkiloContainer = parse(json).extract[KoskiHenkiloContainer]
henkilo should not be null
henkilo.opiskeluoikeudet.head.tyyppi should not be empty
KoskiUtil.deadlineDate = LocalDate.now().plusDays(1)

val result = koskiDatahandler.createSuorituksetJaArvosanatFromKoski(henkilo).head
result should have length 2
val pt = getPerusopetusPäättötodistus(result)
pt.get.suoritus.tila shouldBe "VALMIS"
}

it should "parse keskeneräinen perusopetus as kesken and no arvosanat when jääluokalle is true in 9luokka before deadline" in {
val json: String = scala.io.Source
.fromFile(jsonDir + "koskidata_perusopetus_kesken_jaanyt_9luokalle.json")
.mkString
val henkilo: KoskiHenkiloContainer = parse(json).extract[KoskiHenkiloContainer]
henkilo should not be null
henkilo.opiskeluoikeudet.head.tyyppi should not be empty
KoskiUtil.deadlineDate = LocalDate.now().plusDays(1)

val result = koskiDatahandler.createSuorituksetJaArvosanatFromKoski(henkilo).head
//result should have length 0
val pt = getPerusopetusPäättötodistus(result)
pt.get.suoritus.tila shouldBe "KESKEYTYNYT"
}

it should "parse keskeneräinen perusopetus as kesken and no arvosanat when jääluokalle is true in 9luokka after deadline" in {
val json: String = scala.io.Source
.fromFile(jsonDir + "koskidata_perusopetus_kesken_jaanyt_9luokalle.json")
.mkString
val henkilo: KoskiHenkiloContainer = parse(json).extract[KoskiHenkiloContainer]
henkilo should not be null
henkilo.opiskeluoikeudet.head.tyyppi should not be empty
KoskiUtil.deadlineDate = LocalDate.now().minusDays(1)

val result = koskiDatahandler.createSuorituksetJaArvosanatFromKoski(henkilo).head
//result should have length 0
val pt = getPerusopetusPäättötodistus(result)
pt.get.suoritus.tila shouldBe "KESKEYTYNYT"
}

it should "parse peruskoulu_9_luokka_päättötodistus_vuosiluokkiinSitoutumatonOpetus_true.json data" in {
val json: String = scala.io.Source
.fromFile(
Expand Down Expand Up @@ -1053,7 +1129,8 @@ class KoskiDataHandlerTest
ysiluokat should have length 1
ysiluokat.head.suoritus.valmistuminen.toString("dd.MM.YYYY") shouldEqual KoskiUtil.deadlineDate
.toString("dd.MM.YYYY")
pt.suoritus.valmistuminen.toString("dd.MM.YYYY") shouldEqual "01.06.2017"
// 4.6.2016 vahvistettu perusopetuksen oppimäärä jyrää luokallejäädyn ysiluokan vahvistuksen 1.6.2017
pt.suoritus.valmistuminen.toString("dd.MM.YYYY") shouldEqual "04.06.2016"

}

Expand Down Expand Up @@ -1215,8 +1292,8 @@ class KoskiDataHandlerTest
val result: Seq[SuoritusArvosanat] = resultgroup.head
result should have length 2
val arvosanat = result.head

val expectedDate = LocalDate.parse("2018-05-15")
// perusopetuksen vahvistus 6.4.2016, opiskeluoikeuden aikaleima 15.5.2018
val expectedDate = LocalDate.parse("2016-06-04")
arvosanat.suoritus.valmistuminen shouldEqual expectedDate
}

Expand Down Expand Up @@ -1291,74 +1368,6 @@ class KoskiDataHandlerTest
valinnaisetAineet should contain("AI")
}

/*it should "parse vahvistamaton telma_testi_valmis.json as keskeytynyt after deadline date" in {
val json: String = scala.io.Source.fromFile(jsonDir + "telma_testi_valmis.json").mkString
val henkilo: KoskiHenkiloContainer = parse(json).extract[KoskiHenkiloContainer]
henkilo should not be null
henkilo.opiskeluoikeudet.head.tyyppi should not be empty
KoskiUtil.deadlineDate = LocalDate.now().minusDays(1)
val resultgrp = koskiDatahandler.createSuorituksetJaArvosanatFromKoski(henkilo)
resultgrp should have length 1
val result = resultgrp.head
result should have length 1
result.head.arvosanat should have length 0
result.head.suoritus.tila shouldEqual "KESKEYTYNYT"
}*/

/*it should "parse vahvistamaton telma_testi_valmis.json as kesken before deadline date" in {
val json: String = scala.io.Source.fromFile(jsonDir + "telma_testi_valmis.json").mkString
val henkilo: KoskiHenkiloContainer = parse(json).extract[KoskiHenkiloContainer]
henkilo should not be null
henkilo.opiskeluoikeudet.head.tyyppi should not be empty
KoskiUtil.deadlineDate = LocalDate.now().plusDays(1)
val resultgrp = koskiDatahandler.createSuorituksetJaArvosanatFromKoski(henkilo)
resultgrp should have length 1
val result = resultgrp.head
result should have length 1
result.head.arvosanat should have length 0
result.head.suoritus.tila shouldEqual "KESKEN"
}*/

/*it should "parse telma_testi_kesken.json as keskeytynyt after deadline date" in {
val json: String = scala.io.Source.fromFile(jsonDir + "telma_testi_kesken.json").mkString
val henkilo: KoskiHenkiloContainer = parse(json).extract[KoskiHenkiloContainer]
henkilo should not be null
henkilo.opiskeluoikeudet.head.tyyppi should not be empty
KoskiUtil.deadlineDate = LocalDate.now().minusDays(1)
val resultgrp = koskiDatahandler.createSuorituksetJaArvosanatFromKoski(henkilo)
resultgrp should have length 1
val result = resultgrp.head
result should have length 1
result.head.arvosanat should have length 0
result.head.suoritus.tila shouldEqual "KESKEYTYNYT"
}*/

/*it should "parse telma_testi_kesken.json as kesken before deadline date" in {
val json: String = scala.io.Source.fromFile(jsonDir + "telma_testi_kesken.json").mkString
val henkilo: KoskiHenkiloContainer = parse(json).extract[KoskiHenkiloContainer]
henkilo should not be null
henkilo.opiskeluoikeudet.head.tyyppi should not be empty
KoskiUtil.deadlineDate = LocalDate.now().plusDays(1)
val resultgrp = koskiDatahandler.createSuorituksetJaArvosanatFromKoski(henkilo)
resultgrp should have length 1
val result = resultgrp.head
result should have length 1
result.head.arvosanat should have length 0
result.head.suoritus.tila shouldEqual "KESKEN"
}*/

it should "parse kielivalinnaisuustest.json" in {
val json: String = scala.io.Source.fromFile(jsonDir + "kielivalinnaisuustest.json").mkString
val henkilo: KoskiHenkiloContainer = parse(json).extract[KoskiHenkiloContainer]
Expand Down Expand Up @@ -2836,44 +2845,6 @@ class KoskiDataHandlerTest
arvosanat should have length 0
}

/*it should "store telma as kesken without arvosanat if deadline date is tomorrow and not enough opintopistees" in {
val json: String = scala.io.Source.fromFile(jsonDir + "telma_testi_kesken.json").mkString
val henkilo: KoskiHenkiloContainer = parse(json).extract[KoskiHenkiloContainer]
henkilo should not be null
henkilo.opiskeluoikeudet.head.tyyppi should not be empty
KoskiUtil.deadlineDate = LocalDate.now().plusDays(1)
Await.result(koskiDatahandler.processHenkilonTiedotKoskesta(henkilo,PersonOidsWithAliases(henkilo.henkilö.oid.toSet), new KoskiSuoritusHakuParams(saveLukio = false, saveAmmatillinen = false)), 5.seconds)
val opiskelijat = run(database.run(sql"select henkilo_oid from opiskelija".as[String]))
opiskelijat.size should equal(1)
val suoritukset = run(database.run(sql"select count(*) from suoritus".as[String]))
suoritukset.head should equal ("1")
val suoritus = run(database.run(sql"select tila from suoritus where komo = 'telma'".as[String]))
suoritus.head should equal("KESKEN")
val arvosanat = run(database.run(sql"select * from arvosana where deleted = false and current = true".as[String]))
arvosanat should have length 0
}*/

/*it should "store telma as keskeytynyt without arvosanat if deadline date is yesterday" in {
val json: String = scala.io.Source.fromFile(jsonDir + "telma_testi_kesken.json").mkString
val henkilo: KoskiHenkiloContainer = parse(json).extract[KoskiHenkiloContainer]
henkilo should not be null
henkilo.opiskeluoikeudet.head.tyyppi should not be empty
KoskiUtil.deadlineDate = LocalDate.now().minusDays(1)
Await.result(koskiDatahandler.processHenkilonTiedotKoskesta(henkilo,PersonOidsWithAliases(henkilo.henkilö.oid.toSet), new KoskiSuoritusHakuParams(saveLukio = false, saveAmmatillinen = false)), 5.seconds)
val opiskelijat = run(database.run(sql"select henkilo_oid from opiskelija".as[String]))
opiskelijat.size should equal(1)
val suoritukset = run(database.run(sql"select count(*) from suoritus".as[String]))
suoritukset.head should equal ("1")
val suoritus = run(database.run(sql"select tila from suoritus where komo = 'telma'".as[String]))
suoritus.head should equal("KESKEYTYNYT")
val arvosanat = run(database.run(sql"select * from arvosana where deleted = false and current = true".as[String]))
arvosanat should have length 0
}*/

it should "store vuosiluokkiin sitomaton as kesken without arvosanat if deadline date is tomorrow" in {
val json: String = scala.io.Source.fromFile(jsonDir + "koskidata_sitomaton.json").mkString
val henkilo: KoskiHenkiloContainer = parse(json).extract[KoskiHenkiloContainer]
Expand Down
Loading

0 comments on commit dfd23a9

Please sign in to comment.