Files
crm.clientright.ru/crm_extensions/simple_project_updater.php

331 lines
13 KiB
PHP
Raw Normal View History

<?php
/**
* Простая версия скрипта для обновления проекта
* Использует прямое подключение к MySQL
*/
// Устанавливаем рабочую директорию
chdir(__DIR__ . '/..');
// Функция для обновления проекта
function updateProject() {
try {
// Получаем входные данные
$input = '';
if (isset($argv[1])) {
$input = $argv[1];
} else {
$input = stream_get_contents(STDIN);
}
if (empty($input)) {
throw new Exception('Не указаны входные данные');
}
// Парсим JSON
$data = json_decode($input, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new Exception('Ошибка парсинга JSON: ' . json_last_error_msg());
}
// Проверяем структуру данных
if (!is_array($data)) {
throw new Exception('Неверная структура данных: ожидается массив');
}
// Обрабатываем первый элемент массива
$item = $data[0] ?? null;
if (!$item || !isset($item['content']) || !is_array($item['content'])) {
throw new Exception('Неверная структура данных: отсутствует content в первом элементе');
}
$content = $item['content'];
$file_url = $item['file'] ?? '';
$file_name = $item['file_name'] ?? '';
// Подключаемся к базе данных
$mysqli = new mysqli('localhost', 'ci20465_72new', 'EcY979Rn', 'ci20465_72new');
if ($mysqli->connect_error) {
throw new Exception('Ошибка подключения к БД: ' . $mysqli->connect_error);
}
$mysqli->set_charset('utf8');
// Поиск проекта
$plaintiff_fio = $content['plaintiff_fio'] ?? '';
$case_number = $content['case_number'] ?? '';
$uid = $content['uid'] ?? '';
$project_id = null;
// Поиск по ФИО
if ($plaintiff_fio) {
// Извлекаем фамилию из полного ФИО
$surname = explode(' ', $plaintiff_fio)[0];
$stmt = $mysqli->prepare("
SELECT p.projectid, p.projectname, p.project_no, e.description
FROM vtiger_project p
JOIN vtiger_crmentity e ON e.crmid = p.projectid AND e.deleted = 0
WHERE (p.projectname LIKE ? OR e.description LIKE ? OR p.projectname LIKE ? OR e.description LIKE ?)
LIMIT 1
");
$search_term_full = "%$plaintiff_fio%";
$search_term_surname = "%$surname%";
$stmt->bind_param('ssss', $search_term_full, $search_term_full, $search_term_surname, $search_term_surname);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
$project_id = $row['projectid'];
}
$stmt->close();
}
// Поиск по номеру дела
if (!$project_id && $case_number) {
$stmt = $mysqli->prepare("
SELECT p.projectid, p.projectname, p.project_no, e.description
FROM vtiger_project p
JOIN vtiger_crmentity e ON e.crmid = p.projectid AND e.deleted = 0
WHERE (p.project_no LIKE ? OR e.description LIKE ?)
LIMIT 1
");
$search_term = "%$case_number%";
$stmt->bind_param('ss', $search_term, $search_term);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
$project_id = $row['projectid'];
}
$stmt->close();
}
// Поиск по УИД
if (!$project_id && $uid) {
$stmt = $mysqli->prepare("
SELECT p.projectid, p.projectname, p.project_no, e.description
FROM vtiger_project p
JOIN vtiger_crmentity e ON e.crmid = p.projectid AND e.deleted = 0
WHERE e.description LIKE ?
LIMIT 1
");
$search_term = "%$uid%";
$stmt->bind_param('s', $search_term);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
$project_id = $row['projectid'];
}
$stmt->close();
}
if (!$project_id) {
throw new Exception('Проект не найден по указанным данным');
}
// Создаем документ в CRM
$document_id = null;
if (!empty($file_url) && !empty($file_name)) {
// Скачиваем файл
$file_content = file_get_contents($file_url);
if ($file_content === false) {
throw new Exception('Не удалось скачать файл: ' . $file_url);
}
// Формируем название документа
$document_title = "СУДЕБНЫЙ ДОКУМЕНТ";
if (!empty($content['document_title'])) {
$document_title = $content['document_title'];
}
if (!empty($content['case_number'])) {
$document_title .= " по делу " . $content['case_number'];
}
if (!empty($content['plaintiff_fio'])) {
$document_title .= " " . $content['plaintiff_fio'];
}
$document_title .= " " . date('d.m.Y');
// Получаем следующий ID для документа
$stmt = $mysqli->prepare("SELECT MAX(crmid) + 1 as next_id FROM vtiger_crmentity");
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$document_id = $row['next_id'];
$stmt->close();
// Обновляем vtiger_crmentity_seq чтобы избежать конфликтов ID
$stmt = $mysqli->prepare("UPDATE vtiger_crmentity_seq SET id = ?");
$stmt->bind_param('i', $document_id);
$stmt->execute();
$stmt->close();
// Создаем запись документа
$stmt = $mysqli->prepare("
INSERT INTO vtiger_crmentity
(crmid, smcreatorid, smownerid, modifiedby, setype, description, createdtime, modifiedtime, viewedtime, status, version, presence, deleted, smgroupid, source, label)
VALUES (?, 1, 8, 1, 'Documents', ?, NOW(), NOW(), NULL, NULL, 0, 1, 0, 0, 'CRM', ?)
");
$stmt->bind_param('iss', $document_id, $document_title, $document_title);
$stmt->execute();
$stmt->close();
// Создаем запись в vtiger_notes
$stmt = $mysqli->prepare("
INSERT INTO vtiger_notes
(notesid, note_no, title, filename, notecontent, folderid, filetype, filelocationtype, filedownloadcount, filestatus, filesize, fileversion, tags, its4you_company, s3_bucket, s3_key, s3_etag, nc_path)
VALUES (?, ?, ?, ?, ?, 3, 'application/pdf', 'E', 0, 1, ?, '', '', '', '', '', '', '')
");
$file_size = strlen($file_content);
$note_no = "ДОК_" . $document_id;
$stmt->bind_param('issssi', $document_id, $note_no, $document_title, $file_name, $document_title, $file_size);
$stmt->execute();
$stmt->close();
// Связываем документ с проектом
$stmt = $mysqli->prepare("
INSERT INTO vtiger_senotesrel (crmid, notesid) VALUES (?, ?)
");
$stmt->bind_param('ii', $project_id, $document_id);
$stmt->execute();
$stmt->close();
// Сохраняем файл в S3
$s3_bucket = 'f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c';
$s3_key = 'crm2/CRM_Active_Files/Documents/' . $document_id . '/' . $file_name;
// Генерируем ETag для S3
$s3_etag = '"' . md5($file_content) . '"';
// Обновляем запись в vtiger_notes с S3 информацией
$stmt = $mysqli->prepare("
UPDATE vtiger_notes
SET s3_bucket = ?, s3_key = ?, s3_etag = ?, nc_path = ?
WHERE notesid = ?
");
$stmt->bind_param('ssssi', $s3_bucket, $s3_key, $s3_etag, $s3_key, $document_id);
$stmt->execute();
$stmt->close();
// Загружаем файл в S3
$s3_url = "https://s3.twcstorage.ru/$s3_bucket/$s3_key";
// Используем curl для загрузки в S3
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $s3_url);
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_INFILE, fopen('data://text/plain;base64,' . base64_encode($file_content), 'r'));
curl_setopt($ch, CURLOPT_INFILESIZE, strlen($file_content));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/pdf',
'Content-Length: ' . strlen($file_content)
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code !== 200 && $http_code !== 201) {
// Логируем ошибку, но не прерываем выполнение
error_log("Ошибка загрузки в S3: HTTP $http_code, Response: $response");
}
}
// Обновляем статус проекта если нужно
$stmt = $mysqli->prepare("
SELECT projectstatus
FROM vtiger_project
WHERE projectid = ?
");
$stmt->bind_param('i', $project_id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$current_status = $row['projectstatus'] ?? '';
$stmt->close();
if ($current_status === 'представительство в суде 1й инстанции') {
$new_status = 'получено определение суда';
$stmt = $mysqli->prepare("
UPDATE vtiger_project
SET projectstatus = ?
WHERE projectid = ?
");
$stmt->bind_param('si', $new_status, $project_id);
$stmt->execute();
$stmt->close();
}
// Логируем действие
$log_file = __DIR__ . '/logs/project_update.log';
$log_dir = dirname($log_file);
if (!is_dir($log_dir)) {
mkdir($log_dir, 0755, true);
}
$log_entry = date('Y-m-d H:i:s') . " - PROJECT_UPDATE_SUCCESS: " . json_encode([
'project_id' => $project_id,
'plaintiff_fio' => $plaintiff_fio,
'case_number' => $case_number,
'uid' => $uid
], JSON_UNESCAPED_UNICODE) . "\n";
file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX);
$mysqli->close();
// Формируем результат
$result = [
'success' => true,
'project_id' => $project_id,
'plaintiff_fio' => $plaintiff_fio,
'case_number' => $case_number,
'uid' => $uid,
'document_id' => $document_id,
'message' => 'Документ успешно добавлен к проекту'
];
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
return 0;
} catch (Exception $e) {
$error_result = [
'success' => false,
'error' => $e->getMessage(),
'timestamp' => date('Y-m-d H:i:s')
];
// Логируем ошибку
$log_file = __DIR__ . '/logs/project_update.log';
$log_dir = dirname($log_file);
if (!is_dir($log_dir)) {
mkdir($log_dir, 0755, true);
}
$log_entry = date('Y-m-d H:i:s') . " - PROJECT_UPDATE_ERROR: " . json_encode($error_result, JSON_UNESCAPED_UNICODE) . "\n";
file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX);
echo json_encode($error_result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
return 1;
}
}
// Запускаем скрипт
if (php_sapi_name() === 'cli') {
exit(updateProject());
}
?>