Ir ao contido principal

Modelos de datos

Todas as clases de datos do paquete models están anotadas con @Serializable de kotlinx.serialization. Son inmutables por defecto e úsanse tanto para deserializar as respostas de Supabase como para serializar os corpos das solicitudes de inserción e 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
)
CampoTipoanulableDescrición
idIntNonPK autoincremental (por defecto 0 ao inserir)
nombreStringNonNome completo
dniStringNonDNI usado como credencial de inicio de sesión
contraseniaHashStringNonContrasinal (texto simple nesta versión)
adminIntNon0 = usuario, 1 = administrador
premiumBooleanNonEstado da subscrición
emailString?SiCorreo electrónico
telefonoString?SiTeléfono de contacto
fotoString?SiImaxe de perfil en Base64
fechaInicioString?SiData de inicio da subscrición Premium (yyyy-MM-dd)
fechaFinString?SiData de finalización da subscrición Premium (yyyy-MM-dd)

Os campos fechaInicio e fechaFin lense en ProfileViewModel para calcular os días restantes da subscrición Premium e mostralos en ProfileScreen.


##Datos da sesión

Fichero: models/SesionData.kt

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

Modelo utilizado por SecureSessionManager para representar a sesión persistente do usuario. Non está anotado con @Serializable porque non está serializado en JSON; gárdase campo por campo en SharedPreferences.


Máquina​

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
)
CampoTipoanulableDescrición
idIntNonPK autoincremental
nombreStringNonNome da máquina
tipoString?SiCategoría de exercicios
estadoIntNonCampo de estado xenérico (valor predeterminado 0)
descripcionString?SiDescrición detallada
operativaBooleanNontrue = dispoñible para reservas
fotoString?SiImaxe da máquina en Base64
mantenimiento_desdeString?SiInicio do período de mantemento (yyyy-MM-dd HH:mm)
mantenimiento_hastaString?SiFin do período de mantemento (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
)
CampoTipoanulableDescrición
idInt?SiPK (nulo na inserción, asignado por Supabase)
idUsuarioIntNonFK → usuarios.id
idMaquinaIntNonFK → máquinas.id
fechaStringNonData de reserva (yyyy-MM-dd)
horaInicioStringNonHora de inicio (HH:mm)
horaFinStringNonHora de finalización (HH:mm). Máximo 60 minutos despois de horaInicio
estadoBooleanNontrue = activo, false = cancelado

ReservaConDetalles​

Clase de datos ampliada para consultas con relacións incrustadas (JOIN implícito 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
)

Obtense coa columna "*, usuarios(*), maquinas(*)".


Platón​

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
)
CampoTipoanulableDescrición
idInt?SiPK (nulo na inserción)
idUsuarioInt?SiFK → users.id (nulo para as antenas do sistema)
nombreStringNonNome do prato
descripcionString?SiReceita ou descrición
caloriasDouble?SiCalorías por porción
imagenUrlString?SiCadea de imaxe Base64
fechaSubidaString?SiMarca de tempo de creación
visibilidadBooleanNontrue = visible no catálogo
tiempoString?SiTempo de preparación en texto libre (p. ex. "30 minutos")
aceptadoBooleanNonfalse = pendente de moderación polo 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
)
CampoTipoanulableDescrición
idInt?SiPK (nulo na inserción)
idUsuarioIntNonFK → usuarios.id
pesoDoubleNonPeso en quilogramos
fechaStringNonData de rexistro (yyyy-MM-dd)

Pagar​

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
)
CampoTipoanulableDescrición
idInt?SiPK (nulo na inserción)
idUsuarioIntNonFK → usuarios.id
montoDoubleNonImporte en euros
fechaPagoStringNonData de pago (yyyy-MM-dd)
tipoStringNonModalidade: Mensual, Semestral, Anual
metodoPagoStringNonMétodo: Tarxeta, Bizum