Skip to content

Commit

Permalink
OK-754: Jaotellaan tulokset koulutustoimijan mukaan
Browse files Browse the repository at this point in the history
  • Loading branch information
heidilm committed Dec 20, 2024
1 parent d095d43 commit 2e3df38
Show file tree
Hide file tree
Showing 10 changed files with 426 additions and 198 deletions.
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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]
)
Original file line number Diff line number Diff line change
Expand Up @@ -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]);

Expand Down Expand Up @@ -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,
Expand All @@ -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()
Expand Down
Original file line number Diff line number Diff line change
@@ -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}

Expand All @@ -10,7 +10,8 @@ class SwaggerConfig {

@Bean
def publicApi(): GroupedOpenApi = {
GroupedOpenApi.builder()
GroupedOpenApi
.builder()
.group("ovara-apis")
.pathsToMatch("/**")
.build()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()),
Expand All @@ -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()),
)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -30,17 +32,22 @@ 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
join pub.pub_dim_toteutus t
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)}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,47 @@
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

@Component
class KoulutuksetToteutuksetHakukohteetService(
koulutuksetToteutuksetHakukohteetRepository: KoulutuksetToteutuksetHakukohteetRepository,
userService: UserService) {
userService: UserService,
commonRepository: CommonRepository
) {

@Autowired
val db: OvaraDatabase = null

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,
Expand All @@ -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
)
}
}
Original file line number Diff line number Diff line change
@@ -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.*
Loading

0 comments on commit 2e3df38

Please sign in to comment.