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:
@@ -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(/</g, '\\u003c');
|
||||
|
||||
Reference in New Issue
Block a user