DO $test$
DECLARE
v_body text;
v_old_params smev.ctx_var[];
v_filter text := 'where is_active = true';
v_return text := 'return 0;';
BEGIN
-- Проверяем, что автоматическое формирование №40 выключено.
PERFORM id
FROM report.conf_scheduler_sfr
WHERE id = 40
AND is_active = false
FOR UPDATE;
IF NOT FOUND THEN
RAISE EXCEPTION
'Перед тестом регламент №40 должен быть выключен';
END IF;
-- Получаем тело существующей функции.
SELECT p.prosrc
INTO STRICT v_body
FROM pg_proc p
WHERE p.oid =
'smev.f3_create_sfr_register()'::regprocedure;
-- Проверяем места замены перед разовым выполнением.
IF (
length(v_body)
- length(replace(v_body, v_filter, ''))
) <> length(v_filter) THEN
RAISE EXCEPTION
'Не найден единственный ожидаемый фильтр регламентов';
END IF;
IF (
length(v_body)
- length(replace(v_body, v_return, ''))
) <> length(v_return) THEN
RAISE EXCEPTION
'Не найден единственный ожидаемый RETURN';
END IF;
-- Ограничиваем только разовую копию тела функции.
v_body := replace(v_body, v_filter, 'where id = 40');
-- В анонимном блоке RETURN выполняется без значения.
v_body := replace(v_body, v_return, 'return;');
-- Сохраняем действующие параметры первого шага.
SELECT load_id_var
INTO STRICT v_old_params
FROM smev.smev_report_create_register_processes
WHERE id_etl = 40
AND id_process = 1
FOR UPDATE;
-- Задаём период для этого теста.
UPDATE smev.smev_report_create_register_processes
SET load_id_var = ARRAY[
ROW(
'start_date_app', 'String', '2026-10-29'
)::smev.ctx_var,
ROW(
'end_date_app', 'String', '2026-10-29'
)::smev.ctx_var,
ROW(
'isChecked', 'Boolean', 'true'
)::smev.ctx_var,
ROW(
'contract_activity_type', 'String', 'ALL'
)::smev.ctx_var
]
WHERE id_etl = 40
AND id_process = 1;
-- Разовое выполнение формирования только №40.
EXECUTE format('DO %L', v_body);
-- Возвращаем исходные параметры периода.
UPDATE smev.smev_report_create_register_processes
SET load_id_var = v_old_params
WHERE id_etl = 40
AND id_process = 1;
END;
$test$;