Pular para o conteúdo principal

Modelos de dados

Todas as classes de dados no pacote models são anotadas com @Serializable de kotlinx.serialization. Eles são imutáveis ​​por padrão e são usados ​​tanto para desserializar as respostas do Supabase quanto para serializar os corpos das solicitações de inserção e atualização.


Usuário​

Ficha: 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
)
CampoTipoAnulávelDescrição
idIntNãoPK autoincremental (padrão 0 ao inserir)
nombreStringNãoNome completo
dniStringNãoDNI usado como credencial de login
contraseniaHashStringNãoSenha (texto simples nesta versão)
adminIntNão0 = usuário, 1 = administrador
premiumBooleanNãoStatus da assinatura
emailString?SimE-mail
telefonoString?SimTelefone de contato
fotoString?SimImagem de perfil em Base64
fechaInicioString?SimData de início da assinatura premium (yyyy-MM-dd)
fechaFinString?SimData de término da assinatura premium (yyyy-MM-dd)

Os campos fechaInicio e fechaFin são lidos em ProfileViewModel para calcular os dias restantes da assinatura Premium e exibi-los em ProfileScreen.


##Dados da Sessão

Ficha: 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 a sessão persistente do usuário. Não é anotado com @Serializable porque não é serializado para JSON; ele é armazenado campo por campo em SharedPreferences.


Máquina​

Ficha: 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
)
CampoTipoAnulávelDescrição
idIntNãoPK autoincremental
nombreStringNãoNome da máquina
tipoString?SimCategoria de exercício
estadoIntNãoCampo de status genérico (valor padrão 0)
descripcionString?SimDescrição detalhada
operativaBooleanNãotrue = disponível para reservas
fotoString?SimImagem da máquina em Base64
mantenimiento_desdeString?SimInício do período de manutenção (yyyy-MM-dd HH:mm)
mantenimiento_hastaString?SimFim do período de manutenção (yyyy-MM-dd HH:mm)

Reserva​

Ficha: 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
)
CampoTipoAnulávelDescrição
idInt?SimPK (nulo na inserção, atribuído pela Supabase)
idUsuarioIntNãoFK → usuários.id
idMaquinaIntNãoFK → máquinas.id
fechaStringNãoData da reserva (yyyy-MM-dd)
horaInicioStringNãoHora de início (HH:mm)
horaFinStringNãoHora de término (HH:mm). Máximo 60 minutos após horaInicio
estadoBooleanNãotrue = ativo, false = cancelado

ReservaConDetalles​

Classe de dados estendida para consultas com relacionamentos incorporados (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
)

É obtido com a coluna "*, usuarios(*), maquinas(*)".


Platão​

Ficha: 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
)
CampoTipoAnulávelDescrição
idInt?SimPK (nulo na inserção)
idUsuarioInt?SimFK → users.id (nulo para pratos do sistema)
nombreStringNãoNome do prato
descripcionString?SimReceita ou descrição
caloriasDouble?SimCalorias por porção
imagenUrlString?SimImagem Base64 String
fechaSubidaString?SimCarimbo de data e hora de criação
visibilidadBooleanNãotrue = visível no catálogo
tiempoString?SimTempo de preparação em texto livre (ex. "30 minutos")
aceptadoBooleanNãofalse = moderação pendente pelo administrador

PesoUsuario​

Ficha: 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
)
CampoTipoAnulávelDescrição
idInt?SimPK (nulo na inserção)
idUsuarioIntNãoFK → usuários.id
pesoDoubleNãoPeso em quilogramas
fechaStringNãoData de registo (yyyy-MM-dd)

Pagar​

Ficha: 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
)
CampoTipoAnulávelDescrição
idInt?SimPK (nulo na inserção)
idUsuarioIntNãoFK → usuários.id
montoDoubleNãoMontante em euros
fechaPagoStringNãoData de pagamento (yyyy-MM-dd)
tipoStringNãoModalidade: Mensal, Semestral, Anual
metodoPagoStringNãoMétodo: Cartão, Bizum