- Добавлен сервис CrmMySQLService для прямого подключения к MySQL CRM - Обновлён метод get_draft() для получения cf_2624 напрямую из БД - Реализована блокировка полей (readonly) при contact_data_confirmed = true - Добавлен выбор банка для СБП выплат с динамической загрузкой из API - Обновлена документация по работе с cf_2624 и MySQL - Добавлен network_mode: host в docker-compose для доступа к MySQL - Обновлены компоненты формы для поддержки блокировки полей
265 lines
9.0 KiB
JavaScript
265 lines
9.0 KiB
JavaScript
// ========================================
|
||
// Code Node: Code in JavaScriptКлиентправ
|
||
// Формирование Response для фронтенда с поддержкой cf_2624
|
||
// ========================================
|
||
|
||
// --- 1. Генерация UUIDv4 ---
|
||
function generateUUIDv4() {
|
||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
|
||
const r = Math.random() * 16 | 0;
|
||
const v = c === 'x' ? r : ((r & 0x3) | 0x8);
|
||
return v.toString(16);
|
||
});
|
||
}
|
||
|
||
// --- 2. Парсим контакт из CreateWebContacКлиентправ ---
|
||
const createWebContactNode = $node["CreateWebContacКлиентправ"] || $node["CreateWebContact"];
|
||
const rawResult = createWebContactNode?.json?.result || "";
|
||
|
||
let contactData = {};
|
||
try {
|
||
contactData = typeof rawResult === 'string'
|
||
? JSON.parse(rawResult)
|
||
: rawResult;
|
||
} catch (e) {
|
||
console.error('❌ Ошибка парсинга CreateWebContact:', e);
|
||
contactData = {};
|
||
}
|
||
|
||
// ✅ Извлекаем cf_2624 (Данные подтверждены) из CreateWebContact
|
||
// "1" = данные подтверждены, "0" = не подтверждены
|
||
const cf_2624 = contactData.cf_2624 || "0";
|
||
const contact_data_confirmed = cf_2624 === "1" || cf_2624 === "true" || cf_2624 === true;
|
||
const contact_data_can_edit = !contact_data_confirmed;
|
||
|
||
console.log('🔒 Статус данных контакта из CreateWebContact:', {
|
||
contact_id: contactData.contact_id,
|
||
is_new: contactData.is_new,
|
||
cf_2624: cf_2624,
|
||
contact_data_confirmed: contact_data_confirmed,
|
||
contact_data_can_edit: contact_data_can_edit
|
||
});
|
||
|
||
// --- 2.1. Получаем полные данные контакта из PostgreSQL (если есть) ---
|
||
let contactFromDB = null;
|
||
try {
|
||
// Пытаемся найти ноду PostgreSQL, которая получила данные контакта
|
||
const possiblePostgresNodes = [
|
||
'PostgreSQL: Get Contact Data',
|
||
'Get Contact from DB',
|
||
'PostgreSQL',
|
||
'Get Contact Details'
|
||
];
|
||
|
||
for (const nodeName of possiblePostgresNodes) {
|
||
try {
|
||
const node = $(nodeName)?.first();
|
||
if (node && node.json) {
|
||
// Проверяем, что это данные контакта (есть contactid)
|
||
if (node.json.contactid || node.json.contact_id) {
|
||
contactFromDB = node.json;
|
||
console.log('✅ Получены данные контакта из PostgreSQL:', {
|
||
contactid: contactFromDB.contactid || contactFromDB.contact_id,
|
||
firstname: contactFromDB.firstname,
|
||
lastname: contactFromDB.lastname
|
||
});
|
||
break;
|
||
}
|
||
}
|
||
} catch (e) {
|
||
continue;
|
||
}
|
||
}
|
||
|
||
// Альтернативный способ: ищем по структуре данных
|
||
if (!contactFromDB) {
|
||
// Может быть в предыдущей ноде с результатом запроса
|
||
const inputData = $input.all();
|
||
for (const item of inputData) {
|
||
if (item.json && (item.json.contactid || item.json.contact_id)) {
|
||
contactFromDB = item.json;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
} catch (e) {
|
||
console.warn('⚠️ Не удалось получить данные контакта из PostgreSQL:', e.message);
|
||
}
|
||
|
||
// Если данные из БД получены - используем их для дополнения информации
|
||
if (contactFromDB) {
|
||
console.log('📋 Данные контакта из БД:', {
|
||
contactid: contactFromDB.contactid,
|
||
firstname: contactFromDB.firstname,
|
||
lastname: contactFromDB.lastname,
|
||
email: contactFromDB.email,
|
||
mobile: contactFromDB.mobile,
|
||
birthday: contactFromDB.birthday,
|
||
mailingstreet: contactFromDB.mailingstreet,
|
||
middle_name: contactFromDB.middle_name,
|
||
birthplace: contactFromDB.birthplace,
|
||
inn: contactFromDB.inn
|
||
});
|
||
}
|
||
|
||
// --- 3. Телефон из Edit Fields ---
|
||
let phone = null;
|
||
try {
|
||
const editFields = $('Edit Fields')?.first();
|
||
if (editFields && editFields.json) {
|
||
phone = editFields.json.phone;
|
||
}
|
||
} catch (e) {
|
||
console.warn('⚠️ Не удалось получить phone из Edit Fields:', e.message);
|
||
}
|
||
|
||
// --- 4. unified_id из user_get ---
|
||
let unified_id = null;
|
||
try {
|
||
const possibleUserNodes = ['user_get', 'Find or Create User', 'PostgreSQL: Find User'];
|
||
for (const nodeName of possibleUserNodes) {
|
||
try {
|
||
const node = $node[nodeName];
|
||
if (node && node.json && node.json.unified_id) {
|
||
unified_id = node.json.unified_id;
|
||
break;
|
||
}
|
||
} catch (e) {
|
||
// Нода не существует или не выполнена - продолжаем поиск
|
||
continue;
|
||
}
|
||
}
|
||
|
||
if (!unified_id) {
|
||
console.warn('⚠️ unified_id не получен из ноды user_get. Проверьте, что нода выполнена.');
|
||
}
|
||
} catch (e) {
|
||
console.warn('⚠️ Не удалось получить unified_id:', e.message);
|
||
}
|
||
|
||
// --- 5. Генерируем session_id (если не получен из предыдущих нод) ---
|
||
let session_id = null;
|
||
|
||
// Пытаемся получить session_id из предыдущих нод
|
||
try {
|
||
const possibleSessionNodes = [
|
||
'Code in JavaScript1',
|
||
'Code in JavaScript',
|
||
'Set Session Data',
|
||
'Create Session'
|
||
];
|
||
|
||
for (const nodeName of possibleSessionNodes) {
|
||
try {
|
||
const node = $(nodeName)?.first();
|
||
if (node && node.json) {
|
||
if (node.json.session_id) {
|
||
session_id = node.json.session_id;
|
||
break;
|
||
} else if (node.json.redis_value) {
|
||
const parsed = JSON.parse(node.json.redis_value);
|
||
if (parsed.session_id) {
|
||
session_id = parsed.session_id;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
} catch (e) {
|
||
continue;
|
||
}
|
||
}
|
||
|
||
// Пытаемся получить из Edit Fields
|
||
if (!session_id) {
|
||
try {
|
||
const editFields = $('Edit Fields')?.first();
|
||
if (editFields && editFields.json && editFields.json.session_id) {
|
||
session_id = editFields.json.session_id;
|
||
}
|
||
} catch (e) {
|
||
// Игнорируем
|
||
}
|
||
}
|
||
} catch (e) {
|
||
console.warn('⚠️ Не удалось получить session_id из предыдущих нод:', e.message);
|
||
}
|
||
|
||
// Если session_id не найден - генерируем новый
|
||
if (!session_id) {
|
||
session_id = 'sess_' + generateUUIDv4();
|
||
console.log('✅ Сгенерирован новый session_id:', session_id);
|
||
}
|
||
|
||
// --- 6. Формируем sessionData для Redis ---
|
||
const sessionData = {
|
||
session_id, // ← теперь сохраняем внутрь
|
||
unified_id,
|
||
contact_id: contactData.contact_id,
|
||
phone,
|
||
is_new_contact: contactData.is_new || contactData.is_new_contact || false,
|
||
// ✅ Флаги подтверждения данных контакта (из cf_2624)
|
||
cf_2624: cf_2624,
|
||
contact_data_confirmed: contact_data_confirmed,
|
||
contact_data_can_edit: contact_data_can_edit,
|
||
// ✅ Данные контакта из PostgreSQL (если получены)
|
||
contact_from_db: contactFromDB ? {
|
||
contactid: contactFromDB.contactid || contactFromDB.contact_id,
|
||
firstname: contactFromDB.firstname,
|
||
lastname: contactFromDB.lastname,
|
||
email: contactFromDB.email,
|
||
mobile: contactFromDB.mobile,
|
||
phone: contactFromDB.phone,
|
||
birthday: contactFromDB.birthday,
|
||
mailingstreet: contactFromDB.mailingstreet,
|
||
mailingcity: contactFromDB.mailingcity,
|
||
mailingstate: contactFromDB.mailingstate,
|
||
mailingzip: contactFromDB.mailingzip,
|
||
mailingcountry: contactFromDB.mailingcountry,
|
||
middle_name: contactFromDB.middle_name,
|
||
birthplace: contactFromDB.birthplace,
|
||
inn: contactFromDB.inn,
|
||
requisites: contactFromDB.requisites,
|
||
code: contactFromDB.code,
|
||
sms: contactFromDB.sms
|
||
} : null,
|
||
status: "draft",
|
||
current_step: 1,
|
||
created_at: new Date().toISOString(),
|
||
updated_at: new Date().toISOString(),
|
||
documents: {},
|
||
email: contactFromDB?.email || null,
|
||
bank_name: null
|
||
};
|
||
|
||
// --- 7. Возвращаем результат в формате items ---
|
||
const result = {
|
||
json: {
|
||
session: session_id,
|
||
session_id,
|
||
unified_id,
|
||
contact_id: contactData.contact_id,
|
||
is_new_contact: contactData.is_new || contactData.is_new_contact || false,
|
||
phone,
|
||
// ✅ Флаги подтверждения данных контакта (из cf_2624)
|
||
cf_2624: cf_2624,
|
||
contact_data_confirmed: contact_data_confirmed,
|
||
contact_data_can_edit: contact_data_can_edit,
|
||
redis_key: `session:${session_id}`,
|
||
redis_value: JSON.stringify(sessionData),
|
||
ttl: 604800
|
||
}
|
||
};
|
||
|
||
// Логируем финальный ответ для отладки
|
||
console.log('✅ Сформирован ответ для фронтенда:', {
|
||
session_id: result.json.session_id,
|
||
has_unified_id: !!result.json.unified_id,
|
||
has_contact_id: !!result.json.contact_id,
|
||
contact_data_confirmed: result.json.contact_data_confirmed,
|
||
cf_2624: result.json.cf_2624,
|
||
is_new_contact: result.json.is_new_contact
|
||
});
|
||
|
||
return [result];
|
||
|