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


DO $export40$
DECLARE
    v_body text;
    v_pattern text :=
        '(\mwhere[[:space:]]+is_active'
        '[[:space:]]*=[[:space:]]*true\M)';
    v_matches integer;
    v_count integer;
BEGIN
    SELECT count(*)
    INTO v_count
    FROM report.fns_reference_request_journal
    WHERE smevregisterid IN (14695214, 14695215, 14695216)
      AND model_file_to_verification_id IN (8009, 8010, 8011)
      AND is_sent_to_fns = false
      AND created_at >= now() - interval '1 day';

    IF v_count <> 3 THEN
        RAISE EXCEPTION
            'Ожидались три неотправленные записи, найдено %. Запуск отменён.',
            v_count;
    END IF;

    IF EXISTS (
        SELECT 1
        FROM report.fns_reference_request_journal
        WHERE created_at >= now() - interval '1 day'
          AND is_sent_to_fns = false
          AND model_file_to_verification_id IS NOT NULL
          AND model_file_to_verification_id NOT IN (8009, 8010, 8011)
    ) THEN
        RAISE EXCEPTION
            'В отборе есть другие неотправленные файлы. Запуск отменён.';
    END IF;

    IF EXISTS (
        SELECT 1
        FROM mtrustgate.moutlist
        WHERE mftv_id IN (8009, 8010, 8011)
    ) THEN
        RAISE EXCEPTION
            'Для тестовых файлов уже есть записи выгрузки. Повторный запуск отменён.';
    END IF;

    SELECT p.prosrc
    INTO STRICT v_body
    FROM pg_proc p
    WHERE p.oid = 'smev.f3_send_register_to_sfr()'::regprocedure;

    SELECT count(*)
    INTO v_matches
    FROM regexp_matches(v_body, v_pattern, 'gi');

    IF v_matches <> 2 THEN
        RAISE EXCEPTION
            'Структура функции отличается от ожидаемой: найдено % условий активности вместо двух. Запуск отменён.',
            v_matches;
    END IF;

    v_body := regexp_replace(
        v_body,
        v_pattern,
        '\1 AND id = 40',
        'gi'
    );

    v_body := regexp_replace(
        v_body,
        '\mperform[[:space:]]+mail\.api_new_message_group'
        '[[:space:]]*\([^;]*\)[[:space:]]*;',
        'NULL;',
        'gi'
    );

    IF v_body ~* 'mail[[:space:]]*\.[[:space:]]*api_new_message_group' THEN
        RAISE EXCEPTION
            'Не удалось исключить почтовые уведомления. Запуск отменён.';
    END IF;

    IF v_body !~* '\mreturn[[:space:]]+0[[:space:]]*;' THEN
        RAISE EXCEPTION
            'Структура возврата функции отличается от ожидаемой. Запуск отменён.';
    END IF;

    v_body := regexp_replace(
        v_body,
        '\mreturn[[:space:]]+0[[:space:]]*;',
        'RETURN;',
        'gi'
    );

    RAISE NOTICE 'EXPORT40: начало выгрузки файлов 8009, 8010, 8011';

    EXECUTE format('DO %L;', v_body);

    RAISE NOTICE 'EXPORT40: вызов завершён; проверяем Output и папку выгрузки';
END;
$export40$;