Fix refund loading

This commit is contained in:
2026-03-10 21:50:00 -06:00
parent 7518e15a6b
commit d58801e51f

View File

@@ -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<SaleResponse> 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<SaleResponse> 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<SaleItemResponse> 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<SaleItemResponse> buildRefundableItems(SaleResponse sale, List<SaleResponse> previousRefunds) {
Map<Long, Integer> 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<SaleItemResponse> 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);