- Добавлен сервис CrmMySQLService для прямого подключения к MySQL CRM - Обновлён метод get_draft() для получения cf_2624 напрямую из БД - Реализована блокировка полей (readonly) при contact_data_confirmed = true - Добавлен выбор банка для СБП выплат с динамической загрузкой из API - Обновлена документация по работе с cf_2624 и MySQL - Добавлен network_mode: host в docker-compose для доступа к MySQL - Обновлены компоненты формы для поддержки блокировки полей
114 lines
4.0 KiB
JavaScript
114 lines
4.0 KiB
JavaScript
// ============================================================================
|
||
// n8n Code Node: Подготовка параметров для SQL при пропуске документа
|
||
// ============================================================================
|
||
// Входные данные: массив с объектом [{ propertyName: {...}, body: {...} }]
|
||
// Выходные данные: { $1: jsonb_payload, $2: claim_id_string }
|
||
// ============================================================================
|
||
|
||
// Получаем входные данные
|
||
const inputData = $input.all();
|
||
|
||
if (!inputData || inputData.length === 0) {
|
||
return [{
|
||
json: {
|
||
error: "Нет входных данных",
|
||
$1: null,
|
||
$2: null
|
||
}
|
||
}];
|
||
}
|
||
|
||
// Берём первый элемент
|
||
// Если это массив - берём первый элемент массива
|
||
// Если это объект - используем его напрямую
|
||
let firstItem = inputData[0].json;
|
||
|
||
if (Array.isArray(firstItem)) {
|
||
firstItem = firstItem[0];
|
||
}
|
||
|
||
// Извлекаем данные
|
||
const propertyName = firstItem.propertyName || {};
|
||
const body = firstItem.body || {};
|
||
|
||
// Извлекаем claim_id (приоритет: body -> propertyName)
|
||
const claim_id = body.claim_id || propertyName.claim_id || null;
|
||
|
||
if (!claim_id) {
|
||
return [{
|
||
json: {
|
||
error: "claim_id не найден",
|
||
$1: null,
|
||
$2: null,
|
||
debug: {
|
||
body_keys: Object.keys(body),
|
||
propertyName_keys: Object.keys(propertyName)
|
||
}
|
||
}
|
||
}];
|
||
}
|
||
|
||
// Формируем payload для $1 (jsonb)
|
||
// SQL ищет данные в разных местах: p->>'document_type', p->'body'->>'document_type', p->'edit_fields_raw'->'body'->>'document_type'
|
||
const payload = {
|
||
// ✅ Основные идентификаторы (в корне для быстрого доступа)
|
||
session_id: body.session_id || propertyName.session_id,
|
||
claim_id: claim_id,
|
||
unified_id: body.unified_id || propertyName.unified_id,
|
||
contact_id: body.contact_id || propertyName.contact_id,
|
||
phone: body.phone || propertyName.phone,
|
||
|
||
// ✅ Информация о пропущенном документе (в корне для быстрого доступа)
|
||
document_type: body.document_type,
|
||
document_name: body.document_name || body.document_type,
|
||
group_index: body.group_index ? parseInt(body.group_index) : (body.group_index || null),
|
||
|
||
// ✅ Метаданные пропуска
|
||
skipped: body.skipped,
|
||
action: body.action,
|
||
skip_timestamp: body.skip_timestamp || new Date().toISOString(),
|
||
|
||
// ✅ Данные из propertyName (для сохранения в payload)
|
||
problem_description: propertyName.description || propertyName.problem_description,
|
||
email: propertyName.email,
|
||
|
||
// ✅ Данные из body (для совместимости)
|
||
form_id: body.form_id,
|
||
stage: body.stage,
|
||
client_ip: body.client_ip,
|
||
|
||
// ✅ Поля для совместимости с существующим SQL (SQL ищет данные здесь)
|
||
body: {
|
||
document_type: body.document_type,
|
||
document_name: body.document_name || body.document_type,
|
||
group_index: body.group_index ? parseInt(body.group_index) : (body.group_index || null),
|
||
session_id: body.session_id,
|
||
claim_id: claim_id,
|
||
unified_id: body.unified_id,
|
||
contact_id: body.contact_id,
|
||
phone: body.phone
|
||
},
|
||
edit_fields_raw: {
|
||
propertyName: propertyName,
|
||
body: body
|
||
},
|
||
edit_fields_parsed: {
|
||
propertyName: propertyName,
|
||
body: body
|
||
}
|
||
};
|
||
|
||
// Возвращаем параметры для SQL
|
||
return [{
|
||
json: {
|
||
$1: payload, // JSONB payload для SQL (будет передан как $1::jsonb)
|
||
$2: claim_id, // TEXT claim_id для SQL (будет передан как $2::text)
|
||
// Дополнительные поля для отладки
|
||
claim_id: claim_id,
|
||
document_type: body.document_type,
|
||
document_name: body.document_name,
|
||
group_index: body.group_index
|
||
}
|
||
}];
|
||
|