Skip to main content

Modelos de datos

Todas las data classes del paquete models están anotadas con @Serializable de kotlinx.serialization. Son inmutables por defecto y se usan tanto para deserializar respuestas de Supabase como para serializar los cuerpos de las peticiones de inserción y actualización.


Usuario​

Fichero: models/Usuario.kt Tabla Supabase: usuarios

@Serializable
data class Usuario(
@SerialName("id")
val id: Int = 0,
val nombre: String,
val dni: String,
val contraseniaHash: String,
val admin: Int,
val premium: Boolean,
val email: String? = null,
val telefono: String? = null,
val foto: String? = null,
@SerialName("fecha_ini_prem")
val fechaInicio: String? = null,
@SerialName("fecha_fin_prem")
val fechaFin: String? = null
)
CampoTipoNullableDescripción
idIntNoPK autoincremental (default 0 al insertar)
nombreStringNoNombre completo
dniStringNoDNI usado como credencial de login
contraseniaHashStringNoContraseña (texto plano en esta versión)
adminIntNo0 = usuario, 1 = administrador
premiumBooleanNoEstado de suscripción
emailString?SíCorreo electrónico
telefonoString?SíTeléfono de contacto
fotoString?SíImagen de perfil en Base64
fechaInicioString?SíFecha de inicio de la suscripción Premium (yyyy-MM-dd)
fechaFinString?SíFecha de fin de la suscripción Premium (yyyy-MM-dd)

Los campos fechaInicio y fechaFin se leen en ProfileViewModel para calcular los días restantes de suscripción Premium y mostrarlos en ProfileScreen.


SesionData​

Fichero: models/SesionData.kt

data class SesionData(
val userId: Int,
val userName: String,
val isAdmin: Boolean,
val isPremium: Boolean,
val token: String = ""
)

Modelo usado por SecureSessionManager para representar la sesión persistida del usuario. No está anotado con @Serializable porque no se serializa a JSON; se almacena campo a campo en SharedPreferences.


Maquina​

Fichero: models/Maquina.kt Tabla Supabase: maquinas

@Serializable
data class Maquina(
val id: Int,
val nombre: String,
val tipo: String? = null,
val estado: Int = 0,
val descripcion: String? = null,
val operativa: Boolean = true,
val foto: String? = null,
val mantenimiento_desde: String? = null,
val mantenimiento_hasta: String? = null
)
CampoTipoNullableDescripción
idIntNoPK autoincremental
nombreStringNoNombre de la máquina
tipoString?SíCategoría de ejercicio
estadoIntNoCampo de estado genérico (valor por defecto 0)
descripcionString?SíDescripción detallada
operativaBooleanNotrue = disponible para reservas
fotoString?SíImagen de la máquina en Base64
mantenimiento_desdeString?SíInicio del periodo de mantenimiento (yyyy-MM-dd HH:mm)
mantenimiento_hastaString?SíFin del periodo de mantenimiento (yyyy-MM-dd HH:mm)

Reserva​

Fichero: models/Reserva.kt Tabla Supabase: reservas

@Serializable
data class Reserva(
val id: Int? = null,
@SerialName("id_usuario") val idUsuario: Int,
@SerialName("id_maquina") val idMaquina: Int,
val fecha: String,
@SerialName("hora_inicio") val horaInicio: String,
@SerialName("hora_fin") val horaFin: String,
val estado: Boolean = true
)
CampoTipoNullableDescripción
idInt?SíPK (null al insertar, Supabase lo asigna)
idUsuarioIntNoFK → usuarios.id
idMaquinaIntNoFK → maquinas.id
fechaStringNoFecha de la reserva (yyyy-MM-dd)
horaInicioStringNoHora de inicio (HH:mm)
horaFinStringNoHora de fin (HH:mm). Máximo 60 minutos después de horaInicio
estadoBooleanNotrue = activa, false = cancelada

ReservaConDetalles​

Data class extendida para consultas con relaciones embebidas (JOIN implícito de PostgREST).

@Serializable
data class ReservaConDetalles(
val id: Int,
val fecha: String,
@SerialName("hora_inicio") val horaInicio: String,
@SerialName("hora_fin") val horaFin: String,
val estado: Boolean,
@SerialName("usuarios") val usuario: Usuario? = null,
@SerialName("maquinas") val maquina: Maquina? = null
)

Se obtiene con la columna "*, usuarios(*), maquinas(*)".


Plato​

Fichero: models/Plato.kt Tabla Supabase: platos

@Serializable
data class Plato(
val id: Int? = null,
@SerialName("id_usuario") val idUsuario: Int? = null,
val nombre: String,
val descripcion: String? = null,
val calorias: Double? = null,
@SerialName("imagen_url") val imagenUrl: String? = null,
@SerialName("fecha_subida") val fechaSubida: String? = null,
val visibilidad: Boolean = true,
val tiempo: String? = null,
val aceptado: Boolean = false
)
CampoTipoNullableDescripción
idInt?SíPK (null al insertar)
idUsuarioInt?SíFK → usuarios.id (null para platos del sistema)
nombreStringNoNombre del plato
descripcionString?SíReceta o descripción
caloriasDouble?SíCalorías por ración
imagenUrlString?SíCadena Base64 de la imagen
fechaSubidaString?SíTimestamp de creación
visibilidadBooleanNotrue = visible en el catálogo
tiempoString?SíTiempo de preparación en texto libre (p. ej., "30 minutos")
aceptadoBooleanNofalse = pendiente de moderación por administrador

PesoUsuario​

Fichero: models/PesoUsuario.kt Tabla Supabase: peso_usuario

@Serializable
data class PesoUsuario(
val id: Int? = null,
@SerialName("id_usuario") val idUsuario: Int,
val peso: Double,
val fecha: String
)
CampoTipoNullableDescripción
idInt?SíPK (null al insertar)
idUsuarioIntNoFK → usuarios.id
pesoDoubleNoPeso en kilogramos
fechaStringNoFecha del registro (yyyy-MM-dd)

Pago​

Fichero: models/Pago.kt Tabla Supabase: pagos

@Serializable
data class Pago(
val id: Int? = null,
@SerialName("id_usuario") val idUsuario: Int,
val monto: Double,
@SerialName("fecha_pago") val fechaPago: String,
val tipo: String,
@SerialName("metodo_pago") val metodoPago: String
)
CampoTipoNullableDescripción
idInt?SíPK (null al insertar)
idUsuarioIntNoFK → usuarios.id
montoDoubleNoImporte en euros
fechaPagoStringNoFecha del pago (yyyy-MM-dd)
tipoStringNoModalidad: Mensual, Semestral, Anual
metodoPagoStringNoMétodo: Tarjeta, Bizum