# Лог сессии 2025-12-03 ## Задача 1: Получение cf_2624 из MySQL при загрузке черновика ### Проблема Пользователь заметил, что для `claim_id: "226564ce-d7cf-48ee-a820-690e8f5ec8e5"` доступно редактирование, хотя в CRM стоит галка "Данные подтверждены" (`cf_2624 = "1"`). ### Решение Вместо передачи `cf_2624` через события Redis, реализован прямой SQL запрос к MySQL БД vtiger CRM при загрузке черновика. ## Изменения ### 1. Добавлены credentials для MySQL CRM в `config.py` ```python # MySQL CRM (vtiger CRM) mysql_crm_host: str = "localhost" mysql_crm_port: int = 3306 mysql_crm_db: str = "ci20465_72new" mysql_crm_user: str = "ci20465_72new" mysql_crm_password: str = "EcY979Rn" ``` ### 2. Создан сервис `CrmMySQLService` **Файл:** `ticket_form/backend/app/services/crm_mysql_service.py` - Подключение к MySQL БД vtiger CRM - Методы: `fetch_one()`, `fetch_all()`, `execute()` - Использует `aiomysql` для асинхронных запросов ### 3. Обновлён `main.py` - Добавлено подключение к MySQL CRM при старте - Добавлено закрытие соединения при остановке ### 4. Обновлён `claims.py` - метод `get_draft()` **Эндпоинт:** `GET /api/v1/claims/drafts/{claim_id}` **Изменения:** - Убран webservice API (getchallenge → login → retrieve) - Добавлен прямой SQL запрос к MySQL для получения `cf_2624` - Получаем все данные контакта, включая `cf_2624` - Добавлено логирование для отладки **SQL запрос:** ```sql SELECT cd.contactid, cd.firstname, cd.lastname, cd.email, cd.mobile, ccf.cf_2624 AS cf_2624 FROM vtiger_contactdetails cd LEFT JOIN vtiger_contactscf ccf ON ccf.contactid = cd.contactid LEFT JOIN vtiger_crmentity ce ON ce.crmid = cd.contactid WHERE cd.contactid = %s AND ce.deleted = 0 LIMIT 1 ``` **Логика:** - Если `cf_2624 = "1"` → `contact_data_confirmed = True`, `contact_data_can_edit = False` - Если `cf_2624 = "0"` или `NULL` → `contact_data_confirmed = False`, `contact_data_can_edit = True` ### 5. Обновлены SQL файлы и документация - `N8N_POSTGRESQL_GET_CONTACT_DATA.sql` → `N8N_MYSQL_GET_CONTACT_DATA.sql` - Изменён синтаксис: `$1` → `?` (для n8n MySQL ноды) - Обновлена документация `BACKEND_GET_CONTACT_CF_2624_FROM_POSTGRESQL.md` - Создан `N8N_MYSQL_GET_CONTACT_DATA.md` ## Преимущества нового подхода 1. ✅ **Проще** - один SQL запрос вместо цепочки HTTP запросов 2. ✅ **Быстрее** - прямой запрос к БД 3. ✅ **Надёжнее** - не зависит от webservice API 4. ✅ **Актуальнее** - всегда получаем свежие данные из БД ## Проблемы и решения ### Проблема 1: Файл crm_mysql_service.py отсутствовал в контейнере **Решение:** Пересобран контейнер через `docker-compose build ticket_form_backend` ### Проблема 2: MySQL не подключался из Docker контейнера **Ошибка:** `Can't connect to MySQL server on 'localhost'` **Решение:** - Изменён `docker-compose.yml`: добавлен `network_mode: host` - Изменён `config.py`: `mysql_crm_host = "localhost"` (в режиме host работает) **Результат:** `✅ MySQL CRM DB connected: localhost:3306/ci20465_72new` ### Проблема 3: contact_data_confirmed возвращал None **Причина:** Флаг не передавался в компонент `StepClaimConfirmation` **Решение:** - Добавлен prop `contact_data_confirmed` в `StepClaimConfirmation` - Передача флага из `formData.contact_data_confirmed` в компонент - Исправлена логика получения флага (приоритет: props > claimPlanData > false) ## Проверка **MySQL запрос:** ```bash mysql -h localhost -u ci20465_72new -p'EcY979Rn' ci20465_72new \ -e "SELECT contactid, cf_2624 FROM vtiger_contactscf WHERE contactid = '399542' LIMIT 1;" ``` **Результат:** ``` contactid cf_2624 399542 1 ``` ✅ В MySQL `cf_2624 = "1"` для `contact_id = "399542"` - данные подтверждены. **API тест:** ```bash curl "http://localhost:8200/api/v1/claims/drafts/226564ce-d7cf-48ee-a820-690e8f5ec8e5" ``` **Результат:** ```json { "contact_data_confirmed": true, "contact_data_can_edit": false, "contact_data_from_crm": { "contactid": "399542", "cf_2624": "1", ... } } ``` ## Текущий статус - ✅ Код обновлён - ✅ Бэкенд пересобран и перезапущен - ✅ MySQL CRM подключён - ✅ API возвращает правильные данные - ✅ Фронтенд получает `contact_data_confirmed` и блокирует поля - ✅ Поля формы блокируются (readonly) при `contact_data_confirmed = true` ## Блокировка полей При `contact_data_confirmed = true` блокируются следующие поля: - `firstname` (Имя) - `lastname` (Фамилия) - `secondname` / `middle_name` (Отчество) - `inn` (ИНН) - `birthday` (Дата рождения) - `birthplace` / `birth_place` (Место рождения) - `address` / `mailingstreet` (Адрес) - `email` (E-mail) Поля становятся `readonly` и отображаются с серым фоном. --- ## Задача 2: Выбор банка для СБП выплат ### Реализация - Динамическая загрузка списка банков из API `http://212.193.27.93/api/payouts/dictionaries/nspk-banks` - Добавлено в форму создания заявки (`Step3Payment.tsx`) - Добавлено в форму редактирования (`generateConfirmationFormHTML.ts`) - Используется `input` + `datalist` для автоподстановки --- ## Файлы изменены ### Backend: - `ticket_form/backend/app/config.py` - добавлены credentials для MySQL CRM - `ticket_form/backend/app/services/crm_mysql_service.py` - новый сервис - `ticket_form/backend/app/main.py` - подключение к MySQL CRM - `ticket_form/backend/app/api/claims.py` - прямой SQL запрос к MySQL - `ticket_form/docker-compose.yml` - добавлен `network_mode: host` ### Frontend: - `ticket_form/frontend/src/components/form/StepClaimConfirmation.tsx` - передача `contact_data_confirmed` - `ticket_form/frontend/src/pages/ClaimForm.tsx` - передача флага в компонент - `ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts` - блокировка полей ### Документация: - `ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.sql` - SQL запрос для n8n - `ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.md` - документация - `ticket_form/docs/BACKEND_GET_CONTACT_CF_2624_FROM_POSTGRESQL.md` - обновлена документация --- ## Коммиты 1. `e1142315` - feat: Получение cf_2624 из MySQL при загрузке черновика 2. `a86120dd` - fix: передача contact_data_confirmed в StepClaimConfirmation для блокировки полей --- **Время работы:** 2025-12-03 16:00-17:00 **Статус:** ✅ Завершено успешно