# 📎 API для привязки документов к проекту/заявке ## ✅ Готово к использованию! --- ## 🎯 Эндпоинт ``` POST https://crm.clientright.ru/api/n8n/documents/attach ``` --- ## 📋 Параметры запроса ### Обязательные: | Параметр | Тип | Описание | Пример | |----------|-----|----------|--------| | `contact_id` | string | ID контакта в vTiger | `"320096"` | | `project_id` | string | ID проекта (полиса) в vTiger | `"396874"` | | `file_url` | string | Полный URL файла в S3 | `"https://s3.twcstorage.ru/..."` | | `file_name` | string | Имя файла | `"boarding_pass.pdf"` | ### Опциональные: | Параметр | Тип | Описание | Пример | |----------|-----|----------|--------| | `ticket_id` | string | ID заявки в HelpDesk
**Если указан → привязка к заявке**
**Если не указан → привязка к проекту** | `"396935"` | | `file_type` | string | Описание типа документа | `"flight_delay_boarding_or_ticket"` | --- ## 🔧 Логика работы ``` ┌─────────────────────────────────────────────┐ │ POST /api/n8n/documents/attach │ └─────────────────┬───────────────────────────┘ │ ▼ ┌────────────────┐ │ ticket_id есть?│ └────────┬───────┘ │ ┌─────────┴─────────┐ │ │ ДА НЕТ │ │ ▼ ▼ ┌───────────────┐ ┌──────────────┐ │ Привязка к │ │ Привязка к │ │ HelpDesk │ │ Project │ │ (заявке) │ │ (проекту) │ └───────────────┘ └──────────────┘ ``` --- ## 📤 Примеры запросов ### 1️⃣ Привязка к проекту (без заявки) Используется когда файл относится к полису в целом, но еще нет конкретной заявки. ```bash curl -X POST "https://crm.clientright.ru/api/n8n/documents/attach" \ -H "Content-Type: application/json" \ -d '{ "contact_id": "320096", "project_id": "396874", "file_url": "https://s3.twcstorage.ru/f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c/clientright/test/policy_scan.pdf", "file_name": "policy_E1000-302538529.pdf", "file_type": "Скан полиса ERV" }' ``` **Ответ:** ```json { "success": true, "result": { "document_id": "15x396940", "document_numeric_id": "396940", "attached_to": "project", // ✅ Привязан к проекту "attached_to_id": "396874", "file_name": "policy_E1000-302538529.pdf", "file_type": "Скан полиса ERV", "s3_bucket": "f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c", "s3_key": "clientright/test/policy_scan.pdf", "file_size": 125840, "message": "Документ создан с правильными S3 метаданными и привязан к проекту" } } ``` --- ### 2️⃣ Привязка к заявке (HelpDesk) Используется когда файл относится к конкретной заявке (страховому случаю). ```bash curl -X POST "https://crm.clientright.ru/api/n8n/documents/attach" \ -H "Content-Type: application/json" \ -d '{ "contact_id": "320096", "project_id": "396874", "ticket_id": "396935", // ✅ Указан ticket_id "file_url": "https://s3.twcstorage.ru/f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c/clientright/test/boarding_pass.pdf", "file_name": "boarding_pass_20251102.pdf", "file_type": "flight_delay_boarding_or_ticket" }' ``` **Ответ:** ```json { "success": true, "result": { "document_id": "15x396941", "document_numeric_id": "396941", "attached_to": "ticket", // ✅ Привязан к заявке "attached_to_id": "396935", "file_name": "boarding_pass_20251102.pdf", "file_type": "flight_delay_boarding_or_ticket", "s3_bucket": "f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c", "s3_key": "clientright/test/boarding_pass.pdf", "file_size": 85320, "message": "Документ создан с правильными S3 метаданными и привязан к проекту" } } ``` --- ## 🗂️ Типы файлов (file_type) Примеры значений для `file_type`: | Тип | Описание | |-----|----------| | `flight_delay_boarding_or_ticket` | Посадочный талон / билет при задержке рейса | | `flight_delay_confirmation` | Подтверждение задержки рейса | | `flight_cancel_confirmation` | Подтверждение отмены рейса | | `medical_receipt` | Медицинский чек | | `medical_report` | Медицинское заключение | | `luggage_delay_report` | Акт о задержке багажа | | `passport_scan` | Скан паспорта | | `policy_scan` | Скан страхового полиса | | `other` | Прочие документы | --- ## 📊 Интеграция с n8n ### В workflow после загрузки файла в S3: ```javascript // HTTP Request Node: POST /api/n8n/documents/attach { "contact_id": "{{ $json.contact_id }}", "project_id": "{{ $json.project_id }}", "ticket_id": "{{ $json.ticket_id }}", // Опционально "file_url": "{{ $json.s3_url }}", "file_name": "{{ $json.original_filename }}", "file_type": "{{ $json.document_type }}" } ``` ### Ответ сохранить в Redis: ```javascript // Добавить в session: { ...session_data, documents: [ ...session_data.documents, { document_id: $json.result.document_id, file_name: $json.result.file_name, file_type: $json.result.file_type, attached_to: $json.result.attached_to, uploaded_at: new Date().toISOString() } ] } ``` --- ## 🔍 Логи ### Backend (FastAPI): ```bash cd /var/www/fastuser/data/www/crm.clientright.ru/erv_platform docker-compose logs -f backend | grep "Attaching document" ``` **Пример вывода:** ``` 📎 Attaching document: boarding_pass.pdf (type: flight_delay_boarding_or_ticket) Contact: 320096, Project: 396874, Ticket: 396935 📤 Sending to CRM: {...} ✅ Document attached successfully. Response: {...} ``` ### CRM (PHP): ```bash tail -f /var/www/fastuser/data/www/crm.clientright.ru/logs/upload_documents.log ``` **Пример вывода:** ``` [2025-11-02 16:30:15] 🚀 Начинаем создание документов... [2025-11-02 16:30:15] 📄 Обрабатываем файл #0: boarding_pass.pdf [2025-11-02 16:30:16] ✅ Документ создан: 15x396941 (numeric: 396941) [2025-11-02 16:30:16] 📎 Привязываем к HelpDesk ticket_id: 396935 [2025-11-02 16:30:17] ✅ Документ привязан к HelpDesk #396935 ``` --- ## ⚠️ Обработка ошибок ### 400 Bad Request - Отсутствуют обязательные поля ```json { "detail": "Обязательные поля: contact_id, project_id, file_url, file_name" } ``` ### 500 Internal Server Error - Ошибка CRM ```json { "detail": "CRM error: Не найден Project ID 999999" } ``` ### 504 Gateway Timeout - Таймаут CRM ```json { "detail": "Таймаут загрузки в CRM" } ``` --- ## ✅ Готово к использованию! Эндпоинт протестирован и готов к интеграции в n8n workflow! 🚀