Merge remote-tracking branch 'origin/stable' into stable
# Conflicts: # src/main/resources/com/bib/essensbestellungsverwaltung/child-view.fxml
This commit is contained in:
@@ -13,6 +13,7 @@ import java.util.List;
|
||||
/**
|
||||
* A collection of functions loosely related to account management
|
||||
* Acts as an abstraction layer to the database
|
||||
*
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
public class AccountMgr {
|
||||
@@ -21,226 +22,354 @@ public class AccountMgr {
|
||||
|
||||
/**
|
||||
* creates a user with createUser(...) and adds its id to the 'worker' table
|
||||
*
|
||||
* @param worker the worker to be created
|
||||
* @return userid or -1
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static long createWorker(Worker worker){
|
||||
protected static long createWorker(Worker worker) {
|
||||
long id = createUser(worker);
|
||||
String sId = String.valueOf(id);
|
||||
Database.insert("worker", new String[]{"userid"}, new String[]{sId});
|
||||
Database.insert("worker", new String[] { "userid" }, new String[] { sId });
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* creates a user with createUser(...) and adds its id to the 'parent' table
|
||||
*
|
||||
* @param parent the parent to be created
|
||||
* @return userid or -1
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static long createParent(Parent parent){
|
||||
protected static long createParent(Parent parent) {
|
||||
long id = createUser(parent);
|
||||
String sId = String.valueOf(id);
|
||||
Database.insert("parent", new String[]{"userid"}, new String[]{sId});
|
||||
Database.insert("parent", new String[] { "userid" }, new String[] { sId });
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* adds a user to the database
|
||||
*
|
||||
* @param user the user to be created
|
||||
* @return userid or -1
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static long createUser(User user) {
|
||||
String[] userH = {"name", "firstname", "addressid", "password", "email"};
|
||||
String[] userH = { "name", "firstname", "addressid", "password", "email" };
|
||||
String name = user.getName();
|
||||
String firstname = user.getFirstname();
|
||||
String pw = hashAndSalt(user.getPassword(), getSalt());
|
||||
String email = user.getEmail();
|
||||
long addressId = user.getAddress().getId();
|
||||
if(addressId < 1){
|
||||
if (addressId < 1) {
|
||||
addressId = createAddress(user.getAddress());
|
||||
}
|
||||
String[] userD = {name, firstname, String.valueOf(addressId), pw, email};
|
||||
String[] userD = { name, firstname, String.valueOf(addressId), pw, email };
|
||||
return Database.insert("user", userH, userD);
|
||||
}
|
||||
|
||||
/**
|
||||
* adds an address to the database
|
||||
*
|
||||
* @param address the address to be created
|
||||
* @return id or -1
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static long createAddress(Address address){
|
||||
String[] addressH = {"street", "number", "plz", "city"};
|
||||
String[] addressD = {address.getStreet(),address.getNumber(),address.getPlz(),address.getCity()};
|
||||
return Database.insert("address",addressH,addressD);
|
||||
protected static long createAddress(Address address) {
|
||||
String[] addressH = { "street", "number", "plz", "city" };
|
||||
String[] addressD = { address.getStreet(), address.getNumber(), address.getPlz(), address.getCity() };
|
||||
return Database.insert("address", addressH, addressD);
|
||||
}
|
||||
|
||||
/**
|
||||
* adds a child and allergies to the database
|
||||
*
|
||||
* @param child the child to be created
|
||||
* @return id of child or -1
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static long createChild(Child child){
|
||||
String[] childH = {"name","firstname","addressid"};
|
||||
String[] childD = {child.getName(), child.getFirstname(), String.valueOf(child.getAddress().getId())};
|
||||
protected static long createChild(Child child) {
|
||||
String[] childH = { "name", "firstname", "addressid" };
|
||||
String[] childD = { child.getName(), child.getFirstname(), String.valueOf(child.getAddress().getId()) };
|
||||
long id = Database.insert("child", childH, childD);
|
||||
String[] child_allergyH = {"childid","allergyid","severityid"};
|
||||
for (AllergySeverity allergy: child.getAllergies()) {
|
||||
String[] child_allergyH = { "childid", "allergyid", "severityid" };
|
||||
for (AllergySeverity allergy : child.getAllergies()) {
|
||||
String sId = String.valueOf(id);
|
||||
String sAllergyId = String.valueOf(allergy.getAllergy().getId());
|
||||
String sSeverityId = String.valueOf(allergy.getSeverityId());
|
||||
String[] child_allergyD = {sId,sAllergyId,sSeverityId};
|
||||
Database.insert("child_allergy",child_allergyH,child_allergyD);
|
||||
String[] child_allergyD = { sId, sAllergyId, sSeverityId };
|
||||
Database.insert("child_allergy", child_allergyH, child_allergyD);
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a User(Worker | Parent) for a given id or null if no unique id was found
|
||||
* update Child
|
||||
*
|
||||
* @param child the child to be updated
|
||||
* @return id of child
|
||||
* @author Johannes Kantz
|
||||
*/
|
||||
protected static long updateChild(Child child) {
|
||||
String[] childH = { "id", "name", "firstname", "addressid" };
|
||||
String[] childD = { String.valueOf(child.getId()), child.getName(), child.getFirstname(),
|
||||
String.valueOf(child.getAddress().getId()) };
|
||||
long updates = Database.update("child", childH, childD);
|
||||
String[] child_allergyH = { "childid", "allergyid", "severityid" };
|
||||
Database.select("child_allergy", new String[] { "childid" }, new String[] { String.valueOf(child.getId()) })
|
||||
.stream().forEach(row -> {
|
||||
String allergyId = row.split(":")[0];
|
||||
Database.delete("child_allergy", Integer.parseInt(allergyId));
|
||||
});
|
||||
for (AllergySeverity allergy : child.getAllergies()) {
|
||||
String sId = String.valueOf(child.getId());
|
||||
String sAllergyId = String.valueOf(allergy.getAllergy().getId());
|
||||
String sSeverityId = String.valueOf(allergy.getSeverityId());
|
||||
String[] child_allergyD = { sId, sAllergyId, sSeverityId };
|
||||
Database.insert("child_allergy", child_allergyH, child_allergyD);
|
||||
}
|
||||
return updates;
|
||||
}
|
||||
|
||||
/**
|
||||
* delete Child
|
||||
*
|
||||
* @author Johannes Kantz
|
||||
*/
|
||||
protected static void deleteChildWithId(long id) {
|
||||
Database.delete("child", id);
|
||||
Database.select("child_allergy", new String[] { "childid" }, new String[] { String.valueOf(id) }).stream()
|
||||
.forEach(row -> {
|
||||
String allergyId = row.split(":")[0];
|
||||
Database.delete("child_allergy", Integer.parseInt(allergyId));
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a User(Worker | Parent) for a given id or null if no unique id was
|
||||
* found
|
||||
*
|
||||
* @param id id of the User
|
||||
* @return User(Worker | Parent) or null
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static User getUserById(long id){
|
||||
List<String> entry = Database.getEntryById("user",id);
|
||||
if(entry.size() != 1){
|
||||
protected static User getUserById(long id) {
|
||||
List<String> entry = Database.getEntryById("user", id);
|
||||
if (entry.size() != 1) {
|
||||
return null;
|
||||
}
|
||||
String[] parts = entry.get(0).split(":");
|
||||
Address address = getAddressById(id);
|
||||
if(isWorker(String.valueOf(id))){
|
||||
return new Worker(id,parts[1],parts[2],parts[4],parts[5],address);
|
||||
}else{
|
||||
String[] parent_childH = {"parentuserid"};
|
||||
String[] parent_childD = {String.valueOf(id)};
|
||||
if (isWorker(String.valueOf(id))) {
|
||||
return new Worker(id, parts[1], parts[2], parts[4], parts[5], address);
|
||||
} else {
|
||||
String[] parent_childH = { "parentuserid" };
|
||||
String[] parent_childD = { String.valueOf(id) };
|
||||
List<Child> children = new ArrayList<>();
|
||||
List<String> parent_childEntries = Database.select("parent_child",parent_childH,parent_childD);
|
||||
for (String parent_childEntry: parent_childEntries) {
|
||||
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);
|
||||
return new Parent(id, parts[1], parts[2], parts[4], parts[5], address, children);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a Child for a given id or null if no unique id was found
|
||||
*
|
||||
* @param id id of child
|
||||
* @return Child or null
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static Child getChildById(long id){
|
||||
List<String> entry = Database.getEntryById("child",id);
|
||||
if(entry.size() != 1){
|
||||
protected static Child getChildById(long id) {
|
||||
List<String> entry = Database.getEntryById("child", id);
|
||||
if (entry.size() != 1) {
|
||||
return null;
|
||||
}
|
||||
String[] parts = entry.get(0).split(":");
|
||||
String[] child_allergyH = {"childid"};
|
||||
String[] child_allergyD = {String.valueOf(id)};
|
||||
List<String> entriesAllergy = Database.select("child_allergy",child_allergyH,child_allergyD);
|
||||
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));
|
||||
allergySeverities.add(
|
||||
new AllergySeverity(FoodMgr.getAllergyById(Long.parseLong(allergyParts[2])), lSeverity, sSeverity));
|
||||
}
|
||||
return new Child(id,parts[1],parts[2],getAddressById(Long.parseLong(parts[3])),allergySeverities);
|
||||
return new Child(id, parts[1], parts[2], getAddressById(Long.parseLong(parts[3])), allergySeverities);
|
||||
}
|
||||
|
||||
/**
|
||||
* returns all Children
|
||||
*
|
||||
* @return {List<Child} List with Childen or empty List
|
||||
* @author Johannes Kantz
|
||||
*/
|
||||
protected static List<Child> getAllChildren() {
|
||||
List<String> entry = Database.getTable("child");
|
||||
if (entry.size() < 1) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
List<Child> children = new ArrayList<>();
|
||||
for (String s : entry) {
|
||||
String[] parts = s.split(":");
|
||||
String[] child_allergyH = { "childid" };
|
||||
String[] child_allergyD = { String.valueOf(parts[0]) };
|
||||
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));
|
||||
}
|
||||
children.add(new Child(Long.parseLong(parts[0]), parts[1], parts[2],
|
||||
getAddressById(Long.parseLong(parts[3])), allergySeverities));
|
||||
}
|
||||
return children;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns all Children from parent
|
||||
* @param id parentid
|
||||
* @return {List<Child} List with Childen or empty List
|
||||
* @author Johannes Kantz
|
||||
*/
|
||||
protected static List<Child> getAllChildrenFromParentWithId(long id) {
|
||||
List<String> entry = Database.select("parent_child", new String[] { "parentuserid" },
|
||||
new String[] { String.valueOf(id) });
|
||||
if (entry.size() < 1) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
List<String> childIds = new ArrayList<>();
|
||||
for (String s : entry) {
|
||||
String[] parts = s.split(":");
|
||||
childIds.add(parts[2]);
|
||||
}
|
||||
List<Child> children = new ArrayList<>();
|
||||
for (String s : childIds) {
|
||||
List<String> child = Database.getEntryById("child", Long.parseLong(s));
|
||||
String[] parts = child.get(0).split(":");
|
||||
String[] child_allergyH = { "childid" };
|
||||
String[] child_allergyD = { String.valueOf(parts[0]) };
|
||||
List<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));
|
||||
}
|
||||
children.add(new Child(Long.parseLong(parts[0]), parts[1], parts[2],
|
||||
getAddressById(Long.parseLong(parts[3])), allergySeverities));
|
||||
}
|
||||
return children;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns an Address for a given id or null if no unique id was found
|
||||
*
|
||||
* @param id id of the address
|
||||
* @return Address or null
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static Address getAddressById(long id){
|
||||
List<String> entry = Database.getEntryById("address",id);
|
||||
if(entry.size() != 1){
|
||||
protected static Address getAddressById(long id) {
|
||||
List<String> entry = Database.getEntryById("address", id);
|
||||
if (entry.size() != 1) {
|
||||
return null;
|
||||
}
|
||||
String[] parts = entry.get(0).split(":");
|
||||
return new Address(Long.parseLong(parts[0]),parts[1],parts[2],parts[3],parts[4]);
|
||||
return new Address(Long.parseLong(parts[0]), parts[1], parts[2], parts[3], parts[4]);
|
||||
}
|
||||
|
||||
/**
|
||||
* creates entries in the database to match parent to child
|
||||
*
|
||||
* @param parentId id of parent
|
||||
* @param childId id of child
|
||||
* @param childId id of child
|
||||
* @return id of parent_child or -1
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static long matchParentChild(String parentId, String childId){
|
||||
String[] parent_childH = {"parentuserid","childid"};
|
||||
String[] parent_childD = {parentId,childId};
|
||||
return Database.insert("parent_child", parent_childH,parent_childD);
|
||||
protected static long matchParentChild(String parentId, String childId) {
|
||||
String[] parent_childH = { "parentuserid", "childid" };
|
||||
String[] parent_childD = { parentId, childId };
|
||||
return Database.insert("parent_child", parent_childH, parent_childD);
|
||||
}
|
||||
|
||||
/**
|
||||
* a simple login to check if a given email matches a password
|
||||
*
|
||||
* @param email email
|
||||
* @param pw password
|
||||
* @param pw password
|
||||
* @return id or -1
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static long login(String email, String pw){
|
||||
String[] pwH = {"email"};
|
||||
String[] pwD = {email};
|
||||
List<String> foundEmail = Database.select("user",pwH,pwD);
|
||||
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){
|
||||
if (foundEmail.size() == 1) {
|
||||
String[] userParts = foundEmail.get(0).split(":");
|
||||
String[] pwParts = userParts[4].split("\\.");
|
||||
salt = pwParts[1];
|
||||
}else{
|
||||
//no unique user found; still calculating a hash for security reasons
|
||||
} else {
|
||||
// no unique user found; still calculating a hash for security reasons
|
||||
salt = getSalt();
|
||||
}
|
||||
String[] userH = {"email","password"};
|
||||
String[] userD = {email,hashAndSalt(pw,salt)};
|
||||
return Database.getSingleId("user",userH,userD);
|
||||
String[] userH = { "email", "password" };
|
||||
String[] userD = { email, hashAndSalt(pw, salt) };
|
||||
return Database.getSingleId("user", userH, userD);
|
||||
}
|
||||
|
||||
/**
|
||||
* checks if id is in worker table
|
||||
*
|
||||
* @param id userid
|
||||
* @return true if id is in worker table
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static boolean isWorker(String id){
|
||||
String[] workerH = {"userid"};
|
||||
String[] workerD = {id};
|
||||
long workerId = Database.getSingleId("worker",workerH,workerD);
|
||||
protected static boolean isWorker(String id) {
|
||||
String[] workerH = { "userid" };
|
||||
String[] workerD = { id };
|
||||
long workerId = Database.getSingleId("worker", workerH, workerD);
|
||||
return workerId > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* checks if id is in parent table
|
||||
*
|
||||
* @param id userid
|
||||
* @return true if id is in parent table
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static boolean isParent(String id){
|
||||
String[] parentH = {"userid"};
|
||||
String[] parentD = {id};
|
||||
long parentId = Database.getSingleId("parent",parentH,parentD);
|
||||
protected static boolean isParent(String id) {
|
||||
String[] parentH = { "userid" };
|
||||
String[] parentD = { id };
|
||||
long parentId = Database.getSingleId("parent", parentH, parentD);
|
||||
return parentId > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a hashed and salted password
|
||||
*
|
||||
* @param pw the password to hash
|
||||
* @return hashed and salted password
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
private static String hashAndSalt(String pw, String salt){
|
||||
private static String hashAndSalt(String pw, String salt) {
|
||||
Base64.Decoder dec = Base64.getDecoder();
|
||||
byte[] bySalt = dec.decode(salt);
|
||||
KeySpec spec = new PBEKeySpec(pw.toCharArray(), bySalt,310001,256);
|
||||
KeySpec spec = new PBEKeySpec(pw.toCharArray(), bySalt, 310001, 256);
|
||||
String hashedPw;
|
||||
try {
|
||||
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
|
||||
@@ -256,10 +385,11 @@ public class AccountMgr {
|
||||
|
||||
/**
|
||||
* generates a secure random salt, Base64 encoded
|
||||
*
|
||||
* @return String Base64 encoded
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
private static String getSalt(){
|
||||
private static String getSalt() {
|
||||
SecureRandom sec = new SecureRandom();
|
||||
byte[] salt = new byte[16];
|
||||
sec.nextBytes(salt);
|
||||
@@ -269,59 +399,62 @@ public class AccountMgr {
|
||||
|
||||
/**
|
||||
* gives the invoice for one month and one child
|
||||
* @param date YYYY-MM the month
|
||||
*
|
||||
* @param date YYYY-MM the month
|
||||
* @param childId id of child
|
||||
* @return the invoice as a List
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static List<String> getInvoice(String date, String childId){
|
||||
protected static List<String> getInvoice(String date, String childId) {
|
||||
List<String> invoice = new ArrayList<>();
|
||||
List<String> child = Database.getEntryById("child", Long.parseLong(childId));
|
||||
if(child.size() != 1){
|
||||
if (child.size() != 1) {
|
||||
return invoice;
|
||||
}
|
||||
invoice.add("Monatsabrechnung " + date);
|
||||
String[] childParts = child.get(0).split(":");
|
||||
invoice.add(childParts[1] + ", " + childParts[2]);
|
||||
String[] food_planH = {"date"};
|
||||
String[] food_planD = {date+"%"};
|
||||
List<String> food_plan = Database.select("food_plan",food_planH,food_planD);
|
||||
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);
|
||||
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]));
|
||||
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);
|
||||
}
|
||||
}
|
||||
double price = getPrice();
|
||||
invoice.add("Total: " + (invoice.size()-2) + " X " + price + "€ = " + ((invoice.size()-2)*price) + "€");
|
||||
invoice.add("Total: " + (invoice.size() - 2) + " X " + price + "€ = " + ((invoice.size() - 2) * price) + "€");
|
||||
return invoice;
|
||||
}
|
||||
|
||||
/**
|
||||
* gets the price per meal from the database and converts it to double
|
||||
*
|
||||
* @return double price
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static double getPrice(){
|
||||
List<String> priceEntry = Database.getEntryById("price",1);
|
||||
return Double.parseDouble(priceEntry.get(0).split(":")[1])/100.0;
|
||||
protected static double getPrice() {
|
||||
List<String> priceEntry = Database.getEntryById("price", 1);
|
||||
return Double.parseDouble(priceEntry.get(0).split(":")[1]) / 100.0;
|
||||
}
|
||||
|
||||
/**
|
||||
* converts the price per meal to integer and updates it in the database
|
||||
*
|
||||
* @param price double
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static void setPrice(double price){
|
||||
String[] priceH = {"id","price"};
|
||||
String[] priceD = {"1", String.valueOf((int)(price*100))};
|
||||
Database.update("price",priceH,priceD);
|
||||
protected static void setPrice(double price) {
|
||||
String[] priceH = { "id", "price" };
|
||||
String[] priceD = { "1", String.valueOf((int) (price * 100)) };
|
||||
Database.update("price", priceH, priceD);
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,141 @@
|
||||
package com.bib.essensbestellungsverwaltung;
|
||||
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.*;
|
||||
import org.controlsfx.control.CheckComboBox;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ChildController {
|
||||
public TextField firstName;
|
||||
public ChoiceBox childChoiceBox;
|
||||
public TextField lastName;
|
||||
public Button kindHinzufügenButton;
|
||||
public CheckComboBox allergienComboBox;
|
||||
public Button kindLoeschenButton;
|
||||
|
||||
private Child currentChild = null;
|
||||
|
||||
private long selectedChildId;
|
||||
|
||||
@FXML
|
||||
public void initialize() {
|
||||
kindLoeschenButton.setDisable(true);
|
||||
updateChildChoiceBoxItems();
|
||||
|
||||
List<String> a = Database.getTable("allergy");
|
||||
ObservableList<String> allergies = FXCollections.observableArrayList();
|
||||
for (String allergie : a) {
|
||||
allergies.add(allergie.split(":")[0] + ": " + allergie.split(":")[1]);
|
||||
}
|
||||
allergienComboBox.getItems().addAll(allergies);
|
||||
}
|
||||
|
||||
public void onSelectChild(ActionEvent mouseEvent) {
|
||||
selectedChildId = Integer.parseInt(childChoiceBox.getValue().toString().split(":")[0]);
|
||||
System.out.println("Selected Child: " + selectedChildId);
|
||||
|
||||
clearInputs();
|
||||
|
||||
if(selectedChildId == 0) {
|
||||
kindHinzufügenButton.setText("Kind Hinzufügen");
|
||||
kindLoeschenButton.setDisable(true);
|
||||
return;
|
||||
}
|
||||
|
||||
// Get selected child and update fields
|
||||
currentChild = AccountMgr.getChildById(selectedChildId);
|
||||
firstName.setText(currentChild.getFirstname());
|
||||
lastName.setText(currentChild.getName());
|
||||
for (AllergySeverity a : currentChild.getAllergies()){
|
||||
allergienComboBox.getCheckModel().check((int) a.getAllergy().getId() - 1);
|
||||
}
|
||||
kindHinzufügenButton.setText("Kind updaten");
|
||||
kindLoeschenButton.setDisable(false);
|
||||
}
|
||||
|
||||
public void onKindHinzufügen(ActionEvent actionEvent) {
|
||||
if(childChoiceBox.getValue() == null){
|
||||
Alert alert = new Alert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Ungültige Eingabe");
|
||||
alert.setHeaderText("Sie müssen ein Kind auswählen");
|
||||
alert.showAndWait();
|
||||
return;
|
||||
}
|
||||
|
||||
if(lastName.getText().isBlank() || firstName.getText().isBlank()){
|
||||
Alert alert = new Alert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Ungültige Eingabe");
|
||||
alert.setHeaderText("Es wurden nicht alle Felder ausgefüllt");
|
||||
alert.showAndWait();
|
||||
return;
|
||||
}
|
||||
|
||||
Address adress = AccountMgr.currentUser.getAddress();
|
||||
List<AllergySeverity> allergies = new ArrayList<>();
|
||||
allergienComboBox.getCheckModel().getCheckedItems().stream().forEach(a -> {
|
||||
long id = Integer.parseInt(a.toString().split(":")[0]);
|
||||
String name = a.toString().split(":")[1].trim();
|
||||
// TODO: Allergy Severity
|
||||
allergies.add(new AllergySeverity(new Allergy(id, name, ""), 2, null));
|
||||
});
|
||||
|
||||
if(selectedChildId == 0){
|
||||
long id = AccountMgr.createChild(new Child(lastName.getText(), firstName.getText(), adress, allergies));
|
||||
System.out.println("Child created: " + id);
|
||||
|
||||
if(id <= 0){
|
||||
Alert alert = new Alert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Es ist ein fehler beim erstellen des Kinds aufgetreten");
|
||||
alert.showAndWait();
|
||||
return;
|
||||
}
|
||||
AccountMgr.matchParentChild(String.valueOf(AccountMgr.currentUser.getId()), String.valueOf(id));
|
||||
|
||||
childChoiceBox.getItems().add(id + ": " + firstName.getText() + " " + lastName.getText());
|
||||
childChoiceBox.setValue(childChoiceBox.getItems().get(childChoiceBox.getItems().size() - 1));
|
||||
clearInputs();
|
||||
onSelectChild(null);
|
||||
|
||||
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
||||
alert.setTitle("Kind erstellt");
|
||||
alert.setHeaderText("Es wurde ein Kind erstellt");
|
||||
alert.showAndWait();
|
||||
}else {
|
||||
long id = AccountMgr.updateChild(new Child(currentChild.getId(), lastName.getText(), firstName.getText(), adress, allergies));
|
||||
System.out.println("Updated Child: " + id);
|
||||
}
|
||||
}
|
||||
|
||||
private void clearInputs(){
|
||||
firstName.setText("");
|
||||
lastName.setText("");
|
||||
allergienComboBox.getCheckModel().clearChecks();
|
||||
}
|
||||
|
||||
public void updateChildChoiceBoxItems(){
|
||||
List<Child> childList = AccountMgr.getAllChildrenFromParentWithId(AccountMgr.currentUser.getId());
|
||||
|
||||
ObservableList<Object> childOptions = FXCollections.observableArrayList(childList.stream().map(c -> c.getId() + ": " + c.getFirstname() + " " + c.getName()).toList().toArray(new String[0]));
|
||||
childOptions.add(0, "0: neues Kind erstellen");
|
||||
childChoiceBox.setItems(childOptions);
|
||||
}
|
||||
|
||||
public void onKindLoeschen(ActionEvent actionEvent) {
|
||||
AccountMgr.deleteChildWithId(currentChild.getId());
|
||||
System.out.println("Deleted Child: " + currentChild.getId());
|
||||
|
||||
childChoiceBox.getItems().remove(childChoiceBox.getItems().stream().filter(v -> v.equals(currentChild.getId() + ": " + currentChild.getFirstname() + " " + currentChild.getName())).findFirst().get());
|
||||
childChoiceBox.setValue(childChoiceBox.getItems().get(1));
|
||||
|
||||
onSelectChild(null);
|
||||
|
||||
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
||||
alert.setTitle("Kind wurde gelöscht");
|
||||
alert.showAndWait();
|
||||
}
|
||||
}
|
@@ -1,14 +1,17 @@
|
||||
package com.bib.essensbestellungsverwaltung;
|
||||
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.RadioButton;
|
||||
import javafx.scene.control.TextArea;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.text.Text;
|
||||
import org.controlsfx.control.CheckComboBox;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class CreateFoodController {
|
||||
@@ -27,9 +30,18 @@ public class CreateFoodController {
|
||||
@FXML
|
||||
public RadioButton isFleischRadio;
|
||||
@FXML
|
||||
public TextArea allergienTextBox;
|
||||
@FXML
|
||||
public Text responseText;
|
||||
public CheckComboBox allergienComboBox;
|
||||
|
||||
@FXML
|
||||
public void initialize() {
|
||||
List<String> a = Database.getTable("allergy");
|
||||
ObservableList<String> allergies = FXCollections.observableArrayList();
|
||||
for (String allergie : a) {
|
||||
allergies.add(allergie.split(":")[0] + ": " + allergie.split(":")[1]);
|
||||
}
|
||||
allergienComboBox.getItems().addAll(allergies);
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void onAbbrechen(ActionEvent actionEvent) {
|
||||
@@ -37,22 +49,63 @@ public class CreateFoodController {
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void onHinzufügen(ActionEvent actionEvent) {
|
||||
public void onHinzufuegen(ActionEvent actionEvent) {
|
||||
String gerichtName = name.getText();
|
||||
String beschreibung = description.getText();
|
||||
|
||||
if(gerichtName.isBlank()){
|
||||
Alert alert = new Alert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Ungültige Eingabe");
|
||||
alert.setHeaderText("Es wurden nicht alle Felder ausgefüllt");
|
||||
alert.setContentText("Das Feld 'Name' ist nicht ausgefüllt");
|
||||
alert.showAndWait();
|
||||
return;
|
||||
}
|
||||
if(beschreibung.isBlank()){
|
||||
Alert alert = new Alert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Ungültige Eingabe");
|
||||
alert.setHeaderText("Es wurden nicht alle Felder ausgefüllt");
|
||||
alert.setContentText("Das Feld 'Beschreibung' ist nicht ausgefüllt");
|
||||
alert.showAndWait();
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isHauptgerichtRadio.isSelected() && !isDessertRadio.isSelected()){
|
||||
// art auswähelen
|
||||
Alert alert = new Alert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Ungültige Eingabe");
|
||||
alert.setHeaderText("Es wurden nicht alle Felder ausgefüllt");
|
||||
alert.setContentText("Das Feld 'Art' ist nicht ausgefüllt");
|
||||
alert.showAndWait();
|
||||
return;
|
||||
}
|
||||
boolean isNachtisch = !isHauptgerichtRadio.isSelected();
|
||||
if(!isVegetarischRadio.isSelected() && !isVeganRadio.isSelected() && isFleischRadio.isSelected()){
|
||||
// Typ auswählen
|
||||
if(!isVegetarischRadio.isSelected() && !isVeganRadio.isSelected() && !isFleischRadio.isSelected()){
|
||||
Alert alert = new Alert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Ungültige Eingabe");
|
||||
alert.setHeaderText("Es wurden nicht alle Felder ausgefüllt");
|
||||
alert.setContentText("Das Feld 'Typ' ist nicht ausgefüllt");
|
||||
alert.showAndWait();
|
||||
return;
|
||||
}
|
||||
int ft = isVeganRadio.isSelected() ? 1 : isVeganRadio.isSelected() ? 2 : 3;
|
||||
FoodType foodType = new FoodType(ft, "Vegan");
|
||||
List<Allergy> allergies = new ArrayList<>();
|
||||
// TODO: allergien hinzufügen
|
||||
allergienComboBox.getCheckModel().getCheckedItems().stream().forEach(a -> {
|
||||
long id = Integer.parseInt(a.toString().split(":")[0]);
|
||||
String name = a.toString().split(":")[1].trim();
|
||||
allergies.add((new Allergy(id, name, "")));
|
||||
});
|
||||
System.out.println(allergies.get(0).getName());
|
||||
|
||||
long id = FoodMgr.createFood(new Food(gerichtName, beschreibung, isNachtisch, foodType, allergies));
|
||||
if(id <= 0){
|
||||
Alert alert = new Alert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Es ist ein Problem beim Erstellen des Gerichts aufgetreten");
|
||||
alert.setHeaderText("Bitte überprüfen Sie ihre Eingabe");
|
||||
alert.setContentText("Es besteht die Möglichkeit, dass dieses Gericht bereits existiert");
|
||||
alert.showAndWait();
|
||||
return;
|
||||
}
|
||||
System.out.println("Food created with id: " + id);
|
||||
responseText.setText("New Food Created");
|
||||
clearInputs();
|
||||
@@ -66,6 +119,6 @@ public class CreateFoodController {
|
||||
isVeganRadio.setSelected(false);
|
||||
isVegetarischRadio.setSelected(false);
|
||||
isFleischRadio.setSelected(false);
|
||||
allergienTextBox.setText("");
|
||||
allergienComboBox.getCheckModel().clearChecks();
|
||||
}
|
||||
}
|
||||
|
@@ -31,20 +31,28 @@ public class CreateFoodplanController {
|
||||
ChoiceBox secondDessert;
|
||||
|
||||
private List<Food> foods;
|
||||
private List<Food> veganFoods;
|
||||
private List<Food> desserts;
|
||||
private List<Food> veganDesserts;
|
||||
private FoodPlan currentPlan;
|
||||
|
||||
|
||||
@FXML
|
||||
public void initialize() {
|
||||
veganFoods = FoodMgr.getVeganFood(false);
|
||||
foods = FoodMgr.getFood(false);
|
||||
veganDesserts = FoodMgr.getVeganFood(true);
|
||||
desserts = FoodMgr.getFood(true);
|
||||
|
||||
ObservableList<Object> foodOptions = FXCollections.observableArrayList(foods.stream().map(food -> food.getId() + ": " + food.getName()).toList().toArray(new String[0]));
|
||||
firstMeal.setItems(foodOptions);
|
||||
ObservableList<Object> veganFoodOptions = FXCollections.observableArrayList(veganFoods.stream().map(food -> food.getId() + ": " + food.getName()).toList().toArray(new String[0]));
|
||||
ObservableList<Object> veganDessertOptions = FXCollections.observableArrayList(veganDesserts.stream().map(dessert -> dessert.getId() + ": " + dessert.getName()).toList().toArray(new String[0]));
|
||||
ObservableList<Object> dessertOptions = FXCollections.observableArrayList(desserts.stream().map(dessert -> dessert.getId() + ": " + dessert.getName()).toList().toArray(new String[0]));
|
||||
firstMeal.setItems(veganFoodOptions);
|
||||
secondMeal.setItems(foodOptions);
|
||||
|
||||
ObservableList<Object> dessertOptions = FXCollections.observableArrayList(desserts.stream().map(dessert -> dessert.getId() + ": " + dessert.getName()).toList().toArray(new String[0]));
|
||||
firstDessert.setItems(dessertOptions);
|
||||
|
||||
firstDessert.setItems(veganDessertOptions);
|
||||
secondDessert.setItems(dessertOptions);
|
||||
|
||||
date.setValue(LocalDate.now());
|
||||
|
@@ -0,0 +1,76 @@
|
||||
package com.bib.essensbestellungsverwaltung;
|
||||
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.DatePicker;
|
||||
import javafx.scene.control.ListView;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
|
||||
public class DailyOrderController {
|
||||
public ListView listView;
|
||||
public DatePicker datePicker;
|
||||
public Button sendButton;
|
||||
|
||||
|
||||
@FXML
|
||||
public void initialize() {
|
||||
datePicker.setValue(LocalDate.now());
|
||||
updatePlan(datePicker.getValue().toString());
|
||||
}
|
||||
|
||||
public void onChangeDate(ActionEvent actionEvent) {
|
||||
updatePlan(datePicker.getValue().toString());
|
||||
}
|
||||
|
||||
|
||||
private void updatePlan(String date){
|
||||
listView.getItems().clear();
|
||||
System.out.print("Orders from " + date + " : ");
|
||||
List<String> orders = new ArrayList<>();
|
||||
FoodPlan food_plan = FoodMgr.getFoodPlan(date);
|
||||
if(food_plan == null){
|
||||
sendButton.setVisible(false);
|
||||
return;
|
||||
}
|
||||
sendButton.setVisible(true);
|
||||
if(food_plan.isSent()){
|
||||
sendButton.setDisable(true);
|
||||
sendButton.setText("Bestellung wurde Gesendet");
|
||||
}else {
|
||||
sendButton.setDisable(false);
|
||||
sendButton.setText("Bestellung senden");
|
||||
}
|
||||
String sId = String.valueOf(food_plan.getId());
|
||||
String[] food_selectionH = {"food_planid","foodid"};
|
||||
Food[] foodArray = {
|
||||
food_plan.getFoodVegan(),
|
||||
food_plan.getFoodSecond(),
|
||||
food_plan.getDessertVegan(),
|
||||
food_plan.getDessertSecond()
|
||||
};
|
||||
for(int i = 0; i < 4; i++){
|
||||
String foodName = foodArray[i].getName();
|
||||
String[] food_selectionD = {sId, String.valueOf(foodArray[i].getId())};
|
||||
int count = Database.count("food_selection",food_selectionH,food_selectionD);
|
||||
orders.add(count+" X "+foodName);
|
||||
}
|
||||
|
||||
System.out.println(orders);
|
||||
|
||||
|
||||
for(String order : orders){
|
||||
listView.getItems().add(order);
|
||||
}
|
||||
}
|
||||
|
||||
public void onSendButton(ActionEvent actionEvent) {
|
||||
FoodMgr.getDayOrder(datePicker.getValue().toString());
|
||||
sendButton.setDisable(true);
|
||||
sendButton.setText("Bestellung wurde Gesendet");
|
||||
}
|
||||
}
|
@@ -9,20 +9,23 @@ import java.util.List;
|
||||
|
||||
/**
|
||||
* Basic operations on the database
|
||||
* Use init() -> createDb() -> fillDb() to create the skeleton with some default values
|
||||
* Use init() -> createDb() -> fillDb() to create the skeleton with some default
|
||||
* values
|
||||
* Provides select, insert, update, delete, count operations and more
|
||||
*
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
public class Database {
|
||||
private static final String dbLocation = "jdbc:sqlite:"+Path.of("").toAbsolutePath()+"/database.db";
|
||||
private static final String dbLocation = "jdbc:sqlite:" + Path.of("").toAbsolutePath() + "/database.db";
|
||||
|
||||
/**
|
||||
* creates new database.db if it doesn't exist
|
||||
*
|
||||
* @return true if a new database has been created
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static boolean init(){
|
||||
File db = new File(Path.of("").toAbsolutePath()+"/database.db");
|
||||
protected static boolean init() {
|
||||
File db = new File(Path.of("").toAbsolutePath() + "/database.db");
|
||||
try {
|
||||
return db.createNewFile();
|
||||
} catch (IOException e) {
|
||||
@@ -32,14 +35,15 @@ public class Database {
|
||||
|
||||
/**
|
||||
* connects to the database
|
||||
*
|
||||
* @return Connection to the database
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static Connection connect(){
|
||||
protected static Connection connect() {
|
||||
Connection conn = null;
|
||||
try{
|
||||
try {
|
||||
conn = DriverManager.getConnection(dbLocation);
|
||||
}catch (SQLException e){
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return conn;
|
||||
@@ -47,9 +51,10 @@ public class Database {
|
||||
|
||||
/**
|
||||
* creates the initial structure of the db
|
||||
*
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static void createDb(){
|
||||
protected static void createDb() {
|
||||
String[] sql = new String[15];
|
||||
sql[0] = """
|
||||
CREATE TABLE IF NOT EXISTS address (
|
||||
@@ -167,8 +172,8 @@ public class Database {
|
||||
id integer PRIMARY KEY,
|
||||
price integer
|
||||
);""";
|
||||
try(Connection conn = connect(); Statement stmt = conn.createStatement()){
|
||||
for(int i = 0; i < sql.length; i++){
|
||||
try (Connection conn = connect(); Statement stmt = conn.createStatement()) {
|
||||
for (int i = 0; i < sql.length; i++) {
|
||||
stmt.execute(sql[i]);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
@@ -178,10 +183,12 @@ public class Database {
|
||||
|
||||
/**
|
||||
* inserts fixed values into the database
|
||||
*
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static void fillDb(){
|
||||
protected static void fillDb() {
|
||||
List<String> sqls = new ArrayList<>();
|
||||
// food_type
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_type (id,name)
|
||||
VALUES ('1','Vegan');""");
|
||||
@@ -191,6 +198,7 @@ public class Database {
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_type (id,name)
|
||||
VALUES ('3','Fleischhaltig');""");
|
||||
// allergy
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO allergy (id,name,handle)
|
||||
VALUES('1','Eier','a');""");
|
||||
@@ -257,6 +265,7 @@ public class Database {
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO allergy (id,name,handle)
|
||||
VALUES('22','Konservierungsstoff','8');""");
|
||||
// severity
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO severity (id,name)
|
||||
VALUES('1','Harmlos');""");
|
||||
@@ -269,11 +278,155 @@ public class Database {
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO price (id,price)
|
||||
VALUES('1','500');""");
|
||||
try(Connection conn = connect(); Statement stmt = conn.createStatement()){
|
||||
// user
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO address (id,street,number,plz,city)
|
||||
VALUES('1','teststreet','69','1337','Mond');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO user (id,name,firstname,addressid,password,email)
|
||||
VALUES('1','testparent','testparent','1','YOD+TB0twF2SrueBj26t5OjEJK/Al4G6/hq+IMRyBz4=.f4zL2UJW4POrf/xgJdNaiw==','testparent@test.de');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO parent (userid)
|
||||
VALUES('1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO user (id,name,firstname,addressid,password,email)
|
||||
VALUES('2','testworker','testworker','1','YOD+TB0twF2SrueBj26t5OjEJK/Al4G6/hq+IMRyBz4=.f4zL2UJW4POrf/xgJdNaiw==','testworker@test.de');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO worker (userid)
|
||||
VALUES('2');""");
|
||||
// food
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('1','Steak','69','0','3');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('2','Schnitzel','69','0','3');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('3','Hamburger','69','0','3');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('4','Nudeln','69','0','1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('5','Salat','69','0','1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('6','Pudding','69','1','1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('7','Eis','69','1','1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('8','Wackelpudding','69','1','1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('9','Kuchen','69','1','1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('10','Apfel','69','1','1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('11','Banane','69','1','1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('12','Nudelauflauf','69','0','3');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('13','Reibekuchen','69','0','1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('14','Gefüllte Paprika','69','0','1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('15','Suishi','69','0','2');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food (id,name,description,isdessert,food_typeid)
|
||||
VALUES('16','Champignons','69','0','2');""");
|
||||
// child
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO child (id,name,firstname,addressid)
|
||||
VALUES('1','Lustig','Peter','1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO child (id,name,firstname,addressid)
|
||||
VALUES('2','Wahnsinn','Rainer','1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO parent_child ('id',parentuserid,childid)
|
||||
VALUES('1','1','1');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO parent_child ('id',parentuserid,childid)
|
||||
VALUES('2','1','2');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO child_allergy (childid,allergyid,severityid)
|
||||
VALUES('1','1','2');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO child_allergy (childid,allergyid,severityid)
|
||||
VALUES('1','3','2');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO child_allergy (childid,allergyid,severityid)
|
||||
VALUES('1','4','2');""");
|
||||
// foodplan
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_plan ('id',date,food1,food2,dessert1,dessert2)
|
||||
VALUES('1','2023-02-06','4','1','8','7');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_plan ('id',date,food1,food2,dessert1,dessert2)
|
||||
VALUES('2','2023-02-07','5','2','6','7');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_plan ('id',date,food1,food2,dessert1,dessert2)
|
||||
VALUES('3','2023-02-08','4','3','8','6');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_plan ('id',date,food1,food2,dessert1,dessert2)
|
||||
VALUES('4','2023-02-09','16','1','11','10');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_plan ('id',date,food1,food2,dessert1,dessert2)
|
||||
VALUES('5','2023-02-09','14','13','7','9');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_plan ('id',date,food1,food2,dessert1,dessert2)
|
||||
VALUES('6','2023-02-10','13','15','8','6');""");
|
||||
// food_selection
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid)
|
||||
VALUES('1','1','1','4');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid)
|
||||
VALUES('2','1','1','8');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid)
|
||||
VALUES('3','2','1','4');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid)
|
||||
VALUES('4','2','1','8');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid)
|
||||
VALUES('5','1','2','5');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid)
|
||||
VALUES('6','1','2','7');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid)
|
||||
VALUES('7','2','2','5');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid)
|
||||
VALUES('8','2','2','7');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid)
|
||||
VALUES('9','1','3','4');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid)
|
||||
VALUES('10','1','3','8');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid)
|
||||
VALUES('11','2','3','4');""");
|
||||
sqls.add("""
|
||||
INSERT OR IGNORE INTO food_selection ('id',childid,food_planid,foodid)
|
||||
VALUES('12','2','3','6');""");
|
||||
|
||||
try (Connection conn = connect(); Statement stmt = conn.createStatement()) {
|
||||
for (String sql : sqls) {
|
||||
stmt.execute(sql);
|
||||
}
|
||||
}catch (SQLException e){
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -281,35 +434,36 @@ public class Database {
|
||||
/**
|
||||
* inserts data into table and returns its id
|
||||
* simple duplication check
|
||||
* @param table name of the database table
|
||||
*
|
||||
* @param table name of the database table
|
||||
* @param header String[] order should match with values
|
||||
* @param values String[] order should match with header
|
||||
* @return id of dataset or -1
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static long insert(String table, String[] header, String[] values){
|
||||
protected static long insert(String table, String[] header, String[] values) {
|
||||
long id = -1;
|
||||
try (Connection conn = connect()){
|
||||
String query = queryBuilder("exists",table,header,values);
|
||||
try (Connection conn = connect()) {
|
||||
String query = queryBuilder("exists", table, header, values);
|
||||
PreparedStatement psQuery = conn.prepareStatement(query);
|
||||
ResultSet rsQuery = psQuery.executeQuery();
|
||||
if(rsQuery.next()){
|
||||
if (rsQuery.next()) {
|
||||
boolean found = rsQuery.getBoolean(1);
|
||||
if(!found){
|
||||
String sql = queryBuilder("insert",table,header,values);
|
||||
String[] rowId = {"id"};
|
||||
PreparedStatement ps = conn.prepareStatement(sql,rowId);
|
||||
if (!found) {
|
||||
String sql = queryBuilder("insert", table, header, values);
|
||||
String[] rowId = { "id" };
|
||||
PreparedStatement ps = conn.prepareStatement(sql, rowId);
|
||||
ps.execute();
|
||||
ResultSet rs = ps.getGeneratedKeys();
|
||||
if(rs.next()){
|
||||
if (rs.next()) {
|
||||
id = rs.getLong(1);
|
||||
}
|
||||
|
||||
}else{
|
||||
query = queryBuilder("selectMatch",table,header,values);
|
||||
} else {
|
||||
query = queryBuilder("selectMatch", table, header, values);
|
||||
psQuery = conn.prepareStatement(query);
|
||||
rsQuery = psQuery.executeQuery();
|
||||
if(rsQuery.next()) {
|
||||
if (rsQuery.next()) {
|
||||
id = rsQuery.getLong(1);
|
||||
}
|
||||
}
|
||||
@@ -323,25 +477,26 @@ public class Database {
|
||||
|
||||
/**
|
||||
* returns a single id that matches the given data
|
||||
* @param table the table that contains the searched entry
|
||||
*
|
||||
* @param table the table that contains the searched entry
|
||||
* @param header the header of the table, order should match with values
|
||||
* @param values the data you want the id of, order should match witch values
|
||||
* @return one id matching the given data or -1 if no match has been found
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static long getSingleId(String table, String[] header, String[] values){
|
||||
protected static long getSingleId(String table, String[] header, String[] values) {
|
||||
long id = -1;
|
||||
try(Connection conn = connect()){
|
||||
String sql = queryBuilder("selectMatch",table,header,values);
|
||||
try (Connection conn = connect()) {
|
||||
String sql = queryBuilder("selectMatch", table, header, values);
|
||||
PreparedStatement ps = conn.prepareStatement(sql);
|
||||
ResultSet rs = ps.executeQuery();
|
||||
if(rs.next()){
|
||||
if (rs.next()) {
|
||||
id = rs.getLong(1);
|
||||
if(rs.next()){
|
||||
if (rs.next()) {
|
||||
id = -1;
|
||||
}
|
||||
}
|
||||
}catch (SQLException e){
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
return id;
|
||||
}
|
||||
@@ -351,63 +506,66 @@ public class Database {
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
protected static void printSampleQuery(){
|
||||
protected static void printSampleQuery() {
|
||||
String sql = """
|
||||
SELECT * FROM food_type WHERE id > ?;""";
|
||||
String sql1 = """
|
||||
SELECT * FROM allergy WHERE id > ?;""";
|
||||
try(Connection conn = connect()){
|
||||
try (Connection conn = connect()) {
|
||||
PreparedStatement ps = conn.prepareStatement(sql);
|
||||
PreparedStatement ps1 = conn.prepareStatement(sql1);
|
||||
ps.setInt(1,0);
|
||||
ps.setInt(1, 0);
|
||||
ResultSet rs = ps.executeQuery();
|
||||
System.out.println("food_type");
|
||||
while (rs.next()){
|
||||
while (rs.next()) {
|
||||
System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name"));
|
||||
}
|
||||
System.out.println("allergy");
|
||||
ps1.setInt(1,0);
|
||||
ps1.setInt(1, 0);
|
||||
rs = ps1.executeQuery();
|
||||
while (rs.next()){
|
||||
while (rs.next()) {
|
||||
System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name"));
|
||||
}
|
||||
}catch (SQLException e){
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* deletes an entry from table with matching id
|
||||
*
|
||||
* @param table the table that contains the entry you want to delete
|
||||
* @param id the id of the entry you want to delete
|
||||
* @param id the id of the entry you want to delete
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static void delete(String table, long id){
|
||||
protected static void delete(String table, long id) {
|
||||
String sql = "DELETE FROM " + table + " WHERE id = ?;";
|
||||
try(Connection conn = connect();PreparedStatement ps = conn.prepareStatement(sql)){
|
||||
ps.setLong(1,id);
|
||||
try (Connection conn = connect(); PreparedStatement ps = conn.prepareStatement(sql)) {
|
||||
ps.setLong(1, id);
|
||||
ps.executeUpdate();
|
||||
}catch (SQLException e){
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* its a query builder it builds queries
|
||||
* exists: checks if an entry with the given parameters exists in table
|
||||
* selectMatch: returns all matching rows from table
|
||||
* insert: inserts or ignores into table
|
||||
* count: counts exact matches from table
|
||||
* update: updates table, header/values[0] is used as WHERE, using id is recommended header/values[1+] are used
|
||||
* as SET
|
||||
* @param type exists, selectMatch, insert, count, update
|
||||
* @param table table
|
||||
* exists: checks if an entry with the given parameters exists in table
|
||||
* selectMatch: returns all matching rows from table
|
||||
* insert: inserts or ignores into table
|
||||
* count: counts exact matches from table
|
||||
* update: updates table, header/values[0] is used as WHERE, using id is
|
||||
* recommended header/values[1+] are used
|
||||
* as SET
|
||||
*
|
||||
* @param type exists, selectMatch, insert, count, update
|
||||
* @param table table
|
||||
* @param header header
|
||||
* @param values values
|
||||
* @return sql statement as String
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
private static String queryBuilder(String type,String table, String[] header, String[] values){
|
||||
private static String queryBuilder(String type, String table, String[] header, String[] values) {
|
||||
String sql;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
switch (type) {
|
||||
@@ -469,7 +627,7 @@ public class Database {
|
||||
sb.append(header[0]);
|
||||
sb.append(" = ");
|
||||
sb.append(values[0]);
|
||||
for(int i = 1; i < header.length; i++){
|
||||
for (int i = 1; i < header.length; i++) {
|
||||
sb.append(" AND ");
|
||||
sb.append(header[i]);
|
||||
sb.append(" = ");
|
||||
@@ -482,12 +640,12 @@ public class Database {
|
||||
sb.append(" SET ");
|
||||
sb.append(header[1]);
|
||||
sb.append(" = ");
|
||||
sb.append(values[1]);
|
||||
for(int i = 2; i < header.length; i++){
|
||||
sb.append("'" + values[1] + "'");
|
||||
for (int i = 2; i < header.length; i++) {
|
||||
sb.append(", ");
|
||||
sb.append(header[i]);
|
||||
sb.append(" = ");
|
||||
sb.append(values[i]);
|
||||
sb.append("'" + values[i] + "'");
|
||||
}
|
||||
sb.append(" WHERE ");
|
||||
sb.append(header[0]);
|
||||
@@ -501,61 +659,64 @@ public class Database {
|
||||
|
||||
/**
|
||||
* returns a list of all entries
|
||||
*
|
||||
* @param table the table you want
|
||||
* @return a list of all entries as String with the fields separated by ":"
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static List<String> getTable(String table){
|
||||
protected static List<String> getTable(String table) {
|
||||
List<String> data = new ArrayList<>();
|
||||
StringBuilder sb;
|
||||
try(Connection conn = connect()) {
|
||||
try (Connection conn = connect()) {
|
||||
String sql = "SELECT * FROM " + table;
|
||||
PreparedStatement ps = conn.prepareStatement(sql);
|
||||
ResultSet rs = ps.executeQuery();
|
||||
ResultSetMetaData rsmd = rs.getMetaData();
|
||||
int count = rsmd.getColumnCount();
|
||||
while (rs.next()){
|
||||
while (rs.next()) {
|
||||
sb = new StringBuilder();
|
||||
sb.append(rs.getString(1));
|
||||
for(int i = 2; i <= count; i++){
|
||||
for (int i = 2; i <= count; i++) {
|
||||
sb.append(":");
|
||||
sb.append(rs.getString(i));
|
||||
}
|
||||
data.add(sb.toString());
|
||||
}
|
||||
}catch (SQLException e){
|
||||
} catch (SQLException e) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* issues a select query on the database for the given table and the given values checked with LIKE
|
||||
* @param table the table you want the data from
|
||||
* issues a select query on the database for the given table and the given
|
||||
* values checked with LIKE
|
||||
*
|
||||
* @param table the table you want the data from
|
||||
* @param header header for the WHERE portion, order should match with values
|
||||
* @param values values for the WHERE portion, order should match with header
|
||||
* @return a list of the matching data as String separated by ":"
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static List<String> select(String table,String[] header, String[] values){
|
||||
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()) {
|
||||
String sql = queryBuilder("selectMatch", table, header, values);
|
||||
try (Connection conn = connect()) {
|
||||
PreparedStatement ps = conn.prepareStatement(sql);
|
||||
ResultSet rs = ps.executeQuery();
|
||||
ResultSetMetaData rsmd = rs.getMetaData();
|
||||
int count = rsmd.getColumnCount();
|
||||
while (rs.next()){
|
||||
while (rs.next()) {
|
||||
sb = new StringBuilder();
|
||||
sb.append(rs.getString(1));
|
||||
for(int i = 2; i <= count; i++){
|
||||
for (int i = 2; i <= count; i++) {
|
||||
sb.append(":");
|
||||
sb.append(rs.getString(i));
|
||||
}
|
||||
data.add(sb.toString());
|
||||
}
|
||||
}catch (SQLException e){
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
return data;
|
||||
}
|
||||
@@ -564,25 +725,26 @@ public class Database {
|
||||
|
||||
/**
|
||||
* returns the entry from table with the given id
|
||||
*
|
||||
* @param table the table you want the entry from
|
||||
* @param id the id of the entry you want
|
||||
* @param id the id of the entry you want
|
||||
* @return a list of String separated by ":"
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static List<String> getEntryById(String table, long id){
|
||||
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);
|
||||
ps.setLong(1, id);
|
||||
ResultSet rs = ps.executeQuery();
|
||||
ResultSetMetaData rsmd = rs.getMetaData();
|
||||
int count = rsmd.getColumnCount();
|
||||
while (rs.next()){
|
||||
while (rs.next()) {
|
||||
sb = new StringBuilder();
|
||||
sb.append(rs.getString(1));
|
||||
for(int i = 2; i <= count; i++){
|
||||
for (int i = 2; i <= count; i++) {
|
||||
sb.append(":");
|
||||
sb.append(rs.getString(i));
|
||||
}
|
||||
@@ -597,38 +759,40 @@ public class Database {
|
||||
|
||||
/**
|
||||
* counts the number of matching entries
|
||||
* @param table the table you want to count
|
||||
*
|
||||
* @param table the table you want to count
|
||||
* @param header the properties you want to count on
|
||||
* @param values the values for the properties
|
||||
* @return the number of found rows
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static int count(String table,String[] header,String[] values){
|
||||
String sql = queryBuilder("count",table,header,values);
|
||||
try(Connection conn = connect()) {
|
||||
protected static int count(String table, String[] header, String[] values) {
|
||||
String sql = queryBuilder("count", table, header, values);
|
||||
try (Connection conn = connect()) {
|
||||
PreparedStatement ps = conn.prepareStatement(sql);
|
||||
ResultSet rs = ps.executeQuery();
|
||||
return rs.getInt(1);
|
||||
}catch (SQLException e){
|
||||
} catch (SQLException e) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* updates an entry in the database
|
||||
* @param table the table you want to update
|
||||
*
|
||||
* @param table the table you want to update
|
||||
* @param header [0] is used as WHERE, everything else in SET
|
||||
* @param values [0] is used as WHERE, everything else in SET
|
||||
* @return number of rows affected or -1 on error
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
protected static int update(String table,String[] header,String[] values){
|
||||
try(Connection conn = connect()) {
|
||||
String sql = queryBuilder("update",table,header,values);
|
||||
protected static int update(String table, String[] header, String[] values) {
|
||||
try (Connection conn = connect()) {
|
||||
String sql = queryBuilder("update", table, header, values);
|
||||
PreparedStatement ps = conn.prepareStatement(sql);
|
||||
return ps.executeUpdate();
|
||||
}catch (SQLException e){
|
||||
return -1;
|
||||
} catch (SQLException e) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -235,6 +235,9 @@ public class FoodMgr {
|
||||
public static List<String> getDayOrder(String date){
|
||||
List<String> orders = new ArrayList<>();
|
||||
FoodPlan food_plan = getFoodPlan(date);
|
||||
if(food_plan == null){
|
||||
return orders;
|
||||
}
|
||||
String sId = String.valueOf(food_plan.getId());
|
||||
String[] food_selectionH = {"food_planid","foodid"};
|
||||
Food[] foodArray = {
|
||||
|
@@ -5,11 +5,12 @@ import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.control.TextField;
|
||||
|
||||
/**
|
||||
* @author Reshad Meher
|
||||
* Username, Passwort , login
|
||||
*/
|
||||
|
||||
public class HelloController {
|
||||
/**
|
||||
* @autor: Reshad Meher
|
||||
* Username, Passwort , login
|
||||
*/
|
||||
|
||||
@FXML
|
||||
private TextField unsernameEingabe;
|
||||
|
@@ -1,12 +1,20 @@
|
||||
package com.bib.essensbestellungsverwaltung;
|
||||
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.ChoiceBox;
|
||||
import javafx.scene.control.Spinner;
|
||||
import javafx.scene.input.MouseEvent;
|
||||
import javafx.scene.text.Text;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
|
||||
public class InvoiceController {
|
||||
@FXML
|
||||
@@ -14,6 +22,9 @@ public class InvoiceController {
|
||||
@FXML
|
||||
ChoiceBox monatChoiceBox;
|
||||
|
||||
@FXML
|
||||
ChoiceBox childChoiceBox;
|
||||
|
||||
@FXML
|
||||
Spinner jahrSpinner;
|
||||
|
||||
@@ -21,12 +32,35 @@ public class InvoiceController {
|
||||
public void initialize() {
|
||||
monatChoiceBox.setValue(intToMonth(Calendar.getInstance().get(Calendar.MONTH) + 1));
|
||||
jahrSpinner.getValueFactory().setValue(Calendar.getInstance().get(Calendar.YEAR));
|
||||
|
||||
List<Child> childList = AccountMgr.getAllChildren();
|
||||
ObservableList<Object> childOptions = FXCollections.observableArrayList(childList.stream()
|
||||
.map(c -> c.getId() + ": " + c.getFirstname() + " " + c.getName()).toList().toArray(new String[0]));
|
||||
childChoiceBox.setItems(childOptions);
|
||||
}
|
||||
|
||||
@FXML
|
||||
void onRechnungErstellenClick(MouseEvent mouseEvent) {
|
||||
responseText.setText(monatChoiceBox.getValue().toString() + jahrSpinner.getValue());
|
||||
// hier rechnung erstellen
|
||||
if (childChoiceBox.getValue() == null) {
|
||||
Alert alert = new Alert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Es wurde kein Kind ausgewählt");
|
||||
alert.setHeaderText("Bitte wählen sie ein Kind aus");
|
||||
alert.showAndWait();
|
||||
}
|
||||
|
||||
String childId = childChoiceBox.getValue().toString().split(":")[0];
|
||||
String date = String.format("%d-%02d", Integer.parseInt(jahrSpinner.getValue().toString()),
|
||||
monthToInt(monatChoiceBox.getValue().toString()));
|
||||
|
||||
System.out.println("Invoice (" + date + ") from child: " + childId);
|
||||
|
||||
List<String> invoice = AccountMgr.getInvoice(date, childId);
|
||||
|
||||
responseText.setText(invoice.get(invoice.size() - 1));
|
||||
|
||||
// TODO: show invoice
|
||||
Child child = AccountMgr.getChildById(Long.parseLong(childId));
|
||||
exportInvoice("Rechnung_" + date + "_" + childId + "_" + child.getName() +"_" + child.getFirstname(), invoice);
|
||||
}
|
||||
|
||||
private int monthToInt(String month) {
|
||||
@@ -64,4 +98,21 @@ public class InvoiceController {
|
||||
default -> "";
|
||||
};
|
||||
}
|
||||
|
||||
private void exportInvoice(String filename, List<String> invoice) {
|
||||
try {
|
||||
Files.createDirectories(Path.of(Path.of("").toAbsolutePath() + "/Rechnungen"));
|
||||
|
||||
// TODO: save invoice to pdf or word
|
||||
File file = new File(Path.of("").toAbsolutePath() + "/Rechnungen/" + filename + ".txt");
|
||||
if (file.createNewFile()) {
|
||||
System.out.println("File created: " + file.getName());
|
||||
} else {
|
||||
System.out.println("File already exists.");
|
||||
}
|
||||
Files.write(Path.of(file.getAbsolutePath()), invoice);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,37 @@
|
||||
package com.bib.essensbestellungsverwaltung;
|
||||
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.ListView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class OrderHistoryController {
|
||||
public ListView listView;
|
||||
|
||||
@FXML
|
||||
public void initialize() {
|
||||
List<Child> children = AccountMgr.getAllChildrenFromParentWithId(AccountMgr.currentUser.getId());
|
||||
|
||||
List<String> orders = new ArrayList<>();
|
||||
|
||||
for (Child child : children) {
|
||||
List<String> selections = Database.select("food_selection", new String[] { "childid" }, new String[] { String.valueOf(child.getId()) });
|
||||
for (String selection : selections) {
|
||||
String[] selectionParts = selection.split(":");
|
||||
String foodplanid = selectionParts[2];
|
||||
String foodid = selectionParts[3];
|
||||
String foodName = FoodMgr.getFoodById(Long.parseLong(foodid)).getName();
|
||||
String date = FoodMgr.getFoodPlanById(Long.parseLong(foodplanid)).getDate();
|
||||
orders.add(String.format("%s\t %s \t %s", date, child.getFirstname(), foodName));
|
||||
}
|
||||
}
|
||||
|
||||
Collections.sort(orders);
|
||||
Collections.reverse(orders);
|
||||
for(String order : orders){
|
||||
listView.getItems().add(order);
|
||||
}
|
||||
}
|
||||
}
|
@@ -4,21 +4,30 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* one constructor is used to create new parents the other is used to create existing parents from database
|
||||
* one constructor is used to create new parents the other is used to create
|
||||
* existing parents from database
|
||||
*
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
public class Parent extends User{
|
||||
public class Parent extends User {
|
||||
List<Child> children;
|
||||
|
||||
public Parent(long id, String name, String firstname, String password, String email, Address address, 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 Parent(User user) {
|
||||
super(user.getId(), user.getName(), user.getFirstname(), user.getPassword(), user.getEmail(), user.getAddress());
|
||||
this.children = new ArrayList<>();
|
||||
}
|
||||
|
||||
public List<Child> getChildren() {
|
||||
return children;
|
||||
}
|
||||
|
@@ -44,7 +44,7 @@ public class ParentMenuController {
|
||||
@FXML
|
||||
public void onBestellungClick(MouseEvent mouseEvent) {
|
||||
setButtonActive(bestellungButton);
|
||||
changePage("dailyOrder-view.fxml");
|
||||
changePage("orderHistory-view.fxml");
|
||||
}
|
||||
|
||||
@FXML
|
||||
@@ -55,7 +55,8 @@ public class ParentMenuController {
|
||||
|
||||
@FXML
|
||||
public void onAusloggenClick(MouseEvent mouseEvent) throws IOException {
|
||||
StartViewApplication.changeScene("workerMenu-view.fxml");
|
||||
AccountMgr.currentUser = null;
|
||||
StartViewApplication.changeScene("login-view.fxml");
|
||||
}
|
||||
|
||||
private void changePage(String page) {
|
||||
|
@@ -1,11 +1,110 @@
|
||||
/**
|
||||
* @autor: Reshad Meher
|
||||
*/
|
||||
package com.bib.essensbestellungsverwaltung;
|
||||
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.PasswordField;
|
||||
import javafx.scene.control.TextField;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class SingUpController {
|
||||
public void onKontoErstellenBtClick(ActionEvent actionEvent) {
|
||||
@FXML
|
||||
private TextField tfLastName;
|
||||
@FXML
|
||||
private TextField tfFirstName;
|
||||
@FXML
|
||||
private TextField tfEmail;
|
||||
@FXML
|
||||
private PasswordField pfPassword;
|
||||
@FXML
|
||||
private TextField tfPostCode;
|
||||
@FXML
|
||||
private TextField tfCity;
|
||||
|
||||
@FXML
|
||||
private TextField tfStreet;
|
||||
@FXML
|
||||
private TextField tfHouseNumber;
|
||||
@FXML
|
||||
private void onKontoErstellenBtClick(){
|
||||
String lastName = tfLastName.getText();
|
||||
String firstName = tfFirstName.getText();
|
||||
String email = tfEmail.getText();
|
||||
String password = pfPassword.getText();
|
||||
String postCode = tfPostCode.getText();
|
||||
String city = tfCity.getText();
|
||||
String street = tfStreet.getText();
|
||||
String houseNumber = tfHouseNumber.getText();
|
||||
Alert alert;
|
||||
if(lastName.isEmpty() || firstName.isEmpty() || email.isEmpty() || password.isEmpty() || postCode.isEmpty() ||
|
||||
city.isEmpty() || street.isEmpty() || houseNumber.isEmpty()){
|
||||
|
||||
if(lastName.isEmpty()){
|
||||
alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Name' ist leer.");
|
||||
alert.showAndWait();
|
||||
} else if (firstName.isEmpty()) {
|
||||
alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Vorname' ist leer.");
|
||||
alert.showAndWait();
|
||||
} else if (email.isEmpty()) {
|
||||
alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'E-Mail' ist leer.");
|
||||
alert.showAndWait();
|
||||
} else if (password.isEmpty()) {
|
||||
alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Passwort' ist leer.");
|
||||
alert.showAndWait();
|
||||
} else if (postCode.isEmpty()) {
|
||||
alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Postleitzahl' ist leer.");
|
||||
alert.showAndWait();
|
||||
} else if (city.isEmpty()) {
|
||||
alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Stadt' ist leer.");
|
||||
alert.showAndWait();
|
||||
} else if (street.isEmpty()) {
|
||||
alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Straße' ist leer.");
|
||||
alert.showAndWait();
|
||||
}else {
|
||||
alert = new Alert(Alert.AlertType.ERROR," Die Eingabefeld 'Hausnummer' ist leer.");
|
||||
alert.showAndWait();
|
||||
}
|
||||
|
||||
}else {
|
||||
Address newAdresse = new Address(street,houseNumber,postCode,city);
|
||||
User newUser = new User(lastName,firstName,password,email,newAdresse);
|
||||
if(StartViewApplication.firstLaunch){
|
||||
long id = AccountMgr.createWorker(new Worker(newUser));
|
||||
if(id < 1) {
|
||||
Alert a = new Alert(Alert.AlertType.ERROR,"Es ist ein Fehler bei der Erstellung Ihres Accounts aufgetreten.");
|
||||
a.showAndWait();
|
||||
return;
|
||||
}
|
||||
alert = new Alert(Alert.AlertType.CONFIRMATION,"Mitarbeiter Account erfolgreich erstellt");
|
||||
alert.showAndWait();
|
||||
StartViewApplication.firstLaunch = false;
|
||||
}else {
|
||||
long id = AccountMgr.createParent(new Parent(newUser));
|
||||
if(id < 1) {
|
||||
Alert a = new Alert(Alert.AlertType.ERROR,"Es ist ein Fehler bei der Erstellung Ihres Accounts aufgetreten.");
|
||||
a.showAndWait();
|
||||
return;
|
||||
}
|
||||
alert = new Alert(Alert.AlertType.CONFIRMATION,"Eltern Account erfolgreich erstellt");
|
||||
alert.showAndWait();
|
||||
}
|
||||
tfLastName.setText("");
|
||||
tfFirstName.setText("");
|
||||
tfEmail.setText("");
|
||||
pfPassword.setText("");
|
||||
tfPostCode.setText("");
|
||||
tfCity.setText("");
|
||||
tfStreet.setText("");
|
||||
tfHouseNumber.setText("");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void onAnmeldenBtClick(ActionEvent actionEvent) {
|
||||
@FXML
|
||||
private void onAnmeldenBtClick() throws IOException {
|
||||
StartViewApplication.changeScene("login-view.fxml");
|
||||
}
|
||||
}
|
||||
|
@@ -15,10 +15,11 @@ import java.io.IOException;
|
||||
|
||||
public class StartViewApplication extends Application {
|
||||
public static Stage primary;
|
||||
public static boolean firstLaunch;
|
||||
|
||||
@Override
|
||||
public void start(Stage stage) throws IOException {
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(StartViewApplication.class.getResource("login-view.fxml"));
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(StartViewApplication.class.getResource((firstLaunch) ? "signUp-view.fxml" : "login-view.fxml"));
|
||||
Scene scene = new Scene(fxmlLoader.load(), 1300, 750);
|
||||
primary = stage;
|
||||
stage.setTitle("Essen Bestellung im Kindergarten");
|
||||
@@ -29,7 +30,7 @@ public class StartViewApplication extends Application {
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
Database.init();
|
||||
firstLaunch = Database.init();
|
||||
Database.createDb();
|
||||
Database.fillDb();
|
||||
//Database.printSampleQuery();
|
||||
|
@@ -1,14 +1,21 @@
|
||||
package com.bib.essensbestellungsverwaltung;
|
||||
|
||||
/**
|
||||
* one constructor is used to create new worker the other is used to create existing worker from database
|
||||
* one constructor is used to create new worker the other is used to create
|
||||
* existing worker from database
|
||||
*
|
||||
* @author Malte Schulze Hobeling
|
||||
*/
|
||||
public class Worker extends User{
|
||||
public class Worker extends User {
|
||||
public Worker(long id, String name, String firstname, String password, String email, Address address) {
|
||||
super(id, name, firstname, password, email, address);
|
||||
}
|
||||
|
||||
public Worker(String name, String firstname, String password, String email, Address address) {
|
||||
super(name, firstname, password, email, address);
|
||||
}
|
||||
|
||||
public Worker(User user) {
|
||||
super(user.getId(), user.getName(), user.getFirstname(), user.getPassword(), user.getEmail(), user.getAddress());
|
||||
}
|
||||
}
|
||||
|
@@ -12,7 +12,6 @@ import java.io.IOException;
|
||||
public class WorkerMenuController {
|
||||
@FXML
|
||||
public BorderPane contentView;
|
||||
|
||||
@FXML
|
||||
Button tagesbestellungButton;
|
||||
@FXML
|
||||
@@ -28,13 +27,13 @@ public class WorkerMenuController {
|
||||
|
||||
@FXML
|
||||
public void initialize() {
|
||||
changePage("menue-view.fxml");
|
||||
changePage("dailyOrder-view.fxml");
|
||||
setButtonActive(tagesbestellungButton);
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void onTagesbestellungenClick(MouseEvent mouseEvent) {
|
||||
changePage("menue-view.fxml");
|
||||
changePage("dailyOrder-view.fxml");
|
||||
setButtonActive(tagesbestellungButton);
|
||||
}
|
||||
|
||||
@@ -71,7 +70,8 @@ public class WorkerMenuController {
|
||||
|
||||
@FXML
|
||||
public void onAusloggenClick(MouseEvent mouseEvent) throws IOException {
|
||||
StartViewApplication.changeScene("parentMenu-view.fxml");
|
||||
AccountMgr.currentUser = null;
|
||||
StartViewApplication.changeScene("login-view.fxml");
|
||||
}
|
||||
|
||||
private void changePage(String page) {
|
||||
|
@@ -3,6 +3,7 @@ module com.bib.essensbestellungsverwaltung {
|
||||
requires javafx.fxml;
|
||||
requires java.sql;
|
||||
requires org.xerial.sqlitejdbc;
|
||||
requires org.controlsfx.controls;
|
||||
|
||||
|
||||
opens com.bib.essensbestellungsverwaltung to javafx.fxml;
|
||||
|
@@ -4,6 +4,7 @@
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
<?import javafx.scene.text.*?>
|
||||
<?import org.controlsfx.control.*?>
|
||||
|
||||
<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>
|
||||
@@ -90,8 +91,8 @@
|
||||
</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" />
|
||||
<Label prefHeight="25.0" prefWidth="171.0" text="Allergien" />
|
||||
<CheckComboBox fx:id="allergienComboBox" prefHeight="25.0" prefWidth="200.0" />
|
||||
</children>
|
||||
</HBox>
|
||||
<Text fx:id="responseText" fill="RED" strokeType="OUTSIDE" strokeWidth="0.0" textAlignment="CENTER" wrappingWidth="459.13673400878906">
|
||||
@@ -101,7 +102,7 @@
|
||||
</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="btCreateFood" layoutX="484.0" layoutY="481.0" mnemonicParsing="false" onAction="#onHinzufuegen" 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>
|
||||
|
@@ -1,14 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import java.lang.*?>
|
||||
<?import java.util.*?>
|
||||
<?import javafx.scene.*?>
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
<?import javafx.scene.text.*?>
|
||||
|
||||
<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 prefHeight="700.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.DailyOrderController">
|
||||
<children>
|
||||
<HBox alignment="CENTER" layoutX="58.0" layoutY="221.0" prefHeight="349.0" prefWidth="683.0">
|
||||
<children>
|
||||
<ListView fx:id="listView" prefHeight="349.0" prefWidth="300.0" />
|
||||
</children>
|
||||
</HBox>
|
||||
<Text layoutX="88.0" layoutY="68.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Tagesbestellung">
|
||||
<font>
|
||||
<Font name="System Bold" size="25.0" />
|
||||
</font>
|
||||
</Text>
|
||||
<DatePicker fx:id="datePicker" layoutX="88.0" layoutY="142.0" onAction="#onChangeDate" />
|
||||
<Label layoutX="88.0" layoutY="121.0" text="Datum" />
|
||||
<Button fx:id="sendButton" layoutX="374.0" layoutY="617.0" mnemonicParsing="false" onAction="#onSendButton" text="Bestellung senden" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
|
@@ -17,14 +17,10 @@
|
||||
</font></Text>
|
||||
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="122.0" spacing="20.0">
|
||||
<children>
|
||||
<VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0">
|
||||
<VBox alignment="CENTER" layoutX="150.0" layoutY="10.0" 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>
|
||||
<Label text="Kind" />
|
||||
<ChoiceBox fx:id="childChoiceBox"></ChoiceBox>
|
||||
</children>
|
||||
</VBox>
|
||||
<VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0">
|
||||
@@ -50,6 +46,16 @@
|
||||
</ChoiceBox>
|
||||
</children>
|
||||
</VBox>
|
||||
<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>
|
||||
</children>
|
||||
</HBox>
|
||||
<Button mnemonicParsing="false" onMouseClicked="#onRechnungErstellenClick" text="Rechnung erstellen" />
|
||||
|
@@ -30,4 +30,7 @@
|
||||
.btFood.active{
|
||||
-fx-background-color: rgba(97, 97, 232, 0.3);
|
||||
-fx-background-radius: 25;
|
||||
}
|
||||
.sidebar-nav_button.active {
|
||||
-fx-background-color: #4e92b4;
|
||||
}
|
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
<?import javafx.scene.text.*?>
|
||||
|
||||
|
||||
<AnchorPane prefHeight="700.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.OrderHistoryController">
|
||||
<children>
|
||||
<Text layoutX="91.0" layoutY="84.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Bestellungen">
|
||||
<font>
|
||||
<Font name="System Bold" size="25.0" />
|
||||
</font>
|
||||
</Text>
|
||||
<ListView fx:id="listView" layoutX="91.0" layoutY="135.0" prefHeight="428.0" prefWidth="499.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
@@ -29,72 +29,109 @@
|
||||
<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;">
|
||||
<VBox layoutX="262.0" prefHeight="400.0" prefWidth="364.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>
|
||||
<TextField fx:id="tfLastName" alignment="TOP_LEFT" prefHeight="26.0" prefWidth="282.0" promptText="Name" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
|
||||
<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 fx:id="tfFirstName" promptText="Vorname" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
|
||||
<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 fx:id="tfEmail" promptText="Email" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
|
||||
<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 fx:id="pfPassword" accessibleRole="TEXT_FIELD" promptText="Passwort" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
|
||||
<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 prefHeight="100.0" prefWidth="200.0">
|
||||
<children>
|
||||
<TextField fx:id="tfPostCode" prefHeight="35.0" prefWidth="92.0" promptText="PLZ" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
|
||||
<HBox.margin>
|
||||
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
||||
</HBox.margin>
|
||||
<font>
|
||||
<Font name="Microsoft Tai Le Bold" size="12.0" />
|
||||
</font>
|
||||
</TextField>
|
||||
<TextField fx:id="tfCity" prefHeight="35.0" prefWidth="182.0" promptText="Stadt" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
|
||||
<HBox.margin>
|
||||
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
||||
</HBox.margin>
|
||||
<font>
|
||||
<Font name="Microsoft Tai Le Bold" size="12.0" />
|
||||
</font>
|
||||
</TextField>
|
||||
</children>
|
||||
</HBox>
|
||||
<HBox prefHeight="100.0" prefWidth="200.0">
|
||||
<children>
|
||||
<TextField fx:id="tfStreet" prefHeight="27.0" prefWidth="134.0" promptText="Straße" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
|
||||
<HBox.margin>
|
||||
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
||||
</HBox.margin>
|
||||
<font>
|
||||
<Font name="Microsoft Tai Le Bold" size="12.0" />
|
||||
</font>
|
||||
</TextField>
|
||||
<TextField fx:id="tfHouseNumber" prefHeight="27.0" prefWidth="99.0" promptText="Hausnummer" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
|
||||
<HBox.margin>
|
||||
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
||||
</HBox.margin>
|
||||
<font>
|
||||
<Font name="Microsoft Tai Le Bold" size="12.0" />
|
||||
</font>
|
||||
</TextField>
|
||||
</children>
|
||||
</HBox>
|
||||
<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">
|
||||
<Button mnemonicParsing="false" onAction="#onKontoErstellenBtClick" prefHeight="25.0" prefWidth="106.0" style="-fx-background-radius: 25; -fx-background-color: lightblue;" text="Konto erstellen" textFill="WHITE">
|
||||
<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"/>
|
||||
<Button id="btSignUp" mnemonicParsing="false" onAction="#onAnmeldenBtClick" prefHeight="25.0" prefWidth="101.0" style="-fx-background-color: tranparent;" text="Anmelden" textFill="#7c7b7b" underline="true" />
|
||||
</children>
|
||||
<opaqueInsets>
|
||||
<Insets top="15.0" />
|
||||
</opaqueInsets>
|
||||
<VBox.margin>
|
||||
<Insets top="15.0" />
|
||||
</VBox.margin>
|
||||
<opaqueInsets>
|
||||
<Insets top="15.0" />
|
||||
</opaqueInsets>
|
||||
<VBox.margin>
|
||||
<Insets top="15.0" />
|
||||
</VBox.margin>
|
||||
</HBox>
|
||||
</children>
|
||||
<padding>
|
||||
|
@@ -1,129 +1,113 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.geometry.*?>
|
||||
<?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">
|
||||
|
||||
<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">
|
||||
<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">
|
||||
<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 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 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">
|
||||
<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 size="20.0" />
|
||||
</font>
|
||||
<graphic>
|
||||
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
|
||||
<image>
|
||||
<Image url="@pics/spreadsheet.png"/>
|
||||
<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">
|
||||
<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 size="20.0" />
|
||||
</font>
|
||||
<graphic>
|
||||
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
|
||||
<image>
|
||||
<Image url="@pics/calendar.png"/>
|
||||
<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">
|
||||
<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 size="20.0" />
|
||||
</font>
|
||||
<graphic>
|
||||
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
|
||||
<image>
|
||||
<Image url="@pics/lunch.png"/>
|
||||
<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">
|
||||
<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 size="20.0" />
|
||||
</font>
|
||||
<graphic>
|
||||
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
|
||||
<image>
|
||||
<Image url="@pics/teamwork.png"/>
|
||||
<Image url="@pics/teamwork.png" />
|
||||
</image>
|
||||
</ImageView>
|
||||
</graphic>
|
||||
</Button>
|
||||
<Region style="-fx-padding: 20;" VBox.vgrow="ALWAYS">
|
||||
<opaqueInsets>
|
||||
<Insets/>
|
||||
<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">
|
||||
<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 size="20.0" />
|
||||
</font>
|
||||
<graphic>
|
||||
<ImageView fitHeight="35.0" fitWidth="35.0" pickOnBounds="true" preserveRatio="true">
|
||||
<image>
|
||||
<Image url="@pics/setting.png"/>
|
||||
<Image url="@pics/setting.png" />
|
||||
</image>
|
||||
</ImageView>
|
||||
</graphic>
|
||||
</Button>
|
||||
</children>
|
||||
<opaqueInsets>
|
||||
<Insets/>
|
||||
<Insets />
|
||||
</opaqueInsets>
|
||||
</VBox>
|
||||
</left>
|
||||
<top>
|
||||
<HBox alignment="CENTER_RIGHT" prefHeight="50.0" prefWidth="1200.0" style="-fx-background-color: #69b6ff;"
|
||||
BorderPane.alignment="CENTER">
|
||||
<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">
|
||||
<Button mnemonicParsing="false" onMouseClicked="#onAusloggenClick" styleClass="sidebar-nav_button" text="Ausloggen">
|
||||
<opaqueInsets>
|
||||
<Insets/>
|
||||
<Insets />
|
||||
</opaqueInsets>
|
||||
</Button>
|
||||
</children>
|
||||
<padding>
|
||||
<Insets right="20.0"/>
|
||||
<Insets right="20.0" />
|
||||
</padding>
|
||||
</HBox>
|
||||
</top>
|
||||
<center>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"/>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
|
||||
</center>
|
||||
</BorderPane>
|
||||
|
Reference in New Issue
Block a user