Skip to content

19 selling a selected amount of shares #24

Merged
merged 3 commits into from
May 24, 2026
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 49 additions & 1 deletion src/main/java/Model/Exchange.java
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
Expand All @@ -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;
}

Expand Down
45 changes: 39 additions & 6 deletions src/main/java/View/MainGameScene.java
Original file line number Diff line number Diff line change
Expand Up @@ -289,22 +289,55 @@ 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();
if (selected == null) {
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;
}

Expand Down