mirror of
https://github.com/marcogll/AnchorOS.git
synced 2026-03-15 10:24:26 +00:00
77 lines
2.7 KiB
PL/PgSQL
77 lines
2.7 KiB
PL/PgSQL
-- ============================================
|
|
-- FASE 2.3 - ENHANCED AVAILABILITY WITH PRIORITY
|
|
-- Date: 20260118
|
|
-- Description: Priority resource assignment + dual count + collision detection
|
|
-- ============================================
|
|
|
|
-- Enhance get_available_resources_with_priority with code priority
|
|
DROP FUNCTION IF EXISTS get_available_resources_with_priority(UUID, TIMESTAMPTZ, TIMESTAMPTZ) CASCADE;
|
|
|
|
CREATE OR REPLACE FUNCTION get_available_resources_with_priority(
|
|
p_location_id UUID,
|
|
p_start_time_utc TIMESTAMPTZ,
|
|
p_end_time_utc TIMESTAMPTZ
|
|
)
|
|
RETURNS TABLE (
|
|
resource_id UUID,
|
|
resource_name VARCHAR,
|
|
resource_type resource_type,
|
|
priority_order INTEGER
|
|
) AS $$
|
|
BEGIN
|
|
RETURN QUERY
|
|
SELECT
|
|
r.id,
|
|
r.name,
|
|
r.type,
|
|
CASE
|
|
WHEN r.name LIKE 'mkup%' THEN 1
|
|
WHEN r.name LIKE 'lshs%' THEN 2
|
|
WHEN r.name LIKE 'pedi%' THEN 3
|
|
WHEN r.name LIKE 'mani%' THEN 4
|
|
ELSE 5
|
|
END as priority_order
|
|
FROM resources r
|
|
WHERE r.location_id = p_location_id
|
|
AND r.is_active = true
|
|
AND check_resource_availability(r.id, p_start_time_utc, p_end_time_utc)
|
|
ORDER BY priority_order, r.name;
|
|
END;
|
|
$$ LANGUAGE plpgsql SECURITY DEFINER;
|
|
|
|
-- New dual availability function
|
|
CREATE OR REPLACE FUNCTION get_dual_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_dual_slots JSONB := '[]'::JSONB;
|
|
-- ... (similar to get_detailed_availability but count pairs)
|
|
BEGIN
|
|
-- Reuse get_detailed_availability logic but filter COUNT >=2
|
|
-- For simplicity, approximate with staff count >=2
|
|
SELECT jsonb_agg(row_to_json(t))
|
|
INTO v_dual_slots
|
|
FROM (
|
|
SELECT
|
|
v_slot_start::TEXT as start_time,
|
|
(v_slot_start + (p_time_slot_duration_minutes || ' minutes')::INTERVAL)::TEXT as end_time,
|
|
available_staff_count >= 2 as available,
|
|
available_staff_count
|
|
FROM get_detailed_availability(p_location_id, p_service_id, p_date, p_time_slot_duration_minutes) slots
|
|
WHERE (slots->>'available_staff_count')::INT >= 2
|
|
) t;
|
|
|
|
RETURN v_dual_slots;
|
|
END;
|
|
$$ LANGUAGE plpgsql SECURITY DEFINER;
|
|
|
|
COMMENT ON FUNCTION get_available_resources_with_priority IS 'Available resources ordered by priority: mkup > lshs > pedi > mani';
|
|
COMMENT ON FUNCTION get_dual_availability IS 'Availability slots where >=2 staff available (for dual services)';
|
|
|
|
GRANT EXECUTE ON FUNCTION get_available_resources_with_priority TO authenticated, service_role;
|
|
GRANT EXECUTE ON FUNCTION get_dual_availability TO authenticated, service_role;
|