-- ============================================================================ -- 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);