updated sales on desktop, and fixed sales with points again on back end
This commit is contained in:
@@ -28,6 +28,8 @@ public class SaleRequest {
|
||||
|
||||
private Long cartId;
|
||||
|
||||
private Integer pointsUsed;
|
||||
|
||||
|
||||
public Long getStoreId() {
|
||||
return storeId;
|
||||
@@ -101,6 +103,14 @@ public class SaleRequest {
|
||||
this.cartId = cartId;
|
||||
}
|
||||
|
||||
public Integer getPointsUsed() {
|
||||
return pointsUsed;
|
||||
}
|
||||
|
||||
public void setPointsUsed(Integer pointsUsed) {
|
||||
this.pointsUsed = pointsUsed;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
@@ -115,12 +125,13 @@ public class SaleRequest {
|
||||
Objects.equals(customerId, that.customerId) &&
|
||||
Objects.equals(channel, that.channel) &&
|
||||
Objects.equals(couponId, that.couponId) &&
|
||||
Objects.equals(cartId, that.cartId);
|
||||
Objects.equals(cartId, that.cartId) &&
|
||||
Objects.equals(pointsUsed, that.pointsUsed);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(storeId, paymentMethod, items, isRefund, originalSaleId, customerId, channel, couponId, cartId);
|
||||
return Objects.hash(storeId, paymentMethod, items, isRefund, originalSaleId, customerId, channel, couponId, cartId, pointsUsed);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -135,6 +146,7 @@ public class SaleRequest {
|
||||
", channel='" + channel + '\'' +
|
||||
", couponId=" + couponId +
|
||||
", cartId=" + cartId +
|
||||
", pointsUsed=" + pointsUsed +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,10 +162,41 @@ public class SaleService {
|
||||
}
|
||||
subtotalAmount = subtotalAmount.negate();
|
||||
sale.setSubtotalAmount(subtotalAmount);
|
||||
sale.setTotalAmount(subtotalAmount);
|
||||
sale.setCouponDiscountAmount(BigDecimal.ZERO);
|
||||
|
||||
Sale originalSale = sale.getOriginalSale();
|
||||
BigDecimal originalSubtotal = originalSale.getSubtotalAmount();
|
||||
BigDecimal loyaltyDiscountRefunded = BigDecimal.ZERO;
|
||||
BigDecimal couponDiscountRefunded = BigDecimal.ZERO;
|
||||
BigDecimal refundTotal;
|
||||
|
||||
if (originalSubtotal != null && originalSubtotal.compareTo(BigDecimal.ZERO) > 0) {
|
||||
BigDecimal ratio = subtotalAmount.divide(originalSubtotal, 10, RoundingMode.HALF_UP);
|
||||
refundTotal = originalSale.getTotalAmount().abs().multiply(ratio).negate().setScale(2, RoundingMode.HALF_UP);
|
||||
if (originalSale.getLoyaltyDiscountAmount() != null) {
|
||||
loyaltyDiscountRefunded = originalSale.getLoyaltyDiscountAmount().multiply(ratio).setScale(2, RoundingMode.HALF_UP);
|
||||
}
|
||||
if (originalSale.getCouponDiscountAmount() != null) {
|
||||
couponDiscountRefunded = originalSale.getCouponDiscountAmount().multiply(ratio).setScale(2, RoundingMode.HALF_UP);
|
||||
}
|
||||
User refundCustomer = originalSale.getCustomer();
|
||||
if (refundCustomer != null) {
|
||||
sale.setCustomer(refundCustomer);
|
||||
int pointsToRestore = toPointsUsed(loyaltyDiscountRefunded);
|
||||
int pointsEarnedToReverse = originalSale.getPointsEarned() != null
|
||||
? ratio.multiply(BigDecimal.valueOf(originalSale.getPointsEarned())).setScale(0, RoundingMode.FLOOR).intValue()
|
||||
: 0;
|
||||
int currentPoints = refundCustomer.getLoyaltyPoints() != null ? refundCustomer.getLoyaltyPoints() : 0;
|
||||
refundCustomer.setLoyaltyPoints(Math.max(0, currentPoints + pointsToRestore - pointsEarnedToReverse));
|
||||
userRepository.save(refundCustomer);
|
||||
}
|
||||
} else {
|
||||
refundTotal = subtotalAmount.negate();
|
||||
}
|
||||
|
||||
sale.setTotalAmount(refundTotal);
|
||||
sale.setCouponDiscountAmount(couponDiscountRefunded);
|
||||
sale.setEmployeeDiscountAmount(BigDecimal.ZERO);
|
||||
sale.setLoyaltyDiscountAmount(BigDecimal.ZERO);
|
||||
sale.setLoyaltyDiscountAmount(loyaltyDiscountRefunded);
|
||||
sale.setPointsEarned(0);
|
||||
} else {
|
||||
if (request.getItems() == null || request.getItems().isEmpty()) {
|
||||
@@ -206,18 +237,29 @@ public class SaleService {
|
||||
BigDecimal employeeDiscount = calculateEmployeeDiscount(customer, subtotalAmount.subtract(couponDiscount));
|
||||
sale.setEmployeeDiscountAmount(employeeDiscount);
|
||||
|
||||
boolean useLoyaltyPoints = sale.getCart() != null && Boolean.TRUE.equals(sale.getCart().getPointsApplied());
|
||||
BigDecimal loyaltyDiscount = calculateLoyaltyDiscount(customer, subtotalAmount.subtract(couponDiscount).subtract(employeeDiscount), useLoyaltyPoints);
|
||||
BigDecimal remainingAfterDiscounts = subtotalAmount.subtract(couponDiscount).subtract(employeeDiscount);
|
||||
BigDecimal loyaltyDiscount;
|
||||
int pointsDeducted;
|
||||
if (request.getPointsUsed() != null && request.getPointsUsed() > 0) {
|
||||
loyaltyDiscount = BigDecimal.valueOf(request.getPointsUsed())
|
||||
.divide(BigDecimal.valueOf(LOYALTY_POINTS_PER_DOLLAR), 2, RoundingMode.HALF_UP)
|
||||
.min(remainingAfterDiscounts.max(BigDecimal.ZERO))
|
||||
.setScale(2, RoundingMode.HALF_UP);
|
||||
pointsDeducted = request.getPointsUsed();
|
||||
} else {
|
||||
boolean useLoyaltyPoints = sale.getCart() != null && Boolean.TRUE.equals(sale.getCart().getPointsApplied());
|
||||
loyaltyDiscount = calculateLoyaltyDiscount(customer, remainingAfterDiscounts, useLoyaltyPoints);
|
||||
pointsDeducted = toPointsUsed(loyaltyDiscount);
|
||||
}
|
||||
sale.setLoyaltyDiscountAmount(loyaltyDiscount);
|
||||
|
||||
BigDecimal finalTotal = subtotalAmount.subtract(couponDiscount).subtract(employeeDiscount).subtract(loyaltyDiscount);
|
||||
sale.setTotalAmount(finalTotal.max(BigDecimal.ZERO));
|
||||
|
||||
int pointsUsed = toPointsUsed(loyaltyDiscount);
|
||||
sale.setPointsEarned(sale.getTotalAmount().setScale(0, RoundingMode.FLOOR).intValue());
|
||||
if (customer != null) {
|
||||
int currentPoints = customer.getLoyaltyPoints() != null ? customer.getLoyaltyPoints() : 0;
|
||||
int updatedPoints = currentPoints - pointsUsed + sale.getPointsEarned();
|
||||
int updatedPoints = currentPoints - pointsDeducted + sale.getPointsEarned();
|
||||
customer.setLoyaltyPoints(Math.max(updatedPoints, 0));
|
||||
userRepository.save(customer);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user