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,146 @@
-- ============================================================================
-- SQL запрос для получения данных контакта из CRM (через n8n)
-- ============================================================================
-- Назначение: Получить актуальные данные контакта из CRM для отображения
-- в форме подтверждения (если данные уже подтверждены)
--
-- Использование: В n8n workflow после проверки флага contact_data_confirmed_at
-- ============================================================================
-- ВАЖНО: Этот запрос выполняется через n8n HTTP Request к CRM webservice,
-- а не напрямую в PostgreSQL, т.к. CRM в MySQL
-- Пример запроса к CRM через n8n:
-- POST https://crm.clientright.ru/webservice.php
-- Body: operation=retrieve&sessionName={{sessionName}}&id=12x{{contact_id}}
-- ============================================================================
-- Альтернатива: Хранить кэш данных контакта в PostgreSQL
-- ============================================================================
-- Создаём таблицу для кэширования данных контакта из CRM
CREATE TABLE IF NOT EXISTS clpr_contact_data_cache (
unified_id VARCHAR NOT NULL PRIMARY KEY,
contact_id INTEGER,
firstname VARCHAR,
lastname VARCHAR,
middle_name VARCHAR,
inn VARCHAR,
birthday DATE,
birthplace VARCHAR,
mailingstreet VARCHAR,
email VARCHAR,
mobile VARCHAR,
-- Дополнительные поля из CRM
data_json JSONB, -- Полные данные из CRM для расширяемости
synced_at TIMESTAMPTZ DEFAULT NOW(),
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
CONSTRAINT fk_unified_id FOREIGN KEY (unified_id)
REFERENCES clpr_users(unified_id) ON DELETE CASCADE
);
-- Индекс для быстрого поиска
CREATE INDEX IF NOT EXISTS idx_clpr_contact_data_cache_contact_id
ON clpr_contact_data_cache(contact_id);
-- Комментарий
COMMENT ON TABLE clpr_contact_data_cache IS
'Кэш данных контакта из CRM. Обновляется при синхронизации через n8n.';
-- ============================================================================
-- Функция: Получить данные контакта (из кэша или NULL)
-- ============================================================================
CREATE OR REPLACE FUNCTION clpr_get_contact_data(p_unified_id VARCHAR)
RETURNS TABLE(
contact_id INTEGER,
firstname VARCHAR,
lastname VARCHAR,
middle_name VARCHAR,
inn VARCHAR,
birthday DATE,
birthplace VARCHAR,
mailingstreet VARCHAR,
email VARCHAR,
mobile VARCHAR,
data_json JSONB
) AS $$
BEGIN
RETURN QUERY
SELECT
c.contact_id,
c.firstname,
c.lastname,
c.middle_name,
c.inn,
c.birthday,
c.birthplace,
c.mailingstreet,
c.email,
c.mobile,
c.data_json
FROM clpr_contact_data_cache c
WHERE c.unified_id = p_unified_id;
END;
$$ LANGUAGE plpgsql;
-- ============================================================================
-- Функция: Обновить кэш данных контакта
-- ============================================================================
CREATE OR REPLACE FUNCTION clpr_update_contact_data_cache(
p_unified_id VARCHAR,
p_contact_id INTEGER,
p_data JSONB
)
RETURNS VOID AS $$
BEGIN
INSERT INTO clpr_contact_data_cache (
unified_id,
contact_id,
firstname,
lastname,
middle_name,
inn,
birthday,
birthplace,
mailingstreet,
email,
mobile,
data_json,
synced_at,
updated_at
) VALUES (
p_unified_id,
p_contact_id,
p_data->>'firstname',
p_data->>'lastname',
p_data->>'cf_1157', -- middle_name
p_data->>'cf_1257', -- inn
(p_data->>'birthday')::DATE,
p_data->>'cf_1263', -- birthplace
p_data->>'mailingstreet',
p_data->>'email',
p_data->>'mobile',
p_data,
NOW(),
NOW()
)
ON CONFLICT (unified_id) DO UPDATE
SET
contact_id = EXCLUDED.contact_id,
firstname = EXCLUDED.firstname,
lastname = EXCLUDED.lastname,
middle_name = EXCLUDED.middle_name,
inn = EXCLUDED.inn,
birthday = EXCLUDED.birthday,
birthplace = EXCLUDED.birthplace,
mailingstreet = EXCLUDED.mailingstreet,
email = EXCLUDED.email,
mobile = EXCLUDED.mobile,
data_json = EXCLUDED.data_json,
synced_at = NOW(),
updated_at = NOW();
END;
$$ LANGUAGE plpgsql;