Modelos de datos
#نماذج البيانات
جميع فئات البيانات في الحزمة models تمت الإشارة إليها بـ @Serializable لـ kotlinx.serialization. إنها غير قابلة للتغيير بشكل افتراضي وتستخدم لإلغاء تسلسل استجابات Supabase ولتسلسل نصوص طلبات الإدراج والتحديث.
مستخدم
فيشيرو: models/Usuario.kt
الطبلة سوباباسي: 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
)
| المجال | اكتب | لاغية | الوصف |
|---|---|---|---|
id | Int | لا | PK التزايدي التلقائي (الافتراضي 0 عند الإدراج) |
nombre | String | لا | الاسم الكامل |
dni | String | لا | يستخدم DNI كبيانات اعتماد لتسجيل الدخول |
contraseniaHash | String | لا | كلمة المرور (نص عادي في هذا الإصدار) |
admin | Int | لا | 0 = المستخدم، 1 = المسؤول |
premium | Boolean | لا | حالة الاشتراك |
email | String? | نعم | البريد الإلكتروني |
telefono | String? | نعم | رقم هاتف الاتصال |
foto | String? | نعم | صورة الملف الشخصي في Base64 |
fechaInicio | String? | نعم | تاريخ بدء الاشتراك المميز (yyyy-MM-dd) |
fechaFin | String? | نعم | تاريخ انتهاء الاشتراك المميز (yyyy-MM-dd) |
تتم قراءة الحقول fechaInicio و fechaFin في ProfileViewModel لحساب الأيام المتبقية من الاشتراك المميز وعرضها في ProfileScreen.
##بيانات الجلسة
فيشيرو: models/SesionData.kt
data class SesionData(
val userId: Int,
val userName: String,
val isAdmin: Boolean,
val isPremium: Boolean,
val token: String = ""
)
النموذج المستخدم بواسطة SecureSessionManager لتمثيل الجلسة المستمرة للمستخدم. لم تتم إضافة تعليقات توضيحية إليه بـ @Serializable لأنه لم يتم تسلسله إلى JSON؛ يتم تخزينه حقلاً بحقل في SharedPreferences.
آلة
فيشيرو: models/Maquina.kt
الطبلة سوباباسي: 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
)
| المجال | اكتب | لاغية | الوصف |
|---|---|---|---|
id | Int | لا | تزايد تلقائي PK |
nombre | String | لا | اسم الآلة |
tipo | String? | نعم | فئة التمرين |
estado | Int | لا | حقل الحالة العامة (القيمة الافتراضية 0) |
descripcion | String? | نعم | وصف تفصيلي |
operativa | Boolean | لا | true = متاح للحجز |
foto | String? | نعم | صورة الجهاز في Base64 |
mantenimiento_desde | String? | نعم | بداية فترة الصيانة (yyyy-MM-dd HH:mm) |
mantenimiento_hasta | String? | نعم | نهاية فترة الصيانة (yyyy-MM-dd HH:mm) |
ريسيرفا
فيشيرو: models/Reserva.kt
الطبلة سوباباسي: 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
)
| المجال | اكتب | لاغية | الوصف |
|---|---|---|---|
id | Int? | نعم | PK (خالية عند الإدراج، تم تعيينها بواسطة Supabase) |
idUsuario | Int | لا | FK → users.id |
idMaquina | Int | لا | FK → Machines.id |
fecha | String | لا | تاريخ الحجز (yyyy-MM-dd) |
horaInicio | String | لا | وقت البدء (HH:mm) |
horaFin | String | لا | وقت الانتهاء (HH:mm). الحد الأقصى 60 دقيقة بعد horaInicio |
estado | Boolean | لا | true = نشط، false = ملغى |
ريسيرفاكونديتالي
فئة البيانات الموسعة للاستعلامات ذات العلاقات المضمنة (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
)
يتم الحصول عليه بالعمود "*, usuarios(*), maquinas(*)".
##أفلاطون
فيشيرو: models/Plato.kt
الطبلة سوباباسي: 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
)
| المجال | اكتب | لاغية | الوصف |
|---|---|---|---|
id | Int? | نعم | PK (فارغة عند الإدراج) |
idUsuario | Int? | نعم | FK → users.id (فارغ لأطباق النظام) |
nombre | String | لا | اسم الطبق |
descripcion | String? | نعم | وصفة أو وصف |
calorias | Double? | نعم | السعرات الحرارية لكل وجبة |
imagenUrl | String? | نعم | صورة Base64 سلسلة |
fechaSubida | String? | نعم | الطابع الزمني للإنشاء |
visibilidad | Boolean | لا | true = مرئي في الكتالوج |
tiempo | String? | نعم | وقت التحضير بالنص الحر (على سبيل المثال "30 minutos") |
aceptado | Boolean | لا | false = في انتظار الإشراف من قبل المسؤول |
بيزو أوسواريو
فيشيرو: models/PesoUsuario.kt
الطبلة سوباباسي: peso_usuario
@Serializable
data class PesoUsuario(
val id: Int? = null,
@SerialName("id_usuario") val idUsuario: Int,
val peso: Double,
val fecha: String
)
| المجال | اكتب | لاغية | الوصف |
|---|---|---|---|
id | Int? | نعم | PK (فارغة عند الإدراج) |
idUsuario | Int | لا | FK → users.id |
peso | Double | لا | الوزن بالكيلو جرام |
fecha | String | لا | تاريخ التسجيل (yyyy-MM-dd) |
يدفع
فيشيرو: models/Pago.kt
الطبلة سوباباسي: 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
)
| المجال | اكتب | لاغية | الوصف |
|---|---|---|---|
id | Int? | نعم | PK (فارغة عند الإدراج) |
idUsuario | Int | لا | FK → users.id |
monto | Double | لا | المبلغ باليورو |
fechaPago | String | لا | تاريخ الدفع (yyyy-MM-dd) |
tipo | String | لا | الطريقة: شهرية، نصف سنوية، سنوية |
metodoPago | String | لا | الطريقة: بطاقة، بيزوم |