Fix refund loading
This commit is contained in:
@@ -19,9 +19,12 @@ import java.math.BigDecimal;
|
|||||||
import java.text.NumberFormat;
|
import java.text.NumberFormat;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class RefundDialogController {
|
public class RefundDialogController {
|
||||||
|
|
||||||
@@ -127,15 +130,10 @@ public class RefundDialogController {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
List<SaleResponse> allSales = SaleApi.getInstance().listSales(0, 1000, null);
|
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);
|
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");
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
|
||||||
String saleInfo = String.format("Sale Date: %s | Employee: %s | Original Total: %s | Payment: %s",
|
String saleInfo = String.format("Sale Date: %s | Employee: %s | Original Total: %s | Payment: %s",
|
||||||
@@ -145,7 +143,13 @@ public class RefundDialogController {
|
|||||||
currentSale.getPaymentMethod());
|
currentSale.getPaymentMethod());
|
||||||
lblSaleInfo.setText(saleInfo);
|
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());
|
cbPaymentMethod.getSelectionModel().select(currentSale.getPaymentMethod());
|
||||||
|
|
||||||
refundItems.clear();
|
refundItems.clear();
|
||||||
@@ -303,6 +307,47 @@ public class RefundDialogController {
|
|||||||
stage.close();
|
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) {
|
private void showError(String title, String message) {
|
||||||
Alert alert = new Alert(Alert.AlertType.ERROR);
|
Alert alert = new Alert(Alert.AlertType.ERROR);
|
||||||
alert.setTitle(title);
|
alert.setTitle(title);
|
||||||
|
|||||||
Reference in New Issue
Block a user