From d58801e51f3a9b99ac3fa2170ae3e3089836ec5e Mon Sep 17 00:00:00 2001 From: Harkamal Randhawa Date: Tue, 10 Mar 2026 21:50:00 -0600 Subject: [PATCH] Fix refund loading --- .../RefundDialogController.java | 63 ++++++++++++++++--- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/example/petshopdesktop/controllers/dialogcontrollers/RefundDialogController.java b/src/main/java/org/example/petshopdesktop/controllers/dialogcontrollers/RefundDialogController.java index 5abe261f..d886a451 100644 --- a/src/main/java/org/example/petshopdesktop/controllers/dialogcontrollers/RefundDialogController.java +++ b/src/main/java/org/example/petshopdesktop/controllers/dialogcontrollers/RefundDialogController.java @@ -19,9 +19,12 @@ import java.math.BigDecimal; import java.text.NumberFormat; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; public class RefundDialogController { @@ -127,15 +130,10 @@ public class RefundDialogController { try { List allSales = SaleApi.getInstance().listSales(0, 1000, null); - boolean alreadyRefunded = allSales.stream() - .anyMatch(s -> Boolean.TRUE.equals(s.getIsRefund()) && saleId.equals(s.getOriginalSaleId())); - - if (alreadyRefunded) { - showError("Load Sale", "This sale has already been refunded."); - return; - } - currentSale = SaleApi.getInstance().getSale(saleId); + List previousRefunds = allSales.stream() + .filter(s -> Boolean.TRUE.equals(s.getIsRefund()) && saleId.equals(s.getOriginalSaleId())) + .collect(Collectors.toList()); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); String saleInfo = String.format("Sale Date: %s | Employee: %s | Original Total: %s | Payment: %s", @@ -145,7 +143,13 @@ public class RefundDialogController { currentSale.getPaymentMethod()); lblSaleInfo.setText(saleInfo); - tvOriginalItems.setItems(FXCollections.observableArrayList(currentSale.getItems())); + List refundableItems = buildRefundableItems(currentSale, previousRefunds); + if (refundableItems.isEmpty()) { + showError("Load Sale", "This sale has no remaining refundable items."); + return; + } + + tvOriginalItems.setItems(FXCollections.observableArrayList(refundableItems)); cbPaymentMethod.getSelectionModel().select(currentSale.getPaymentMethod()); refundItems.clear(); @@ -303,6 +307,47 @@ public class RefundDialogController { stage.close(); } + private List buildRefundableItems(SaleResponse sale, List previousRefunds) { + Map refundedByProduct = new HashMap<>(); + for (SaleResponse refund : previousRefunds) { + if (refund.getItems() == null) { + continue; + } + for (SaleItemResponse refundItem : refund.getItems()) { + if (refundItem.getProdId() == null || refundItem.getQuantity() == null) { + continue; + } + refundedByProduct.merge(refundItem.getProdId(), Math.abs(refundItem.getQuantity()), Integer::sum); + } + } + + List refundableItems = new ArrayList<>(); + if (sale.getItems() == null) { + return refundableItems; + } + + for (SaleItemResponse originalItem : sale.getItems()) { + if (originalItem.getProdId() == null || originalItem.getQuantity() == null) { + continue; + } + + int remainingQuantity = originalItem.getQuantity() - refundedByProduct.getOrDefault(originalItem.getProdId(), 0); + if (remainingQuantity <= 0) { + continue; + } + + SaleItemResponse refundableItem = new SaleItemResponse(); + refundableItem.setSaleItemId(originalItem.getSaleItemId()); + refundableItem.setProdId(originalItem.getProdId()); + refundableItem.setProductName(originalItem.getProductName()); + refundableItem.setQuantity(remainingQuantity); + refundableItem.setUnitPrice(originalItem.getUnitPrice()); + refundableItems.add(refundableItem); + } + + return refundableItems; + } + private void showError(String title, String message) { Alert alert = new Alert(Alert.AlertType.ERROR); alert.setTitle(title);