# Actualización de Recursos - SalonOS ## Cambios Realizados ### Recursos Anteriores (Eliminados) Los recursos tenían nombres descriptivos como: - "Sillón Pedicure 1", "Sillón Pedicure 2", "Sillón Pedicure 3" - "Estación Manicure 1", "Estación Manicure 2", "Estación Manicure 3", "Estación Manicure 4" - "Estación Maquillaje" - "Cama Pestañas" ### Nuevos Recursos (Implementados) Los recursos ahora usan códigos alfanuméricos estandarizados: | Tipo | Código | Cantidad | Descripción | |------|--------|----------|-------------| | Maquillaje | `mkup` | 3 | Estaciones de maquillaje | | Pestañas | `lshs` | 1 | Cama de pestañas | | Pedicure | `pedi` | 4 | Estaciones de pedicure | | Manicure | `mani` | 4 | Estaciones de manicure | ### Formato de Nombres Los recursos siguen el patrón: `{código}-{número}` Ejemplos: - `mkup-01`, `mkup-02`, `mkup-03` - `lshs-01` - `pedi-01`, `pedi-02`, `pedi-03`, `pedi-04` - `mani-01`, `mani-02`, `mani-03`, `mani-04` ## Detalles por Tipo ### Maquillaje (`mkup`) - **Total:** 3 estaciones por location - **Tipo:** station - **Capacidad:** 1 persona por estación - **Uso:** Servicios de maquillaje profesional ### Pestañas (`lshs`) - **Total:** 1 cama por location - **Tipo:** station - **Capacidad:** 1 persona - **Uso:** Extensiones de pestañas ### Pedicure (`pedi`) - **Total:** 4 estaciones por location - **Tipo:** station - **Capacidad:** 1 persona por estación - **Uso:** Servicios de pedicure ### Manicure (`mani`) - **Total:** 4 estaciones por location - **Tipo:** station - **Capacidad:** 1 persona por estación - **Uso:** Servicios de manicure ## Impacto en el Sistema ### Bookings Eliminados ⚠️ **IMPORTANTE:** Debido a la restricción `CASCADE DELETE` en la tabla `resources`, todos los bookings que referenciaban los recursos anteriores han sido eliminados. Esto significa que: - No hay bookings activos en el sistema - Los clientes deberán reprogramar sus citas - Se debe informar a los usuarios del cambio ### Cómo Afecta al Kiosko El kiosko ahora asignará recursos usando los nuevos códigos: - Cuando un cliente solicita maquillaje → asigna `mkup-XX` - Cuando un cliente solicita pestañas → asigna `lshs-01` - Cuando un cliente solicita pedicure → asigna `pedi-XX` - Cuando un cliente solicita manicure → asigna `mani-XX` ### Mapeo de Servicios a Recursos Para mantener la consistencia, los servicios deberían asignarse a los recursos correctos: | Servicio | Recurso Recomendado | Notas | |----------|---------------------|-------| | Maquillaje Profesional | `mkup-XX` | Cualquiera de las 3 estaciones | | Extensión de Pestañas | `lshs-01` | Único recurso disponible | | Pedicure Spa | `pedi-XX` | Cualquiera de las 4 estaciones | | Manicure Gel | `mani-XX` | Cualquiera de las 4 estaciones | | Uñas Acrílicas | `mani-XX` | Cualquiera de las 4 estaciones | ## Ejecutar la Migración ### Opción 1: Via Supabase Dashboard 1. Ve a: https://supabase.com/dashboard/project/pvvwbnybkadhreuqijsl/sql 2. Copia el contenido de `supabase/migrations/20260116010000_update_resources.sql` 3. Pega en el SQL Editor 4. Haz clic en "Run" 5. Verifica el output en la consola ### Opción 2: Via CLI (si está configurado) ```bash supabase db push ``` ## Verificar la Migración ### Consulta SQL para Ver Recursos ```sql SELECT l.name AS location, r.name AS resource_code, r.type AS resource_type, r.capacity, r.is_active FROM resources r JOIN locations l ON l.id = r.location_id WHERE l.is_active = true ORDER BY l.name, r.name; ``` ### Resultado Esperado ``` location | resource_code | resource_type | capacity | is_active ------------------|---------------|---------------|----------|---------- ANCHOR:23 - Via KLAVA | lshs-01 | station | 1 | true ANCHOR:23 - Via KLAVA | mani-01 | station | 1 | true ANCHOR:23 - Via KLAVA | mani-02 | station | 1 | true ANCHOR:23 - Via KLAVA | mani-03 | station | 1 | true ANCHOR:23 - Via KLAVA | mani-04 | station | 1 | true ANCHOR:23 - Via KLAVA | mkup-01 | station | 1 | true ANCHOR:23 - Via KLAVA | mkup-02 | station | 1 | true ANCHOR:23 - Via KLAVA | mkup-03 | station | 1 | true ANCHOR:23 - Via KLAVA | pedi-01 | station | 1 | true ANCHOR:23 - Via KLAVA | pedi-02 | station | 1 | true ANCHOR:23 - Via KLAVA | pedi-03 | station | 1 | true ANCHOR:23 - Via KLAVA | pedi-04 | station | 1 | true TEST - Salón Principal | lshs-01 | station | 1 | true TEST - Salón Principal | mani-01 | station | 1 | true TEST - Salón Principal | mani-02 | station | 1 | true TEST - Salón Principal | mani-03 | station | 1 | true TEST - Salón Principal | mani-04 | station | 1 | true TEST - Salón Principal | mkup-01 | station | 1 | true TEST - Salón Principal | mkup-02 | station | 1 | true TEST - Salón Principal | mkup-03 | station | 1 | true TEST - Salón Principal | pedi-01 | station | 1 | true TEST - Salón Principal | pedi-02 | station | 1 | true TEST - Salón Principal | pedi-03 | station | 1 | true TEST - Salón Principal | pedi-04 | station | 1 | true ``` ## Actualizar el Seed Data (Opcional) Si deseas mantener el archivo de seed consistente, actualiza la sección de recursos en `20260115235900_seed_data.sql`: ```sql -- REEMPLAZAR ESTA SECCIÓN EN EL SEED -- 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 = 'mkup-' || LPAD(i::TEXT, 2, '0') ) THEN INSERT INTO resources (location_id, name, type, capacity, is_active) SELECT id, 'mkup-' || LPAD(i::TEXT, 2, '0'), 'station', 1, true FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA'; END IF; END LOOP; INSERT INTO resources (location_id, name, type, capacity, is_active) SELECT id, 'lshs-01', 'station', 1, true FROM locations l WHERE l.name = 'ANCHOR:23 - Via KLAVA' AND NOT EXISTS ( SELECT 1 FROM resources r WHERE r.location_id = l.id AND r.name = 'lshs-01' ); 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 = 'pedi-' || LPAD(i::TEXT, 2, '0') ) THEN INSERT INTO resources (location_id, name, type, capacity, is_active) SELECT id, 'pedi-' || LPAD(i::TEXT, 2, '0'), '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 = 'mani-' || LPAD(i::TEXT, 2, '0') ) THEN INSERT INTO resources (location_id, name, type, capacity, is_active) SELECT id, 'mani-' || LPAD(i::TEXT, 2, '0'), 'station', 1, true FROM locations WHERE name = 'ANCHOR:23 - Via KLAVA'; END IF; END LOOP; -- Repetir mismo patrón para otras locations... END $$; ``` ## Notas Importantes ### IDs de Resources Cada location tendrá sus propios recursos con IDs únicos. Por ejemplo: - ANCHOR:23 - Via KLAVA → `mkup-01` tiene un ID específico - TEST - Salón Principal → `mkup-01` tiene un ID diferente ### Agregar Nuevas Locations Cuando agregues una nueva location, la migración de actualización de recursos (`20260116010000_update_resources.sql`) creará automáticamente los 12 recursos para ella: - 3 mkup - 1 lshs - 4 pedi - 4 mani ### Modificar Cantidades Si necesitas cambiar las cantidades en el futuro, modifica la migración: ```sql -- Ejemplo: cambiar a 5 estaciones de maquillaje FOR i IN 1..5 LOOP INSERT INTO resources ... END LOOP; ``` ## Soporte y Troubleshooting ### Error: "Resources table is empty" - Ejecuta la migración de actualización de recursos - Verifica que las locations estén activas ### Error: "Booking references non-existent resource" - Esto es normal después de la migración - Los bookings anteriores fueron eliminados por CASCADE DELETE - Crea nuevos bookings con el sistema actualizado ### Consulta para Ver Locations sin Recursos ```sql SELECT l.id, l.name FROM locations l LEFT JOIN resources r ON r.location_id = l.id WHERE l.is_active = true AND r.id IS NULL; ```