Files
crm.clientright.ru/crm_extensions/simple_project_updater.php
Fedor dabcd43a00 Добавлены скрипты для парсинга судебных документов и обновления проектов в CRM
- court_document_parser.py: парсер судебных документов с извлечением ФИО, номера дела, УИД, суда
- court_parser_api.py: API для вызова парсера из n8n
- pdf_court_parser.py: парсер PDF документов с извлечением текста
- simple_project_updater.php: обновление проектов через CRM API
- simple_project_updater_v2.php: обновленная версия с прямыми SQL запросами и S3Client
- update_project_from_document.php: альтернативный скрипт обновления
- test_input.json: тестовые данные для парсера
- README файлы с документацией для всех скриптов

Скрипты поддерживают:
- Поиск проектов по ФИО, номеру дела, УИД, названию суда
- Создание документов в CRM с загрузкой в S3
- Привязку документов к проектам
- Логирование всех операций
- Работу с n8n через SSH команды
2025-09-30 19:54:37 +03:00

331 lines
13 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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());
}
?>