diff --git a/ticket_form/SESSION_LOG_2025-12-03.md b/ticket_form/SESSION_LOG_2025-12-03.md index fb46bb6b..489bb751 100644 --- a/ticket_form/SESSION_LOG_2025-12-03.md +++ b/ticket_form/SESSION_LOG_2025-12-03.md @@ -195,3 +195,4 @@ curl "http://localhost:8200/api/v1/claims/drafts/226564ce-d7cf-48ee-a820-690e8f5 **Время работы:** 2025-12-03 16:00-17:00 **Статус:** ✅ Завершено успешно + diff --git a/ticket_form/backend/app/services/crm_mysql_service.py b/ticket_form/backend/app/services/crm_mysql_service.py index a6ba8e83..091a1b27 100644 --- a/ticket_form/backend/app/services/crm_mysql_service.py +++ b/ticket_form/backend/app/services/crm_mysql_service.py @@ -115,3 +115,4 @@ class CrmMySQLService: # Глобальный экземпляр crm_mysql_service = CrmMySQLService() + diff --git a/ticket_form/docs/CF_2624_IMPLEMENTATION_SUMMARY.md b/ticket_form/docs/CF_2624_IMPLEMENTATION_SUMMARY.md index b19ebf4d..d777f17a 100644 --- a/ticket_form/docs/CF_2624_IMPLEMENTATION_SUMMARY.md +++ b/ticket_form/docs/CF_2624_IMPLEMENTATION_SUMMARY.md @@ -133,3 +133,4 @@ return { - `ticket_form/docs/N8N_UPDATE_CF_2624_IN_RESPONSE.md` - Обновление n8n workflow - `ticket_form/docs/CODE_CREATE_WEB_CONTACT_FINAL.js` - Код для n8n (обновлён) + diff --git a/ticket_form/docs/CF_2624_IN_OCR_STATUS_EVENT.md b/ticket_form/docs/CF_2624_IN_OCR_STATUS_EVENT.md index f487aeac..9a0e440e 100644 --- a/ticket_form/docs/CF_2624_IN_OCR_STATUS_EVENT.md +++ b/ticket_form/docs/CF_2624_IN_OCR_STATUS_EVENT.md @@ -111,3 +111,4 @@ LIMIT 1; - Сохраняться в черновик в `payload.cf_2624` - Использоваться для блокировки полей на фронтенде + diff --git a/ticket_form/docs/N8N_ADD_CF_2624_TO_OCR_STATUS_EVENT.md b/ticket_form/docs/N8N_ADD_CF_2624_TO_OCR_STATUS_EVENT.md index 28b449b0..7153b6e4 100644 --- a/ticket_form/docs/N8N_ADD_CF_2624_TO_OCR_STATUS_EVENT.md +++ b/ticket_form/docs/N8N_ADD_CF_2624_TO_OCR_STATUS_EVENT.md @@ -207,3 +207,4 @@ if actual_event.get('event_type') == 'ocr_status' and actual_event.get('status') - ✅ Обрабатываться backend'ом - ✅ Сохраняться в черновик в поле `payload.cf_2624` + diff --git a/ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.md b/ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.md index 18f878a4..83111c52 100644 --- a/ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.md +++ b/ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.md @@ -71,3 +71,4 @@ if (pgContactNode && pgContactNode.json && pgContactNode.json.length > 0) { **Примечание:** Название файла `N8N_POSTGRESQL_GET_CONTACT_DATA.sql` устарело, но запрос работает для MySQL. + diff --git a/ticket_form/docs/N8N_UPDATE_CF_2624_IN_RESPONSE.md b/ticket_form/docs/N8N_UPDATE_CF_2624_IN_RESPONSE.md index 916fb27b..2b1c1669 100644 --- a/ticket_form/docs/N8N_UPDATE_CF_2624_IN_RESPONSE.md +++ b/ticket_form/docs/N8N_UPDATE_CF_2624_IN_RESPONSE.md @@ -144,3 +144,4 @@ if (contact_id) { } ``` + diff --git a/ticket_form/docs/N8N_WORKFLOW_ADD_POSTGRESQL_CONTACT.md b/ticket_form/docs/N8N_WORKFLOW_ADD_POSTGRESQL_CONTACT.md index 49685e98..9d5d8b8e 100644 --- a/ticket_form/docs/N8N_WORKFLOW_ADD_POSTGRESQL_CONTACT.md +++ b/ticket_form/docs/N8N_WORKFLOW_ADD_POSTGRESQL_CONTACT.md @@ -97,3 +97,4 @@ LIMIT 1; Но лучше использовать PostgreSQL напрямую для скорости. + diff --git a/ticket_form/frontend/src/components/form/Step1Phone.tsx b/ticket_form/frontend/src/components/form/Step1Phone.tsx index bdc7f20a..092d6577 100644 --- a/ticket_form/frontend/src/components/form/Step1Phone.tsx +++ b/ticket_form/frontend/src/components/form/Step1Phone.tsx @@ -290,12 +290,14 @@ export default function Step1Phone({ } // Оставляем только первые 10 цифр cleanText = cleanText.substring(0, 10); - // Устанавливаем очищенное значение - form.setFieldValue('phone', cleanText); - // Показываем предупреждение, если номер был обрезан - if (pastedText.replace(/\D/g, '').length > 10) { - message.warning('Номер автоматически обрезан до 10 цифр'); - } + // ✅ Используем setTimeout для избежания циклических ссылок при обновлении формы + setTimeout(() => { + form.setFieldValue('phone', cleanText); + // Показываем предупреждение, если номер был обрезан + if (pastedText.replace(/\D/g, '').length > 10) { + message.warning('Номер автоматически обрезан до 10 цифр'); + } + }, 0); }} /> diff --git a/ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts b/ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts index 589088f5..023f77b0 100644 --- a/ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts +++ b/ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts @@ -811,14 +811,18 @@ export function generateConfirmationFormHTML(data: any, contact_data_confirmed: extra = ' type="email" inputmode="email" autocomplete="email"'; } + // ✅ Добавляем name атрибут для правильной работы форм и автозаполнения + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + (index !== undefined ? '_' + index : '') + '"'; var fieldHtml = ''; + ' id="' + id + '" ' + nameAttr + ' value="' + esc(value || '') + '" placeholder="' + esc(placeholder || '') + '"' + extra + ' />'; return fieldHtml; } function createReadonlyField(root, key, value) { var id = 'field_' + root + '_' + key + '_readonly_' + Math.random().toString(36).slice(2); - return ''; + // ✅ Добавляем name атрибут для правильной работы форм + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + '"'; + return ''; } function createDateField(root, key, value) { @@ -834,20 +838,25 @@ export function generateConfirmationFormHTML(data: any, contact_data_confirmed: } } + // ✅ Добавляем name атрибут для правильной работы форм + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + '"'; + // ✅ Проверяем, нужно ли блокировать поле (для подтверждённых данных) var isLockedField = contact_data_confirmed && root === 'user' && key === 'birthday'; if (isLockedField) { - return ''; + return ''; } - return ''; + return ''; } function createMoneyField(root, key, value) { var id = 'field_' + root + '_' + key + '_' + Math.random().toString(36).slice(2); + // ✅ Добавляем name атрибут для правильной работы форм + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + '"'; return '
' + '' + 'рублей' + '
'; @@ -855,20 +864,25 @@ export function generateConfirmationFormHTML(data: any, contact_data_confirmed: function createTextarea(root, key, value) { var id = 'field_' + root + '_' + key + '_' + Math.random().toString(36).slice(2); - return ''; + // ✅ Добавляем name атрибут для правильной работы форм + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + '"'; + return ''; } function createBankSelect(root, key, value) { var id = 'field_' + root + '_' + key + '_' + Math.random().toString(36).slice(2); var datalistId = 'bank-datalist-' + id; + // ✅ Добавляем name атрибут для правильной работы форм + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + '"'; // Создаём input с datalist для автоподстановки - var inputHtml = ''; + var inputHtml = ''; inputHtml += ''; inputHtml += ''; inputHtml += ''; // Скрытое поле для bank_id var hiddenId = id + '_id'; - inputHtml += ''; + var hiddenNameAttr = 'name="' + esc(root) + '_bank_id"'; + inputHtml += ''; return inputHtml; } @@ -876,9 +890,12 @@ export function generateConfirmationFormHTML(data: any, contact_data_confirmed: var id = 'field_' + root + '_' + key + '_' + Math.random().toString(36).slice(2); var checkedAttr = checked ? ' checked' : ''; var requiredClass = required ? ' required-checkbox' : ''; + // ✅ Добавляем name атрибут для правильной работы форм + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + '"'; + // ✅ Label правильно связан с input через for/id var checkboxHtml = '';