reserva - PowerSystem2024/CapybaraFilms_ProyectoTercerSemestre GitHub Wiki

📄 Reserva.py

1. Propósito y Responsabilidades

La entidad Reserva actúa como agregado raíz del dominio, orquestando una transacción completa de reserva de cine.

🔸 Responsabilidades principales

  • Coordinar todos los componentes de una reserva (cliente, sala, butacas, combos)
  • Calcular el precio total de la reserva
  • Generar resúmenes detallados para el cliente
  • Gestionar la fecha/hora de la reserva
  • Mantener la integridad del agregado

2. Atributos Principales

Atributo Tipo Propósito Valor por Defecto
id_reserva str Identificador único Asignado por BD
cliente Cliente Cliente que reserva Requerido
sala Sala Sala de cine Requerido
candy list[Candy] Combos seleccionados Lista vacía
butacas_asignadas list[Butaca] Butacas reservadas Lista vacía
fecha_hora datetime Timestamp de reserva datetime.now()

3. Métodos Clave con Ejemplos de Uso

🔸 Cálculo de Precio Total:

reserva = Reserva(cliente, sala, candy=[combo1, combo2], butacas_asignadas=[butaca1, butaca2])  
precio_total = reserva.calcular_precio_total()  
print(f"Total a pagar: ${precio_total}")

🔸 Generación de Resumen:

reserva.mostrar_resumen()  
# Imprime resumen detallado con:  
# - Información del cliente  
# - Butacas reservadas con precios  
# - Combos seleccionados  
# - Total a pagar

4. Manejo de Errores

La entidad Reserva implementa manejo robusto de errores:

🔸 En cálculo de precios:

  • Captura errores al obtener categoría de butacas
  • Maneja errores al acceder a precios de combos
  • Continúa el cálculo aunque falle un elemento individual

🔸 En generación de resumen:

  • Captura errores generales durante la presentación
  • Proporciona mensajes de error descriptivos

5. Integración con Otras Entidades

graph TD
    ReservaDAO --> Reserva
    CineServices --> Reserva

    subgraph Reserva - Aggregate Root
        Reserva["Reserva - Aggregate Root
        - calcular_precio_total
        - mostrar_resumen"]
    end

    Reserva --> Cliente["Cliente
    - nombre, apellido, email"]
    Reserva --> Sala["Sala
    - id_sala"]
    Reserva --> Butaca["Butaca
    - categoria, fila, columna"]
    Reserva --> Candy["Candy
    - tipo, precio"]

    Butaca --> TipoButaca
    Candy --> TipoCandy
Loading

🔸 Relaciones complejas:

  • Agregado raíz: Controla acceso a entidades relacionadas
  • Con TipoButaca: Utiliza enum para cálculo de precios
  • Con CineServices: Integración para obtener precios por categoría
  • Con ReservaDAO: Persistencia del agregado completo

6. Patrones de Diseño Implementados

🔸 Aggregate Root Pattern:

  • Reserva controla el acceso a todas las entidades relacionadas
  • Mantiene la consistencia del dominio
  • Coordina operaciones complejas entre múltiples entidades

🔸 Domain Services Integration:

  • Utiliza CineServices.obtener_precio_por_categoria() para cálculos
  • Delega validaciones específicas a servicios apropiados

La entidad Reserva demuestra cómo un agregado raíz puede coordinar múltiples entidades mientras mantiene la integridad del dominio y proporciona una interfaz cohesiva para operaciones complejas de negocio.

⚠️ **GitHub.com Fallback** ⚠️