136 lines
5.4 KiB
Markdown
136 lines
5.4 KiB
Markdown
|
|
# Реализация проверки cf_2624 при формировании заявления
|
|||
|
|
|
|||
|
|
## ✅ Что сделано
|
|||
|
|
|
|||
|
|
### 1. Backend API (`/drafts/{claim_id}`)
|
|||
|
|
- ✅ Получает `cf_2624` из CRM через webservice `retrieve`
|
|||
|
|
- ✅ Преобразует в `contact_data_confirmed` (boolean)
|
|||
|
|
- ✅ Возвращает в ответе API вместе с `contact_data_from_crm`
|
|||
|
|
|
|||
|
|
**Файл:** `ticket_form/backend/app/api/claims.py` (строки 459-539)
|
|||
|
|
|
|||
|
|
### 2. Frontend - Загрузка черновика
|
|||
|
|
- ✅ Получает `contact_data_confirmed` из ответа API
|
|||
|
|
- ✅ Сохраняет в `formData`
|
|||
|
|
- ✅ Передаёт в `claimPlanData` для `StepClaimConfirmation`
|
|||
|
|
|
|||
|
|
**Файл:** `ticket_form/frontend/src/pages/ClaimForm.tsx` (строки 564-848)
|
|||
|
|
|
|||
|
|
### 3. Frontend - Форма подтверждения
|
|||
|
|
- ✅ `StepClaimConfirmation` получает `contact_data_confirmed` из `claimPlanData`
|
|||
|
|
- ✅ Передаёт в `generateConfirmationFormHTML`
|
|||
|
|
- ✅ Форма блокирует персональные данные если `contact_data_confirmed = true`
|
|||
|
|
|
|||
|
|
**Файлы:**
|
|||
|
|
- `ticket_form/frontend/src/components/form/StepClaimConfirmation.tsx` (строки 89-96)
|
|||
|
|
- `ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts` (строки 4, 293, 724-740, 840, 907-915)
|
|||
|
|
|
|||
|
|
### 4. CreateWebContact
|
|||
|
|
- ✅ Возвращает `cf_2624` в JSON ответе
|
|||
|
|
- ✅ Для новых контактов: `cf_2624 = "0"`
|
|||
|
|
- ✅ Для существующих: берёт значение из CRM
|
|||
|
|
|
|||
|
|
**Файл:** `include/Webservices/CreateWebContact.php`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⏳ Что нужно сделать
|
|||
|
|
|
|||
|
|
### 1. Обновить n8n workflow `6mxRJ2LLHmQXyaDz`
|
|||
|
|
|
|||
|
|
**После ноды `CreateWebContacКлиентправ`:**
|
|||
|
|
|
|||
|
|
Добавить ноду `Code: Extract Contact Data Confirmed`:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// Парсим результат CreateWebContact
|
|||
|
|
const rawResult = $node["CreateWebContacКлиентправ"].json.result;
|
|||
|
|
const contactData = JSON.parse(rawResult);
|
|||
|
|
|
|||
|
|
// Извлекаем cf_2624 (Данные подтверждены)
|
|||
|
|
const cf_2624 = contactData.cf_2624 || "0";
|
|||
|
|
const contact_data_confirmed = cf_2624 === "1";
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
contact_id: contactData.contact_id,
|
|||
|
|
is_new_contact: contactData.is_new,
|
|||
|
|
cf_2624: cf_2624,
|
|||
|
|
contact_data_confirmed: contact_data_confirmed,
|
|||
|
|
contact_data_can_edit: !contact_data_confirmed
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**В ноде `Code in JavaScriptКлиентправ` (формирование ответа):**
|
|||
|
|
|
|||
|
|
Добавить в return:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
const contactStatus = $('Code: Extract Contact Data Confirmed').first().json;
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
// ... существующие поля ...
|
|||
|
|
contact_data_confirmed: contactStatus.contact_data_confirmed || false,
|
|||
|
|
contact_data_can_edit: contactStatus.contact_data_can_edit !== false,
|
|||
|
|
cf_2624: contactStatus.cf_2624 || "0",
|
|||
|
|
// ... остальные поля ...
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**См. подробности:** `ticket_form/docs/N8N_UPDATE_CF_2624_IN_RESPONSE.md`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔄 Логика работы
|
|||
|
|
|
|||
|
|
### Сценарий 1: Загрузка черновика
|
|||
|
|
1. Пользователь выбирает черновик
|
|||
|
|
2. Frontend вызывает `/api/v1/claims/drafts/{claim_id}`
|
|||
|
|
3. Backend получает `cf_2624` из CRM
|
|||
|
|
4. Backend возвращает `contact_data_confirmed = (cf_2624 === "1")`
|
|||
|
|
5. Frontend передаёт флаг в форму подтверждения
|
|||
|
|
6. Форма блокирует поля если `contact_data_confirmed = true`
|
|||
|
|
|
|||
|
|
### Сценарий 2: Новое заявление (через n8n)
|
|||
|
|
1. Пользователь вводит телефон
|
|||
|
|
2. n8n вызывает `CreateWebContact`
|
|||
|
|
3. `CreateWebContact` возвращает `cf_2624` в ответе
|
|||
|
|
4. n8n извлекает `cf_2624` и передаёт в ответе для фронтенда
|
|||
|
|
5. Frontend получает `contact_data_confirmed` из ответа n8n
|
|||
|
|
6. Форма блокирует поля если `contact_data_confirmed = true`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 Какие поля блокируются
|
|||
|
|
|
|||
|
|
Если `contact_data_confirmed = true`, блокируются следующие поля:
|
|||
|
|
- ✅ Фамилия (`lastname`)
|
|||
|
|
- ✅ Имя (`firstname`)
|
|||
|
|
- ✅ Отчество (`secondname`, `middle_name`)
|
|||
|
|
- ✅ ИНН (`inn`)
|
|||
|
|
- ✅ Дата рождения (`birthday`)
|
|||
|
|
- ✅ Место рождения (`birthplace`, `birth_place`)
|
|||
|
|
- ✅ Адрес (`mailingstreet`, `address`)
|
|||
|
|
- ✅ Email (`email`)
|
|||
|
|
|
|||
|
|
**Телефон (`mobile`) всегда только для чтения** (не зависит от флага)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧪 Проверка
|
|||
|
|
|
|||
|
|
1. ✅ Создать контакт в CRM → `cf_2624` должен быть "0"
|
|||
|
|
2. ✅ Загрузить черновик → поля должны быть редактируемыми
|
|||
|
|
3. ⏳ Установить `cf_2624 = "1"` в CRM
|
|||
|
|
4. ⏳ Загрузить черновик → поля должны быть заблокированы
|
|||
|
|
5. ⏳ Проверить предупреждение "⚠️ Данные подтверждены" в форме
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 Документация
|
|||
|
|
|
|||
|
|
- `ticket_form/docs/CRM_CONTACT_DATA_CONFIRMED_FIELD.md` - Описание поля cf_2624
|
|||
|
|
- `ticket_form/docs/CREATE_WEB_CONTACT_RESPONSE_FORMAT.md` - Формат ответа CreateWebContact
|
|||
|
|
- `ticket_form/docs/N8N_UPDATE_CF_2624_IN_RESPONSE.md` - Обновление n8n workflow
|
|||
|
|
- `ticket_form/docs/CODE_CREATE_WEB_CONTACT_FINAL.js` - Код для n8n (обновлён)
|
|||
|
|
|