From c410eb77c965a11209cc99f4bafface0bdf0cc12 Mon Sep 17 00:00:00 2001 From: AI Assistant Date: Mon, 24 Nov 2025 15:38:24 +0300 Subject: [PATCH] fix: Simplify data normalization in confirmation form HTML generator Problem: - Function was trying to normalize already normalized data - Used undefined 'raw' variable after refactoring - Data structure mismatch causing form not to render Solution: 1. Removed redundant normalization logic: - Data is already normalized in StepClaimConfirmation component - Use caseObj directly from data.case - Only ensure base structures exist (user, project, offenders, meta, attachments) 2. Fixed undefined variable: - Changed raw.token to data.token - Removed unused normalization code 3. Simplified data flow: - Input: data.case (already normalized) - Output: caseJson with same structure - JavaScript in HTML uses injected.case directly Files: - frontend/src/components/form/generateConfirmationFormHTML.ts: Simplified normalization --- .../form/generateConfirmationFormHTML.ts | 115 +++--------------- 1 file changed, 17 insertions(+), 98 deletions(-) diff --git a/frontend/src/components/form/generateConfirmationFormHTML.ts b/frontend/src/components/form/generateConfirmationFormHTML.ts index 0f97f1a..b1516a2 100644 --- a/frontend/src/components/form/generateConfirmationFormHTML.ts +++ b/frontend/src/components/form/generateConfirmationFormHTML.ts @@ -2,16 +2,18 @@ // Основана на структуре из n8n Code node "Mini-app Подтверждение данных" export function generateConfirmationFormHTML(data: any): string { - // Нормализуем данные - const raw = { - propertyName: data.case || {}, - session_token: data.session_token || '', + // Данные уже нормализованы в компоненте, используем их напрямую + 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 || '', - token: data.token || '', + status: data.case?.meta?.status || '', }; // Извлекаем SMS данные @@ -108,102 +110,19 @@ export function generateConfirmationFormHTML(data: any): string { ogrn: null, }; - // Нормализация данных - function normalizeData(data: any): any { - // Если данные приходят в новом формате (с propertyName) - if (data.propertyName && data.propertyName.applicant) { - const props = data.propertyName; - const applicant = props.applicant || {}; - const caseData = props.case || {}; - const contract = props.contract_or_service || {}; - const offenders = props.offenders || []; - const claim = props.claim || {}; - const meta = props.meta || {}; - const attachments = props.attachments_names || []; - - return { - user: { - firstname: applicant.first_name || null, - secondname: applicant.middle_name || null, - lastname: applicant.last_name || null, - mobile: applicant.phone || null, - email: applicant.email || null, - birthday: applicant.birth_date_fmt || applicant.birth_date || null, - birthplace: applicant.birth_place || null, - mailingstreet: applicant.address || null, - inn: applicant.inn || null, - tgid: null, - }, - project: { - category: caseData.category || null, - direction: caseData.direction || null, - agrprice: normalizeMoney(contract.amount_paid_fmt || contract.amount_paid) || null, - subject: contract.subject || null, - agrdate: contract.agreement_date_fmt || contract.agreement_date || null, - startdate: contract.period_start_fmt || contract.period_start || null, - finishdate: contract.period_end_fmt || contract.period_end || null, - period_text: contract.period_text || null, - description: claim.description || null, - reason: claim.reason || caseData.category || null, - }, - attachments: attachments, - offenders: offenders.map((o: any) => ({ - accountname: o.name || null, - address: o.address || null, - email: o.email || null, - website: o.website || null, - phone: o.phone || null, - inn: o.inn || null, - ogrn: o.ogrn || null, - })), - meta: { - ...meta, - session_token: data.session_token || meta.claim_id || null, - prefix: data.prefix || null, - telegram_id: data.telegram_id || null, - claim_id: data.claim_id || meta.claim_id || null, - unified_id: meta.unified_id || null, - user_id: meta.user_id || null, - }, - }; - } - - // Старый формат (обратная совместимость) - return { - user: Object.assign({}, baseUser, tryParseJSON(data.user) || data.user || {}), - project: Object.assign({}, baseProject, tryParseJSON(data.project) || data.project || {}), - offenders: Array.isArray(data.offenders) - ? data.offenders.map((o: any) => Object.assign({}, baseOffender, o || {})) - : [], - meta: Object.assign({}, data.meta || {}), - }; - } - - // Нормализуем данные - let dataCandidate = null; - if (raw.propertyName !== undefined) { - if (typeof raw.propertyName === 'object' && raw.propertyName !== null) { - dataCandidate = raw.propertyName; - } else if (typeof raw.propertyName === 'string') { - dataCandidate = tryParseJSON(raw.propertyName); - } - } - if (!dataCandidate && raw.value !== undefined) dataCandidate = tryParseJSON(raw.value); - if (!dataCandidate && (raw.user || raw.project || raw.offenders || raw.meta)) - dataCandidate = raw; - if (!dataCandidate && raw.data) dataCandidate = raw.data; - if (!dataCandidate && raw.output) dataCandidate = tryParseJSON(raw.output) || raw.output; - dataCandidate = dataCandidate || {}; - - const dataToNormalize = Array.isArray(dataCandidate) ? dataCandidate[0] : dataCandidate; - const caseObj = normalizeData({ propertyName: dataToNormalize, ...raw }); - if (!caseObj.offenders.length) { + // Данные уже нормализованы, используем их напрямую + // Убеждаемся, что есть базовые структуры + 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 = []; // Сервисные поля - const sessionToken = String(safeGet(caseObj.meta?.session_token, raw.session_token, '')); - const telegramId = String(safeGet(caseObj.user?.tgid, raw.telegram_id, '')); + 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, '')), @@ -219,7 +138,7 @@ export function generateConfirmationFormHTML(data: any): string { case: caseObj, session_token: sessionToken, telegram_id: telegramId, - token: raw.token || '', + token: data.token || '', sms_meta: smsMetaData, }); caseJson = caseJson.replace(/