331 lines
13 KiB
PHP
331 lines
13 KiB
PHP
|
|
<?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());
|
|||
|
|
}
|
|||
|
|
?>
|