CREATE OR REPLACE FUNCTION public.fn_schedule_upsert_exception(p_data jsonb)
 RETURNS jsonb
 LANGUAGE plpgsql
AS $function$
DECLARE
  v_id integer;
BEGIN
  INSERT INTO public.session_schedule_exceptions
    (schedule_id, occurrence_date, action, new_scheduled_at, new_title, reason)
  VALUES (
    (p_data->>'schedule_id')::integer,
    (p_data->>'occurrence_date')::date,
    p_data->>'action',
    (p_data->>'new_scheduled_at')::timestamptz,
    p_data->>'new_title',
    p_data->>'reason'
  )
  ON CONFLICT (schedule_id, occurrence_date) DO UPDATE SET
    action           = EXCLUDED.action,
    new_scheduled_at = EXCLUDED.new_scheduled_at,
    new_title        = EXCLUDED.new_title,
    reason           = EXCLUDED.reason
  RETURNING exception_id INTO v_id;
  RETURN jsonb_build_object('exception_id', v_id);
END;
$function$
;
