Commit Graph

99 Commits

Author SHA1 Message Date
AI Assistant
ac1e127702 docs: Лог сессии 29.10 (часть 2) - Безопасность N8N Webhooks
Детальный лог работы по спрятыванию webhook URLs:
- Backend proxy для n8n
- Webhook URLs в .env
- Исправления проблем (относительные пути, event_type, пропущенные поля)
- Полная документация SECURITY_N8N_PROXY.md
- 4 коммита, все проблемы решены

Результат: Webhook URLs больше не видны в коде фронтенда
2025-10-29 18:24:53 +03:00
AI Assistant
789f891026 fix: Поддержка разных вариантов event_type для OCR событий
Проблема: Frontend ждал event_type='ocr_completed', но n8n отправлял 'policy_ocr_completed'
Из-за этого событие не обрабатывалось и показывалась ошибка

Решение: Гибкая проверка event_type:
- ocr_completed (старый формат)
- policy_ocr_completed (новый формат из n8n)
- любой *_ocr_completed (includes)

Теперь работает с любыми workflow которые шлют разные типы событий
2025-10-29 17:11:55 +03:00
AI Assistant
9a2deb97af fix: Добавлены пропущенные поля filename и upload_timestamp в n8n proxy
Проблема: Backend proxy не передавал filename и upload_timestamp к n8n
Это ломало обработку файлов в workflow

Изменения:
- Добавлены параметры filename и upload_timestamp в proxy_file_upload()
- Теперь передаём все поля которые отправляет frontend

Было в n8n body: {claim_id, voucher, session_id, file_type}
Стало: {claim_id, voucher, session_id, file_type, filename, upload_timestamp}
2025-10-29 17:01:59 +03:00
AI Assistant
2945cad263 fix: Используем относительные пути для API вместо localhost
Проблема: Frontend в Docker не мог достучаться до http://localhost:8100
Решение: Используем '/api/n8n/*' - Vite proxy автоматически перенаправит на backend

Изменения:
- Step1Policy.tsx: fetch('/api/n8n/policy/check')
- Step1Policy.tsx: fetch('/api/n8n/upload/file')
- StepDocumentUpload.tsx: fetch('/api/n8n/upload/file')

Vite proxy настроен в vite.config.ts:
  /api -> host.docker.internal:8100
  /events -> host.docker.internal:8100
2025-10-29 16:53:53 +03:00
AI Assistant
ef6a4160a4 security: 🔒 N8N webhook URLs спрятаны через backend proxy
- Создан n8n_proxy.py для безопасного проксирования запросов
- Webhook URLs перенесены в .env (скрыты от фронтенда)
- Frontend теперь использует /api/n8n/* endpoints
- Добавлена документация SECURITY_N8N_PROXY.md

Преимущества:
- Webhook URLs не видны в DevTools
- Централизованное логирование
- Возможность добавить rate limiting и auth
- Легко менять URLs без пересборки фронтенда
2025-10-29 16:49:03 +03:00
AI Assistant
f12416a901 docs: Создан лог сессии 29 октября - рефакторинг визарда на динамические шаги
- Документирован полный рефакторинг визарда (Вариант B)
- Каждый документ = отдельный шаг в прогресс-баре
- Созданы Step2EventType.tsx, StepDocumentUpload.tsx, documentConfigs.ts
- Переделан ClaimForm.tsx на динамические шаги через useMemo
- Исправлены проблемы: URL n8n, FormData структура, SSE логирование
- Исправлены прогресс и навигация через useCallback
- Всего 9 коммитов, ~1500 строк кода
2025-10-29 15:12:20 +03:00
AI Assistant
9f39847172 fix: Исправлена навигация назад через useCallback
- Обернул nextStep, prevStep, updateFormData, handleSubmit в useCallback
- Теперь функции стабильны и не пересоздаются при ререндере
- nextStep и prevStep используют functional update для setState
- Добавлено логирование навигации: ' nextStep' и ' prevStep'
- Исправлены зависимости useMemo для steps

ПРОБЛЕМА: prevStep вызывался, но setCurrentStep не обновлял стейт
РЕШЕНИЕ: useCallback гарантирует что функции стабильны
2025-10-29 14:09:20 +03:00
AI Assistant
d727b74d3c fix: Явно установлен disabled=false для всех кнопок Назад
- Добавлен disabled={false} для основной кнопки Назад
- Добавлен disabled={false} для DEV кнопок (Назад и Пропустить)
- Добавлено логирование при нажатии для отладки
- Теперь кнопки гарантированно кликабельны
2025-10-29 14:04:08 +03:00
AI Assistant
145a9bd205 fix: Исправлен расчёт прогресса загрузки документов
- Было: (currentDocNumber / totalDocs) * 100
  Документ 2/2 показывал 100% ДО загрузки

- Стало: ((currentDocNumber - 1) / totalDocs) * 100
  Документ 1/2: 0% (до загрузки) → 50% (после)
  Документ 2/2: 50% (до загрузки) → 100% (после)
2025-10-29 13:56:33 +03:00
AI Assistant
67f054d0b9 fix: Улучшено логирование SSE - убраны ложные ошибки
- Изменён console.error на console.log для нормального закрытия SSE
- Теперь показывается ' SSE закрыто после получения результата - всё ОК'
- Реальная ошибка выводится только если данные не получены
- Консоль больше не пугает красными ошибками при успешной работе
2025-10-29 12:58:09 +03:00
AI Assistant
4ad6b780fc fix: Исправлена структура FormData для загрузки документов
- Добавлен filename (оригинальное имя файла)
- Добавлен upload_timestamp (ISO timestamp)
- Изменён 'files' -> 'file' (единственное число)
- Исправлен webhook URL на правильный (7e2abc64...)
- Теперь структура соответствует ожидаемой n8n:
  {claim_id, file_type, filename, voucher, session_id, upload_timestamp, file}
2025-10-29 12:53:52 +03:00
AI Assistant
4e5bc767b2 fix: Исправлен URL n8n webhook на правильный домен
- Изменён URL с n8n.clientright.ru на n8n.clientright.pro
- Теперь загрузка файлов будет работать корректно
2025-10-29 12:47:35 +03:00
AI Assistant
f06105df98 fix: Исправлена работа Upload и кнопки Назад в StepDocumentUpload
- Upload: добавлен disabled во время загрузки
- Upload onChange: правильная обработка newFileList
- Кнопка Назад: убран disabled - теперь всегда доступна
- DEV кнопка Назад: также убран disabled
- Добавлено логирование handleUpload и onChange для отладки
2025-10-29 12:44:17 +03:00
AI Assistant
1f25301979 feat: Переделан визард на динамические шаги - каждый документ отдельный Step
- Создан Step2EventType.tsx для выбора типа страхового случая
- Создан StepDocumentUpload.tsx - универсальный компонент для загрузки одного документа
- Создан constants/documentConfigs.ts с конфигурацией документов для всех типов событий
- Переделан ClaimForm.tsx на динамическое создание шагов через useMemo
- Прогресс-бар теперь показывает: [Полис] → [Тип] → [Док1] → [Док2] → [Оплата]
- Бэкап старого Step2Details сохранён как Step2Details.OLD_WIZARD_INLINE.tsx
- Каждый документ загружается на отдельном шаге с модалкой обработки
- SSE для каждого документа с уникальным event_type
- DEV MODE кнопки для быстрой навигации на всех шагах
2025-10-29 12:36:30 +03:00
AI Assistant
6c19392528 docs: Обновлён лог сессии - добавлена вторая часть (умная форма Step 2) 2025-10-28 18:07:38 +03:00
AI Assistant
1207222202 fix: Удалён дублирующийся код в Step3Payment.tsx
Проблема: После строки 381 дублировался оборванный кусок DEV MODE панели (строки 383-441),
что вызывало синтаксическую ошибку 'Missing semicolon'.

Решение: Удалён дублирующийся код.
2025-10-28 13:09:22 +03:00
AI Assistant
299995138b fix: Удалён дублирующийся код в Step1Policy.tsx
Проблема: После строки 657 весь код компонента дублировался,
что вызывало синтаксическую ошибку 'Unexpected token' на строке 659.

Решение: Удалены строки 659-820 (дубликат кода).
2025-10-28 12:47:38 +03:00
AI Assistant
9084d75103 feat: Пошаговая загрузка документов с модалкой на Step 2
🎯 Изменения:
- Документы загружаются по очереди (один за другим)
- После загрузки каждого документа открывается модалка с крутилкой
- SSE слушает конкретный event_type: {file_type}_processed
- Модалка показывает результат распознавания с извлечёнными данными
- Кнопка 'Продолжить' → переход к следующему документу
- Опциональные документы можно пропустить
- После обработки всех обязательных → 'Далее на Step 3'

📊 UX флоу:
1. Выбор типа события → показываются нужные документы
2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить
3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить
4. Документ 3 (опц): Загрузить ИЛИ Пропустить
5. Все обязательные обработаны → Далее на Step 3

🔑 Каждый документ получает свой уникальный event_type:
- frontend отправляет file_type
- n8n возвращает event_type = {file_type}_processed
- frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
AI Assistant
122af07779 feat: Умная форма Step2 с автоматическим распознаванием документов
🤖 Переход на OCR/AI для извлечения данных из документов:

 Изменения:
- Убран ручной ввод полей (дата, номер рейса и тд)
- Добавлена умная загрузка документов в зависимости от типа события
- Каждый тип документа получает уникальный file_type для n8n
- Валидация обязательных документов перед переходом

📋 Типы документов и их file_type:
1. Задержка рейса:
   - flight_delay_boarding_or_ticket (обяз)
   - flight_delay_confirmation (обяз)

2. Отмена рейса:
   - flight_cancel_ticket (обяз)
   - flight_cancel_notice (обяз)

3. Пропуск стыковки:
   - connection_arrival_boarding (обяз)
   - connection_departure_boarding_or_ticket (обяз)
   - connection_delay_proof (опц)

4. Поезд (задержка):
   - train_ticket (обяз)
   - train_delay_proof (обяз)

5. Поезд (отмена):
   - train_ticket (обяз)
   - train_cancel_proof (обяз)

6. Паром:
   - ferry_ticket (обяз)
   - ferry_delay_proof (обяз)

7. Запасной аэродром:
   - emergency_boarding_or_ticket (обяз)
   - emergency_landing_proof (обяз)

🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты
для каждого типа документа.

Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
AI Assistant
6fe14598a1 backup: Сохранён старый Step2Details с ручным вводом полей
Создана копия Step2Details.OLD_MANUAL_INPUT.tsx перед переходом на
умную форму с автоматическим распознаванием документов через OCR/AI.

В случае необходимости можно вернуться к ручному вводу.
2025-10-28 11:32:07 +03:00
AI Assistant
e26ec2941a feat: Добавлены технические DEV-кнопки для быстрой навигации по шагам
🔧 Технические панели на всех шагах:
- Step 1: Кнопка пропуска валидации полиса → Step 2
- Step 2: Кнопки навигации Назад/Вперёд без валидации полей
- Step 3: Автоподтверждение телефона + быстрая отправка заявки

Теперь можно тестировать весь флоу без заполнения обязательных полей.
2025-10-28 10:13:18 +03:00
AI Assistant
82bb3f3aa8 chore: Добавлена пустая строка в конце файлов (форматирование) 2025-10-28 10:02:42 +03:00
AI Assistant
f4c38137b6 feat: Добавлены кнопки Продолжить/Загрузить другой файл в OCR модалку
 При успешном распознавании полиса - кнопка 'Продолжить →' → переход на Step 2
 При ошибке распознавания - кнопка 'Загрузить другой файл' → возврат к форме загрузки
2025-10-28 10:02:24 +03:00
AI Assistant
90ab969de0 docs: Добавлен лог сессии от 28.10.2025 - исправление SSE error handling 2025-10-28 00:47:03 +03:00
AI Assistant
0b75e01b9e fix: Не затираем результат OCR при закрытии SSE соединения
Проблема: Backend закрывает SSE после отправки события, браузер триггерит onerror,
фронтенд перезаписывал успешный результат сообщением 'Ошибка подключения к серверу'.

Решение: Проверяем в onerror что если уже получили результат (prev !== 'loading'),
не затираем его ошибкой.
2025-10-28 00:40:06 +03:00
AI Assistant
f72aa59476 Интеграция SSE + Redis Pub/Sub для real-time OCR результатов
🎯 Основные изменения:

Backend:
- Реализован SSE endpoint /events/{task_id} для real-time стриминга событий
- Интеграция Redis Pub/Sub для получения событий от n8n
- Исправлен путь к .env файлу (абсолютный путь)
- Убран префикс /api/v1 для events router
- Добавлено подробное логирование событий

Frontend:
- Переключён на Vite dev mode для работы proxy
- Настроен proxy /events -> backend:8100
- Реализована модалка с крутилкой при загрузке файла
- SSE клиент для получения OCR результатов в real-time
- Отображение результатов AI анализа в модалке

Docker:
- Frontend: изменён на npm run dev (Vite dev server)
- Добавлен host.docker.internal для доступа к backend
- Настроен proxy в docker-compose

Утилиты:
- monitor_redis_direct.py - мониторинг Redis Pub/Sub
- test_redis_publish_direct.py - тестирование публикации в Redis

🚀 Полная цепочка работает:
Frontend → Backend SSE → Redis Pub/Sub ← n8n → OCR/AI → Result
2025-10-27 19:37:41 +03:00
AI Assistant
d8508aa89d docs: Добавлен подробный лог сессии от 26.10.2025
Включает:
- 🎯 Описание архитектуры React → n8n → Redis → SSE
- 🔧 Все реализованные компоненты (Backend, Frontend, n8n workflows)
- 🐛 Решённые проблемы и их фиксы
- 📊 Метрики производительности
- 📝 Credentials и важные URL
-  Достигнутые результаты
- 🔮 Следующие шаги
2025-10-27 08:36:26 +03:00
AI Assistant
647abf6578 feat: Интеграция n8n + Redis Pub/Sub + SSE для real-time обработки заявок
🎯 Основные изменения:

Backend:
-  Добавлен SSE endpoint для real-time событий (/api/v1/events/{task_id})
-  Redis Pub/Sub для публикации/подписки на события OCR/Vision
-  Удален aioboto3 из requirements.txt (конфликт зависимостей)
-  Добавлен OCR worker (deprecated, логика перенесена в n8n)

Frontend (React):
-  Автогенерация claim_id и session_id
-  Клиентская конвертация файлов в PDF (JPG/PNG/HEIC/WEBP)
-  Сжатие изображений до 2MB перед конвертацией
-  SSE подписка на события OCR/Vision в Step1Policy
-  Валидация документов (полис vs неподходящий контент)
-  Real-time прогресс загрузки и обработки файлов
-  Интеграция с n8n webhooks для проверки полиса и загрузки файлов

n8n Workflows:
-  Проверка полиса в MySQL + запись в PostgreSQL
-  Загрузка файлов в S3 + OCR + Vision AI
-  Публикация событий в Redis через backend API
-  Валидация документов (распознавание полисов ERV)

Документация:
- 📝 N8N_INTEGRATION.md - интеграция с n8n
- 📝 N8N_SQL_QUERIES.md - SQL запросы для workflows
- 📝 N8N_PDF_COMPRESS.md - сжатие PDF
- 📝 N8N_STIRLING_COMPRESS.md - интеграция Stirling-PDF

Утилиты:
- 🔧 monitor_redis.py/sh - мониторинг Redis Pub/Sub
- 🔧 test_redis_events.sh - тестирование событий
- 🔧 pdfConverter.ts - клиентская конвертация в PDF

Архитектура:
React → n8n webhooks (sync) → MySQL/PostgreSQL/S3
      → n8n workflows (async) → OCR/Vision → Redis Pub/Sub → SSE → React
2025-10-27 08:33:16 +03:00
AI Assistant
1be922fdc3 fix: OCR endpoint исправлен /process → /analyze-file + SESSION_LOG обновлен
КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ:
 OCR endpoint: /process → /analyze-file
 Исправлено в 3 местах:
   - ocr_service.py (line 48)
   - upload.py x2 (policy + passport endpoints)

Проблема:
- POST http://147.45.146.17:8001/process → 404 Not Found
- OCR не работал
- Gemini Vision не получал данные

Дополнительные исправления:
 Условные поля для стыковочного рейса (4 поля)
 Поле для подтверждения отмены рейса
 OCR polling с progress bar
 Убран некорректный статус 'Полис найден'

SESSION_LOG:
- Добавлена полная история 25 октября
- 12 коммитов задокументированы
- Статистика: ~2000 строк, 25 файлов, 15 проблем решено
- Список известных проблем (DOCX не поддерживается)

Следующие шаги:
1. Перезапустить backend (обязательно!)
2. Протестировать OCR на PDF/JPG файлах
3. Проверить Gemini Vision анализ в Debug панели
2025-10-25 10:46:36 +03:00
AI Assistant
134eb42493 fix: Исправлен OCR endpoint - /process → /analyze-file
Проблема:
 HTTP 404 Not Found при вызове /process
 OCR не работал вообще
 Gemini Vision не получал данные

Решение:
 Изменен endpoint на /analyze-file (правильный)
 Исправлено в 3 местах:
   - ocr_service.py (line 48)
   - upload.py - /policy endpoint (line 53)
   - upload.py - /passport endpoint (line 122)

Теперь:
 OCR будет работать
 Gemini Vision получит текст
 Debug панель покажет результаты

Тестирование:
1. Перезапусти backend
2. Загрузи файл полиса
3. Смотри логи:
   🔍 Starting OCR for: filename
   📄 OCR completed: XXX chars
   🤖 Starting AI analysis
    AI Analysis complete
2025-10-25 10:39:57 +03:00
AI Assistant
fb896895b6 fix: Исправлен OCR - убрана блокирующая ошибка RabbitMQ
Проблема:
- OCR не запускался из-за ошибки в RabbitMQ publish
- 'str' object has no attribute 'get'
- Gemini Vision не вызывался

Решение:
- Убран RabbitMQ publish (запускаем OCR напрямую)
- Добавлено детальное логирование:
  - 🔍 Starting OCR for: filename
  - 📄 OCR completed: XXX chars
  - 🤖 Starting AI analysis
  - 📊 Document type: policy/garbage
  -  Valid, Confidence
  - 🗑️ GARBAGE DETECTED
- Проверка isinstance(ocr_result, dict)
- Полный traceback при ошибках

Улучшения:
- OCR polling на фронте (каждые 3 сек)
- Progress bar с анимацией
- Условные поля для стыковочного рейса
- Доп поля для отмены рейса

Файлы:
- upload.py - исправлен OCR запуск
- Step1Policy.tsx - OCR progress + polling
- Step2Details.tsx - условные поля
- TEST_OCR.md - инструкции по тестированию
2025-10-25 10:26:05 +03:00
AI Assistant
a26cb772f5 fix: 3 критических исправления - OCR прогресс, условные поля, убран некорректный статус
1.  OCR Progress Bar:
   - Добавлен polling OCR результатов каждые 3 сек
   - Визуальный индикатор: 🔍 Обработка OCR... (1/10)
   - Progress bar с анимацией
   - Статусы: 🔄 Запуск → 🔍 Обработка →  Завершен
   - Gemini Vision результаты в Debug панели

2.  Убран некорректный 'Полис найден':
   - Было: показывался сразу после загрузки файла
   - Проблема: OCR еще не закончился, может быть шляпа
   - Решение: убрана зеленая плашка с Step2
   - Статус полиса только после реальной проверки

3.  Условные поля для стыковочного рейса:
   - Если выбран 'miss_connection' → показываются 4 доп поля:
     • Номер рейса прибытия
     • Дата рейса прибытия
     • Номер рейса отправления
     • Дата рейса отправления
   - Если выбран 'cancel_flight' → доп поле:
     • Подтверждение отмены от АК
   - Для обычных рейсов: только номер рейса

Frontend изменения:
- Step1Policy: OCR polling, progress bar
- Step2Details: условная логика полей (как в erv_ticket)
- useState для eventType
- handleEventTypeChange для динамики

Теперь:
 Видно прогресс OCR
 Видно результаты Gemini Vision
 Условные поля работают
 Нет ложных статусов
2025-10-25 10:12:41 +03:00
AI Assistant
ddca18716d docs: Обновлен SESSION_LOG + инструкции по перезапуску
Добавлено:
 SESSION_LOG_2025-10-24.md обновлен с работой 25 октября
 git_push_all.sh - скрипт для автоматического push
 restart_backend.sh - скрипт перезапуска backend
 RESTART_INSTRUCTIONS.md - подробные инструкции
 QUICK_START.md - быстрый старт

Документация сессии 25 октября:
- 9 коммитов
- Split-screen UI + Debug панель
- OCR + AI анализ (Gemini Vision)
- S3 Upload + Draft автосохранение
- Step2 переделан (7 типов событий из erv_ticket)
- MySQL валидация полисов (33,963 шт)
- Безопасность и UX улучшения
- ~1500 строк кода, 20 файлов, 12 проблем решено

Готово к тестированию после перезапуска backend!
2025-10-25 09:56:01 +03:00
AI Assistant
3bfd05c6dd docs: Обновлен SESSION_LOG с работой 25 октября
Добавлена документация:
- 9 новых коммитов
- Split-screen UI + Debug панель
- OCR + AI анализ (Gemini Vision)
- S3 Upload + Draft автосохранение
- Step2 переделан под erv_ticket
- MySQL валидация полисов
- Безопасность и UX улучшения

Статистика:
- ~1500 строк кода
- 20 файлов изменено
- 12 проблем решено
- 3 часа работы
2025-10-25 09:53:16 +03:00
AI Assistant
ba6fd71140 fix: Исправлена ошибка OCR - инициализация ocr_result
Проблема:
 Queue error: 'str' object has no attribute 'get'
 ocr_result не инициализировался до try блока
 Debug панель не показывала OCR результаты

Решение:
 Добавлена инициализация: ocr_result = None
 Убрана проверка 'ocr_result' in locals()
 Теперь ocr_result всегда определен

Что изменилось:
- Backend не падает при OCR ошибках
- OCR результаты возвращаются в response
- Debug панель получает ocr_result
- Логи показывают процесс OCR

Тестирование:
Загрузи файл полиса → Debug панель покажет:
📤 Upload to S3
🔍 OCR running
📄 OCR completed: XXX chars
🤖 AI analysis: policy/garbage
 Extracted data
2025-10-25 09:39:34 +03:00
AI Assistant
3a4ff6efb0 fix: Добавлена кнопка Назад на Step3 в начале формы
Проблема: На Step3 кнопка Назад была только ПОСЛЕ верификации телефона
Решение: Вынес кнопку Назад в начало формы (до блока телефона)

Теперь:
 Кнопка '← Назад' видна ВСЕГДА на Step3
 Можно вернуться на Step2 в любой момент
 Не нужно ждать верификацию телефона

UX улучшение: пользователь не застревает на Step3
2025-10-25 09:35:55 +03:00
AI Assistant
d2777aeabf feat: Step2 переделан + улучшен Debug Panel с полными S3 URL
Step2Details (по скриншоту):
 Индикатор ' Полис найден' вверху
 Select с типами событий из erv_ticket:
   - Задержка авиарейса (более 3 часов)
   - Отмена авиарейса
   - Пропуск стыковочного рейса
   - Посадка на запасной аэродром
   - Задержка отправки поезда
   - Отмена поезда
   - Задержка/отмена парома/круизного судна

 Дата наступления страхового случая (DatePicker)
 Номер рейса/поезда/парома
 Загрузка подтверждающих документов:
   - Посадочный талон, билет, справка и т.д.
   - До 10 файлов по 15MB
   - HEIC, PDF, фото

Debug Panel улучшения:
 Полные S3 URL (не обрезанные)
 Кнопка '🔗 Открыть в новой вкладке'
 word-break: break-all для длинных URL
 Показывает все файлы из массива
 Для каждого файла:
   - Filename
   - File ID (UUID)
   - Size (KB)
   - Полный S3 URL (кликабельный)

Теперь в Debug видно КУДА загрузилось:
https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg

Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
AI Assistant
720d4ebdd9 feat: Split-screen с Debug панелью в реальном времени!
Новый UI:
 Split-screen layout:
   - Слева (60%): форма заявки
   - Справа (40%): Debug Console в реальном времени

Компонент DebugPanel.tsx:
 Темная тема (VS Code style)
 Timeline с событиями
 Real-time обновления
 Показывает:
   - Form Data (JSON в реальном времени)
   - Events Log с иконками и цветами
   - Детали каждого события

События которые отображаются:
1. policy_check:
   -  Полис найден в MySQL БД
   - ⚠️ Полис не найден
   - Показывает: voucher, found status

2. upload:
   - 📤 Загружаю X файлов в S3
   -  Загружено в S3: X/Y
   - Показывает: file_id, size, S3 URL

3. ocr:
   - 🔍 Запущен OCR
   - 📄 OCR завершен: XXX символов
   - Показывает: текст preview

4. ai_analysis:
   - 🤖 AI: policy/garbage, confidence: 95%
   - 🗑️ ШЛЯПА DETECTED! (пользователю не говорим)
   - Показывает: document_type, is_valid, confidence, extracted_data

5. sms:
   - 📱 Отправляю SMS
   -  SMS отправлен (DEBUG mode)
   - 🔐 Проверяю код
   -  Телефон подтвержден
   - Показывает: phone, debug_code

UX:
- Sticky panel (прилипает при скролле)
- Monospace шрифт для данных
- Цветовая кодировка статусов
- JSON форматирование

Layout:
- Row + Col от Ant Design
- Responsive: mobile = 1 column, desktop = split

Теперь видно ВСЁ что происходит в реальном времени! 🔍
2025-10-24 22:13:52 +03:00
AI Assistant
20bad53008 feat: OCR в фоне + AI проверка полиса + debug логи
Новый сервис ocr_service.py:
 OCR распознавание через http://147.45.146.17:8001
 AI анализ через Gemini Vision (OpenRouter)
 Проверка: полис или шляпа
 Извлечение данных полиса автоматически

Логика обработки:
1. Файл загружается в S3
2. OCR запускается в фоне (RabbitMQ queue)
3. Gemini Vision анализирует текст:
   - document_type: policy/passport/ticket/garbage
   - is_valid_policy: true/false
   - confidence: 0.0-1.0
   - extracted_data: voucher, holder_name, dates
4. Результат сохраняется в Redis (1 час TTL)

Debug логи (в backend):
📤 OCR task queued: file_id - filename
💾 OCR result cached in Redis
📊 Document type: policy/garbage/other
 Valid: true/false, Confidence: 0.95
🗑️ GARBAGE uploaded: если не полис (silent)

Новый endpoint:
GET /api/v1/upload/ocr-result/{file_id}
- Получить результат OCR из Redis
- Можно запрашивать когда угодно

Где смотреть логи:
tail -f /var/www/fastuser/data/www/crm.clientright.ru/erv_platform_backend.log

Результаты хранятся в Redis:
key: ocr_result:{file_id}
ttl: 3600 сек (1 час)
2025-10-24 21:58:34 +03:00
AI Assistant
621c8ebf01 feat: 5 улучшений безопасности и UX
1.  Прогресс бар загрузки:
   - Upload компонент с showUploadList
   - Кнопка показывает состояние 'Загрузка...'
   - Визуальный прогресс для каждого файла

2.  OCR проверка полиса (заготовка):
   - TODO: проверка что загружен полис, а не шляпа
   - Если шляпа - помечаем себе в policyValidationWarning
   - Пользователю не говорим (silent validation)

3.  Лимиты файлов:
   - Максимум 10 файлов
   - Каждый файл до 15MB
   - Валидация на фронте и бэкенде
   - Счетчик: 'Загружено: X/10 файлов'
   - Кнопка disabled при 10 файлах

4.  Защита от инъекций и безопасность:
   Backend (upload.py):
   - Лимит файлов: if len(files) > 10
   - Проверка размера: if len(content) > MAX_FILE_SIZE
   - Валидация типа: allowed_types = ['image/', 'application/pdf']
   - Санитизация folder: allowed_folders whitelist

   Backend (draft.py):
   - Валидация session_id (max 255 chars)
   - Валидация step: only [1, 2, 3]
   - Параметризованные SQL запросы (защита от SQL injection)

   Frontend:
   - beforeUpload валидация размера
   - maxCount={10}
   - accept только разрешенные форматы

5.  Кнопка 'Начать заново':
   - Показывается на шаге 2 и 3 (extra в Card)
   - Сбрасывает всю форму
   - Возвращает на шаг 1
   - Очищает isPhoneVerified

Безопасность:
- SQL инъекции: параметризованные запросы ($1, $2)
- XSS: Pydantic валидация всех inputs
- File upload: type + size validation
- Path traversal: folder whitelist
- Rate limiting: TODO (Redis)

UX:
- Прогресс загрузки виден
- Понятные лимиты (10 файлов по 15MB)
- Возможность начать заново в любой момент
2025-10-24 21:34:50 +03:00
AI Assistant
e34f7a598b feat: 6 улучшений формы - S3 upload, draft, HEIC, email на step3
1.  Placeholder с тире E1000-302538524
   - Теперь в placeholder тоже тире

2.  Email перенесен на Step3
   - Убран с Step1 (проверка полиса)
   - Добавлен на Step3 (вместе с телефоном)
   - Теперь телефон + email + выплата на одном шаге

3.  HEIC формат + мультилоад
   - Добавлена поддержка .heic, .heif (iPhone формат)
   - Убран maxCount - неограниченная загрузка
   - Параметр multiple для множественной загрузки

4.  S3 Upload
   - Создан s3_service.py для работы с Timeweb S3
   - Новый endpoint: POST /api/v1/upload/files
   - Поддержка мультизагрузки файлов
   - Автоматическая генерация уникальных имен
   - Файлы грузятся в S3, не локально

5.  Draft автосохранение
   - Создана таблица claims_draft в PostgreSQL
   - Новый API: POST /api/v1/draft/save
   - GET /api/v1/draft/stats - статистика по шагам
   - GET /api/v1/draft/list - список последних драфтов
   - Для аналитики: где люди бросают заполнение

6.  Миграция БД
   - 002_create_claims_draft.sql применена
   - Индексы для быстрого поиска
   - JSONB поле для гибкости данных

Backend:
- s3_service.py - сервис для S3
- draft.py - API автосохранения
- upload.py - обновлен endpoint для S3
- main.py - добавлены роуты и подключения

Frontend:
- Step1Policy: убран email, добавлен HEIC
- Step3Payment: добавлен email после телефона

Статус:  Backend подключен к S3, таблица создана, всё работает
2025-10-24 21:24:00 +03:00
AI Assistant
f2cfa54c9d feat: Улучшена форма полиса - маска ввода и загрузка скана
Изменения в UX (Step1Policy):
 Автоматическая маска ввода E1000-302538524
   - Тире вставляется автоматически
   - Не нужно вводить вручную

 Расширенная автозамена кириллицы:
   - А→A, а→A, С→C, с→C, Е→E, е→E и т.д.
   - Поддержка строчных и заглавных

 Автоматический uppercase
   - Все буквы автоматически заглавные

 Логика при ненайденном полисе:
   - НЕ переходит на следующий шаг
   - Показывает поле загрузки скана прямо на месте
   - Кнопка "Продолжить со сканом"
   - Поддержка изображений и PDF

 Обработка paste:
   - Корректная обработка вставки текста
   - Применяются все правила форматирования

Backend (policy.py):
 Убран вывод holder_name (для продакшна)
   - API не возвращает персональные данные
   - Только found: true/false

Формат полиса:
Ввод: k78486489849494 или К7848-6489849494
Результат: K7848-648984949
2025-10-24 21:12:30 +03:00
AI Assistant
3b08916c22 fix: Исправлены MySQL креды - подключение к локальной БД
Проблема: Backend пытался подключиться к удаленной БД turistpr_erv
Решение: Обновлены креды на локальную БД ci20465_erv

Изменения:
- MySQL Host: localhost (было: 141.8.194.131)
- MySQL DB: ci20465_erv (было: turistpr_erv)
- MySQL User: ci20465_erv (было: root)
- MySQL Password: c7vOXbmG (было: пустой)
- MySQL Table: lexrpiority (было: erv_vouchers в коде)

Результат:
 MySQL Policy DB подключена успешно
 API /api/v1/policy/check работает
 Валидация полисов работает (33963 полисов в БД)

Тестирование:
- E1000-302372730 → found: true 
- E9999-999999999 → found: false 
2025-10-24 21:02:20 +03:00
AI Assistant
4c844d00a5 feat: Обновлена форма проверки полиса + автозамена кириллицы
Изменения в форме (Шаг 1):
- Полис в одну строку: E1000-302538524 (было: отдельно серия и номер)
- Email теперь обязателен (было: опционально)
- Убран ИНН (было: опционально)
- Автозамена кириллицы на латиницу (Е→E, О→O и т.д.)
- Валидация формата: буква + 4 цифры + тире + 9 цифр

Изменения в Backend API:
- PolicyCheckRequest: voucher + email (убран inn)
- policy_service: упрощен запрос к MySQL
- Добавлено подключение MySQL в lifespan

Изменения в ClaimForm:
- FormData обновлен: voucher вместо policyNumber/policySeries
- Убрано поле inn из всей логики

Статус: Frontend работает, MySQL требует настройки доступа
2025-10-24 20:54:57 +03:00
AI Assistant
30bbf2cf2c docs: Обновлен SESSION_LOG с информацией о рефакторинге формы 2025-10-24 20:41:32 +03:00
AI Assistant
cfd84e0f9d refactor: Изменен порядок формы - проверка полиса на первом шаге
Изменения в UX:
- Шаг 1: Проверка полиса (было: телефон + SMS)
- Шаг 2: Детали происшествия (без изменений)
- Шаг 3: Телефон + SMS + Выплата (было: только выплата)

Обновленные компоненты:
- Удален: Step1Phone.tsx
- Создан: Step1Policy.tsx - проверка полиса через API
- Обновлен: Step3Payment.tsx - добавлена SMS верификация
- Обновлен: ClaimForm.tsx - новая структура шагов

Логика: сначала проверяем полис, потом детали, в конце верификация телефона и выплата
2025-10-24 20:40:44 +03:00
AI Assistant
8b0bd156bb fix: Перезапуск платформы - исправлены зависимости и TypeScript ошибки
- Исправлены TypeScript ошибки в Step3Payment.tsx (типизация, неиспользуемые импорты)
- Добавлены недостающие зависимости: aiomysql, pymysql, python-multipart
- Обновлен requirements.txt с актуальными версиями
- Добавлены новые API endpoints: policy check, file upload
- Добавлен policy_service для работы с MySQL
- Все сервисы успешно запущены и работают
- Обновлен SESSION_LOG с документацией процесса
2025-10-24 20:27:10 +03:00
AI Assistant
0f82eef08d 🚀 MVP: FastAPI + React форма с SMS верификацией
 Инфраструктура: PostgreSQL, Redis, RabbitMQ, S3
 Backend: SMS сервис + API endpoints
 Frontend: React форма (3 шага) + SMS верификация
2025-10-24 16:19:58 +03:00
AI Assistant
8af23e90fa Initial commit: ERV Platform MVP - FastAPI + React 2025-10-24 12:02:17 +03:00