diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/SaleDetailFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/SaleDetailFragment.java index 4963b272..e592fb7d 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/SaleDetailFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/listfragments/detailfragments/SaleDetailFragment.java @@ -206,15 +206,12 @@ public class SaleDetailFragment extends Fragment { binding.llEmployeeDiscount.setVisibility(View.GONE); } - if (sale.getPointsDiscountAmount() != null && sale.getPointsDiscountAmount().compareTo(BigDecimal.ZERO) > 0) { - binding.llLoyaltyDiscount.setVisibility(View.VISIBLE); - binding.tvSaleLoyaltyDiscount.setText("-$" + String.format(Locale.getDefault(), "%.2f", sale.getPointsDiscountAmount())); - if (sale.getPointsUsed() != null) { - binding.tvLoyaltyDiscountLabel.setText("Loyalty Discount (" + sale.getPointsUsed() + " pts):"); - } - } else if (sale.getLoyaltyDiscountAmount() != null && sale.getLoyaltyDiscountAmount().compareTo(BigDecimal.ZERO) > 0) { + if (sale.getLoyaltyDiscountAmount() != null && sale.getLoyaltyDiscountAmount().compareTo(BigDecimal.ZERO) > 0) { binding.llLoyaltyDiscount.setVisibility(View.VISIBLE); binding.tvSaleLoyaltyDiscount.setText("-$" + String.format(Locale.getDefault(), "%.2f", sale.getLoyaltyDiscountAmount())); + if (sale.getPointsUsed() != null && sale.getPointsUsed() > 0) { + binding.tvLoyaltyDiscountLabel.setText("Loyalty Discount (" + sale.getPointsUsed() + " pts):"); + } } else { binding.llLoyaltyDiscount.setVisibility(View.GONE); } diff --git a/backend/src/main/java/com/petshop/backend/dto/sale/SaleResponse.java b/backend/src/main/java/com/petshop/backend/dto/sale/SaleResponse.java index 8f2b4fe5..af116212 100644 --- a/backend/src/main/java/com/petshop/backend/dto/sale/SaleResponse.java +++ b/backend/src/main/java/com/petshop/backend/dto/sale/SaleResponse.java @@ -20,6 +20,7 @@ public class SaleResponse { private BigDecimal employeeDiscountAmount; private BigDecimal loyaltyDiscountAmount; private Integer pointsEarned; + private Integer pointsUsed; private String channel; private Long couponId; private Long cartId; @@ -145,6 +146,14 @@ public class SaleResponse { this.pointsEarned = pointsEarned; } + public Integer getPointsUsed() { + return pointsUsed; + } + + public void setPointsUsed(Integer pointsUsed) { + this.pointsUsed = pointsUsed; + } + public String getChannel() { return channel; } diff --git a/backend/src/main/java/com/petshop/backend/entity/Sale.java b/backend/src/main/java/com/petshop/backend/entity/Sale.java index e61204fd..b052e17d 100644 --- a/backend/src/main/java/com/petshop/backend/entity/Sale.java +++ b/backend/src/main/java/com/petshop/backend/entity/Sale.java @@ -73,6 +73,9 @@ public class Sale { @Column(nullable = false) private Integer pointsEarned = 0; + @Column(nullable = false) + private Integer pointsUsed = 0; + @OneToMany(mappedBy = "sale", cascade = CascadeType.ALL) private List items = new ArrayList<>(); @@ -224,6 +227,14 @@ public class Sale { this.pointsEarned = pointsEarned; } + public Integer getPointsUsed() { + return pointsUsed; + } + + public void setPointsUsed(Integer pointsUsed) { + this.pointsUsed = pointsUsed; + } + public List getItems() { return items; } diff --git a/backend/src/main/java/com/petshop/backend/service/SaleService.java b/backend/src/main/java/com/petshop/backend/service/SaleService.java index b53a4c4c..bff502a9 100644 --- a/backend/src/main/java/com/petshop/backend/service/SaleService.java +++ b/backend/src/main/java/com/petshop/backend/service/SaleService.java @@ -200,6 +200,7 @@ public class SaleService { sale.setEmployeeDiscountAmount(BigDecimal.ZERO); sale.setLoyaltyDiscountAmount(loyaltyDiscountRefunded); sale.setPointsEarned(0); + sale.setPointsUsed(0); } else { if (request.getItems() == null || request.getItems().isEmpty()) { throw new BusinessException("At least one item is required"); @@ -254,6 +255,7 @@ public class SaleService { pointsDeducted = toPointsUsed(loyaltyDiscount); } sale.setLoyaltyDiscountAmount(loyaltyDiscount); + sale.setPointsUsed(pointsDeducted); BigDecimal finalTotal = subtotalAmount.subtract(couponDiscount).subtract(employeeDiscount).subtract(loyaltyDiscount); sale.setTotalAmount(finalTotal.max(BigDecimal.ZERO)); @@ -376,6 +378,7 @@ public class SaleService { response.setEmployeeDiscountAmount(sale.getEmployeeDiscountAmount()); response.setLoyaltyDiscountAmount(sale.getLoyaltyDiscountAmount()); response.setPointsEarned(sale.getPointsEarned()); + response.setPointsUsed(sale.getPointsUsed()); response.setChannel(sale.getChannel()); if (sale.getCoupon() != null) { response.setCouponId(sale.getCoupon().getCouponId()); diff --git a/desktop/src/main/java/org/example/petshopdesktop/controllers/SaleController.java b/desktop/src/main/java/org/example/petshopdesktop/controllers/SaleController.java index 8eaaf7af..7e71dc32 100644 --- a/desktop/src/main/java/org/example/petshopdesktop/controllers/SaleController.java +++ b/desktop/src/main/java/org/example/petshopdesktop/controllers/SaleController.java @@ -841,6 +841,7 @@ public class SaleController { double subtotal = sale.getSubtotalAmount() != null ? sale.getSubtotalAmount().doubleValue() : 0.0; double couponDiscount = sale.getCouponDiscountAmount() != null ? sale.getCouponDiscountAmount().doubleValue() : 0.0; double loyaltyDiscount = sale.getLoyaltyDiscountAmount() != null ? sale.getLoyaltyDiscountAmount().doubleValue() : 0.0; + int pointsUsed = sale.getPointsUsed() != null ? sale.getPointsUsed() : 0; return new SaleDetail( sale.getSaleId().intValue(), sale.getSaleDate(), @@ -852,7 +853,8 @@ public class SaleController { sale.getCustomerName(), subtotal, couponDiscount, - loyaltyDiscount + loyaltyDiscount, + pointsUsed ); } diff --git a/desktop/src/main/java/org/example/petshopdesktop/controllers/dialogcontrollers/SaleDetailDialogController.java b/desktop/src/main/java/org/example/petshopdesktop/controllers/dialogcontrollers/SaleDetailDialogController.java index 332be5e8..4774c14d 100644 --- a/desktop/src/main/java/org/example/petshopdesktop/controllers/dialogcontrollers/SaleDetailDialogController.java +++ b/desktop/src/main/java/org/example/petshopdesktop/controllers/dialogcontrollers/SaleDetailDialogController.java @@ -33,6 +33,7 @@ public class SaleDetailDialogController { @FXML private javafx.scene.layout.HBox hbDetailCouponDiscount; @FXML private Label lblDetailCouponDiscount; @FXML private javafx.scene.layout.HBox hbDetailLoyaltyDiscount; + @FXML private Label lblDetailLoyaltyDiscountTitle; @FXML private Label lblDetailLoyaltyDiscount; @FXML private Label lblTotal; @FXML private Button btnRefund; @@ -86,6 +87,11 @@ public class SaleDetailDialogController { if (sale.getLoyaltyDiscountAmount() > 0.001) { lblDetailLoyaltyDiscount.setText("-" + currency.format(sale.getLoyaltyDiscountAmount())); + if (sale.getPointsUsed() > 0) { + lblDetailLoyaltyDiscountTitle.setText("Loyalty Discount (" + sale.getPointsUsed() + " pts):"); + } else { + lblDetailLoyaltyDiscountTitle.setText("Loyalty Discount:"); + } hbDetailLoyaltyDiscount.setVisible(true); hbDetailLoyaltyDiscount.setManaged(true); } else { diff --git a/desktop/src/main/java/org/example/petshopdesktop/models/SaleDetail.java b/desktop/src/main/java/org/example/petshopdesktop/models/SaleDetail.java index 13f500c4..63d3cf47 100644 --- a/desktop/src/main/java/org/example/petshopdesktop/models/SaleDetail.java +++ b/desktop/src/main/java/org/example/petshopdesktop/models/SaleDetail.java @@ -15,8 +15,9 @@ public class SaleDetail { private final double subtotalAmount; private final double couponDiscountAmount; private final double loyaltyDiscountAmount; + private final int pointsUsed; - public SaleDetail(int saleId, LocalDateTime saleDate, double totalAmount, String paymentMethod, String employeeName, boolean refund, ObservableList items, String customerName, double subtotalAmount, double couponDiscountAmount, double loyaltyDiscountAmount) { + public SaleDetail(int saleId, LocalDateTime saleDate, double totalAmount, String paymentMethod, String employeeName, boolean refund, ObservableList items, String customerName, double subtotalAmount, double couponDiscountAmount, double loyaltyDiscountAmount, int pointsUsed) { this.saleId = saleId; this.saleDate = saleDate; this.totalAmount = totalAmount; @@ -28,6 +29,7 @@ public class SaleDetail { this.subtotalAmount = subtotalAmount; this.couponDiscountAmount = couponDiscountAmount; this.loyaltyDiscountAmount = loyaltyDiscountAmount; + this.pointsUsed = pointsUsed; } public int getSaleId() { @@ -74,6 +76,10 @@ public class SaleDetail { return loyaltyDiscountAmount; } + public int getPointsUsed() { + return pointsUsed; + } + public static class SaleDetailItem { private final int prodId; private final String productName; diff --git a/desktop/src/main/resources/org/example/petshopdesktop/dialogviews/sale-detail-dialog-view.fxml b/desktop/src/main/resources/org/example/petshopdesktop/dialogviews/sale-detail-dialog-view.fxml index 4365bef7..45a3f440 100644 --- a/desktop/src/main/resources/org/example/petshopdesktop/dialogviews/sale-detail-dialog-view.fxml +++ b/desktop/src/main/resources/org/example/petshopdesktop/dialogviews/sale-detail-dialog-view.fxml @@ -69,7 +69,7 @@ - +