Passer au contenu principal

Modèles de données

Toutes les classes de données du package models sont annotées avec @Serializable de kotlinx.serialization. Ils sont immuables par défaut et sont utilisés à la fois pour désérialiser les réponses Supabase et pour sérialiser les corps des requêtes d'insertion et de mise à jour.


Utilisateur​

Ficher : 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
)
ChampTapezNullableDescriptif
idIntNonPK auto-incrémental (0 par défaut lors de l'insertion)
nombreStringNonNom complet
dniStringNonDNI utilisé comme identifiant de connexion
contraseniaHashStringNonMot de passe (texte brut dans cette version)
adminIntNon0 = utilisateur, 1 = administrateur
premiumBooleanNonStatut de l'abonnement
emailString?OuiCourriel
telefonoString?OuiNuméro de téléphone de contact
fotoString?OuiImage de profil en Base64
fechaInicioString?OuiDate de début de l'abonnement Premium (yyyy-MM-dd)
fechaFinString?OuiDate de fin de l'abonnement Premium (yyyy-MM-dd)

Les champs fechaInicio et fechaFin sont lus dans ProfileViewModel pour calculer les jours restants d'abonnement Premium et les afficher dans ProfileScreen.


##Données de session

Ficher : models/SesionData.kt

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

Modèle utilisé par SecureSessionManager pour représenter la session persistante de l'utilisateur. Il n'est pas annoté avec @Serializable car il n'est pas sérialisé en JSON ; il est stocké champ par champ dans SharedPreferences.


Machine​

Ficher : 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
)
ChampTapezNullableDescriptif
idIntNonPK auto-incrémental
nombreStringNonNom de l'appareil
tipoString?OuiCatégorie d'exercice
estadoIntNonChamp d'état générique (valeur par défaut 0)
descripcionString?OuiDescription détaillée
operativaBooleanNontrue = disponible pour les réservations
fotoString?OuiImage de la machine en Base64
mantenimiento_desdeString?OuiDébut de la période de maintenance (yyyy-MM-dd HH:mm)
mantenimiento_hastaString?OuiFin de la période de maintenance (yyyy-MM-dd HH:mm)

Réservation​

Ficher : 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
)
ChampTapezNullableDescriptif
idInt?OuiPK (nul à l'insertion, attribué par Supabase)
idUsuarioIntNonFK → utilisateurs.id
idMaquinaIntNonFK → machines.id
fechaStringNonDate de réservation (yyyy-MM-dd)
horaInicioStringNonHeure de début (HH:mm)
horaFinStringNonHeure de fin (HH:mm). Maximum 60 minutes après le horaInicio
estadoBooleanNontrue = actif, false = annulé

ReservaConDetalles​

Classe de données étendue pour les requêtes avec des relations intégrées (JOIN implicite 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
)

Il s'obtient avec la colonne "*, usuarios(*), maquinas(*)".


Platon​

Ficher : 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
)
ChampTapezNullableDescriptif
idInt?OuiPK (nul à l'insertion)
idUsuarioInt?OuiFK → users.id (nul pour les paraboles système)
nombreStringNonNom du plat
descripcionString?OuiRecette ou description
caloriasDouble?OuiCalories par portion
imagenUrlString?OuiImage Base64 Chaîne
fechaSubidaString?OuiHorodatage de création
visibilidadBooleanNontrue = visible dans le catalogue
tiempoString?OuiTemps de préparation en texte libre (par exemple "30 minutos")
aceptadoBooleanNonfalse = en attente de modération par l'administrateur

PesoUsuario​

Ficher : 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
)
ChampTapezNullableDescriptif
idInt?OuiPK (nul à l'insertion)
idUsuarioIntNonFK → utilisateurs.id
pesoDoubleNonPoids en kilogrammes
fechaStringNonDate d'inscription (yyyy-MM-dd)

Payer​

Ficher : 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
)
ChampTapezNullableDescriptif
idInt?OuiPK (nul à l'insertion)
idUsuarioIntNonFK → utilisateurs.id
montoDoubleNonMontant en euros
fechaPagoStringNonDate de paiement (yyyy-MM-dd)
tipoStringNonModalité : Mensuel, Semestriel, Annuel
metodoPagoStringNonMéthode : Carte, Bizum