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