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:
146
docs/SQL_GET_CONTACT_DATA_FROM_CRM.sql
Normal file
146
docs/SQL_GET_CONTACT_DATA_FROM_CRM.sql
Normal 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;
|
||||
|
||||
Reference in New Issue
Block a user