- Создан API create_document_with_text.php для создания DOCX/XLSX/PPTX с текстом от AI - Поддержка Markdown форматирования (заголовки, жирный, курсив, списки, код) - Установлен PHPWord для красивого форматирования документов - Исправлены пути сохранения (crm2/CRM_Active_Files/... без /crm/ в начале) - Замена пробелов на подчеркивания в именах папок - Создана документация для AI и разработчиков - Добавлены API для работы с шаблонами Nextcloud
239 lines
6.8 KiB
Markdown
239 lines
6.8 KiB
Markdown
# CreateWebProject - Документация
|
||
|
||
**Дата создания:** 01.11.2025
|
||
**Автор:** Фёдор
|
||
**Статус:** ✅ Работает и протестировано
|
||
|
||
---
|
||
|
||
## 📋 Назначение
|
||
|
||
Операция vTiger webservice для создания проекта из web-формы ERV.
|
||
|
||
**Логика работы:**
|
||
- Если проект с таким номером полиса **существует** → возвращает ID **БЕЗ обновления**
|
||
- Если проект **не существует** → создаёт новый
|
||
|
||
По аналогии с `CreateWebContact`.
|
||
|
||
---
|
||
|
||
## 🔧 Параметры
|
||
|
||
### Обязательные:
|
||
1. **policy_number** (String) - Номер полиса ERV (cf_1885)
|
||
- Пример: `E1000-123456789`
|
||
|
||
2. **contact_id** (String) - ID контакта для привязки
|
||
- Пример: `396625`
|
||
- Получается из `CreateWebContact` на шаге 1
|
||
|
||
### Опциональные:
|
||
3. **period_start** (String) - Дата начала страхования (cf_1887)
|
||
- Формат: `DD-MM-YYYY`
|
||
- Пример: `01-01-2025`
|
||
|
||
4. **period_end** (String) - Дата окончания страхования (cf_1889)
|
||
- Формат: `DD-MM-YYYY`
|
||
- Пример: `31-12-2025`
|
||
|
||
---
|
||
|
||
## 📥 Пример запроса
|
||
|
||
```bash
|
||
curl -X POST "https://crm.clientright.ru/webservice.php" \
|
||
-d "operation=CreateWebProject" \
|
||
-d "sessionName={token от login}" \
|
||
-d "policy_number=E1000-123456789" \
|
||
-d "contact_id=396625" \
|
||
-d "period_start=01-01-2025" \
|
||
-d "period_end=31-12-2025"
|
||
```
|
||
|
||
---
|
||
|
||
## 📤 Пример ответа
|
||
|
||
### Новый проект (создан):
|
||
```json
|
||
{
|
||
"success": true,
|
||
"result": "{\"project_id\":\"396865\",\"is_new\":true}"
|
||
}
|
||
```
|
||
|
||
### Существующий проект (найден):
|
||
```json
|
||
{
|
||
"success": true,
|
||
"result": "{\"project_id\":\"396865\",\"is_new\":false}"
|
||
}
|
||
```
|
||
|
||
**Важно:** `result` - это JSON-строка, требует `JSON.parse()`!
|
||
|
||
---
|
||
|
||
## 🏗️ Создаваемые поля проекта
|
||
|
||
При создании нового проекта заполняются:
|
||
|
||
| Поле | Значение | Примечание |
|
||
|------|----------|------------|
|
||
| `projectname` | `ERV {полис} цифровой адвокат` | Например: "ERV E1000-123456789 цифровой адвокат" |
|
||
| `projectstatus` | `модерация` | Статус |
|
||
| `projecttype` | `ерв урегулирование` | Тип проекта |
|
||
| `linktoaccountscontacts` | `12x{contact_id}` | Привязка к контакту |
|
||
| `cf_1994` | `11x67458` | Заявитель (контрагент) |
|
||
| `cf_1885` | `{policy_number}` | Номер полиса ⭐ |
|
||
| `cf_1887` | `{period_start}` | Период начала (опционально) |
|
||
| `cf_1889` | `{period_end}` | Период конца (опционально) |
|
||
| `assigned_user_id` | Текущий API user | Ответственный |
|
||
|
||
---
|
||
|
||
## 🔍 Логика поиска
|
||
|
||
Проект ищется в БД по запросу:
|
||
|
||
```sql
|
||
SELECT p.projectid
|
||
FROM vtiger_project p
|
||
INNER JOIN vtiger_projectcf pcf ON p.projectid = pcf.projectid
|
||
LEFT JOIN vtiger_crmentity e ON e.crmid = p.projectid
|
||
WHERE e.deleted = 0 AND pcf.cf_1885 = '{policy_number}'
|
||
LIMIT 1
|
||
```
|
||
|
||
**Поиск по:** `cf_1885` (номер полиса)
|
||
|
||
---
|
||
|
||
## 📁 Файлы
|
||
|
||
- **Handler:** `include/Webservices/CreateWebProject.php`
|
||
- **Handler Method:** `vtws_createwebproject`
|
||
- **Логи:** `logs/CreateWebProject.log`
|
||
|
||
---
|
||
|
||
## 🗄️ Регистрация в БД
|
||
|
||
### vtiger_ws_operation:
|
||
```
|
||
operationid: 51
|
||
name: CreateWebProject
|
||
handler_path: include/Webservices/CreateWebProject.php
|
||
handler_method: vtws_createwebproject
|
||
type: POST
|
||
prelogin: 0
|
||
```
|
||
|
||
### vtiger_ws_operation_parameters:
|
||
```
|
||
1. policy_number (String)
|
||
2. contact_id (String)
|
||
3. period_start (String)
|
||
4. period_end (String)
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ Тестирование
|
||
|
||
### Тест 1: Создание нового проекта
|
||
```
|
||
Полис: E1000-TEST-1761990646
|
||
Contact: 396625
|
||
Результат: {"project_id":"396865","is_new":true}
|
||
Статус: ✅ Создан
|
||
```
|
||
|
||
### Тест 2: Повторный вызов с тем же полисом
|
||
```
|
||
Полис: E1000-TEST-1761990646
|
||
Contact: 396625
|
||
Результат: {"project_id":"396865","is_new":false}
|
||
Статус: ✅ Найден существующий (НЕ создан дубликат!)
|
||
```
|
||
|
||
---
|
||
|
||
## 🔗 Интеграция с n8n
|
||
|
||
### Workflow флоу (планируется):
|
||
|
||
```
|
||
1. Step1Phone → CreateWebContact
|
||
↓ contact_id
|
||
|
||
2. Step2Policy → Проверка полиса
|
||
↓ policy_number, period_start, period_end
|
||
|
||
3. n8n → CreateWebProject
|
||
POST https://crm.clientright.ru/webservice.php
|
||
{
|
||
operation: CreateWebProject,
|
||
sessionName: {token},
|
||
policy_number: "E1000-123456789",
|
||
contact_id: "396625",
|
||
period_start: "01-01-2025",
|
||
period_end: "31-12-2025"
|
||
}
|
||
↓
|
||
|
||
4. Response → {"project_id": "396865", "is_new": false}
|
||
↓
|
||
|
||
5. Redis session update:
|
||
claim:{claim_id} += {
|
||
project_id: "396865",
|
||
is_new_project: false
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 Связь с CreateWebContact
|
||
|
||
| Операция | Ищет по | Создаёт если | Возвращает |
|
||
|----------|---------|--------------|------------|
|
||
| `CreateWebContact` | `mobile` (телефон) | Не найден контакт | `{contact_id, is_new}` |
|
||
| `CreateWebProject` | `cf_1885` (полис) | Не найден проект | `{project_id, is_new}` |
|
||
|
||
**Флоу:** Телефон → Контакт → Полис → Проект → Тип события → Документы → Тикет
|
||
|
||
---
|
||
|
||
## 🐛 Troubleshooting
|
||
|
||
### Ошибка: "Unknown operation requested"
|
||
**Причина:** Операция не зарегистрирована в БД.
|
||
**Решение:** Запустить `register_CreateWebProject_fixed.php` (уже выполнено).
|
||
|
||
### Ошибка: BOM символ в ответе
|
||
**Причина:** Файл CreateWebProject.php сохранён с UTF-8 BOM.
|
||
**Решение:** `sed -i '1s/^\xEF\xBB\xBF//' include/Webservices/CreateWebProject.php` (уже выполнено).
|
||
|
||
### Проект создаётся дубликатом
|
||
**Причина:** Номер полиса отличается (пробелы, регистр).
|
||
**Решение:** В коде есть `trim()`, но нет приведения к верхнему регистру. Если нужно - добавить.
|
||
|
||
---
|
||
|
||
## 📝 История изменений
|
||
|
||
**01.11.2025:**
|
||
- ✅ Создан файл CreateWebProject.php
|
||
- ✅ Зарегистрирован в БД (operationid: 51)
|
||
- ✅ Протестирован (создание + поиск)
|
||
- ✅ Закоммичен в master (af802149)
|
||
|
||
---
|
||
|
||
**Готово к использованию!** 🎉
|
||
|
||
|
||
|