mirror of
https://github.com/marcogll/AnchorOS.git
synced 2026-03-15 19:24:32 +00:00
- Agregar API routes de disponibilidad (blocks, staff, time-slots, staff-unavailable) - Corregir autenticación en availability routes (reemplazar get_current_user_role con validación Bearer) - Corregir DELETE en blocks/route.ts para usar query parameters - Corregir errores de tipos en kiosk routes (supabase → supabaseAdmin) - Agregar layout raíz de Next.js y estilos globales - Agregar componente Badge UI - Corregir tipos TypeScript en WalkInFlow - Instalar dependencias necesarias (@radix-ui/*, class-variance-authority, etc) - Agregar migraciones de disponibilidad
74 lines
2.4 KiB
PL/PgSQL
74 lines
2.4 KiB
PL/PgSQL
-- ============================================
|
|
-- Crear función get_detailed_availability para obtener slots de tiempo
|
|
-- ============================================
|
|
|
|
CREATE OR REPLACE FUNCTION get_detailed_availability(
|
|
p_location_id UUID,
|
|
p_service_id UUID,
|
|
p_date DATE,
|
|
p_time_slot_duration_minutes INTEGER DEFAULT 60
|
|
)
|
|
RETURNS JSONB AS $$
|
|
DECLARE
|
|
v_service_duration INTEGER;
|
|
v_location_timezone TEXT;
|
|
v_start_time TIME := '09:00'::TIME;
|
|
v_end_time TIME := '21:00'::TIME;
|
|
v_time_slots JSONB := '[]'::JSONB;
|
|
v_slot_start TIMESTAMPTZ;
|
|
v_slot_end TIMESTAMPTZ;
|
|
v_available_staff_count INTEGER;
|
|
BEGIN
|
|
-- Obtener duración del servicio
|
|
SELECT duration_minutes INTO v_service_duration
|
|
FROM services
|
|
WHERE id = p_service_id;
|
|
|
|
IF v_service_duration IS NULL THEN
|
|
RETURN '[]'::JSONB;
|
|
END IF;
|
|
|
|
-- Obtener zona horaria de la ubicación
|
|
SELECT timezone INTO v_location_timezone
|
|
FROM locations
|
|
WHERE id = p_location_id;
|
|
|
|
-- Generar slots de tiempo para el día
|
|
v_slot_start := (p_date || ' ' || v_start_time::TEXT)::TIMESTAMPTZ
|
|
AT TIME ZONE v_location_timezone;
|
|
|
|
v_slot_end := (p_date || ' ' || v_end_time::TEXT)::TIMESTAMPTZ
|
|
AT TIME ZONE v_location_timezone;
|
|
|
|
-- Iterar por cada slot
|
|
WHILE v_slot_start < v_slot_end LOOP
|
|
-- Verificar staff disponible para este slot
|
|
SELECT COUNT(*) INTO v_available_staff_count
|
|
FROM (
|
|
SELECT 1
|
|
FROM staff s
|
|
WHERE s.location_id = p_location_id
|
|
AND s.is_active = true
|
|
AND s.is_available_for_booking = true
|
|
AND s.role IN ('artist', 'staff', 'manager')
|
|
AND check_staff_availability(s.id, v_slot_start, v_slot_start + (v_service_duration || ' minutes')::INTERVAL)
|
|
) AS available_staff;
|
|
|
|
-- Agregar slot al resultado
|
|
IF v_available_staff_count > 0 THEN
|
|
v_time_slots := v_time_slots || jsonb_build_object(
|
|
'start_time', v_slot_start::TEXT,
|
|
'end_time', (v_slot_start + (p_time_slot_duration_minutes || ' minutes')::INTERVAL)::TEXT,
|
|
'available', true,
|
|
'available_staff_count', v_available_staff_count
|
|
);
|
|
END IF;
|
|
|
|
-- Avanzar al siguiente slot
|
|
v_slot_start := v_slot_start + (p_time_slot_duration_minutes || ' minutes')::INTERVAL;
|
|
END LOOP;
|
|
|
|
RETURN v_time_slots;
|
|
END;
|
|
$$ LANGUAGE plpgsql SECURITY DEFINER;
|