Commit Graph

59 Commits

Author SHA1 Message Date
AI Assistant
aed2a86ba8 fix: Fix claim_id and unified_id display in confirmation form
Problem:
- Claim ID and Unified ID showing as 'не указан' in confirmation form
- transformDraftToClaimPlanFormat was returning array instead of object
- StepClaimConfirmation was not correctly extracting IDs from claimPlanData

Solution:
1. Changed transformDraftToClaimPlanFormat return type:
   - Changed from array [{ propertyName, ... }] to object { propertyName, ... }
   - This matches what StepClaimConfirmation expects

2. Enhanced ID extraction in StepClaimConfirmation:
   - Added explicit claimId and unifiedId variables
   - Better fallback chain: claimPlanData.claim_id -> propertyName.meta.claim_id
   - Same for unified_id

3. Added comprehensive logging:
   - Log claimPlanData structure on component mount
   - Log extracted IDs before form generation
   - Log transformDraftToClaimPlanFormat input/output
   - Log claim.unified_id from API response

4. Improved data flow:
   - claim.unified_id from API -> transformDraftToClaimPlanFormat -> StepClaimConfirmation
   - Fallback to currentFormData.unified_id if claim.unified_id missing

Files:
- frontend/src/pages/ClaimForm.tsx: Changed return type, added logging
- frontend/src/components/form/StepClaimConfirmation.tsx: Enhanced ID extraction, added logging
2025-11-24 15:16:46 +03:00
AI Assistant
1789dafce2 fix: Improve problem_description detection for draft completeness check
Problem:
- problem_description not found in payload, but exists in draft list
- Completeness check fails because hasDescription = false
- Draft not recognized as ready for confirmation

Solution:
1. Enhanced problem_description extraction:
   - Checks multiple locations: body.problem_description, payload.problem_description
   - Also checks payload.body.problem_description for nested structures
   - Added fallback to body.description and payload.description

2. Improved completeness logic:
   - If problem_description not found but wizard_plan and answers exist,
     infer that description was entered (plan is generated from description)
   - This handles cases where description exists but not in expected payload location

3. Better logging:
   - Shows if problem_description was found directly or inferred
   - Logs all payload keys for debugging

Logic:
- hasDescription = !!problemDescription || (!!wizardPlan && !!answers)
- If plan and answers exist → description was entered earlier
- This allows drafts with plan+answers+documents to proceed to confirmation

Files:
- frontend/src/pages/ClaimForm.tsx: Enhanced problem_description detection
2025-11-24 15:12:29 +03:00
AI Assistant
577611c65d refactor: Load claim confirmation data from DB instead of SSE for drafts
Problem:
- When draft is fully filled, we subscribed to Redis SSE channel claim:plan
- But all data already exists in PostgreSQL database
- No need to wait for n8n to publish data - we can load it directly

Solution:
1. Removed subscribeToClaimPlanForDraft() function
   - No longer subscribes to SSE channel for drafts
   - Removed EventSource cleanup code

2. Added transformDraftToClaimPlanFormat() function
   - Transforms draft data from DB format to propertyName format
   - Extracts data from payload/body (telegram/web_form formats)
   - Maps documents_meta to attachments array
   - Formats applicant, case, contract_or_service, offenders, claim, meta
   - Returns data in array format expected by confirmation form

3. Updated loadDraft() logic:
   - When draft is ready for confirmation (all steps filled + draft status)
   - Calls transformDraftToClaimPlanFormat() instead of subscribing to SSE
   - Immediately shows confirmation form with data from DB

Flow:
1. User selects fully filled draft
2. System checks completeness (description, plan, answers, documents)
3. If ready → transforms DB data to propertyName format
4. Shows confirmation form immediately (no SSE wait)

Benefits:
-  Faster: no waiting for n8n to publish data
-  More reliable: data always available from DB
-  Simpler: no SSE connection management for drafts
-  Works offline: doesn't depend on Redis pub/sub

Files:
- frontend/src/pages/ClaimForm.tsx: Added transform function, removed SSE subscription
2025-11-24 15:08:00 +03:00
AI Assistant
379995ba51 feat: Auto-navigate to confirmation form when draft is fully filled
Problem:
- When user selects a draft with all steps filled (description, plan, answers, documents)
- But claim status is still 'draft' (not submitted)
- User has to manually navigate through all steps again

Solution:
1. Added check in loadDraft() to detect fully filled drafts:
   - hasDescription: problem_description exists
   - hasWizardPlan: wizard_plan exists
   - hasAnswers: answers exist and not empty
   - hasDocuments: documents_meta array has items
   - isDraft: status_code === 'draft'
   - allStepsFilled: all checks pass

2. When draft is ready for confirmation:
   - Automatically subscribe to claim:plan SSE channel
   - Wait for claim data from n8n
   - Show loading message while waiting
   - On success: show confirmation form automatically

3. Added subscribeToClaimPlanForDraft() function:
   - Subscribes to /api/v1/claim-plan/{session_token}
   - Handles claim_plan_ready event
   - Updates formData with claimPlanData
   - Auto-navigates to confirmation step via useEffect

4. Added useEffect for auto-navigation:
   - Watches formData.showClaimConfirmation and formData.claimPlanData
   - When both true, navigates to step 3 (confirmation)
   - Handles cleanup of EventSource on unmount

Flow:
1. User selects draft → loadDraft() checks completeness
2. If all filled + draft → subscribeToClaimPlanForDraft()
3. SSE receives data → updates formData
4. useEffect detects → navigates to confirmation step
5. User sees confirmation form immediately

Files:
- frontend/src/pages/ClaimForm.tsx: Added auto-navigation logic
2025-11-24 14:11:04 +03:00
AI Assistant
0978e485dc feat: Add claim plan confirmation flow via Redis SSE
Problem:
- After wizard form submission, need to wait for claim data from n8n
- Claim data comes via Redis channel claim:plan:{session_token}
- Need to display confirmation form with claim data

Solution:
1. Backend: Added SSE endpoint /api/v1/claim-plan/{session_token}
   - Subscribes to Redis channel claim:plan:{session_token}
   - Streams claim data from n8n to frontend
   - Handles timeouts and errors gracefully

2. Frontend: Added subscription to claim:plan channel
   - StepWizardPlan: After form submission, subscribes to SSE
   - Waits for claim_plan_ready event
   - Shows loading message while waiting
   - On success: saves claimPlanData and shows confirmation step

3. New component: StepClaimConfirmation
   - Displays claim confirmation form in iframe
   - Receives claimPlanData from parent
   - Generates HTML form (placeholder - should call n8n for real HTML)
   - Handles confirmation/cancellation via postMessage

4. ClaimForm: Added conditional step for confirmation
   - Shows StepClaimConfirmation when showClaimConfirmation=true
   - Step appears after StepWizardPlan
   - Only visible when claimPlanData is available

Flow:
1. User fills wizard form → submits
2. Form data sent to n8n via /api/v1/claims/wizard
3. Frontend subscribes to SSE /api/v1/claim-plan/{session_token}
4. n8n processes data → publishes to Redis claim:plan:{session_token}
5. Backend receives → streams to frontend via SSE
6. Frontend receives → shows StepClaimConfirmation
7. User confirms → proceeds to next step

Files:
- backend/app/api/events.py: Added stream_claim_plan endpoint
- frontend/src/components/form/StepWizardPlan.tsx: Added subscribeToClaimPlan
- frontend/src/components/form/StepClaimConfirmation.tsx: New component
- frontend/src/pages/ClaimForm.tsx: Added confirmation step to steps array
2025-11-24 13:36:14 +03:00
AI Assistant
3621ae6021 feat: Session persistence with Redis + Draft management fixes
- Implement session management API (/api/v1/session/create, verify, logout)
- Add session restoration from localStorage on page reload
- Fix session_id priority when loading drafts (use current, not old from DB)
- Add unified_id and claim_id to wizard payload sent to n8n
- Add Docker volume for frontend HMR (Hot Module Replacement)
- Add comprehensive session logging for debugging

Components updated:
- backend/app/api/session.py (NEW) - Session management endpoints
- backend/app/main.py - Include session router
- frontend/src/components/form/Step1Phone.tsx v2.0 - Create session after SMS
- frontend/src/pages/ClaimForm.tsx v3.8 - Session restoration & priority fix
- frontend/src/components/form/StepWizardPlan.tsx v1.4 - Add unified_id/claim_id
- docker-compose.yml - Add frontend volume for live reload

Session flow:
1. User verifies phone -> session created in Redis (24h TTL)
2. session_token saved to localStorage
3. Page reload -> session restored automatically
4. Draft selected -> current session_id used (not old from DB)
5. Wizard submit -> unified_id, claim_id, session_id sent to n8n
6. Logout -> session removed from Redis & localStorage

Fixes:
- Session token not persisting after page reload
- unified_id missing in n8n webhook payload
- Old session_id from draft overwriting current session
- Frontend changes requiring container rebuild
2025-11-20 18:31:42 +03:00
AI Assistant
4c8fda5f55 Добавлено логирование для отладки черновиков
- Добавлены логи в frontend (ClaimForm.tsx) для отслеживания unified_id и запросов к API
- Добавлены логи в backend (claims.py) для отладки SQL запросов
- Создан лог сессии с описанием проблемы и текущего состояния
- Проблема: API возвращает 0 черновиков, хотя в БД есть данные
2025-11-19 18:46:48 +03:00
AI Assistant
cbab1c0fe6 feat(ticket_form): add wizard plan step and dev cache 2025-11-15 18:48:15 +03:00
AI Assistant
3306d01e0d Ticket form: new stack + description step 2025-11-14 19:06:36 +03:00
AI Assistant
cd2ff8e61b feat: Добавлен backend proxy для создания контакта
Проблема:
- Step1Phone делал запрос НАПРЯМУЮ к n8n (палил webhook URL)
- В backend логах не было видно что n8n возвращает для контакта
- Нельзя было отследить contact_id, claim_id, is_new_contact

Решение:
 Добавлен endpoint /api/n8n/contact/create в n8n_proxy.py
 Step1Phone.tsx теперь использует proxy вместо прямого URL
 Backend логирует полный response от n8n (contact_id, claim_id и тд)

Теперь весь трафик к n8n идёт через backend proxy!
2025-11-02 10:40:57 +03:00
AI Assistant
b17825ee52 fix: Добавлены недостающие поля в FormData интерфейс
Проблема:
- TypeScript игнорировал project_id, is_new_project, ticket_id, ticket_number
- Они не были объявлены в interface FormData

Исправление:
 Добавлены в FormData:
  - project_id?: string          (ID проекта в vTiger)
  - is_new_project?: boolean     (флаг создания)
  - ticket_id?: string           (ID заявки HelpDesk)
  - ticket_number?: string       (номер заявки)

Теперь updateFormData корректно сохраняет все данные от n8n!
2025-11-02 10:25:24 +03:00
AI Assistant
c6d848fd14 fix: Корректное извлечение данных из n8n response в Step1Phone
Проблема:
- n8n возвращает [{success: true, result: {claim_id, contact_id, ...}}]
- Код пытался взять data.claim_id вместо data.result.claim_id

Исправление:
-  Обработка массива от n8n
-  Извлечение данных из result: const result = crmResult.result || crmResult
-  Улучшенное логирование для отладки
-  Проверка crmResult.success перед обработкой

Теперь formData корректно получает:
- claim_id (от n8n)
- contact_id (от CreateWebContact)
- is_new_contact (флаг)
2025-11-02 08:42:41 +03:00
AI Assistant
ea287b32eb feat: Сохранение project_id в formData при проверке полиса
-  Добавлена обработка массива от n8n (как в Step2EventType)
-  Сохранение project_id, is_new_project в formData
-  Сохранение contact_id для консистентности
-  Работает как для найденного, так и для не найденного полиса

Теперь formData содержит полную информацию:
- claim_id (из n8n)
- contact_id (из CreateWebContact)
- project_id (из CreateWebProject) ← НОВОЕ
- is_new_project (флаг создания) ← НОВОЕ
2025-11-02 08:37:25 +03:00
AI Assistant
927a8f5f7c feat: Проксирование CreateClaim через backend
-  Новый endpoint: POST /api/n8n/claim/create
-  Проксирует запросы к n8n webhook создания заявки
-  Frontend теперь использует /api/n8n/claim/create вместо прямого URL
-  Решает проблему CORS и скрывает webhook URL
-  Логирование запросов и ошибок
2025-11-02 00:55:25 +03:00
AI Assistant
cacb2ee7bb fix: Обработка массива в ответе n8n для CreateWebClaim
-  n8n может вернуть [{success: true, ...}] вместо {success: true, ...}
-  Добавлена проверка Array.isArray и извлечение первого элемента
-  Теперь корректно обрабатывается ответ от webhook создания заявки
2025-11-02 00:53:21 +03:00
AI Assistant
793177b1e2 feat: Интеграция создания черновика заявки в Step2EventType
-  Вызов n8n webhook после выбора типа события
-  Формирование title из event_type + voucher
-  Передача всех данных: claim_id, contact_id, project_id, event_type
-  Сохранение ticket_id и ticket_number в formData
-  Loading состояние кнопки
-  Debug события для отслеживания
2025-11-02 00:09:35 +03:00
AI Assistant
b06fdb731c fix: claim_id теперь генерируется только на бэкенде (n8n)
-  Удалена локальная генерация claim_id в ClaimForm.tsx
-  claim_id создаётся n8n при SMS верификации
-  Step1Phone: передаёт session_id в n8n, сохраняет claim_id
-  Step1Policy: сохраняет claim_id из ответа n8n при проверке полиса
-  Добавлено детальное логирование для отладки
- 📝 PROJECT_TIMELINE.md - полная хронология проекта (24 окт - 1 ноя)
2025-11-01 16:53:10 +03:00
AI Assistant
89a182bc7b fix: Интеграция n8n webhook для создания контакта после SMS
- Step1Phone теперь вызывает n8n webhook после SMS верификации
- Webhook создаёт/находит контакт в CRM через CreateWebContact
- Возвращает: contact_id, claim_id, is_new_contact
- Данные сохраняются в formData для дальнейшей работы
- Исправлена нормализация телефона в sms_service (убираем +)
- Отключен rate limiting SMS для тестирования
- Backend подключён к внешнему Redis (crm.clientright.ru:6379)
- Добавлены поля contact_id, is_new_contact в FormData
- Frontend пересобран с новым кодом
2025-11-01 13:31:05 +03:00
AI Assistant
7b554c0ad2 feat: Полный флоу для создания контакта через CreateWebContact
- docker-compose.yml: убраны локальные postgres/redis, только внешние
- Frontend: телефон в формате 79001234567 (без +)
- Готово к интеграции с n8n webhook для создания контакта в CRM
- CreateWebContact: только создание или возврат ID, БЕЗ обновления
2025-10-30 19:22:14 +03:00
AI Assistant
6708092662 fix: Формат телефона БЕЗ + (79001234567 вместо +79001234567)\n\n- Step1Phone: sendCode и verifyCode отправляют 7XXXXXXXXXX\n- Step3Payment: DEV MODE кнопки используют формат без +\n- Совместимость с vTiger CRM (mobile поле хранит без +) 2025-10-30 18:54:05 +03:00
AI Assistant
fe5cbdd756 ui: Добавлена DEV MODE кнопка на шаг 1 (телефон)\n\n- Кнопка 'Далее → (Step 2) [пропустить]'\n- Автозаполняет phone=+79001234567, email=test@test.ru\n- Автоматически подтверждает телефон и переходит на Step 2 2025-10-30 16:02:02 +03:00
AI Assistant
c9ed114dd4 fix: API вызовы через относительные пути (proxy)\n\n- Step1Phone: /api/v1/sms/send, /api/v1/sms/verify\n- ClaimForm: /api/v1/claims/create 2025-10-30 10:00:28 +03:00
AI Assistant
14d1b6fb63 ui: Телефон вводится без +7, префикс зашит (addonBefore)\n\n- Валидация: 10 цифр без кода страны\n- В API отправляется с +7\n- Плейсхолдер 9001234567, maxLength=10 2025-10-30 09:54:14 +03:00
AI Assistant
3caf855d4a ui: Убран email со шага 1, перенесён на последний шаг\n\n- Step1Phone: только телефон + SMS\n- Step3Payment: добавлено поле email 2025-10-30 09:52:26 +03:00
AI Assistant
58a12a3c05 feat: Телефон перенесен на шаг 1 (SMS верификация)\n\n- Новый шаг Step1Phone.tsx (отправка/проверка SMS)\n- ClaimForm: новая последовательность шагов (Телефон -> Полис -> Тип -> Документы -> Оплата)\n- Step3Payment: убран блок верификации телефона 2025-10-30 09:50:26 +03:00
AI Assistant
847dbe73a9 docs: Обновлён лог сессии 29.10 + корректировки конфигов документов\n\n- Дополнен SESSION_LOG_2025-10-29.md\n- Правки Step2EventType.tsx (выбор eventType)\n- Актуализированы constants/documentConfigs.ts 2025-10-30 09:35:27 +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
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
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
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
f4c38137b6 feat: Добавлены кнопки Продолжить/Загрузить другой файл в OCR модалку
 При успешном распознавании полиса - кнопка 'Продолжить →' → переход на Step 2
 При ошибке распознавания - кнопка 'Загрузить другой файл' → возврат к форме загрузки
2025-10-28 10:02:24 +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
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
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
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