Implementados módulos base de Fase 6: 1. WALL OF FAME (base) - Modelo de base de datos - Servicio CRUD - Controladores - Endpoints: GET /wall-of-fame/* 2. ACHIEVEMENTS/LOGROS (base) - Modelo de logros desbloqueables - Servicio de progreso - Controladores base - Endpoints: GET /achievements/* 3. QR CHECK-IN (completo) - Generación de códigos QR - Validación y procesamiento - Check-in/check-out - Endpoints: /checkin/* 4. BASE DE DATOS - Tablas: wall_of_fame, achievements, qr_codes, check_ins - Tablas preparadas: equipment, orders, notifications, activities Estructura lista para: - Equipment/Material rental - Orders/Servicios del club - Wearables integration - Challenges/Retos Nota: Algunos módulos avanzados requieren ajustes finales.
229 lines
7.4 KiB
SQL
229 lines
7.4 KiB
SQL
-- Fase 6: Extras y Diferenciadores
|
|
|
|
-- Wall of Fame
|
|
CREATE TABLE IF NOT EXISTS wall_of_fame_entries (
|
|
id TEXT PRIMARY KEY,
|
|
tournament_id TEXT,
|
|
title TEXT NOT NULL,
|
|
description TEXT,
|
|
winners TEXT NOT NULL, -- JSON array
|
|
category TEXT NOT NULL DEFAULT 'TOURNAMENT',
|
|
image_url TEXT,
|
|
event_date DATETIME NOT NULL,
|
|
is_active BOOLEAN DEFAULT 1,
|
|
featured BOOLEAN DEFAULT 0,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (tournament_id) REFERENCES tournaments(id) ON DELETE SET NULL
|
|
);
|
|
|
|
-- Achievements (Logros)
|
|
CREATE TABLE IF NOT EXISTS achievements (
|
|
id TEXT PRIMARY KEY,
|
|
code TEXT UNIQUE NOT NULL,
|
|
name TEXT NOT NULL,
|
|
description TEXT,
|
|
category TEXT NOT NULL DEFAULT 'GAMES',
|
|
icon TEXT,
|
|
color TEXT DEFAULT '#16a34a',
|
|
requirement_type TEXT NOT NULL,
|
|
requirement_value INTEGER NOT NULL,
|
|
points_reward INTEGER DEFAULT 0,
|
|
is_active BOOLEAN DEFAULT 1
|
|
);
|
|
|
|
-- User Achievements
|
|
CREATE TABLE IF NOT EXISTS user_achievements (
|
|
id TEXT PRIMARY KEY,
|
|
user_id TEXT NOT NULL,
|
|
achievement_id TEXT NOT NULL,
|
|
unlocked_at DATETIME,
|
|
progress INTEGER DEFAULT 0,
|
|
is_completed BOOLEAN DEFAULT 0,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (achievement_id) REFERENCES achievements(id) ON DELETE CASCADE,
|
|
UNIQUE(user_id, achievement_id)
|
|
);
|
|
|
|
-- Challenges (Retos)
|
|
CREATE TABLE IF NOT EXISTS challenges (
|
|
id TEXT PRIMARY KEY,
|
|
title TEXT NOT NULL,
|
|
description TEXT,
|
|
type TEXT NOT NULL DEFAULT 'WEEKLY',
|
|
requirement_type TEXT NOT NULL,
|
|
requirement_value INTEGER NOT NULL,
|
|
start_date DATETIME NOT NULL,
|
|
end_date DATETIME NOT NULL,
|
|
reward_points INTEGER DEFAULT 0,
|
|
participants TEXT DEFAULT '[]', -- JSON array
|
|
winners TEXT DEFAULT '[]', -- JSON array
|
|
is_active BOOLEAN DEFAULT 1
|
|
);
|
|
|
|
-- User Challenges
|
|
CREATE TABLE IF NOT EXISTS user_challenges (
|
|
id TEXT PRIMARY KEY,
|
|
user_id TEXT NOT NULL,
|
|
challenge_id TEXT NOT NULL,
|
|
progress INTEGER DEFAULT 0,
|
|
is_completed BOOLEAN DEFAULT 0,
|
|
completed_at DATETIME,
|
|
reward_claimed BOOLEAN DEFAULT 0,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (challenge_id) REFERENCES challenges(id) ON DELETE CASCADE,
|
|
UNIQUE(user_id, challenge_id)
|
|
);
|
|
|
|
-- QR Codes
|
|
CREATE TABLE IF NOT EXISTS qr_codes (
|
|
id TEXT PRIMARY KEY,
|
|
code TEXT UNIQUE NOT NULL,
|
|
type TEXT NOT NULL DEFAULT 'BOOKING_CHECKIN',
|
|
reference_id TEXT NOT NULL,
|
|
expires_at DATETIME NOT NULL,
|
|
used_at DATETIME,
|
|
used_by TEXT,
|
|
is_active BOOLEAN DEFAULT 1,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (used_by) REFERENCES users(id) ON DELETE SET NULL
|
|
);
|
|
|
|
-- Check-ins
|
|
CREATE TABLE IF NOT EXISTS check_ins (
|
|
id TEXT PRIMARY KEY,
|
|
booking_id TEXT NOT NULL,
|
|
user_id TEXT NOT NULL,
|
|
qr_code_id TEXT,
|
|
check_in_time DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
check_out_time DATETIME,
|
|
method TEXT DEFAULT 'QR',
|
|
verified_by TEXT,
|
|
notes TEXT,
|
|
FOREIGN KEY (booking_id) REFERENCES bookings(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (qr_code_id) REFERENCES qr_codes(id) ON DELETE SET NULL
|
|
);
|
|
|
|
-- Equipment Items
|
|
CREATE TABLE IF NOT EXISTS equipment_items (
|
|
id TEXT PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
description TEXT,
|
|
category TEXT NOT NULL DEFAULT 'RACKET',
|
|
brand TEXT,
|
|
model TEXT,
|
|
size TEXT,
|
|
condition TEXT DEFAULT 'GOOD',
|
|
hourly_rate INTEGER,
|
|
daily_rate INTEGER,
|
|
deposit_required INTEGER DEFAULT 0,
|
|
quantity_total INTEGER DEFAULT 1,
|
|
quantity_available INTEGER DEFAULT 1,
|
|
image_url TEXT,
|
|
is_active BOOLEAN DEFAULT 1
|
|
);
|
|
|
|
-- Equipment Rentals
|
|
CREATE TABLE IF NOT EXISTS equipment_rentals (
|
|
id TEXT PRIMARY KEY,
|
|
user_id TEXT NOT NULL,
|
|
items TEXT NOT NULL, -- JSON array
|
|
booking_id TEXT,
|
|
start_date DATETIME NOT NULL,
|
|
end_date DATETIME NOT NULL,
|
|
total_cost INTEGER NOT NULL,
|
|
deposit_amount INTEGER DEFAULT 0,
|
|
status TEXT DEFAULT 'RESERVED',
|
|
picked_up_at DATETIME,
|
|
returned_at DATETIME,
|
|
payment_id TEXT,
|
|
notes TEXT,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (booking_id) REFERENCES bookings(id) ON DELETE SET NULL
|
|
);
|
|
|
|
-- Menu Items
|
|
CREATE TABLE IF NOT EXISTS menu_items (
|
|
id TEXT PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
description TEXT,
|
|
category TEXT NOT NULL DEFAULT 'DRINK',
|
|
price INTEGER NOT NULL,
|
|
image_url TEXT,
|
|
is_available BOOLEAN DEFAULT 1,
|
|
preparation_time INTEGER,
|
|
is_active BOOLEAN DEFAULT 1
|
|
);
|
|
|
|
-- Orders
|
|
CREATE TABLE IF NOT EXISTS orders (
|
|
id TEXT PRIMARY KEY,
|
|
user_id TEXT NOT NULL,
|
|
booking_id TEXT NOT NULL,
|
|
court_id TEXT NOT NULL,
|
|
items TEXT NOT NULL, -- JSON array
|
|
status TEXT DEFAULT 'PENDING',
|
|
total_amount INTEGER NOT NULL,
|
|
payment_status TEXT DEFAULT 'PENDING',
|
|
payment_id TEXT,
|
|
notes TEXT,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (booking_id) REFERENCES bookings(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (court_id) REFERENCES courts(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- Notifications
|
|
CREATE TABLE IF NOT EXISTS notifications (
|
|
id TEXT PRIMARY KEY,
|
|
user_id TEXT NOT NULL,
|
|
type TEXT NOT NULL,
|
|
title TEXT NOT NULL,
|
|
message TEXT NOT NULL,
|
|
data TEXT, -- JSON
|
|
is_read BOOLEAN DEFAULT 0,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- User Activity (Wearables)
|
|
CREATE TABLE IF NOT EXISTS user_activities (
|
|
id TEXT PRIMARY KEY,
|
|
user_id TEXT NOT NULL,
|
|
source TEXT DEFAULT 'MANUAL',
|
|
activity_type TEXT DEFAULT 'PADEL_GAME',
|
|
start_time DATETIME NOT NULL,
|
|
end_time DATETIME NOT NULL,
|
|
duration INTEGER NOT NULL,
|
|
calories_burned INTEGER,
|
|
heart_rate_avg INTEGER,
|
|
heart_rate_max INTEGER,
|
|
steps INTEGER,
|
|
distance REAL,
|
|
metadata TEXT, -- JSON
|
|
booking_id TEXT,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (booking_id) REFERENCES bookings(id) ON DELETE SET NULL
|
|
);
|
|
|
|
-- Indexes
|
|
CREATE INDEX IF NOT EXISTS idx_wof_event_date ON wall_of_fame_entries(event_date);
|
|
CREATE INDEX IF NOT EXISTS idx_wof_featured ON wall_of_fame_entries(featured);
|
|
CREATE INDEX IF NOT EXISTS idx_achievements_category ON achievements(category);
|
|
CREATE INDEX IF NOT EXISTS idx_user_achievements_user ON user_achievements(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_challenges_dates ON challenges(start_date, end_date);
|
|
CREATE INDEX IF NOT EXISTS idx_qr_codes ON qr_codes(code);
|
|
CREATE INDEX IF NOT EXISTS idx_check_ins_booking ON check_ins(booking_id);
|
|
CREATE INDEX IF NOT EXISTS idx_check_ins_time ON check_ins(check_in_time);
|
|
CREATE INDEX IF NOT EXISTS idx_equipment_category ON equipment_items(category);
|
|
CREATE INDEX IF NOT EXISTS idx_rentals_user ON equipment_rentals(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_orders_status ON orders(status);
|
|
CREATE INDEX IF NOT EXISTS idx_notifications_user ON notifications(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_activities_user ON user_activities(user_id);
|