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) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 pbs2h21asc
					pbs2h21asc