From 4516fe8bfef520f7ab788360f782c65b5a5f3f38 Mon Sep 17 00:00:00 2001 From: AI Assistant Date: Mon, 24 Nov 2025 16:33:16 +0300 Subject: [PATCH] feat: Add wizard_answers to propertyName conversion mapping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: - Data comes from DB in wizard_answers format (answers to wizard questions) - Form confirmation expects propertyName format (structured data: applicant, case, contract_or_service) - transformDraftToClaimPlanFormat tried to extract propertyName data from DB, but it doesn't exist there - Form shows empty because propertyName structure is empty Solution: 1. Added wizard_answers parsing from multiple sources: - body.answers, payload.answers - body.wizard_answers, payload.wizard_answers 2. Added basic field mapping from wizard_answers to propertyName: - answersParsed.item → contract_or_service.subject - answersParsed.price → contract_or_service.amount_paid - answersParsed.place_date → contract_or_service.agreement_date - answersParsed.steps_taken → claim.description 3. Added logging to debug data flow: - Logs what data exists in DB - Logs wizard_answers parsing - Logs conversion process Note: This is a basic mapping. Full conversion requires complete field mapping from wizard_answers to propertyName structure. Files: - frontend/src/pages/ClaimForm.tsx: Added wizard_answers conversion --- frontend/src/pages/ClaimForm.tsx | 42 +++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/ClaimForm.tsx b/frontend/src/pages/ClaimForm.tsx index d42d1da..43f9155 100644 --- a/frontend/src/pages/ClaimForm.tsx +++ b/frontend/src/pages/ClaimForm.tsx @@ -290,6 +290,15 @@ export default function ClaimForm() { claimKeys: Object.keys(claim), }); + console.log('🔄 Данные из БД:', { + hasApplicantData: !!(body.applicant || payload.applicant), + hasCaseData: !!(body.case || payload.case), + hasContractData: !!(body.contract_or_service || payload.contract_or_service), + hasWizardAnswers: !!(body.answers || payload.answers || body.wizard_answers || payload.wizard_answers), + payloadKeys: Object.keys(payload), + bodyKeys: Object.keys(body), + }); + // Извлекаем данные из body (telegram) или напрямую из payload (web_form) const applicantData = body.applicant || payload.applicant || {}; const caseData = body.case || payload.case || {}; @@ -300,7 +309,7 @@ export default function ClaimForm() { const documentsMeta = body.documents_meta || payload.documents_meta || []; // Извлекаем ответы на вопросы из wizard_answers - const wizardAnswers = body.answers || payload.answers || {}; + const wizardAnswers = body.answers || payload.answers || body.wizard_answers || payload.wizard_answers || {}; let answersParsed = wizardAnswers; if (typeof wizardAnswers === 'string') { try { @@ -311,6 +320,37 @@ export default function ClaimForm() { } } + console.log('🔄 wizard_answers parsed:', answersParsed); + + // Преобразуем wizard_answers в формат propertyName, если данных нет в propertyName формате + // Маппинг полей из wizard_answers в propertyName структуру + const hasPropertyNameData = !!(applicantData.first_name || applicantData.last_name || caseData.category || contractData.subject); + + if (!hasPropertyNameData && answersParsed && Object.keys(answersParsed).length > 0) { + console.log('🔄 Преобразуем wizard_answers в propertyName формат'); + + // Маппинг полей из wizard_answers + // Например: answersParsed.item → contract_or_service.subject + // answersParsed.price → contract_or_service.amount_paid + // и т.д. + + // Если есть данные в wizard_answers, используем их для заполнения propertyName + if (answersParsed.item && !contractData.subject) { + contractData.subject = answersParsed.item; + } + if (answersParsed.price && !contractData.amount_paid) { + contractData.amount_paid = answersParsed.price; + contractData.amount_paid_fmt = answersParsed.price; + } + if (answersParsed.place_date && !contractData.agreement_date) { + // Можно попытаться распарсить дату из place_date + contractData.agreement_date = answersParsed.place_date; + } + if (answersParsed.steps_taken && !claimData.description) { + claimData.description = answersParsed.steps_taken; + } + } + // Формируем attachments_names из documents_meta const attachmentsNames = documentsMeta.map((doc: any) => { return doc.original_file_name || doc.file_name || doc.field_name || 'Документ';