// Функция генерации HTML формы подтверждения заявления // Основана на структуре из n8n Code node "Mini-app Подтверждение данных" export function generateConfirmationFormHTML(data: any): string { // Данные уже нормализованы в компоненте, используем их напрямую const caseObj = data.case || {}; // Извлекаем SMS данные const smsInputData = { prefix: data.sms_meta?.prefix || '', session_token: data.session_token || '', telegram_id: data.telegram_id || '', claim_id: data.case?.meta?.claim_id || '', unified_id: data.case?.meta?.unified_id || '', user_id: data.case?.meta?.user_id || '', status: data.case?.meta?.status || '', }; // Утилиты function safeGet(...keys: any[]): any { for (const k of keys) { if (k === undefined || k === null) continue; if (typeof k === 'object') { if (Object.keys(k).length) return k; continue; } const s = String(k).trim(); if (s !== '') return k; } return ''; } function tryParseJSON(x: any): any { try { return typeof x === 'string' ? JSON.parse(x) : x; } catch { return null; } } function escapeHtml(str: any): string { if (str === undefined || str === null) return ''; return String(str) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } // Нормализация денежной суммы function normalizeMoney(rawValue: any): number | null { if (!rawValue) return null; let s = String(rawValue); s = s.replace(/\s+/g, ''); s = s.replace(/руб(лей|ль|\.)?/gi, ''); s = s.replace(/₽|р\.|р$/gi, ''); s = s.replace(/[^0-9,.-]/g, ''); s = s.replace(',', '.'); if (!/^-?[0-9]+(\.[0-9]{1,2})?$/.test(s)) return null; const result = parseFloat(s); return result > 0 ? result : null; } // Базовые схемы const baseUser = { firstname: null, secondname: null, lastname: null, mobile: null, email: null, tgid: null, birthday: null, birthplace: null, mailingstreet: null, inn: null, }; const baseProject = { category: null, direction: null, agrprice: null, subject: null, agrdate: null, startdate: null, finishdate: null, period_text: null, description: null, reason: null, }; const baseOffender = { accountname: null, address: null, email: null, website: null, phone: null, inn: null, ogrn: null, }; // Данные уже нормализованы, используем их напрямую // Убеждаемся, что есть базовые структуры if (!caseObj.offenders || !caseObj.offenders.length) { caseObj.offenders = [Object.assign({}, baseOffender)]; } if (!caseObj.user) caseObj.user = Object.assign({}, baseUser, caseObj.user || {}); if (!caseObj.project) caseObj.project = Object.assign({}, baseProject, caseObj.project || {}); if (!caseObj.meta) caseObj.meta = {}; if (!caseObj.attachments) caseObj.attachments = []; // Нормализуем сумму, если она пришла в виде строки if (caseObj.project && caseObj.project.agrprice && typeof caseObj.project.agrprice === 'string') { const normalized = normalizeMoney(caseObj.project.agrprice); if (normalized !== null) { caseObj.project.agrprice = normalized; } } // Сервисные поля const sessionToken = String(safeGet(caseObj.meta?.session_token, data.session_token, '')); const telegramId = String(safeGet(caseObj.user?.tgid, data.telegram_id, '')); const smsMetaData = { session_token: String(safeGet(smsInputData.session_token, sessionToken, '')), prefix: String(safeGet(smsInputData.prefix, '')), telegram_id: String(safeGet(smsInputData.telegram_id, telegramId, '')), claim_id: String(safeGet(smsInputData.claim_id, '')), unified_id: String(safeGet(smsInputData.unified_id, '')), user_id: String(safeGet(smsInputData.user_id, '')), }; // Безопасно встраиваем данные в HTML let caseJson = JSON.stringify({ case: caseObj, session_token: sessionToken, telegram_id: telegramId, token: data.token || '', sms_meta: smsMetaData, }); caseJson = caseJson.replace(/ Подтверждение данных

📋 Редактирование заявления

Проверьте и при необходимости отредактируйте все поля

Загрузка…
`; return html; }