diff --git a/src/main/scala/fi/oph/koski/schema/Korkeakoulu.scala b/src/main/scala/fi/oph/koski/schema/Korkeakoulu.scala index 68dccf7c4b..0e639285cc 100644 --- a/src/main/scala/fi/oph/koski/schema/Korkeakoulu.scala +++ b/src/main/scala/fi/oph/koski/schema/Korkeakoulu.scala @@ -62,7 +62,10 @@ case class KorkeakoulunOpiskeluoikeudenLisätiedot( lukukausiIlmoittautuminen: Option[Lukukausi_Ilmoittautuminen] = None, järjestäväOrganisaatio: Option[Oppilaitos] = None, @Title("Koulutuskunnat") - koulutuskuntaJaksot: List[KoulutuskuntaJakso] = Nil + koulutuskuntaJaksot: List[KoulutuskuntaJakso] = Nil, + @Title("Opettajanpätevyys") + @KoodistoUri("virtapatevyys") + opettajapatevyys: Option[List[Koodistokoodiviite]], ) extends OpiskeluoikeudenLisätiedot { def ensisijaisuusVoimassa(d: LocalDate): Boolean = ensisijaisuus.exists(_.exists((j: Aikajakso) => j.contains(d))) } diff --git a/src/main/scala/fi/oph/koski/virta/VirtaXMLConverter.scala b/src/main/scala/fi/oph/koski/virta/VirtaXMLConverter.scala index edc2d0af76..53bbf8858c 100644 --- a/src/main/scala/fi/oph/koski/virta/VirtaXMLConverter.scala +++ b/src/main/scala/fi/oph/koski/virta/VirtaXMLConverter.scala @@ -39,6 +39,10 @@ case class VirtaXMLConverter(oppilaitosRepository: OppilaitosRepository, koodist .flatMap(v => parseLuokittelu(v, "virtaopiskeluoikeudenluokittelu")) .toList + def opettajaPatevyysJaksolta(opiskeluoikeusNode: Node): List[Koodistokoodiviite] = (opiskeluoikeusNode \ "Jakso") + .flatMap(v => parsePatevyys(v, "virtapatevyys")) + .toList + val (orphans, opiskeluoikeudet) = opiskeluoikeusNodes.foldLeft((suoritusRoots, Nil: List[KorkeakoulunOpiskeluoikeus])) { case ((suoritusRootsLeft, opiskeluOikeudet), opiskeluoikeusNode) => virheet = ListBuffer[VirtaVirhe]() val (opiskeluOikeudenSuoritukset: List[Node], muutSuoritukset: List[Node]) = suoritusRootsLeft.partition(sisältyyOpiskeluoikeuteen(_, opiskeluoikeusNode, suoritusNodeList, None)) @@ -76,7 +80,9 @@ case class VirtaXMLConverter(oppilaitosRepository: OppilaitosRepository, koodist lukukausiIlmoittautuminen = lukukausiIlmoittautuminen(oppilaitos, opiskeluoikeudenTila, avain(opiskeluoikeusNode), virtaXml), järjestäväOrganisaatio = järjestäväOrganisaatio(opiskeluoikeusNode, oppilaitoksenNimiPäivä), maksettavatLukuvuosimaksut = Some(lukuvuosimaksut), - koulutuskuntaJaksot = koulutuskuntajaksot(opiskeluoikeusNode) + koulutuskuntaJaksot = koulutuskuntajaksot(opiskeluoikeusNode), + opettajapatevyys = noneIfEmpty(opettajaPatevyysJaksolta(opiskeluoikeusNode) ++ suoritusNodeList.flatMap(v => parsePatevyys(v, "virtapatevyys"))) + .map(_.distinct.sortBy(_.koodiarvo)) )), virtaVirheet = virheet.toList, luokittelu = noneIfEmpty(opiskeluoikeudenLuokittelu(opiskeluoikeusNode)) @@ -367,6 +373,10 @@ case class VirtaXMLConverter(oppilaitosRepository: OppilaitosRepository, koodist .map(_.text).filter(s => s.nonEmpty && s.toInt > 0).toList .map(l => koodistoViitePalvelu.validateRequired(koodistoUri, l)) + private def parsePatevyys(parentNode: Node, koodistoUri: String): List[Koodistokoodiviite] = (parentNode \ "Patevyys") + .map(_.text).filter(s => s.nonEmpty && s.length == 2).toList + .map(l => koodistoViitePalvelu.validateRequired(koodistoUri, l)) + private def laajuudetYhteensä(osasuoritukset: List[KorkeakoulunOpintojaksonSuoritus]) = { val laajuudet = osasuoritukset.flatMap(_.koulutusmoduuli.laajuus).map(_.arvo.toDouble).map(BigDecimal(_)) if (laajuudet.isEmpty) { diff --git a/src/test/scala/fi/oph/koski/virta/VirtaXMLConverterSpec.scala b/src/test/scala/fi/oph/koski/virta/VirtaXMLConverterSpec.scala index b42b86fd8f..00cb0b5c1d 100644 --- a/src/test/scala/fi/oph/koski/virta/VirtaXMLConverterSpec.scala +++ b/src/test/scala/fi/oph/koski/virta/VirtaXMLConverterSpec.scala @@ -51,6 +51,9 @@ class VirtaXMLConverterSpec extends AnyFreeSpec with TestEnvironment with Matche {luokittelu.get} } } + kl + aj + ob val virtaOpiskeluoikeudet: Elem = opiskeluoikeusWithOrganisaatio(None) @@ -112,6 +115,9 @@ class VirtaXMLConverterSpec extends AnyFreeSpec with TestEnvironment with Matche Nimi 2 Nimi 2 Nimi 2 + ew + oa + ob 240 @@ -175,6 +181,15 @@ class VirtaXMLConverterSpec extends AnyFreeSpec with TestEnvironment with Matche } } + "Patevyys" - { + "parsitaan opintosuorituksilta sekä jaksoilta ilman duplikaatteja" in { + val oo = converter.convertToOpiskeluoikeudet(opiskeluoikeusSuorituksella()) + oo should have size (1) + val patevyydet = oo.head.lisätiedot.flatMap(_.opettajapatevyys.map(x => x.map(_.koodiarvo))).getOrElse(List()) + patevyydet should equal(List("aj", "ew", "kl", "oa", "ob")) + } + } + "Lähdeorganisaatio" - { "kun opiskeluoikeudella ei ole lähdeorganisaatiota" in {