Zum Hauptinhalt springen

Datenmodelle

Alle Datenklassen im Paket models sind mit @Serializable von kotlinx.serialization annotiert. Sie sind standardmäßig unveränderlich und werden sowohl zum Deserialisieren von Supabase-Antworten als auch zum Serialisieren der Hauptteile von Einfüge- und Aktualisierungsanforderungen verwendet.


Benutzer​

Datensatz: 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
)
FeldGeben Sieein NullableBeschreibung
idIntNeinAutoinkrementelle PK (Standard 0 beim Einfügen)
nombreStringNeinVollständiger Name
dniStringNeinDNI wird als Anmeldeinformation verwendet
contraseniaHashStringNeinPasswort (in dieser Version Klartext)
adminIntNein0 = Benutzer, 1 = Administrator
premiumBooleanNeinAbonnementstatus
emailString?JaE-Mail
telefonoString?JaKontakttelefonnummer
fotoString?JaProfilbild in Base64
fechaInicioString?JaStartdatum des Premium-Abonnements (yyyy-MM-dd)
fechaFinString?JaEnddatum des Premium-Abonnements (yyyy-MM-dd)

Die Felder fechaInicio und fechaFin werden in ProfileViewModel gelesen, um die verbleibenden Tage des Premium-Abonnements zu berechnen und sie in ProfileScreen anzuzeigen.


##Sitzungsdaten

Datenblatt: models/SesionData.kt

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

Von SecureSessionManager verwendetes Modell zur Darstellung der dauerhaften Sitzung des Benutzers. Es ist nicht mit @Serializable annotiert, da es nicht in JSON serialisiert ist. es wird Feld für Feld in SharedPreferences gespeichert.


Maschine​

Datenblatt: 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
)
FeldGeben Sieein NullableBeschreibung
idIntNeinAutoinkrementelle PK
nombreStringNeinMaschinenname
tipoString?JaÜbungskategorie
estadoIntNeinGenerisches Statusfeld (Standardwert 0)
descripcionString?JaDetaillierte Beschreibung
operativaBooleanNeintrue = für Reservierungen verfügbar
fotoString?JaBild der Maschine in Base64
mantenimiento_desdeString?JaBeginn des Wartungszeitraums (yyyy-MM-dd HH:mm)
mantenimiento_hastaString?JaEnde des Wartungszeitraums (yyyy-MM-dd HH:mm)

Reserva​

Datensatz: 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
)
FeldGeben Sieein NullableBeschreibung
idInt?JaPK (null beim Einfügen, zugewiesen von Supabase)
idUsuarioIntNeinFK → user.id
idMaquinaIntNeinFK →machines.id
fechaStringNeinReservierungsdatum (yyyy-MM-dd)
horaInicioStringNeinStartzeit (HH:mm)
horaFinStringNeinEndzeit (HH:mm). Maximal 60 Minuten nach horaInicio
estadoBooleanNeintrue = aktiv, false = abgebrochen

ReservaConDetalles​

Erweiterte Datenklasse für Abfragen mit eingebetteten Beziehungen (PostgREST implicit JOIN).

@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
)

Es wird mit der Spalte "*, usuarios(*), maquinas(*)" ermittelt.


Platon​

Datenblatt: 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
)
FeldGeben Sieein NullableBeschreibung
idInt?JaPK (null beim Einfügen)
idUsuarioInt?JaFK → user.id (null für Systemgerichte)
nombreStringNeinName des Gerichts
descripcionString?JaRezept oder Beschreibung
caloriasDouble?JaKalorien pro Portion
imagenUrlString?JaBild Base64-String
fechaSubidaString?JaErstellungszeitstempel
visibilidadBooleanNeintrue = im Katalog sichtbar
tiempoString?JaVorbereitungszeit im Freitext (z. B. "30 minutos")
aceptadoBooleanNeinfalse = Moderation durch Administrator ausstehend

PesoUsuario​

Datensatz: 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
)
FeldGeben Sieein NullableBeschreibung
idInt?JaPK (null beim Einfügen)
idUsuarioIntNeinFK → user.id
pesoDoubleNeinGewicht in Kilogramm
fechaStringNeinRegistrierungsdatum (yyyy-MM-dd)

Zahlen​

Datensatz: 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
)
FeldGeben Sieein NullableBeschreibung
idInt?JaPK (null beim Einfügen)
idUsuarioIntNeinFK → user.id
montoDoubleNeinBetrag in Euro
fechaPagoStringNeinZahlungsdatum (yyyy-MM-dd)
tipoStringNeinModalität: Monatlich, halbjährlich, jährlich
metodoPagoStringNeinMethode: Karte, Bizum