feat: Получение cf_2624 из MySQL и блокировка полей при подтверждении данных
- Добавлен сервис CrmMySQLService для прямого подключения к MySQL CRM - Обновлён метод get_draft() для получения cf_2624 напрямую из БД - Реализована блокировка полей (readonly) при contact_data_confirmed = true - Добавлен выбор банка для СБП выплат с динамической загрузкой из API - Обновлена документация по работе с cf_2624 и MySQL - Добавлен network_mode: host в docker-compose для доступа к MySQL - Обновлены компоненты формы для поддержки блокировки полей
This commit is contained in:
149
docs/CRM_CONTACT_DATA_CONFIRMED_FIELD.md
Normal file
149
docs/CRM_CONTACT_DATA_CONFIRMED_FIELD.md
Normal file
@@ -0,0 +1,149 @@
|
||||
# Добавление поля "Данные подтверждены" в CRM
|
||||
|
||||
## Шаг 1: Создание кастомного поля в CRM
|
||||
|
||||
1. Зайти в CRM → Настройки → Кастомные поля → Модуль "Контакты"
|
||||
2. Создать новое поле:
|
||||
- **Название:** "Данные подтверждены"
|
||||
- **Тип:** "Да/Нет" (Checkbox) или "Список" (Picklist) со значениями "Да"/"Нет"
|
||||
- **Код поля:** `cf_2624` ✅ (уже создано)
|
||||
- **По умолчанию:** "Нет" (false)
|
||||
|
||||
3. **ВАЖНО:** Записать номер поля (например, `cf_2624`)
|
||||
|
||||
---
|
||||
|
||||
## Шаг 2: Обновление backend для проверки поля в CRM
|
||||
|
||||
### Файл: `ticket_form/backend/app/api/claims.py`
|
||||
|
||||
В функции `get_draft()` вместо проверки PostgreSQL, проверяем поле в CRM:
|
||||
|
||||
```python
|
||||
# ✅ Проверяем флаг подтверждения данных контакта из CRM
|
||||
unified_id = row.get('unified_id')
|
||||
contact_data_confirmed = False
|
||||
contact_data_can_edit = True
|
||||
contact_data_confirmed_at = None
|
||||
contact_data_from_crm = None
|
||||
|
||||
if unified_id:
|
||||
# Получаем contact_id из payload
|
||||
contact_id = payload.get('contact_id') if isinstance(payload, dict) else None
|
||||
|
||||
if contact_id:
|
||||
try:
|
||||
# Получаем данные контакта из CRM
|
||||
async with httpx.AsyncClient(timeout=30.0) as client:
|
||||
# 1. Get Challenge
|
||||
challenge_response = await client.get(
|
||||
f"{settings.crm_webservice_url}",
|
||||
params={"operation": "getchallenge", "username": "api"}
|
||||
)
|
||||
challenge_data = challenge_response.json()
|
||||
token = challenge_data.get("result", {}).get("token", "")
|
||||
|
||||
# 2. Login
|
||||
import hashlib
|
||||
salt = "4r9ANex8PT2IuRV"
|
||||
access_key = hashlib.md5((token + salt).encode()).hexdigest()
|
||||
|
||||
login_response = await client.post(
|
||||
f"{settings.crm_webservice_url}",
|
||||
data={
|
||||
"operation": "login",
|
||||
"username": "api",
|
||||
"accessKey": access_key
|
||||
}
|
||||
)
|
||||
login_data = login_response.json()
|
||||
session_name = login_data.get("result", {}).get("sessionName", "")
|
||||
|
||||
# 3. Retrieve Contact
|
||||
retrieve_response = await client.post(
|
||||
f"{settings.crm_webservice_url}",
|
||||
data={
|
||||
"operation": "retrieve",
|
||||
"sessionName": session_name,
|
||||
"id": f"12x{contact_id}"
|
||||
}
|
||||
)
|
||||
retrieve_data = retrieve_response.json()
|
||||
|
||||
if retrieve_data.get("success") and retrieve_data.get("result"):
|
||||
contact_data_from_crm = retrieve_data["result"]
|
||||
|
||||
# ✅ Проверяем кастомное поле "Данные подтверждены"
|
||||
confirmed_field = contact_data_from_crm.get("cf_2624", "0") # "1" = да, "0" = нет
|
||||
contact_data_confirmed = confirmed_field == "1" or confirmed_field == "true"
|
||||
contact_data_can_edit = not contact_data_confirmed
|
||||
|
||||
logger.info(
|
||||
f"🔒 Статус данных контакта из CRM: confirmed={contact_data_confirmed}, "
|
||||
f"field_value={confirmed_field}"
|
||||
)
|
||||
except Exception as e:
|
||||
logger.warning(f"⚠️ Не удалось загрузить данные из CRM: {str(e)}")
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Шаг 3: Обновление n8n workflow для установки поля
|
||||
|
||||
### В workflow `6mxRJ2LLHmQXyaDz`
|
||||
|
||||
После подтверждения формы (после SMS-верификации) добавить ноду:
|
||||
|
||||
**Название:** `HTTP Request: Set Contact Data Confirmed`
|
||||
|
||||
**Метод:** POST
|
||||
|
||||
**URL:** `{{ $env.CRM_WEBSERVICE_URL }}`
|
||||
|
||||
**Body (form-data):**
|
||||
```
|
||||
operation: revise
|
||||
sessionName: {{ $('Login to CRM').json.sessionName }}
|
||||
id: 12x{{ JSON.parse($node['CreateWebContacКлиентправ'].json.result).contact_id }}
|
||||
cf_2624: 1
|
||||
```
|
||||
|
||||
**Где:**
|
||||
- `cf_2624` - поле "Данные подтверждены"
|
||||
- `1` = "Да" (данные подтверждены)
|
||||
|
||||
---
|
||||
|
||||
## Шаг 4: Обновление UpsertContact (если используется)
|
||||
|
||||
Если используется `UpsertContact.php`, добавить поддержку нового поля:
|
||||
|
||||
```php
|
||||
// В функции vtws_upsertcontact()
|
||||
if (!empty($data_confirmed)) {
|
||||
$params['cf_2624'] = $data_confirmed; // "1" или "0"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Преимущества подхода:
|
||||
|
||||
1. ✅ **CRM - источник истины** - все данные в одном месте
|
||||
2. ✅ **Нет синхронизации** - не нужно синхронизировать флаги между PostgreSQL и CRM
|
||||
3. ✅ **Простота** - один флаг в CRM, проверяем его напрямую
|
||||
4. ✅ **Видимость** - менеджеры видят статус в карточке контакта
|
||||
5. ✅ **Гибкость** - можно менять статус вручную в CRM
|
||||
|
||||
---
|
||||
|
||||
## Проверка:
|
||||
|
||||
1. ✅ Поле создано в CRM: `cf_2624`
|
||||
2. ⏳ Обновить код backend (использовать `cf_2624`)
|
||||
3. ⏳ Обновить n8n workflow (использовать `cf_2624`)
|
||||
4. ⏳ Протестировать:
|
||||
- Создать контакт → поле должно быть "Нет"
|
||||
- Подтвердить форму → поле должно стать "Да"
|
||||
- Загрузить черновик → поля должны быть заблокированы
|
||||
|
||||
Reference in New Issue
Block a user