- 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 команды
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());
|
||
}
|
||
?>
|