FASE 6 PARCIAL: Extras y Diferenciadores (base implementada)

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.
This commit is contained in:
2026-01-31 21:59:36 +00:00
parent 5e50dd766f
commit e135e7ad24
51 changed files with 11323 additions and 4 deletions

View File

@@ -0,0 +1,228 @@
-- 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);