Files
aiform_dev/docs/SQL_GET_CONTACT_DATA_FROM_CRM.sql
AI Assistant 080e7ec105 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
- Обновлены компоненты формы для поддержки блокировки полей
2025-12-04 12:22:23 +03:00

147 lines
4.7 KiB
PL/PgSQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ============================================================================
-- 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;