feat: Получение cf_2624 из MySQL и блокировка полей при подтверждении данных
- Добавлен сервис CrmMySQLService для прямого подключения к MySQL CRM - Обновлён метод get_draft() для получения cf_2624 напрямую из БД - Реализована блокировка полей (readonly) при contact_data_confirmed = true - Добавлен выбор банка для СБП выплат с динамической загрузкой из API - Обновлена документация по работе с cf_2624 и MySQL - Добавлен network_mode: host в docker-compose для доступа к MySQL - Обновлены компоненты формы для поддержки блокировки полей
This commit is contained in:
141
docs/SQL_ADD_CONTACT_DATA_CONFIRMED.sql
Normal file
141
docs/SQL_ADD_CONTACT_DATA_CONFIRMED.sql
Normal file
@@ -0,0 +1,141 @@
|
||||
-- ============================================================================
|
||||
-- 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);
|
||||
|
||||
Reference in New Issue
Block a user