Replace the mock test-payment button with a real manual Swish flow where the user sends a Swish payment with the order ID as message and confirms via a button. Admin verifies Swish and processes manually. Backend - Rename OrderStatus LOOKUP_STARTED to PROCESSING (Swedish: Hanteras) - Update V5 migration CHECK constraint from lookup_started to processing - Rename OrderService.markAsPaid() to confirmPayment(), sets PROCESSING instead of PAID, stop hardcoding amountPaid - Add GET /api/payment/swish-info endpoint returning swish number and letter price from app.payment config - Permit /api/payment/swish-info without authentication - Update UpdateStatusRequest regex to accept processing - Update PaymentControllerTest for renamed method, new status, and public swish-info endpoint test Frontend - Rewrite PaymentRedirect.vue: Swish number, order ID as message, Jag har betalat button with confirmation dialog - Add fetchSwishInfo() to api/payment.ts - AdminPage: rename Skickade stat to Att göra (processing orders), highlight processing rows with admin__row--todo - OrdersPage: update status labels/badge classes for new flow - Refactor ApiError in client.ts to property declaration syntax - Exclude __tests__ from tsconfig.app.json and Docker builds Tests - Rewrite PaymentRedirect.spec.ts for Swish info, confirmation dialog, cancel flow, and processing status - Update OrdersPage.spec.ts with processing status test - Update AdminDashboard.spec.ts with Att göra stat and row highlight - Add amountPaid to ComposePage.spec.ts mock Config - Add SWISH_NUMBER to .env.example and docker-compose.yml
65 lines
2.1 KiB
Java
65 lines
2.1 KiB
Java
package se.bilhalsning.service;
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.springframework.stereotype.Service;
|
|
import se.bilhalsning.entity.Order;
|
|
import se.bilhalsning.entity.OrderStatus;
|
|
import se.bilhalsning.exception.OrderNotFoundException;
|
|
import se.bilhalsning.repository.OrderRepository;
|
|
|
|
import java.util.List;
|
|
import java.util.UUID;
|
|
|
|
@Service
|
|
@RequiredArgsConstructor
|
|
public class OrderService {
|
|
|
|
private final OrderRepository orderRepository;
|
|
|
|
public Order createOrder(UUID userId, String plate, String letterText) {
|
|
Order order = new Order();
|
|
order.setUserId(userId);
|
|
order.setPlate(plate.toUpperCase().trim());
|
|
order.setLetterText(letterText);
|
|
order.setStatus(OrderStatus.PENDING_PAYMENT);
|
|
return orderRepository.save(order);
|
|
}
|
|
|
|
public List<Order> getOrdersByUserId(UUID userId) {
|
|
return orderRepository.findByUserIdOrderByCreatedAtDesc(userId);
|
|
}
|
|
|
|
public Order getOrderById(UUID id) {
|
|
return orderRepository.findById(id)
|
|
.orElseThrow(() -> new OrderNotFoundException(id));
|
|
}
|
|
|
|
public List<Order> getAllOrders() {
|
|
return orderRepository.findAllByOrderByCreatedAtDesc();
|
|
}
|
|
|
|
public Order updateOrderStatus(UUID orderId, String statusString) {
|
|
Order order = orderRepository.findById(orderId)
|
|
.orElseThrow(() -> new OrderNotFoundException(orderId));
|
|
|
|
OrderStatus newStatus = OrderStatus.valueOf(statusString.toUpperCase());
|
|
order.setStatus(newStatus);
|
|
return orderRepository.save(order);
|
|
}
|
|
|
|
public Order updateTracking(UUID orderId, String trackingId) {
|
|
Order order = orderRepository.findById(orderId)
|
|
.orElseThrow(() -> new OrderNotFoundException(orderId));
|
|
|
|
order.setTrackingId(trackingId);
|
|
return orderRepository.save(order);
|
|
}
|
|
|
|
public Order confirmPayment(UUID orderId) {
|
|
Order order = orderRepository.findById(orderId)
|
|
.orElseThrow(() -> new OrderNotFoundException(orderId));
|
|
|
|
order.setStatus(OrderStatus.PROCESSING);
|
|
return orderRepository.save(order);
|
|
}
|
|
}
|