Saltar al contingut principal

Models de dades

Totes les dates classes del paquet models estan anotades amb @Serializable de kotlinx.serialization. Són immutables per defecte i es fan servir tant per deserialitzar respostes de Supabase com per serialitzar els cossos de les peticions dinserció i actualització.


Usuari​

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
)
CampTipusNullableDescripció
idIntNoPK autoincremental (default 0 en inserir)
nombreStringNoNom complet
dniStringNoDNI usat com a credencial de login
contraseniaHashStringNoContrasenya (text pla en aquesta versió)
adminIntNo0 = usuari, 1 = administrador
premiumBooleanNoEstat de subscripció
emailString?SíCorreu electrònic
telefonoString?SíTelèfon de contacte
fotoString?Síimatge de perfil a Base64
fechaInicioString?SíData d'inici de subscripció Premium (yyyy-MM-dd)
fechaFinString?SíData de finalització de la subscripció Premium (yyyy-MM-dd)

Els camps fechaInicio i fechaFin es llegeixen a ProfileViewModel per calcular els dies restants de subscripció Premium i mostrar-los a ProfileScreen.


SesionData​

Fichero: models/SesionData.kt

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

Model utilitzat per SecureSessionManager per representar la sessió persistida de l'usuari. No està anotat amb @Serializable perquè no se serialitza a JSON; s'emmagatzema camp a camp a 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
)
CampTipusNullableDescripció
idIntNoPK autoincremental
nombreStringNoNom de la màquina
tipoString?SíCategoria d'exercici
estadoIntNoCamp d´estat genèric (valor per defecte 0)
descripcionString?SíDescripció detallada
operativaBooleanNotrue = disponible per a reserves
fotoString?Síimatge de la màquina a Base64
mantenimiento_desdeString?SíInici del període de manteniment (yyyy-MM-dd HH:mm)
mantenimiento_hastaString?SíFinal del període de manteniment (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
)
CampTipusNullableDescripció
idInt?SíPK (null en inserir, Supabase ho assigna)
idUsuarioIntNoFK → usuaris.id
idMaquinaIntNoFK → maquines.id
fechaStringNoData de la reserva (yyyy-MM-dd)
horaInicioStringNoHora d'inici (HH:mm)
horaFinStringNoHora de fi (HH:mm). Màxim 60 minuts després de horaInicio
estadoBooleanNotrue = activa, false = cancel·lada

ReservaConDetalles​

Data class estesa per a consultes amb relacions embegudes (JOIN implícit 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
)

S'obté amb la columna "*, usuarios(*), maquinas(*)".


Plató​

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
)
CampTipusNullableDescripció
idInt?SíPK (null en inserir)
idUsuarioInt?SíFK → usuaris.id (null per a plats del sistema)
nombreStringNoNom del plat
descripcionString?SíRecepta o descripció
caloriasDouble?SíCalories per ració
imagenUrlString?SíCadena Base64 de la imatge
fechaSubidaString?SíTimestamp de creació
visibilidadBooleanNotrue = visible al catàleg
tiempoString?SíTemps de preparació en text lliure (p. ex., "30 minutos")
aceptadoBooleanNofalse = pendent de moderació per 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
)
CampTipusNullableDescripció
idInt?SíPK (null en inserir)
idUsuarioIntNoFK → usuaris.id
pesoDoubleNoPes en quilograms
fechaStringNoData del registre (yyyy-MM-dd)

Pagament​

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
)
CampTipusNullableDescripció
idInt?SíPK (null en inserir)
idUsuarioIntNoFK → usuaris.id
montoDoubleNoImport a euros
fechaPagoStringNoData del pagament (yyyy-MM-dd)
tipoStringNoModalitat: Mensual, Semestral, Anual
metodoPagoStringNoMètode: Targeta, Bizum