diff --git a/ovara-backend/src/main/scala/fi/oph/ovara/backend/domain/KoulutuksetToteutuksetHakukohteetResult.scala b/ovara-backend/src/main/scala/fi/oph/ovara/backend/domain/KoulutuksetToteutuksetHakukohteetResult.scala index 3848917..a0f98a1 100644 --- a/ovara-backend/src/main/scala/fi/oph/ovara/backend/domain/KoulutuksetToteutuksetHakukohteetResult.scala +++ b/ovara-backend/src/main/scala/fi/oph/ovara/backend/domain/KoulutuksetToteutuksetHakukohteetResult.scala @@ -1,5 +1,17 @@ package fi.oph.ovara.backend.domain +sealed trait KoulutuksetToteutuksetHakukohteet { + val hakukohdeNimi: Kielistetty + val hakukohdeOid: String + val koulutuksenTila: Option[String] + val toteutuksenTila: Option[String] + val hakukohteenTila: Option[String] + val aloituspaikat: Option[Int] + val onValintakoe: Option[Boolean] + val voiSuorittaaKaksoistutkinnon: Option[Boolean] + val jarjestaaUrheilijanAmmKoulutusta: Option[Boolean] +} + case class KoulutuksetToteutuksetHakukohteetResult( hakukohdeNimi: Kielistetty, hakukohdeOid: String, @@ -9,5 +21,14 @@ case class KoulutuksetToteutuksetHakukohteetResult( aloituspaikat: Option[Int] = None, onValintakoe: Option[Boolean] = None, voiSuorittaaKaksoistutkinnon: Option[Boolean] = None, - jarjestaaUrheilijanAmmKoulutusta: Option[Boolean] = None + jarjestaaUrheilijanAmmKoulutusta: Option[Boolean] = None, + jarjestyspaikka_oid: Option[String] = None, + organisaatio_oid: Option[String], + organisaatio_nimi: Kielistetty, + organisaatiotyypit: List[String] +) extends KoulutuksetToteutuksetHakukohteet + +case class OrganisaationKoulutuksetToteutuksetHakukohteet( + organisaatio: Option[Organisaatio], + koulutuksetToteutuksetHakukohteet: Vector[KoulutuksetToteutuksetHakukohteetResult] ) diff --git a/ovara-backend/src/main/scala/fi/oph/ovara/backend/raportointi/Controller.scala b/ovara-backend/src/main/scala/fi/oph/ovara/backend/raportointi/Controller.scala index 002bfcb..958d260 100644 --- a/ovara-backend/src/main/scala/fi/oph/ovara/backend/raportointi/Controller.scala +++ b/ovara-backend/src/main/scala/fi/oph/ovara/backend/raportointi/Controller.scala @@ -21,7 +21,7 @@ import scala.jdk.CollectionConverters.* class Controller( commonService: CommonService, koulutuksetToteutuksetHakukohteetService: KoulutuksetToteutuksetHakukohteetService, - userService: UserService, + userService: UserService ) { val LOG: Logger = LoggerFactory.getLogger(classOf[Controller]); @@ -65,32 +65,37 @@ class Controller( @GetMapping(path = Array("organisaatiot")) def organisaatiot: String = mapper.writeValueAsString(commonService.getUserOrganisaatiotByOrganisaatiotyyppi) - // RAPORTIT @GetMapping(path = Array("koulutukset-toteutukset-hakukohteet")) def koulutukset_toteutukset_hakukohteet( @RequestParam("alkamiskausi") alkamiskausi: java.util.Collection[String], @RequestParam("haku") haku: java.util.Collection[String], + @RequestParam("koulutustoimija", required = false) koulutustoimija: String, + @RequestParam("oppilaitos", required = false) oppilaitos: java.util.Collection[String], + @RequestParam("toimipiste", required = false) toimipiste: java.util.Collection[String], @RequestParam("koulutuksenTila", required = false) koulutuksenTila: String, @RequestParam("toteutuksenTila", required = false) toteutuksenTila: String, @RequestParam("hakukohteenTila", required = false) hakukohteenTila: String, @RequestParam("valintakoe", required = false) valintakoe: String, response: HttpServletResponse ): Unit = { + val maybeKoulutustoimija = Option(koulutustoimija) val maybeKoulutuksenTila = Option(koulutuksenTila) val maybeToteutuksenTila = Option(toteutuksenTila) val maybeHakukohteenTila = Option(hakukohteenTila) - val maybeValintakoe = if (valintakoe == null) { + val maybeValintakoe = if (valintakoe == null) { None } else { Option(valintakoe.toBoolean) } - val wb = koulutuksetToteutuksetHakukohteetService. - get( + val wb = koulutuksetToteutuksetHakukohteetService.get( alkamiskausi.asScala.toList, haku.asScala.toList, + maybeKoulutustoimija, + if (oppilaitos == null) List() else oppilaitos.asScala.toList, + if (toimipiste == null) List() else toimipiste.asScala.toList, maybeKoulutuksenTila, maybeToteutuksenTila, maybeHakukohteenTila, @@ -99,10 +104,13 @@ class Controller( try { LOG.info(s"Sending excel in the response") val date: LocalDateTime = LocalDateTime.now().withNano(0) - val dateTimeStr = date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) - val out = response.getOutputStream + val dateTimeStr = date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + val out = response.getOutputStream response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") - response.setHeader(HttpHeaders.CONTENT_DISPOSITION, s"attachment; filename=\"koulutukset-toteutukset-hakukohteet-$dateTimeStr.xlsx\"") + response.setHeader( + HttpHeaders.CONTENT_DISPOSITION, + s"attachment; filename=\"koulutukset-toteutukset-hakukohteet-$dateTimeStr.xlsx\"" + ) wb.write(out) out.close() wb.close() diff --git a/ovara-backend/src/main/scala/fi/oph/ovara/backend/raportointi/SwaggerConfig.scala b/ovara-backend/src/main/scala/fi/oph/ovara/backend/raportointi/SwaggerConfig.scala index 3feb96f..fbe5f78 100644 --- a/ovara-backend/src/main/scala/fi/oph/ovara/backend/raportointi/SwaggerConfig.scala +++ b/ovara-backend/src/main/scala/fi/oph/ovara/backend/raportointi/SwaggerConfig.scala @@ -1,7 +1,7 @@ package fi.oph.ovara.backend.raportointi -import io.swagger.v3.oas.models.{Components, OpenAPI} import io.swagger.v3.oas.models.info.Info +import io.swagger.v3.oas.models.{Components, OpenAPI} import org.springdoc.core.models.GroupedOpenApi import org.springframework.context.annotation.{Bean, Configuration} @@ -10,7 +10,8 @@ class SwaggerConfig { @Bean def publicApi(): GroupedOpenApi = { - GroupedOpenApi.builder() + GroupedOpenApi + .builder() .group("ovara-apis") .pathsToMatch("/**") .build() diff --git a/ovara-backend/src/main/scala/fi/oph/ovara/backend/repository/Extractors.scala b/ovara-backend/src/main/scala/fi/oph/ovara/backend/repository/Extractors.scala index 3044bb5..a17e2b0 100644 --- a/ovara-backend/src/main/scala/fi/oph/ovara/backend/repository/Extractors.scala +++ b/ovara-backend/src/main/scala/fi/oph/ovara/backend/repository/Extractors.scala @@ -55,7 +55,7 @@ trait Extractors extends GenericOvaraJsonFormats { ) ) - implicit val getKoulutuksetToteutuksetHakukohteetResult: GetResult[KoulutuksetToteutuksetHakukohteetResult] = + implicit val getKoulutuksetToteutuksetHakukohteetResult: GetResult[KoulutuksetToteutuksetHakukohteetResult] = { GetResult(r => KoulutuksetToteutuksetHakukohteetResult( hakukohdeNimi = extractKielistetty(r.nextStringOption()), @@ -66,7 +66,12 @@ trait Extractors extends GenericOvaraJsonFormats { aloituspaikat = r.nextIntOption(), onValintakoe = r.nextBooleanOption(), voiSuorittaaKaksoistutkinnon = r.nextBooleanOption(), - jarjestaaUrheilijanAmmKoulutusta = r.nextBooleanOption() + jarjestaaUrheilijanAmmKoulutusta = r.nextBooleanOption(), + jarjestyspaikka_oid = r.nextStringOption(), + organisaatio_oid = r.nextStringOption(), + organisaatio_nimi = extractKielistetty(r.nextStringOption()), + organisaatiotyypit = extractArray(r.nextStringOption()), ) ) + } } diff --git a/ovara-backend/src/main/scala/fi/oph/ovara/backend/repository/KoulutuksetToteutuksetHakukohteetRepository.scala b/ovara-backend/src/main/scala/fi/oph/ovara/backend/repository/KoulutuksetToteutuksetHakukohteetRepository.scala index bec3824..a770f25 100644 --- a/ovara-backend/src/main/scala/fi/oph/ovara/backend/repository/KoulutuksetToteutuksetHakukohteetRepository.scala +++ b/ovara-backend/src/main/scala/fi/oph/ovara/backend/repository/KoulutuksetToteutuksetHakukohteetRepository.scala @@ -9,19 +9,21 @@ import slick.sql.SqlStreamingAction @Component class KoulutuksetToteutuksetHakukohteetRepository extends Extractors { def selectWithParams( - raportointiorganisaatiot: List[String], + kayttooikeusOrganisaatiot: List[String], alkamiskausi: List[String], haku: List[String], koulutuksenTila: Option[String], toteutuksenTila: Option[String], hakukohteenTila: Option[String], valintakoe: Option[Boolean] - ): SqlStreamingAction[Vector[KoulutuksetToteutuksetHakukohteetResult], KoulutuksetToteutuksetHakukohteetResult, Effect] = { - val alkamiskaudetAndHenkKohtSuunnitelma = RepositoryUtils.extractAlkamisvuosiKausiAndHenkkohtSuunnitelma(alkamiskausi) - val alkamiskaudet = alkamiskaudetAndHenkKohtSuunnitelma._1 + ): SqlStreamingAction[Vector[ + KoulutuksetToteutuksetHakukohteetResult + ], KoulutuksetToteutuksetHakukohteetResult, Effect] = { + val alkamiskaudetAndHenkKohtSuunnitelma = + RepositoryUtils.extractAlkamisvuosiKausiAndHenkkohtSuunnitelma(alkamiskausi) + val alkamiskaudet = alkamiskaudetAndHenkKohtSuunnitelma._1 val henkilokohtainenSuunnitelma = alkamiskaudetAndHenkKohtSuunnitelma._2 - val raportointiorganisaatiotStr = RepositoryUtils.makeListOfValuesQueryStr(raportointiorganisaatiot) - + val raportointiorganisaatiotStr = RepositoryUtils.makeListOfValuesQueryStr(kayttooikeusOrganisaatiot) sql"""select hk.hakukohde_nimi, hk.hakukohde_oid, k.tila as koulutuksen_tila, @@ -30,7 +32,11 @@ class KoulutuksetToteutuksetHakukohteetRepository extends Extractors { hk.aloituspaikat, hk.on_valintakoe, hk.toinen_aste_onko_kaksoistutkinto, - hk.jarjestaa_urheilijan_ammkoulutusta + hk.jarjestaa_urheilijan_ammkoulutusta, + hk.jarjestyspaikka_oid, + o.organisaatio_oid, + o.organisaatio_nimi, + o.organisaatiotyypit from pub.pub_dim_haku h join pub.pub_dim_hakukohde hk on h.haku_oid = hk.haku_oid @@ -38,9 +44,10 @@ class KoulutuksetToteutuksetHakukohteetRepository extends Extractors { on hk.toteutus_oid = t.toteutus_oid join pub.pub_dim_koulutus k on k.koulutus_oid = t.koulutus_oid + join pub.pub_dim_organisaatio o + on jarjestyspaikka_oid = o.organisaatio_oid WHERE h.haku_oid in (#${RepositoryUtils.makeListOfValuesQueryStr(haku)}) - and (t.organisaatio_oid in (#$raportointiorganisaatiotStr) - or hk.jarjestyspaikka_oid in (#$raportointiorganisaatiotStr)) + and (hk.jarjestyspaikka_oid in (#$raportointiorganisaatiotStr)) #${RepositoryUtils.makeAlkamiskaudetAndHenkkohtSuunnitelmaQuery(alkamiskaudetAndHenkKohtSuunnitelma)} #${RepositoryUtils.makeEqualsQueryStrOfOptional("AND", "k.tila", koulutuksenTila)} #${RepositoryUtils.makeEqualsQueryStrOfOptional("AND", "t.tila", toteutuksenTila)} diff --git a/ovara-backend/src/main/scala/fi/oph/ovara/backend/service/KoulutuksetToteutuksetHakukohteetService.scala b/ovara-backend/src/main/scala/fi/oph/ovara/backend/service/KoulutuksetToteutuksetHakukohteetService.scala index 6bbc724..69fa5ec 100644 --- a/ovara-backend/src/main/scala/fi/oph/ovara/backend/service/KoulutuksetToteutuksetHakukohteetService.scala +++ b/ovara-backend/src/main/scala/fi/oph/ovara/backend/service/KoulutuksetToteutuksetHakukohteetService.scala @@ -1,7 +1,8 @@ package fi.oph.ovara.backend.service -import fi.oph.ovara.backend.repository.{KoulutuksetToteutuksetHakukohteetRepository, OvaraDatabase} -import fi.oph.ovara.backend.utils.{AuthoritiesUtil, ExcelWriter, KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES} +import fi.oph.ovara.backend.repository.{CommonRepository, KoulutuksetToteutuksetHakukohteetRepository, OvaraDatabase} +import fi.oph.ovara.backend.utils.Constants.KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES +import fi.oph.ovara.backend.utils.{AuthoritiesUtil, ExcelWriter, OrganisaatioUtils} import org.apache.poi.xssf.usermodel.XSSFWorkbook import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Component @@ -9,7 +10,9 @@ import org.springframework.stereotype.Component @Component class KoulutuksetToteutuksetHakukohteetService( koulutuksetToteutuksetHakukohteetRepository: KoulutuksetToteutuksetHakukohteetRepository, - userService: UserService) { + userService: UserService, + commonRepository: CommonRepository +) { @Autowired val db: OvaraDatabase = null @@ -17,17 +20,28 @@ class KoulutuksetToteutuksetHakukohteetService( def get( alkamiskausi: List[String], haku: List[String], + koulutustoimija: Option[String], + oppilaitos: List[String], + toimipiste: List[String], koulutuksenTila: Option[String], toteutuksenTila: Option[String], hakukohteenTila: Option[String], valintakoe: Option[Boolean] ): XSSFWorkbook = { - val user = userService.getEnrichedUserDetails - val authorities = user.authorities - val raportointiOrganisaatiot = AuthoritiesUtil.getOrganisaatiot(authorities) - val res = db.run( + val user = userService.getEnrichedUserDetails + val authorities = user.authorities + val kayttooikeusOrganisaatiot = AuthoritiesUtil.getOrganisaatiot(authorities) + val parentChildKayttooikeusOrgs = db.run(commonRepository.selectChildOrganisaatiot(kayttooikeusOrganisaatiot)) + val allUserKayttooikeusOrgOids = parentChildKayttooikeusOrgs.groupBy(_.parent_oid).keys.toList.distinct + val kayttooikeusOrgsForKoulutustoimijaSelection = koulutustoimija match { + case Some(oid) => + val childOrganisaatiotForKoulutustoimija = db.run(commonRepository.selectChildOrganisaatiot(List(oid))) + parentChildKayttooikeusOrgs intersect childOrganisaatiotForKoulutustoimija + case None => parentChildKayttooikeusOrgs + } + val queryResult = db.run( koulutuksetToteutuksetHakukohteetRepository.selectWithParams( - raportointiOrganisaatiot, + kayttooikeusOrgsForKoulutustoimijaSelection.map(_.parent_oid).toList.distinct, alkamiskausi, haku, koulutuksenTila, @@ -37,6 +51,18 @@ class KoulutuksetToteutuksetHakukohteetService( ) ) - ExcelWriter.writeRaportti(res, KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES, user) + val groupedQueryResult = queryResult.groupBy(_.organisaatio_oid) + + val organisaationKoulutuksetHakukohteetToteutukset = + OrganisaatioUtils.mapOrganisaationHakukohteetToParent( + kayttooikeusOrgsForKoulutustoimijaSelection, + groupedQueryResult + ) + + ExcelWriter.writeRaportti( + organisaationKoulutuksetHakukohteetToteutukset, + KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES, + user + ) } } diff --git a/ovara-backend/src/main/scala/fi/oph/ovara/backend/utils/Constants.scala b/ovara-backend/src/main/scala/fi/oph/ovara/backend/utils/Constants.scala new file mode 100644 index 0000000..a824116 --- /dev/null +++ b/ovara-backend/src/main/scala/fi/oph/ovara/backend/utils/Constants.scala @@ -0,0 +1,30 @@ +package fi.oph.ovara.backend.utils + +object Constants { + val KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES: Map[String, List[String]] = Map( + "fi" -> List( + "Hakukohteen nimi", + "Hakukohteen oid", + "Kou.tila", + "Tot.tila", + "Hak.tila", + "Aloituspaikat", + "Koe", + "Voi suorittaa kaksoistutkinnon?", + "Voi suorittaa tutkinnon urheilijana?" + ), + "sv" -> List( + "Hakukohteen nimi SV", + "Hakukohteen oid SV", + "Kou.tila SV", + "Tot.tila SV", + "Hak.tila SV", + "Aloituspaikat SV", + "Koe SV", + "Voi suorittaa kaksoistutkinnon? SV", + "Voi suorittaa tutkinnon urheilijana? SV" + ) + ) +} + +export Constants.* diff --git a/ovara-backend/src/main/scala/fi/oph/ovara/backend/utils/ExcelWriter.scala b/ovara-backend/src/main/scala/fi/oph/ovara/backend/utils/ExcelWriter.scala index 5f0eb2c..519edd1 100644 --- a/ovara-backend/src/main/scala/fi/oph/ovara/backend/utils/ExcelWriter.scala +++ b/ovara-backend/src/main/scala/fi/oph/ovara/backend/utils/ExcelWriter.scala @@ -5,103 +5,110 @@ import org.apache.poi.ss.util.WorkbookUtil import org.apache.poi.xssf.usermodel.* import org.slf4j.{Logger, LoggerFactory} -val KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES = Map( - "fi" -> List( - "Hakukohteen nimi", - "Hakukohteen oid", - "Kou.tila", - "Tot.tila", - "Hak.tila", - "Aloituspaikat", - "Koe", - "Voi suorittaa kaksoistutkinnon?", - "Voi suorittaa tutkinnon urheilijana?" - ), - "sv" -> List( - "Hakukohteen nimi SV", - "Hakukohteen oid SV", - "Kou.tila SV", - "Tot.tila SV", - "Hak.tila SV", - "Aloituspaikat SV", - "Koe SV", - "Voi suorittaa kaksoistutkinnon? SV", - "Voi suorittaa tutkinnon urheilijana? SV" - ) -) - object ExcelWriter { + val LOG: Logger = LoggerFactory.getLogger("ExcelWriter") - def countAloituspaikat(organisaationKoulutuksetToteutuksetHakukohteet: OrganisaationKoulutuksetToteutuksetHakukohteet): Int = { - val koulutuksetToteutuksetHakukohteet = organisaationKoulutuksetToteutuksetHakukohteet.koulutuksetToteutuksetHakukohteet + def countAloituspaikat( + organisaationKoulutuksetToteutuksetHakukohteet: OrganisaationKoulutuksetToteutuksetHakukohteet + ): Int = { + val koulutuksetToteutuksetHakukohteet = + organisaationKoulutuksetToteutuksetHakukohteet.koulutuksetToteutuksetHakukohteet koulutuksetToteutuksetHakukohteet.flatMap(kth => kth.aloituspaikat).sum } - def createOrganisaatioHeadingRow(row: XSSFRow, - headingCellStyle: XSSFCellStyle, - asiointikieli: String, - organisaatio: Option[Organisaatio], - organisaationKoulutuksetToteutuksetHakukohteet: OrganisaationKoulutuksetToteutuksetHakukohteet, - raporttiColumnTitlesWithIndex: List[(String, Int)]): XSSFRow = { + def createOrganisaatioHeadingRow( + row: XSSFRow, + headingCellStyle: XSSFCellStyle, + asiointikieli: String, + organisaatio: Option[Organisaatio], + organisaationKoulutuksetToteutuksetHakukohteet: OrganisaationKoulutuksetToteutuksetHakukohteet, + raporttiColumnTitlesWithIndex: List[(String, Int)] + ): XSSFRow = { val orgNameCell = row.createCell(0) orgNameCell.setCellStyle(headingCellStyle) - val kielistettyNimi = organisaatio match + val kielistettyNimi = organisaatio match { case Some(org: Organisaatio) => org.organisaatio_nimi(Kieli.withName(asiointikieli)) - case None => "-" + case None => "-" + } orgNameCell.setCellValue(kielistettyNimi) - raporttiColumnTitlesWithIndex.find((title, i) => title.startsWith("Aloituspaikat")) match + raporttiColumnTitlesWithIndex.find((title, i) => title.startsWith("Aloituspaikat")) match { case Some((t, index)) => val aloituspaikatCell = row.createCell(index) - val aloituspaikat = countAloituspaikat(organisaationKoulutuksetToteutuksetHakukohteet) + val aloituspaikat = countAloituspaikat(organisaationKoulutuksetToteutuksetHakukohteet) aloituspaikatCell.setCellValue(aloituspaikat) case _ => + } row } // TODO: userin sijaan asiointikieli parametrina? - def writeRaportti(queryResult: List[(Organisaatio, OrganisaationKoulutuksetToteutuksetHakukohteet)], - raporttiColumnTitles: Map[String, List[String]], - user: User): XSSFWorkbook = { - val asiointikieli = user.asiointikieli.getOrElse("fi") + def writeRaportti( + queryResult: List[(Organisaatio, OrganisaationKoulutuksetToteutuksetHakukohteet)], + raporttiColumnTitles: Map[String, List[String]], + user: User + ): XSSFWorkbook = { + val asiointikieli = user.asiointikieli.getOrElse("fi") val workbook: XSSFWorkbook = new XSSFWorkbook() try { LOG.info("Creating new excel from db results") - val sheet: XSSFSheet = workbook.createSheet() - val cellstyle: XSSFCellStyle = workbook.createCellStyle() - val cellstyle2: XSSFCellStyle = workbook.createCellStyle() - val dataformat: XSSFDataFormat = workbook.createDataFormat() - val font1 = workbook.createFont() - val font2 = workbook.createFont() + val sheet: XSSFSheet = workbook.createSheet() + val headingCellstyle: XSSFCellStyle = workbook.createCellStyle() + val cellstyle2: XSSFCellStyle = workbook.createCellStyle() + val dataformat: XSSFDataFormat = workbook.createDataFormat() + val font1 = workbook.createFont() + val font2 = workbook.createFont() font1.setFontHeightInPoints(12) font1.setBold(true) font2.setFontHeightInPoints(10) - cellstyle.setFont(font1) - cellstyle.setDataFormat(dataformat.getFormat("text")) + headingCellstyle.setFont(font1) + headingCellstyle.setDataFormat(dataformat.getFormat("text")) cellstyle2.setFont(font2) workbook.setSheetName(0, WorkbookUtil.createSafeSheetName("Yhteenveto")) //TODO: käännös - val row = sheet.createRow(0) - val titles = raporttiColumnTitles.getOrElse( - asiointikieli, - raporttiColumnTitles.getOrElse("fi", List())) + val row = sheet.createRow(0) + val titles = raporttiColumnTitles.getOrElse(asiointikieli, raporttiColumnTitles.getOrElse("fi", List())) val raporttiColumnTitlesWithIndex = titles.zipWithIndex - raporttiColumnTitlesWithIndex.foreach { - case (title, index) => - val cell = row.createCell(index) - cell.setCellValue(title) - cell.setCellStyle(cellstyle) + raporttiColumnTitlesWithIndex.foreach { case (title, index) => + val cell = row.createCell(index) + cell.setCellValue(title) + cell.setCellStyle(headingCellstyle) } queryResult.zipWithIndex.foreach { - case (result: KoulutuksetToteutuksetHakukohteetResult, index) => - val resultRow = sheet.createRow(1 + index) - for (i <- 0 until result.productArity) yield { - val cell = resultRow.createCell(i) + case (result: (Organisaatio, OrganisaationKoulutuksetToteutuksetHakukohteet), index) => + val parentOrgRow = sheet.createRow(1 + index) + val parentOrg = result._1 + val organisaationTulokset = result._2 + createOrganisaatioHeadingRow( + parentOrgRow, + headingCellstyle, + asiointikieli, + Some(parentOrg), + organisaationTulokset, + raporttiColumnTitlesWithIndex + ) + + val orgRow = sheet.createRow(2 + index) + createOrganisaatioHeadingRow( + orgRow, + headingCellstyle, + asiointikieli, + organisaationTulokset._1, + organisaationTulokset, + raporttiColumnTitlesWithIndex + ) + + val kths = organisaationTulokset.koulutuksetToteutuksetHakukohteet + val firstKth = kths.head + val hakukohteenTiedotRow = sheet.createRow(3 + index) + + for (i <- 0 until firstKth.productArity) yield { + val cell = hakukohteenTiedotRow.createCell(i) cell.setCellStyle(cellstyle2) - result.productElement(i) match { + firstKth.productElement(i) match { case kielistetty: Kielistetty => val kielistettyValue = kielistetty(Kieli.withName(asiointikieli)) cell.setCellValue(kielistettyValue) diff --git a/ovara-backend/src/main/scala/fi/oph/ovara/backend/utils/GenericOvaraFormats.scala b/ovara-backend/src/main/scala/fi/oph/ovara/backend/utils/GenericOvaraFormats.scala index 46fe60c..ad9ce09 100644 --- a/ovara-backend/src/main/scala/fi/oph/ovara/backend/utils/GenericOvaraFormats.scala +++ b/ovara-backend/src/main/scala/fi/oph/ovara/backend/utils/GenericOvaraFormats.scala @@ -3,7 +3,7 @@ package fi.oph.ovara.backend.utils import fi.oph.ovara.backend.domain.Kieli import org.json4s.JsonAST.JString import org.json4s.jackson.Serialization.write -import org.json4s.{CustomKeySerializer, CustomSerializer, DefaultFormats, Formats, JNull, MappingException} +import org.json4s.{CustomKeySerializer, CustomSerializer, DefaultFormats, Formats, JNull, JValue, MappingException} import scala.collection.Seq import scala.util.control.NonFatal @@ -20,28 +20,38 @@ trait GenericOvaraFormats { Seq( stringSerializer(Kieli.withName) ) - - private def kieliKeySerializer = new CustomKeySerializer[Kieli](_ => ( { - case s: String => Kieli.withName(s) - }, { - case k: Kieli => k.toString - })) - - private def stringSerializer[A>:Null: Manifest](construct: String => A): CustomSerializer[A] = + + private def kieliKeySerializer = new CustomKeySerializer[Kieli](_ => + ( + { case s: String => + Kieli.withName(s) + }, + { case k: Kieli => + k.toString + } + ) + ) + + private def stringSerializer[A >: Null: Manifest](construct: String => A): CustomSerializer[A] = stringSerializer(construct, (a: A) => a.toString) - private def stringSerializer[A>:Null: Manifest](construct: String => A, deconstruct: A => String) = - new CustomSerializer[A](_ => ( { - case JString(s) => - try { - construct(s) - } catch { - case NonFatal(e) => - throw MappingException(e.getMessage, new java.lang.IllegalArgumentException(e)) + private def stringSerializer[A >: Null: Manifest](construct: String => A, deconstruct: A => String) = { + new CustomSerializer[A](_ => + ( + { + case JString(s) => + try { + construct(s) + } catch { + case NonFatal(e) => + throw MappingException(e.getMessage, new java.lang.IllegalArgumentException(e)) + } + case JNull => null + }, + { case a: A => + JString(deconstruct(a)) } - case JNull => null - }, { - case a: A => JString(deconstruct(a)) - })) + ) + ) + } } - diff --git a/ovara-backend/src/test/scala/fi/oph/ovara/backend/utils/ExcelWriterSpec.scala b/ovara-backend/src/test/scala/fi/oph/ovara/backend/utils/ExcelWriterSpec.scala index 0f7d699..e19db23 100644 --- a/ovara-backend/src/test/scala/fi/oph/ovara/backend/utils/ExcelWriterSpec.scala +++ b/ovara-backend/src/test/scala/fi/oph/ovara/backend/utils/ExcelWriterSpec.scala @@ -19,8 +19,7 @@ class ExcelWriterSpec extends AnyFlatSpec { ), Vector( KoulutuksetToteutuksetHakukohteetResult( - hakukohdeNimi = - Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), + hakukohdeNimi = Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), hakukohdeOid = "1.2.246.562.20.00000000000000021565", koulutuksenTila = Some("julkaistu"), toteutuksenTila = Some("julkaistu"), @@ -40,8 +39,7 @@ class ExcelWriterSpec extends AnyFlatSpec { it should "return 35 for three hakukohde aloituspaikat summed up" in { val kth = KoulutuksetToteutuksetHakukohteetResult( - hakukohdeNimi = - Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), + hakukohdeNimi = Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), hakukohdeOid = "1.2.246.562.20.00000000000000021565", koulutuksenTila = Some("julkaistu"), toteutuksenTila = Some("julkaistu"), @@ -55,17 +53,15 @@ class ExcelWriterSpec extends AnyFlatSpec { ) val kth2 = kth.copy( - hakukohdeNimi = - Map(En -> "Hakukohteen 2 nimi en", Fi -> "Hakukohteen 2 nimi fi", Sv -> "Hakukohteen 2 nimi sv"), + hakukohdeNimi = Map(En -> "Hakukohteen 2 nimi en", Fi -> "Hakukohteen 2 nimi fi", Sv -> "Hakukohteen 2 nimi sv"), hakukohdeOid = "1.2.246.562.20.00000000000000012345", - aloituspaikat = Some(20), + aloituspaikat = Some(20) ) val kth3 = kth.copy( - hakukohdeNimi = - Map(En -> "Hakukohteen 3 nimi en", Fi -> "Hakukohteen 3 nimi fi", Sv -> "Hakukohteen 3 nimi sv"), + hakukohdeNimi = Map(En -> "Hakukohteen 3 nimi en", Fi -> "Hakukohteen 3 nimi fi", Sv -> "Hakukohteen 3 nimi sv"), hakukohdeOid = "1.2.246.562.20.00000000000000025467", - aloituspaikat = Some(10), + aloituspaikat = Some(10) ) val organisaationKoulutuksetToteutuksetHakukohteet = OrganisaationKoulutuksetToteutuksetHakukohteet( @@ -104,7 +100,8 @@ class ExcelWriterSpec extends AnyFlatSpec { organisaatio_oid = "1.2.246.562.10.2781706420000", organisaatio_nimi = Map(En -> "Koulutustoimijan nimi en", Fi -> "Koulutustoimijan nimi fi", Sv -> "Koulutustoimijan nimi sv"), - organisaatiotyypit = List("01")) + organisaatiotyypit = List("01") + ) val organisaationKoulutuksetToteutuksetHakukohteet = OrganisaationKoulutuksetToteutuksetHakukohteet( Some( @@ -117,8 +114,7 @@ class ExcelWriterSpec extends AnyFlatSpec { ), Vector( KoulutuksetToteutuksetHakukohteetResult( - hakukohdeNimi = - Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), + hakukohdeNimi = Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), hakukohdeOid = "1.2.246.562.20.00000000000000021565", koulutuksenTila = Some("julkaistu"), toteutuksenTila = Some("julkaistu"), @@ -133,13 +129,14 @@ class ExcelWriterSpec extends AnyFlatSpec { ) ) - val workbook: XSSFWorkbook = new XSSFWorkbook() - val sheet: XSSFSheet = workbook.createSheet() - val row = sheet.createRow(0) + val workbook: XSSFWorkbook = new XSSFWorkbook() + val sheet: XSSFSheet = workbook.createSheet() + val row = sheet.createRow(0) val headingCellstyle: XSSFCellStyle = workbook.createCellStyle() val titles = KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES.getOrElse( user.asiointikieli.get, - KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES.getOrElse("fi", List())) + KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES.getOrElse("fi", List()) + ) val raporttiColumnTitlesWithIndex = titles.zipWithIndex val organisaatioRow = ExcelWriter.createOrganisaatioHeadingRow( @@ -148,19 +145,42 @@ class ExcelWriterSpec extends AnyFlatSpec { asiointikieli = user.asiointikieli.get, organisaatio = Some(organisaatio), organisaationKoulutuksetToteutuksetHakukohteet = organisaationKoulutuksetToteutuksetHakukohteet, - raporttiColumnTitlesWithIndex = raporttiColumnTitlesWithIndex) + raporttiColumnTitlesWithIndex = raporttiColumnTitlesWithIndex + ) assert(organisaatioRow.getCell(0).getStringCellValue == "Koulutustoimijan nimi sv") + assert(sheet.getRow(0).getCell(5).getNumericCellValue == 8) + } + + "createHakukohdeResultRow" should "return row with all query result data for one koulutus-toteutus-hakukohde" in { + val kth = KoulutuksetToteutuksetHakukohteetResult( + hakukohdeNimi = Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), + hakukohdeOid = "1.2.246.562.20.00000000000000021565", + koulutuksenTila = Some("julkaistu"), + toteutuksenTila = Some("julkaistu"), + hakukohteenTila = Some("julkaistu"), + aloituspaikat = Some(8), + onValintakoe = Some(false), + organisaatio_oid = Some("1.2.246.562.10.278170642010"), + organisaatio_nimi = + Map(En -> "Oppilaitoksen nimi en", Fi -> "Oppilaitoksen nimi fi", Sv -> "Oppilaitoksen nimi sv"), + organisaatiotyypit = List("02") + ) + + val workbook: XSSFWorkbook = new XSSFWorkbook() + val sheet: XSSFSheet = workbook.createSheet() + val row = sheet.createRow(0) + } "writeExcel" should "create one sheet and set 'Yhteenveto' as the name of the sheet" in { - val results = Vector() + val results = List() val wb = ExcelWriter.writeRaportti(results, KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES, user) assert(wb.getNumberOfSheets == 1) assert(wb.getSheetName(0) == "Yhteenveto") } it should "create one sheet with the column title row and no results" in { - val results = Vector() + val results = List() val wb = ExcelWriter.writeRaportti(results, KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES, user) assert(wb.getSheetAt(0).getPhysicalNumberOfRows == 1) assert(wb.getSheetAt(0).getRow(0).getCell(0).getStringCellValue == "Hakukohteen nimi SV") @@ -175,46 +195,103 @@ class ExcelWriterSpec extends AnyFlatSpec { assert(wb.getSheetAt(0).getRow(1) == null) } - it should "create a sheet with the column title row and one result row with all values defined" in { - val results = Vector( - KoulutuksetToteutuksetHakukohteetResult( - Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), - "1.2.246.562.20.00000000000000021565", - Some("julkaistu"), - Some("julkaistu"), - Some("julkaistu"), - Some(8), - Some(false) + it should "create a sheet with the column title row and one result row for koulutustoimija" in { + val results = List( + ( + Organisaatio( + organisaatio_oid = "1.2.246.562.10.2781706420000", + organisaatio_nimi = + Map(En -> "Koulutustoimijan nimi en", Fi -> "Koulutustoimijan nimi fi", Sv -> "Koulutustoimijan nimi sv"), + organisaatiotyypit = List("01") + ), + OrganisaationKoulutuksetToteutuksetHakukohteet( + Some( + Organisaatio( + organisaatio_oid = "1.2.246.562.10.278170642010", + organisaatio_nimi = + Map(En -> "Oppilaitoksen nimi en", Fi -> "Oppilaitoksen nimi fi", Sv -> "Oppilaitoksen nimi sv"), + organisaatiotyypit = List("02") + ) + ), + Vector( + KoulutuksetToteutuksetHakukohteetResult( + hakukohdeNimi = + Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), + hakukohdeOid = "1.2.246.562.20.00000000000000021565", + koulutuksenTila = Some("julkaistu"), + toteutuksenTila = Some("julkaistu"), + hakukohteenTila = Some("julkaistu"), + aloituspaikat = Some(8), + onValintakoe = Some(false), + organisaatio_oid = Some("1.2.246.562.10.278170642010"), + organisaatio_nimi = + Map(En -> "Oppilaitoksen nimi en", Fi -> "Oppilaitoksen nimi fi", Sv -> "Oppilaitoksen nimi sv"), + organisaatiotyypit = List("02") + ) + ) + ) ) ) - val wb = ExcelWriter.writeRaportti(results, KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES, user) - assert(wb.getSheetAt(0).getPhysicalNumberOfRows == 2) - assert(wb.getSheetAt(0).getRow(0).getCell(0).getStringCellValue == "Hakukohteen nimi SV") - assert(wb.getSheetAt(0).getRow(0).getCell(1).getStringCellValue == "Hakukohteen oid SV") - assert(wb.getSheetAt(0).getRow(0).getCell(2).getStringCellValue == "Kou.tila SV") - assert(wb.getSheetAt(0).getRow(0).getCell(3).getStringCellValue == "Tot.tila SV") - assert(wb.getSheetAt(0).getRow(0).getCell(4).getStringCellValue == "Hak.tila SV") - assert(wb.getSheetAt(0).getRow(0).getCell(5).getStringCellValue == "Aloituspaikat SV") - assert(wb.getSheetAt(0).getRow(0).getCell(6).getStringCellValue == "Koe SV") - assert(wb.getSheetAt(0).getRow(0).getCell(7).getStringCellValue == "Voi suorittaa kaksoistutkinnon? SV") - assert(wb.getSheetAt(0).getRow(0).getCell(8).getStringCellValue == "Voi suorittaa tutkinnon urheilijana? SV") - assert(wb.getSheetAt(0).getRow(1).getCell(0).getStringCellValue == "Hakukohteen nimi sv") - assert(wb.getSheetAt(0).getRow(1).getCell(1).getStringCellValue == "1.2.246.562.20.00000000000000021565") - assert(wb.getSheetAt(0).getRow(1).getCell(2).getStringCellValue == "julkaistu") - assert(wb.getSheetAt(0).getRow(1).getCell(3).getStringCellValue == "julkaistu") - assert(wb.getSheetAt(0).getRow(1).getCell(4).getStringCellValue == "julkaistu") - assert(wb.getSheetAt(0).getRow(1).getCell(5).getNumericCellValue == 8) - assert(wb.getSheetAt(0).getRow(1).getCell(6).getStringCellValue == "-") + val wb = ExcelWriter.writeRaportti(results, KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES, user) + val sheet = wb.getSheetAt(0) + assert(sheet.getPhysicalNumberOfRows == 4) + // Heading row + assert(sheet.getRow(0).getCell(0).getStringCellValue == "Hakukohteen nimi SV") + assert(sheet.getRow(0).getCell(4).getStringCellValue == "Hak.tila SV") + assert(sheet.getRow(0).getCell(5).getStringCellValue == "Aloituspaikat SV") + assert(sheet.getRow(0).getCell(2).getStringCellValue == "Kou.tila SV") + assert(sheet.getRow(0).getCell(3).getStringCellValue == "Tot.tila SV") + assert(sheet.getRow(0).getCell(1).getStringCellValue == "Hakukohteen oid SV") + assert(sheet.getRow(0).getCell(6).getStringCellValue == "Koe SV") + assert(sheet.getRow(0).getCell(7).getStringCellValue == "Voi suorittaa kaksoistutkinnon? SV") + assert(sheet.getRow(0).getCell(8).getStringCellValue == "Voi suorittaa tutkinnon urheilijana? SV") + // Parent organisaatio row with aloituspaikat sum + assert(sheet.getRow(1).getCell(0).getStringCellValue == "Koulutustoimijan nimi sv") + for (i <- 1 until 5) { + println(i) + assert(sheet.getRow(1).getCell(i) == null) + } + assert(sheet.getRow(1).getCell(5).getNumericCellValue == 8) + for (i <- 6 until 8) { + assert(sheet.getRow(1).getCell(i) == null) + } + assert(sheet.getRow(2).getCell(0).getStringCellValue == "Oppilaitoksen nimi sv") + // Hakukohde result row + assert(sheet.getRow(3).getCell(0).getStringCellValue == "Hakukohteen nimi sv") + assert(sheet.getRow(3).getCell(1).getStringCellValue == "1.2.246.562.20.00000000000000021565") + assert(sheet.getRow(3).getCell(2).getStringCellValue == "julkaistu") + assert(sheet.getRow(3).getCell(3).getStringCellValue == "julkaistu") + assert(sheet.getRow(3).getCell(4).getStringCellValue == "julkaistu") + assert(sheet.getRow(3).getCell(5).getNumericCellValue == 8) + assert(sheet.getRow(3).getCell(6).getStringCellValue == "-") } - it should "create a sheet with one result row with 'Koe', 'Voi suorittaa kaksoistutkinnon' and 'Voi suorittaa tutkinnon urheilijana' as not defined" in { - val results = Vector( - KoulutuksetToteutuksetHakukohteetResult( - Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), - "1.2.246.562.20.00000000000000021565", - Some("julkaistu"), - Some("julkaistu"), - Some("julkaistu") + //TODO: Testi jossa ylätason organisaatiolla hakukohteita kts. kälikuva + + /*it should "create a sheet with one result row with 'Koe', 'Voi suorittaa kaksoistutkinnon' and 'Voi suorittaa tutkinnon urheilijana' as not defined" in { + val results = List( + OrganisaationKoulutuksetToteutuksetHakukohteet( + Some( + Organisaatio( + organisaatio_oid = "1.2.246.562.10.278170642010", + organisaatio_nimi = + Map(En -> "Organisaation nimi en", Fi -> "Organisaation nimi fi", Sv -> "Organisaation nimi sv"), + organisaatiotyyppi = "01" + ) + ), + Vector( + KoulutuksetToteutuksetHakukohteetResult( + hakukohdeNimi = Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), + hakukohdeOid = "1.2.246.562.20.00000000000000021565", + koulutuksenTila = Some("julkaistu"), + toteutuksenTila = Some("julkaistu"), + hakukohteenTila = Some("julkaistu"), + organisaatio_oid = Some("1.2.246.562.10.278170642010"), + organisaatio_nimi = + Map(En -> "Organisaation nimi en", Fi -> "Organisaation nimi fi", Sv -> "Organisaation nimi sv"), + organisaatiotyypit = List("01") + ) + ) ) ) val wb = ExcelWriter.writeRaportti(results, KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES, user) @@ -229,15 +306,31 @@ class ExcelWriterSpec extends AnyFlatSpec { } it should "create a sheet with 'X' as the value for Koe-column when it is set as true" in { - val results = Vector( - KoulutuksetToteutuksetHakukohteetResult( - Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), - "1.2.246.562.20.00000000000000021565", - Some("julkaistu"), - Some("julkaistu"), - Some("julkaistu"), - Some(10), - Some(true) + val results = List( + OrganisaationKoulutuksetToteutuksetHakukohteet( + Some( + Organisaatio( + organisaatio_oid = "1.2.246.562.10.278170642010", + organisaatio_nimi = + Map(En -> "Organisaation nimi en", Fi -> "Organisaation nimi fi", Sv -> "Organisaation nimi sv"), + organisaatiotyyppi = "01" + ) + ), + Vector( + KoulutuksetToteutuksetHakukohteetResult( + Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), + "1.2.246.562.20.00000000000000021565", + Some("julkaistu"), + Some("julkaistu"), + Some("julkaistu"), + Some(10), + Some(true), + organisaatio_oid = Some("1.2.246.562.10.278170642010"), + organisaatio_nimi = + Map(En -> "Organisaation nimi en", Fi -> "Organisaation nimi fi", Sv -> "Organisaation nimi sv"), + organisaatiotyypit = List("01") + ) + ) ) ) val wb = ExcelWriter.writeRaportti(results, KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES, user) @@ -245,22 +338,42 @@ class ExcelWriterSpec extends AnyFlatSpec { } it should "create a sheet with two rows from two query results" in { - val results = Vector( - KoulutuksetToteutuksetHakukohteetResult( - Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), - "1.2.246.562.20.00000000000000021565", - Some("julkaistu"), - Some("julkaistu"), - Some("julkaistu") - ), - KoulutuksetToteutuksetHakukohteetResult( - Map(En -> "Hakukohde 2 en", Fi -> "Hakukohde 2 fi", Sv -> "Hakukohde 2 sv"), - "1.2.246.562.20.00000000000000021666", - Some("julkaistu"), - Some("arkistoitu"), - Some("arkistoitu"), - Some(10), - Some(true) + val results = List( + OrganisaationKoulutuksetToteutuksetHakukohteet( + Some( + Organisaatio( + organisaatio_oid = "1.2.246.562.10.278170642010", + organisaatio_nimi = + Map(En -> "Organisaation nimi en", Fi -> "Organisaation nimi fi", Sv -> "Organisaation nimi sv"), + organisaatiotyyppi = "01" + ) + ), + Vector( + KoulutuksetToteutuksetHakukohteetResult( + Map(En -> "Hakukohteen nimi en", Fi -> "Hakukohteen nimi fi", Sv -> "Hakukohteen nimi sv"), + "1.2.246.562.20.00000000000000021565", + Some("julkaistu"), + Some("julkaistu"), + Some("julkaistu"), + organisaatio_oid = Some("1.2.246.562.10.278170642010"), + organisaatio_nimi = + Map(En -> "Organisaation nimi en", Fi -> "Organisaation nimi fi", Sv -> "Organisaation nimi sv"), + organisaatiotyypit = List("01") + ), + KoulutuksetToteutuksetHakukohteetResult( + Map(En -> "Hakukohde 2 en", Fi -> "Hakukohde 2 fi", Sv -> "Hakukohde 2 sv"), + "1.2.246.562.20.00000000000000021666", + Some("julkaistu"), + Some("arkistoitu"), + Some("arkistoitu"), + Some(10), + Some(true), + organisaatio_oid = Some("1.2.246.562.10.278170642010"), + organisaatio_nimi = + Map(En -> "Organisaation nimi en", Fi -> "Organisaation nimi fi", Sv -> "Organisaation nimi sv"), + organisaatiotyypit = List("01") + ) + ) ) ) val wb = ExcelWriter.writeRaportti(results, KOULUTUKSET_TOTEUTUKSET_HAKUKOHTEET_COLUMN_TITLES, user) @@ -273,5 +386,5 @@ class ExcelWriterSpec extends AnyFlatSpec { assert(wb.getSheetAt(0).getRow(2).getCell(5).getNumericCellValue == 10) assert(wb.getSheetAt(0).getRow(1).getCell(6).getStringCellValue == "-") assert(wb.getSheetAt(0).getRow(2).getCell(6).getStringCellValue == "X") - } + }*/ }