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
This commit is contained in:
AI Assistant
2025-11-24 15:38:24 +03:00
parent 827a1e46ad
commit c410eb77c9

View File

@@ -2,16 +2,18 @@
// Основана на структуре из n8n Code node "Mini-app Подтверждение данных" // Основана на структуре из n8n Code node "Mini-app Подтверждение данных"
export function generateConfirmationFormHTML(data: any): string { export function generateConfirmationFormHTML(data: any): string {
// Нормализуем данные // Данные уже нормализованы в компоненте, используем их напрямую
const raw = { const caseObj = data.case || {};
propertyName: data.case || {},
session_token: data.session_token || '', // Извлекаем SMS данные
const smsInputData = {
prefix: data.sms_meta?.prefix || '', prefix: data.sms_meta?.prefix || '',
session_token: data.session_token || '',
telegram_id: data.telegram_id || '', telegram_id: data.telegram_id || '',
claim_id: data.case?.meta?.claim_id || '', claim_id: data.case?.meta?.claim_id || '',
unified_id: data.case?.meta?.unified_id || '', unified_id: data.case?.meta?.unified_id || '',
user_id: data.case?.meta?.user_id || '', user_id: data.case?.meta?.user_id || '',
token: data.token || '', status: data.case?.meta?.status || '',
}; };
// Извлекаем SMS данные // Извлекаем SMS данные
@@ -108,102 +110,19 @@ export function generateConfirmationFormHTML(data: any): string {
ogrn: null, ogrn: null,
}; };
// Нормализация данных // Данные уже нормализованы, используем их напрямую
function normalizeData(data: any): any { // Убеждаемся, что есть базовые структуры
// Если данные приходят в новом формате (с propertyName) if (!caseObj.offenders || !caseObj.offenders.length) {
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) {
caseObj.offenders = [Object.assign({}, baseOffender)]; 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 sessionToken = String(safeGet(caseObj.meta?.session_token, data.session_token, ''));
const telegramId = String(safeGet(caseObj.user?.tgid, raw.telegram_id, '')); const telegramId = String(safeGet(caseObj.user?.tgid, data.telegram_id, ''));
const smsMetaData = { const smsMetaData = {
session_token: String(safeGet(smsInputData.session_token, sessionToken, '')), session_token: String(safeGet(smsInputData.session_token, sessionToken, '')),
@@ -219,7 +138,7 @@ export function generateConfirmationFormHTML(data: any): string {
case: caseObj, case: caseObj,
session_token: sessionToken, session_token: sessionToken,
telegram_id: telegramId, telegram_id: telegramId,
token: raw.token || '', token: data.token || '',
sms_meta: smsMetaData, sms_meta: smsMetaData,
}); });
caseJson = caseJson.replace(/</g, '\\u003c'); caseJson = caseJson.replace(/</g, '\\u003c');