package de.nak.notendb.service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import de.nak.notendb.dao.PruefungDAO;
import de.nak.notendb.dao.PruefungsleistungDAO;
import de.nak.notendb.model.Pruefung;
import de.nak.notendb.model.Pruefungsfach;
import de.nak.notendb.model.Pruefungsleistung;
import de.nak.notendb.model.Student;
/**
* Implementation des PruefungsleistungService fuer die Verwaltung von Pruefungsleistungen
*
* @author Julian Pusch
*
*/
public class PruefungsleistungServiceImpl implements PruefungsleistungService {
private PruefungsleistungDAO pruefungsleistungDAO;
private PruefungDAO pruefungDAO;
public void setPruefungsleistungDAO(PruefungsleistungDAO pruefungsleistungDAO) {
this.pruefungsleistungDAO = pruefungsleistungDAO;
}
public void setPruefungDAO(PruefungDAO pruefungDAO) {
this.pruefungDAO = pruefungDAO;
}
@Override
public Pruefungsleistung ladeLeistung(Long leistungId) throws PruefungsleistungNichtGefundenException {
Pruefungsleistung leistung = pruefungsleistungDAO.lade(leistungId);
if (leistung == null) {
throw new PruefungsleistungNichtGefundenException();
}
return leistung;
}
@Override
public List<Pruefungsleistung> ladeHistorie(Student student,
Pruefungsfach fach) {
return pruefungsleistungDAO.ladeLeistungenZuStudentUndFach(student, fach);
}
@Override
public List<Pruefungsleistung> ladeMuendlicheZuPruefung(Long pruefungId) {
// Alle Leistungen mit muendlicher laden
List<Pruefungsleistung> alleLeistungen = pruefungsleistungDAO.ladeLeistungenMitMuendlich();
List<Pruefungsleistung> rueckgabe = new ArrayList<Pruefungsleistung>();;
// gueltige Leistungen zur Pruefung heraussuchen
for (Pruefungsleistung leistung : alleLeistungen) {
if (leistung.getGueltig() && leistung.getPruefung().getId().equals(pruefungId)) {
rueckgabe.add(leistung);
}
}
return rueckgabe;
}
@Override
public Pruefungsleistung ladeAktuellGueltigeLeistungZuStudentUndFach(Long studentId, Long fachId) {
// Alle Leistungen zu Student und Fach laden
List<Pruefungsleistung> alleLeistungen = pruefungsleistungDAO.ladeLeistungenZuStudentUndFach(studentId, fachId);
Pruefungsleistung aktuelle = null;
Date aktuellesDatum = new Date(0);
// gueltige, aktuellste Leistung bestimmen
for (Pruefungsleistung leistung : alleLeistungen) {
if (leistung.getGueltig() && leistung.getDatumErfassung().compareTo(aktuellesDatum) > 0 ) {
aktuelle = leistung;
aktuellesDatum = leistung.getDatumErfassung();
}
}
return aktuelle;
}
@Override
public void speichere(Pruefungsleistung leistung) throws PruefungsleistungExistentException {
leistung.setGueltig(true);
leistung.setDatumErfassung(new Date());
leistung.setMuendlichMoeglich(isMuendlichMoeglich(leistung));
// 6.0 umschluesseln
if (leistung.getErgebnisNormal() == 6.0) {
leistung.setErgebnisNormal(5.0f);
}
// letzte Leistung laden und Versuchanzahl setzen
Pruefungsleistung letzteLeistung
= ladeAktuellGueltigeLeistungZuStudentUndFach(
leistung.getStudent().getId(), leistung.getPruefung().getFach().getId());
if (letzteLeistung != null) {
leistung.setVersuchNr(letzteLeistung.getVersuchNr() + 1);
letzteLeistung.setMuendlichMoeglich(false);
pruefungsleistungDAO.speichere(letzteLeistung);
} else {
leistung.setVersuchNr(1);
}
// persistieren
if (pruefungsleistungDAO.ladeLeistungenZu(leistung.getPruefung(), leistung.getStudent(),
leistung.getVersuchNr(), leistung.getGueltig(), leistung.getDatumErfassung()).isEmpty() == false) {
throw new PruefungsleistungExistentException();
} else {
pruefungsleistungDAO.speichere(leistung);
}
}
@Override
public void speichere(List<Pruefungsleistung> leistungen) throws PruefungsleistungExistentException {
if (!leistungen.isEmpty()) {
// erst Pruefung persistieren, da sonst in der Leistung ohne ID und mehrere Pruefungen wuerden erstellt
Pruefung pruefung = leistungen.get(0).getPruefung();
pruefungDAO.speichere(pruefung);
for (Pruefungsleistung leistung : leistungen) {
leistung.setPruefung(pruefung);
speichere(leistung);
}
}
}
@Override
public void aendere(Pruefungsleistung leistung) throws PruefungsleistungExistentException {
// letzte Leistung laden
Pruefungsleistung letzteLeistung
= ladeAktuellGueltigeLeistungZuStudentUndFach(
leistung.getStudent().getId(), leistung.getPruefung().getFach().getId());
// nur Aenderung durchfuehren wenn sich die Notenwerte auch unterscheiden
if (!leistung.getErgebnisNormal().equals(letzteLeistung.getErgebnisNormal())) {
// neues Pruefungsleistung-Objekt erstellen aus altem
leistung = Pruefungsleistung.erstelleKopie(leistung);
leistung.setGueltig(true);
boolean muendlichMoeglich = isMuendlichMoeglich(leistung);
leistung.setMuendlichMoeglich(muendlichMoeglich);
// Falls Aenderung an schriftlicher Note eine muendliche verbietet, muss diese entfernt werden
if (!muendlichMoeglich) {
leistung.setErgebnisErgaenzPruef(null);
}
leistung.setDatumErfassung(new Date());
// 6.0 umschluesseln
if (leistung.getErgebnisNormal() == 6.0F) {
leistung.setErgebnisNormal(5.0F);
}
// vorige Leistung ungueltig setzen
letzteLeistung.setGueltig(false);
// alte und neue Leistung persistieren
pruefungsleistungDAO.speichere(letzteLeistung);
if (pruefungsleistungDAO.ladeLeistungenZu(leistung.getPruefung(), leistung.getStudent(),
leistung.getVersuchNr(), leistung.getGueltig(), leistung.getDatumErfassung()).isEmpty() == false) {
throw new PruefungsleistungExistentException();
} else {
pruefungsleistungDAO.speichere(leistung);
}
}
}
@Override
public void erfasseMuendliche(Pruefungsleistung leistung) {
leistung.setMuendlichMoeglich(false);
pruefungsleistungDAO.speichere(leistung);
}
@Override
public void erfasseMuendliche(List<Pruefungsleistung> leistungen) {
for (Pruefungsleistung leistung : leistungen) {
erfasseMuendliche(leistung);
}
}
@Override
public void storniere(Pruefungsleistung leistung) throws PruefungsleistungExistentException {
leistung.setGueltig(false);
if (pruefungsleistungDAO.ladeLeistungenZu(leistung.getPruefung(), leistung.getStudent(),
leistung.getVersuchNr(), leistung.getGueltig(), leistung.getDatumErfassung()).isEmpty() == false) {
throw new PruefungsleistungExistentException();
} else {
pruefungsleistungDAO.speichere(leistung);
}
}
@Override
public boolean isWeitererVersuchErlaubt(Pruefungsleistung leistung) {
if (leistung.getVersuchNr() >= 3 || leistung.getAktuelleNote() <= 4) {
return false;
}
return true;
}
@Override
public void loescheAlle() {
pruefungsleistungDAO.loescheAlle();
}
/**
* Ermittelt, ob zu einer uebergebenen Pruefungsleistung noch eine muendliche Nachpruefung erlaubt ist
*
* @param leistung Das zu ueberpruefende Pruefungsleistung-Objekt
* @return Angabe ob muendliche zugelassen ist
*/
private boolean isMuendlichMoeglich(Pruefungsleistung leistung){
if (leistung.getErgebnisNormal() != 5) {
return false;
}
// Pruefen ob bereits 2 muendliche gemacht wurden
List<Pruefungsleistung> alleLeistungen
= pruefungsleistungDAO.ladeLeistungenZuStudentUndFach(
leistung.getStudent(), leistung.getPruefung().getFach());
Integer muendlicheGemacht = 0;
for (Pruefungsleistung einzelneLeistung : alleLeistungen) {
if (einzelneLeistung.getGueltig()
&& !einzelneLeistung.equals(leistung)
&& einzelneLeistung.getErgebnisErgaenzPruef() != null) {
muendlicheGemacht++;
}
}
if (muendlicheGemacht >= 2) {
return false;
}
return true;
}
}