- Добавлен сервис CrmMySQLService для прямого подключения к MySQL CRM - Обновлён метод get_draft() для получения cf_2624 напрямую из БД - Реализована блокировка полей (readonly) при contact_data_confirmed = true - Добавлен выбор банка для СБП выплат с динамической загрузкой из API - Обновлена документация по работе с cf_2624 и MySQL - Добавлен network_mode: host в docker-compose для доступа к MySQL - Обновлены компоненты формы для поддержки блокировки полей
142 lines
6.4 KiB
PL/PgSQL
142 lines
6.4 KiB
PL/PgSQL
-- ============================================================================
|
|
-- SQL миграция: Добавление флага подтверждения данных контакта
|
|
-- ============================================================================
|
|
-- Назначение: Предотвратить изменение данных контакта после первого подтверждения
|
|
--
|
|
-- Логика:
|
|
-- 1. При первом подтверждении формы ставим contact_data_confirmed_at = NOW()
|
|
-- 2. Если данные уже есть в CRM (созданы менеджером) - считаем подтверждёнными
|
|
-- 3. При следующих обращениях проверяем флаг и блокируем редактирование
|
|
-- 4. При изменении данных обновляем timestamp
|
|
-- ============================================================================
|
|
|
|
-- 1. Добавляем поле contact_data_confirmed_at в clpr_users
|
|
ALTER TABLE clpr_users
|
|
ADD COLUMN IF NOT EXISTS contact_data_confirmed_at TIMESTAMPTZ;
|
|
|
|
-- 2. Создаём индекс для быстрого поиска
|
|
CREATE INDEX IF NOT EXISTS idx_clpr_users_contact_data_confirmed
|
|
ON clpr_users(contact_data_confirmed_at)
|
|
WHERE contact_data_confirmed_at IS NOT NULL;
|
|
|
|
-- 3. Комментарий к полю
|
|
COMMENT ON COLUMN clpr_users.contact_data_confirmed_at IS
|
|
'Дата и время подтверждения данных контакта пользователем. Если NULL - данные можно редактировать. Если NOT NULL - данные только для чтения.';
|
|
|
|
-- ============================================================================
|
|
-- Функция: Проверка, подтверждены ли данные контакта
|
|
-- ============================================================================
|
|
CREATE OR REPLACE FUNCTION clpr_is_contact_data_confirmed(p_unified_id VARCHAR)
|
|
RETURNS BOOLEAN AS $$
|
|
BEGIN
|
|
RETURN EXISTS (
|
|
SELECT 1
|
|
FROM clpr_users
|
|
WHERE unified_id = p_unified_id
|
|
AND contact_data_confirmed_at IS NOT NULL
|
|
);
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- ============================================================================
|
|
-- Функция: Установить флаг подтверждения данных
|
|
-- ============================================================================
|
|
CREATE OR REPLACE FUNCTION clpr_set_contact_data_confirmed(
|
|
p_unified_id VARCHAR,
|
|
p_confirmed_at TIMESTAMPTZ DEFAULT NOW()
|
|
)
|
|
RETURNS VOID AS $$
|
|
BEGIN
|
|
UPDATE clpr_users
|
|
SET contact_data_confirmed_at = p_confirmed_at,
|
|
updated_at = NOW()
|
|
WHERE unified_id = p_unified_id;
|
|
|
|
-- Если пользователь не найден - создаём запись (на всякий случай)
|
|
IF NOT FOUND THEN
|
|
INSERT INTO clpr_users (unified_id, contact_data_confirmed_at, created_at, updated_at)
|
|
VALUES (p_unified_id, p_confirmed_at, NOW(), NOW())
|
|
ON CONFLICT (unified_id) DO UPDATE
|
|
SET contact_data_confirmed_at = p_confirmed_at,
|
|
updated_at = NOW();
|
|
END IF;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- ============================================================================
|
|
-- Функция: Проверка и автоматическая установка флага для существующих контактов
|
|
-- ============================================================================
|
|
-- Если в CRM уже есть данные контакта (firstname, lastname, inn и т.д. заполнены),
|
|
-- считаем их подтверждёнными автоматически
|
|
--
|
|
-- ВАЖНО: Эта функция должна вызываться после синхронизации данных из CRM
|
|
-- ============================================================================
|
|
CREATE OR REPLACE FUNCTION clpr_auto_confirm_if_crm_has_data(
|
|
p_unified_id VARCHAR,
|
|
p_contact_id INTEGER
|
|
)
|
|
RETURNS VOID AS $$
|
|
DECLARE
|
|
v_has_data BOOLEAN;
|
|
BEGIN
|
|
-- Проверяем, есть ли уже подтверждённые данные
|
|
IF EXISTS (
|
|
SELECT 1 FROM clpr_users
|
|
WHERE unified_id = p_unified_id
|
|
AND contact_data_confirmed_at IS NOT NULL
|
|
) THEN
|
|
RETURN; -- Уже подтверждено
|
|
END IF;
|
|
|
|
-- Проверяем наличие данных в CRM через webservice
|
|
-- Если contact_id передан и > 0, считаем что данные есть в CRM
|
|
-- (это упрощённая проверка, можно расширить через API)
|
|
IF p_contact_id IS NOT NULL AND p_contact_id > 0 THEN
|
|
-- Устанавливаем флаг подтверждения
|
|
PERFORM clpr_set_contact_data_confirmed(p_unified_id);
|
|
END IF;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- ============================================================================
|
|
-- Функция: Получить статус подтверждения данных
|
|
-- ============================================================================
|
|
CREATE OR REPLACE FUNCTION clpr_get_contact_data_status(p_unified_id VARCHAR)
|
|
RETURNS TABLE(
|
|
is_confirmed BOOLEAN,
|
|
confirmed_at TIMESTAMPTZ,
|
|
can_edit BOOLEAN
|
|
) AS $$
|
|
BEGIN
|
|
RETURN QUERY
|
|
SELECT
|
|
COALESCE(u.contact_data_confirmed_at IS NOT NULL, false) AS is_confirmed,
|
|
u.contact_data_confirmed_at AS confirmed_at,
|
|
COALESCE(u.contact_data_confirmed_at IS NULL, true) AS can_edit
|
|
FROM clpr_users u
|
|
WHERE u.unified_id = p_unified_id;
|
|
|
|
-- Если пользователь не найден - возвращаем false (можно редактировать)
|
|
IF NOT FOUND THEN
|
|
RETURN QUERY SELECT false, NULL::TIMESTAMPTZ, true;
|
|
END IF;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- ============================================================================
|
|
-- Примеры использования:
|
|
-- ============================================================================
|
|
|
|
-- 1. Проверить, подтверждены ли данные
|
|
-- SELECT clpr_is_contact_data_confirmed('usr_abc123...');
|
|
|
|
-- 2. Установить флаг подтверждения
|
|
-- SELECT clpr_set_contact_data_confirmed('usr_abc123...');
|
|
|
|
-- 3. Получить статус
|
|
-- SELECT * FROM clpr_get_contact_data_status('usr_abc123...');
|
|
|
|
-- 4. Автоматически подтвердить, если данные есть в CRM
|
|
-- SELECT clpr_auto_confirm_if_crm_has_data('usr_abc123...', 396625);
|
|
|