This commit is contained in:
Marco Gallegos
2026-01-15 16:32:15 -06:00
parent 4707ddbd5a
commit a2054ba403
2 changed files with 811 additions and 0 deletions

336
DASHBOARD_ONLY_GUIDE.md Normal file
View File

@@ -0,0 +1,336 @@
# 🚨 PUERTO 5432 BLOQUEADO - SOLUCIÓN SIMPLE
## ✅ SOLUCIÓN: USAR SUPABASE DASHBOARD
No necesitas scripts ni línea de comandos. Solo usa el navegador.
---
## 📋 PASO 1: EJECUTAR MIGRACIONES
### 1.1 Abrir Supabase SQL Editor
```
https://supabase.com/dashboard/project/pvvwbnybkadhreuqijsl/sql
```
### 1.2 Copiar Migración Completa
Copia el contenido de este archivo:
```
db/migrations/00_FULL_MIGRATION_FINAL.sql
```
### 1.3 Ejecutar
1. Pega el contenido en el SQL Editor
2. Haz clic en **"Run"** (botón azul arriba a la derecha)
3. Espera 10-30 segundos
### 1.4 Verificar
Al finalizar deberías ver:
```
===========================================
SALONOS - DATABASE MIGRATION COMPLETED
===========================================
✅ Tables created: 8
✅ Functions created: 14
✅ Triggers active: 17+
✅ RLS policies configured: 20+
✅ ENUM types created: 6
===========================================
```
---
## 📋 PASO 2: CREAR DATOS DE PRUEBA
### 2.1 Crear Locations
Copia esto en el SQL Editor y ejecuta:
```sql
INSERT INTO locations (name, timezone, address, phone, is_active)
VALUES
('Salón Principal - Centro', 'America/Mexico_City', 'Av. Reforma 222', '+52 55 1234 5678', true),
('Salón Norte - Polanco', 'America/Mexico_City', 'Av. Masaryk 123', '+52 55 2345 6789', true),
('Salón Sur - Coyoacán', 'America/Mexico_City', 'Calle Hidalgo 456', '+52 55 3456 7890', true);
```
### 2.2 Crear Resources
```sql
INSERT INTO resources (location_id, name, type, capacity, is_active)
SELECT
(SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1),
'Estación ' || generate_series(1,3)::TEXT,
'station',
1,
true
UNION ALL
SELECT
(SELECT id FROM locations WHERE name = 'Salón Norte - Polanco' LIMIT 1),
'Estación ' || generate_series(1,2)::TEXT,
'station',
1,
true
UNION ALL
SELECT
(SELECT id FROM locations WHERE name = 'Salón Sur - Coyoacán' LIMIT 1),
'Estación 1',
'station',
1,
true;
```
### 2.3 Crear Staff
```sql
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
VALUES
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1), 'admin', 'Admin Principal', '+52 55 1111 2222', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1), 'manager', 'Manager Centro', '+52 55 2222 3333', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Norte - Polanco' LIMIT 1), 'manager', 'Manager Polanco', '+52 55 6666 7777', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1), 'staff', 'Staff Coordinadora', '+52 55 3333 4444', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1), 'artist', 'Artist María García', '+52 55 4444 5555', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1), 'artist', 'Artist Ana Rodríguez', '+52 55 5555 6666', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Norte - Polanco' LIMIT 1), 'artist', 'Artist Carla López', '+52 55 7777 8888', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Sur - Coyoacán' LIMIT 1), 'artist', 'Artist Laura Martínez', '+52 55 8888 9999', true);
```
### 2.4 Crear Services
```sql
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', 60, 500.00, false, false, true),
('Color Completo', 'Tinte completo con protección capilar', 120, 1200.00, false, true, true),
('Balayage Premium', 'Técnica de balayage premium', 180, 2000.00, true, true, true),
('Tratamiento Kératina', 'Tratamiento para cabello dañado', 90, 1500.00, false, false, true),
('Peinado Evento', 'Peinado para eventos', 45, 800.00, false, true, true),
('Servicio Express (Dual Artist)', 'Servicio rápido con dos artists', 30, 600.00, true, true, true);
```
### 2.5 Crear Customers
```sql
INSERT INTO customers (user_id, first_name, last_name, email, phone, tier, notes, total_spent, total_visits, last_visit_date, is_active)
VALUES
(uuid_generate_v4(), '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),
(uuid_generate_v4(), 'Valentina', 'Hernández', 'valentina.hernandez@example.com', '+52 55 2222 2222', 'gold', 'Cliente regular. Prefiere mañanas.', 8500.00, 15, '2025-12-15', true),
(uuid_generate_v4(), 'Camila', 'López', 'camila.lopez@example.com', '+52 55 3333 3333', 'free', 'Nueva cliente. Referida por Valentina.', 500.00, 1, '2025-12-10', true),
(uuid_generate_v4(), 'Isabella', 'García', 'isabella.garcia@example.com', '+52 55 4444 4444', 'gold', 'Cliente VIP. Requiere Balayage.', 22000.00, 30, '2025-12-18', true);
```
### 2.6 Crear Invitaciones (para clientes Gold)
```sql
SELECT reset_weekly_invitations_for_customer((SELECT id FROM customers WHERE email = 'sofia.ramirez@example.com' LIMIT 1));
SELECT reset_weekly_invitations_for_customer((SELECT id FROM customers WHERE email = 'valentina.hernandez@example.com' LIMIT 1));
SELECT reset_weekly_invitations_for_customer((SELECT id FROM customers WHERE email = 'isabella.garcia@example.com' LIMIT 1));
```
### 2.7 Crear Bookings
```sql
INSERT INTO bookings (customer_id, staff_id, location_id, resource_id, service_id, start_time_utc, end_time_utc, status, deposit_amount, total_amount, is_paid, payment_reference, notes)
SELECT
(SELECT id FROM customers WHERE email = 'sofia.ramirez@example.com' LIMIT 1),
(SELECT id FROM staff WHERE display_name = 'Artist María García' LIMIT 1),
(SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1),
(SELECT id FROM resources WHERE location_id = (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1) LIMIT 1),
(SELECT id FROM services WHERE name = 'Balayage Premium' LIMIT 1),
NOW() + INTERVAL '1 day',
NOW() + INTERVAL '4 hours',
'confirmed',
200.00,
2000.00,
true,
'pay_test_001',
'Balayage Premium para Sofía'
UNION ALL
SELECT
(SELECT id FROM customers WHERE email = 'valentina.hernandez@example.com' LIMIT 1),
(SELECT id FROM staff WHERE display_name = 'Artist Ana Rodríguez' LIMIT 1),
(SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1),
(SELECT id FROM resources WHERE location_id = (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1) LIMIT 1),
(SELECT id FROM services WHERE name = 'Color Completo' LIMIT 1),
NOW() + INTERVAL '2 days',
NOW() + INTERVAL '4 hours',
'confirmed',
200.00,
1200.00,
true,
'pay_test_002',
'Color Completo para Valentina'
UNION ALL
SELECT
(SELECT id FROM customers WHERE email = 'camila.lopez@example.com' LIMIT 1),
(SELECT id FROM staff WHERE display_name = 'Artist María García' LIMIT 1),
(SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1),
(SELECT id FROM resources WHERE location_id = (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1) LIMIT 1),
(SELECT id FROM services WHERE name = 'Corte y Estilizado' LIMIT 1),
NOW() + INTERVAL '3 days',
NOW() + INTERVAL '1 hour',
'confirmed',
50.00,
500.00,
true,
'pay_test_003',
'Primer corte para Camila';
```
### 2.8 Verificar Datos Creados
```sql
SELECT 'Locations: ' || COUNT(*) as resumen FROM locations
UNION ALL
SELECT 'Resources: ' || COUNT(*) as resumen FROM resources
UNION ALL
SELECT 'Staff: ' || COUNT(*) as resumen FROM staff
UNION ALL
SELECT 'Services: ' || COUNT(*) as resumen FROM services
UNION ALL
SELECT 'Customers: ' || COUNT(*) as resumen FROM customers
UNION ALL
SELECT 'Invitaciones: ' || COUNT(*) as resumen FROM invitations WHERE status = 'pending'
UNION ALL
SELECT 'Bookings: ' || COUNT(*) as resumen FROM bookings;
```
**Resultado esperado:**
```
resumen
Locations: 3
Resources: 6
Staff: 8
Services: 6
Customers: 4
Invitaciones: 15
Bookings: 3
```
---
## 📋 PASO 3: CREAR USUARIOS AUTH
### 3.1 Ir a Supabase Auth
```
https://supabase.com/dashboard/project/pvvwbnybkadhreuqijsl/auth/users
```
### 3.2 Crear Usuarios (Manual)
Haz clic en **"Add user"** y crea estos usuarios uno por uno:
#### Admin
- **Email:** `admin@salonos.com`
- **Password:** `Admin123!`
- **Auto Confirm User:** ON
- **User Metadata (opcional):**
```json
{"role": "admin", "display_name": "Admin Principal"}
```
#### Customer Gold (para probar)
- **Email:** `sofia.ramirez@example.com`
- **Password:** `Customer123!`
- **Auto Confirm User:** ON
- **User Metadata (opcional):**
```json
{"tier": "gold", "display_name": "Sofía Ramírez"}
```
### 3.3 Actualizar Tablas con User IDs (Opcional)
Si quieres conectar los usuarios de Auth con las tablas staff/customers:
1. Ve a **Auth → Users**
2. Copia el **User ID** del usuario
3. En el SQL Editor, ejecuta:
```sql
-- Para actualizar customer
UPDATE customers
SET user_id = 'COPIA_EL_USER_ID_AQUI'
WHERE email = 'sofia.ramirez@example.com';
```
---
## 📋 PASO 4: PROBAR FUNCIONALIDADES
### 4.1 Probar Short ID
En el SQL Editor:
```sql
SELECT generate_short_id();
```
**Resultado:** Ej: `A3F7X2`
### 4.2 Probar Código de Invitación
```sql
SELECT generate_invitation_code();
```
**Resultado:** Ej: `X9J4K2M5N8`
### 4.3 Verificar Bookings
```sql
SELECT b.short_id, c.first_name || ' ' || c.last_name as customer, s.display_name as artist, svc.name as service, b.status
FROM bookings b
JOIN customers c ON b.customer_id = c.id
JOIN staff s ON b.staff_id = s.id
JOIN services svc ON b.service_id = svc.id
ORDER BY b.start_time_utc;
```
---
## ✅ CHECKLIST FINAL
- [ ] Migraciones ejecutadas en Supabase Dashboard
- [ ] 8 tablas creadas
- [ ] 14 funciones creadas
- [ ] 17+ triggers activos
- [ ] 20+ políticas RLS configuradas
- [ ] 3 locations creadas
- [ ] 6 resources creados
- [ ] 8 staff creados
- [ ] 6 services creados
- [ ] 4 customers creados
- [ ] 15 invitaciones creadas
- [ ] 3+ bookings creados
- [ ] Usuarios de Auth creados (admin + customer)
- [ ] Short ID generable
- [ ] Código de invitación generable
---
## 🎯 PRÓXIMOS PASOS
Una vez que todo esté completo:
1.**Fase 1.1 y 1.2 completadas**
2. 🚀 **Continuar con desarrollo del frontend** (The Boutique / The HQ)
3. 🚀 **Implementar Tarea 1.3** (Short ID & Invitaciones - backend)
4. 🚀 **Implementar Tarea 1.4** (CRM Base - endpoints CRUD)
---
## 💡 NOTA FINAL
**No necesitas scripts de línea de comandos.**
Todo lo que necesitas hacer está en **Supabase Dashboard**:
1. Ir a: https://supabase.com/dashboard/project/pvvwbnybkadhreuqijsl/sql
2. Copiar y pegar el SQL
3. Hacer clic en **"Run"**
¡Eso es todo! 🎉

475
tasks_mg.md Normal file
View File

@@ -0,0 +1,475 @@
# 📋 TASKS MAÑANA - SalonOS
**Fecha:** Viernes 16 de enero, 2026
**Tiempo estimado:** 30-45 minutos
**Modo:** Solo usar Supabase Dashboard (no scripts)
---
## ✅ LO QUE NECESITAS ANTES DE EMPEZAR
- [ ] Laptop con internet
- [ ] Credenciales de Supabase (ya las tienes)
- [ ] Abrir este archivo (`tasks_mg.md`)
---
## 📋 PASO 1: EJECUTAR MIGRACIONES (10 min)
### 1.1 Abrir SQL Editor
1. Ir a: `https://supabase.com/dashboard/project/pvvwbnybkadhreuqijsl/sql`
2. Clic en "New query"
### 1.2 Copiar y Ejecutar Migración
1. Abrir archivo: `db/migrations/00_FULL_MIGRATION_FINAL.sql`
2. Copiar TODO el contenido (Ctrl+A, Ctrl+C)
3. Pegar en SQL Editor (Ctrl+V)
4. Clic en botón azul "Run"
5. Esperar 10-30 segundos
### 1.3 Verificar que esté correcto
Deberías ver:
```
===========================================
SALONOS - DATABASE MIGRATION COMPLETED
===========================================
✅ Tables created: 8
✅ Functions created: 14
✅ Triggers active: 17+
✅ RLS policies configured: 20+
✅ ENUM types created: 6
===========================================
```
**Si ves ERROR:**
- Lee el mensaje de error
- Probablemente ya se ejecutó (es normal si ya lo hiciste antes)
- Continúa al siguiente paso
---
## 📋 PASO 2: CREAR DATOS DE PRUEBA (15 min)
### 2.1 Crear Locations
1. En el mismo SQL Editor, clic en "New query"
2. Copiar esto y ejecutar:
```sql
INSERT INTO locations (name, timezone, address, phone, is_active)
VALUES
('Salón Principal - Centro', 'America/Mexico_City', 'Av. Reforma 222, Centro Histórico, Ciudad de México', '+52 55 1234 5678', true),
('Salón Norte - Polanco', 'America/Mexico_City', 'Av. Masaryk 123, Polanco, Ciudad de México', '+52 55 2345 6789', true),
('Salón Sur - Coyoacán', 'America/Mexico_City', 'Calle Hidalgo 456, Coyoacán, Ciudad de México', '+52 55 3456 7890', true);
```
3. Deberías ver: `Success, no rows returned`
### 2.2 Crear Resources
1. Nuevo query, copiar y ejecutar:
```sql
INSERT INTO resources (location_id, name, type, capacity, is_active)
SELECT
(SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1),
'Estación ' || generate_series(1, 3)::TEXT,
'station',
1,
true
UNION ALL
SELECT
(SELECT id FROM locations WHERE name = 'Salón Norte - Polanco' LIMIT 1),
'Estación ' || generate_series(1, 2)::TEXT,
'station',
1,
true
UNION ALL
SELECT
(SELECT id FROM locations WHERE name = 'Salón Sur - Coyoacán' LIMIT 1),
'Estación 1',
'station',
1,
true;
```
2. Deberías ver: `Success, no rows returned`
### 2.3 Crear Staff
1. Nuevo query, copiar y ejecutar:
```sql
INSERT INTO staff (user_id, location_id, role, display_name, phone, is_active)
VALUES
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1), 'admin', 'Admin Principal', '+52 55 1111 2222', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1), 'manager', 'Manager Centro', '+52 55 2222 3333', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Norte - Polanco' LIMIT 1), 'manager', 'Manager Polanco', '+52 55 6666 7777', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1), 'staff', 'Staff Coordinadora', '+52 55 3333 4444', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1), 'artist', 'Artist María García', '+52 55 4444 5555', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1), 'artist', 'Artist Ana Rodríguez', '+52 55 5555 6666', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Norte - Polanco' LIMIT 1), 'artist', 'Artist Carla López', '+52 55 7777 8888', true),
(uuid_generate_v4(), (SELECT id FROM locations WHERE name = 'Salón Sur - Coyoacán' LIMIT 1), 'artist', 'Artist Laura Martínez', '+52 55 8888 9999', true);
```
2. Deberías ver: `Success, no rows returned`
### 2.4 Crear Services
1. Nuevo query, copiar y ejecutar:
```sql
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),
('Color Completo', 'Tinte completo con protección capilar', 120, 1200.00, false, true, true),
('Balayage Premium', 'Técnica de balayage con productos premium', 180, 2000.00, true, true, true),
('Tratamiento Kératina', 'Tratamiento de kératina para cabello dañado', 90, 1500.00, false, false, true),
('Peinado Evento', 'Peinado para eventos especiales', 45, 800.00, false, true, true),
('Servicio Express (Dual Artist)', 'Servicio rápido con dos artists simultáneas', 30, 600.00, true, true, true);
```
2. Deberías ver: `Success, no rows returned`
### 2.5 Crear Customers
1. Nuevo query, copiar y ejecutar:
```sql
INSERT INTO customers (user_id, first_name, last_name, email, phone, tier, notes, total_spent, total_visits, last_visit_date, is_active)
VALUES
(uuid_generate_v4(), '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),
(uuid_generate_v4(), '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),
(uuid_generate_v4(), 'Camila', 'López', 'camila.lopez@example.com', '+52 55 3333 3333', 'free', 'Nueva cliente. Referida por Valentina.', 500.00, 1, '2025-12-10', true),
(uuid_generate_v4(), '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);
```
2. Deberías ver: `Success, no rows returned`
### 2.6 Crear Invitaciones (solo para clientes Gold)
1. Nuevo query, copiar y ejecutar:
```sql
SELECT reset_weekly_invitations_for_customer((SELECT id FROM customers WHERE email = 'sofia.ramirez@example.com' LIMIT 1));
SELECT reset_weekly_invitations_for_customer((SELECT id FROM customers WHERE email = 'valentina.hernandez@example.com' LIMIT 1));
SELECT reset_weekly_invitations_for_customer((SELECT id FROM customers WHERE email = 'isabella.garcia@example.com' LIMIT 1));
```
2. Deberías ver:
```
reset_weekly_invitations_for_customer
-----------------------------------------
5
```
(Por cada cliente Gold, 3 veces = 15 total)
### 2.7 Crear Bookings de Prueba
1. Nuevo query, copiar y ejecutar:
```sql
INSERT INTO bookings (
customer_id,
staff_id,
location_id,
resource_id,
service_id,
start_time_utc,
end_time_utc,
status,
deposit_amount,
total_amount,
is_paid,
payment_reference,
notes
)
SELECT
(SELECT id FROM customers WHERE email = 'sofia.ramirez@example.com' LIMIT 1),
(SELECT id FROM staff WHERE display_name = 'Artist María García' LIMIT 1),
(SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1),
(SELECT id FROM resources WHERE location_id = (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1) LIMIT 1),
(SELECT id FROM services WHERE name = 'Balayage Premium' LIMIT 1),
NOW() + INTERVAL '1 day',
NOW() + INTERVAL '4 hours',
'confirmed',
200.00,
2000.00,
true,
'pay_test_001',
'Balayage Premium para Sofía'
UNION ALL
SELECT
(SELECT id FROM customers WHERE email = 'valentina.hernandez@example.com' LIMIT 1),
(SELECT id FROM staff WHERE display_name = 'Artist Ana Rodríguez' LIMIT 1),
(SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1),
(SELECT id FROM resources WHERE location_id = (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1) LIMIT 1),
(SELECT id FROM services WHERE name = 'Color Completo' LIMIT 1),
NOW() + INTERVAL '2 days',
NOW() + INTERVAL '4 hours',
'confirmed',
200.00,
1200.00,
true,
'pay_test_002',
'Color Completo para Valentina'
UNION ALL
SELECT
(SELECT id FROM customers WHERE email = 'camila.lopez@example.com' LIMIT 1),
(SELECT id FROM staff WHERE display_name = 'Artist María García' LIMIT 1),
(SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1),
(SELECT id FROM resources WHERE location_id = (SELECT id FROM locations WHERE name = 'Salón Principal - Centro' LIMIT 1) LIMIT 1),
(SELECT id FROM services WHERE name = 'Corte y Estilizado' LIMIT 1),
NOW() + INTERVAL '3 days',
NOW() + INTERVAL '1 hour',
'confirmed',
50.00,
500.00,
true,
'pay_test_003',
'Primer corte para Camila';
```
2. Deberías ver: `Success, no rows returned`
### 2.8 Verificar Datos Creados
1. Nuevo query, copiar y ejecutar:
```sql
SELECT 'Locations: ' || COUNT(*) as resumen FROM locations
UNION ALL
SELECT 'Resources: ' || COUNT(*) FROM resources
UNION ALL
SELECT 'Staff: ' || COUNT(*) FROM staff
UNION ALL
SELECT 'Services: ' || COUNT(*) FROM services
UNION ALL
SELECT 'Customers: ' || COUNT(*) FROM customers
UNION ALL
SELECT 'Invitaciones: ' || COUNT(*) FROM invitations WHERE status = 'pending'
UNION ALL
SELECT 'Bookings: ' || COUNT(*) FROM bookings;
```
2. Deberías ver:
```
resumen
Locations: 3
Resources: 6
Staff: 8
Services: 6
Customers: 4
Invitaciones: 15
Bookings: 3
```
**Si ves números diferentes:**
- Verifica que todos los queries anteriores se ejecutaron correctamente
- Revisa los errores (si hubo)
---
## 📋 PASO 3: CREAR USUARIOS AUTH (10 min)
### 3.1 Ir a Auth Users
1. Ir a: `https://supabase.com/dashboard/project/pvvwbnybkadhreuqijsl/auth/users`
2. Clic en botón "Add user"
### 3.2 Crear Usuario Admin
1. Email: `admin@salonos.com`
2. Password: `Admin123!`
3. **Auto Confirm User:** ON (marcar la casilla)
4. Clic en "Create user"
5. Guardar el **User ID** que aparece (clic en el usuario para verlo)
### 3.3 Crear Usuario Customer (para probar)
1. Clic en botón "Add user"
2. Email: `sofia.ramirez@example.com`
3. Password: `Customer123!`
4. **Auto Confirm User:** ON (marcar la casilla)
5. Clic en "Create user"
6. Guardar el **User ID** que aparece
### 3.4 Verificar Usuarios
1. En la página de Auth Users, deberías ver 2 usuarios:
- admin@salonos.com
- sofia.ramirez@example.com
---
## 📋 PASO 4: ACTUALIZAR TABLAS CON USER IDS (5 min)
### 4.1 Actualizar Customer con User ID
1. Ir a SQL Editor: `https://supabase.com/dashboard/project/pvvwbnybkadhreuqijsl/sql`
2. Nuevo query, copiar y ejecutar:
```sql
-- REEMPLAZA [USER_ID_DEL_CUSTOMER] con el ID que copiaste del paso 3.3
UPDATE customers
SET user_id = '[USER_ID_DEL_CUSTOMER]'
WHERE email = 'sofia.ramirez@example.com';
```
3. Ejemplo de cómo debe verse (NO ejecutar esto, es solo ejemplo):
```sql
UPDATE customers
SET user_id = '01234567-89ab-cdef-0123-456789abcdef'
WHERE email = 'sofia.ramirez@example.com';
```
### 4.2 Verificar Actualización
1. Nuevo query, copiar y ejecutar:
```sql
SELECT
c.email,
c.first_name || ' ' || c.last_name as name,
c.user_id IS NOT NULL as user_id_set,
au.email as auth_user_email
FROM customers c
LEFT JOIN auth.users au ON c.user_id = au.id
WHERE c.email = 'sofia.ramirez@example.com';
```
2. Deberías ver `true` en la columna `user_id_set`
---
## 📋 PASO 5: PROBAR FUNCIONALIDADES (5 min)
### 5.1 Probar Short ID
1. En SQL Editor, ejecutar:
```sql
SELECT generate_short_id();
```
2. Deberías ver algo como: `A3F7X2`
### 5.2 Probar Código de Invitación
1. En SQL Editor, ejecutar:
```sql
SELECT generate_invitation_code();
```
2. Deberías ver algo como: `X9J4K2M5N8`
### 5.3 Verificar Políticas RLS (privacidad Artist)
1. En SQL Editor, ejecutar:
```sql
SELECT
c.first_name,
c.last_name,
c.email,
c.phone,
c.tier
FROM customers c
LIMIT 1;
```
2. Si ves `NULL` en email y phone: ✅ Correcto (política RLS funcionando)
- Esto es normal si no estás logueado como Admin
- Solo Admin/Manager/Staff pueden ver email/phone
---
## ✅ CHECKLIST FINAL
**Antes de ir a la junta, marca cada paso:**
- [ ] PASO 1: Migraciones ejecutadas (verificar mensaje "MIGRATION COMPLETED")
- [ ] PASO 2.1: Locations creadas (3)
- [ ] PASO 2.2: Resources creados (6)
- [ ] PASO 2.3: Staff creado (8)
- [ ] PASO 2.4: Services creados (6)
- [ ] PASO 2.5: Customers creados (4)
- [ ] PASO 2.6: Invitaciones creadas (15)
- [ ] PASO 2.7: Bookings creados (3)
- [ ] PASO 2.8: Verificación correcta (3-6-8-6-4-15-3)
- [ ] PASO 3.2: Usuario Admin creado
- [ ] PASO 3.3: Usuario Customer creado
- [ ] PASO 3.4: Verificación Auth Users correcta
- [ ] PASO 4.1: Customer actualizado con user_id
- [ ] PASO 5.1: Short ID generable
- [ ] PASO 5.2: Código de invitación generable
- [ ] PASO 5.3: Políticas RLS funcionando
---
## 🚨 SI ALGO FALLA
### Error: "relation already exists"
- Significa que ya se creó
- Ignora y continúa al siguiente paso
### Error: "duplicate key value"
- Significa que ya existe
- Ignora y continúa al siguiente paso
### Error: "column does not exist"
- Significa que la migración no se ejecutó completamente
- Vuelve al PASO 1 y vuelve a ejecutar la migración
### Error: "no rows returned" en PASO 2.8
- Significa que faltan datos
- Revisa los queries anteriores (PASO 2.1 a 2.7)
- Vuelve a ejecutar el que falló
---
## 💾 GUARDAR CREDENCIALES
Guarda esto en un lugar seguro:
**Admin:**
- Email: `admin@salonos.com`
- Password: `Admin123!`
**Customer (para probar):**
- Email: `sofia.ramirez@example.com`
- Password: `Customer123!`
---
## 📱 GUÍA DE EMERGENCIA
Si no tienes tiempo de terminar mañana:
### Mínimo necesario para continuar:
1. Ejecutar migración (PASO 1)
2. Crear Locations (PASO 2.1)
3. Crear Services (PASO 2.4)
4. Crear 1 Customer (PASO 2.5)
**Con eso puedes empezar a desarrollar el frontend mañana.**
---
## 🎯 TIEMPO ESTIMADO
- **Rápido (solo migración):** 10 minutos
- **Completo (todo el checklist):** 30-45 minutos
- **Con interrupciones:** 1 hora
---
## 📞 SI TIENES DUDAS
1. Revisa el archivo `DASHBOARD_ONLY_GUIDE.md` (está en la carpeta raíz)
2. Revisa los mensajes de error en Supabase Dashboard
3. Si el error es críptico, tómate una foto y guárdala para revisar después
---
## 🎉 TERMINADO
Cuando termines el checklist:
✅ Base de datos lista
✅ Datos de prueba creados
✅ Usuarios Auth creados
✅ Funcionalidades probadas
✅ Listo para continuar desarrollo mañana
**¡Buena suerte en la junta! 📧**
---
**Fecha de creación:** 2026-01-15
**Creado por:** OpenCode - Agente de Frontend e Integración
**Versión:** 1.0