diff --git a/src/main/java/de/subway_surfers/vpr_app/BestelluebersichtMitarbeiter.java b/src/main/java/de/subway_surfers/vpr_app/BestelluebersichtMitarbeiter.java index 87740de..9032a54 100644 --- a/src/main/java/de/subway_surfers/vpr_app/BestelluebersichtMitarbeiter.java +++ b/src/main/java/de/subway_surfers/vpr_app/BestelluebersichtMitarbeiter.java @@ -23,13 +23,18 @@ public class BestelluebersichtMitarbeiter { @FXML private Accordion accordion; + /** + * Initialisiert die Bestellübersicht durch Erstellung eines Accordion mit TitledPanes für verschiedene Datumsangaben. + * Geschrieben von: Stefan Groß + */ public void initialize() { List datum = new ArrayList<>(); - datum.add("15.10.1999"); - datum.add("23.12.2002"); - datum.add("05.01.2020"); + //Placeholder für richtige Daten + datum.add("15.10.2023"); + datum.add("23.12.2023"); + datum.add("05.01.2024"); accordion.setStyle("-fx-box-border: transparent;"); @@ -42,41 +47,33 @@ public class BestelluebersichtMitarbeiter { datumUeberschrift.animatedProperty().set(false); datumUeberschrift.setPadding(new Insets(0, 0, 15, 0)); - //TitledPane personen = new TitledPane("Person", createPersonenAccordion()); accordion.getPanes().add(datumUeberschrift); - //gerichtAkkordion.getPanes().add(personen); } scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS); } - int anzahlGerichtA = 1; + /** + * Erstellt ein Accordion mit TitledPanes für die Bestellübersicht der Gerichte und Nachtische. + * Geschrieben von: Stefan Groß + */ public Accordion createGerichtAkkordion() { Accordion accordion = new Accordion(); + + //Placeholder für richtige Daten int anzahlGerichtB = 15; int anzahlGerichtC = 3; - int anzahlGerichtD = 2; - double preisGerichtA = 4.99; - double preisGerichtB = 9.99; - double preisGerichtC = 3.99; - double preisGerichtD = 12.49; + double preisGerichtB = 4.99; + double preisGerichtC = 9.99; int anzahlNachtischA = 2; - int anzahlNachtischB = 213; double preisNachtischA = 0.49; - double preisNachtischB = 99.49; - if (anzahlGerichtA >= 1) { - TitledPane tp = new TitledPane(); - tp.setText("GerichtA " + anzahlGerichtA + "-Mal " + preisGerichtA * anzahlGerichtA + " €"); - accordion.getPanes().addAll(tp); - } - if (anzahlGerichtB >= 1) { TitledPane tp = new TitledPane(); tp.setText("GerichtB " + anzahlGerichtB + "-Mal " + preisGerichtB * anzahlGerichtB + " €"); @@ -90,12 +87,6 @@ public class BestelluebersichtMitarbeiter { accordion.getPanes().addAll(tp); } - if (anzahlGerichtD >= 1) { - TitledPane tp = new TitledPane(); - tp.setText("GerichtD " + anzahlGerichtD + "-Mal " + preisGerichtD * anzahlGerichtD + " €"); - accordion.getPanes().addAll(tp); - } - if (anzahlNachtischA >= 1) { TitledPane tp = new TitledPane(); tp.setText("NachtischA " + anzahlNachtischA + "-Mal " + preisNachtischA * anzahlNachtischA + " €"); @@ -104,43 +95,21 @@ public class BestelluebersichtMitarbeiter { if (anzahlNachtischA >= 1) { - Label label2 = new Label("Hans Schwanz" + " für " + " Anja Arbeitslos"); - Label label3 = new Label("Drittes Label"); + Label label2 = new Label("Beispiel Eltern bestellen \"essen\" für Kind: Anja Arbeitslos"); - VBox vbox = new VBox(label2, label3); + VBox vbox = new VBox(label2); vbox.setAlignment(Pos.CENTER_LEFT); - TitledPane tp = new TitledPane("NachtischB " + "-Mal " + preisNachtischB * anzahlGerichtB + " €", vbox); + TitledPane tp = new TitledPane("NachtischB " + "-Mal " + preisNachtischA * anzahlGerichtB + " €", vbox); accordion.getPanes().addAll(tp); } return accordion; } - /* - public Accordion createPersonenAccordion() { - Accordion accordion1 = new Accordion(); - - for (int i = 0; i < 10; i++) { - String kind = "Kind"; - String elternteil = "Max Heer"; - - Label label = new Label(); - label.setText(elternteil + " für " + kind); - - // Erstellen Sie eine TitledPane für jedes Label - TitledPane titledPane = new TitledPane("Kind Informationen", label); - - // Fügen Sie die TitledPane zur Accordion hinzu - accordion1.getPanes().add(titledPane); - } - - return accordion1; - } - */ public void onAbmelden(ActionEvent event) { - //VerwaltungApplication.abmelden(); + VerwaltungApplication.abmelden(); } public void onZurueck(ActionEvent actionEvent) { diff --git a/src/main/java/de/subway_surfers/vpr_app/EssensverwaltungMitarbeiterView.java b/src/main/java/de/subway_surfers/vpr_app/EssensverwaltungMitarbeiterView.java index dda0e88..bc2a122 100644 --- a/src/main/java/de/subway_surfers/vpr_app/EssensverwaltungMitarbeiterView.java +++ b/src/main/java/de/subway_surfers/vpr_app/EssensverwaltungMitarbeiterView.java @@ -92,9 +92,9 @@ public class EssensverwaltungMitarbeiterView { //solange das neu geöffnete Fenster offen ist, wird das Hauptfenster gesperrt gerichterstellung.initModality(Modality.APPLICATION_MODAL); - VerwaltungApplication.sceneWechseln(gerichterstellung, 400, 530, "gerichterstellung_mitarbeiter-view.fxml"); + VerwaltungApplication.sceneWechseln(gerichterstellung, 450, 600, "gerichterstellung_mitarbeiter-view.fxml"); - gerichterstellung.minWidthProperty().set(420); + gerichterstellung.minWidthProperty().set(450); gerichterstellung.minHeightProperty().set(600); } diff --git a/src/main/java/de/subway_surfers/vpr_app/GerichterstellungMitarbeiterView.java b/src/main/java/de/subway_surfers/vpr_app/GerichterstellungMitarbeiterView.java index e5c2bdb..c310fe6 100644 --- a/src/main/java/de/subway_surfers/vpr_app/GerichterstellungMitarbeiterView.java +++ b/src/main/java/de/subway_surfers/vpr_app/GerichterstellungMitarbeiterView.java @@ -4,7 +4,6 @@ import Logik.Mahlzeit; import Logik.Zutat; import RestAPISchnittstelle.RestApiClient; import com.google.gson.*; -import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.layout.HBox; @@ -20,18 +19,54 @@ public class GerichterstellungMitarbeiterView { private @FXML TextField eingabeName; private @FXML Button buttonInhaltsstoffe; private @FXML TextField eingabeInhaltsstoffe; - private @FXML Button speichernButton; private @FXML TextField eingabePreis; private @FXML DatePicker datePicker; + private @FXML ListView listViewVorschlag; private @FXML Label status; private ArrayList zutaten; private ArrayList mahlzeiten; + /** + * Füllt die Listview mit Vorschlägen und enthält den Eventlistener für das Textfeld + * Ist außerdem für die Skalierung der Buttons vom Inhaltsstoff zuständig + * Geschrieben: Sven Alteköster, Stefan Groß + * + */ public void initialize() { zutaten = new ArrayList<>(); mahlzeiten = new ArrayList<>(); + //Liste mit Daten füllen + mahlzeiten = getMahlzeiten(); + for (Mahlzeit m : mahlzeiten) { + listViewVorschlag.getItems().add(m.getName()); + } + + //Eventlistener für die Eingabe des Textfelds + eingabeName.textProperty().addListener((obs, oldValue, newValue) -> { + aktualisiereListView(newValue); + }); + + //Wenn ein Eintrag in der Listeview 2x angeklickt wird, werden die entsprechenden Felder mit + //den Daten des Gerichts eingefügt + listViewVorschlag.setOnMouseClicked(event -> { + if (event.getClickCount() == 2) { + String ausgewaehlterName = listViewVorschlag.getSelectionModel().getSelectedItem(); + if (ausgewaehlterName != null) { + for (Mahlzeit m : mahlzeiten) { + if (m.getName().equals(ausgewaehlterName)) { + eingabeName.setText(m.getName()); + eingabePreis.setText(String.valueOf(m.getPreis())); + eingabeBeschreibung.setText(m.getBeschreibung()); + break; + } + } + } + } + }); + + //wird das Fenster vergrößert, wird das Eingabefeld für Inhaltstoffe und den Hinzufügenbutton // auf die volle breite vergrößert. ((Pane) eingabeInhaltsstoffe.getParent()).widthProperty().addListener((obs, oldValue, newValue) -> { @@ -40,9 +75,58 @@ public class GerichterstellungMitarbeiterView { }); } - public void onButtonInhaltsstoffeClick(ActionEvent actionEvent) { + /** + * Holt Mahlzeiten von der API für die ListView. + * Geschrieben: Stefan Groß + * + * @return Liste von Mahlzeiten + */ + public ArrayList getMahlzeiten() { + ArrayList mahlzeitenListe = new ArrayList<>(); + RestApiClient restApiClient = new RestApiClient(); + JsonElement je = JsonParser.parseString(restApiClient.get("Gericht")); + JsonArray js = je.getAsJsonArray(); + + for (JsonElement element : js) { + JsonObject mahlzeitJson = element.getAsJsonObject(); + String name = mahlzeitJson.get("name").getAsString(); + float preis = mahlzeitJson.get("preis").getAsFloat(); + String beschreibung = mahlzeitJson.get("beschreibung").getAsString(); + Mahlzeit mahlzeit = new Mahlzeit(name, preis, beschreibung); + mahlzeitenListe.add(mahlzeit); + } + return mahlzeitenListe; + } + + + /** + * Aktualisiert die ListView je nach Eingabe in das eingabeName-Feld + * Geschrieben: Stefan Groß + * Getestet: + * + * @param eingabeGerichtFilter "Suchtext" für die Gerichte + */ + public void aktualisiereListView(String eingabeGerichtFilter) { + listViewVorschlag.getItems().clear(); + + if (eingabeGerichtFilter == null || eingabeGerichtFilter.isEmpty()) { + for (Mahlzeit m : mahlzeiten) { + listViewVorschlag.getItems().add(m.getName()); + } + } + else { + for (Mahlzeit m : mahlzeiten) { + if (m.getName().toLowerCase().contains(eingabeGerichtFilter.toLowerCase())) { + listViewVorschlag.getItems().add(m.getName()); + } + } + } + } + + + public void onButtonInhaltsstoffeClick() { String text = eingabeInhaltsstoffe.getText(); - if (!text.equals("")) { + if (!text.isEmpty()) { eingabeInhaltsstoffe.setText(""); Button neuerInhalt = new Button(); @@ -58,37 +142,108 @@ public class GerichterstellungMitarbeiterView { } } + + /** + * Bei klick auf den Speichernbutton wird die Eingabe überprüft + * es werden gegebenenfalls Fehlermeldungen angezeigt und es werden Mahlzeiten bei gültigen Eingaben gespeichert + * Geschrieben: Stefan Groß + */ public void onSpeichernButtonClick() { String eingabe = eingabeName.getText(); String beschreibung = eingabeBeschreibung.getText(); - float preis = Float.parseFloat(eingabePreis.getText()); - LocalDate datum = datePicker.getValue(); + StringBuilder fehlerMeldungen = new StringBuilder(); + boolean istGueltig = true; + float preis = 0; - if (!eingabe.isEmpty() && !beschreibung.isEmpty()) { - resetEingabeFelder(); + resetFehlerrahmen(); - Mahlzeit mahlzeit = new Mahlzeit(eingabe, preis, beschreibung); - mahlzeiten.add(mahlzeit); - status.setText("Mahlzeit hinzugefügt"); - - int datumId = datumBearbeiten(datum); - System.out.println(datumId); - - int gerichtId = gerichteAbfragen(mahlzeit); - System.out.println(gerichtId); - - inhaltsstoff(); - gibtsAm(gerichtId, datumId); + if (eingabe.isEmpty()) { + eingabeName.setStyle("-fx-text-box-border: #B22222; -fx-focus-color: #B22222;"); + fehlerMeldungen.append("Name eingeben. "); + istGueltig = false; } + + if (beschreibung.isEmpty()) { + eingabeBeschreibung.setStyle("-fx-text-box-border: #B22222; -fx-focus-color: #B22222;"); + fehlerMeldungen.append("Beschreibung eingeben. "); + istGueltig = false; + } + + try { + preis = Float.parseFloat(eingabePreis.getText()); + } + catch (NumberFormatException e) { + eingabePreis.setStyle("-fx-text-box-border: #B22222; -fx-focus-color: #B22222;"); + fehlerMeldungen.append("Preis ist ungültig. "); + istGueltig = false; + } + + LocalDate datum = datePicker.getValue(); + if (datum == null) { + datePicker.setStyle("-fx-border-color: #B22222;"); + fehlerMeldungen.append("Gültiges Datum eingeben. "); + istGueltig = false; + } + + if (zutaten.isEmpty()) { + eingabeInhaltsstoffe.setStyle("-fx-border-color: #B22222;"); + fehlerMeldungen.append("Inhaltsstoffe fehlen. "); + istGueltig = false; + } + + if (!istGueltig) { + status.setText(fehlerMeldungen.toString()); + return; + } + + + Mahlzeit mahlzeit = new Mahlzeit(eingabe, preis, beschreibung); + mahlzeiten.add(mahlzeit); + status.setText("Mahlzeit hinzugefügt"); + resetEingabeFelder(); + + int datumId = datumBearbeiten(datum); + int gerichtId = gerichteAbfragen(mahlzeit); + + inhaltsstoff(gerichtId); + gibtsAm(gerichtId, datumId); } + /** + * Setzt die "Fehlerrahmen" der aller Elemente zurück + * Geschrieben: Stefan Groß + * + */ + private void resetFehlerrahmen() { + eingabeName.setStyle(null); + eingabeBeschreibung.setStyle(null); + eingabePreis.setStyle(null); + eingabeInhaltsstoffe.setStyle(null); + datePicker.setStyle(null); + } + + /** + * Setzt alle Eingabefelder auf einen leerwert zurück + * Geschrieben: Stefan Groß + * + */ + private void resetEingabeFelder() { eingabeName.setText(""); eingabeBeschreibung.setText(""); eingabePreis.setText(""); eingabeInhaltsstoffe.setText(""); + datePicker.setValue(null); } + /** + * Holt oder erstellt ein Datum mithilfe der API und gibt die ID zurück. + * Geschrieben: Stefan Groß + * + * @param datum Das eingegebene Datum + * + * @return ID des Datums + */ private int datumBearbeiten(LocalDate datum) { RestApiClient restApiClient = new RestApiClient(); String datumAsString = datum.toString(); @@ -118,7 +273,14 @@ public class GerichterstellungMitarbeiterView { return -1; } - public void gibtsAm(int gid, int tid){ + /** + * Verwendet die API, um eine Beziehung in der Datenbank zwischen Gericht und Datum herzustellen. + * Geschrieben: Stefan Groß + * + * @param gid ID des Gerichts + * @param tid ID des Datums + */ + public void gibtsAm(int gid, int tid) { RestApiClient restApiClient = new RestApiClient(); JsonObject gibtsAmJson = new JsonObject(); @@ -128,9 +290,15 @@ public class GerichterstellungMitarbeiterView { restApiClient.post("gibtsAm", gibtsAmJson.toString()); } - public void inhaltsstoff() { + /** + * Ruft Inhaltsstoffe ab und fügt sie zu einem Gericht hinzu. + * Geschrieben: Stefan Groß + * + * @param gerichtId ID des Gerichts + */ + + public void inhaltsstoff(int gerichtId) { RestApiClient restApiClient = new RestApiClient(); - ArrayList ids = new ArrayList<>(); for (Zutat zutat : zutaten) { JsonElement jE = JsonParser.parseString(restApiClient.get("Inhaltsstoff")); @@ -138,32 +306,46 @@ public class GerichterstellungMitarbeiterView { int id = -1; + // Überprüfen, ob der Inhaltsstoff bereits existiert. + // Holt Id falls er existiert for (JsonElement element : inhaltsstoffArray) { - JsonObject inhatsstoff = element.getAsJsonObject(); - if (inhatsstoff.get("name").getAsString().equalsIgnoreCase(zutat.getName())) { - id = inhatsstoff.get("id").getAsInt(); + JsonObject inhaltsstoff = element.getAsJsonObject(); + if (inhaltsstoff.get("name").getAsString().equalsIgnoreCase(zutat.getName())) { + id = inhaltsstoff.get("id").getAsInt(); break; } } + // Fügt Inhaltsstoff hinzu, wenn er nicht existiert if (id == -1) { JsonObject neuerInhaltsstoff = new JsonObject(); neuerInhaltsstoff.addProperty("name", zutat.getName()); restApiClient.post("Inhaltsstoff", neuerInhaltsstoff.toString()); + // Fragt Id vom neuen Inhaltsstoff ab jE = JsonParser.parseString(restApiClient.get("Inhaltsstoff")); inhaltsstoffArray = jE.getAsJsonArray(); - JsonObject letzterInhaltsstoff = inhaltsstoffArray.get(inhaltsstoffArray.size() - 1).getAsJsonObject(); id = letzterInhaltsstoff.get("id").getAsInt(); - System.out.println("Inhaltsstoff hinzugefügt: " + zutat.getName()); } - ids.add(id); + + // Stellt verknüpfung zur Enthälttabelle her + JsonObject enthaelt = new JsonObject(); + enthaelt.addProperty("iid", id); + enthaelt.addProperty("gid", gerichtId); + restApiClient.post("Enthaelt", enthaelt.toString()); } - System.out.println("IDs der Inhaltsstoffe: " + ids); } - + /** + * Prüft, ob ein Gericht bereits existiert, wenn es nicht existiert wird es hinzugefügt. + * Falls es existiert wird Preis und Beschreibung aktualisiert. + * Geschrieben: Stefan Groß + * + * @param mahlzeit Die zu überprüfende oder hinzuzufügende Mahlzeit + * + * @return ID des Gerichts + */ private int gerichteAbfragen(Mahlzeit mahlzeit) { RestApiClient restApiClient = new RestApiClient(); @@ -197,7 +379,7 @@ public class GerichterstellungMitarbeiterView { restApiClient.post("Gericht", neuesGericht.toString()); - // ID des neu hinzugefügten Gerichts abrufen + // ID des Gerichts abrufen je = JsonParser.parseString(restApiClient.get("Gericht")); js = je.getAsJsonArray(); for (JsonElement element : js) { @@ -208,4 +390,5 @@ public class GerichterstellungMitarbeiterView { } return -1; } -} + +} \ No newline at end of file diff --git a/src/main/resources/de/subway_surfers/vpr_app/gerichterstellung_mitarbeiter-view.fxml b/src/main/resources/de/subway_surfers/vpr_app/gerichterstellung_mitarbeiter-view.fxml index 7902176..20674f4 100644 --- a/src/main/resources/de/subway_surfers/vpr_app/gerichterstellung_mitarbeiter-view.fxml +++ b/src/main/resources/de/subway_surfers/vpr_app/gerichterstellung_mitarbeiter-view.fxml @@ -18,7 +18,8 @@ -