All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.svws_nrw.data.stundenplan.DataStundenplanUnterrichtsverteilung Maven / Gradle / Ivy

Go to download

Diese Bibliothek unterstützt bei dem Zugriff auf Datenbanken für die Schulverwaltungssoftware in NRW

There is a newer version: 1.0.1
Show newest version
package de.svws_nrw.data.stundenplan;

import java.io.InputStream;
import java.util.List;
import java.util.stream.Stream;

import de.svws_nrw.core.data.stundenplan.StundenplanFach;
import de.svws_nrw.core.data.stundenplan.StundenplanKlasse;
import de.svws_nrw.core.data.stundenplan.StundenplanKlassenunterricht;
import de.svws_nrw.core.data.stundenplan.StundenplanKurs;
import de.svws_nrw.core.data.stundenplan.StundenplanLehrer;
import de.svws_nrw.core.data.stundenplan.StundenplanSchueler;
import de.svws_nrw.core.data.stundenplan.StundenplanUnterrichtsverteilung;
import de.svws_nrw.data.DataManager;
import de.svws_nrw.db.DBEntityManager;
import de.svws_nrw.db.dto.current.schild.lehrer.DTOLehrer;
import de.svws_nrw.db.dto.current.schild.schueler.DTOSchueler;
import de.svws_nrw.db.dto.current.schild.stundenplan.DTOStundenplan;
import de.svws_nrw.db.utils.ApiOperationException;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status;

/**
 * Diese Klasse erweitert den abstrakten {@link DataManager} für den Core-DTO
 * {@link StundenplanUnterrichtsverteilung}.
 */
public final class DataStundenplanUnterrichtsverteilung extends DataManager {

	/**
	 * Erstellt einen neuen {@link DataManager} für den Core-DTO {@link StundenplanUnterrichtsverteilung}.
	 *
	 * @param conn   die Datenbank-Verbindung
	 */
	public DataStundenplanUnterrichtsverteilung(final DBEntityManager conn) {
		super(conn);
	}

	@Override
	public Response getAll() {
		throw new UnsupportedOperationException();
	}

	@Override
	public Response getList() {
		throw new UnsupportedOperationException();
	}

	@Override
	public Response get(final Long id) throws ApiOperationException {
		if (id == null)
			throw new ApiOperationException(Status.BAD_REQUEST, "Eine Anfrage zu einem Stundenplan mit der ID null ist unzulässig.");
		return Response.status(Status.OK).type(MediaType.APPLICATION_JSON).entity(getUnterrichtsverteilung(conn, id)).build();
	}

	/**
	 * Bestimmt zu dem Stundenplan mit der angegebenen ID die Unterrichtsverteilung.
	 *
	 * @param conn            die Datenbank-Verbindung
	 * @param idStundenplan   die ID des Stundenplans
	 *
	 * @return die Unterrichtsverteilung
	 */
	public static StundenplanUnterrichtsverteilung getUnterrichtsverteilung(final DBEntityManager conn, final long idStundenplan) throws ApiOperationException {
		final DTOStundenplan stundenplan = conn.queryByKey(DTOStundenplan.class, idStundenplan);
		if (stundenplan == null)
			throw new ApiOperationException(Status.NOT_FOUND, "Es wurde kein Stundenplan mit der ID %d gefunden.".formatted(idStundenplan));
		final List lehrer = DataStundenplanLehrer.getLehrer(conn, idStundenplan);
		final List schueler = DataStundenplanSchueler.getSchueler(conn, idStundenplan);
		final List faecher = DataStundenplanFaecher.getFaecher(conn, idStundenplan);
		final List klassen = DataStundenplanKlassen.getKlassen(conn, idStundenplan);
		final List kurse = DataStundenplanKurse.getKurse(conn, idStundenplan);
		final List klassenunterricht = DataStundenplanKlassenunterricht.getKlassenunterrichte(conn, idStundenplan);
		// Prüfe, ob bei den Klassen oder Kursen Lehrer zugeordnet sind, deren ID in der Lehrer-Liste nicht vorhanden ist und füge diese ggf. hinzu
		final List idsLehrer = lehrer.stream().map(l -> l.id).toList();
		final List idsLehrerFehlende = Stream.concat(
				kurse.stream().flatMap(k -> k.lehrer.stream()),
				klassenunterricht.stream().flatMap(ku -> ku.lehrer.stream()))
				.filter(l -> !idsLehrer.contains(l)).toList();
		if (!idsLehrerFehlende.isEmpty()) {
			final List lehrerFehlende = conn.queryByKeyList(DTOLehrer.class, idsLehrerFehlende);
			if (lehrerFehlende.size() != idsLehrerFehlende.size())
				throw new ApiOperationException(Status.INTERNAL_SERVER_ERROR,
						"Nicht alle Lehrer des Stundenplans mit der ID %d konnten auch in der Lehrer-Tabelle gefunden werden.".formatted(idStundenplan));
			lehrer.addAll(lehrerFehlende.stream().map(l -> {
				final StundenplanLehrer sl = DataStundenplanLehrer.dtoMapper.apply(l);
				sl.kuerzel = "*" + sl.kuerzel;
				return sl;
			}).toList());
		}
		// Prüfe, ob bei den Klassen oder Kursen Schüler zugeordnet sind, deren ID in der Schüler-Liste nicht vorhanden ist und füge diese ggf. hinzu
		final List idsSchueler = schueler.stream().map(l -> l.id).toList();
		final List idsSchuelerFehlende = Stream.concat(Stream.concat(
				kurse.stream().flatMap(k -> k.schueler.stream()),
				klassenunterricht.stream().flatMap(ku -> ku.schueler.stream())),
				klassen.stream().flatMap(k -> k.schueler.stream()))
				.filter(s -> !idsSchueler.contains(s)).toList();
		if (!idsSchuelerFehlende.isEmpty()) {
			final List schuelerFehlende = conn.queryByKeyList(DTOSchueler.class, idsSchuelerFehlende);
			if (schuelerFehlende.size() != idsSchuelerFehlende.size())
				throw new ApiOperationException(Status.INTERNAL_SERVER_ERROR,
						"Nicht alle Schüler des Stundenplans mit der ID %d konnten auch in der Schüler-Tabelle gefunden werden.".formatted(idStundenplan));
			schueler.addAll(schuelerFehlende.stream().map(s -> DataStundenplanSchueler.dtoMapper.apply(s)).toList());
		}
		// Erstelle das Core-DTO-Objekt für die Response
		final StundenplanUnterrichtsverteilung daten = new StundenplanUnterrichtsverteilung();
		daten.id = stundenplan.ID;
		daten.lehrer.addAll(lehrer);
		daten.schueler.addAll(schueler);
		daten.faecher.addAll(faecher);
		daten.klassen.addAll(klassen);
		daten.kurse.addAll(kurse);
		daten.klassenunterricht.addAll(klassenunterricht);
		return daten;
	}


	@Override
	public Response patch(final Long id, final InputStream is) {
		throw new UnsupportedOperationException();
	}


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy