Загрузка данных


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$;