connect_error) { throw new Exception('Не удалось подключиться к БД: ' . $mysqli->connect_error); } $mysqli->set_charset('utf8mb4'); // Получаем данные проекта $query = "SELECT e.smownerid, p.projectname, p.linktoaccountscontacts FROM vtiger_crmentity e JOIN vtiger_project p ON p.projectid = e.crmid WHERE e.crmid = ? AND e.deleted = 0"; $stmt = $mysqli->prepare($query); $stmt->bind_param('i', $projectId); $stmt->execute(); $result_query = $stmt->get_result(); if ($result_query->num_rows === 0) { throw new Exception("Проект $projectId не найден"); } $row = $result_query->fetch_assoc(); $ownerId = $row['smownerid']; $projectName = $row['projectname']; $contactId = $row['linktoaccountscontacts'] ?? null; log_event('DEBUG', "Владелец проекта: $ownerId, Название: $projectName, Контакт: " . ($contactId ?? 'нет')); // Форматируем дату и время для CRM $formattedDate = formatDateForCRM($eventDate); $formattedTime = formatTimeForCRM($eventTime); $formattedDateTime = $formattedDate . ' ' . $formattedTime; // Вычисляем время окончания (+1 час) $endDateTime = date('Y-m-d H:i:s', strtotime($formattedDateTime) + 3600); log_event('DEBUG', "Дата начала: $formattedDateTime, Дата окончания: $endDateTime"); // Определяем тип события и статус - используем настройки как в workflow 3 (блок 18) $activityType = 'судебное заседание'; $eventstatus = 'Planned'; // Запланировано (как в workflow) log_event('DEBUG', "Установлен тип 'судебное заседание' и статус 'Planned' (как в workflow 3)"); // Формируем тему события с названием проекта $eventSubject = $eventName; if (!empty($projectName)) { $eventSubject = "[$projectName] $eventName"; } log_event('DEBUG', "Тип события: $activityType, Статус: $eventstatus, Тема: $eventSubject"); // Формируем описание события $description = "Автоматически созданное событие из судебного дела\n\n"; if (!empty($location)) { $description .= "Место: $location\n"; } if (!empty($result)) { $description .= "Результат: $result\n"; } if (!empty($basis)) { $description .= "Основание: $basis\n"; } if (!empty($note)) { $description .= "Примечание: $note\n"; } if (!empty($publicationDate)) { $description .= "Дата размещения: $publicationDate\n"; } // Получаем следующий ID $result_id = $mysqli->query("SELECT MAX(crmid) as max_id FROM vtiger_crmentity"); $row_id = $result_id->fetch_assoc(); $eventId = ($row_id['max_id'] ?? 0) + 1; log_event('DEBUG', "Новый ID события: $eventId"); $created_time = date('Y-m-d H:i:s'); // Создаем запись в vtiger_crmentity $sql = "INSERT INTO vtiger_crmentity (crmid, smcreatorid, smownerid, modifiedby, setype, description, createdtime, modifiedtime, presence, deleted, label) VALUES (?, ?, ?, ?, 'Calendar', ?, ?, ?, 1, 0, ?)"; $stmt = $mysqli->prepare($sql); $stmt->bind_param('iiiissss', $eventId, $ownerId, $ownerId, $ownerId, $description, $created_time, $created_time, $eventSubject); $stmt->execute(); log_event('DEBUG', "Запись в vtiger_crmentity создана"); // Создаем запись в vtiger_activity $visibility = 'Public'; $endTime = date('H:i:s', strtotime($formattedDateTime) + 3600); $sql = "INSERT INTO vtiger_activity (activityid, subject, activitytype, date_start, time_start, due_date, time_end, location, visibility, eventstatus) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; $stmt = $mysqli->prepare($sql); $stmt->bind_param('isssssssss', $eventId, $eventSubject, $activityType, $formattedDate, $formattedTime, $formattedDate, $endTime, $location, $visibility, $eventstatus); $stmt->execute(); log_event('DEBUG', "Запись в vtiger_activity создана"); // Связываем событие с проектом (vtiger_seactivityrel) $sql = "INSERT INTO vtiger_seactivityrel (crmid, activityid) VALUES (?, ?)"; $stmt = $mysqli->prepare($sql); $stmt->bind_param('ii', $projectId, $eventId); $stmt->execute(); log_event('SUCCESS', "Событие привязано к проекту в vtiger_seactivityrel"); // Связываем событие с проектом через общую таблицу связей (vtiger_crmentityrel) // Это ключевая связь для отображения события в интерфейсе проекта! $sql = "INSERT INTO vtiger_crmentityrel (crmid, module, relcrmid, relmodule) VALUES (?, 'Project', ?, 'Calendar')"; $stmt = $mysqli->prepare($sql); $stmt->bind_param('ii', $projectId, $eventId); $stmt->execute(); log_event('SUCCESS', "Событие привязано к проекту в vtiger_crmentityrel (для отображения в UI)"); // Связываем событие с контактом (если контакт указан в проекте) if (!empty($contactId) && $contactId > 0) { $sql = "INSERT INTO vtiger_cntactivityrel (contactid, activityid) VALUES (?, ?)"; $stmt = $mysqli->prepare($sql); $stmt->bind_param('ii', $contactId, $eventId); $stmt->execute(); log_event('SUCCESS', "Событие привязано к контакту: $contactId"); } else { log_event('DEBUG', "Контакт не указан в проекте, пропускаем связывание"); } // Обновляем поля проекта с информацией о последнем событии try { // Формируем описание для cf_2496 $cf2496Description = $eventSubject; if (!empty($result) && trim($result) !== '') { // Очищаем результат от лишних пробелов и дефисов $cleanResult = trim($result); $cf2496Description .= " - $cleanResult"; } $sql = "UPDATE vtiger_projectcf SET cf_1682 = ?, cf_1684 = ?, cf_2496 = ? WHERE projectid = ?"; $stmt = $mysqli->prepare($sql); $stmt->bind_param('sssi', $formattedDate, $formattedTime, $cf2496Description, $projectId); $stmt->execute(); log_event('SUCCESS', "Поля проекта обновлены (cf_1682, cf_1684, cf_2496)"); log_event('DEBUG', "cf_2496 установлен: $cf2496Description"); } catch (Exception $e) { log_event('WARNING', "Не удалось обновить поля проекта: " . $e->getMessage()); } // Обновляем последовательность $mysqli->query("UPDATE vtiger_crmentity_seq SET id = $eventId"); $mysqli->close(); // Формируем успешный ответ $response = [ 'success' => true, 'event_id' => '4x' . $eventId, 'event_numeric_id' => $eventId, 'event_name' => $eventName, 'event_date' => $formattedDate, 'event_time' => $formattedTime, 'project_id' => $projectId, 'message' => 'Событие успешно создано и привязано к проекту' ]; log_event('SUCCESS', "=== ОБРАБОТКА ЗАВЕРШЕНА УСПЕШНО ==="); log_event('SUCCESS', "Событие создано: 4x$eventId"); header('Content-Type: application/json; charset=utf-8'); echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); exit(0); } catch (Exception $e) { $error_message = $e->getMessage(); log_event('ERROR', "Ошибка: $error_message"); $response = [ 'success' => false, 'error' => $error_message, 'timestamp' => date('Y-m-d H:i:s') ]; header('Content-Type: application/json; charset=utf-8'); http_response_code(500); echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); exit(1); } ?>