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 {