Class OrderService

java.lang.Object
com.proyecto.jpa.service.OrderService

@Service @Transactional(readOnly=true) public class OrderService extends Object
Servicio para la gestión de pedidos y su lógica de negocio.

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 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 pedidos
      customerRepository - repositorio de clientes
      productRepository - repositorio de productos
  • Method Details

    • findOrderById

      public Optional<Order> findOrderById(Long id)
      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

      public List<Order> findAllOrders()
      Obtiene todos los pedidos del sistema.
      Returns:
      lista de todos los pedidos
    • findOrdersByCustomerId

      public List<Order> findOrdersByCustomerId(Long customerId)
      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

      public List<Order> findOrdersByStatus(Order.OrderStatus status)
      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

      public Optional<Order> findOrderByOrderNumber(String orderNumber)
      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

      public BigDecimal calculateOrderTotal(Order order)
      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

      public boolean checkProductStock(Long productId, Integer quantity)
      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 verificar
      quantity - la cantidad requerida
      Returns:
      true si hay stock suficiente, false en caso contrario
    • saveOrder

      @Transactional public Order saveOrder(Order order)
      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

      @Transactional public Order updateOrderStatus(Long orderId, Order.OrderStatus newStatus)
      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 pedido
      newStatus - el nuevo estado del pedido
      Returns:
      el pedido actualizado
      Throws:
      IllegalArgumentException - si el pedido no existe
    • cancelOrder

      @Transactional public Order cancelOrder(Long orderId)
      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

      @Transactional public void deleteOrder(Long orderId)
      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

      public List<Order> findOrdersWithItemsByCustomer(Long customerId)
      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