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:
AI Assistant
2025-12-04 12:22:23 +03:00
parent 64385c430d
commit 080e7ec105
69 changed files with 17034 additions and 1439 deletions

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