Refund Policy added
This commit is contained in:
@@ -239,14 +239,26 @@ public class OrderController {
|
||||
return ResponseEntity.status(400).body(Map.of("error", "Cannot cancel an order that is already " + oldStatus));
|
||||
}
|
||||
|
||||
if ("RITZ_TOKEN".equals(order.getPaymentMethod())) {
|
||||
tokenService.refund(order.getUserId(), "ORD-" + order.getDisplayOrderId(),
|
||||
order.getTotalAmount(), "Order Cancelled");
|
||||
if ("CANCEL_PENDING".equalsIgnoreCase(oldStatus)) {
|
||||
return ResponseEntity.status(400).body(Map.of("error", "Cancellation is already pending for this order."));
|
||||
}
|
||||
|
||||
if (!isStaff()) {
|
||||
// Customer cancellation -> CANCEL_PENDING (delayed)
|
||||
order.setStatus("CANCEL_PENDING");
|
||||
order.setCancelRequestedAt(LocalDateTime.now());
|
||||
orderRepository.save(order);
|
||||
return ResponseEntity.ok(Map.of("success", true, "message", "Cancellation requested. It will be processed in 5 minutes unless the order is already being prepared."));
|
||||
} else {
|
||||
// Staff manual cancellation -> instant CANCELLED
|
||||
if ("RITZ_TOKEN".equals(order.getPaymentMethod())) {
|
||||
tokenService.refund(order.getUserId(), "ORD-" + order.getDisplayOrderId(),
|
||||
order.getTotalAmount(), "Order Cancelled by Staff");
|
||||
}
|
||||
order.setStatus("CANCELLED");
|
||||
orderRepository.save(order);
|
||||
return ResponseEntity.ok(Map.of("success", true, "message", "Order cancelled successfully"));
|
||||
}
|
||||
|
||||
order.setStatus("CANCELLED");
|
||||
orderRepository.save(order);
|
||||
return ResponseEntity.ok(Map.of("success", true, "message", "Order cancelled successfully"));
|
||||
}).orElse(ResponseEntity.notFound().build());
|
||||
} catch (Exception e) {
|
||||
return ResponseEntity.status(500).body(Map.of("error", e.getMessage()));
|
||||
|
||||
@@ -53,6 +53,9 @@ public class Order {
|
||||
@Column(name = "has_feedback", nullable = false)
|
||||
private boolean hasFeedback = false;
|
||||
|
||||
@Column(name = "cancel_requested_at")
|
||||
private LocalDateTime cancelRequestedAt;
|
||||
|
||||
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
|
||||
private List<OrderItem> items = new ArrayList<>();
|
||||
|
||||
@@ -114,4 +117,7 @@ public class Order {
|
||||
|
||||
public List<OrderItem> getItems() { return items; }
|
||||
public void setItems(List<OrderItem> items) { this.items = items; }
|
||||
|
||||
public LocalDateTime getCancelRequestedAt() { return cancelRequestedAt; }
|
||||
public void setCancelRequestedAt(LocalDateTime cancelRequestedAt) { this.cancelRequestedAt = cancelRequestedAt; }
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ public interface OrderRepository extends JpaRepository<Order, Long>, JpaSpecific
|
||||
long countByCreatedAtBetween(LocalDateTime start, LocalDateTime end);
|
||||
List<Order> findByIsArchivedFalseAndCreatedAtBefore(LocalDateTime timestamp);
|
||||
Optional<Order> findByOrderNumber(String orderNumber);
|
||||
List<Order> findByStatusAndCancelRequestedAtBefore(String status, LocalDateTime cutoffTime);
|
||||
|
||||
@Query("SELECT SUM(o.totalAmount) FROM Order o")
|
||||
BigDecimal getTotalRevenue();
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
package com.rit.canteen.sales.service;
|
||||
|
||||
import com.rit.canteen.sales.model.Order;
|
||||
import com.rit.canteen.sales.repository.OrderRepository;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class OrderCancellationProcessor {
|
||||
|
||||
@Autowired
|
||||
private OrderRepository orderRepository;
|
||||
|
||||
@Autowired
|
||||
private TokenService tokenService;
|
||||
|
||||
// Run every minute
|
||||
@Scheduled(fixedRate = 60000)
|
||||
@Transactional
|
||||
public void processPendingCancellations() {
|
||||
// Find orders that were requested to cancel more than 5 minutes ago
|
||||
LocalDateTime cutoffTime = LocalDateTime.now().minusMinutes(5);
|
||||
List<Order> pendingOrders = orderRepository.findByStatusAndCancelRequestedAtBefore("CANCEL_PENDING", cutoffTime);
|
||||
|
||||
for (Order order : pendingOrders) {
|
||||
try {
|
||||
// Double check status just in case
|
||||
if (!"CANCEL_PENDING".equals(order.getStatus())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Refund if token used
|
||||
if ("RITZ_TOKEN".equals(order.getPaymentMethod())) {
|
||||
tokenService.refund(
|
||||
order.getUserId(),
|
||||
"ORD-" + order.getDisplayOrderId(),
|
||||
order.getTotalAmount(),
|
||||
"Auto-processed delayed cancellation"
|
||||
);
|
||||
}
|
||||
|
||||
order.setStatus("CANCELLED");
|
||||
orderRepository.save(order);
|
||||
|
||||
System.out.println("[CANCELLATION PROCESSOR] Successfully cancelled order " + order.getOrderNumber());
|
||||
} catch (Exception e) {
|
||||
System.err.println("[CANCELLATION PROCESSOR] Error cancelling order " + order.getOrderNumber() + ": " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user