58 Commits

Author SHA1 Message Date
Johannes Kantz
9b6d60a571 fix: remove debug print 2023-02-01 07:27:12 +01:00
Johannes Kantz
f567320ec3 fix: changed window size to prevent essensplan overflow 2023-02-01 07:23:43 +01:00
Johannes Kantz
324ce53bd4 add: createFoodplan 2023-02-01 07:22:09 +01:00
Johannes Kantz
f71aba3505 add: createFood 2023-02-01 07:21:59 +01:00
Johannes Kantz
5ee0288736 add: database.db to gitignore 2023-02-01 07:21:37 +01:00
72c2e9da16 Childview & Elternmenue hinzugefügt 2023-01-31 15:38:08 +01:00
pbs2h21asc
8927755462 Admin Controller 2023-01-31 14:34:37 +01:00
636ac5ed3a Merge pull request 'feat/menus' (#7) from feat/menus into main
Reviewed-on: #7
2023-01-31 10:31:15 +01:00
Johannes Kantz
1c85261c7b add: change Scenes 2023-01-31 07:41:21 +01:00
Johannes Kantz
c57e65fadb fix: refactor 2023-01-31 07:18:37 +01:00
Johannes Kantz
c890819be7 fix: changed window size 2023-01-31 07:03:11 +01:00
Johannes Kantz
c981fbca19 add: Rechnung View 2023-01-31 06:01:53 +01:00
Johannes Kantz
2b5839f0ea add: workerMenu 2023-01-31 04:30:25 +01:00
Johannes Kantz
1a4d45aed4 add: parent menu 2023-01-31 04:30:09 +01:00
329acaabcb Merge pull request 'WIP_Objects' (#5) from WIP_Objects into main
Reviewed-on: #5
2023-01-30 14:14:03 +01:00
5447d7f238 Merge branch 'main' into WIP_Objects 2023-01-30 14:13:50 +01:00
e3c6513ebb „.idea/vcs.xml“ löschen 2023-01-30 14:13:10 +01:00
3f7fb06e1b „.idea/uiDesigner.xml“ löschen 2023-01-30 14:13:04 +01:00
318e1ef065 „.idea/misc.xml“ löschen 2023-01-30 14:12:59 +01:00
43a4e2aa85 „.idea/encodings.xml“ löschen 2023-01-30 14:12:54 +01:00
741b4892b8 „.idea/.gitignore“ löschen 2023-01-30 14:12:47 +01:00
50e0118ded small fix 2023-01-30 14:04:59 +01:00
2d91259953 StartViewApplication ist die Startpunkt des Projekt 2023-01-30 14:01:33 +01:00
53c603249d StartViewApplication ist die Startpunkt des Projekt 2023-01-30 14:01:19 +01:00
81bcb44d74 most Objects done 2023-01-30 04:26:30 +01:00
a0eed3ce51 Food, User 2023-01-27 15:14:36 +01:00
b97fe83f40 Merge pull request 'Richards_Branch' (#4) from Richards_Branch into main 2023-01-23 08:59:53 +01:00
27710e92af Merge branch 'main' into Richards_Branch 2023-01-23 08:59:38 +01:00
a3c3ee0fe0 Login und SingUp aktuallisiert 2023-01-18 22:32:38 +01:00
pbs2h21asc
dd69909b16 Views erstellt 2023-01-18 13:22:05 +01:00
a7bcaf13ce css + png hinzugefügt 2023-01-18 02:41:25 +01:00
f8673ca92a Views hinzugefügt 2023-01-18 02:39:17 +01:00
400ffb0e98 ParetSence 2023-01-17 22:30:56 +01:00
3bb141fb52 Views & Controller erstellt 2023-01-17 15:58:22 +01:00
ec2d3b581d fixed salt 2023-01-17 13:47:24 +01:00
e245233a23 fixed the mess 2023-01-17 08:47:09 +01:00
074107752d LoginView überarbeitet 2023-01-16 23:25:58 +01:00
8634df0d6d LoginView überarbeitet 2023-01-16 23:09:16 +01:00
8ce8c027c8 test 2023-01-16 18:37:39 +01:00
1194b163fa login view
menue view
MenueController
2023-01-16 18:06:54 +01:00
f072cc9f66 Merge remote-tracking branch 'origin/main' 2023-01-16 18:02:45 +01:00
438d18e378 salz 2023-01-16 17:23:25 +01:00
7d0855be4e Merge remote-tracking branch 'origin/main' 2023-01-16 16:58:57 +01:00
c93489d014 zeile 15 wurde geändert 2023-01-16 16:58:44 +01:00
0fcc477613 Merge pull request 'von der Wiege bis zur Bahre, Kommentare, Kommentare' (#3) from MaltesConsolenEcke into main
Reviewed-on: #3
2023-01-16 16:38:07 +01:00
0dcec76379 von der Wiege bis zur Bahre, Kommentare, Kommentare 2023-01-16 16:35:45 +01:00
9b040cd779 Merge pull request 'MaltesConsolenEcke' (#2) from MaltesConsolenEcke into main
works on my machine
2023-01-12 15:59:04 +01:00
573e17161b added invoice and order collection 2023-01-07 23:14:41 +01:00
58fb02875a added missing functionality 2023-01-06 01:51:42 +01:00
89ea9ca70e basic encryption 2023-01-06 00:02:06 +01:00
c4b31bc548 did some stuff 2023-01-05 05:06:19 +01:00
e16f0342a7 frohes Neues 2023-01-01 15:03:21 +01:00
31b6b2cc39 Username und Passwort 2022-12-22 02:02:19 +01:00
d1737b730f Merge pull request 'db' (#1) from db into main
Reviewed-on: #1
2022-12-20 15:24:58 +01:00
0a8e052582 filled food_type and allergy
created generic insert
2022-12-19 17:31:06 +01:00
8478b80407 created tables 2022-12-15 09:26:08 +01:00
83507bef98 made program executable 2022-12-13 03:35:52 +01:00
18d812e1a2 moved dbconnection to own class 2022-12-12 14:03:49 +01:00
67 changed files with 3913 additions and 77 deletions

4
.gitignore vendored
View File

@@ -35,4 +35,6 @@ build/
.vscode/
### Mac OS ###
.DS_Store
.DS_Store
/database.db

View File

@@ -69,7 +69,7 @@
<id>default-cli</id>
<configuration>
<mainClass>
com.bib.essensbestellungsverwaltung/com.bib.essensbestellungsverwaltung.HelloApplication
com.bib.essensbestellungsverwaltung/com.bib.essensbestellungsverwaltung.StartViewApplication
</mainClass>
<launcher>app</launcher>
<jlinkZipName>app</jlinkZipName>

View File

@@ -0,0 +1,258 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
public class AccountMgr {
protected static double price = 5.0;
/**
* creates a user with createUser(...) and adds its id to the 'worker' table
* @return userid or -1
*/
protected static long createWorker(Worker worker){
long id = createUser(worker);
String sId = String.valueOf(id);
Database.insert("worker", new String[]{"userid"}, new String[]{sId});
return id;
}
/**
* creates a user with createUser(...) and adds its id to the 'parent' table
* @return userid or -1
*/
protected static long createParent(Parent parent){
long id = createUser(parent);
String sId = String.valueOf(id);
Database.insert("parent", new String[]{"userid"}, new String[]{sId});
return id;
}
/**
* adds a user to the database
* @return userid or -1
*/
protected static long createUser(User user) {
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){
addressId = createAddress(user.getAddress());
}
String[] userD = {name, firstname, String.valueOf(addressId), pw, email};
return Database.insert("user", userH, userD);
}
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
* @return id of child or -1
*/
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 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);
}
return id;
}
protected static User getUserById(long id){
List<String> entry = Database.getEntryById("user",id);
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)};
List<Child> children = new ArrayList<>();
List<String> 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);
}
}
protected static Child getChildById(long id){
List<String> entry = Database.getEntryById("child",id);
String[] parts = entry.get(0).split(":");
String[] child_allergyH = {"childid"};
String[] child_allergyD = {String.valueOf(id)};
List<String> entriesAllergy = Database.select("child_allergy",child_allergyH,child_allergyD);
List<AllergySeverity> allergySeverities = new ArrayList<>();
for (String entryAllergy : entriesAllergy) {
String[] allergyParts = entryAllergy.split(":");
List<String> 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));
}
return new Child(id,parts[1],parts[2],getAddressById(Long.parseLong(parts[3])),allergySeverities);
}
protected static Address getAddressById(long id){
List<String> entry = Database.getEntryById("address",id);
String[] parts = entry.get(0).split(":");
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
* @return id of parent_child or -1
*/
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
* @return id or -1
*/
protected static long login(String email, String pw){
String[] pwH = {"email"};
String[] pwD = {email};
List<String> foundEmail = Database.select("user",pwH,pwD);
String salt;
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
salt = getSalt();
}
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
*/
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
*/
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
*/
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);
String hashedPw;
try {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] hash = factory.generateSecret(spec).getEncoded();
Base64.Encoder enc = Base64.getEncoder();
hashedPw = enc.encodeToString(hash);
} catch (InvalidKeySpecException | NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
hashedPw += "." + salt;
return hashedPw;
}
private static String getSalt(){
SecureRandom sec = new SecureRandom();
byte[] salt = new byte[16];
sec.nextBytes(salt);
Base64.Encoder enc = Base64.getEncoder();
return enc.encodeToString(salt);
}
/**
* gives the invoice for one month and one child
* @param date YYYY-MM the month
* @param childId id of child
* @return the invoice as a List
*/
protected static List<String> getInvoice(String date, String childId){
List<String> invoice = new ArrayList<>();
invoice.add("Monatsabrechnung " + date);
List<String> child = Database.getEntryById("child", Long.parseLong(childId));
String[] childParts = child.get(0).split(":");
invoice.add(childParts[1] + ", " + childParts[2]);
String[] food_planH = {"date"};
String[] food_planD = {date+"%"};
List<String> 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<String> food_selection = Database.select("food_selection",food_selectionH,food_selectionD);
for (String food_select : food_selection) {
String[] food_selectParts = food_select.split(":");
List<String> 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);
}
}
invoice.add("Total: " + (invoice.size()-2) + " X " + price + "€ = " + ((invoice.size()-2)*price) + "");
return invoice;
}
protected static void getPriceFromDb(){
List<String> priceEntry = Database.getEntryById("price",1);
price = Double.parseDouble(priceEntry.get(0).split(":")[1])/100.0;
}
protected static void setPriceInDb(){
String[] priceH = {"id","price"};
String[] priceD = {"1", String.valueOf(price*100)};
Database.update("price",priceH,priceD);
}
}

View File

@@ -0,0 +1,47 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
public class Address {
private long id;
private String street;
private String number;
private String plz;
private String city;
public long getId() {
return id;
}
public String getStreet() {
return street;
}
public String getNumber() {
return number;
}
public String getPlz() {
return plz;
}
public String getCity() {
return city;
}
public Address(long id, String street, String number, String plz, String city) {
this.id = id;
this.street = street;
this.number = number;
this.plz = plz;
this.city = city;
}
public Address(String street, String number, String plz, String city) {
this.id = -1;
this.street = street;
this.number = number;
this.plz = plz;
this.city = city;
}
}

View File

@@ -0,0 +1,120 @@
/*Schulte*/
package com.bib.essensbestellungsverwaltung;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
public class AdminController {
@FXML
TextField lastname;
@FXML
TextField firstname;
@FXML
TextField street;
@FXML
TextField number;
@FXML
TextField city;
@FXML
TextField plz;
@FXML
TextField email;
@FXML
PasswordField password;
@FXML
protected void onBtSignUp(){
String ln = lastname.getText();
String fn = firstname.getText();
String st = street.getText();
String nr = number.getText();
String cityString = city.getText();
String plzString = plz.getText();
String emailString = email.getText();
String pw = password.getText();
boolean userData = false;
boolean pwCorrect = false;
boolean emailCorrect = false;
if(ln.isEmpty() || fn.isEmpty() || st.isEmpty() ||nr.isEmpty() || cityString.isEmpty() || plzString.isEmpty()){
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Felder");
alert.setHeaderText("Felder nicht ausgefüllt");
alert.setContentText("Bitte füllen sie alle Felder aus");
alert.showAndWait();
}
else {
userData = true;
}
if(!pw.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}$")){
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Passwort");
alert.setHeaderText("Ungültiges Passwort");
alert.setContentText("Das Passwort benötigt mindestens: \n-8 Zeichen\n-einen Kleinbuchstaben\n-einen Großbuchstaben\n-ein Sonderzeichen\n-kein Leerzeichen");
password.setText("");
alert.showAndWait();
}
else {
pwCorrect = true;
}
if(!emailString.matches("^(.+)@(\\S+)$")){
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("E-Mail");
alert.setHeaderText("Ungültige E-Mail Adresse");
alert.setContentText("Bitte geben sie eine gültige E-Mail Adresse an");
email.setText("");
alert.showAndWait();
}
else{
emailCorrect = true;
}
//String[] userData = new String[]{ln,fn,pw,emailString};
//String[] addressData = new String[]{st,nr,plzString,cityString};
if(emailCorrect && pwCorrect && userData) {
Address address = new Address(st, nr, plzString, cityString);
Worker worker = new Worker(ln, fn, pw, emailString, address);
System.out.println(AccountMgr.createWorker(worker));
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Bestätigung");
alert.setHeaderText("Bestätigung");
alert.setContentText("Mitarbeiter " + fn + " " + ln + " wurde Erfolgreich angelegt");
alert.showAndWait();
}
}
@FXML
protected void onBtCancel(){
lastname.setText("");
firstname.setText("");
street.setText("");
number.setText("");
city.setText("");
plz.setText("");
email.setText("");
password.setText("");
}
}

View File

@@ -0,0 +1,28 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
public class Allergy {
private final long id;
private final String name;
private final String handle;
public Allergy(long id, String name, String handle) {
this.id = id;
this.name = name;
this.handle = handle;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public String getHandle() {
return handle;
}
}

View File

@@ -0,0 +1,28 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
public class AllergySeverity {
private Allergy allergy;
private long severityId;
private String severity;
public AllergySeverity(Allergy allergy, long severityId, String severity) {
this.allergy = allergy;
this.severityId = severityId;
this.severity = severity;
}
public Allergy getAllergy() {
return allergy;
}
public long getSeverityId() {
return severityId;
}
public String getSeverity() {
return severity;
}
}

View File

@@ -0,0 +1,49 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.util.List;
public class Child {
private long id;
private String name;
private String firstname;
private Address address;
private List<AllergySeverity> allergies;
public Child(long id, String name, String firstname, Address address, List<AllergySeverity> allergies) {
this.id = id;
this.name = name;
this.firstname = firstname;
this.address = address;
this.allergies = allergies;
}
public Child(String name, String firstname, Address address, List<AllergySeverity> allergies) {
this.id = -1;
this.name = name;
this.firstname = firstname;
this.address = address;
this.allergies = allergies;
}
public String getName() {
return name;
}
public String getFirstname() {
return firstname;
}
public Address getAddress() {
return address;
}
public long getId() {
return id;
}
public List<AllergySeverity> getAllergies() {
return allergies;
}
}

View File

@@ -0,0 +1,326 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ConsoleLib {
public static void createWorkerPrompt(){
Scanner sc = new Scanner(System.in);
System.out.println("Registrierung eines neuen Mitarbeiters");
String[] userData = new String[4];
String[] addressData = new String[4];
System.out.print("Nachname: ");
userData[0] = sc.nextLine();
System.out.print("Vorname: ");
userData[1] = sc.nextLine();
System.out.print("Straße: ");
addressData[0] = sc.nextLine();
System.out.print("Hausnummer: ");
addressData[1] = sc.nextLine();
System.out.print("Postleitzahl: ");
addressData[2] = sc.nextLine();
System.out.print("Stadt: ");
addressData[3] = sc.nextLine();
System.out.print("Email: ");
userData[3] = sc.nextLine();
System.out.print("Passwort: ");
userData[2] = sc.nextLine();
Address address = new Address(addressData[0],addressData[1],addressData[2],addressData[3]);
Worker worker = new Worker(userData[0],userData[1],userData[2],userData[3],address);
long id = AccountMgr.createWorker(worker);
if(id < 1){
System.out.println("Fehler beim erstellen");
}
}
public static void createParentPrompt(){
Scanner sc = new Scanner(System.in);
System.out.println("Registrierung eines neuen Elternteils");
String[] userData = new String[4];
String[] addressData = new String[4];
System.out.print("Nachname: ");
userData[0] = sc.nextLine();
System.out.print("Vorname: ");
userData[1] = sc.nextLine();
System.out.print("Straße: ");
addressData[0] = sc.nextLine();
System.out.print("Hausnummer: ");
addressData[1] = sc.nextLine();
System.out.print("Postleitzahl: ");
addressData[2] = sc.nextLine();
System.out.print("Stadt: ");
addressData[3] = sc.nextLine();
System.out.print("Email: ");
userData[3] = sc.nextLine();
System.out.print("Passwort: ");
userData[2] = sc.nextLine();
Address address = new Address(addressData[0],addressData[1],addressData[2],addressData[3]);
Parent parent = new Parent(userData[0],userData[1],userData[2],userData[3],address);
long id = AccountMgr.createParent(parent);
if(id < 1){
System.out.println("Fehler beim erstellen");
}
}
public static void createChildPrompt(String parentId){
Scanner sc = new Scanner(System.in);
String[] childData = new String[3];
System.out.println("Registrierung eines neuen Kindes");
System.out.print("Nachname: ");
childData[0] = sc.nextLine();
System.out.print("Vorname: ");
childData[1] = sc.nextLine();
System.out.println("Bitte geben Sie die Nummer der passenden Adresse an: ");
for (String s : Database.getTable("address")) {
String[] parts = s.split(":");
System.out.printf("Nr.: %s Straße: %s Hausnr.: %s PLZ: %s Stadt: %s%n",parts[0],parts[1],parts[2],parts[3],parts[4]);
}
System.out.print("Adressnummer: ");
childData[2] = sc.nextLine();
for (String s : Database.getTable("allergy")) {
String[] parts = s.split(":");
System.out.printf("Nr. %s %s%n",parts[0],parts[1]);
}
System.out.println("Bitte Geben Sie die Nr der Allergien und Ihre Schwere an: ");
System.out.print("Allergien (Nr mit , getrennt[1,4,5,16]): ");
String allergies = sc.nextLine();
String[] allergyData = allergies.split(",");
System.out.print("Schweren (1 Harmlos - 3 Kritisch[2,3,1,3]): ");
String severities = sc.nextLine();
String[] severityData = severities.split(",");
Address address = AccountMgr.getAddressById(Long.parseLong(childData[2]));
List<AllergySeverity> allergySeverities = new ArrayList<>();
for(int i = 0; i < allergyData.length; i++){
List<String> allergySeverity = Database.getEntryById("severity", Long.parseLong(severityData[i]));
String[] asParts = allergySeverity.get(0).split(":");
allergySeverities.add(new AllergySeverity(FoodMgr.getAllergyById(Long.parseLong(allergyData[0])),Long.parseLong(asParts[0]),asParts[1]));
}
Child child = new Child(childData[0],childData[1],address,allergySeverities);
long id = AccountMgr.createChild(child);
if(id < 1){
System.out.println("Fehler beim erstellen");
return;
}
String sId = String.valueOf(id);
if(AccountMgr.matchParentChild(parentId,sId) == -1){
System.out.println("Fehler beim verknüpfen");
}
}
public static void createFoodPrompt(){
Scanner sc = new Scanner(System.in);
String[] foodData = new String[4];
System.out.println("Registrierung eines neuen Essens");
System.out.print("Name: ");
foodData[0] = sc.nextLine();
System.out.print("Beschreibung: ");
foodData[1] = sc.nextLine();
System.out.print("Ist es ein Dessert?[0/1]: ");
foodData[2] = sc.nextLine();
System.out.print("Ist es vegan[1], vegetarisch[2] oder fleischhaltig[3]: ");
foodData[3] = sc.nextLine();
for (String s : Database.getTable("allergy")) {
String[] parts = s.split(":");
System.out.printf("Nr. %s %s%n",parts[0],parts[1]);
}
System.out.println("Bitte geben Sie die Nr. aller zutreffenden Allergien mit Komma getrennt an [1,3,6]");
System.out.print("Allergienummer: ");
String allergies = sc.nextLine();
String[] allergyData = allergies.split(",");
FoodType foodType = FoodMgr.getFoodTypeById(Long.parseLong(foodData[3]));
List<Allergy> allergyList = new ArrayList<>();
for (String data : allergyData) {
allergyList.add(FoodMgr.getAllergyById(Long.parseLong(data)));
}
boolean isDessert = !foodData[2].equals("0");
Food food = new Food(foodData[0],foodData[1],isDessert,foodType,allergyList);
if(FoodMgr.createFood(food) < 1){
System.out.println("Fehler");
}
}
public static User loginPrompt(){
System.out.println("Login");
Scanner sc = new Scanner(System.in);
User user = null;
while (user == null){
System.out.print("Email: ");
String email = sc.nextLine();
if(email.isEmpty()){
return null;
}
System.out.print("Passwort: ");
String pw = sc.nextLine();
long id = AccountMgr.login(email,pw);
if(id == -1){
System.out.println("Login fehlgeschlagen");
}else {
user = AccountMgr.getUserById(id);
}
}
System.out.println("Login erfolgreich");
return user;
}
public static void matchParentChildPrompt(String parentId){
System.out.println("Wählen Sie ihr Kind aus: ");
Database.getTable("child");
Scanner sc = new Scanner(System.in);
System.out.print("Nr: ");
String childId = sc.nextLine();
if(AccountMgr.matchParentChild(parentId,childId) == -1){
System.out.println("Fehler");
}
}
public static void tablePrompt(){
Scanner sc = new Scanner(System.in);
System.out.print("Table: ");
String table = sc.nextLine();
printConsole(Database.getTable(table));
}
public static void deletePrompt(){
Scanner sc = new Scanner(System.in);
System.out.println("Löschen");
System.out.print("Tabelle: ");
String table = sc.nextLine();
System.out.print("Id: ");
long id = sc.nextLong();
sc.nextLine();
Database.delete(table,id);
}
public static void printConsole(List<String> list){
for (String entry : list) {
System.out.println(entry);
}
}
public static void createFood_planPrompt(){
System.out.println("Erstellen eines Essensplans");
String[] food_planData = new String[5];
Scanner sc = new Scanner(System.in);
System.out.print("Bitte geben Sie das Datum im Format YYYY-MM-DD an: ");
food_planData[0] = sc.nextLine();
List<Food> veganMain = FoodMgr.getVeganFood(false);
for (Food food : veganMain) {
System.out.println(food.getId() + " : " + food.getName());
}
System.out.print("Veganes Hauptgericht Nr: ");
food_planData[1] = sc.nextLine();
List<Food> foodMain = FoodMgr.getFood(false);
for (Food food : foodMain) {
System.out.println(food.getId() + " : " + food.getName());
}
System.out.print("Zweites Hauptgericht Nr: ");
food_planData[2] = sc.nextLine();
List<Food> veganDessert = FoodMgr.getVeganFood(true);
for (Food food : veganDessert) {
System.out.println(food.getId() + " : " + food.getName());
}
System.out.print("Veganes Dessert Nr: ");
food_planData[3] = sc.nextLine();
List<Food> foodDessert = FoodMgr.getFood(true);
for (Food food : foodDessert) {
System.out.println(food.getId() + " : " + food.getName());
}
System.out.print("Zweites Dessert Nr: ");
food_planData[4] = sc.nextLine();
FoodPlan foodPlan = new FoodPlan(food_planData[0],
FoodMgr.getFoodById(Long.parseLong(food_planData[1])),
FoodMgr.getFoodById(Long.parseLong(food_planData[2])),
FoodMgr.getFoodById(Long.parseLong(food_planData[3])),
FoodMgr.getFoodById(Long.parseLong(food_planData[4])));
long id = FoodMgr.createFood_plan(foodPlan);
if(id < 0){
System.out.println("Fehler");
}
}
public static void showFood_planPrompt(){
System.out.println("Essensplan zum Anzeigen auswählen");
Scanner sc = new Scanner(System.in);
System.out.print("Bitte geben Sie das Datum im Format YYYY-MM-DD an: ");
String date = sc.nextLine();
FoodPlan plan = FoodMgr.getFoodPlan(date);
List<String> foodList = new ArrayList<>();
StringBuilder sb;
sb = new StringBuilder();
sb.append("Tag: ");
sb.append(plan.getDate());
sb.append(" Veganesgericht: ");
sb.append(plan.getFoodVegan().getName());
sb.append(" Zweites Hauptgericht: ");
sb.append(plan.getFoodSecond().getName());
sb.append(" Veganesdessert: ");
sb.append(plan.getDessertVegan().getName());
sb.append(" Zweites Dessert: ");
sb.append(plan.getDessertSecond().getName());
foodList.add(sb.toString());
printConsole(foodList);
}
public static void createFood_selectionPrompt(){
System.out.println("Essensauswahl");
Scanner sc = new Scanner(System.in);
String[] food_selectionData = new String[3];
System.out.print("Kind ID: ");
food_selectionData[0] = sc.nextLine();
System.out.print("Datum: ");
String date = sc.nextLine();
String[] foodPlanParts = Database.select("food_plan", new String[]{"date"}, new String[]{date}).get(0).split(":");
food_selectionData[1] = foodPlanParts[0];
System.out.println("Hauptspeisen: ");
System.out.println(Database.select("food",new String[]{"id"},new String[]{foodPlanParts[2]}).get(0));
System.out.println(Database.select("food",new String[]{"id"},new String[]{foodPlanParts[3]}).get(0));
System.out.print("Id: ");
food_selectionData[2] = sc.nextLine();
if(FoodMgr.createFood_selection(food_selectionData) < 1){
System.out.println("Fehler");
}
System.out.println("Nachspeisen: ");
System.out.println(Database.select("food",new String[]{"id"},new String[]{foodPlanParts[4]}).get(0));
System.out.println(Database.select("food",new String[]{"id"},new String[]{foodPlanParts[5]}).get(0));
System.out.print("Id: ");
food_selectionData[2] = sc.nextLine();
if(FoodMgr.createFood_selection(food_selectionData) < 1){
System.out.println("Fehler");
}
}
public static void dayOrderPrompt(){
System.out.println("Zusammenfassung des Tages");
System.out.print("Datum eingeben: ");
Scanner sc = new Scanner(System.in);
String date = sc.nextLine();
List<String> dayOrder = FoodMgr.getDayOrder(date);
for (String food : dayOrder) {
System.out.println(food);
}
}
public static void invoicePrompt(){
System.out.println("Monatsabrechnung");
System.out.print("Monat(YYYY-MM): ");
Scanner sc = new Scanner(System.in);
String date = sc.nextLine();
System.out.print("ID des Kindes: ");
String id = sc.nextLine();
List<String> invoice = AccountMgr.getInvoice(date,id);
printConsole(invoice);
}
public static void changePricePrompt(){
System.out.print("Neuer Preis: ");
Scanner sc = new Scanner(System.in);
double price = sc.nextDouble();
sc.nextLine();
AccountMgr.price = price;
AccountMgr.setPriceInDb();
}
}

View File

@@ -0,0 +1,114 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.util.Scanner;
public class ConsoleMain {
static User currentUser = null;
static boolean running = true;
public static void main(String[] args) {
boolean firstRun = Database.init();
if(firstRun){
Database.createDb();
Database.fillDb();
ConsoleLib.createWorkerPrompt();
}
AccountMgr.getPriceFromDb();
while (running){
if(currentUser == null){
defaultMenu();
}else{
if(currentUser.getClass().getSimpleName().equals("Worker")){
adminMenu();
}else if(currentUser.getClass().getSimpleName().equals("Parent")){
parentMenu();
}
}
}
}
public static void defaultMenu(){
System.out.println("0: Programm beenden");
System.out.println("1: Login");
System.out.println("2: Essensplan anzeigen");
System.out.println("3: Registrieren");
System.out.print("Auswahl: ");
Scanner sc = new Scanner(System.in);
String selection = sc.nextLine();
switch (selection) {
case "0" -> running = false;
case "1" -> {
currentUser = ConsoleLib.loginPrompt();
}
case "2" -> ConsoleLib.showFood_planPrompt();
case "3" -> ConsoleLib.createParentPrompt();
}
}
public static void adminMenu(){
System.out.println("0: Ausloggen");
System.out.println("1: Einen neuen Mitarbeiter anlegen");
System.out.println("2: Ein neues Elternteil anlegen");
System.out.println("3: Ein neues Kind anlegen");
System.out.println("4: Kind einem Elternteil zuordnen");
System.out.println("5: Ein neues Essen anlegen");
System.out.println("6: Einen Essensplan erstellen");
System.out.println("7: Essensplan anzeigen");
System.out.println("8: Essen auswählen");
System.out.println("9: Bestellungen des Tages sammeln");
System.out.println("10: Monatsabrechnung");
System.out.println("11: Preis ändern");
System.out.println("x1: Table");
System.out.println("x2: Löschen");
System.out.print("Auswahl: ");
Scanner sc = new Scanner(System.in);
String selection = sc.nextLine();
switch (selection) {
case "0" -> {
currentUser = null;
}
case "1" -> ConsoleLib.createWorkerPrompt();
case "2" -> ConsoleLib.createParentPrompt();
case "3" -> ConsoleLib.createChildPrompt(String.valueOf(currentUser.getId()));
case "4" -> ConsoleLib.matchParentChildPrompt(String.valueOf(currentUser.getId()));
case "5" -> ConsoleLib.createFoodPrompt();
case "6" -> ConsoleLib.createFood_planPrompt();
case "7" -> ConsoleLib.showFood_planPrompt();
case "8" -> ConsoleLib.createFood_selectionPrompt();
case "9" -> ConsoleLib.dayOrderPrompt();
case "10" -> ConsoleLib.invoicePrompt();
case "11" -> ConsoleLib.changePricePrompt();
case "x1" -> ConsoleLib.tablePrompt();
case "x2" -> ConsoleLib.deletePrompt();
}
}
public static void parentMenu(){
System.out.println("0: Ausloggen");
System.out.println("3: Ein neues Kind anlegen");
System.out.println("7: Essensplan anzeigen");
System.out.println("8: Essen auswählen");
System.out.print("Auswahl: ");
Scanner sc = new Scanner(System.in);
String selection = sc.nextLine();
switch (selection) {
case "0" -> {
currentUser = null;
}
case "3" -> ConsoleLib.createChildPrompt(String.valueOf(currentUser.getId()));
case "6" -> ConsoleLib.tablePrompt();
case "7" -> ConsoleLib.showFood_planPrompt();
case "8" -> ConsoleLib.createFood_selectionPrompt();
}
}
}

View File

@@ -0,0 +1,71 @@
package com.bib.essensbestellungsverwaltung;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.text.Text;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CreateFoodController {
@FXML
public TextField name;
@FXML
public TextArea description;
@FXML
public RadioButton isHauptgerichtRadio;
@FXML
public RadioButton isDessertRadio;
@FXML
public RadioButton isVegetarischRadio;
@FXML
public RadioButton isVeganRadio;
@FXML
public RadioButton isFleischRadio;
@FXML
public TextArea allergienTextBox;
@FXML
public Text responseText;
@FXML
public void onAbbrechen(ActionEvent actionEvent) {
clearInputs();
}
@FXML
public void onHinzufügen(ActionEvent actionEvent) {
String gerichtName = name.getText();
String beschreibung = description.getText();
if(!isHauptgerichtRadio.isSelected() && !isDessertRadio.isSelected()){
// art auswähelen
}
boolean isNachtisch = !isHauptgerichtRadio.isSelected();
if(!isVegetarischRadio.isSelected() && !isVeganRadio.isSelected() && isFleischRadio.isSelected()){
// Typ auswählen
}
int ft = isVeganRadio.isSelected() ? 1 : isVeganRadio.isSelected() ? 2 : 3;
FoodType foodType = new FoodType(ft, "Vegan");
List<Allergy> allergies = new ArrayList<>();
// TODO: allergien hinzufügen
long id = FoodMgr.createFood(new Food(gerichtName, beschreibung, isNachtisch, foodType, allergies));
System.out.println("Food created with id: " + id);
responseText.setText("New Food Created");
clearInputs();
}
private void clearInputs(){
name.setText("");
description.setText("");
isHauptgerichtRadio.setSelected(false);
isDessertRadio.setSelected(false);
isVeganRadio.setSelected(false);
isVegetarischRadio.setSelected(false);
isFleischRadio.setSelected(false);
allergienTextBox.setText("");
}
}

View File

@@ -0,0 +1,119 @@
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.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.DatePicker;
import java.time.LocalDate;
import java.util.List;
public class CreateFoodplanController {
@FXML
Button erstellenButton;
@FXML
DatePicker date;
@FXML
ChoiceBox firstMeal;
@FXML
ChoiceBox secondMeal;
@FXML
ChoiceBox firstDessert;
@FXML
ChoiceBox secondDessert;
private List<Food> foods;
private List<Food> desserts;
private FoodPlan currentPlan;
@FXML
public void initialize() {
foods = FoodMgr.getFood(false);
desserts = FoodMgr.getFood(true);
ObservableList<Object> foodOptions = FXCollections.observableArrayList(foods.stream().map(food -> food.getId() + ": " + food.getName()).toList().toArray(new String[0]));
firstMeal.setItems(foodOptions);
secondMeal.setItems(foodOptions);
ObservableList<Object> dessertOptions = FXCollections.observableArrayList(desserts.stream().map(dessert -> dessert.getId() + ": " + dessert.getName()).toList().toArray(new String[0]));
firstDessert.setItems(dessertOptions);
secondDessert.setItems(dessertOptions);
date.setValue(LocalDate.now());
onDateChange(null);
}
@FXML
public void onPlanErstellen(ActionEvent actionEvent) {
if (date.getValue() == null ||
firstMeal.getValue().toString().isBlank() ||
secondMeal.getValue().toString().isBlank() ||
firstDessert.getValue().toString().isBlank() ||
secondDessert.getValue().toString().isBlank()
) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Ungültige Eingabe");
alert.setHeaderText("Es wurden nicht alle Felder ausgefüllt");
alert.setContentText("Es kann sein, dass Sie erst Gerichte erstellen müssen, um alle Felder auszufüllen");
alert.showAndWait();
return;
}
int firstMealId = Integer.parseInt(firstMeal.getValue().toString().split(":")[0]);
int secondMealId = Integer.parseInt(secondMeal.getValue().toString().split(":")[0]);
int firstDessertId = Integer.parseInt(firstDessert.getValue().toString().split(":")[0]);
int secondDessertId = Integer.parseInt(secondDessert.getValue().toString().split(":")[0]);
Food f1 = foods.stream().filter(food -> food.getId() == firstMealId).findFirst().get();
Food f2 = foods.stream().filter(food -> food.getId() == secondMealId).findFirst().get();
Food d1 = desserts.stream().filter(dessert -> dessert.getId() == firstDessertId).findFirst().get();
Food d2 = desserts.stream().filter(dessert -> dessert.getId() == secondDessertId).findFirst().get();
String d = date.getValue().toString();
if (currentPlan != null) { // update Foodplan
long id = currentPlan.getId();
FoodPlan plan = new FoodPlan(id, d, f1, f2, d1, d2, false);
long i = FoodMgr.updateFood_plan(plan);
System.out.println("Foodplan updated: " + i);
} else { // create new Foodplan
FoodPlan plan = new FoodPlan(d, f1, f2, d1, d2);
long id = FoodMgr.createFood_plan(plan);
System.out.println("Foodplan created with id: " + id);
}
}
@FXML
public void onAbbrechen(ActionEvent actionEvent) {
}
@FXML
public void onDateChange(ActionEvent actionEvent) {
currentPlan = FoodMgr.getFoodPlan(date.getValue().toString());
if (currentPlan != null) { // current FoodPlan already exists and can be edited
firstMeal.setValue(currentPlan.getFoodVegan().getId() + ": " + currentPlan.getFoodVegan().getName());
secondMeal.setValue(currentPlan.getFoodSecond().getId() + ": " + currentPlan.getFoodSecond().getName());
firstDessert.setValue(currentPlan.getDessertVegan().getId() + ": " + currentPlan.getDessertVegan().getName());
secondDessert.setValue(currentPlan.getDessertSecond().getId() + ": " + currentPlan.getDessertSecond().getName());
erstellenButton.setText("Plan updaten");
} else { // current Foodplan does not exist
erstellenButton.setText("Plan erstellen");
firstMeal.setValue(null);
secondMeal.setValue(null);
firstDessert.setValue(null);
secondDessert.setValue(null);
}
}
}

View File

@@ -0,0 +1,605 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class Database {
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
*/
protected static boolean init(){
File db = new File(Path.of("").toAbsolutePath()+"/database.db");
try {
return db.createNewFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* connects to the database
* @return Connection to the database
*/
protected static Connection connect(){
Connection conn = null;
try{
conn = DriverManager.getConnection(dbLocation);
}catch (SQLException e){
e.printStackTrace();
}
return conn;
}
/**
* creates the initial structure of the db
*/
protected static void createDb(){
String[] sql = new String[15];
sql[0] = """
CREATE TABLE IF NOT EXISTS address (
id integer PRIMARY KEY,
street text,
number text,
plz text,
city text
);""";
sql[1] = """
CREATE TABLE IF NOT EXISTS food_type (
id integer PRIMARY KEY,
name text UNIQUE
);""";
sql[2] = """
CREATE TABLE IF NOT EXISTS allergy (
id integer PRIMARY KEY,
name text UNIQUE,
handle text UNIQUE
);""";
sql[3] = """
CREATE TABLE IF NOT EXISTS severity (
id integer PRIMARY KEY,
name text UNIQUE
);""";
sql[4] = """
CREATE TABLE IF NOT EXISTS user (
id integer PRIMARY KEY,
name text,
firstname text,
addressid integer,
password text,
email text UNIQUE,
FOREIGN KEY(addressid) REFERENCES address(id)
);""";
sql[5] = """
CREATE TABLE IF NOT EXISTS child (
id integer PRIMARY KEY,
name text,
firstname text,
addressid integer,
FOREIGN KEY(addressid) REFERENCES address(id)
);""";
sql[6] = """
CREATE TABLE IF NOT EXISTS worker (
userid integer PRIMARY KEY,
FOREIGN KEY(userid) REFERENCES user(id)
);""";
sql[7] = """
CREATE TABLE IF NOT EXISTS parent (
userid integer PRIMARY KEY,
FOREIGN KEY(userid) REFERENCES user(id)
);""";
sql[8] = """
CREATE TABLE IF NOT EXISTS parent_child (
id integer PRIMARY KEY,
parentuserid integer,
childid integer,
FOREIGN KEY(parentuserid) REFERENCES parent(userid),
FOREIGN KEY(childid) REFERENCES child(id)
);""";
sql[9] = """
CREATE TABLE IF NOT EXISTS child_allergy (
id integer PRIMARY KEY,
childid integer,
allergyid integer,
severityid integer,
FOREIGN KEY(childid) REFERENCES child(id),
FOREIGN KEY(allergyid) REFERENCES allergy(id),
FOREIGN KEY(severityid) REFERENCES severity(id)
);""";
sql[10] = """
CREATE TABLE IF NOT EXISTS food (
id integer PRIMARY KEY,
name text UNIQUE,
description text,
isdessert integer,
food_typeid integer,
FOREIGN KEY(food_typeid) REFERENCES food_type(id)
);""";
sql[11] = """
CREATE TABLE IF NOT EXISTS food_plan (
id integer PRIMARY KEY,
date text UNIQUE,
food1 integer,
food2 integer,
dessert1 integer,
dessert2 integer,
issent integer DEFAULT '0',
FOREIGN KEY(food1) REFERENCES food(id),
FOREIGN KEY(food2) REFERENCES food(id),
FOREIGN KEY(dessert1) REFERENCES food(id),
FOREIGN KEY(dessert2) REFERENCES food(id)
);""";
sql[12] = """
CREATE TABLE IF NOT EXISTS food_restriction (
id integer PRIMARY KEY,
foodid integer,
allergyid integer,
FOREIGN KEY(foodid) REFERENCES food(id),
FOREIGN KEY(allergyid) REFERENCES allergy(id)
);""";
sql[13] = """
CREATE TABLE IF NOT EXISTS food_selection (
id integer PRIMARY KEY,
childid integer,
food_planid integer,
foodid integer,
FOREIGN KEY(childid) REFERENCES child(id),
FOREIGN KEY(food_planid) REFERENCES food_plan(id),
FOREIGN KEY(foodid) REFERENCES food(id)
);""";
sql[14] = """
CREATE TABLE IF NOT EXISTS price (
id integer PRIMARY KEY,
price integer
);""";
try(Connection conn = connect(); Statement stmt = conn.createStatement()){
for(int i = 0; i < sql.length; i++){
stmt.execute(sql[i]);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* inserts fixed values into the database
*/
protected static void fillDb(){
List<String> sqls = new ArrayList<>();
sqls.add("""
INSERT OR IGNORE INTO food_type (id,name)
VALUES ('1','Vegan');""");
sqls.add("""
INSERT OR IGNORE INTO food_type (id,name)
VALUES ('2','Vegetarisch');""");
sqls.add("""
INSERT OR IGNORE INTO food_type (id,name)
VALUES ('3','Fleischhaltig');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('1','Eier','a');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('2','Soja','b');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('3','Milch','c');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('4','Erdnüsse','d');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('5','Weichtiere','e');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('6','Krebstiere','f');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('7','Getreide','g');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('8','Senf','h');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('9','Sesam','i');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('10','Schwefeldioxid und Sulfit','j');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('11','Nüsse','k');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('12','Sellerie','l');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('13','Fische','m');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('14','Lupinen','n');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('15','Nitrit-Pökelsalz','1');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('16','Phosphat','2');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('17','Nitrat','3');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('18','Antioxidationsmittel','4');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('19','Farbstoff','5');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('20','Geschmacksverstärker','6');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('21','Süßungsmittel','7');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('22','Konservierungsstoff','8');""");
sqls.add("""
INSERT OR IGNORE INTO severity (id,name)
VALUES('1','Harmlos');""");
sqls.add("""
INSERT OR IGNORE INTO severity (id,name)
VALUES('2','Warnung');""");
sqls.add("""
INSERT OR IGNORE INTO severity (id,name)
VALUES('3','Kritisch');""");
sqls.add("""
INSERT OR IGNORE INTO price (id,price)
VALUES('1','500');""");
try(Connection conn = connect(); Statement stmt = conn.createStatement()){
for (String sql : sqls) {
stmt.execute(sql);
}
}catch (SQLException e){
e.printStackTrace();
}
}
/**
* inserts data into table and returns its id
* does not insert if the exact set already exists
* @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
*/
protected static long insert(String table, String[] header, String[] values){
long id = -1;
try (Connection conn = connect()){
String query = queryBuilder("exists",table,header,values);
PreparedStatement psQuery = conn.prepareStatement(query);
ResultSet rsQuery = psQuery.executeQuery();
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);
ps.execute();
ResultSet rs = ps.getGeneratedKeys();
if(rs.next()){
id = rs.getLong(1);
}
}else{
query = queryBuilder("selectMatch",table,header,values);
psQuery = conn.prepareStatement(query);
rsQuery = psQuery.executeQuery();
if(rsQuery.next()) {
id = rsQuery.getLong(1);
}
}
}
} catch (SQLException e) {
return id;
}
return id;
}
/**
* returns a single id that matches the given data
* @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
*/
protected static long getSingleId(String table, String[] header, String[] values){
long id = -1;
try(Connection conn = connect()){
String sql = queryBuilder("selectMatch",table,header,values);
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
if(rs.next()){
id = rs.getLong(1);
if(rs.next()){
id = -1;
}
}
}catch (SQLException e){
e.printStackTrace();
return id;
}
return id;
}
/**
* @deprecated
*/
protected static void printSampleQuery(){
String sql = """
SELECT * FROM food_type WHERE id > ?;""";
String sql1 = """
SELECT * FROM allergy WHERE id > ?;""";
try(Connection conn = connect()){
PreparedStatement ps = conn.prepareStatement(sql);
PreparedStatement ps1 = conn.prepareStatement(sql1);
ps.setInt(1,0);
ResultSet rs = ps.executeQuery();
System.out.println("food_type");
while (rs.next()){
System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name"));
}
System.out.println("allergy");
ps1.setInt(1,0);
rs = ps1.executeQuery();
while (rs.next()){
System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name"));
}
}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
*/
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);
ps.executeUpdate();
}catch (SQLException e){
e.printStackTrace();
}
}
private static String queryBuilder(String type,String table, String[] header, String[] values){
String sql;
StringBuilder sb = new StringBuilder();
switch (type) {
case "exists" -> {
sb = new StringBuilder("SELECT (count(*) > 0) as found FROM ");
sb.append(table);
sb.append(" WHERE ");
sb.append(header[0]);
sb.append(" LIKE '");
sb.append(values[0]);
sb.append("'");
for (int i = 1; i < header.length; i++) {
sb.append(" AND ");
sb.append(header[i]);
sb.append(" LIKE '");
sb.append(values[i]);
sb.append("'");
}
}
case "selectMatch" -> {
sb = new StringBuilder("SELECT * FROM ");
sb.append(table);
sb.append(" WHERE ");
sb.append(header[0]);
sb.append(" LIKE '");
sb.append(values[0]);
sb.append("'");
for (int i = 1; i < header.length; i++) {
sb.append(" AND ");
sb.append(header[i]);
sb.append(" LIKE '");
sb.append(values[i]);
sb.append("'");
}
}
case "insert" -> {
sb = new StringBuilder("INSERT OR IGNORE INTO ");
sb.append(table);
sb.append(" (");
sb.append(header[0]);
for (int i = 1; i < header.length; i++) {
sb.append(",");
sb.append(header[i]);
}
sb.append(") VALUES('");
sb.append(values[0]);
sb.append("'");
for (int i = 1; i < values.length; i++) {
sb.append(",'");
sb.append(values[i]);
sb.append("'");
}
sb.append(");");
}
case "count" -> {
sb = new StringBuilder("SELECT COUNT(*) FROM ");
sb.append(table);
sb.append(" WHERE ");
sb.append(header[0]);
sb.append(" = ");
sb.append(values[0]);
for(int i = 1; i < header.length; i++){
sb.append(" AND ");
sb.append(header[i]);
sb.append(" = ");
sb.append(values[i]);
}
}
case "update" -> {
sb = new StringBuilder("UPDATE ");
sb.append(table);
sb.append(" SET ");
sb.append(header[1]);
sb.append(" = ");
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(" WHERE ");
sb.append(header[0]);
sb.append(" = ");
sb.append(values[0]);
}
}
sql = sb.toString();
return sql;
}
/**
* 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 ":"
*/
protected static List<String> getTable(String table){
List<String> data = new ArrayList<>();
StringBuilder sb;
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()){
sb = new StringBuilder();
sb.append(rs.getString(1));
for(int i = 2; i <= count; i++){
sb.append(":");
sb.append(rs.getString(i));
}
data.add(sb.toString());
}
}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
* @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 ":"
*/
protected static List<String> select(String table,String[] header, String[] values){
List<String> data = new ArrayList<>();
StringBuilder sb;
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()){
sb = new StringBuilder();
sb.append(rs.getString(1));
for(int i = 2; i <= count; i++){
sb.append(":");
sb.append(rs.getString(i));
}
data.add(sb.toString());
}
}catch (SQLException e){
e.printStackTrace();
return data;
}
return data;
}
/**
* 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
* @return a list of String separated by ":"
*/
protected static List<String> getEntryById(String table, long id){
List<String> 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);
ResultSet rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
while (rs.next()){
sb = new StringBuilder();
sb.append(rs.getString(1));
for(int i = 2; i <= count; i++){
sb.append(":");
sb.append(rs.getString(i));
}
data.add(sb.toString());
}
} catch (SQLException e) {
e.printStackTrace();
return data;
}
return data;
}
/**
* counts the number of matching entries
* @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
*/
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){
return -1;
}
}
/**
* updates an entry in the database
* @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
*/
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;
}
}
}

View File

@@ -0,0 +1,62 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.util.List;
public class Food {
private long id;
private String name;
private String description;
private boolean isDessert;
private FoodType foodType;
private List<Allergy> allergies;
public Food(long id, String name, String description, boolean isDessert, FoodType foodType, List<Allergy> allergies) {
this.id = id;
this.name = name;
this.description = description;
this.isDessert = isDessert;
this.foodType = foodType;
this.allergies = allergies;
}
public Food(String name, String description, boolean isDessert, FoodType foodType, List<Allergy> allergies) {
this.id = -1;
this.name = name;
this.description = description;
this.isDessert = isDessert;
this.foodType = foodType;
this.allergies = allergies;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public boolean isDessert() {
return isDessert;
}
public FoodType getFoodType() {
return foodType;
}
public List<Allergy> getAllergies() {
return allergies;
}
@Override
public String toString() {
return getName();
}
}

View File

@@ -0,0 +1,206 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.util.ArrayList;
import java.util.List;
public class FoodMgr {
/**
* inserts a food int to the database and creates the food_restriction entries
* @return id of food or -1
*/
public static long createFood(Food food){
String[] foodH = {"name","description","isDessert","food_typeid"};
String[] food_restrictionH = {"foodid","allergyid"};
String[] foodD = {food.getName(),food.getDescription(),(food.isDessert() ? "1" : "0"), String.valueOf(food.getFoodType().getId())};
long id = Database.insert("food",foodH,foodD);
if(food.getAllergies().size() > 0){
String sId = String.valueOf(id);
for (Allergy allergy : food.getAllergies()) {
String[] food_restrictionD = {sId, String.valueOf(allergy.getId())};
Database.insert("food_restriction",food_restrictionH, food_restrictionD);
}
}
return id;
}
/**
* inserts a food_plan into the database
* @return id of food_plan or -1
*/
public static long createFood_plan(FoodPlan foodPlan){
String[] food_planH = {"date","food1","food2","dessert1","dessert2"};
String[] food_planD = {foodPlan.getDate(),
String.valueOf(foodPlan.getFoodVegan().getId()),
String.valueOf(foodPlan.getFoodSecond().getId()),
String.valueOf(foodPlan.getDessertVegan().getId()),
String.valueOf(foodPlan.getDessertSecond().getId())};
return Database.insert("food_plan",food_planH,food_planD);
}
/**
* updates a food_plan into the database
* @return number of rows affected or -1 on error
*/
public static long updateFood_plan(FoodPlan foodPlan){
String[] food_planH = {"id","food1","food2","dessert1","dessert2"};
String[] food_planD = {String.valueOf(foodPlan.getId()),
String.valueOf(foodPlan.getFoodVegan().getId()),
String.valueOf(foodPlan.getFoodSecond().getId()),
String.valueOf(foodPlan.getDessertVegan().getId()),
String.valueOf(foodPlan.getDessertSecond().getId())};
return Database.update("food_plan",food_planH,food_planD);
}
/**
* returns all non desserts or all desserts
* @param isDessert true for only desserts false for non desserts
* @return a list of all non desserts or all desserts
*/
public static List<Food> getFood(boolean isDessert){
String[] foodH = {"isDessert"};
String[] foodD = {(isDessert ? "1" : "0")};
List<String> entries = Database.select("food",foodH,foodD);
List<Food> foods = new ArrayList<>();
for (String entry : entries) {
String[] parts = entry.split(":");
foods.add(getFoodById(Long.parseLong(parts[0])));
}
return foods;
}
/**
* getFood but returns only vegan food
* @param isDessert true for only desserts false for non desserts
* @return a list of all vegan non desserts or all vegan desserts
*/
public static List<Food> getVeganFood(boolean isDessert){
String[] foodH = {"isDessert","food_typeid"};
String[] foodD = {(isDessert ? "1" : "0"),"1"};
List<String> entries = Database.select("food",foodH,foodD);
List<Food> foods = new ArrayList<>();
for (String entry : entries) {
String[] parts = entry.split(":");
foods.add(getFoodById(Long.parseLong(parts[0])));
}
return foods;
}
/**
* returns a food_plan for a day
* @param date YYYY-MM-DD one day
* @return food_plan for date
*/
public static FoodPlan getFoodPlan(String date){
String[] food_planH = {"date"};
String[] food_planD = {date};
List<String> entry = Database.select("food_plan",food_planH,food_planD);
if(entry.size() < 1){
return null;
}
String[] parts = entry.get(0).split(":");
Food foodVegan = getFoodById(Long.parseLong(parts[2]));
Food foodSecond = getFoodById(Long.parseLong(parts[3]));
Food dessertVegan = getFoodById(Long.parseLong(parts[4]));
Food dessertSecond = getFoodById(Long.parseLong(parts[5]));
boolean isSent = !parts[6].equals("0");
return new FoodPlan(Long.parseLong(parts[0]),date,foodVegan,foodSecond,dessertVegan,dessertSecond,isSent);
}
public static FoodPlan getFoodPlanById(long id){
List<String> entry = Database.getEntryById("food_plan",id);
String[] parts = entry.get(0).split(":");
Food foodVegan = getFoodById(Long.parseLong(parts[2]));
Food foodSecond = getFoodById(Long.parseLong(parts[3]));
Food dessertVegan = getFoodById(Long.parseLong(parts[4]));
Food dessertSecond = getFoodById(Long.parseLong(parts[5]));
boolean isSent = !parts[6].equals("0");
return new FoodPlan(id,parts[1], foodVegan,foodSecond,dessertVegan,dessertSecond,isSent);
}
public static Food getFoodById(long id){
List<String> entry = Database.getEntryById("food",id);
String[] parts = entry.get(0).split(":");
String name = parts[1];
String description = parts[2];
boolean isDessert;
isDessert = parts[3].equals("0");
FoodType foodType = getFoodTypeById(Long.parseLong(parts[4]));
List<Allergy> allergies = getAllergies(id);
return new Food(id,name,description,isDessert,foodType,allergies);
}
public static FoodType getFoodTypeById(long id){
List<String> entry = Database.getEntryById("food_type",id);
String[] typeParts = entry.get(0).split(":");
return new FoodType(Long.parseLong(typeParts[0]),typeParts[1]);
}
public static Allergy getAllergyById(long id){
String[] allergyH = {"id"};
String[] allergyD = {String.valueOf(id)};
List<String> allergies = Database.select("allergy",allergyH,allergyD);
String[] allergyParts = allergies.get(0).split(":");
return new Allergy(id,allergyParts[1],allergyParts[2]);
}
public static List<Allergy> getAllergies(long foodId){
List<Allergy> allergies = new ArrayList<>();
String[] restrictionsH = {"foodid"};
String[] restrictionsD = {String.valueOf(foodId)};
List<String> restrictions = Database.select("food_restriction",restrictionsH,restrictionsD);
for (String restriction : restrictions) {
String[] partsRestrictions = restriction.split(":");
allergies.add(getAllergyById(Long.parseLong(partsRestrictions[2])));
}
return allergies;
}
/**
* inserts the selected food into food_Selection if the food_plan has not been sent
* @param food_selectionData childid, food_planid, foodid
* @return id or -1
*/
public static long createFood_selection(String[] food_selectionData){
String[] food_selectionH = {"childid","food_planid","foodid"};
FoodPlan food_plan = getFoodPlanById(Long.parseLong(food_selectionData[1]));
if(!food_plan.isSent()){
return Database.insert("food_selection",food_selectionH,food_selectionData);
}else {
return -1;
}
}
/**
* accumulates the selected food for a given day and locks the corresponding food_plan
* @param date YYYY-MM-DD day
* @return the accumulated orders
*/
public static List<String> getDayOrder(String date){
List<String> orders = new ArrayList<>();
FoodPlan food_plan = getFoodPlan(date);
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);
}
String[] updateH = {"id","issent"};
String[] updateD = {sId,"1"};
if(Database.update("food_plan",updateH,updateD) < 0){
System.out.println("Fehler");
}
return orders;
}
}

View File

@@ -0,0 +1,58 @@
package com.bib.essensbestellungsverwaltung;
public class FoodPlan {
private long id;
private String date;
private Food foodVegan;
private Food foodSecond;
private Food dessertVegan;
private Food dessertSecond;
private boolean isSent;
public FoodPlan(long id, String date, Food foodVegan, Food foodSecond, Food dessertVegan, Food dessertSecond, boolean isSent) {
this.id = id;
this.date = date;
this.foodVegan = foodVegan;
this.foodSecond = foodSecond;
this.dessertVegan = dessertVegan;
this.dessertSecond = dessertSecond;
this.isSent = isSent;
}
public FoodPlan(String date, Food foodVegan, Food foodSecond, Food dessertVegan, Food dessertSecond) {
this.id = -1;
this.date = date;
this.foodVegan = foodVegan;
this.foodSecond = foodSecond;
this.dessertVegan = dessertVegan;
this.dessertSecond = dessertSecond;
this.isSent = false;
}
public long getId() {
return id;
}
public String getDate() {
return date;
}
public Food getFoodVegan() {
return foodVegan;
}
public Food getFoodSecond() {
return foodSecond;
}
public Food getDessertVegan() {
return dessertVegan;
}
public Food getDessertSecond() {
return dessertSecond;
}
public boolean isSent() {
return isSent;
}
}

View File

@@ -0,0 +1,22 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
public class FoodType {
private long id;
private String name;
public FoodType(long id, String name) {
this.id = id;
this.name = name;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
}

View File

@@ -1,55 +0,0 @@
package com.bib.essensbestellungsverwaltung;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
import java.sql.*;
public class HelloApplication extends Application {
private static final String dbLocation = "jdbc:sqlite:"+HelloApplication.class.getResource("database/database.db");
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 320, 240);
stage.setTitle("Hello World! von Richard");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
/* String sql = """
CREATE TABLE IF NOT EXISTS user (
id integer PRIMARY KEY,
name text);""";
String sql2 = "SELECT * FROM user WHERE id > ?";
String sql3 = "INSERT INTO user (id,name) VALUES (1,'test1')";
try(Connection conn = connect();
Statement stmt = conn.createStatement()){
stmt.execute(sql);
stmt.execute(sql3);
PreparedStatement pstmt = conn.prepareStatement(sql2);
pstmt.setInt(1,0);
ResultSet rs = pstmt.executeQuery();
while (rs.next()){
System.out.println(rs.getInt("id"));
}
}catch (SQLException e){
e.printStackTrace();
return;
} */
launch();
}
private static Connection connect(){
Connection conn = null;
try{
conn = DriverManager.getConnection(dbLocation);
}catch (SQLException e){
e.printStackTrace();
}
return conn;
}
}

View File

@@ -1,14 +1,34 @@
package com.bib.essensbestellungsverwaltung;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
public class HelloController {
@FXML
private Label welcomeText;
/**
* @autor: Reshad Meher
* Username, Passwort , login
*/
@FXML
protected void onHelloButtonClick() {
welcomeText.setText("Welcome to JavaFX Application!");
private TextField unsernameEingabe;
@FXML
private TextField passwortEingabe;
@FXML
private Label lblAusgabe;
@FXML
protected void onLoginButtonClick() {
String benutzerEingabe = unsernameEingabe.getText();
String kennwortEingabe = passwortEingabe.getText();
if(benutzerEingabe.contains("Reshad") && kennwortEingabe.contains("test123")){
lblAusgabe.setText("Herzlich Willkommen, " + benutzerEingabe + "!");
}else {
Alert alert = new Alert(Alert.AlertType.ERROR,
"Die Benutzername oder Passwort ist falsch");
alert.showAndWait();
}
unsernameEingabe.setText("");
passwortEingabe.setText("");
}
}

View File

@@ -0,0 +1,67 @@
package com.bib.essensbestellungsverwaltung;
import javafx.fxml.FXML;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Spinner;
import javafx.scene.input.MouseEvent;
import javafx.scene.text.Text;
import java.util.Calendar;
public class InvoiceController {
@FXML
Text responseText;
@FXML
ChoiceBox monatChoiceBox;
@FXML
Spinner jahrSpinner;
@FXML
public void initialize() {
monatChoiceBox.setValue(intToMonth(Calendar.getInstance().get(Calendar.MONTH) + 1));
jahrSpinner.getValueFactory().setValue(Calendar.getInstance().get(Calendar.YEAR));
}
@FXML
void onRechnungErstellenClick(MouseEvent mouseEvent) {
responseText.setText(monatChoiceBox.getValue().toString() + jahrSpinner.getValue());
// hier rechnung erstellen
}
private int monthToInt(String month) {
return switch (month) {
case "Januar" -> 1;
case "Februar" -> 2;
case "März" -> 3;
case "April" -> 4;
case "Mai" -> 5;
case "Juni" -> 6;
case "Juli" -> 7;
case "August" -> 8;
case "September" -> 9;
case "Oktober" -> 10;
case "November" -> 11;
case "Dezember" -> 12;
default -> -1;
};
}
private String intToMonth(int month) {
return switch (month) {
case 1 -> "Januar";
case 2 -> "Februar";
case 3 -> "März";
case 4 -> "April";
case 5 -> "Mai";
case 6 -> "Juni";
case 7 -> "Juli";
case 8 -> "August";
case 9 -> "September";
case 10 -> "Oktober";
case 11 -> "November";
case 12 -> "Dezember";
default -> "";
};
}
}

View File

@@ -0,0 +1,43 @@
/*Richard Reiswich*/
package com.bib.essensbestellungsverwaltung;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import java.io.IOException;
import java.util.HashMap;
public class LoginController {
@FXML
private TextField tfEmail;
@FXML
private PasswordField pfPassword;
HashMap<String,String> benutzerMap = new HashMap<String,String>();
@FXML
protected void onBtLoginClick() throws IOException {
benutzerMap.put("Reshad","1234");
String email = tfEmail.getText();
String password = pfPassword.getText();
if(benutzerMap.containsKey(email) && benutzerMap.containsValue(password)){
// if user is worker: StartViewApplication.changeScene("workerMenu-view.fxml");
StartViewApplication.changeScene("parentMenu-view.fxml");
}else {
Alert alert = new Alert(Alert.AlertType.ERROR,"Email oder Passwort ist falsch");
alert.showAndWait();
}
tfEmail.setText("");
pfPassword.setText("");
}
@FXML
protected void changeToSignUp() throws IOException {
StartViewApplication.changeScene("signUp-view.fxml");
}
}

View File

@@ -0,0 +1,24 @@
/**
* Author: Reshad Meher
* Startseite
* fxml: menue-view.fxml
*/
package com.bib.essensbestellungsverwaltung;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.stage.Stage;
import java.io.IOException;
public class MenueController {
private void setButtonActive(){
}
}

View File

@@ -0,0 +1,24 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.util.ArrayList;
import java.util.List;
public class Parent extends User{
List<Child> children;
public Parent(long id, String name, String firstname, String password, String email, Address address, List<Child> 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 List<Child> getChildren() {
return children;
}
}

View File

@@ -0,0 +1,4 @@
package com.bib.essensbestellungsverwaltung;
public class ParentController{
}

View File

@@ -0,0 +1,77 @@
package com.bib.essensbestellungsverwaltung;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import java.io.IOException;
public class ParentMenuController {
@FXML
BorderPane contentView;
@FXML
Button essensplanButton;
@FXML
Button kinderButton;
@FXML
Button bestellungButton;
@FXML
Button einstellungenButton;
@FXML
public void initialize() {
changePage("menue-view.fxml");
setButtonActive(essensplanButton);
}
@FXML
public void onEssensplanClick(MouseEvent mouseEvent) {
setButtonActive(essensplanButton);
changePage("menue-view.fxml");
}
@FXML
public void onKinderClick(MouseEvent mouseEvent) {
setButtonActive(kinderButton);
changePage("child-view.fxml");
}
@FXML
public void onBestellungClick(MouseEvent mouseEvent) {
setButtonActive(bestellungButton);
changePage("dailyOrder-view.fxml");
}
@FXML
public void onEinstellungenClick(MouseEvent mouseEvent) {
setButtonActive(einstellungenButton);
changePage("menue-view.fxml");
}
@FXML
public void onAusloggenClick(MouseEvent mouseEvent) throws IOException {
StartViewApplication.changeScene("workerMenu-view.fxml");
}
private void changePage(String page) {
try {
Parent root = FXMLLoader.load(getClass().getResource(page));
contentView.setCenter(root);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private void setButtonActive(Button b) {
einstellungenButton.getStyleClass().remove("active");
kinderButton.getStyleClass().remove("active");
bestellungButton.getStyleClass().remove("active");
essensplanButton.getStyleClass().remove("active");
b.getStyleClass().add("active");
}
}

View File

@@ -0,0 +1,12 @@
package com.bib.essensbestellungsverwaltung;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import java.io.IOException;
import java.util.Objects;
public class SceneController {
}

View File

@@ -0,0 +1,11 @@
package com.bib.essensbestellungsverwaltung;
import javafx.event.ActionEvent;
public class SingUpController {
public void onKontoErstellenBtClick(ActionEvent actionEvent) {
}
public void onAnmeldenBtClick(ActionEvent actionEvent) {
}
}

View File

@@ -0,0 +1,4 @@
package com.bib.essensbestellungsverwaltung;
public class StartPageController {
}

View File

@@ -0,0 +1,44 @@
/**
* @autor: Reshad Meher
* Fenstergrößer
* Fenstertitle
*/
package com.bib.essensbestellungsverwaltung;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class StartViewApplication extends Application {
public static Stage primary;
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(StartViewApplication.class.getResource("login-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 1300, 750);
primary = stage;
stage.setTitle("Essen Bestellung im Kindergarten");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
Database.init();
Database.createDb();
Database.fillDb();
//Database.printSampleQuery();
//Database.deleteSample();
launch();
}
public static void changeScene(String scene) throws IOException {
Parent p = FXMLLoader.load(StartViewApplication.class.getResource(scene));
primary.getScene().setRoot(p);
}
}

View File

@@ -0,0 +1,11 @@
package com.bib.essensbestellungsverwaltung;
public class SuperMain {
public static void main(String[] args) {
if(args.length > 0){
ConsoleMain.main(args);
}else {
StartViewApplication.main(args);
}
}
}

View File

@@ -0,0 +1,54 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
public class User {
private long id;
private String name;
private String firstname;
private String password;
private String email;
private Address address;
public User(long id, String name, String firstname, String password, String email, Address address) {
this.id = id;
this.name = name;
this.firstname = firstname;
this.password = password;
this.email = email;
this.address = address;
}
public User(String name, String firstname, String password, String email, Address address) {
this.id = -1;
this.name = name;
this.firstname = firstname;
this.password = password;
this.email = email;
this.address = address;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public String getFirstname() {
return firstname;
}
public String getPassword() {
return password;
}
public String getEmail() {
return email;
}
public Address getAddress() {
return address;
}
}

View File

@@ -0,0 +1,13 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
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);
}
}

View File

@@ -0,0 +1,95 @@
package com.bib.essensbestellungsverwaltung;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import java.io.IOException;
public class WorkerMenuController {
@FXML
public BorderPane contentView;
@FXML
Button tagesbestellungButton;
@FXML
Button wochenplanButton;
@FXML
Button monatsabrechnungButton;
@FXML
Button mitarbeiterButton;
@FXML
Button mahlzeitButton;
@FXML
Button einstellungenButton;
@FXML
public void initialize() {
changePage("menue-view.fxml");
setButtonActive(tagesbestellungButton);
}
@FXML
public void onTagesbestellungenClick(MouseEvent mouseEvent) {
changePage("menue-view.fxml");
setButtonActive(tagesbestellungButton);
}
@FXML
public void onWochenplanClick(MouseEvent mouseEvent) {
changePage("createFoodplan-view.fxml");
setButtonActive(wochenplanButton);
}
@FXML
public void onMonatsabrechnungClick(MouseEvent mouseEvent) {
changePage("invoice-view.fxml");
setButtonActive(monatsabrechnungButton);
}
@FXML
public void onMitarbeiterClick(MouseEvent mouseEvent) {
changePage("createCoworker-view.fxml");
setButtonActive(mitarbeiterButton);
}
@FXML
public void onMahlzeitClick(MouseEvent mouseEvent) {
changePage("createFood-view.fxml");
setButtonActive(mahlzeitButton);
}
public void onEinstellungenClick(MouseEvent mouseEvent) {
setButtonActive(einstellungenButton);
}
@FXML
public void onAusloggenClick(MouseEvent mouseEvent) throws IOException {
StartViewApplication.changeScene("parentMenu-view.fxml");
}
private void changePage(String page) {
try {
Parent root = FXMLLoader.load(getClass().getResource(page));
contentView.setCenter(root);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private void setButtonActive(Button b) {
tagesbestellungButton.getStyleClass().remove("active");
monatsabrechnungButton.getStyleClass().remove("active");
wochenplanButton.getStyleClass().remove("active");
mahlzeitButton.getStyleClass().remove("active");
mitarbeiterButton.getStyleClass().remove("active");
einstellungenButton.getStyleClass().remove("active");
b.getStyleClass().add("active");
}
}

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.bib.essensbestellungsverwaltung.AdminController"
prefHeight="400.0" prefWidth="600.0">
</AnchorPane>

View File

@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane prefHeight="700.0" prefWidth="950.0" stylesheets="@child.css" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.ParentController">
<children>
<Text layoutX="51.0" layoutY="90.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Kinder">
<font>
<Font size="58.0" />
</font>
</Text>
<HBox id="contentContainer" alignment="CENTER" layoutX="8.0" layoutY="165.0" prefHeight="331.0" prefWidth="937.0">
<children>
<VBox id="contentContainer" prefHeight="250.0" prefWidth="256.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Name">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</Text>
<TextField prefWidth="97.0">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</TextField>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Geburtsdatum">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</Text>
<DatePicker prefHeight="26.0" prefWidth="226.0">
<VBox.margin>
<Insets top="13.0" />
</VBox.margin>
</DatePicker>
</children>
<HBox.margin>
<Insets left="15.0" right="15.0" />
</HBox.margin>
</VBox>
<VBox id="contentContainer" prefHeight="250.0" prefWidth="256.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Alter">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</Text>
<TextField prefWidth="97.0">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</TextField>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Gruppe">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</Text>
<ComboBox prefHeight="26.0" prefWidth="230.0">
<VBox.margin>
<Insets top="13.0" />
</VBox.margin>
</ComboBox>
</children>
<HBox.margin>
<Insets left="15.0" right="15.0" />
</HBox.margin>
</VBox>
<VBox id="contentContainer" prefHeight="250.0" prefWidth="256.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Allergien">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</Text>
<ListView prefHeight="101.0" prefWidth="227.0" />
<TextField id="tfAddAllergy" promptText="Allergie hinzufügen">
<VBox.margin>
<Insets top="15.0" />
</VBox.margin>
</TextField>
</children>
<HBox.margin>
<Insets left="15.0" right="15.0" />
</HBox.margin>
</VBox>
</children>
</HBox>
<Button id="btAddChild" layoutX="419.0" layoutY="502.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="125.0" text="Kind hinzufügen" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,5 @@
#btAddChild{
-fx-background-color: lightblue;
-fx-border-color: transparent;
-fx-text-fill: white;
}

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="860.0" prefWidth="850.0" stylesheets="@createCoworker.css" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.AdminController">
<children>
<Label layoutX="301.0" layoutY="49.0" />
<Label layoutX="223.0" layoutY="76.0" prefHeight="28.0" prefWidth="220.0" text="Mitarbeiter hinzufügen">
<font>
<Font size="18.0" />
</font>
</Label>
<VBox layoutX="223.0" layoutY="149.0" prefHeight="317.0" prefWidth="514.0">
<children>
<HBox prefHeight="43.0" prefWidth="331.0">
<children>
<Label prefHeight="17.0" prefWidth="116.0" text="Nachname">
<font>
<Font size="16.0" />
</font>
</Label>
<TextField fx:id="lastname" prefHeight="25.0" prefWidth="194.0" />
</children>
</HBox>
<HBox prefHeight="60.0" prefWidth="331.0">
<children>
<Label prefHeight="35.0" prefWidth="118.0" text="Vorname">
<padding>
<Insets top="10.0" />
</padding>
<font>
<Font size="16.0" />
</font>
</Label>
<TextField fx:id="firstname" prefHeight="25.0" prefWidth="193.0">
<HBox.margin>
<Insets top="10.0" />
</HBox.margin>
</TextField>
</children>
</HBox>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<Label prefHeight="35.0" prefWidth="116.0" text="Straße">
<font>
<Font size="16.0" />
</font>
<padding>
<Insets top="10.0" />
</padding>
</Label>
<TextField fx:id="street" prefHeight="25.0" prefWidth="195.0">
<HBox.margin>
<Insets top="10.0" />
</HBox.margin>
</TextField>
</children>
</HBox>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<Label prefHeight="25.0" prefWidth="118.0" text="Hausnummer">
<font>
<Font size="16.0" />
</font>
<padding>
<Insets top="10.0" />
</padding>
</Label>
<TextField fx:id="number" prefHeight="25.0" prefWidth="87.0">
<HBox.margin>
<Insets top="10.0" />
</HBox.margin>
</TextField>
</children>
</HBox>
<HBox prefHeight="24.0" prefWidth="331.0">
<children>
<Label prefHeight="25.0" prefWidth="118.0" text="PLZ">
<font>
<Font size="16.0" />
</font>
</Label>
<TextField fx:id="plz" prefHeight="25.0" prefWidth="87.0">
<HBox.margin>
<Insets />
</HBox.margin>
</TextField>
</children>
<padding>
<Insets top="10.0" />
</padding>
</HBox>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<Label prefHeight="35.0" prefWidth="120.0" text="Stadt">
<font>
<Font size="16.0" />
</font>
</Label>
<TextField fx:id="city" prefHeight="13.0" prefWidth="194.0">
<HBox.margin>
<Insets top="5.0" />
</HBox.margin>
</TextField>
</children>
<padding>
<Insets top="10.0" />
</padding>
</HBox>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<Label prefHeight="35.0" prefWidth="117.0" text="Email">
<font>
<Font size="16.0" />
</font>
<padding>
<Insets top="10.0" />
</padding>
</Label>
<TextField fx:id="email" prefHeight="25.0" prefWidth="196.0">
<HBox.margin>
<Insets top="10.0" />
</HBox.margin>
</TextField>
</children>
</HBox>
<HBox prefHeight="100.0" prefWidth="471.0">
<children>
<Label prefHeight="35.0" prefWidth="122.0" text="Passwort">
<font>
<Font size="16.0" />
</font>
<padding>
<Insets top="10.0" />
</padding>
</Label>
<PasswordField fx:id="password" accessibleRole="PASSWORD_FIELD" prefHeight="25.0" prefWidth="194.0">
<HBox.margin>
<Insets top="10.0" />
</HBox.margin>
</PasswordField>
</children>
</HBox>
</children>
</VBox>
<Button id="btCreateCoworker" fx:id="btCreateCoworker" layoutX="216.0" layoutY="533.0" mnemonicParsing="false" onAction="#onBtSignUp" prefHeight="44.0" prefWidth="158.0" text="Mitarbeiter hinzufügen" />
<Button id="btCancelCoworker" fx:id="btCancelCoworker" layoutX="443.0" layoutY="533.0" mnemonicParsing="false" onAction="#onBtCancel" prefHeight="44.0" prefWidth="158.0" text="Abbrechen" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,18 @@
#btCreateCoworker {
-fx-background-color: lightblue;
-fx-text-fill: white;
}
#btCreateCoworker:hover{
-fx-underline: true;
-fx-text-fill: black;
}
#btCancelCoworker{
-fx-background-color: transparent;
-fx-underline: true;
}
#btCancelCoworker:hover{
-fx-text-fill: lightblue;
}

View File

@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="731.0" stylesheets="@createFood.css" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.CreateFoodController">
<children>
<Label alignment="CENTER" layoutX="247.0" layoutY="29.0" prefHeight="44.0" prefWidth="237.0" text="Gericht hinzufügen">
<font>
<Font size="18.0" />
</font>
</Label>
<VBox layoutX="136.0" layoutY="73.0" prefHeight="388.0" prefWidth="459.0">
<children>
<HBox prefHeight="75.0" prefWidth="459.0">
<children>
<Label prefHeight="33.0" prefWidth="121.0" text="Name des Gerichts" />
<TextField fx:id="name" prefHeight="25.0" prefWidth="290.0">
<HBox.margin>
<Insets top="5.0" />
</HBox.margin>
</TextField>
</children>
</HBox>
<HBox prefHeight="75.0" prefWidth="459.0">
<children>
<Label prefHeight="33.0" prefWidth="121.0" text="Beschreibung" />
<TextArea fx:id="description" prefHeight="75.0" prefWidth="290.0" />
</children>
<padding>
<Insets top="5.0" />
</padding>
</HBox>
<HBox prefHeight="75.0" prefWidth="459.0">
<children>
<Label text="Art des Gerichts">
<HBox.margin>
<Insets top="20.0" />
</HBox.margin>
</Label>
<RadioButton fx:id="isHauptgerichtRadio" mnemonicParsing="false" text="Hauptgericht">
<HBox.margin>
<Insets left="35.0" top="20.0" />
</HBox.margin>
<toggleGroup>
<ToggleGroup fx:id="art" />
</toggleGroup>
</RadioButton>
<RadioButton fx:id="isDessertRadio" mnemonicParsing="false" text="Dessert" toggleGroup="$art">
<HBox.margin>
<Insets left="50.0" top="20.0" />
</HBox.margin>
</RadioButton>
</children>
<VBox.margin>
<Insets />
</VBox.margin>
<padding>
<Insets top="5.0" />
</padding>
</HBox>
<HBox prefHeight="75.0" prefWidth="459.0">
<children>
<Label text="Typ">
<HBox.margin>
<Insets top="20.0" />
</HBox.margin>
</Label>
<RadioButton fx:id="isVegetarischRadio" mnemonicParsing="false" prefHeight="17.0" prefWidth="91.0" text="Vegetarisch">
<HBox.margin>
<Insets left="100.0" top="20.0" />
</HBox.margin>
<toggleGroup>
<ToggleGroup fx:id="typ" />
</toggleGroup>
</RadioButton>
<RadioButton fx:id="isVeganRadio" mnemonicParsing="false" text="Vegan" toggleGroup="$typ">
<HBox.margin>
<Insets left="20.0" top="20.0" />
</HBox.margin>
</RadioButton>
<RadioButton fx:id="isFleischRadio" mnemonicParsing="false" text="Fleisch" toggleGroup="$typ">
<HBox.margin>
<Insets left="40.0" top="20.0" />
</HBox.margin>
</RadioButton>
</children>
</HBox>
<HBox prefHeight="76.0" prefWidth="459.0">
<children>
<Label prefHeight="41.0" prefWidth="171.0" text="Allergien mit Komma getrennt" />
<TextArea fx:id="allergienTextBox" prefHeight="76.0" prefWidth="246.0" />
</children>
</HBox>
<Text fx:id="responseText" fill="RED" strokeType="OUTSIDE" strokeWidth="0.0" textAlignment="CENTER" wrappingWidth="459.13673400878906">
<VBox.margin>
<Insets top="20.0" />
</VBox.margin>
</Text>
</children>
</VBox>
<Button id="btCreateFood" layoutX="484.0" layoutY="481.0" mnemonicParsing="false" onAction="#onHinzufügen" prefHeight="34.0" prefWidth="146.0" text="Hinzufügen" />
<Button id="btCancelFood" layoutX="102.0" layoutY="473.0" mnemonicParsing="false" onAction="#onAbbrechen" prefHeight="50.0" prefWidth="162.0" text="Abbrechen" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,18 @@
#btCreateFood {
-fx-background-color: lightblue;
-fx-text-fill: white;
}
#btCreateFood:hover{
-fx-underline: true;
-fx-text-fill: black;
}
#btCancelFood{
-fx-background-color: transparent;
-fx-underline: true;
}
#btCancelFood:hover{
-fx-text-fill: lightblue;
}

View File

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<HBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="700.0" prefWidth="950.0" stylesheets="@createFoodplan.css" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.CreateFoodplanController">
<children>
<VBox alignment="CENTER" prefHeight="599.0" prefWidth="357.0" spacing="20.0">
<children>
<Label text="Essensplan erstellen">
<font>
<Font size="18.0" />
</font>
</Label>
<VBox prefHeight="285.0" prefWidth="358.0">
<children>
<HBox prefHeight="50.0" prefWidth="632.0">
<children>
<Label prefHeight="17.0" prefWidth="133.0" text="Datum JJJJ-MMM-TT">
<HBox.margin>
<Insets top="5.0" />
</HBox.margin>
</Label>
<DatePicker fx:id="date" onAction="#onDateChange" />
</children>
</HBox>
<HBox prefHeight="50.0" prefWidth="632.0">
<children>
<Label prefHeight="17.0" prefWidth="133.0" text="Veganes Hauptgericht">
<HBox.margin>
<Insets top="5.0" />
</HBox.margin>
</Label>
<ChoiceBox fx:id="firstMeal" prefWidth="150.0" />
</children>
</HBox>
<HBox prefHeight="50.0" prefWidth="632.0">
<children>
<Label prefHeight="17.0" prefWidth="133.0" text="Zweites Hauptgericht">
<HBox.margin>
<Insets top="5.0" />
</HBox.margin>
</Label>
<ChoiceBox fx:id="secondMeal" prefWidth="150.0" />
</children>
</HBox>
<HBox prefHeight="50.0" prefWidth="632.0">
<children>
<Label prefHeight="17.0" prefWidth="133.0" text="Veganes Dessert">
<HBox.margin>
<Insets />
</HBox.margin>
<padding>
<Insets top="5.0" />
</padding>
</Label>
<ChoiceBox fx:id="firstDessert" prefWidth="150.0" />
</children>
</HBox>
<HBox prefHeight="50.0" prefWidth="632.0">
<children>
<Label prefHeight="17.0" prefWidth="133.0" text="Zweites Dessert">
<padding>
<Insets top="5.0" />
</padding>
</Label>
<ChoiceBox fx:id="secondDessert" prefWidth="150.0" />
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
<children>
<Button id="btCreateFoodplan" fx:id="erstellenButton" mnemonicParsing="false" onAction="#onPlanErstellen" prefHeight="68.0" prefWidth="133.0" text="Plan erstellen" />
<Button id="btCancelFoodplan" mnemonicParsing="false" onAction="#onAbbrechen" prefHeight="68.0" prefWidth="133.0" text="Abbrechen" />
</children>
</HBox>
</children>
</VBox>
</children>
</VBox>
</children>
</HBox>

View File

@@ -0,0 +1,18 @@
#btCreateFoodplan {
-fx-background-color: lightblue;
-fx-text-fill: white;
}
#btCreateFoodplan:hover{
-fx-underline: true;
-fx-text-fill: black;
}
#btCancelFoodplan{
-fx-background-color: transparent;
-fx-underline: true;
}
#btCancelFoodplan:hover{
-fx-text-fill: lightblue;
}

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.bib.essensbestellungsverwaltung.AdminController"
prefHeight="400.0" prefWidth="600.0">
</AnchorPane>

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane prefHeight="400.0" prefWidth="600.0" stylesheets="@deleteChild.css" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.ParentController">
<children>
<Text layoutX="253.0" layoutY="180.0" strokeType="OUTSIDE" strokeWidth="0.0" text="[Name vom Kind] löschen?" wrappingWidth="274.130859375">
<font>
<Font size="23.0" />
</font>
</Text>
<ImageView fitHeight="150.0" fitWidth="200.0" layoutX="66.0" layoutY="97.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/trash-can.png" />
</image>
</ImageView>
<Button id="btDeletConfim" layoutX="390.0" layoutY="315.0" mnemonicParsing="false" prefHeight="53.0" prefWidth="141.0" text="Bestätigen" />
<Button id="btDeleteDeny" layoutX="71.0" layoutY="315.0" mnemonicParsing="false" prefHeight="53.0" prefWidth="141.0" text="zurück" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,18 @@
#btDeletConfim{
-fx-background-color: lightblue;
-fx-text-fill: white;
}
#btDeletConfim:hover{
-fx-underline: true;
-fx-text-fill: black;
}
#btDeleteDeny{
-fx-background-color: transparent;
-fx-underline: true;
}
#btDeleteDeny:hover{
-fx-text-fill: lightblue;
}

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Button?>
<VBox alignment="CENTER" spacing="20.0" xmlns:fx="http://javafx.com/fxml"
fx:controller="com.bib.essensbestellungsverwaltung.HelloController">
<padding>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
</padding>
<Label fx:id="welcomeText"/>
<Button text="Hello!" onAction="#onHelloButtonClick"/>
</VBox>

View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.collections.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<HBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="700.0" prefWidth="950.0" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.InvoiceController">
<children>
<VBox alignment="CENTER" prefHeight="860.0" prefWidth="500.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Abrechnung erstellen">
<font>
<Font name="System Bold" size="25.0" />
</font></Text>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="122.0" spacing="20.0">
<children>
<VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0">
<children>
<Label text="Jahr" />
<Spinner fx:id="jahrSpinner">
<valueFactory>
<SpinnerValueFactory.IntegerSpinnerValueFactory initialValue="2023" max="2100" min="2020" />
</valueFactory>
</Spinner>
</children>
</VBox>
<VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0">
<children>
<Label text="Monat" />
<ChoiceBox fx:id="monatChoiceBox" value="Januar">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="Januar" />
<String fx:value="Februar" />
<String fx:value="März" />
<String fx:value="April" />
<String fx:value="Mai" />
<String fx:value="Juni" />
<String fx:value="Juli" />
<String fx:value="August" />
<String fx:value="September" />
<String fx:value="Oktober" />
<String fx:value="November" />
<String fx:value="Dezember" />
</FXCollections>
</items>
</ChoiceBox>
</children>
</VBox>
</children>
</HBox>
<Button mnemonicParsing="false" onMouseClicked="#onRechnungErstellenClick" text="Rechnung erstellen" />
<Text fx:id="responseText" strokeType="OUTSIDE" strokeWidth="0.0">
<VBox.margin>
<Insets top="100.0" />
</VBox.margin>
</Text>
</children>
</VBox>
</children>
</HBox>

View File

@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.effect.Blend?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.LoginController">
<children>
<VBox alignment="CENTER" prefHeight="400.0" prefWidth="265.0" style="-fx-background-color: lightblue;">
<children>
<Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="Essensbestellung">
<font>
<Font name="Yu Gothic Light" size="26.0" />
</font>
</Text>
</children>
<padding>
<Insets bottom="150.0" />
</padding>
</VBox>
<Circle fill="#67b5ff2e" layoutX="-23.0" layoutY="368.0" radius="100.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<Circle fill="#69b6ffb0" layoutX="235.0" layoutY="310.0" radius="158.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<Circle fill="#93c4f23d" layoutY="258.0" radius="106.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<VBox alignment="CENTER" layoutX="263.0" prefHeight="400.0" prefWidth="338.0" style="-fx-background-color: white;">
<children>
<TextField promptText="Email" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;" fx:id="tfEmail">
<VBox.margin>
<Insets bottom="15.0" left="25.0" right="25.0" top="25.0" />
</VBox.margin>
<effect>
<Blend />
</effect>
<font>
<Font name="Microsoft Tai Le" size="12.0" />
</font>
</TextField>
<PasswordField promptText="Passwort" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;" fx:id="pfPassword">
<VBox.margin>
<Insets bottom="25.0" left="25.0" right="25.0" top="15.0" />
</VBox.margin>
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
</PasswordField>
<HBox alignment="CENTER" prefHeight="30.0" prefWidth="238.0">
<children>
<Button mnemonicParsing="false" prefHeight="25.0" prefWidth="106.0" style="-fx-background-radius: 25; -fx-background-color: lightblue;" text="Login" textFill="WHITE" onAction="#onBtLoginClick">
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font></Button>
<Button id="btSignUp" mnemonicParsing="false" prefHeight="25.0" prefWidth="101.0" style="-fx-background-color: tranparent;" text="Sign up" textFill="#7c7b7b" underline="true" onAction="#changeToSignUp" />
</children>
</HBox>
</children>
<padding>
<Insets bottom="65.0" left="45.0" right="45.0" top="45.0" />
</padding>
</VBox>
<Circle fill="#1469b895" layoutX="133.0" layoutY="368.0" radius="106.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<Circle fill="#0088ff82" layoutX="77.0" layoutY="276.0" radius="53.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,237 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="750.0" prefWidth="950.0" stylesheets="@menue.css" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.MenueController">
<children>
<Label alignment="CENTER" layoutX="392.0" layoutY="25.0" prefHeight="40.0" prefWidth="223.0" text="Essen bestellen">
<font>
<Font size="28.0" />
</font>
</Label>
<Button id="btLogin" alignment="CENTER" layoutX="848.0" layoutY="34.0" mnemonicParsing="false" text="Login" />
<HBox layoutX="220.0" layoutY="87.0" prefHeight="570.0" prefWidth="688.0">
<children>
<VBox prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" contentDisplay="TOP" prefHeight="23.0" prefWidth="196.0" style="-fx-background-color: lightdarkblue;" text="Montag" textAlignment="CENTER">
<VBox.margin>
<Insets bottom="10.0" />
</VBox.margin>
<font>
<Font size="18.0" />
</font>
</Label>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 1">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin></Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 2">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin></Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="Keine Mahlzeit">
<VBox.margin>
<Insets bottom="30.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Dessert 1">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin></Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Dessert 2">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin></Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="kein Dessert">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin></Button>
</children>
<HBox.margin>
<Insets />
</HBox.margin>
</VBox>
<VBox prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" contentDisplay="TOP" prefHeight="23.0" prefWidth="196.0" style="-fx-background-color: lightdarkblue;" text="Dienstag" textAlignment="CENTER">
<VBox.margin>
<Insets bottom="10.0" />
</VBox.margin>
<font>
<Font size="18.0" />
</font>
</Label>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 1">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 2">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="Keine Mahlzeit">
<VBox.margin>
<Insets bottom="30.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Dessert 1">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Dessert 2">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="kein Dessert">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Button>
</children>
</VBox>
<VBox prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" contentDisplay="TOP" prefHeight="23.0" prefWidth="196.0" style="-fx-background-color: lightdarkblue;" text="Mittwoch" textAlignment="CENTER">
<VBox.margin>
<Insets bottom="10.0" />
</VBox.margin>
<font>
<Font size="18.0" />
</font>
</Label>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 1">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 2">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="Keine Mahlzeit">
<VBox.margin>
<Insets bottom="30.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Dessert 1">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Dessert 2">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="kein Dessert">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Button>
</children>
</VBox>
<VBox prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" contentDisplay="TOP" prefHeight="23.0" prefWidth="196.0" style="-fx-background-color: lightdarkblue;" text="Donnerstag" textAlignment="CENTER">
<VBox.margin>
<Insets bottom="10.0" />
</VBox.margin>
<font>
<Font size="18.0" />
</font>
</Label>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 1">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 2">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="Keine Mahlzeit">
<VBox.margin>
<Insets bottom="30.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Dessert 1">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Dessert 2">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="kein Dessert">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Button>
</children>
</VBox>
<VBox prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" contentDisplay="TOP" prefHeight="23.0" prefWidth="196.0" style="-fx-background-color: lightdarkblue;" text="Freitag" textAlignment="CENTER">
<VBox.margin>
<Insets bottom="10.0" />
</VBox.margin>
<font>
<Font size="18.0" />
</font>
</Label>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 1">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 2">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="Keine Mahlzeit">
<VBox.margin>
<Insets bottom="30.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Dessert 1">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Dessert 2">
<VBox.margin>
<Insets bottom="10.0" top="10.0" />
</VBox.margin>
</Button>
<Button id="btFoodChoice" alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="kein Dessert">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Button>
</children>
</VBox>
</children>
</HBox>
<Button id="btPlaceOrder" layoutX="436.0" layoutY="677.0" mnemonicParsing="false" prefHeight="40.0" prefWidth="150.0" text="Bestellung speichern" />
<ComboBox id="cbChooseChild" layoutX="29.0" layoutY="34.0" prefWidth="150.0" promptText="Wähle Kind" stylesheets="@menue.css" />
<ListView id="lvShowDescription" layoutX="14.0" layoutY="151.0" prefHeight="475.0" prefWidth="200.0" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,10 @@
.sidebar-nav_button {
-fx-background-color: #69b6ff;
-fx-text-fill: #123;
-fx-border-color: #000;
-fx-border-radius: 20;
}
.sidebar-nav_button.active {
-fx-background-color: #4e92b4;
}

View File

@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?>
<BorderPane fx:id="contentView" prefHeight="750.0" prefWidth="1200.0" stylesheets="@menue.css"
xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="com.bib.essensbestellungsverwaltung.ParentMenuController">
<left>
<VBox alignment="TOP_CENTER" prefHeight="750.0" prefWidth="350.0" spacing="10.0"
style="-fx-background-color: #69b6ff; -fx-padding: 20;" BorderPane.alignment="CENTER">
<children>
<Button fx:id="essensplanButton" alignment="CENTER_LEFT" mnemonicParsing="false"
onMouseClicked="#onEssensplanClick" prefHeight="60.0" prefWidth="250.0"
styleClass="sidebar-nav_button" text="Essensplan">
<font>
<Font size="20.0"/>
</font>
<graphic>
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/menu.png"/>
</image>
</ImageView>
</graphic>
</Button>
<Button fx:id="kinderButton" alignment="CENTER_LEFT" mnemonicParsing="false"
onMouseClicked="#onKinderClick" prefHeight="60.0" prefWidth="250.0"
styleClass="sidebar-nav_button" text="Kinder">
<font>
<Font size="20.0"/>
</font>
<graphic>
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/little-kid.png"/>
</image>
</ImageView>
</graphic>
</Button>
<Button fx:id="bestellungButton" alignment="CENTER_LEFT" mnemonicParsing="false"
onMouseClicked="#onBestellungClick" prefHeight="60.0" prefWidth="250.0"
styleClass="sidebar-nav_button" text="Bestellung">
<font>
<Font size="20.0"/>
</font>
<graphic>
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/shopping-list.png"/>
</image>
</ImageView>
</graphic>
</Button>
<Region VBox.vgrow="ALWAYS"/>
<Button fx:id="einstellungenButton" alignment="CENTER_LEFT" layoutX="10.0" layoutY="130.0"
mnemonicParsing="false" onMouseClicked="#onEinstellungenClick" prefHeight="60.0"
prefWidth="250.0" styleClass="sidebar-nav_button" text="Einstellungen">
<font>
<Font size="20.0"/>
</font>
<graphic>
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/setting.png"/>
</image>
</ImageView>
</graphic>
</Button>
</children>
</VBox>
</left>
<top>
<HBox alignment="CENTER_RIGHT" prefHeight="50.0" prefWidth="1200.0" style="-fx-background-color: #69b6ff;"
BorderPane.alignment="CENTER">
<children>
<Button mnemonicParsing="false" onMouseClicked="#onAusloggenClick" styleClass="sidebar-nav_button"
text="Ausloggen">
<opaqueInsets>
<Insets/>
</opaqueInsets>
</Button>
</children>
<padding>
<Insets right="20.0"/>
</padding>
</HBox>
</top>
<center>
<AnchorPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"/>
</center>
</BorderPane>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.effect.Blend?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane maxHeight="-400" maxWidth="-600" minHeight="-400" minWidth="-600" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.SingUpController">
<children>
<VBox alignment="CENTER" prefHeight="400.0" prefWidth="265.0" style="-fx-background-color: lightblue;">
<children>
<Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="Essensbestellung">
<font>
<Font name="Yu Gothic Light" size="26.0" />
</font>
</Text>
</children>
<padding>
<Insets bottom="150.0" />
</padding>
</VBox>
<Circle fill="#67b5ff2e" layoutX="-23.0" layoutY="368.0" radius="100.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<Circle fill="#69b6ffb0" layoutX="235.0" layoutY="310.0" radius="158.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<Circle fill="#93c4f23d" layoutY="258.0" radius="106.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<VBox alignment="CENTER" layoutX="263.0" prefHeight="400.0" prefWidth="338.0" style="-fx-background-color: white;">
<children>
<TextField promptText="Email" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;" fx:id="tfEmail">
<effect>
<Blend />
</effect>
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</TextField>
<TextField promptText="Email bestätigen" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;" fx:id="tfBestätigungEmail">
<effect>
<Blend />
</effect>
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</TextField>
<PasswordField promptText="Passwort" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;" fx:id="pfPasswort">
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
<opaqueInsets>
<Insets />
</opaqueInsets>
<effect>
<Blend />
</effect>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</PasswordField>
<PasswordField promptText="Passwort bestätigen" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;" fx:id="pfBestätigungPassowrt">
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
<opaqueInsets>
<Insets />
</opaqueInsets>
<effect>
<Blend />
</effect>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</PasswordField>
<HBox alignment="CENTER" prefHeight="30.0" prefWidth="238.0">
<children>
<Button mnemonicParsing="false" prefHeight="25.0" prefWidth="106.0" style="-fx-background-radius: 25; -fx-background-color: lightblue;" text="Konto erstellen" textFill="WHITE" onAction="#onKontoErstellenBtClick">
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font></Button>
<Button id="btSignUp" mnemonicParsing="false" prefHeight="25.0" prefWidth="101.0" style="-fx-background-color: tranparent;" text="Anmelden" textFill="#7c7b7b" underline="true" onAction="#onAnmeldenBtClick"/>
</children>
<opaqueInsets>
<Insets top="15.0" />
</opaqueInsets>
<VBox.margin>
<Insets top="15.0" />
</VBox.margin>
</HBox>
</children>
<padding>
<Insets bottom="65.0" left="45.0" right="45.0" top="45.0" />
</padding>
</VBox>
<Circle fill="#1469b895" layoutX="133.0" layoutY="368.0" radius="106.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<Circle fill="#0088ff82" layoutX="77.0" layoutY="276.0" radius="53.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<BorderPane fx:id="contentView" prefHeight="750.0" prefWidth="1200.0" stylesheets="@menue.css"
xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="com.bib.essensbestellungsverwaltung.WorkerMenuController">
<left>
<VBox alignment="TOP_CENTER" prefHeight="750.0" prefWidth="350.0" spacing="10.0"
style="-fx-background-color: #69b6ff; -fx-padding: 20;" BorderPane.alignment="CENTER">
<children>
<Button fx:id="tagesbestellungButton" alignment="CENTER_LEFT" mnemonicParsing="false"
onMouseClicked="#onTagesbestellungenClick" prefHeight="60.0" prefWidth="250.0"
styleClass="sidebar-nav_button" text="Tagesbestellung">
<font>
<Font size="20.0"/>
</font>
<graphic>
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/to-do-list.png"/>
</image>
</ImageView>
</graphic>
</Button>
<Button fx:id="monatsabrechnungButton" alignment="CENTER_LEFT" mnemonicParsing="false"
onMouseClicked="#onMonatsabrechnungClick" prefHeight="60.0" prefWidth="250.0"
styleClass="sidebar-nav_button" text="Monatsabrechnung">
<font>
<Font size="20.0"/>
</font>
<graphic>
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/spreadsheet.png"/>
</image>
</ImageView>
</graphic>
</Button>
<Button fx:id="wochenplanButton" alignment="CENTER_LEFT" mnemonicParsing="false"
onMouseClicked="#onWochenplanClick" prefHeight="60.0" prefWidth="250.0"
styleClass="sidebar-nav_button" text="Wochenplan">
<font>
<Font size="20.0"/>
</font>
<graphic>
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/calendar.png"/>
</image>
</ImageView>
</graphic>
</Button>
<Button fx:id="mahlzeitButton" alignment="CENTER_LEFT" mnemonicParsing="false"
onMouseClicked="#onMahlzeitClick" prefHeight="60.0" prefWidth="250.0"
styleClass="sidebar-nav_button" text="Mahlzeit">
<font>
<Font size="20.0"/>
</font>
<graphic>
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/lunch.png"/>
</image>
</ImageView>
</graphic>
</Button>
<Button fx:id="mitarbeiterButton" alignment="CENTER_LEFT" mnemonicParsing="false"
onMouseClicked="#onMitarbeiterClick" prefHeight="60.0" prefWidth="250.0"
styleClass="sidebar-nav_button" text="Mitarbeiter">
<font>
<Font size="20.0"/>
</font>
<graphic>
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/teamwork.png"/>
</image>
</ImageView>
</graphic>
</Button>
<Region style="-fx-padding: 20;" VBox.vgrow="ALWAYS">
<opaqueInsets>
<Insets/>
</opaqueInsets>
</Region>
<Button fx:id="einstellungenButton" alignment="CENTER_LEFT" layoutX="10.0" layoutY="130.0"
mnemonicParsing="false" onMouseClicked="#onEinstellungenClick" prefHeight="60.0"
prefWidth="250.0" styleClass="sidebar-nav_button" text="Einstellungen">
<font>
<Font size="20.0"/>
</font>
<graphic>
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/setting.png"/>
</image>
</ImageView>
</graphic>
</Button>
</children>
<opaqueInsets>
<Insets/>
</opaqueInsets>
</VBox>
</left>
<top>
<HBox alignment="CENTER_RIGHT" prefHeight="50.0" prefWidth="1200.0" style="-fx-background-color: #69b6ff;"
BorderPane.alignment="CENTER">
<children>
<Button mnemonicParsing="false" onMouseClicked="#onAusloggenClick" styleClass="sidebar-nav_button"
text="Ausloggen">
<opaqueInsets>
<Insets/>
</opaqueInsets>
</Button>
</children>
<padding>
<Insets right="20.0"/>
</padding>
</HBox>
</top>
<center>
<AnchorPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"/>
</center>
</BorderPane>