diff --git a/src/main/java/Model/Exchange.java b/src/main/java/Model/Exchange.java index 40646b7..1235745 100644 --- a/src/main/java/Model/Exchange.java +++ b/src/main/java/Model/Exchange.java @@ -127,6 +127,20 @@ public Transaction buy(String symbol, BigDecimal quantity, Player player) { } public Transaction sell(Share share, Player player) { + + return sell(share, share.getQuantity(), player); + } + + public Transaction sell(Share originalShare, BigDecimal sellQuantity, Player player) { + if (originalShare == null || sellQuantity == null) { + return null; + } + + // Kan ikke selge mer enn man eier + if (sellQuantity.compareTo(originalShare.getQuantity()) > 0) { + return null; + } + if (share == null) { throw new IllegalArgumentException("Share cannot be null"); } @@ -137,8 +151,42 @@ public Transaction sell(Share share, Player player) { Sale sale = new Sale(share, this.week); sale.commit(player); - notifyObservers(); + Share shareToSell; + + 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; + } + + // Salgstransaksjon via fabrikken + Transaction sale = TransactionFactory.createSale(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; }