docs: add session log 2025-12-01

This commit is contained in:
Fedor
2025-12-01 22:19:31 +03:00
parent da82100b60
commit 834520a045

View File

@@ -0,0 +1,281 @@
# Session Log 2025-12-01
## Сессия: UI/UX улучшения + CRM интеграция + Исправление дубликатов
### Участники
- Пользователь: Фёдор
- AI: Claude (Cursor)
---
## 1. UI/UX Улучшения формы заявки
### 1.1 Изменение заголовков
- **Главный заголовок формы**: "Подать заявку на выплату" → "Подать обращение о защите прав потребителя"
- **Заголовок вкладки браузера**: "ERV Insurance Platform" → "Clientright — защита прав потребителей"
**Файлы:**
- `ticket_form/frontend/src/pages/ClaimForm.tsx`
- `ticket_form/frontend/index.html`
- `ticket_form/frontend/public/index.html`
### 1.2 Улучшение отображения черновиков
**Файлы:**
- `ticket_form/frontend/src/components/form/StepDraftSelection.tsx`
- `ticket_form/backend/app/api/claims.py`
**Изменения:**
- Описание проблемы: увеличено до 250 символов, многострочное отображение
- Добавлен заголовок проблемы (`problem_title` из `ai_analysis.problem`)
- Добавлена категория (`category`) как фиолетовый тег
- Прогресс-бар документов: `X / Y` с иконками статуса (✓ зелёный / ○ красный/серый)
- Удалены избыточные теги "✓ Описание", "✓ План", "✓ Документы"
- Убран дублирующий "++" из кнопки "Создать новую заявку"
### 1.3 Исправление навигации
- Кнопка "Назад" теперь всегда возвращает к списку черновиков (Step 0)
- Пропуск шагов "Проверка полиса" и "Тип события" для нового флоу (`documents_required` present)
**Файлы:**
- `ticket_form/frontend/src/pages/ClaimForm.tsx`
- `ticket_form/frontend/src/components/form/StepWizardPlan.tsx`
### 1.4 Переименование шагов
```
'Телефон' → 'Вход'
'Описание' → 'Обращение'
'Рекомендации' → 'Документы'
'Оплата' → 'Заявление'
```
---
## 2. Backend улучшения
### 2.1 Исправление IP клиента
**Проблема:** Отображался Docker IP `192.168.0.1`
**Решение:** Добавлена функция `_get_client_ip()` с проверкой заголовков:
```python
def _get_client_ip(request: Request) -> str:
# 1. X-Forwarded-For
# 2. X-Real-IP
# 3. request.client.host (fallback)
```
**Файл:** `ticket_form/backend/app/api/documents.py`
### 2.2 Расширение API списка черновиков
**Добавлены поля:**
- `problem_title` - заголовок проблемы
- `category` - категория
- `documents_total` - всего документов
- `documents_uploaded` - загружено (уникальных типов)
- `documents_skipped` - пропущено
- `documents_required_list` - детальный список с статусами
**Файл:** `ticket_form/backend/app/api/claims.py`
### 2.3 SSE для OCR статуса
Добавлено подключение SSE для получения статуса OCR обработки после загрузки документов.
**Файл:** `ticket_form/frontend/src/components/form/StepWizardPlan.tsx`
---
## 3. CRM Webservices (PHP)
### 3.1 UpsertContact.php
**Назначение:** Создание/обновление контакта с поддержкой `tgid`
**Приоритет поиска:**
1. `contact_id` - если передан
2. `mobile` - поиск по телефону
3. `tgid` - поиск по Telegram ID
**Параметры:** `contact_json` (JSON строка)
**Регистрация в БД:**
```sql
INSERT INTO vtiger_ws_operation (operationid, name, handler_path, handler_method, type, prelogin)
VALUES (57, 'UpsertContact', 'include/Webservices/UpsertContact.php', 'vtws_upsertcontact', 'POST', 0);
INSERT INTO vtiger_ws_operation_parameters (operationid, name, type, sequence)
VALUES (57, 'contact_json', 'string', 1);
```
### 3.2 UpsertAccounts.php
**Назначение:** Пакетное создание/поиск контрагентов (offenders) по ИНН
**Логика:**
- Поиск по ИНН
- Если найден - возвращает ID без обновления
- Если не найден - создаёт новый
**Параметры:** `offenders_json` (JSON массив)
**Регистрация в БД:**
```sql
INSERT INTO vtiger_ws_operation (operationid, name, handler_path, handler_method, type, prelogin)
VALUES (58, 'UpsertAccounts', 'include/Webservices/UpsertAccounts.php', 'vtws_upsertaccounts', 'POST', 0);
INSERT INTO vtiger_ws_operation_parameters (operationid, name, type, sequence)
VALUES (58, 'offenders_json', 'string', 1);
```
### 3.3 UpsertProject.php
**Назначение:** Создание/обновление проекта с маппингом ответчиков
**Параметры:** `project_json` (JSON объект содержит):
- `project_id` - ID проекта для обновления
- `claim_id` - ID заявки
- `contact_id` - ID контакта
- `result` - JSON строка с `offender_ids`
- `projectdata` - данные проекта
**Маппинг ответчиков:**
- Первый ответчик → `cf_2274` (основной)
- Второй ответчик → `cf_2276` (агент)
**Регистрация в БД:**
```sql
INSERT INTO vtiger_ws_operation (operationid, name, handler_path, handler_method, type, prelogin)
VALUES (59, 'UpsertProject', 'include/Webservices/UpsertProject.php', 'vtws_upsertproject', 'POST', 0);
INSERT INTO vtiger_ws_operation_parameters (operationid, name, type, sequence)
VALUES (59, 'project_json', 'string', 1);
```
---
## 4. Исправление дубликатов documents_meta
### 4.1 Проблема
В `documents_meta` накапливались дубликаты при каждой загрузке документа.
**Причина:** SQL-запрос использовал простую конкатенацию `||` без дедупликации:
```sql
'{documents_meta}',
COALESCE(...новые...) || COALESCE(...старые...)
```
### 4.2 Найденные дубликаты
| claim_id | Было записей | Уникальных |
|----------|--------------|------------|
| `bddb6815-8e17-4d54-a721-5e94382942c7` | 11 | 5 |
| `226564ce-d7cf-48ee-a820-690e8f5ec8e5` | 3 | 2 |
| `509872e2-9666-4c5e-8ab7-2304dd6a5d18` | 4 | 3 |
| `ef853bac-f54b-46aa-adf8-f0c9c0cd76bc` | 4 | 3 |
### 4.3 SQL для исправления
```sql
-- Дедупликация по field_name (оставляем последний файл)
UPDATE clpr_claims
SET payload = jsonb_set(
payload,
'{documents_meta}',
(
SELECT COALESCE(
jsonb_agg(doc ORDER BY (doc->>'uploaded_at') DESC NULLS LAST),
'[]'::jsonb
)
FROM (
SELECT DISTINCT ON (doc->>'field_name') doc
FROM jsonb_array_elements(payload->'documents_meta') doc
ORDER BY doc->>'field_name', (doc->>'uploaded_at') DESC NULLS LAST
) unique_docs
),
true
),
updated_at = now()
WHERE id IN (...);
```
### 4.4 Исправленный SQL для загрузки документов
Добавлен CTE `documents_meta_dedup`:
```sql
documents_meta_dedup AS (
SELECT COALESCE(
(
SELECT jsonb_agg(doc ORDER BY (doc->>'uploaded_at') DESC NULLS LAST)
FROM (
SELECT DISTINCT ON (doc->>'field_name', doc->>'file_id') doc
FROM (
-- Новые записи (приоритет 1)
SELECT jsonb_array_elements(...) AS doc, 1 AS priority
UNION ALL
-- Существующие записи (приоритет 2)
SELECT jsonb_array_elements(...) AS doc, 2 AS priority
) all_docs
ORDER BY doc->>'field_name', doc->>'file_id', priority
) unique_docs
),
'[]'::jsonb
) AS documents_meta
)
```
---
## 5. n8n Workflows
### 5.1 Проблема с Redis каналами
**Бэкенд публикует:** `clpr:check:ocr_status`
**n8n слушает:**
- `fnSo3FTTbQcMjwt3``clpr:ocr:clime_file`
- `1IKe2PccqXLkD2KR``clpr:ocr:jobs`
**Нужно:** Либо создать новый workflow для `clpr:check:ocr_status`, либо изменить канал в бэкенде.
---
## 6. Файлы изменены
### Frontend
- `ticket_form/frontend/index.html`
- `ticket_form/frontend/public/index.html`
- `ticket_form/frontend/src/pages/ClaimForm.tsx`
- `ticket_form/frontend/src/components/form/StepDraftSelection.tsx`
- `ticket_form/frontend/src/components/form/StepWizardPlan.tsx`
- `ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts`
### Backend
- `ticket_form/backend/app/api/claims.py`
- `ticket_form/backend/app/api/documents.py`
- `ticket_form/backend/app/api/events.py`
### CRM
- `include/Webservices/UpsertContact.php` (NEW)
- `include/Webservices/UpsertAccounts.php` (NEW)
- `include/Webservices/UpsertProject.php` (NEW)
---
## 7. Коммит
```
git commit -m "feat: UI/UX improvements + CRM integration methods + documents_meta deduplication"
Commit: da82100b
12 files changed, 1531 insertions(+), 145 deletions(-)
```
---
## 8. Нерешённые задачи
1. **n8n workflow для `clpr:check:ocr_status`** - нужно либо создать новый, либо изменить канал
2. **Обновить SQL в бэкенде** - заменить SQL загрузки документов на версию с дедупликацией
3. **Обновить n8n ноды** для использования новых CRM методов:
- `Create Contact``UpsertContact`
- `Create Account``UpsertAccounts`
- `Create Project``UpsertProject`
---
## Метаданные сессии
- **Дата:** 2025-12-01
- **Продолжительность:** ~2 часа
- **Основной фокус:** UI/UX, CRM интеграция, исправление дубликатов