feat: Добавлен инструмент генерации документов для AI Ассистента

- Создан API create_document_with_text.php для создания DOCX/XLSX/PPTX с текстом от AI
- Поддержка Markdown форматирования (заголовки, жирный, курсив, списки, код)
- Установлен PHPWord для красивого форматирования документов
- Исправлены пути сохранения (crm2/CRM_Active_Files/... без /crm/ в начале)
- Замена пробелов на подчеркивания в именах папок
- Создана документация для AI и разработчиков
- Добавлены API для работы с шаблонами Nextcloud
This commit is contained in:
Fedor
2025-11-12 19:46:06 +03:00
parent 75912e5cfb
commit cd90b0d58a
307 changed files with 17246 additions and 417 deletions

View File

@@ -1,9 +1,10 @@
<?php
/*********************************************************************************
* API-интерфейс для создания Проекта из Web-формы (упрощённый)
* Обязательное поле: cf_1885 (номер полиса)
* Логика: если проект с таким полисом существует - возвращаем ID БЕЗ обновления
* Автор: Фёдор, 2025-11-01
* Обязательные поля: cf_1885 (номер полиса), contact_id (контакт)
* Логика: если проект с таким полисом И привязкой к контакту существует - возвращаем ID БЕЗ обновления
* (по одному полису может быть несколько застрахованных лиц!)
* Автор: Фёдор, 2025-11-02
********************************************************************************/
include_once 'include/Webservices/Query.php';
@@ -17,7 +18,8 @@ vimport ('includes.runtime.LanguageHandler');
/**
* Создание проекта из web-формы
* Если проект с таким номером полиса уже существует - просто возвращаем его ID
* Если проект с таким номером полиса И привязкой к контакту уже существует - просто возвращаем его ID
* (один полис может быть у нескольких застрахованных лиц!)
* @param string $policy_number - номер полиса (обязательное поле) - cf_1885
* @param string $contact_id - ID контакта для привязки (обязательное поле)
* @param string $period_start - дата начала страхования (опционально) - cf_1887
@@ -50,21 +52,27 @@ function vtws_createwebproject($policy_number, $contact_id, $period_start = '',
// Валидация: убираем пробелы из номера полиса
$policy_number = trim($policy_number);
$logstring = date('Y-m-d H:i:s').' Ищем проект по policy_number='.$policy_number.PHP_EOL;
$logstring = date('Y-m-d H:i:s').' Ищем проект по policy_number='.$policy_number.' И contact_id='.$contact_id.PHP_EOL;
file_put_contents('logs/CreateWebProject.log', $logstring, FILE_APPEND);
global $adb, $current_user;
$isNew = false; // Флаг: создан ли проект сейчас
// Проверяем существование проекта по номеру полиса
// Проверяем существование проекта по номеру полиса И привязке к контакту
// (т.к. по одному полису может быть несколько застрахованных лиц)
$query = "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 = ?
LEFT JOIN vtiger_crmentity e ON e.crmid = p.projectid
LEFT JOIN vtiger_crmentityrel rel ON
(rel.crmid = p.projectid AND rel.relcrmid = ?)
OR (rel.relcrmid = p.projectid AND rel.crmid = ?)
WHERE e.deleted = 0
AND pcf.cf_1885 = ?
AND rel.crmid IS NOT NULL
LIMIT 1";
$result = $adb->pquery($query, array($policy_number));
$result = $adb->pquery($query, array($contact_id, $contact_id, $policy_number));
if ($adb->num_rows($result) > 0) {
// Проект существует - ПРОСТО ВОЗВРАЩАЕМ ID (НЕ обновляем!)
@@ -126,4 +134,5 @@ function vtws_createwebproject($policy_number, $contact_id, $period_start = '',
ob_end_clean();
return $result; // ← Массив, НЕ json_encode!
}
}