- Установка значения напрямую в input элемент
- Триггер события input для синхронизации с формой
- Использование requestAnimationFrame вместо setTimeout для более надёжной работы
Теперь можно вставлять номер телефона через Ctrl+V / Cmd+V
- Добавлена генерация безопасного id (убираются специальные символы)
- Добавлено экранирование id при использовании в атрибуте for
- Убеждаемся, что id и for всегда совпадают
Исправляет предупреждение: 'Incorrect use of <label for=FORM_ELEMENT>'
- Исправлена проблема с циклическими ссылками в Step1Phone.tsx при onPaste (добавлен setTimeout)
- Добавлены name атрибуты во все поля формы для правильной работы форм и автозаполнения
- Исправлены проблемы с label/input связями (все label имеют правильные for/id)
- Все поля теперь имеют id и name атрибуты (исправляет предупреждения в консоли)
Исправленные функции:
- createField: добавлен name атрибут
- createReadonlyField: добавлен name атрибут
- createDateField: добавлен name атрибут
- createMoneyField: добавлен name атрибут
- createTextarea: добавлен name атрибут
- createBankSelect: добавлен name атрибут для основного поля и скрытого bank_id
- createCheckbox: добавлен name атрибут, проверена связь label/input
- Добавлены звёздочки (*) рядом с обязательными полями
- Незаполненные обязательные поля подсвечиваются жёлтой рамкой
- Добавлен блок с предупреждением о незаполненных полях перед кнопкой отправки
- Улучшена валидация с визуальной обратной связью
- Пользователю теперь понятно, какие поля нужно заполнить
- Исправлена ошибка 'setSelectionRange not supported for email field' - добавлен try-catch и проверка типа поля
- Добавлено логирование наличия contact_data_confirmed, cf_2624, bank_id, bank_name в body запроса
- Это поможет отследить, передаются ли поля из frontend в backend
- Добавлен type='email' и inputmode='email' для полей email
- Это исправляет проблему, когда в поле email контрагента можно было вводить только цифры
- Обработчики событий уже были настроены правильно, но не хватало правильного типа поля
- Добавлено логирование извлечения contact_data_confirmed, cf_2624, bank_id, bank_name из body
- Добавлено логирование наличия этих полей в event_data перед отправкой в Redis
- Поможет отследить, передаются ли поля из frontend в backend
- Добавлен callback onSubmitted в StepClaimConfirmation
- После успешной отправки (SMS-верификации) сразу показывается сообщение об успехе
- Убрана форма редактирования после отправки
- Пользователь видит только сообщение: 'Поздравляем! Ваше обращение направлено в Клиентправ...'
Frontend (StepClaimConfirmation):
- Добавлен contact_data_confirmed в payload для Redis канала
- Добавлен cf_2624 (значение для CRM: 1 или 0)
- Добавлены bank_id и bank_name в payload
- bank_name сохраняется в state при выборе банка
Backend (claims.py):
- Добавлены contact_data_confirmed и cf_2624 в event_data
- Добавлены bank_id и bank_name в event_data для Redis канала clientright:webform:approve
Обновлён статус заявления 226564ce-d7cf-48ee-a820-690e8f5ec8e5 на draft_claim_ready для тестирования
- Заменён текст на главной странице после отправки:
'Поздравляем! Ваше обращение направлено в Клиентправ.'
'В ближайшее время на указанную Вами электронную почту поступит письмо, подтверждающее регистрацию вашего обращения.'
- Обновлены toast-уведомления при отправке заявления
- Убрано старое сообщение 'Мы изучаем ваш вопрос и документы'
- Добавлен bank_id в список обязательных полей в validateAllFields()
- Обновлён placeholder: "Начните вводить название банка (обязательно)"
- Обновлён заголовок: "Банк для получения выплаты (обязательно)"
- При отправке формы проверяется заполнение банка
Теперь форма не отправится без выбора банка для получения выплаты по СБП.
- ИНН организации теперь обязательное поле
- E-mail организации теперь обязательное поле
- Обновлены placeholder'ы с указанием (обязательно)
- Обновлена валидация validateAllFields()
Обязательные поля для контрагентов:
1. Наименование (accountname)
2. ИНН (inn)
3. Адрес (address)
4. E-mail (email)
Необязательные:
- Телефон (phone)
- Сайт (website)
- Изменён docker-compose.yml: добавлен network_mode: host для доступа к MySQL на хосте
- Обновлён config.py: mysql_crm_host = localhost (работает в режиме host)
- MySQL CRM теперь успешно подключается из контейнера
- Получение cf_2624 из MySQL при загрузке черновика
- Исправление подключения MySQL CRM из Docker контейнера
- Блокировка редактирования полей при contact_data_confirmed=true
- Выбор банка для СБП выплат
- Все проблемы решены, система работает корректно
- Добавлен prop contact_data_confirmed в StepClaimConfirmation
- Передача флага из formData.contact_data_confirmed в компонент
- Исправлена логика получения флага (приоритет: props > claimPlanData > false)
- Поля должны блокироваться при contact_data_confirmed=true
- Добавлен сервис CrmMySQLService для подключения к MySQL БД vtiger CRM
- Обновлён get_draft() для прямого SQL запроса к MySQL вместо webservice API
- Получение cf_2624 и всех данных контакта из MySQL
- Обновлена документация и SQL файлы для n8n
- Добавлено логирование для отладки
Преимущества:
- Проще: один SQL запрос вместо цепочки HTTP запросов
- Быстрее: прямой запрос к БД
- Надёжнее: не зависит от webservice API
- Актуальнее: всегда свежие данные из БД
- Step1Phone: добавлена обработка вставки телефона с автоматической очисткой от +7 и обрезкой до 10 цифр
- Step3Payment: заменён Select на AutoComplete для выбора банка с автоподстановкой
- generateConfirmationFormHTML: заменён select на input с datalist для автоподстановки банков в форме подтверждения
- Добавлены скрытые поля bank_id для сохранения ID банка отдельно от названия
- Добавлены файлы для проверки заявки 226564ce
Улучшения UX:
- Пользователь может вводить название банка вместо прокрутки длинного списка
- Автоматическая фильтрация списка банков при вводе
- Предупреждение при обрезке номера телефона при вставке
Frontend:
- Динамическая загрузка 226 банков из NSPK API
- Выбор банка добавлен в Step3Payment (новая заявка)
- Выбор банка добавлен в generateConfirmationFormHTML (редактирование)
- Поля: bank_id (ID из NSPK) и bank_name (название для отображения)
Backend:
- Добавлено поле bank_id в ClaimCreateRequest
API:
- http://212.193.27.93/api/payouts/dictionaries/nspk-banks
Изменения:
- ticket_form/frontend/src/components/form/Step3Payment.tsx
- ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts
- ticket_form/frontend/src/pages/ClaimForm.tsx
- ticket_form/backend/app/api/models.py
Frontend:
- Changed main title to 'Подать обращение о защите прав потребителя'
- Changed browser title to 'Clientright — защита прав потребителей'
- Enhanced draft cards: show problem_description (250 chars), category tag, document progress bar
- Fixed 'Назад' button to always return to draft selection
- Added SSE connection for OCR status updates
- Renamed steps: Вход, Обращение, Документы, Заявление
- Skip 'Проверка полиса' and 'Тип события' steps for new claim flow
Backend:
- Fixed client IP extraction (X-Forwarded-For, X-Real-IP)
- Added problem_title, category, documents_required_list to draft list API
- Fixed documents_uploaded count to count unique field_labels
CRM Webservices:
- Added UpsertContact.php - create/update contacts with tgid support
- Added UpsertAccounts.php - batch upsert offenders by INN
- Added UpsertProject.php - create/update projects with offender mapping
Database:
- Fixed documents_meta duplicates in existing claims
- SQL query for deduplication by field_name provided
- StepDraftSelection: кнопка 'Продолжить' активна для draft_docs_complete
- ClaimForm: проверка form_draft при загрузке черновика
- Если есть form_draft — преобразуем в propertyName и показываем форму подтверждения
- Поддержка статуса draft_docs_complete для перехода к подтверждению
- Использован ctypes.c_int32 для эмуляции JS 32-битного сдвига
- Теперь Python hash совпадает с JS hash в n8n
- Кэширование form_draft работает корректно
- Добавлена проверка наличия черновика в БД перед запуском RAG
- Если documents_hash совпадает — возвращаем черновик из кэша
- Если черновика нет или он устарел — запускаем RAG workflow
- Добавлен параметр force_refresh для принудительного обновления
- Импортирован db сервис для работы с PostgreSQL
- Обновлён Code1: нормализация данных из give_data1 с поддержкой payload.applicant, ai_analysis, wizard_plan
- Обновлён Code6: генерация промптов для RAG (user, project, offenders)
- Добавлена документация по настройке n8n нод для OCR статуса
- Добавлен эндпоинт check-ocr-status в documents.py
- Добавлен лог сессии с полным описанием workflow
Workflow itX62h38faB51y9J успешно извлекает:
- Данные пользователя (ФИО, контакты, адрес)
- Данные проекта (сумма, предмет, даты договора)
- Несколько контрагентов с разными ролями (seller, service_provider)
- Исправлен N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js: использовать uploads_field_labels[0] вместо [grp]
- Создан SQL_CLAIMSAVE_FIXED_NEW_FLOW_DEDUP.sql с дедупликацией documents_meta
- Создан SQL_CLEANUP_DOCUMENTS_META_DUPLICATES.sql для очистки существующих дубликатов
- Создан полный уникальный индекс idx_document_texts_hash_unique на document_texts(file_hash)
- Добавлен SESSION_LOG_2025-11-28_documents_dedup.md с описанием всех изменений
Fixes:
- field_label теперь корректно отображает 'Переписка' вместо 'group-2'
- documents_meta не накапливает дубликаты при повторных сохранениях
- ON CONFLICT (file_hash) теперь работает для document_texts
- StepDocumentsNew.tsx: поэкранная загрузка документов
- StepWaitingClaim.tsx: ожидание формирования заявления с SSE
- StepDraftSelection.tsx: поддержка новых статусов черновиков
- documents.py: API для загрузки документов
- NEW_FLOW_ARCHITECTURE.md: документация новой архитектуры
Флоу: Description → Documents → Waiting → Claim Review → SMS
Статусы: draft_new, draft_docs_progress, draft_docs_complete, draft_claim_ready
- Добавлены unified_id и contact_id в TicketFormDescriptionRequest
- Исправлен CODE_MERGE_PROJECT_TO_SESSION.js - теперь сохраняются ВСЕ данные из body.other
- Добавлен fallback на получение other из Webhook напрямую
- Генерация новой session_id при создании новой жалобы (сохраняя авторизацию)
- Добавлен SQL_SELECT_CONTACT_WITH_CUSTOM_FIELDS.sql для CRM контактов
- Создан SESSION_LOG_2025-11-25.md с документацией сессии
- Добавлен метод getRelatedDocs() для получения документов из связанных сущностей (контакты, контрагенты)
- Добавлен метод downloadS3File() для скачивания файлов из S3 во временную папку
- Добавлен метод cleanupTempFiles() для очистки временных файлов
- Исправлен getPaths() для корректной обработки S3 файлов (всегда запрашивает s3_bucket/s3_key из БД)
- Исправлен getArchive() для проектов: собирает документы из основной записи и связанных сущностей
- Исправлен путь к vendor/autoload.php (поиск по нескольким путям)
- Исправлено имя временного файла (короткое имя вместо полного пути для избежания 'File name too long')
Результат: архив успешно создается с документами из проекта и связанных сущностей (25 документов для проекта 396447)
- Убрана проверка claim_id из StepDescription.tsx
- Заменен claim_id на session_id в StepWizardPlan.tsx для SSE подключения
- Убран claim_id из запросов к API и сохранения в Step1Phone
- Обновлен backend для работы с опциональным claim_id
- Добавлена документация по исправлению узла claimsave для первичного черновика
- Добавлены SQL запросы и примеры кода для n8n workflow
- Исправлена ошибка ReferenceError при загрузке черновиков
- Переименована локальная переменная claimId в finalClaimId для избежания конфликта с параметром функции
- Обновлена логика извлечения claim_id из разных источников (claim.claim_id, payload.claim_id, body.claim_id, claim.id)
- Добавлен fallback на параметр claimId функции для надёжности
- Создан API create_document_with_text.php для создания DOCX/XLSX/PPTX с текстом от AI
- Поддержка Markdown форматирования (заголовки, жирный, курсив, списки, код)
- Установлен PHPWord для красивого форматирования документов
- Исправлены пути сохранения (crm2/CRM_Active_Files/... без /crm/ в начале)
- Замена пробелов на подчеркивания в именах папок
- Создана документация для AI и разработчиков
- Добавлены API для работы с шаблонами Nextcloud
- Добавлен resize handle (полоска для перетаскивания) слева от drawer
- Реализовано изменение ширины перетаскиванием (от 300px до 50% экрана)
- Сохранение ширины в localStorage
- Автоматическое обновление margin для main-container
- Обработка изменения размера окна браузера
- Скрытие resize handle на мобильных устройствах