Fix refund loading
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user