diff --git a/.gitignore b/.gitignore index 1165112..83913b4 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,5 @@ build/ ### Mac OS ### .DS_Store -/database.db \ No newline at end of file +/database.db +/Rechnungen/** \ No newline at end of file diff --git a/pom.xml b/pom.xml index b3e3131..3e6af89 100644 --- a/pom.xml +++ b/pom.xml @@ -45,6 +45,11 @@ sqlite-jdbc 3.40.0.0 + + org.controlsfx + controlsfx + 11.1.2 + diff --git a/readme.md b/readme.md index f7a786f..8735686 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,13 @@ # Essensbestellungsverwaltung -test +--- + +### Anleitung zum Benutzen +Beim ersten Start des Programms wird die Datenbank erstellt und der erste Benutzer der angelegt wird, ist ein Mitarbeiter Account. Danach sind alle weiteren User für Eltern. Weitere Mitarbeiter können über das Mitarbeiter Menu erstellt werden. + +##### Desweitern werden Folgende Beispiel Accounts erstellt: +Ein Eltern Account mit Kindern: +testparent@test.de/test + +Ein Mitarbeiter Account: +testworker@test.de/test diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/AccountMgr.java b/src/main/java/com/bib/essensbestellungsverwaltung/AccountMgr.java index 6e16b8d..ca6a3cf 100644 --- a/src/main/java/com/bib/essensbestellungsverwaltung/AccountMgr.java +++ b/src/main/java/com/bib/essensbestellungsverwaltung/AccountMgr.java @@ -13,6 +13,7 @@ import java.util.List; /** * A collection of functions loosely related to account management * Acts as an abstraction layer to the database + * * @author Malte Schulze Hobeling */ public class AccountMgr { @@ -21,226 +22,354 @@ public class AccountMgr { /** * creates a user with createUser(...) and adds its id to the 'worker' table + * * @param worker the worker to be created * @return userid or -1 * @author Malte Schulze Hobeling */ - protected static long createWorker(Worker worker){ + protected static long createWorker(Worker worker) { long id = createUser(worker); String sId = String.valueOf(id); - Database.insert("worker", new String[]{"userid"}, new String[]{sId}); + Database.insert("worker", new String[] { "userid" }, new String[] { sId }); return id; } /** * creates a user with createUser(...) and adds its id to the 'parent' table + * * @param parent the parent to be created * @return userid or -1 * @author Malte Schulze Hobeling */ - protected static long createParent(Parent parent){ + protected static long createParent(Parent parent) { long id = createUser(parent); String sId = String.valueOf(id); - Database.insert("parent", new String[]{"userid"}, new String[]{sId}); + Database.insert("parent", new String[] { "userid" }, new String[] { sId }); return id; } /** * adds a user to the database + * * @param user the user to be created * @return userid or -1 * @author Malte Schulze Hobeling */ protected static long createUser(User user) { - String[] userH = {"name", "firstname", "addressid", "password", "email"}; + String[] userH = { "name", "firstname", "addressid", "password", "email" }; String name = user.getName(); String firstname = user.getFirstname(); String pw = hashAndSalt(user.getPassword(), getSalt()); String email = user.getEmail(); long addressId = user.getAddress().getId(); - if(addressId < 1){ + if (addressId < 1) { addressId = createAddress(user.getAddress()); } - String[] userD = {name, firstname, String.valueOf(addressId), pw, email}; + String[] userD = { name, firstname, String.valueOf(addressId), pw, email }; return Database.insert("user", userH, userD); } /** * adds an address to the database + * * @param address the address to be created * @return id or -1 * @author Malte Schulze Hobeling */ - protected static long createAddress(Address address){ - String[] addressH = {"street", "number", "plz", "city"}; - String[] addressD = {address.getStreet(),address.getNumber(),address.getPlz(),address.getCity()}; - return Database.insert("address",addressH,addressD); + protected static long createAddress(Address address) { + String[] addressH = { "street", "number", "plz", "city" }; + String[] addressD = { address.getStreet(), address.getNumber(), address.getPlz(), address.getCity() }; + return Database.insert("address", addressH, addressD); } /** * adds a child and allergies to the database + * * @param child the child to be created * @return id of child or -1 * @author Malte Schulze Hobeling */ - protected static long createChild(Child child){ - String[] childH = {"name","firstname","addressid"}; - String[] childD = {child.getName(), child.getFirstname(), String.valueOf(child.getAddress().getId())}; + protected static long createChild(Child child) { + String[] childH = { "name", "firstname", "addressid" }; + String[] childD = { child.getName(), child.getFirstname(), String.valueOf(child.getAddress().getId()) }; long id = Database.insert("child", childH, childD); - String[] child_allergyH = {"childid","allergyid","severityid"}; - for (AllergySeverity allergy: child.getAllergies()) { + String[] child_allergyH = { "childid", "allergyid", "severityid" }; + for (AllergySeverity allergy : child.getAllergies()) { String sId = String.valueOf(id); String sAllergyId = String.valueOf(allergy.getAllergy().getId()); String sSeverityId = String.valueOf(allergy.getSeverityId()); - String[] child_allergyD = {sId,sAllergyId,sSeverityId}; - Database.insert("child_allergy",child_allergyH,child_allergyD); + String[] child_allergyD = { sId, sAllergyId, sSeverityId }; + Database.insert("child_allergy", child_allergyH, child_allergyD); } return id; } /** - * returns a User(Worker | Parent) for a given id or null if no unique id was found + * update Child + * + * @param child the child to be updated + * @return id of child + * @author Johannes Kantz + */ + protected static long updateChild(Child child) { + String[] childH = { "id", "name", "firstname", "addressid" }; + String[] childD = { String.valueOf(child.getId()), child.getName(), child.getFirstname(), + String.valueOf(child.getAddress().getId()) }; + long updates = Database.update("child", childH, childD); + String[] child_allergyH = { "childid", "allergyid", "severityid" }; + Database.select("child_allergy", new String[] { "childid" }, new String[] { String.valueOf(child.getId()) }) + .stream().forEach(row -> { + String allergyId = row.split(":")[0]; + Database.delete("child_allergy", Integer.parseInt(allergyId)); + }); + for (AllergySeverity allergy : child.getAllergies()) { + String sId = String.valueOf(child.getId()); + String sAllergyId = String.valueOf(allergy.getAllergy().getId()); + String sSeverityId = String.valueOf(allergy.getSeverityId()); + String[] child_allergyD = { sId, sAllergyId, sSeverityId }; + Database.insert("child_allergy", child_allergyH, child_allergyD); + } + return updates; + } + + /** + * delete Child + * + * @author Johannes Kantz + */ + protected static void deleteChildWithId(long id) { + Database.delete("child", id); + Database.select("child_allergy", new String[] { "childid" }, new String[] { String.valueOf(id) }).stream() + .forEach(row -> { + String allergyId = row.split(":")[0]; + Database.delete("child_allergy", Integer.parseInt(allergyId)); + }); + } + + /** + * returns a User(Worker | Parent) for a given id or null if no unique id was + * found + * * @param id id of the User * @return User(Worker | Parent) or null * @author Malte Schulze Hobeling */ - protected static User getUserById(long id){ - List entry = Database.getEntryById("user",id); - if(entry.size() != 1){ + protected static User getUserById(long id) { + List entry = Database.getEntryById("user", id); + if (entry.size() != 1) { return null; } String[] parts = entry.get(0).split(":"); Address address = getAddressById(id); - if(isWorker(String.valueOf(id))){ - return new Worker(id,parts[1],parts[2],parts[4],parts[5],address); - }else{ - String[] parent_childH = {"parentuserid"}; - String[] parent_childD = {String.valueOf(id)}; + if (isWorker(String.valueOf(id))) { + return new Worker(id, parts[1], parts[2], parts[4], parts[5], address); + } else { + String[] parent_childH = { "parentuserid" }; + String[] parent_childD = { String.valueOf(id) }; List children = new ArrayList<>(); - List parent_childEntries = Database.select("parent_child",parent_childH,parent_childD); - for (String parent_childEntry: parent_childEntries) { + List parent_childEntries = Database.select("parent_child", parent_childH, parent_childD); + for (String parent_childEntry : parent_childEntries) { String[] parent_childParts = parent_childEntry.split(":"); children.add(getChildById(Long.parseLong(parent_childParts[2]))); } - return new Parent(id,parts[1],parts[2],parts[4],parts[5],address,children); + return new Parent(id, parts[1], parts[2], parts[4], parts[5], address, children); } } /** * returns a Child for a given id or null if no unique id was found + * * @param id id of child * @return Child or null * @author Malte Schulze Hobeling */ - protected static Child getChildById(long id){ - List entry = Database.getEntryById("child",id); - if(entry.size() != 1){ + protected static Child getChildById(long id) { + List entry = Database.getEntryById("child", id); + if (entry.size() != 1) { return null; } String[] parts = entry.get(0).split(":"); - String[] child_allergyH = {"childid"}; - String[] child_allergyD = {String.valueOf(id)}; - List entriesAllergy = Database.select("child_allergy",child_allergyH,child_allergyD); + String[] child_allergyH = { "childid" }; + String[] child_allergyD = { String.valueOf(id) }; + List entriesAllergy = Database.select("child_allergy", child_allergyH, child_allergyD); List allergySeverities = new ArrayList<>(); for (String entryAllergy : entriesAllergy) { String[] allergyParts = entryAllergy.split(":"); List severity = Database.getEntryById("severity", Long.parseLong(allergyParts[3])); String sSeverity = severity.get(0).split(":")[1]; long lSeverity = Long.parseLong(severity.get(0).split(":")[0]); - allergySeverities.add(new AllergySeverity(FoodMgr.getAllergyById(Long.parseLong(allergyParts[2])),lSeverity,sSeverity)); + allergySeverities.add( + new AllergySeverity(FoodMgr.getAllergyById(Long.parseLong(allergyParts[2])), lSeverity, sSeverity)); } - return new Child(id,parts[1],parts[2],getAddressById(Long.parseLong(parts[3])),allergySeverities); + return new Child(id, parts[1], parts[2], getAddressById(Long.parseLong(parts[3])), allergySeverities); + } + + /** + * returns all Children + * + * @return {List getAllChildren() { + List entry = Database.getTable("child"); + if (entry.size() < 1) { + return new ArrayList<>(); + } + List children = new ArrayList<>(); + for (String s : entry) { + String[] parts = s.split(":"); + String[] child_allergyH = { "childid" }; + String[] child_allergyD = { String.valueOf(parts[0]) }; + List entriesAllergy = Database.select("child_allergy", child_allergyH, child_allergyD); + List allergySeverities = new ArrayList<>(); + for (String entryAllergy : entriesAllergy) { + String[] allergyParts = entryAllergy.split(":"); + List severity = Database.getEntryById("severity", Long.parseLong(allergyParts[3])); + String sSeverity = severity.get(0).split(":")[1]; + long lSeverity = Long.parseLong(severity.get(0).split(":")[0]); + allergySeverities.add(new AllergySeverity(FoodMgr.getAllergyById(Long.parseLong(allergyParts[2])), + lSeverity, sSeverity)); + } + children.add(new Child(Long.parseLong(parts[0]), parts[1], parts[2], + getAddressById(Long.parseLong(parts[3])), allergySeverities)); + } + return children; + } + + /** + * returns all Children from parent + * @param id parentid + * @return {List getAllChildrenFromParentWithId(long id) { + List entry = Database.select("parent_child", new String[] { "parentuserid" }, + new String[] { String.valueOf(id) }); + if (entry.size() < 1) { + return new ArrayList<>(); + } + List childIds = new ArrayList<>(); + for (String s : entry) { + String[] parts = s.split(":"); + childIds.add(parts[2]); + } + List children = new ArrayList<>(); + for (String s : childIds) { + List child = Database.getEntryById("child", Long.parseLong(s)); + String[] parts = child.get(0).split(":"); + String[] child_allergyH = { "childid" }; + String[] child_allergyD = { String.valueOf(parts[0]) }; + List entriesAllergy = Database.select("child_allergy", child_allergyH, child_allergyD); + List allergySeverities = new ArrayList<>(); + for (String entryAllergy : entriesAllergy) { + String[] allergyParts = entryAllergy.split(":"); + List severity = Database.getEntryById("severity", Long.parseLong(allergyParts[3])); + String sSeverity = severity.get(0).split(":")[1]; + long lSeverity = Long.parseLong(severity.get(0).split(":")[0]); + allergySeverities.add(new AllergySeverity(FoodMgr.getAllergyById(Long.parseLong(allergyParts[2])), + lSeverity, sSeverity)); + } + children.add(new Child(Long.parseLong(parts[0]), parts[1], parts[2], + getAddressById(Long.parseLong(parts[3])), allergySeverities)); + } + return children; } /** * returns an Address for a given id or null if no unique id was found + * * @param id id of the address * @return Address or null * @author Malte Schulze Hobeling */ - protected static Address getAddressById(long id){ - List entry = Database.getEntryById("address",id); - if(entry.size() != 1){ + protected static Address getAddressById(long id) { + List entry = Database.getEntryById("address", id); + if (entry.size() != 1) { return null; } String[] parts = entry.get(0).split(":"); - return new Address(Long.parseLong(parts[0]),parts[1],parts[2],parts[3],parts[4]); + return new Address(Long.parseLong(parts[0]), parts[1], parts[2], parts[3], parts[4]); } /** * creates entries in the database to match parent to child + * * @param parentId id of parent - * @param childId id of child + * @param childId id of child * @return id of parent_child or -1 * @author Malte Schulze Hobeling */ - protected static long matchParentChild(String parentId, String childId){ - String[] parent_childH = {"parentuserid","childid"}; - String[] parent_childD = {parentId,childId}; - return Database.insert("parent_child", parent_childH,parent_childD); + protected static long matchParentChild(String parentId, String childId) { + String[] parent_childH = { "parentuserid", "childid" }; + String[] parent_childD = { parentId, childId }; + return Database.insert("parent_child", parent_childH, parent_childD); } /** * a simple login to check if a given email matches a password + * * @param email email - * @param pw password + * @param pw password * @return id or -1 * @author Malte Schulze Hobeling */ - protected static long login(String email, String pw){ - String[] pwH = {"email"}; - String[] pwD = {email}; - List foundEmail = Database.select("user",pwH,pwD); + protected static long login(String email, String pw) { + String[] pwH = { "email" }; + String[] pwD = { email }; + List foundEmail = Database.select("user", pwH, pwD); String salt; - if(foundEmail.size() == 1){ + if (foundEmail.size() == 1) { String[] userParts = foundEmail.get(0).split(":"); String[] pwParts = userParts[4].split("\\."); salt = pwParts[1]; - }else{ - //no unique user found; still calculating a hash for security reasons + } else { + // no unique user found; still calculating a hash for security reasons salt = getSalt(); } - String[] userH = {"email","password"}; - String[] userD = {email,hashAndSalt(pw,salt)}; - return Database.getSingleId("user",userH,userD); + String[] userH = { "email", "password" }; + String[] userD = { email, hashAndSalt(pw, salt) }; + return Database.getSingleId("user", userH, userD); } /** * checks if id is in worker table + * * @param id userid * @return true if id is in worker table * @author Malte Schulze Hobeling */ - protected static boolean isWorker(String id){ - String[] workerH = {"userid"}; - String[] workerD = {id}; - long workerId = Database.getSingleId("worker",workerH,workerD); + protected static boolean isWorker(String id) { + String[] workerH = { "userid" }; + String[] workerD = { id }; + long workerId = Database.getSingleId("worker", workerH, workerD); return workerId > 0; } /** * checks if id is in parent table + * * @param id userid * @return true if id is in parent table * @author Malte Schulze Hobeling */ - protected static boolean isParent(String id){ - String[] parentH = {"userid"}; - String[] parentD = {id}; - long parentId = Database.getSingleId("parent",parentH,parentD); + protected static boolean isParent(String id) { + String[] parentH = { "userid" }; + String[] parentD = { id }; + long parentId = Database.getSingleId("parent", parentH, parentD); return parentId > 0; } /** * returns a hashed and salted password + * * @param pw the password to hash * @return hashed and salted password * @author Malte Schulze Hobeling */ - private static String hashAndSalt(String pw, String salt){ + private static String hashAndSalt(String pw, String salt) { Base64.Decoder dec = Base64.getDecoder(); byte[] bySalt = dec.decode(salt); - KeySpec spec = new PBEKeySpec(pw.toCharArray(), bySalt,310001,256); + KeySpec spec = new PBEKeySpec(pw.toCharArray(), bySalt, 310001, 256); String hashedPw; try { SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); @@ -256,10 +385,11 @@ public class AccountMgr { /** * generates a secure random salt, Base64 encoded + * * @return String Base64 encoded * @author Malte Schulze Hobeling */ - private static String getSalt(){ + private static String getSalt() { SecureRandom sec = new SecureRandom(); byte[] salt = new byte[16]; sec.nextBytes(salt); @@ -269,59 +399,62 @@ public class AccountMgr { /** * gives the invoice for one month and one child - * @param date YYYY-MM the month + * + * @param date YYYY-MM the month * @param childId id of child * @return the invoice as a List * @author Malte Schulze Hobeling */ - protected static List getInvoice(String date, String childId){ + protected static List getInvoice(String date, String childId) { List invoice = new ArrayList<>(); List child = Database.getEntryById("child", Long.parseLong(childId)); - if(child.size() != 1){ + if (child.size() != 1) { return invoice; } invoice.add("Monatsabrechnung " + date); String[] childParts = child.get(0).split(":"); invoice.add(childParts[1] + ", " + childParts[2]); - String[] food_planH = {"date"}; - String[] food_planD = {date+"%"}; - List food_plan = Database.select("food_plan",food_planH,food_planD); + String[] food_planH = { "date" }; + String[] food_planD = { date + "%" }; + List food_plan = Database.select("food_plan", food_planH, food_planD); for (String day : food_plan) { String[] food_planParts = day.split(":"); - String[] food_selectionH = {"childid","food_planid"}; - String[] food_selectionD = {childId,food_planParts[0]}; - List food_selection = Database.select("food_selection",food_selectionH,food_selectionD); + String[] food_selectionH = { "childid", "food_planid" }; + String[] food_selectionD = { childId, food_planParts[0] }; + List food_selection = Database.select("food_selection", food_selectionH, food_selectionD); for (String food_select : food_selection) { String[] food_selectParts = food_select.split(":"); - List food = Database.getEntryById("food",Long.parseLong(food_selectParts[3])); + List food = Database.getEntryById("food", Long.parseLong(food_selectParts[3])); String[] foodParts = food.get(0).split(":"); String line = food_planParts[1] + ": " + foodParts[1]; invoice.add(line); } } double price = getPrice(); - invoice.add("Total: " + (invoice.size()-2) + " X " + price + "€ = " + ((invoice.size()-2)*price) + "€"); + invoice.add("Total: " + (invoice.size() - 2) + " X " + price + "€ = " + ((invoice.size() - 2) * price) + "€"); return invoice; } /** * gets the price per meal from the database and converts it to double + * * @return double price * @author Malte Schulze Hobeling */ - protected static double getPrice(){ - List priceEntry = Database.getEntryById("price",1); - return Double.parseDouble(priceEntry.get(0).split(":")[1])/100.0; + protected static double getPrice() { + List priceEntry = Database.getEntryById("price", 1); + return Double.parseDouble(priceEntry.get(0).split(":")[1]) / 100.0; } /** * converts the price per meal to integer and updates it in the database + * * @param price double * @author Malte Schulze Hobeling */ - protected static void setPrice(double price){ - String[] priceH = {"id","price"}; - String[] priceD = {"1", String.valueOf((int)(price*100))}; - Database.update("price",priceH,priceD); + protected static void setPrice(double price) { + String[] priceH = { "id", "price" }; + String[] priceD = { "1", String.valueOf((int) (price * 100)) }; + Database.update("price", priceH, priceD); } } diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/ChildController.java b/src/main/java/com/bib/essensbestellungsverwaltung/ChildController.java new file mode 100644 index 0000000..ad3f6cc --- /dev/null +++ b/src/main/java/com/bib/essensbestellungsverwaltung/ChildController.java @@ -0,0 +1,141 @@ +package com.bib.essensbestellungsverwaltung; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.*; +import org.controlsfx.control.CheckComboBox; + +import java.util.ArrayList; +import java.util.List; + +public class ChildController { + public TextField firstName; + public ChoiceBox childChoiceBox; + public TextField lastName; + public Button kindHinzufügenButton; + public CheckComboBox allergienComboBox; + public Button kindLoeschenButton; + + private Child currentChild = null; + + private long selectedChildId; + + @FXML + public void initialize() { + kindLoeschenButton.setDisable(true); + updateChildChoiceBoxItems(); + + List a = Database.getTable("allergy"); + ObservableList allergies = FXCollections.observableArrayList(); + for (String allergie : a) { + allergies.add(allergie.split(":")[0] + ": " + allergie.split(":")[1]); + } + allergienComboBox.getItems().addAll(allergies); + } + + public void onSelectChild(ActionEvent mouseEvent) { + selectedChildId = Integer.parseInt(childChoiceBox.getValue().toString().split(":")[0]); + System.out.println("Selected Child: " + selectedChildId); + + clearInputs(); + + if(selectedChildId == 0) { + kindHinzufügenButton.setText("Kind Hinzufügen"); + kindLoeschenButton.setDisable(true); + return; + } + + // Get selected child and update fields + currentChild = AccountMgr.getChildById(selectedChildId); + firstName.setText(currentChild.getFirstname()); + lastName.setText(currentChild.getName()); + for (AllergySeverity a : currentChild.getAllergies()){ + allergienComboBox.getCheckModel().check((int) a.getAllergy().getId() - 1); + } + kindHinzufügenButton.setText("Kind updaten"); + kindLoeschenButton.setDisable(false); + } + + public void onKindHinzufügen(ActionEvent actionEvent) { + if(childChoiceBox.getValue() == null){ + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Ungültige Eingabe"); + alert.setHeaderText("Sie müssen ein Kind auswählen"); + alert.showAndWait(); + return; + } + + if(lastName.getText().isBlank() || firstName.getText().isBlank()){ + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Ungültige Eingabe"); + alert.setHeaderText("Es wurden nicht alle Felder ausgefüllt"); + alert.showAndWait(); + return; + } + + Address adress = AccountMgr.currentUser.getAddress(); + List allergies = new ArrayList<>(); + allergienComboBox.getCheckModel().getCheckedItems().stream().forEach(a -> { + long id = Integer.parseInt(a.toString().split(":")[0]); + String name = a.toString().split(":")[1].trim(); + // TODO: Allergy Severity + allergies.add(new AllergySeverity(new Allergy(id, name, ""), 2, null)); + }); + + if(selectedChildId == 0){ + long id = AccountMgr.createChild(new Child(lastName.getText(), firstName.getText(), adress, allergies)); + System.out.println("Child created: " + id); + + if(id <= 0){ + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Es ist ein fehler beim erstellen des Kinds aufgetreten"); + alert.showAndWait(); + return; + } + AccountMgr.matchParentChild(String.valueOf(AccountMgr.currentUser.getId()), String.valueOf(id)); + + childChoiceBox.getItems().add(id + ": " + firstName.getText() + " " + lastName.getText()); + childChoiceBox.setValue(childChoiceBox.getItems().get(childChoiceBox.getItems().size() - 1)); + clearInputs(); + onSelectChild(null); + + Alert alert = new Alert(Alert.AlertType.CONFIRMATION); + alert.setTitle("Kind erstellt"); + alert.setHeaderText("Es wurde ein Kind erstellt"); + alert.showAndWait(); + }else { + long id = AccountMgr.updateChild(new Child(currentChild.getId(), lastName.getText(), firstName.getText(), adress, allergies)); + System.out.println("Updated Child: " + id); + } + } + + private void clearInputs(){ + firstName.setText(""); + lastName.setText(""); + allergienComboBox.getCheckModel().clearChecks(); + } + + public void updateChildChoiceBoxItems(){ + List childList = AccountMgr.getAllChildrenFromParentWithId(AccountMgr.currentUser.getId()); + + ObservableList childOptions = FXCollections.observableArrayList(childList.stream().map(c -> c.getId() + ": " + c.getFirstname() + " " + c.getName()).toList().toArray(new String[0])); + childOptions.add(0, "0: neues Kind erstellen"); + childChoiceBox.setItems(childOptions); + } + + public void onKindLoeschen(ActionEvent actionEvent) { + AccountMgr.deleteChildWithId(currentChild.getId()); + System.out.println("Deleted Child: " + currentChild.getId()); + + childChoiceBox.getItems().remove(childChoiceBox.getItems().stream().filter(v -> v.equals(currentChild.getId() + ": " + currentChild.getFirstname() + " " + currentChild.getName())).findFirst().get()); + childChoiceBox.setValue(childChoiceBox.getItems().get(1)); + + onSelectChild(null); + + Alert alert = new Alert(Alert.AlertType.CONFIRMATION); + alert.setTitle("Kind wurde gelöscht"); + alert.showAndWait(); + } +} diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/CreateFoodController.java b/src/main/java/com/bib/essensbestellungsverwaltung/CreateFoodController.java index 7370fdf..d0cdef4 100644 --- a/src/main/java/com/bib/essensbestellungsverwaltung/CreateFoodController.java +++ b/src/main/java/com/bib/essensbestellungsverwaltung/CreateFoodController.java @@ -1,14 +1,17 @@ package com.bib.essensbestellungsverwaltung; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.fxml.FXML; +import javafx.scene.control.Alert; import javafx.scene.control.RadioButton; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.text.Text; +import org.controlsfx.control.CheckComboBox; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class CreateFoodController { @@ -27,9 +30,18 @@ public class CreateFoodController { @FXML public RadioButton isFleischRadio; @FXML - public TextArea allergienTextBox; - @FXML public Text responseText; + public CheckComboBox allergienComboBox; + + @FXML + public void initialize() { + List a = Database.getTable("allergy"); + ObservableList allergies = FXCollections.observableArrayList(); + for (String allergie : a) { + allergies.add(allergie.split(":")[0] + ": " + allergie.split(":")[1]); + } + allergienComboBox.getItems().addAll(allergies); + } @FXML public void onAbbrechen(ActionEvent actionEvent) { @@ -37,22 +49,63 @@ public class CreateFoodController { } @FXML - public void onHinzufügen(ActionEvent actionEvent) { + public void onHinzufuegen(ActionEvent actionEvent) { String gerichtName = name.getText(); String beschreibung = description.getText(); + + if(gerichtName.isBlank()){ + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Ungültige Eingabe"); + alert.setHeaderText("Es wurden nicht alle Felder ausgefüllt"); + alert.setContentText("Das Feld 'Name' ist nicht ausgefüllt"); + alert.showAndWait(); + return; + } + if(beschreibung.isBlank()){ + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Ungültige Eingabe"); + alert.setHeaderText("Es wurden nicht alle Felder ausgefüllt"); + alert.setContentText("Das Feld 'Beschreibung' ist nicht ausgefüllt"); + alert.showAndWait(); + return; + } + if(!isHauptgerichtRadio.isSelected() && !isDessertRadio.isSelected()){ - // art auswähelen + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Ungültige Eingabe"); + alert.setHeaderText("Es wurden nicht alle Felder ausgefüllt"); + alert.setContentText("Das Feld 'Art' ist nicht ausgefüllt"); + alert.showAndWait(); + return; } boolean isNachtisch = !isHauptgerichtRadio.isSelected(); - if(!isVegetarischRadio.isSelected() && !isVeganRadio.isSelected() && isFleischRadio.isSelected()){ - // Typ auswählen + if(!isVegetarischRadio.isSelected() && !isVeganRadio.isSelected() && !isFleischRadio.isSelected()){ + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Ungültige Eingabe"); + alert.setHeaderText("Es wurden nicht alle Felder ausgefüllt"); + alert.setContentText("Das Feld 'Typ' ist nicht ausgefüllt"); + alert.showAndWait(); + return; } int ft = isVeganRadio.isSelected() ? 1 : isVeganRadio.isSelected() ? 2 : 3; FoodType foodType = new FoodType(ft, "Vegan"); List allergies = new ArrayList<>(); - // TODO: allergien hinzufügen + allergienComboBox.getCheckModel().getCheckedItems().stream().forEach(a -> { + long id = Integer.parseInt(a.toString().split(":")[0]); + String name = a.toString().split(":")[1].trim(); + allergies.add((new Allergy(id, name, ""))); + }); + System.out.println(allergies.get(0).getName()); long id = FoodMgr.createFood(new Food(gerichtName, beschreibung, isNachtisch, foodType, allergies)); + if(id <= 0){ + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Es ist ein Problem beim Erstellen des Gerichts aufgetreten"); + alert.setHeaderText("Bitte überprüfen Sie ihre Eingabe"); + alert.setContentText("Es besteht die Möglichkeit, dass dieses Gericht bereits existiert"); + alert.showAndWait(); + return; + } System.out.println("Food created with id: " + id); responseText.setText("New Food Created"); clearInputs(); @@ -66,6 +119,6 @@ public class CreateFoodController { isVeganRadio.setSelected(false); isVegetarischRadio.setSelected(false); isFleischRadio.setSelected(false); - allergienTextBox.setText(""); + allergienComboBox.getCheckModel().clearChecks(); } } diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/CreateFoodplanController.java b/src/main/java/com/bib/essensbestellungsverwaltung/CreateFoodplanController.java index e7290c7..2dc41f2 100644 --- a/src/main/java/com/bib/essensbestellungsverwaltung/CreateFoodplanController.java +++ b/src/main/java/com/bib/essensbestellungsverwaltung/CreateFoodplanController.java @@ -31,20 +31,28 @@ public class CreateFoodplanController { ChoiceBox secondDessert; private List foods; + private List veganFoods; private List desserts; + private List veganDesserts; private FoodPlan currentPlan; @FXML public void initialize() { + veganFoods = FoodMgr.getVeganFood(false); foods = FoodMgr.getFood(false); + veganDesserts = FoodMgr.getVeganFood(true); desserts = FoodMgr.getFood(true); + ObservableList foodOptions = FXCollections.observableArrayList(foods.stream().map(food -> food.getId() + ": " + food.getName()).toList().toArray(new String[0])); - firstMeal.setItems(foodOptions); + ObservableList veganFoodOptions = FXCollections.observableArrayList(veganFoods.stream().map(food -> food.getId() + ": " + food.getName()).toList().toArray(new String[0])); + ObservableList veganDessertOptions = FXCollections.observableArrayList(veganDesserts.stream().map(dessert -> dessert.getId() + ": " + dessert.getName()).toList().toArray(new String[0])); + ObservableList dessertOptions = FXCollections.observableArrayList(desserts.stream().map(dessert -> dessert.getId() + ": " + dessert.getName()).toList().toArray(new String[0])); + firstMeal.setItems(veganFoodOptions); secondMeal.setItems(foodOptions); - ObservableList dessertOptions = FXCollections.observableArrayList(desserts.stream().map(dessert -> dessert.getId() + ": " + dessert.getName()).toList().toArray(new String[0])); - firstDessert.setItems(dessertOptions); + + firstDessert.setItems(veganDessertOptions); secondDessert.setItems(dessertOptions); date.setValue(LocalDate.now()); diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/DailyOrderController.java b/src/main/java/com/bib/essensbestellungsverwaltung/DailyOrderController.java new file mode 100644 index 0000000..7409d28 --- /dev/null +++ b/src/main/java/com/bib/essensbestellungsverwaltung/DailyOrderController.java @@ -0,0 +1,76 @@ +package com.bib.essensbestellungsverwaltung; + +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.DatePicker; +import javafx.scene.control.ListView; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +public class DailyOrderController { + public ListView listView; + public DatePicker datePicker; + public Button sendButton; + + + @FXML + public void initialize() { + datePicker.setValue(LocalDate.now()); + updatePlan(datePicker.getValue().toString()); + } + + public void onChangeDate(ActionEvent actionEvent) { + updatePlan(datePicker.getValue().toString()); + } + + + private void updatePlan(String date){ + listView.getItems().clear(); + System.out.print("Orders from " + date + " : "); + List orders = new ArrayList<>(); + FoodPlan food_plan = FoodMgr.getFoodPlan(date); + if(food_plan == null){ + sendButton.setVisible(false); + return; + } + sendButton.setVisible(true); + if(food_plan.isSent()){ + sendButton.setDisable(true); + sendButton.setText("Bestellung wurde Gesendet"); + }else { + sendButton.setDisable(false); + sendButton.setText("Bestellung senden"); + } + String sId = String.valueOf(food_plan.getId()); + String[] food_selectionH = {"food_planid","foodid"}; + Food[] foodArray = { + food_plan.getFoodVegan(), + food_plan.getFoodSecond(), + food_plan.getDessertVegan(), + food_plan.getDessertSecond() + }; + for(int i = 0; i < 4; i++){ + String foodName = foodArray[i].getName(); + String[] food_selectionD = {sId, String.valueOf(foodArray[i].getId())}; + int count = Database.count("food_selection",food_selectionH,food_selectionD); + orders.add(count+" X "+foodName); + } + + System.out.println(orders); + + + for(String order : orders){ + listView.getItems().add(order); + } + } + + public void onSendButton(ActionEvent actionEvent) { + FoodMgr.getDayOrder(datePicker.getValue().toString()); + sendButton.setDisable(true); + sendButton.setText("Bestellung wurde Gesendet"); + } +} diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/Database.java b/src/main/java/com/bib/essensbestellungsverwaltung/Database.java index 64fbd60..4cbc876 100644 --- a/src/main/java/com/bib/essensbestellungsverwaltung/Database.java +++ b/src/main/java/com/bib/essensbestellungsverwaltung/Database.java @@ -9,20 +9,23 @@ import java.util.List; /** * Basic operations on the database - * Use init() -> createDb() -> fillDb() to create the skeleton with some default values + * Use init() -> createDb() -> fillDb() to create the skeleton with some default + * values * Provides select, insert, update, delete, count operations and more + * * @author Malte Schulze Hobeling */ public class Database { - private static final String dbLocation = "jdbc:sqlite:"+Path.of("").toAbsolutePath()+"/database.db"; + private static final String dbLocation = "jdbc:sqlite:" + Path.of("").toAbsolutePath() + "/database.db"; /** * creates new database.db if it doesn't exist + * * @return true if a new database has been created * @author Malte Schulze Hobeling */ - protected static boolean init(){ - File db = new File(Path.of("").toAbsolutePath()+"/database.db"); + protected static boolean init() { + File db = new File(Path.of("").toAbsolutePath() + "/database.db"); try { return db.createNewFile(); } catch (IOException e) { @@ -32,14 +35,15 @@ public class Database { /** * connects to the database + * * @return Connection to the database * @author Malte Schulze Hobeling */ - protected static Connection connect(){ + protected static Connection connect() { Connection conn = null; - try{ + try { conn = DriverManager.getConnection(dbLocation); - }catch (SQLException e){ + } catch (SQLException e) { e.printStackTrace(); } return conn; @@ -47,9 +51,10 @@ public class Database { /** * creates the initial structure of the db + * * @author Malte Schulze Hobeling */ - protected static void createDb(){ + protected static void createDb() { String[] sql = new String[15]; sql[0] = """ CREATE TABLE IF NOT EXISTS address ( @@ -167,8 +172,8 @@ public class Database { id integer PRIMARY KEY, price integer );"""; - try(Connection conn = connect(); Statement stmt = conn.createStatement()){ - for(int i = 0; i < sql.length; i++){ + try (Connection conn = connect(); Statement stmt = conn.createStatement()) { + for (int i = 0; i < sql.length; i++) { stmt.execute(sql[i]); } } catch (SQLException e) { @@ -178,10 +183,12 @@ public class Database { /** * inserts fixed values into the database + * * @author Malte Schulze Hobeling */ - protected static void fillDb(){ + protected static void fillDb() { List sqls = new ArrayList<>(); + // food_type sqls.add(""" INSERT OR IGNORE INTO food_type (id,name) VALUES ('1','Vegan');"""); @@ -191,6 +198,7 @@ public class Database { sqls.add(""" INSERT OR IGNORE INTO food_type (id,name) VALUES ('3','Fleischhaltig');"""); + // allergy sqls.add(""" INSERT OR IGNORE INTO allergy (id,name,handle) VALUES('1','Eier','a');"""); @@ -257,6 +265,7 @@ public class Database { sqls.add(""" INSERT OR IGNORE INTO allergy (id,name,handle) VALUES('22','Konservierungsstoff','8');"""); + // severity sqls.add(""" INSERT OR IGNORE INTO severity (id,name) VALUES('1','Harmlos');"""); @@ -269,11 +278,155 @@ public class Database { sqls.add(""" INSERT OR IGNORE INTO price (id,price) VALUES('1','500');"""); - try(Connection conn = connect(); Statement stmt = conn.createStatement()){ + // user + sqls.add(""" + INSERT OR IGNORE INTO address (id,street,number,plz,city) + VALUES('1','teststreet','69','1337','Mond');"""); + sqls.add(""" + INSERT OR IGNORE INTO user (id,name,firstname,addressid,password,email) + VALUES('1','testparent','testparent','1','YOD+TB0twF2SrueBj26t5OjEJK/Al4G6/hq+IMRyBz4=.f4zL2UJW4POrf/xgJdNaiw==','testparent@test.de');"""); + sqls.add(""" + INSERT OR IGNORE INTO parent (userid) + VALUES('1');"""); + sqls.add(""" + INSERT OR IGNORE INTO user (id,name,firstname,addressid,password,email) + VALUES('2','testworker','testworker','1','YOD+TB0twF2SrueBj26t5OjEJK/Al4G6/hq+IMRyBz4=.f4zL2UJW4POrf/xgJdNaiw==','testworker@test.de');"""); + sqls.add(""" + INSERT OR IGNORE INTO worker (userid) + VALUES('2');"""); + // food + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('1','Steak','69','0','3');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('2','Schnitzel','69','0','3');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('3','Hamburger','69','0','3');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('4','Nudeln','69','0','1');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('5','Salat','69','0','1');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('6','Pudding','69','1','1');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('7','Eis','69','1','1');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('8','Wackelpudding','69','1','1');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('9','Kuchen','69','1','1');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('10','Apfel','69','1','1');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('11','Banane','69','1','1');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('12','Nudelauflauf','69','0','3');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('13','Reibekuchen','69','0','1');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('14','Gefüllte Paprika','69','0','1');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('15','Suishi','69','0','2');"""); + sqls.add(""" + INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid) + VALUES('16','Champignons','69','0','2');"""); + // child + sqls.add(""" + INSERT OR IGNORE INTO child (id,name,firstname,addressid) + VALUES('1','Lustig','Peter','1');"""); + sqls.add(""" + INSERT OR IGNORE INTO child (id,name,firstname,addressid) + VALUES('2','Wahnsinn','Rainer','1');"""); + sqls.add(""" + INSERT OR IGNORE INTO parent_child ('id',parentuserid,childid) + VALUES('1','1','1');"""); + sqls.add(""" + INSERT OR IGNORE INTO parent_child ('id',parentuserid,childid) + VALUES('2','1','2');"""); + sqls.add(""" + INSERT OR IGNORE INTO child_allergy (childid,allergyid,severityid) + VALUES('1','1','2');"""); + sqls.add(""" + INSERT OR IGNORE INTO child_allergy (childid,allergyid,severityid) + VALUES('1','3','2');"""); + sqls.add(""" + INSERT OR IGNORE INTO child_allergy (childid,allergyid,severityid) + VALUES('1','4','2');"""); + // foodplan + sqls.add(""" + INSERT OR IGNORE INTO food_plan ('id',date,food1,food2,dessert1,dessert2) + VALUES('1','2023-02-06','4','1','8','7');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_plan ('id',date,food1,food2,dessert1,dessert2) + VALUES('2','2023-02-07','5','2','6','7');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_plan ('id',date,food1,food2,dessert1,dessert2) + VALUES('3','2023-02-08','4','3','8','6');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_plan ('id',date,food1,food2,dessert1,dessert2) + VALUES('4','2023-02-09','16','1','11','10');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_plan ('id',date,food1,food2,dessert1,dessert2) + VALUES('5','2023-02-09','14','13','7','9');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_plan ('id',date,food1,food2,dessert1,dessert2) + VALUES('6','2023-02-10','13','15','8','6');"""); + // food_selection + sqls.add(""" + INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid) + VALUES('1','1','1','4');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid) + VALUES('2','1','1','8');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid) + VALUES('3','2','1','4');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid) + VALUES('4','2','1','8');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid) + VALUES('5','1','2','5');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid) + VALUES('6','1','2','7');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid) + VALUES('7','2','2','5');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid) + VALUES('8','2','2','7');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid) + VALUES('9','1','3','4');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid) + VALUES('10','1','3','8');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid) + VALUES('11','2','3','4');"""); + sqls.add(""" + INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid) + VALUES('12','2','3','6');"""); + + try (Connection conn = connect(); Statement stmt = conn.createStatement()) { for (String sql : sqls) { stmt.execute(sql); } - }catch (SQLException e){ + } catch (SQLException e) { e.printStackTrace(); } } @@ -281,35 +434,36 @@ public class Database { /** * inserts data into table and returns its id * simple duplication check - * @param table name of the database table + * + * @param table name of the database table * @param header String[] order should match with values * @param values String[] order should match with header * @return id of dataset or -1 * @author Malte Schulze Hobeling */ - protected static long insert(String table, String[] header, String[] values){ + protected static long insert(String table, String[] header, String[] values) { long id = -1; - try (Connection conn = connect()){ - String query = queryBuilder("exists",table,header,values); + try (Connection conn = connect()) { + String query = queryBuilder("exists", table, header, values); PreparedStatement psQuery = conn.prepareStatement(query); ResultSet rsQuery = psQuery.executeQuery(); - if(rsQuery.next()){ + if (rsQuery.next()) { boolean found = rsQuery.getBoolean(1); - if(!found){ - String sql = queryBuilder("insert",table,header,values); - String[] rowId = {"id"}; - PreparedStatement ps = conn.prepareStatement(sql,rowId); + if (!found) { + String sql = queryBuilder("insert", table, header, values); + String[] rowId = { "id" }; + PreparedStatement ps = conn.prepareStatement(sql, rowId); ps.execute(); ResultSet rs = ps.getGeneratedKeys(); - if(rs.next()){ + if (rs.next()) { id = rs.getLong(1); } - }else{ - query = queryBuilder("selectMatch",table,header,values); + } else { + query = queryBuilder("selectMatch", table, header, values); psQuery = conn.prepareStatement(query); rsQuery = psQuery.executeQuery(); - if(rsQuery.next()) { + if (rsQuery.next()) { id = rsQuery.getLong(1); } } @@ -323,25 +477,26 @@ public class Database { /** * returns a single id that matches the given data - * @param table the table that contains the searched entry + * + * @param table the table that contains the searched entry * @param header the header of the table, order should match with values * @param values the data you want the id of, order should match witch values * @return one id matching the given data or -1 if no match has been found * @author Malte Schulze Hobeling */ - protected static long getSingleId(String table, String[] header, String[] values){ + protected static long getSingleId(String table, String[] header, String[] values) { long id = -1; - try(Connection conn = connect()){ - String sql = queryBuilder("selectMatch",table,header,values); + try (Connection conn = connect()) { + String sql = queryBuilder("selectMatch", table, header, values); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); - if(rs.next()){ + if (rs.next()) { id = rs.getLong(1); - if(rs.next()){ + if (rs.next()) { id = -1; } } - }catch (SQLException e){ + } catch (SQLException e) { e.printStackTrace(); return id; } @@ -351,63 +506,66 @@ public class Database { /** * @deprecated */ - protected static void printSampleQuery(){ + protected static void printSampleQuery() { String sql = """ SELECT * FROM food_type WHERE id > ?;"""; String sql1 = """ SELECT * FROM allergy WHERE id > ?;"""; - try(Connection conn = connect()){ + try (Connection conn = connect()) { PreparedStatement ps = conn.prepareStatement(sql); PreparedStatement ps1 = conn.prepareStatement(sql1); - ps.setInt(1,0); + ps.setInt(1, 0); ResultSet rs = ps.executeQuery(); System.out.println("food_type"); - while (rs.next()){ + while (rs.next()) { System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name")); } System.out.println("allergy"); - ps1.setInt(1,0); + ps1.setInt(1, 0); rs = ps1.executeQuery(); - while (rs.next()){ + while (rs.next()) { System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name")); } - }catch (SQLException e){ + } catch (SQLException e) { e.printStackTrace(); } } /** * deletes an entry from table with matching id + * * @param table the table that contains the entry you want to delete - * @param id the id of the entry you want to delete + * @param id the id of the entry you want to delete * @author Malte Schulze Hobeling */ - protected static void delete(String table, long id){ + protected static void delete(String table, long id) { String sql = "DELETE FROM " + table + " WHERE id = ?;"; - try(Connection conn = connect();PreparedStatement ps = conn.prepareStatement(sql)){ - ps.setLong(1,id); + try (Connection conn = connect(); PreparedStatement ps = conn.prepareStatement(sql)) { + ps.setLong(1, id); ps.executeUpdate(); - }catch (SQLException e){ + } catch (SQLException e) { e.printStackTrace(); } } /** * its a query builder it builds queries - * exists: checks if an entry with the given parameters exists in table - * selectMatch: returns all matching rows from table - * insert: inserts or ignores into table - * count: counts exact matches from table - * update: updates table, header/values[0] is used as WHERE, using id is recommended header/values[1+] are used - * as SET - * @param type exists, selectMatch, insert, count, update - * @param table table + * exists: checks if an entry with the given parameters exists in table + * selectMatch: returns all matching rows from table + * insert: inserts or ignores into table + * count: counts exact matches from table + * update: updates table, header/values[0] is used as WHERE, using id is + * recommended header/values[1+] are used + * as SET + * + * @param type exists, selectMatch, insert, count, update + * @param table table * @param header header * @param values values * @return sql statement as String * @author Malte Schulze Hobeling */ - private static String queryBuilder(String type,String table, String[] header, String[] values){ + private static String queryBuilder(String type, String table, String[] header, String[] values) { String sql; StringBuilder sb = new StringBuilder(); switch (type) { @@ -469,7 +627,7 @@ public class Database { sb.append(header[0]); sb.append(" = "); sb.append(values[0]); - for(int i = 1; i < header.length; i++){ + for (int i = 1; i < header.length; i++) { sb.append(" AND "); sb.append(header[i]); sb.append(" = "); @@ -482,12 +640,12 @@ public class Database { sb.append(" SET "); sb.append(header[1]); sb.append(" = "); - sb.append(values[1]); - for(int i = 2; i < header.length; i++){ + sb.append("'" + values[1] + "'"); + for (int i = 2; i < header.length; i++) { sb.append(", "); sb.append(header[i]); sb.append(" = "); - sb.append(values[i]); + sb.append("'" + values[i] + "'"); } sb.append(" WHERE "); sb.append(header[0]); @@ -501,61 +659,64 @@ public class Database { /** * returns a list of all entries + * * @param table the table you want * @return a list of all entries as String with the fields separated by ":" * @author Malte Schulze Hobeling */ - protected static List getTable(String table){ + protected static List getTable(String table) { List data = new ArrayList<>(); StringBuilder sb; - try(Connection conn = connect()) { + try (Connection conn = connect()) { String sql = "SELECT * FROM " + table; PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int count = rsmd.getColumnCount(); - while (rs.next()){ + while (rs.next()) { sb = new StringBuilder(); sb.append(rs.getString(1)); - for(int i = 2; i <= count; i++){ + for (int i = 2; i <= count; i++) { sb.append(":"); sb.append(rs.getString(i)); } data.add(sb.toString()); } - }catch (SQLException e){ + } catch (SQLException e) { return new ArrayList<>(); } return data; } /** - * issues a select query on the database for the given table and the given values checked with LIKE - * @param table the table you want the data from + * issues a select query on the database for the given table and the given + * values checked with LIKE + * + * @param table the table you want the data from * @param header header for the WHERE portion, order should match with values * @param values values for the WHERE portion, order should match with header * @return a list of the matching data as String separated by ":" * @author Malte Schulze Hobeling */ - protected static List select(String table,String[] header, String[] values){ + protected static List select(String table, String[] header, String[] values) { List data = new ArrayList<>(); StringBuilder sb; - String sql = queryBuilder("selectMatch",table,header,values); - try(Connection conn = connect()) { + String sql = queryBuilder("selectMatch", table, header, values); + try (Connection conn = connect()) { PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int count = rsmd.getColumnCount(); - while (rs.next()){ + while (rs.next()) { sb = new StringBuilder(); sb.append(rs.getString(1)); - for(int i = 2; i <= count; i++){ + for (int i = 2; i <= count; i++) { sb.append(":"); sb.append(rs.getString(i)); } data.add(sb.toString()); } - }catch (SQLException e){ + } catch (SQLException e) { e.printStackTrace(); return data; } @@ -564,25 +725,26 @@ public class Database { /** * returns the entry from table with the given id + * * @param table the table you want the entry from - * @param id the id of the entry you want + * @param id the id of the entry you want * @return a list of String separated by ":" * @author Malte Schulze Hobeling */ - protected static List getEntryById(String table, long id){ + protected static List getEntryById(String table, long id) { List data = new ArrayList<>(); StringBuilder sb; String sql = "SELECT * FROM " + table + " WHERE id = ?;"; try (Connection conn = connect()) { PreparedStatement ps = conn.prepareStatement(sql); - ps.setLong(1,id); + ps.setLong(1, id); ResultSet rs = ps.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int count = rsmd.getColumnCount(); - while (rs.next()){ + while (rs.next()) { sb = new StringBuilder(); sb.append(rs.getString(1)); - for(int i = 2; i <= count; i++){ + for (int i = 2; i <= count; i++) { sb.append(":"); sb.append(rs.getString(i)); } @@ -597,38 +759,40 @@ public class Database { /** * counts the number of matching entries - * @param table the table you want to count + * + * @param table the table you want to count * @param header the properties you want to count on * @param values the values for the properties * @return the number of found rows * @author Malte Schulze Hobeling */ - protected static int count(String table,String[] header,String[] values){ - String sql = queryBuilder("count",table,header,values); - try(Connection conn = connect()) { + protected static int count(String table, String[] header, String[] values) { + String sql = queryBuilder("count", table, header, values); + try (Connection conn = connect()) { PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); return rs.getInt(1); - }catch (SQLException e){ + } catch (SQLException e) { return -1; } } /** * updates an entry in the database - * @param table the table you want to update + * + * @param table the table you want to update * @param header [0] is used as WHERE, everything else in SET * @param values [0] is used as WHERE, everything else in SET * @return number of rows affected or -1 on error * @author Malte Schulze Hobeling */ - protected static int update(String table,String[] header,String[] values){ - try(Connection conn = connect()) { - String sql = queryBuilder("update",table,header,values); + protected static int update(String table, String[] header, String[] values) { + try (Connection conn = connect()) { + String sql = queryBuilder("update", table, header, values); PreparedStatement ps = conn.prepareStatement(sql); return ps.executeUpdate(); - }catch (SQLException e){ - return -1; + } catch (SQLException e) { + return -1; } } } diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/FoodMgr.java b/src/main/java/com/bib/essensbestellungsverwaltung/FoodMgr.java index b3239c4..a35e0c8 100644 --- a/src/main/java/com/bib/essensbestellungsverwaltung/FoodMgr.java +++ b/src/main/java/com/bib/essensbestellungsverwaltung/FoodMgr.java @@ -235,6 +235,9 @@ public class FoodMgr { public static List getDayOrder(String date){ List orders = new ArrayList<>(); FoodPlan food_plan = getFoodPlan(date); + if(food_plan == null){ + return orders; + } String sId = String.valueOf(food_plan.getId()); String[] food_selectionH = {"food_planid","foodid"}; Food[] foodArray = { diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/HelloController.java b/src/main/java/com/bib/essensbestellungsverwaltung/HelloController.java index 3d17171..f158f41 100644 --- a/src/main/java/com/bib/essensbestellungsverwaltung/HelloController.java +++ b/src/main/java/com/bib/essensbestellungsverwaltung/HelloController.java @@ -5,11 +5,12 @@ import javafx.scene.control.Alert; import javafx.scene.control.Label; import javafx.scene.control.TextField; +/** + * @author Reshad Meher + * Username, Passwort , login + */ + public class HelloController { - /** - * @autor: Reshad Meher - * Username, Passwort , login - */ @FXML private TextField unsernameEingabe; diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/InvoiceController.java b/src/main/java/com/bib/essensbestellungsverwaltung/InvoiceController.java index aebd7ba..0a319db 100644 --- a/src/main/java/com/bib/essensbestellungsverwaltung/InvoiceController.java +++ b/src/main/java/com/bib/essensbestellungsverwaltung/InvoiceController.java @@ -1,12 +1,20 @@ package com.bib.essensbestellungsverwaltung; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import javafx.fxml.FXML; +import javafx.scene.control.Alert; import javafx.scene.control.ChoiceBox; import javafx.scene.control.Spinner; import javafx.scene.input.MouseEvent; import javafx.scene.text.Text; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Calendar; +import java.util.List; public class InvoiceController { @FXML @@ -14,6 +22,9 @@ public class InvoiceController { @FXML ChoiceBox monatChoiceBox; + @FXML + ChoiceBox childChoiceBox; + @FXML Spinner jahrSpinner; @@ -21,12 +32,35 @@ public class InvoiceController { public void initialize() { monatChoiceBox.setValue(intToMonth(Calendar.getInstance().get(Calendar.MONTH) + 1)); jahrSpinner.getValueFactory().setValue(Calendar.getInstance().get(Calendar.YEAR)); + + List childList = AccountMgr.getAllChildren(); + ObservableList childOptions = FXCollections.observableArrayList(childList.stream() + .map(c -> c.getId() + ": " + c.getFirstname() + " " + c.getName()).toList().toArray(new String[0])); + childChoiceBox.setItems(childOptions); } @FXML void onRechnungErstellenClick(MouseEvent mouseEvent) { - responseText.setText(monatChoiceBox.getValue().toString() + jahrSpinner.getValue()); - // hier rechnung erstellen + if (childChoiceBox.getValue() == null) { + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Es wurde kein Kind ausgewählt"); + alert.setHeaderText("Bitte wählen sie ein Kind aus"); + alert.showAndWait(); + } + + String childId = childChoiceBox.getValue().toString().split(":")[0]; + String date = String.format("%d-%02d", Integer.parseInt(jahrSpinner.getValue().toString()), + monthToInt(monatChoiceBox.getValue().toString())); + + System.out.println("Invoice (" + date + ") from child: " + childId); + + List invoice = AccountMgr.getInvoice(date, childId); + + responseText.setText(invoice.get(invoice.size() - 1)); + + // TODO: show invoice + Child child = AccountMgr.getChildById(Long.parseLong(childId)); + exportInvoice("Rechnung_" + date + "_" + childId + "_" + child.getName() +"_" + child.getFirstname(), invoice); } private int monthToInt(String month) { @@ -64,4 +98,21 @@ public class InvoiceController { default -> ""; }; } + + private void exportInvoice(String filename, List invoice) { + try { + Files.createDirectories(Path.of(Path.of("").toAbsolutePath() + "/Rechnungen")); + + // TODO: save invoice to pdf or word + File file = new File(Path.of("").toAbsolutePath() + "/Rechnungen/" + filename + ".txt"); + if (file.createNewFile()) { + System.out.println("File created: " + file.getName()); + } else { + System.out.println("File already exists."); + } + Files.write(Path.of(file.getAbsolutePath()), invoice); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/OrderHistoryController.java b/src/main/java/com/bib/essensbestellungsverwaltung/OrderHistoryController.java new file mode 100644 index 0000000..fa46ec3 --- /dev/null +++ b/src/main/java/com/bib/essensbestellungsverwaltung/OrderHistoryController.java @@ -0,0 +1,37 @@ +package com.bib.essensbestellungsverwaltung; + +import javafx.fxml.FXML; +import javafx.scene.control.ListView; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class OrderHistoryController { + public ListView listView; + + @FXML + public void initialize() { + List children = AccountMgr.getAllChildrenFromParentWithId(AccountMgr.currentUser.getId()); + + List orders = new ArrayList<>(); + + for (Child child : children) { + List selections = Database.select("food_selection", new String[] { "childid" }, new String[] { String.valueOf(child.getId()) }); + for (String selection : selections) { + String[] selectionParts = selection.split(":"); + String foodplanid = selectionParts[2]; + String foodid = selectionParts[3]; + String foodName = FoodMgr.getFoodById(Long.parseLong(foodid)).getName(); + String date = FoodMgr.getFoodPlanById(Long.parseLong(foodplanid)).getDate(); + orders.add(String.format("%s\t %s \t %s", date, child.getFirstname(), foodName)); + } + } + + Collections.sort(orders); + Collections.reverse(orders); + for(String order : orders){ + listView.getItems().add(order); + } + } +} diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/Parent.java b/src/main/java/com/bib/essensbestellungsverwaltung/Parent.java index 1f3f7df..8b9178b 100644 --- a/src/main/java/com/bib/essensbestellungsverwaltung/Parent.java +++ b/src/main/java/com/bib/essensbestellungsverwaltung/Parent.java @@ -4,21 +4,30 @@ import java.util.ArrayList; import java.util.List; /** - * one constructor is used to create new parents the other is used to create existing parents from database + * one constructor is used to create new parents the other is used to create + * existing parents from database + * * @author Malte Schulze Hobeling */ -public class Parent extends User{ +public class Parent extends User { List children; - public Parent(long id, String name, String firstname, String password, String email, Address address, List children) { + public Parent(long id, String name, String firstname, String password, String email, Address address, + List children) { super(id, name, firstname, password, email, address); this.children = children; } + public Parent(String name, String firstname, String password, String email, Address address) { super(name, firstname, password, email, address); this.children = new ArrayList<>(); } + public Parent(User user) { + super(user.getId(), user.getName(), user.getFirstname(), user.getPassword(), user.getEmail(), user.getAddress()); + this.children = new ArrayList<>(); + } + public List getChildren() { return children; } diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/ParentMenuController.java b/src/main/java/com/bib/essensbestellungsverwaltung/ParentMenuController.java index 4f21d1b..97ec918 100644 --- a/src/main/java/com/bib/essensbestellungsverwaltung/ParentMenuController.java +++ b/src/main/java/com/bib/essensbestellungsverwaltung/ParentMenuController.java @@ -44,7 +44,7 @@ public class ParentMenuController { @FXML public void onBestellungClick(MouseEvent mouseEvent) { setButtonActive(bestellungButton); - changePage("dailyOrder-view.fxml"); + changePage("orderHistory-view.fxml"); } @FXML @@ -55,7 +55,8 @@ public class ParentMenuController { @FXML public void onAusloggenClick(MouseEvent mouseEvent) throws IOException { - StartViewApplication.changeScene("workerMenu-view.fxml"); + AccountMgr.currentUser = null; + StartViewApplication.changeScene("login-view.fxml"); } private void changePage(String page) { diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/SingUpController.java b/src/main/java/com/bib/essensbestellungsverwaltung/SingUpController.java index f6a5b6f..b01c029 100644 --- a/src/main/java/com/bib/essensbestellungsverwaltung/SingUpController.java +++ b/src/main/java/com/bib/essensbestellungsverwaltung/SingUpController.java @@ -1,11 +1,110 @@ +/** + * @autor: Reshad Meher + */ package com.bib.essensbestellungsverwaltung; -import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.Alert; +import javafx.scene.control.PasswordField; +import javafx.scene.control.TextField; + +import java.io.IOException; public class SingUpController { - public void onKontoErstellenBtClick(ActionEvent actionEvent) { + @FXML + private TextField tfLastName; + @FXML + private TextField tfFirstName; + @FXML + private TextField tfEmail; + @FXML + private PasswordField pfPassword; + @FXML + private TextField tfPostCode; + @FXML + private TextField tfCity; + + @FXML + private TextField tfStreet; + @FXML + private TextField tfHouseNumber; + @FXML + private void onKontoErstellenBtClick(){ + String lastName = tfLastName.getText(); + String firstName = tfFirstName.getText(); + String email = tfEmail.getText(); + String password = pfPassword.getText(); + String postCode = tfPostCode.getText(); + String city = tfCity.getText(); + String street = tfStreet.getText(); + String houseNumber = tfHouseNumber.getText(); + Alert alert; + if(lastName.isEmpty() || firstName.isEmpty() || email.isEmpty() || password.isEmpty() || postCode.isEmpty() || + city.isEmpty() || street.isEmpty() || houseNumber.isEmpty()){ + + if(lastName.isEmpty()){ + alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Name' ist leer."); + alert.showAndWait(); + } else if (firstName.isEmpty()) { + alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Vorname' ist leer."); + alert.showAndWait(); + } else if (email.isEmpty()) { + alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'E-Mail' ist leer."); + alert.showAndWait(); + } else if (password.isEmpty()) { + alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Passwort' ist leer."); + alert.showAndWait(); + } else if (postCode.isEmpty()) { + alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Postleitzahl' ist leer."); + alert.showAndWait(); + } else if (city.isEmpty()) { + alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Stadt' ist leer."); + alert.showAndWait(); + } else if (street.isEmpty()) { + alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Straße' ist leer."); + alert.showAndWait(); + }else { + alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Hausnummer' ist leer."); + alert.showAndWait(); + } + + }else { + Address newAdresse = new Address(street,houseNumber,postCode,city); + User newUser = new User(lastName,firstName,password,email,newAdresse); + if(StartViewApplication.firstLaunch){ + long id = AccountMgr.createWorker(new Worker(newUser)); + if(id < 1) { + Alert a = new Alert(Alert.AlertType.ERROR,"Es ist ein Fehler bei der Erstellung Ihres Accounts aufgetreten."); + a.showAndWait(); + return; + } + alert = new Alert(Alert.AlertType.CONFIRMATION,"Mitarbeiter Account erfolgreich erstellt"); + alert.showAndWait(); + StartViewApplication.firstLaunch = false; + }else { + long id = AccountMgr.createParent(new Parent(newUser)); + if(id < 1) { + Alert a = new Alert(Alert.AlertType.ERROR,"Es ist ein Fehler bei der Erstellung Ihres Accounts aufgetreten."); + a.showAndWait(); + return; + } + alert = new Alert(Alert.AlertType.CONFIRMATION,"Eltern Account erfolgreich erstellt"); + alert.showAndWait(); + } + tfLastName.setText(""); + tfFirstName.setText(""); + tfEmail.setText(""); + pfPassword.setText(""); + tfPostCode.setText(""); + tfCity.setText(""); + tfStreet.setText(""); + tfHouseNumber.setText(""); + } + } - public void onAnmeldenBtClick(ActionEvent actionEvent) { + @FXML + private void onAnmeldenBtClick() throws IOException { + StartViewApplication.changeScene("login-view.fxml"); } } diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/StartViewApplication.java b/src/main/java/com/bib/essensbestellungsverwaltung/StartViewApplication.java index 911705f..3dae544 100644 --- a/src/main/java/com/bib/essensbestellungsverwaltung/StartViewApplication.java +++ b/src/main/java/com/bib/essensbestellungsverwaltung/StartViewApplication.java @@ -15,10 +15,11 @@ import java.io.IOException; public class StartViewApplication extends Application { public static Stage primary; + public static boolean firstLaunch; @Override public void start(Stage stage) throws IOException { - FXMLLoader fxmlLoader = new FXMLLoader(StartViewApplication.class.getResource("login-view.fxml")); + FXMLLoader fxmlLoader = new FXMLLoader(StartViewApplication.class.getResource((firstLaunch) ? "signUp-view.fxml" : "login-view.fxml")); Scene scene = new Scene(fxmlLoader.load(), 1300, 750); primary = stage; stage.setTitle("Essen Bestellung im Kindergarten"); @@ -29,7 +30,7 @@ public class StartViewApplication extends Application { } public static void main(String[] args) { - Database.init(); + firstLaunch = Database.init(); Database.createDb(); Database.fillDb(); //Database.printSampleQuery(); diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/Worker.java b/src/main/java/com/bib/essensbestellungsverwaltung/Worker.java index 45161f3..60f02f8 100644 --- a/src/main/java/com/bib/essensbestellungsverwaltung/Worker.java +++ b/src/main/java/com/bib/essensbestellungsverwaltung/Worker.java @@ -1,14 +1,21 @@ package com.bib.essensbestellungsverwaltung; /** - * one constructor is used to create new worker the other is used to create existing worker from database + * one constructor is used to create new worker the other is used to create + * existing worker from database + * * @author Malte Schulze Hobeling */ -public class Worker extends User{ +public class Worker extends User { public Worker(long id, String name, String firstname, String password, String email, Address address) { super(id, name, firstname, password, email, address); } + public Worker(String name, String firstname, String password, String email, Address address) { super(name, firstname, password, email, address); } + + public Worker(User user) { + super(user.getId(), user.getName(), user.getFirstname(), user.getPassword(), user.getEmail(), user.getAddress()); + } } diff --git a/src/main/java/com/bib/essensbestellungsverwaltung/WorkerMenuController.java b/src/main/java/com/bib/essensbestellungsverwaltung/WorkerMenuController.java index 42d7bcb..b64cfe3 100644 --- a/src/main/java/com/bib/essensbestellungsverwaltung/WorkerMenuController.java +++ b/src/main/java/com/bib/essensbestellungsverwaltung/WorkerMenuController.java @@ -12,7 +12,6 @@ import java.io.IOException; public class WorkerMenuController { @FXML public BorderPane contentView; - @FXML Button tagesbestellungButton; @FXML @@ -28,13 +27,13 @@ public class WorkerMenuController { @FXML public void initialize() { - changePage("menue-view.fxml"); + changePage("dailyOrder-view.fxml"); setButtonActive(tagesbestellungButton); } @FXML public void onTagesbestellungenClick(MouseEvent mouseEvent) { - changePage("menue-view.fxml"); + changePage("dailyOrder-view.fxml"); setButtonActive(tagesbestellungButton); } @@ -71,7 +70,8 @@ public class WorkerMenuController { @FXML public void onAusloggenClick(MouseEvent mouseEvent) throws IOException { - StartViewApplication.changeScene("parentMenu-view.fxml"); + AccountMgr.currentUser = null; + StartViewApplication.changeScene("login-view.fxml"); } private void changePage(String page) { diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 79a355a..bc620dc 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -3,6 +3,7 @@ module com.bib.essensbestellungsverwaltung { requires javafx.fxml; requires java.sql; requires org.xerial.sqlitejdbc; + requires org.controlsfx.controls; opens com.bib.essensbestellungsverwaltung to javafx.fxml; diff --git a/src/main/resources/com/bib/essensbestellungsverwaltung/createFood-view.fxml b/src/main/resources/com/bib/essensbestellungsverwaltung/createFood-view.fxml index 1e81cbf..bc398d7 100644 --- a/src/main/resources/com/bib/essensbestellungsverwaltung/createFood-view.fxml +++ b/src/main/resources/com/bib/essensbestellungsverwaltung/createFood-view.fxml @@ -4,6 +4,7 @@ + @@ -90,8 +91,8 @@ -