From bf27a2eeae677103f01deaa67197f84f51b1567e Mon Sep 17 00:00:00 2001 From: Solveig Natvig Date: Sun, 24 May 2026 21:16:13 +0200 Subject: [PATCH 1/2] Add possibility to sell a selected amount of shares --- src/main/java/Model/Exchange.java | 48 +++++++++++++++++++++++---- src/main/java/View/MainGameScene.java | 45 +++++++++++++++++++++---- 2 files changed, 80 insertions(+), 13 deletions(-) diff --git a/src/main/java/Model/Exchange.java b/src/main/java/Model/Exchange.java index a15512f..080a109 100644 --- a/src/main/java/Model/Exchange.java +++ b/src/main/java/Model/Exchange.java @@ -98,19 +98,53 @@ public Transaction buy(String symbol, BigDecimal quantity, Player player) { } public Transaction sell(Share share, Player player) { - // unngå nullpointerexception - if (share == null) { + return sell(share, share.getQuantity(), player); + } + + public Transaction sell(Share originalShare, BigDecimal sellQuantity, Player player) { + if (originalShare == null || sellQuantity == null) { return null; } - // oppretter salgstransaksjonen for den uka via fabrikken - Transaction sale = TransactionFactory.createSale(share, this.week); + // Kan ikke selge mer enn man eier + if (sellQuantity.compareTo(originalShare.getQuantity()) > 0) { + return null; + } - // commiter til player - sale.commit(player); + Share shareToSell; - notifyObservers(); + if (sellQuantity.compareTo(originalShare.getQuantity()) < 0) { + + /** + * Delsalg: + * Original mengde - mengde som selges = gjenværende mengde + */ + + player.getPortfolio().removeShare(originalShare); + + BigDecimal remainderShare = originalShare.getQuantity().subtract(sellQuantity); + + player.getPortfolio().addShare(new Share(originalShare.getStock(), remainderShare, originalShare.getPurchasePrice())); + /** + * Legger delmengden midlertidig til i portfolio slik at Sale.commit() finner den + */ + + shareToSell = new Share(originalShare.getStock(), sellQuantity, originalShare.getPurchasePrice()); + + player.getPortfolio().addShare(shareToSell); + + } + + else { + // Fullstendig salg: hele andelen selges som normalt + shareToSell = originalShare; + } + + Sale sale = new Sale(shareToSell, this.week); + + sale.commit(player); + notifyObservers(); return sale; } diff --git a/src/main/java/View/MainGameScene.java b/src/main/java/View/MainGameScene.java index 9b57bc9..7684fff 100644 --- a/src/main/java/View/MainGameScene.java +++ b/src/main/java/View/MainGameScene.java @@ -289,6 +289,21 @@ protected void updateItem(Share s, boolean empty) { updateHoldingsList(holdingsList); + // Antall Rad + HBox quantityRow = new HBox(8); + quantityRow.setAlignment(Pos.CENTER_LEFT); + TextField quantityField = new TextField(); + quantityField.setPromptText("Antall"); + quantityField.setPrefWidth(120); + quantityRow.getChildren().addAll(new Label("Quantity to sell:"), quantityField); + + // Fyll inn maks anntall automatisk når man velger en holding + holdingsList.getSelectionModel().selectedItemProperty().addListener((obs, old, selected) -> { + if (selected != null) { + quantityField.setText(selected.getQuantity().toPlainString()); + } + }); + Button sellBtn = new Button("Sell Selected"); sellBtn.setOnAction(e -> { Share selected = holdingsList.getSelectionModel().getSelectedItem(); @@ -296,15 +311,33 @@ protected void updateItem(Share s, boolean empty) { alert("Error", "Select a holding to sell"); return; } - Transaction trans = exchange.sell(selected, player); // observer fires refresh - if (trans != null && trans.isCommitted()) { - showConfirmation("Sale successful", trans); - } else { - alert("Failed", "Could not complete sale"); + + try { + BigDecimal quantity = new BigDecimal(quantityField.getText().trim()); + + if (quantity.compareTo(BigDecimal.ZERO) <= 0) { + alert("Error", "Quantity must be greater than zero"); + return; + } + + Transaction trans = exchange.sell(selected, quantity, player); // observer fires refresh + + if (trans != null && trans.isCommitted()) { + showConfirmation("Sale successful", trans); + } + + else { + alert("Failed", "Could not complete sale. Check quantity."); + } + } + + catch (NumberFormatException ex) { + alert("Error", "Enter a valid number for quantity"); } }); - box.getChildren().addAll(heading, holdingsList, sellBtn); + box.getChildren().addAll(heading, holdingsList, quantityRow, sellBtn); + return box; } From 1be2e992c98d1b52fd8543fa738658f1e3302473 Mon Sep 17 00:00:00 2001 From: Solveig Natvig Date: Sun, 24 May 2026 21:26:43 +0200 Subject: [PATCH 2/2] Changed sale transaction to use the transaction factory --- src/main/java/Model/Exchange.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/Model/Exchange.java b/src/main/java/Model/Exchange.java index 080a109..1a3a33f 100644 --- a/src/main/java/Model/Exchange.java +++ b/src/main/java/Model/Exchange.java @@ -110,7 +110,7 @@ public Transaction sell(Share originalShare, BigDecimal sellQuantity, Player pla if (sellQuantity.compareTo(originalShare.getQuantity()) > 0) { return null; } - + Share shareToSell; if (sellQuantity.compareTo(originalShare.getQuantity()) < 0) { @@ -141,7 +141,8 @@ public Transaction sell(Share originalShare, BigDecimal sellQuantity, Player pla shareToSell = originalShare; } - Sale sale = new Sale(shareToSell, this.week); + // Salgstransaksjon via fabrikken + Transaction sale = TransactionFactory.createSale(shareToSell, this.week); sale.commit(player); notifyObservers();