de.svws_nrw.data.schild3.reporting.DataSchildReportingDatenquelleSchuelerLeistungsdaten Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of svws-db-utils Show documentation
Show all versions of svws-db-utils Show documentation
Diese Bibliothek unterstützt bei dem Zugriff auf Datenbanken für die Schulverwaltungssoftware in NRW
package de.svws_nrw.data.schild3.reporting;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.stream.Collectors;
import de.svws_nrw.core.data.schild3.reporting.SchildReportingSchuelerLeistungsdaten;
import de.svws_nrw.core.types.schild3.SchildReportingAttributTyp;
import de.svws_nrw.db.DBEntityManager;
import de.svws_nrw.db.dto.current.schild.faecher.DTOFach;
import de.svws_nrw.db.dto.current.schild.kurse.DTOKurs;
import de.svws_nrw.db.dto.current.schild.lehrer.DTOLehrer;
import de.svws_nrw.db.dto.current.schild.schueler.DTOSchuelerLeistungsdaten;
import de.svws_nrw.db.dto.current.schild.schueler.DTOSchuelerLernabschnittsdaten;
import de.svws_nrw.db.utils.ApiOperationException;
import jakarta.ws.rs.core.Response.Status;
/**
* Die Definition der Schild-Reporting-Datenquelle "Schuelerleistungsdaten"
*/
public final class DataSchildReportingDatenquelleSchuelerLeistungsdaten extends DataSchildReportingDatenquelle {
/**
* Erstelle eine die Datenquelle Schuelerleistungsdaten
*/
DataSchildReportingDatenquelleSchuelerLeistungsdaten() {
super(SchildReportingSchuelerLeistungsdaten.class);
this.setMaster("abschnittID", "Schuelerlernabschnitte", "id", SchildReportingAttributTyp.INT, Long.class);
// Beispiel für die Einschränkung auf Schulformen: this.restrictTo(Schulform.GY, Schulform.GE)
}
@Override
List getDaten(final DBEntityManager conn, final List params) throws ApiOperationException {
// Prüfe, ob die Lernabschnittsdaten in der DB vorhanden sind
final Map abschnitte = conn.queryByKeyList(DTOSchuelerLernabschnittsdaten.class, params)
.stream().collect(Collectors.toMap(a -> a.ID, a -> a));
for (final Long abschnittID : params)
if (abschnitte.get(abschnittID) == null)
throw new ApiOperationException(Status.NOT_FOUND,
"Parameter der Abfrage ungültig: Ein Schülerlernabschnitt mit der ID " + abschnittID + " existiert nicht.");
// Erzeuge die Core-DTOs für das Ergebnis der Datenquelle
final ArrayList result = new ArrayList<>();
// Aggregiere die benötigten Daten aus der Datenbank
final List leistungsdaten = conn.queryList(DTOSchuelerLeistungsdaten.QUERY_LIST_BY_ABSCHNITT_ID,
DTOSchuelerLeistungsdaten.class, params);
if ((leistungsdaten == null) || leistungsdaten.isEmpty())
return result;
final List idFaecher = leistungsdaten.stream().map(l -> l.Fach_ID).distinct().toList();
final Map mapFaecher = (idFaecher.isEmpty()) ? Collections.emptyMap()
: conn.queryByKeyList(DTOFach.class, idFaecher).stream().collect(Collectors.toMap(f -> f.ID, f -> f));
final List idLehrer = leistungsdaten.stream().filter(l -> l.Fachlehrer_ID != null).map(l -> l.Fachlehrer_ID).distinct().toList();
final Map mapLehrer = (idLehrer.isEmpty()) ? Collections.emptyMap()
: conn.queryByKeyList(DTOLehrer.class, idLehrer).stream().collect(Collectors.toMap(l -> l.ID, l -> l));
final List idKurse = leistungsdaten.stream().filter(l -> l.Kurs_ID != null).map(l -> l.Kurs_ID).distinct().toList();
final Map mapKurse = (idKurse.isEmpty()) ? Collections.emptyMap()
: conn.queryByKeyList(DTOKurs.class, idKurse).stream().collect(Collectors.toMap(k -> k.ID, k -> k));
final String meldungsvorlageDatenInkonsistent =
"Daten inkonsistent: %s mit der ID %d konnte nicht für die Leistungsdaten mit der ID %d gefunden werden.";
for (final DTOSchuelerLeistungsdaten dto : leistungsdaten) {
final DTOFach dtoFach = mapFaecher.get(dto.Fach_ID);
if (dtoFach == null)
throw new ApiOperationException(Status.INTERNAL_SERVER_ERROR, String.format(meldungsvorlageDatenInkonsistent, "Fach", dto.Fach_ID, dto.ID));
String lehrerKuerzel = null;
if (dto.Fachlehrer_ID != null) {
final DTOLehrer dtoLehrer = mapLehrer.get(dto.Fachlehrer_ID);
if (dtoLehrer == null)
throw new ApiOperationException(Status.INTERNAL_SERVER_ERROR,
String.format(meldungsvorlageDatenInkonsistent, "Fachlehrer", dto.Fachlehrer_ID, dto.ID));
lehrerKuerzel = dtoLehrer.Kuerzel;
}
final DTOKurs dtoKurs = mapKurse.get(dto.Kurs_ID);
final SchildReportingSchuelerLeistungsdaten data = new SchildReportingSchuelerLeistungsdaten();
data.id = dto.ID;
data.abschnittID = dto.Abschnitt_ID;
data.fachID = dto.Fach_ID;
data.fachKuerzel = dtoFach.Kuerzel;
data.fach = dtoFach.Bezeichnung;
data.lehrerID = dto.Fachlehrer_ID;
data.lehrerKuerzel = lehrerKuerzel;
data.kursID = dto.Kurs_ID;
data.kurs = (dtoKurs == null) ? "" : dtoKurs.KurzBez;
data.kursart = dto.Kursart;
data.kursartAllg = (dtoKurs == null) ? dto.KursartAllg : dtoKurs.KursartAllg;
data.note = dto.NotenKrz.text;
data.noteKuerzel = dto.NotenKrz.kuerzel;
data.notePunkte = dto.NotenKrz.notenpunkte;
data.sortierungAllg = dtoFach.SortierungAllg;
data.sortierungSekII = dtoFach.SortierungSekII;
result.add(data);
}
result.sort(Comparator.comparing(ld -> ld.sortierungAllg));
// Geben die Ergebnis-Liste mit den Core-DTOs zurück
return result;
}
}