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