A continuación, se presenta el diagrama entidad-relación que describe la estructura de la base de datos del proyecto **MemberFlow-Data**. **Nota**: El diagrama debe ser actualizado para reflejar los cambios recientes en las relaciones y el uso de composición en lugar de herencia.
**MemberFlow-Data** es el módulo de acceso a datos y servicios de la aplicación **MemberFlow**, un sistema diseñado para la gestión de membresías, usuarios, clases y finanzas en un entorno organizacional. Este proyecto actúa como la capa de persistencia y lógica de negocio, proporcionando las entidades, configuraciones y servicios necesarios para interactuar con la base de datos.
El proyecto está diseñado para trabajar en conjunto con otro módulo llamado **MemberFlow-API**, que será responsable de exponer los controladores, manejar excepciones y proporcionar la interfaz de interacción con la web y otros clientes.
---
## Estructura del Proyecto
El proyecto está organizado en paquetes que agrupan las entidades, configuraciones, servicios y excepciones. A continuación, se detalla la estructura principal:
### 1. **Configuraciones**
- **`HibernateConfig`**: Configuración de Hibernate para la conexión y manejo de la base de datos.
### 2. **Entidades**
Las entidades representan las tablas de la base de datos y están organizadas en diferentes dominios:
#### a) **Gestión de Clases (`class_managment`)**
- **`Assistance`**: Representa la asistencia de un estudiante a una sesión de entrenamiento.
- **`Membership`**: Define las membresías de los estudiantes, incluyendo detalles como tipo, duración y beneficios.
- **`TrainingGroup`**: Representa un grupo de entrenamiento al que pueden pertenecer varios estudiantes y que está liderado por un profesor.
- **`TrainingSession`**: Define una sesión de entrenamiento específica, asociada a un grupo y con un horario determinado.
#### b) **Gestión de Usuarios (`user_managment`)**
- **`User`**: Representa un usuario genérico del sistema. Está asociado a roles, notificaciones y facturas.
- **`Student`**: Es un usuario con atributos específicos relacionados con su rol de estudiante, como historial, membresías y grupos de entrenamiento.
- **`Teacher`**: Es un usuario con atributos específicos relacionados con su rol de profesor, como los grupos que lidera.
- **`Admin`**: Es un usuario con permisos administrativos específicos.
- **`Notification`**: Representa notificaciones enviadas a los usuarios.
- **`Role`**: Define los roles de los usuarios (e.g., ADMIN, TEACHER, STUDENT).
- **`Permission`**: Define los permisos asociados a los roles.
- **`StudentHistory`**: Registra el historial de actividades de los estudiantes.
#### c) **Gestión Financiera (`finance`)**
- **`Invoice`**: Representa una factura generada para un usuario.
- **`InvoiceLine`**: Detalla los elementos de una factura.
- **`Payment`**: Registra los pagos realizados por los usuarios.
- **`ProductService`**: Define productos o servicios ofrecidos por la organización.
- **`IVAType`**: Define los tipos de IVA aplicables.
---
## Relaciones entre Entidades
A continuación, se describen las relaciones principales entre las entidades:
### 1. **Relaciones en Gestión de Clases (`class_managment`)**
#### a) **`Membership` ↔ `Student`**
- **Relación**: *Uno a Uno*.
- **Descripción**:
- Cada estudiante tiene una única membresía activa.
- Una membresía está asociada a un único estudiante.
#### b) **`TrainingGroup` ↔ `TrainingSession`**
- **Relación**: *Uno a Muchos*.
- **Descripción**:
- Un grupo de entrenamiento puede tener múltiples sesiones asociadas.
- Cada sesión pertenece a un único grupo.
#### c) **`TrainingSession` ↔ `Assistance`**
- **Relación**: *Uno a Muchos*.
- **Descripción**:
- Una sesión de entrenamiento puede registrar múltiples asistencias.
- Cada asistencia está asociada a un único estudiante y una única sesión.
#### d) **`TrainingGroup` ↔ `Student`**
- **Relación**: *Muchos a Muchos*.
- **Descripción**:
- Un estudiante puede pertenecer a varios grupos de entrenamiento.
- Un grupo puede tener múltiples estudiantes inscritos.
---
### 2. **Relaciones en Gestión de Usuarios (`user_managment`)**
#### a) **`User` ↔ `Role`**
- **Relación**: *Muchos a Uno*.
- **Descripción**:
- Cada usuario tiene un rol asignado.
- Un rol puede estar asociado a múltiples usuarios.
#### b) **`Role` ↔ `Permission`**
- **Relación**: *Muchos a Muchos*.
- **Descripción**:
- Un rol puede tener múltiples permisos asociados.
- Un permiso puede estar asociado a múltiples roles.
#### c) **`Student` ↔ `StudentHistory`**
- **Relación**: *Uno a Muchos*.
- **Descripción**:
- Cada estudiante tiene un historial único que registra sus actividades.
#### d) **`Notification` ↔ `User`**
- **Relación**: *Muchos a Uno*.
- **Descripción**:
- Un usuario puede recibir múltiples notificaciones.
- Cada notificación está asociada a un único usuario.
- **`InvoiceService`**: Gestiona la creación, modificación y validación de facturas. Calcula automáticamente el total con IVA y permite obtener facturas por usuario.
- **`InvoiceLineService`**: Administra las líneas de factura, que representan los ítems individuales facturados. Permite agregar o eliminar líneas dentro de una factura existente.
- **`PaymentService`**: Gestiona los pagos asociados a facturas. Soporta pagos parciales y actualiza el estado de la factura dependiendo del monto abonado.
- **`ProductServiceService`**: Controla la creación, actualización y eliminación de productos o servicios que pueden ser facturados. Cada producto se asocia con un tipo de IVA.
- **`IVATypeService`**: Administra los tipos de IVA disponibles, sus porcentajes y descripciones. Se utiliza para el cálculo fiscal en las líneas de factura.