From 47f9285f37ed4aeeaeea3aa62f07d9b8ca269e5c Mon Sep 17 00:00:00 2001 From: Safak Date: Fri, 6 Dec 2024 13:27:33 +0100 Subject: [PATCH 1/5] Added functions & test cases: deleteAccount and getAllAccounts --- src/main/java/bank/Bank.java | 15 +++++++ src/main/java/bank/PrivateBank.java | 43 ++++++++++++++++++++ src/test/java/PrivateBankTest.java | 63 +++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+) diff --git a/src/main/java/bank/Bank.java b/src/main/java/bank/Bank.java index 03366bf..fa16b72 100644 --- a/src/main/java/bank/Bank.java +++ b/src/main/java/bank/Bank.java @@ -97,4 +97,19 @@ public interface Bank { * @return the list of all transactions by type */ List getTransactionsByType(String account, boolean positive); + + + /** + * Delets an existing account + * @param account the account to be deleted + * @throws AccountDoesNotExistException + * @throws IOException + */ + void deleteAccount(String account) throws AccountDoesNotExistException, IOException; + + /** + * Returns a list of all account names + * @return + */ + List getAllAccounts(); } diff --git a/src/main/java/bank/PrivateBank.java b/src/main/java/bank/PrivateBank.java index a9bedbb..5a435c1 100644 --- a/src/main/java/bank/PrivateBank.java +++ b/src/main/java/bank/PrivateBank.java @@ -354,6 +354,47 @@ public class PrivateBank implements Bank, JsonSerializer, JsonDeser return transactions; } + /** + * Delets an existing account + * + * @param account the account to be deleted + * @throws AccountDoesNotExistException + * @throws IOException + */ + @Override + public void deleteAccount(String account) throws AccountDoesNotExistException, IOException { + if (this.containsAccount(account)) { + // delete account + this.accountsToTransactions.remove(account); + + // delete corresponding JSON file + String filename = directoryName + "/" + account + ".json"; + File file = new File(filename); + if (!file.delete()) + throw new IOException(); + } else { + throw new AccountDoesNotExistException(); + } + } + + /** + * Returns a list of all account names + * + * @return List of all accounts + */ + @Override + public List getAllAccounts() { + List accounts = new ArrayList<>(); + + this.accountsToTransactions.forEach( + (account, transactions) -> { + accounts.add(account); + } + ); + + return accounts; + } + /** * Import Accounts from existing JSON Files * @@ -499,4 +540,6 @@ public class PrivateBank implements Bank, JsonSerializer, JsonDeser return rootObject; } + + } diff --git a/src/test/java/PrivateBankTest.java b/src/test/java/PrivateBankTest.java index 6bc19ee..4bc1e8d 100644 --- a/src/test/java/PrivateBankTest.java +++ b/src/test/java/PrivateBankTest.java @@ -429,4 +429,67 @@ public class PrivateBankTest { AccountAlreadyExistsException.class, () -> privateBank.readAccounts() ); } + + + @DisplayName("Delete existing account") + @Order(20) + @Test + public void testDeleteExistingAccount() { + assertDoesNotThrow( + () -> privateBank.createAccount( + "Konto_X", + List.of( + new OutgoingTransfer( + "01.01.2000", + 100, + "OutgoingTransfer to Hans", + "Konto_X", + "Hans" + ), + new IncomingTransfer( + "01.01.2000", + 100, + "IncomingTransfer from Hans", + "Hans", + "Konto_X" + ), + new IncomingTransfer( + "01.01.2000", + 300, + "IncomingTransfer from Tom", + "Tom", + "Konto_X" + ) + + ) + ) + ); + + assertDoesNotThrow( + () -> privateBank.writeAccount("Konto_X") + ); + + assertTrue( + () -> privateBank.containsAccount("Konto_X") + ); + + assertDoesNotThrow( + () -> privateBank.deleteAccount("Konto_X") + ); + + assertFalse( + () -> privateBank.containsAccount("Konto_X") + ); + + } + + @DisplayName("Delete non existing account") + @Order(21) + @Test + public void testDeleteNonExistingAccount() { + assertThrows( + AccountDoesNotExistException.class, () -> privateBank.deleteAccount("Konto_X") + ); + } + } From ed73c8e8764cabc7d212c4ec0b04dda042f5245d Mon Sep 17 00:00:00 2001 From: Safak Date: Sat, 7 Dec 2024 01:29:34 +0100 Subject: [PATCH 2/5] Zwischenstand Views --- pom.xml | 28 +++-- src/main/java/ui/AccountviewController.java | 98 +++++++++++++++ src/main/java/ui/MainviewController.java | 129 ++++++++++++++++++++ src/main/java/ui/main.java | 20 +++ src/main/resources/Accountview.fxml | 36 ++++++ src/main/resources/Mainview.fxml | 26 ++++ src/test/java/PrivateBankTest.java | 12 ++ 7 files changed, 342 insertions(+), 7 deletions(-) create mode 100644 src/main/java/ui/AccountviewController.java create mode 100644 src/main/java/ui/MainviewController.java create mode 100644 src/main/java/ui/main.java create mode 100644 src/main/resources/Accountview.fxml create mode 100644 src/main/resources/Mainview.fxml diff --git a/pom.xml b/pom.xml index 1527790..581e61e 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ - P4 + P5 de.fh_aachen.oos 4.0.0 1.0-SNAPSHOT @@ -12,12 +12,6 @@ maven-compiler-plugin org.apache.maven.plugins - - - --release - 17 - - 3.13.0 @@ -25,6 +19,14 @@ org.apache.maven.plugins 3.2.5 + + javafx-maven-plugin + org.openjfx + ${javafx.maven.plugin.version} + + ui.main + + @@ -39,6 +41,16 @@ com.google.code.gson 2.11.0 + + javafx-controls + org.openjfx + ${javafx.version} + + + javafx-fxml + org.openjfx + ${javafx.version} + @@ -55,6 +67,8 @@ 17 + 22 + 0.0.8 UTF-8 \ No newline at end of file diff --git a/src/main/java/ui/AccountviewController.java b/src/main/java/ui/AccountviewController.java new file mode 100644 index 0000000..098893b --- /dev/null +++ b/src/main/java/ui/AccountviewController.java @@ -0,0 +1,98 @@ +package ui; + +import bank.PrivateBank; +import bank.Transaction; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.control.*; +import javafx.stage.Stage; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class AccountviewController { + + @FXML + private Label accountNameLabel; + + @FXML + private Label balanceLabel; + + @FXML + private ListView transactionListView; + + private PrivateBank privateBank; + private String currentAccount; + + public void setAccount(String accountName, PrivateBank bank) { + this.currentAccount = accountName; + this.privateBank = bank; + updateAccountInfo(); + loadTransactions(); + } + + private void updateAccountInfo() { + accountNameLabel.setText("Account: " + currentAccount); + double balance = privateBank.getAccountBalance(currentAccount); + //balanceLabel.setText("Balance: " + balance); + } + + private void loadTransactions() { + var transactions = privateBank.getTransactions(currentAccount); + showTransactions(transactions); + } + + @FXML + private void onBackButtonClicked() { + try { + FXMLLoader loader = new FXMLLoader(getClass().getResource("/main.fxml")); + Parent root = loader.load(); + + Stage stage = (Stage) transactionListView.getScene().getWindow(); + stage.getScene().setRoot(root); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @FXML + private void onSortAscending() { + var sortedTransactions = privateBank.getTransactionsSorted(currentAccount, true); + showTransactions(sortedTransactions); + } + + @FXML + private void onSortDescending() { + var sortedTransactions = privateBank.getTransactionsSorted(currentAccount, false); + showTransactions(sortedTransactions); + } + + @FXML + private void onShowPositive() { + var positive = privateBank.getTransactionsByType(currentAccount, true); + showTransactions(positive); + } + + @FXML + private void onShowNegative() { + var negative = privateBank.getTransactionsByType(currentAccount, false); + showTransactions(negative); + } + + @FXML + private void onShowAll() { + var all = privateBank.getTransactions(currentAccount); + showTransactions(all); + } + + private void showTransactions(List transactions) { + List displayList = new ArrayList<>(); + for (var t : transactions) { + displayList.add(t.toString()); + } + // transactionListView.getItems().setAll(displayList); + updateAccountInfo(); // Balance neu anzeigen, falls sich was geändert hat + } +} diff --git a/src/main/java/ui/MainviewController.java b/src/main/java/ui/MainviewController.java new file mode 100644 index 0000000..5e32a88 --- /dev/null +++ b/src/main/java/ui/MainviewController.java @@ -0,0 +1,129 @@ +package ui; + +import bank.PrivateBank; + +import javafx.fxml.*; +import javafx.scene.Parent; +import javafx.scene.control.*; +import javafx.scene.input.MouseButton; +import javafx.stage.Stage; + +import java.util.List; +import java.util.Optional; + + +public class MainviewController { + + @FXML + private ListView accountListView; + + private PrivateBank privateBank; // Referenz auf Ihr Bankobjekt + + public void initialize() { + // Bank initialisieren oder übergeben lassen + this.privateBank = new PrivateBank( + "Bank1", + 0, + 0, + "accountdata" + ); + + List accounts = List.of( + "Konto1", "Konto2", "Konto3" + ); + + for (String account : accounts) { + try { + privateBank.createAccount(account); + privateBank.writeAccount(account); + } catch (Exception e) { + } + } + + accountListView.getItems().addAll(privateBank.getAllAccounts()); + + // Kontextmenü definieren + ContextMenu contextMenu = new ContextMenu(); + MenuItem selectItem = new MenuItem("Auswählen"); + MenuItem deleteItem = new MenuItem("Löschen"); + + // Aktionen definieren + selectItem.setOnAction(event -> { + String selectedAccount = accountListView.getSelectionModel().getSelectedItem(); + if (selectedAccount != null) { + switchToAccountView(selectedAccount); + } + }); + + deleteItem.setOnAction( + event -> { + String selectedAccount = accountListView.getSelectionModel().getSelectedItem(); + if (selectedAccount != null) { + boolean confirmed = showDeleteConfirmation(selectedAccount); + if (confirmed) { + // Account aus der Bank entfernen + try { + privateBank.deleteAccount(selectedAccount); + // ListView aktualisieren + accountListView.getItems().remove(selectedAccount); + } catch (Exception e) { + e.printStackTrace(); + // Fehlerbehandlung falls nötig + } + } + } + }); + + contextMenu.getItems().addAll(selectItem, deleteItem); + + // Kontextmenü an die ListView binden + accountListView.setContextMenu(contextMenu); + + // Optional: Double-Click zum Auswählen ohne Kontextmenü + accountListView.setOnMouseClicked( + event -> { + if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) { + String selectedAccount = accountListView.getSelectionModel().getSelectedItem(); + if (selectedAccount != null) { + switchToAccountView(selectedAccount); + } + } + } + ); + } + + private void switchToAccountView(String accountName) { + try { + // Laden der zweiten FXML + FXMLLoader loader = new FXMLLoader(getClass().getResource("Accountview.fxml")); + Parent root = loader.load(); + + // Zugriff auf Controller und Datenübergabe + AccountviewController accountController = loader.getController(); + accountController.setAccount(accountName, privateBank); + + // Scene in der selben Stage wechseln + Stage stage = (Stage) accountListView.getScene().getWindow(); + stage.getScene().setRoot(root); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + private boolean showDeleteConfirmation(String accountName) { + Alert alert = new Alert(Alert.AlertType.CONFIRMATION); + alert.setTitle("Account löschen"); + alert.setHeaderText("Soll der Account '" + accountName + "' wirklich gelöscht werden?"); + alert.setContentText("Diese Aktion kann nicht rückgängig gemacht werden."); + + ButtonType yesButton = new ButtonType("Ja", ButtonBar.ButtonData.YES); + ButtonType noButton = new ButtonType("Nein", ButtonBar.ButtonData.NO); + + alert.getButtonTypes().setAll(yesButton, noButton); + + Optional result = alert.showAndWait(); + + return result.isPresent() && result.get() == yesButton; + } +} \ No newline at end of file diff --git a/src/main/java/ui/main.java b/src/main/java/ui/main.java new file mode 100644 index 0000000..766848f --- /dev/null +++ b/src/main/java/ui/main.java @@ -0,0 +1,20 @@ +package ui; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.stage.Stage; + +public class main extends Application { + @Override + public void start(Stage primaryStage) throws Exception { + FXMLLoader loader = new FXMLLoader(getClass().getResource("/Mainview.fxml")); + Scene scene = new Scene(loader.load()); + primaryStage.setScene(scene); + primaryStage.show(); + } + + public static void main(String[] args) { + launch(args); + } +} diff --git a/src/main/resources/Accountview.fxml b/src/main/resources/Accountview.fxml new file mode 100644 index 0000000..f4bac5e --- /dev/null +++ b/src/main/resources/Accountview.fxml @@ -0,0 +1,36 @@ + + + + + + + + + +