- Добавлен сервис CrmMySQLService для прямого подключения к MySQL CRM - Обновлён метод get_draft() для получения cf_2624 напрямую из БД - Реализована блокировка полей (readonly) при contact_data_confirmed = true - Добавлен выбор банка для СБП выплат с динамической загрузкой из API - Обновлена документация по работе с cf_2624 и MySQL - Добавлен network_mode: host в docker-compose для доступа к MySQL - Обновлены компоненты формы для поддержки блокировки полей
147 lines
4.7 KiB
PL/PgSQL
147 lines
4.7 KiB
PL/PgSQL
-- ============================================================================
|
||
-- 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;
|
||
|