Files
AnchorOS/supabase/migrations/20260115235900_seed_data.sql
Marco Gallegos 18071cfb63 refactor: migrate from old db/ to supabase CLI structure
- Migrated database schema from db/migrations to supabase/migrations
- Added Supabase CLI configuration (config.toml, .gitignore)
- Added kiosk role and amenities tables for touch kiosks
- Added notification system for artist alerts
- Added seed data with test locations and staff
- Removed old migration scripts and documentation
- Updated tasks_mg.md with current setup

Features:
- 2 locations: ANCHOR:23 - Via KLAVA and TEST
- Kiosk role for touch screen check-in/booking
- Amenities: coffee, cocktails, mocktails for clients
- Notifications when client arrives
- 1 staff + 4 artists + 1 kiosk per location
- Services: hair, nails, makeup, lashes
2026-01-16 00:01:32 -06:00

394 lines
21 KiB
SQL

-- ============================================
-- SEED DE DATOS - SALONOS (IDEMPOTENTE)
-- Ejecutar múltiples veces sin errores
-- ============================================
-- 1. Crear Locations (solo si no existen)
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA') THEN
INSERT INTO locations (name, timezone, address, phone, is_active)
VALUES
('ANCHOR:23 - Via KLAVA', 'America/Monterrey', 'Blvd. Moctezuma 2370, Los Pinos 2do y 3er Sector, 25204 Saltillo, Coah.', '+52 81 1234 5678', true);
END IF;
IF NOT EXISTS (SELECT 1 FROM locations WHERE name = 'TEST - Salón Principal') THEN
INSERT INTO locations (name, timezone, address, phone, is_active)
VALUES
('TEST - Salón Principal', 'America/Monterrey', 'Av. Masaryk 123, Polanco, Ciudad de México', '+52 55 2345 6789', true);
END IF;
END $$;
-- 2. Crear Resources (solo si no existen)
DO $$
BEGIN
-- Para ANCHOR:23 - Via KLAVA
FOR i IN 1..3 LOOP
IF NOT EXISTS (
SELECT 1 FROM resources r
JOIN locations l ON l.id = r.location_id
WHERE l.name = 'ANCHOR:23 - Via KLAVA' AND r.name = 'Sillón Pedicure ' || i
) THEN
INSERT INTO resources (location_id, name, type, capacity, is_active)
SELECT id, 'Sillón Pedicure ' || i, 'station', 1, true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
END LOOP;
FOR i IN 1..4 LOOP
IF NOT EXISTS (
SELECT 1 FROM resources r
JOIN locations l ON l.id = r.location_id
WHERE l.name = 'ANCHOR:23 - Via KLAVA' AND r.name = 'Estación Manicure ' || i
) THEN
INSERT INTO resources (location_id, name, type, capacity, is_active)
SELECT id, 'Estación Manicure ' || i, 'station', 1, true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
END LOOP;
IF NOT EXISTS (
SELECT 1 FROM resources r
JOIN locations l ON l.id = r.location_id
WHERE l.name = 'ANCHOR:23 - Via KLAVA' AND r.name = 'Estación Maquillaje'
) THEN
INSERT INTO resources (location_id, name, type, capacity, is_active)
SELECT id, 'Estación Maquillaje', 'station', 1, true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
IF NOT EXISTS (
SELECT 1 FROM resources r
JOIN locations l ON l.id = r.location_id
WHERE l.name = 'ANCHOR:23 - Via KLAVA' AND r.name = 'Cama Pestañas'
) THEN
INSERT INTO resources (location_id, name, type, capacity, is_active)
SELECT id, 'Cama Pestañas', 'station', 1, true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
-- Para TEST - Salón Principal
FOR i IN 1..3 LOOP
IF NOT EXISTS (
SELECT 1 FROM resources r
JOIN locations l ON l.id = r.location_id
WHERE l.name = 'TEST - Salón Principal' AND r.name = 'Sillón Pedicure ' || i
) THEN
INSERT INTO resources (location_id, name, type, capacity, is_active)
SELECT id, 'Sillón Pedicure ' || i, 'station', 1, true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
END LOOP;
FOR i IN 1..4 LOOP
IF NOT EXISTS (
SELECT 1 FROM resources r
JOIN locations l ON l.id = r.location_id
WHERE l.name = 'TEST - Salón Principal' AND r.name = 'Estación Manicure ' || i
) THEN
INSERT INTO resources (location_id, name, type, capacity, is_active)
SELECT id, 'Estación Manicure ' || i, 'station', 1, true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
END LOOP;
IF NOT EXISTS (
SELECT 1 FROM resources r
JOIN locations l ON l.id = r.location_id
WHERE l.name = 'TEST - Salón Principal' AND r.name = 'Estación Maquillaje'
) THEN
INSERT INTO resources (location_id, name, type, capacity, is_active)
SELECT id, 'Estación Maquillaje', 'station', 1, true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
IF NOT EXISTS (
SELECT 1 FROM resources r
JOIN locations l ON l.id = r.location_id
WHERE l.name = 'TEST - Salón Principal' AND r.name = 'Cama Pestañas'
) THEN
INSERT INTO resources (location_id, name, type, capacity, is_active)
SELECT id, 'Cama Pestañas', 'station', 1, true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
END $$;
-- 3. Crear Staff (solo si no existen por display_name)
DO $$
BEGIN
-- Admin Principal
IF NOT EXISTS (SELECT 1 FROM staff WHERE display_name = 'Admin Principal') THEN
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
SELECT gen_random_uuid(), id, 'admin', 'Admin Principal', '+52 55 1111 2222', true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
-- ANCHOR:23 - Via KLAVA: 1 Staff + 4 Artists + 1 Kiosk
IF NOT EXISTS (SELECT 1 FROM staff WHERE display_name = 'Staff KLAVA Coordinadora') THEN
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
SELECT gen_random_uuid(), id, 'staff', 'Staff KLAVA Coordinadora', '+52 55 3333 4444', true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
IF NOT EXISTS (SELECT 1 FROM staff WHERE display_name = 'Kiosk KLAVA Principal') THEN
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
SELECT gen_random_uuid(), id, 'kiosk', 'Kiosk KLAVA Principal', '+52 55 3333 0000', true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
IF NOT EXISTS (SELECT 1 FROM staff WHERE display_name = 'Artist KLAVA María García') THEN
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
SELECT gen_random_uuid(), id, 'artist', 'Artist KLAVA María García', '+52 55 4444 5555', true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
IF NOT EXISTS (SELECT 1 FROM staff WHERE display_name = 'Artist KLAVA Ana Rodríguez') THEN
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
SELECT gen_random_uuid(), id, 'artist', 'Artist KLAVA Ana Rodríguez', '+52 55 5555 6666', true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
IF NOT EXISTS (SELECT 1 FROM staff WHERE display_name = 'Artist KLAVA Sofía López') THEN
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
SELECT gen_random_uuid(), id, 'artist', 'Artist KLAVA Sofía López', '+52 55 5555 7777', true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
IF NOT EXISTS (SELECT 1 FROM staff WHERE display_name = 'Artist KLAVA Valentina Ruiz') THEN
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
SELECT gen_random_uuid(), id, 'artist', 'Artist KLAVA Valentina Ruiz', '+52 55 5555 8888', true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
-- TEST - Salón Principal: 1 Staff + 4 Artists + 1 Kiosk
IF NOT EXISTS (SELECT 1 FROM staff WHERE display_name = 'Staff Test Coordinador') THEN
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
SELECT gen_random_uuid(), id, 'staff', 'Staff Test Coordinador', '+52 55 6666 1111', true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
IF NOT EXISTS (SELECT 1 FROM staff WHERE display_name = 'Kiosk Test Principal') THEN
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
SELECT gen_random_uuid(), id, 'kiosk', 'Kiosk Test Principal', '+52 55 6666 0000', true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
IF NOT EXISTS (SELECT 1 FROM staff WHERE display_name = 'Artist Test Carla López') THEN
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
SELECT gen_random_uuid(), id, 'artist', 'Artist Test Carla López', '+52 55 7777 8888', true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
IF NOT EXISTS (SELECT 1 FROM staff WHERE display_name = 'Artist Test Daniela García') THEN
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
SELECT gen_random_uuid(), id, 'artist', 'Artist Test Daniela García', '+52 55 7777 9999', true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
IF NOT EXISTS (SELECT 1 FROM staff WHERE display_name = 'Artist Test Andrea Martínez') THEN
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
SELECT gen_random_uuid(), id, 'artist', 'Artist Test Andrea Martínez', '+52 55 7777 0000', true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
IF NOT EXISTS (SELECT 1 FROM staff WHERE display_name = 'Artist Test Fernanda Torres') THEN
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
SELECT gen_random_uuid(), id, 'artist', 'Artist Test Fernanda Torres', '+52 55 7777 1111', true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
END $$;
-- 4. Crear Services (solo si no existen)
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM services WHERE name = 'Corte y Estilizado') THEN
INSERT INTO services (name, description, duration_minutes, base_price, requires_dual_artist, premium_fee_enabled, is_active)
VALUES ('Corte y Estilizado', 'Corte de cabello profesional con lavado y estilizado', 60, 500.00, false, false, true);
END IF;
IF NOT EXISTS (SELECT 1 FROM services WHERE name = 'Color Completo') THEN
INSERT INTO services (name, description, duration_minutes, base_price, requires_dual_artist, premium_fee_enabled, is_active)
VALUES ('Color Completo', 'Tinte completo con protección capilar', 120, 1200.00, false, true, true);
END IF;
IF NOT EXISTS (SELECT 1 FROM services WHERE name = 'Balayage Premium') THEN
INSERT INTO services (name, description, duration_minutes, base_price, requires_dual_artist, premium_fee_enabled, is_active)
VALUES ('Balayage Premium', 'Técnica de balayage con productos premium', 180, 2000.00, true, true, true);
END IF;
IF NOT EXISTS (SELECT 1 FROM services WHERE name = 'Tratamiento Kératina') THEN
INSERT INTO services (name, description, duration_minutes, base_price, requires_dual_artist, premium_fee_enabled, is_active)
VALUES ('Tratamiento Kératina', 'Tratamiento de kératina para cabello dañado', 90, 1500.00, false, false, true);
END IF;
IF NOT EXISTS (SELECT 1 FROM services WHERE name = 'Peinado Evento') THEN
INSERT INTO services (name, description, duration_minutes, base_price, requires_dual_artist, premium_fee_enabled, is_active)
VALUES ('Peinado Evento', 'Peinado para eventos especiales', 45, 800.00, false, true, true);
END IF;
IF NOT EXISTS (SELECT 1 FROM services WHERE name = 'Pedicure Spa') THEN
INSERT INTO services (name, description, duration_minutes, base_price, requires_dual_artist, premium_fee_enabled, is_active)
VALUES ('Pedicure Spa', 'Pedicure completo con exfoliación y mascarilla', 60, 450.00, false, false, true);
END IF;
IF NOT EXISTS (SELECT 1 FROM services WHERE name = 'Manicure Gel') THEN
INSERT INTO services (name, description, duration_minutes, base_price, requires_dual_artist, premium_fee_enabled, is_active)
VALUES ('Manicure Gel', 'Manicure con esmalte de gel duradero', 45, 350.00, false, true, true);
END IF;
IF NOT EXISTS (SELECT 1 FROM services WHERE name = 'Uñas Acrílicas') THEN
INSERT INTO services (name, description, duration_minutes, base_price, requires_dual_artist, premium_fee_enabled, is_active)
VALUES ('Uñas Acrílicas', 'Aplicación de uñas acrílicas con diseño', 120, 800.00, false, true, true);
END IF;
IF NOT EXISTS (SELECT 1 FROM services WHERE name = 'Maquillaje Profesional') THEN
INSERT INTO services (name, description, duration_minutes, base_price, requires_dual_artist, premium_fee_enabled, is_active)
VALUES ('Maquillaje Profesional', 'Maquillaje para eventos especiales', 60, 1200.00, false, true, true);
END IF;
IF NOT EXISTS (SELECT 1 FROM services WHERE name = 'Extensión de Pestañas') THEN
INSERT INTO services (name, description, duration_minutes, base_price, requires_dual_artist, premium_fee_enabled, is_active)
VALUES ('Extensión de Pestañas', 'Aplicación de extensiones pestañas volumen 3D', 90, 1500.00, false, true, true);
END IF;
IF NOT EXISTS (SELECT 1 FROM services WHERE name = 'Servicio Express (Dual Artist)') THEN
INSERT INTO services (name, description, duration_minutes, base_price, requires_dual_artist, premium_fee_enabled, is_active)
VALUES ('Servicio Express (Dual Artist)', 'Servicio rápido con dos artists simultáneas', 30, 600.00, true, true, true);
END IF;
END $$;
-- 5. Crear Customers (solo si no existen por email)
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM customers WHERE email = 'sofia.ramirez@example.com') THEN
INSERT INTO customers (user_id, first_name, last_name, email, phone, tier, notes, total_spent, total_visits, last_visit_date, is_active)
VALUES (gen_random_uuid(), 'Sofía', 'Ramírez', 'sofia.ramirez@example.com', '+52 55 1111 1111', 'gold', 'Cliente VIP. Prefiere Artists María y Ana.', 15000.00, 25, '2025-12-20', true);
END IF;
IF NOT EXISTS (SELECT 1 FROM customers WHERE email = 'valentina.hernandez@example.com') THEN
INSERT INTO customers (user_id, first_name, last_name, email, phone, tier, notes, total_spent, total_visits, last_visit_date, is_active)
VALUES (gen_random_uuid(), 'Valentina', 'Hernández', 'valentina.hernandez@example.com', '+52 55 2222 2222', 'gold', 'Cliente regular. Prefiere horarios de la mañana.', 8500.00, 15, '2025-12-15', true);
END IF;
IF NOT EXISTS (SELECT 1 FROM customers WHERE email = 'camila.lopez@example.com') THEN
INSERT INTO customers (user_id, first_name, last_name, email, phone, tier, notes, total_spent, total_visits, last_visit_date, is_active)
VALUES (gen_random_uuid(), 'Camila', 'López', 'camila.lopez@example.com', '+52 55 3333 3333', 'free', 'Nueva cliente. Referida por Valentina.', 500.00, 1, '2025-12-10', true);
END IF;
IF NOT EXISTS (SELECT 1 FROM customers WHERE email = 'isabella.garcia@example.com') THEN
INSERT INTO customers (user_id, first_name, last_name, email, phone, tier, notes, total_spent, total_visits, last_visit_date, is_active)
VALUES (gen_random_uuid(), 'Isabella', 'García', 'isabella.garcia@example.com', '+52 55 4444 4444', 'gold', 'Cliente VIP. Requiere servicio de Balayage.', 22000.00, 30, '2025-12-18', true);
END IF;
END $$;
-- 6. Crear Amenities (cortesías para kiosks)
DO $$
BEGIN
-- ANCHOR:23 - Via KLAVA Amenities
IF NOT EXISTS (SELECT 1 FROM amenities WHERE name = 'Café Americano' AND location_id = (SELECT id FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA' LIMIT 1)) THEN
INSERT INTO amenities (location_id, name, description, category, is_active)
SELECT id, 'Café Americano', 'Café negro tradicional', 'coffee', true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
IF NOT EXISTS (SELECT 1 FROM amenities WHERE name = 'Café Latte' AND location_id = (SELECT id FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA' LIMIT 1)) THEN
INSERT INTO amenities (location_id, name, description, category, is_active)
SELECT id, 'Café Latte', 'Café con leche vaporizada', 'coffee', true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
IF NOT EXISTS (SELECT 1 FROM amenities WHERE name = 'Té Verde' AND location_id = (SELECT id FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA' LIMIT 1)) THEN
INSERT INTO amenities (location_id, name, description, category, is_active)
SELECT id, 'Té Verde', 'Té verde orgánico', 'coffee', true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
IF NOT EXISTS (SELECT 1 FROM amenities WHERE name = 'Cocktail Mojito' AND location_id = (SELECT id FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA' LIMIT 1)) THEN
INSERT INTO amenities (location_id, name, description, category, is_active)
SELECT id, 'Cocktail Mojito', 'Refresco de menta y limón', 'cocktail', true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
IF NOT EXISTS (SELECT 1 FROM amenities WHERE name = 'Mocktail Piña Colada' AND location_id = (SELECT id FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA' LIMIT 1)) THEN
INSERT INTO amenities (location_id, name, description, category, is_active)
SELECT id, 'Mocktail Piña Colada', 'Bebida tropical sin alcohol', 'mocktail', true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
IF NOT EXISTS (SELECT 1 FROM amenities WHERE name = 'Agua Mineral' AND location_id = (SELECT id FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA' LIMIT 1)) THEN
INSERT INTO amenities (location_id, name, description, category, is_active)
SELECT id, 'Agua Mineral', 'Agua mineral fresca', 'other', true
FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA';
END IF;
-- TEST - Salón Principal Amenities
IF NOT EXISTS (SELECT 1 FROM amenities WHERE name = 'Café Espresso' AND location_id = (SELECT id FROM locations WHERE name = 'TEST - Salón Principal' LIMIT 1)) THEN
INSERT INTO amenities (location_id, name, description, category, is_active)
SELECT id, 'Café Espresso', 'Café espresso intenso', 'coffee', true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
IF NOT EXISTS (SELECT 1 FROM amenities WHERE name = 'Café Cappuccino' AND location_id = (SELECT id FROM locations WHERE name = 'TEST - Salón Principal' LIMIT 1)) THEN
INSERT INTO amenities (location_id, name, description, category, is_active)
SELECT id, 'Café Cappuccino', 'Café con espuma de leche', 'coffee', true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
IF NOT EXISTS (SELECT 1 FROM amenities WHERE name = 'Té Chai' AND location_id = (SELECT id FROM locations WHERE name = 'TEST - Salón Principal' LIMIT 1)) THEN
INSERT INTO amenities (location_id, name, description, category, is_active)
SELECT id, 'Té Chai', 'Té chai con especias', 'coffee', true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
IF NOT EXISTS (SELECT 1 FROM amenities WHERE name = 'Cocktail Margarita' AND location_id = (SELECT id FROM locations WHERE name = 'TEST - Salón Principal' LIMIT 1)) THEN
INSERT INTO amenities (location_id, name, description, category, is_active)
SELECT id, 'Cocktail Margarita', 'Cóctel clásico de tequila', 'cocktail', true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
IF NOT EXISTS (SELECT 1 FROM amenities WHERE name = 'Mocktail Limonada' AND location_id = (SELECT id FROM locations WHERE name = 'TEST - Salón Principal' LIMIT 1)) THEN
INSERT INTO amenities (location_id, name, description, category, is_active)
SELECT id, 'Mocktail Limonada', 'Limonada fresca natural', 'mocktail', true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
IF NOT EXISTS (SELECT 1 FROM amenities WHERE name = 'Revista de Moda' AND location_id = (SELECT id FROM locations WHERE name = 'TEST - Salón Principal' LIMIT 1)) THEN
INSERT INTO amenities (location_id, name, description, category, is_active)
SELECT id, 'Revista de Moda', 'Revistas de moda actual', 'other', true
FROM locations WHERE name = 'TEST - Salón Principal';
END IF;
END $$;
-- 7. Crear Invitaciones (para clientes Gold)
DO $$
DECLARE
week_start DATE;
customer_record RECORD;
BEGIN
week_start := get_week_start(CURRENT_DATE);
FOR customer_record IN
SELECT id FROM customers WHERE tier = 'gold' AND is_active = true
LOOP
PERFORM reset_weekly_invitations_for_customer(customer_record.id);
END LOOP;
END $$;
-- 8. Resumen de datos creados
DO $$
BEGIN
RAISE NOTICE '==========================================';
RAISE NOTICE 'SALONOS - SEED DE DATOS COMPLETADO';
RAISE NOTICE '==========================================';
RAISE NOTICE 'Locations: %', (SELECT COUNT(*) FROM locations);
RAISE NOTICE 'Resources: %', (SELECT COUNT(*) FROM resources);
RAISE NOTICE 'Staff: %', (SELECT COUNT(*) FROM staff);
RAISE NOTICE 'Services: %', (SELECT COUNT(*) FROM services);
RAISE NOTICE 'Customers: %', (SELECT COUNT(*) FROM customers);
RAISE NOTICE 'Amenities: %', (SELECT COUNT(*) FROM amenities);
RAISE NOTICE '==========================================';
RAISE NOTICE 'Base de datos lista para desarrollo';
RAISE NOTICE '==========================================';
END
$$;