import java.util.*; import java.io.*; class SystemController { private Scanner scanner = new Scanner(System.in); private Map users = new HashMap<>(); private final String USERS_FILE = "src/users.txt"; public static Inventory inventory; private Menu menu = new Menu(); private FinancialManager financialManager = new FinancialManager(); private ReservationManager reservationManager = new ReservationManager(); private List shifts = new ArrayList<>(); private List absences = new ArrayList<>(); private List feedbacks = new ArrayList<>(); private final String SHIFT_FILE = "src/shifts.txt"; private final String ABSENCE_FILE = "src/absences.txt"; private final String FEEDBACK_FILE = "src/feedback.txt"; public SystemController() { loadUsersFromFile(); loadShiftsFromFile(); loadAbsencesFromFile(); loadFeedbacksFromFile(); inventory = new Inventory(financialManager); } public void startSystem() { System.out.println("Willkommen im Restaurant Management System!"); System.out.println("Bitte loggen Sie sich ein: "); System.out.print("Username ---------------> "); String username = scanner.nextLine(); System.out.print("Passwort ---------------> "); String password = scanner.nextLine(); User user = authenticate(username, password); if (user != null) { displayMainMenu(user); } else { System.out.println("Ungültige Anmeldedaten."); } } private User authenticate(String username, String password) { if (users.containsKey(username) && users.get(username).password.equals(password)) { return users.get(username); } return null; } public void displayMainMenu(User user) { boolean running = true; while (running) { System.out.println("\n--- Hauptmenü ---"); System.out.println("1. Bestand verwalten"); System.out.println("2. Neuer Nutzer erstellen"); System.out.println("3. Menü anzeigen"); System.out.println("4. Bestellungen verwalten"); System.out.println("5. Finanzbericht anzeigen"); System.out.println("6. Reservierungen verwalten"); System.out.println("7. Mitarbeiter verwalten"); System.out.println("8. Beenden"); System.out.print("Bitte wähle eine Option: "); int choice = scanner.nextInt(); scanner.nextLine(); switch (choice) { case 1 -> manageInventory(); case 2 -> { if (user.role == Role.MANAGER) { createUser(); } else { System.out.println("Keine Rechte, um neue Nutzer zu erstellen."); } } case 3 -> menu.displayMenu(inventory); case 4 -> manageOrders(); case 5 -> { if (user.role == Role.MANAGER) { displayFinancialReport(); } else { System.out.println("Keine Rechte, um neue Nutzer zu erstellen."); } } case 6 -> manageReservations(user); case 7 -> manageEmployees(user); case 8 -> { running = false; System.out.println("System wird beendet. Auf Wiedersehen!"); } default -> System.out.println("Ungültige Auswahl. Bitte versuche es erneut."); } } } private void updateFinancialReport(List orderedDishes) { // Prüfen, ob die Liste der bestellten Gerichte leer ist if (orderedDishes.isEmpty()) { System.out.println("Keine Bestellung aufgegeben. Kein Preis berechnet."); return; // Wenn keine Gerichte bestellt wurden, wird der Vorgang abgebrochen } double totalAmount = 0; // Berechnung des Gesamtbetrags für die bestellten Gerichte for (Dish dish : orderedDishes) { totalAmount += dish.getPrice(); // Gesamtbetrag basierend auf den Preisen der bestellten Gerichte } // Einnahmen im Finanzmanager hinzufügen financialManager.addRevenue(totalAmount); System.out.println("Gesamtkosten der Bestellung: " + totalAmount + " €"); } private void manageReservations(User user) { boolean managingReservations = true; while (managingReservations) { System.out.println("\n--- Reservierungen verwalten ---"); System.out.println("1. Reservierung erstellen"); System.out.println("2. Reservierung bearbeiten"); System.out.println("3. Reservierung stornieren"); System.out.println("4. Reservierungen anzeigen"); System.out.println("5. Zurück zum Hauptmenü"); System.out.print("Bitte wähle eine Option: "); int choice = scanner.nextInt(); scanner.nextLine(); switch (choice) { case 1 -> { if (user.role == Role.MANAGER || user.role == Role.SERVICE) { createReservation(); } else { System.out.println("Keine Rechte, um neue Reservierungen zu erstellen."); } } case 2 -> { if (user.role == Role.MANAGER || user.role == Role.SERVICE) { editReservation(); } else { System.out.println("Keine Rechte, um Reservierungen zu bearbeiten."); } } case 3 -> { if (user.role == Role.MANAGER || user.role == Role.SERVICE) { cancelReservation(); } else { System.out.println("Keine Rechte, um Reservierungen zu stornieren."); } } case 4 -> reservationManager.displayTableOverview(); case 5 -> managingReservations = false; default -> System.out.println("Ungültige Auswahl. Bitte versuche es erneut."); } } } private void createReservation() { System.out.print("Tischnummer: "); int tableNumber = scanner.nextInt(); scanner.nextLine(); System.out.print("Kundenname: "); String customerName = scanner.nextLine(); reservationManager.createReservation(tableNumber, customerName); } private void editReservation() { System.out.print("Tischnummer der Reservierung: "); int tableNumber = scanner.nextInt(); scanner.nextLine(); System.out.print("Neuer Kundenname: "); String newCustomerName = scanner.nextLine(); reservationManager.editReservation(tableNumber, newCustomerName); } private void cancelReservation() { System.out.print("Tischnummer der Reservierung: "); int tableNumber = scanner.nextInt(); reservationManager.cancelReservation(tableNumber); } private void manageInventory() { boolean managingInventory = true; while (managingInventory) { inventory.loadStockFromFile(); System.out.println("\n--- Bestand verwalten ---"); System.out.println("1. Bestand ansehen"); System.out.println("2. Bestand ändern"); System.out.println("3. Bestand erweitern"); System.out.println("4. Zurück zum Hauptmenü"); System.out.print("Bitte wähle eine Option: "); int choice = scanner.nextInt(); scanner.nextLine(); // Eingabepuffer leeren switch (choice) { case 1 -> inventory.viewStock(); // Bestand ansehen case 2 -> { System.out.println("Welchen Bestand möchten Sie ändern?"); String name = scanner.nextLine(); System.out.println("Neue Anzahl ---->"); try { int anzahl = scanner.nextInt(); inventory.overwriteStock(name, anzahl); // Bestellungen im Speicher anzeigen inventory.saveStockToFile(); // Echtzeitspeicherung der Daten } catch (IllegalArgumentException e) { System.out.println("Fehler! Überprüfen Sie Ihre Eingabe"); } } case 3 -> { System.out.println("Bestand wird erweitert....."); System.out.println("Name des Produkts: "); String name = scanner.nextLine(); System.out.println("Anzahl :"); try { int anzahl = scanner.nextInt(); inventory.addIngredients(name, anzahl, financialManager); // Bestellungen im Speicher anzeigen inventory.saveStockToFile(); // Echtzeitspeicherung der Daten } catch (IllegalArgumentException e) { System.out.println("Fehler! Überprüfen Sie Ihre Eingabe"); } } case 4 -> managingInventory = false; default -> System.out.println("Ungültige Auswahl. Bitte versuche es erneut."); } } } private void manageOrders() { boolean managingOrders = true; while (managingOrders) { System.out.println("\n--- Bestellungen verwalten ---"); System.out.println("1. Bestellung aufnehmen"); System.out.println("2. Alle Bestellungen anzeigen"); System.out.println("3. Bestellungen löschen"); System.out.println("4. Zurück zum Hauptmenü"); System.out.print("Bitte wähle eine Option: "); int choice = scanner.nextInt(); scanner.nextLine(); // Eingabepuffer leeren switch (choice) { case 1 -> { menu.displayMenu(inventory); Bestellsystem.erstelleBestellung(); // Neue Bestellung erstellen } case 2 -> { Bestellsystem.ladeUndZeigeBestellungen(); // Bestellungen aus Datei anzeigen } case 3 -> { Bestellsystem.loescheBestellung(); // Bestellungen aus Datei löschen } case 4 -> managingOrders = false; default -> System.out.println("Ungültige Auswahl. Bitte versuche es erneut."); } } } public void manageEmployees(User user) { boolean managingEmployees = true; while (managingEmployees) { System.out.println("\n--- Mitarbeiter verwalten ---"); System.out.println("1. Schichtplan anzeigen"); System.out.println("2. Abwesenheit eintragen"); System.out.println("3. Abwesenheit anzeigen"); System.out.println("4. Feedback geben"); System.out.println("5. Feedback anzeigen"); System.out.println("6. Zurück zum Hauptmenü"); System.out.print("Bitte wähle eine Option: "); int choice = scanner.nextInt(); scanner.nextLine(); // Eingabepuffer leeren switch (choice) { case 1 -> showShiftPlan(user.username); // Schichtplan für den eingeloggten Mitarbeiter anzeigen case 2 -> { if (user.role == Role.MANAGER) { createAbsence(user.username); // Abwesenheit für Mitarbeiter erstellen } else { System.out.println("Keine Rechte, um neue Nutzer zu erstellen."); } } case 3 -> { if (user.role == Role.MANAGER) { showAbsences(); // Abwesenheiten zeigen } else { System.out.println("Keine Rechte, um neue Nutzer zu erstellen."); } } case 4 -> giveFeedback(); // Feedback geben case 5 -> { if (user.role == Role.MANAGER) { showFeedback(); // Feedbacks zeigen } else { System.out.println("Keine Rechte, um neue Nutzer zu erstellen."); } } case 6 -> managingEmployees = false; // Zurück zum Hauptmenü default -> System.out.println("Ungültige Auswahl. Bitte versuche es erneut."); } } } private void createUser() { String username = ""; String password = ""; Role role = null; try { System.out.println("\n--- Neuen Nutzer erstellen ---"); System.out.print("Benutzername: "); username = scanner.nextLine(); System.out.print("Passwort: "); password = scanner.nextLine(); System.out.print("Rolle (MANAGER, SERVICE, KITCHEN): "); role = Role.valueOf(scanner.nextLine().toUpperCase()); } catch (IllegalArgumentException d) { System.out.println("Fehler beim Erstellen eines Accounts. Überprüfen Sie Ihre Eingaben."); } catch (NullPointerException c) { System.out.println("Fehler beim Erstellen eines Accounts. Überprüfen Sie Ihre Eingaben."); } try { User newUser = new User(username, password, role); users.put(username, newUser); saveUserToFile(newUser); System.out.println("Nutzer erfolgreich erstellt."); } catch (NullPointerException c) { System.out.println("Fehler beim Erstellen eines Accounts."); } } private void loadUsersFromFile() { try (BufferedReader reader = new BufferedReader(new FileReader(USERS_FILE))) { String line; while ((line = reader.readLine()) != null) { String[] parts = line.split(":"); if (parts.length == 3) { String username = parts[0]; String password = parts[1]; Role role = Role.valueOf(parts[2].toUpperCase()); users.put(username, new User(username, password, role)); } } } catch (FileNotFoundException e) { System.out.println("Benutzerdatenbank nicht gefunden. Standard-Manager wird erstellt."); createDefaultManager(); } catch (IOException e) { System.out.println("Fehler beim Lesen der Benutzerdatenbank: " + e.getMessage()); } } private void loadShiftsFromFile() { try (BufferedReader reader = new BufferedReader(new FileReader("src/shifts.txt"))) { String line; while ((line = reader.readLine()) != null) { String[] parts = line.split(";"); String username = parts[0]; String shiftDate = parts[1]; String shiftTime = parts[2]; // Erstelle neuen Shift-Objekt und füge es der Liste hinzu Shift shift = new Shift(username, shiftDate, shiftTime); shifts.add(shift); } } catch (IOException e) { System.out.println("Fehler beim Laden der Schichtpläne: " + e.getMessage()); } } private void loadAbsencesFromFile() { try (BufferedReader reader = new BufferedReader(new FileReader("src/absences.txt"))) { String line; while ((line = reader.readLine()) != null) { String[] parts = line.split(";"); String username = parts[0]; String date = parts[1]; String reason = parts[2]; // Erstelle neues Absence-Objekt und füge es der Liste hinzu Absence absence = new Absence(username, date, reason); absences.add(absence); } } catch (IOException e) { System.out.println("Fehler beim Laden der Abwesenheiten: " + e.getMessage()); } } private void loadFeedbacksFromFile() { try (BufferedReader reader = new BufferedReader(new FileReader("src/feedback.txt"))) { String line; while ((line = reader.readLine()) != null) { String[] parts = line.split(";"); String username = parts[0]; String feedback = parts[1]; // Erstelle neues Feedback-Objekt und füge es der Liste hinzu Feedback feedbackObj = new Feedback(username, feedback); feedbacks.add(feedbackObj); } } catch (IOException e) { System.out.println("Fehler beim Laden der Feedbacks: " + e.getMessage()); } } public void showShiftPlan(String username) { System.out.println("\n--- Dein Schichtplan ---"); for (Shift shift : shifts) { if (shift.getUsername().equals(username)) { System.out.println(shift); } } } public void createAbsence(String username) { System.out.println("Gib Den Namen des Mitarbeiters ein:"); String name = scanner.nextLine(); System.out.print("Gib das Datum der Abwesenheit ein: "); String date = scanner.nextLine(); System.out.print("Gib den Grund der Abwesenheit ein: "); String reason = scanner.nextLine(); Absence absence = new Absence(name, date, reason); absences.add(absence); saveAbsencesToFile(); System.out.println("Abwesenheit wurde erfolgreich eingetragen."); } public void saveShiftToFile(String shift) { try (BufferedWriter writer = new BufferedWriter(new FileWriter("src/shifts.txt", true))) { writer.write(shift); // Schicht als String speichern writer.newLine(); } catch (IOException e) { System.out.println("Fehler beim Speichern der Schicht: " + e.getMessage()); } } public void showAbsences() { System.out.println("\n--- Abwesenheiten ---"); for (Absence absence : absences) { System.out.println(absence); } } public void giveFeedback() { System.out.print("Gib den Benutzernamen des Mitarbeiters ein: "); String employeeUsername = scanner.nextLine(); System.out.print("Gib das Feedback ein: "); String feedbackText = scanner.nextLine(); Feedback feedback = new Feedback(employeeUsername, feedbackText); feedbacks.add(feedback); saveFeedbackToFile(); System.out.println("Feedback wurde erfolgreich gespeichert."); } public void showFeedback() { if (feedbacks.isEmpty()) { System.out.println("Keine Feedbacks vorhanden."); } else { System.out.println("\n--- Feedbacks ---"); for (Feedback feedback : feedbacks) { System.out.println(feedback.toString()); } } } private void saveAbsencesToFile() { try (BufferedWriter writer = new BufferedWriter(new FileWriter(ABSENCE_FILE, false))) { for (Absence absence : absences) { writer.write(absence.toFileFormat()); writer.newLine(); } } catch (IOException e) { System.out.println("Fehler beim Speichern der Abwesenheiten: " + e.getMessage()); } } private void saveFeedbackToFile() { try (BufferedWriter writer = new BufferedWriter(new FileWriter(FEEDBACK_FILE, false))) { for (Feedback feedback : feedbacks) { writer.write(feedback.toFileFormat()); writer.newLine(); } } catch (IOException e) { System.out.println("Fehler beim Speichern des Feedbacks: " + e.getMessage()); } } private void saveUserToFile(User user) { try (BufferedWriter writer = new BufferedWriter(new FileWriter(USERS_FILE, true))) { writer.write(user.username + ":" + user.password + ":" + user.role.name()); writer.newLine(); } catch (IOException e) { System.out.println("Fehler beim Speichern des Nutzers: " + e.getMessage()); } } private void createDefaultManager() { User defaultManager = new User("Dimitry", "1234", Role.MANAGER); users.put("Dimitry", defaultManager); saveUserToFile(defaultManager); } private void displayFinancialReport() { boolean viewingReport = true; while (viewingReport) { System.out.println("\n--- Finanzbericht ---"); System.out.println("1. Tägliche Einnahmen anzeigen"); System.out.println("2. Wöchentliche Einnahmen anzeigen"); System.out.println("3. Monatliche Einnahmen anzeigen"); System.out.println("4. Gesamte Einnahmen anzeigen"); System.out.println("5. Finanzbericht aus Datei anzeigen"); System.out.println("6. Zurück zum Hauptmenü"); System.out.print("Bitte wähle eine Option: "); int choice = scanner.nextInt(); scanner.nextLine(); // Eingabepuffer leeren switch (choice) { case 1 -> { double dailyRevenue = financialManager.getRevenueForPeriod("daily"); System.out.println("Tägliche Einnahmen: " + dailyRevenue + " €"); } case 2 -> { double weeklyRevenue = financialManager.getRevenueForPeriod("weekly"); System.out.println("Wöchentliche Einnahmen: " + weeklyRevenue + " €"); } case 3 -> { double monthlyRevenue = financialManager.getRevenueForPeriod("monthly"); System.out.println("Monatliche Einnahmen: " + monthlyRevenue + " €"); } case 4 -> { double totalRevenue = financialManager.getTotalRevenue(); System.out.println("Gesamte Einnahmen: " + totalRevenue + " €"); } case 5 -> { displayFinancialReportFromFile(); // Finanzbericht aus Datei anzeigen } case 6 -> viewingReport = false; // Zurück zum Hauptmenü default -> System.out.println("Ungültige Auswahl. Bitte versuche es erneut."); } } } private void displayFinancialReportFromFile() { try (BufferedReader reader = new BufferedReader(new FileReader("src/financial_report.txt"))) { String line; System.out.println("\n--- Finanzbericht aus Datei ---"); while ((line = reader.readLine()) != null) { System.out.println(line); // Jede Zeile des Berichts anzeigen } } catch (IOException e) { System.out.println("Fehler beim Lesen des Finanzberichts aus der Datei: " + e.getMessage()); } } }