Class OrderService
Esta clase implementa la capa de servicio para operaciones relacionadas con pedidos, coordinando múltiples repositorios y aplicando reglas de negocio.
Responsabilidades
- Crear y validar pedidos
- Calcular totales de pedidos
- Verificar disponibilidad de stock
- Actualizar inventario al crear pedidos
- Gestionar el ciclo de vida de los pedidos
Transacciones
Todos los métodos que modifican datos están marcados con @Transactional
para garantizar la consistencia. Si alguna operación falla, toda la transacción
se revierte automáticamente.
Ejemplo de Uso
// Inyectar el servicio @Autowired private OrderService orderService; // Buscar pedidos de un cliente List<Order> orders = orderService.findOrdersByCustomerId(1L); // Calcular total de un pedido BigDecimal total = orderService.calculateOrderTotal(order);
- Since:
- 1.0.0
- Version:
- 1.0.0
- Author:
- Proyecto JPA
- See Also:
-
Constructor Summary
ConstructorsConstructorDescriptionOrderService(OrderRepository orderRepository, CustomerRepository customerRepository, ProductRepository productRepository) Constructor con inyección de dependencias. -
Method Summary
Modifier and TypeMethodDescriptioncalculateOrderTotal(Order order) Calcula el monto total de un pedido.cancelOrder(Long orderId) Cancela un pedido.booleancheckProductStock(Long productId, Integer quantity) Verifica si hay stock suficiente para un producto.longCuenta el número total de pedidos en el sistema.voiddeleteOrder(Long orderId) Elimina un pedido del sistema.Obtiene todos los pedidos del sistema.findOrderById(Long id) Busca un pedido por su ID.findOrderByOrderNumber(String orderNumber) Busca un pedido por su número de orden.findOrdersByCustomerId(Long customerId) Busca todos los pedidos de un cliente específico.findOrdersByStatus(Order.OrderStatus status) Busca pedidos por su estado.findOrdersWithItemsByCustomer(Long customerId) Obtiene los pedidos de un cliente con sus items precargados.Guarda un pedido en la base de datos.updateOrderStatus(Long orderId, Order.OrderStatus newStatus) Actualiza el estado de un pedido.
-
Constructor Details
-
OrderService
@Autowired public OrderService(OrderRepository orderRepository, CustomerRepository customerRepository, ProductRepository productRepository) Constructor con inyección de dependencias.Spring inyecta automáticamente las instancias de los repositorios necesarios para este servicio.
- Parameters:
orderRepository- repositorio de pedidoscustomerRepository- repositorio de clientesproductRepository- repositorio de productos
-
-
Method Details
-
findOrderById
Busca un pedido por su ID.- Parameters:
id- el ID del pedido a buscar- Returns:
- un Optional con el pedido si existe, vacío en caso contrario
-
findAllOrders
Obtiene todos los pedidos del sistema.- Returns:
- lista de todos los pedidos
-
findOrdersByCustomerId
Busca todos los pedidos de un cliente específico.Este método es útil para mostrar el historial de pedidos de un cliente en su perfil.
- Parameters:
customerId- el ID del cliente- Returns:
- lista de pedidos del cliente
-
findOrdersByStatus
Busca pedidos por su estado.Permite filtrar pedidos según su estado actual (PENDING, PROCESSING, SHIPPED, DELIVERED, CANCELLED).
- Parameters:
status- el estado de los pedidos a buscar- Returns:
- lista de pedidos con el estado especificado
-
findOrderByOrderNumber
Busca un pedido por su número de orden.El número de orden es único y se utiliza como referencia externa del pedido.
- Parameters:
orderNumber- el número de orden a buscar- Returns:
- un Optional con el pedido si existe
-
calculateOrderTotal
Calcula el monto total de un pedido.El total se calcula sumando los subtotales de todos los items del pedido. Este método es útil para verificar o recalcular totales.
- Parameters:
order- el pedido del cual calcular el total- Returns:
- el monto total del pedido
- Throws:
IllegalArgumentException- si el pedido es null o no tiene items
-
checkProductStock
Verifica si hay stock suficiente para un producto.Este método es esencial antes de crear un pedido para asegurar que hay inventario disponible.
- Parameters:
productId- el ID del producto a verificarquantity- la cantidad requerida- Returns:
- true si hay stock suficiente, false en caso contrario
-
saveOrder
Guarda un pedido en la base de datos.Este método persiste un nuevo pedido o actualiza uno existente. La operación se ejecuta dentro de una transacción.
- Parameters:
order- el pedido a guardar- Returns:
- el pedido guardado con su ID asignado
- Throws:
IllegalArgumentException- si el pedido es null
-
updateOrderStatus
Actualiza el estado de un pedido.Este método permite cambiar el estado de un pedido de forma segura, persistiendo el cambio en la base de datos.
- Parameters:
orderId- el ID del pedidonewStatus- el nuevo estado del pedido- Returns:
- el pedido actualizado
- Throws:
IllegalArgumentException- si el pedido no existe
-
cancelOrder
Cancela un pedido.Este método cambia el estado del pedido a CANCELLED y opcionalmente puede restaurar el stock de los productos (lógica de negocio).
- Parameters:
orderId- el ID del pedido a cancelar- Returns:
- el pedido cancelado
- Throws:
IllegalArgumentException- si el pedido no existe o no se puede cancelar
-
deleteOrder
Elimina un pedido del sistema.Advertencia: Esta operación es irreversible. Se recomienda usar cancelación en lugar de eliminación en la mayoría de los casos.
- Parameters:
orderId- el ID del pedido a eliminar- Throws:
IllegalArgumentException- si el pedido no existe
-
countAllOrders
public long countAllOrders()Cuenta el número total de pedidos en el sistema.- Returns:
- el número total de pedidos
-
findOrdersWithItemsByCustomer
Obtiene los pedidos de un cliente con sus items precargados.Este método utiliza JOIN FETCH para evitar el problema N+1, cargando los items del pedido en una sola consulta.
- Parameters:
customerId- el ID del cliente- Returns:
- lista de pedidos con sus items cargados
-