diff --git a/.cursor/mcp.json b/.cursor/mcp.json index 5cbc5743..5d186c8d 100644 --- a/.cursor/mcp.json +++ b/.cursor/mcp.json @@ -1,10 +1,65 @@ { "mcpServers": { - "context7": { - "url": "https://mcp.context7.com/mcp", - "headers": { - "CONTEXT7_API_KEY": "ctx7sk-541e7992-c38f-442f-8902-ae99645f2477" - } - } - } - } \ No newline at end of file + "context7": { + "url": "https://mcp.context7.com/mcp", + "headers": { + "CONTEXT7_API_KEY": "ctx7sk-541e7992-c38f-442f-8902-ae99645f2477" + } + }, + "shadcn": { + "command": "/usr/bin/docker", + "args": [ + "run", + "-i", + "--rm", + "--init", + "-v", "/var/www/fastuser/data/www/crm.clientright.ru:/workspace", + "-w", "/workspace", + "node:20-alpine", + "npx", + "-y", + "shadcn@latest", + "mcp" + ], + "env": {} + }, + "antd-components": { + "command": "/usr/bin/docker", + "args": [ + "run", + "-i", + "--rm", + "--init", + "-v", "/var/www/fastuser/data/www/crm.clientright.ru:/workspace", + "-w", "/workspace", + "node:20-alpine", + "npx", + "-y", + "@jzone-mcp/antd-components-mcp" + ], + "env": {} + }, + + + + "n8n-mcp": { + "command": "docker", + "args": [ + "run", + "-i", + "--rm", + "--init", + "-e", "MCP_MODE=stdio", + "-e", "LOG_LEVEL=error", + "-e", "DISABLE_CONSOLE_OUTPUT=true", + "-e", "N8N_API_URL=https://n8n.clientright.pro/", + "-e", "N8N_API_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI5MzMwYWVjZC1hYjExLTQxODEtOWIyYy1iMDZhZWEzMTNmNzQiLCJpc3MiOiJuOG4iLCJhdWQiOiJwdWJsaWMtYXBpIiwiaWF0IjoxNzUzNjg3NDM4fQ.XJjyYXXOoO4eUGAfkSVRMJzLYvi25hczsp2F7j4UV7Y", + "ghcr.io/czlonkowski/n8n-mcp:latest" + ] + }, + "memory": { + "url": "http://185.197.75.249:9000/sse" + } + + } +} \ No newline at end of file diff --git a/LOGS/AI_DOCUMENT_GENERATION_SESSION.md b/LOGS/AI_DOCUMENT_GENERATION_SESSION.md index 01b4e64e..ff5eb8aa 100644 --- a/LOGS/AI_DOCUMENT_GENERATION_SESSION.md +++ b/LOGS/AI_DOCUMENT_GENERATION_SESSION.md @@ -211,3 +211,9 @@ composer require phpoffice/phpword Все компоненты реализованы, протестированы и готовы к использованию в n8n workflow. + + + + + + diff --git a/crm_extensions/file_storage/docs/AI_DOCUMENT_GENERATION_FLOW.md b/crm_extensions/file_storage/docs/AI_DOCUMENT_GENERATION_FLOW.md index 56fc202f..80b58cd5 100644 --- a/crm_extensions/file_storage/docs/AI_DOCUMENT_GENERATION_FLOW.md +++ b/crm_extensions/file_storage/docs/AI_DOCUMENT_GENERATION_FLOW.md @@ -432,3 +432,9 @@ PUBLISH ai:response:task-xxx {"success": true, "documentUrl": "..."} - Ошибки изолированы - Легко отлаживать + + + + + + diff --git a/crm_extensions/file_storage/docs/AI_DOCUMENT_TOOL.md b/crm_extensions/file_storage/docs/AI_DOCUMENT_TOOL.md index 49d35e1d..50219006 100644 --- a/crm_extensions/file_storage/docs/AI_DOCUMENT_TOOL.md +++ b/crm_extensions/file_storage/docs/AI_DOCUMENT_TOOL.md @@ -197,3 +197,9 @@ https://crm.clientright.ru/crm_extensions/file_storage/api/create_document_with_ - Документ сразу доступен для редактирования в OnlyOffice - Путь формируется автоматически: `{module}/{recordName}_{recordId}/{fileName}.{ext}` + + + + + + diff --git a/crm_extensions/file_storage/docs/MARKDOWN_FORMATTING.md b/crm_extensions/file_storage/docs/MARKDOWN_FORMATTING.md index df17ae35..23e29a09 100644 --- a/crm_extensions/file_storage/docs/MARKDOWN_FORMATTING.md +++ b/crm_extensions/file_storage/docs/MARKDOWN_FORMATTING.md @@ -244,3 +244,9 @@ _курсив_ 3. **Гибкость** — можно комбинировать элементы 4. **Автоматическое форматирование** — документ получается красивым без ручной правки + + + + + + diff --git a/crm_extensions/file_storage/docs/N8N_HTTP_REQUEST_CURL.md b/crm_extensions/file_storage/docs/N8N_HTTP_REQUEST_CURL.md index 1bc5b330..33c4e329 100644 --- a/crm_extensions/file_storage/docs/N8N_HTTP_REQUEST_CURL.md +++ b/crm_extensions/file_storage/docs/N8N_HTTP_REQUEST_CURL.md @@ -152,3 +152,9 @@ curl -X POST "https://crm.clientright.ru/crm_extensions/file_storage/api/create_ }' ``` + + + + + + diff --git a/crm_extensions/file_storage/docs/NEXTCLOUD_TEMPLATES.md b/crm_extensions/file_storage/docs/NEXTCLOUD_TEMPLATES.md index ca5ef324..59407571 100644 --- a/crm_extensions/file_storage/docs/NEXTCLOUD_TEMPLATES.md +++ b/crm_extensions/file_storage/docs/NEXTCLOUD_TEMPLATES.md @@ -211,3 +211,9 @@ curl -u admin:office "https://office.clientright.ru:8443/remote.php/dav/files/ad - [Nextcloud WebDAV API](https://docs.nextcloud.com/server/latest/user_manual/files/webdav.html) - [OnlyOffice Integration](https://api.onlyoffice.com/) + + + + + + diff --git a/crm_extensions/file_storage/docs/NEXTCLOUD_TEMPLATES_API_ANALYSIS.md b/crm_extensions/file_storage/docs/NEXTCLOUD_TEMPLATES_API_ANALYSIS.md index 45a7fcbb..57f3529b 100644 --- a/crm_extensions/file_storage/docs/NEXTCLOUD_TEMPLATES_API_ANALYSIS.md +++ b/crm_extensions/file_storage/docs/NEXTCLOUD_TEMPLATES_API_ANALYSIS.md @@ -246,3 +246,9 @@ echo json_encode(['success' => true, 'templates' => $templates]); 3. **Решение:** Использовать WebDAV PROPFIND для получения списка файлов из папки Templates 4. **Статус:** Наш текущий подход (WebDAV + PHPWord) является правильным и оптимальным решением + + + + + + diff --git a/crm_extensions/file_storage/docs/ONLYOFFICE_TEMPLATES_ANALYSIS.md b/crm_extensions/file_storage/docs/ONLYOFFICE_TEMPLATES_ANALYSIS.md index cb39d0f7..ccb95617 100644 --- a/crm_extensions/file_storage/docs/ONLYOFFICE_TEMPLATES_ANALYSIS.md +++ b/crm_extensions/file_storage/docs/ONLYOFFICE_TEMPLATES_ANALYSIS.md @@ -133,3 +133,9 @@ curl "https://office.clientright.ru:8443/index.php/apps/onlyoffice/ajax/template 3. Протестировать получение списка через `list_templates.php` 4. Использовать шаблоны через `create_from_template.php` + + + + + + diff --git a/get_chat_history.php b/get_chat_history.php index 7c75a4c9..b325e506 100644 --- a/get_chat_history.php +++ b/get_chat_history.php @@ -115,10 +115,34 @@ try { continue; // Пропускаем пустые сообщения } + // Формируем timestamp в ISO формате для JavaScript + $timestamp = null; + if (isset($item['created_at']) && !empty($item['created_at'])) { + $createdAt = $item['created_at']; + // Если created_at уже в ISO формате (содержит 'T'), используем как есть + if (strpos($createdAt, 'T') !== false) { + // Уже в ISO формате (например, "2025-11-14T06:21:55.207Z"), используем как есть + $timestamp = $createdAt; + } else { + // Если в другом формате, преобразуем в ISO + $parsedTime = strtotime($createdAt); + if ($parsedTime !== false) { + $timestamp = date('c', $parsedTime); // ISO 8601 формат + } else { + // Если не удалось распарсить, используем текущее время + error_log("Chat History: Failed to parse created_at: {$createdAt}, using current time"); + $timestamp = date('c'); + } + } + } else { + // Если нет created_at, используем текущее время в ISO формате + $timestamp = date('c'); // ISO 8601 формат + } + $message = [ 'type' => isset($item['sender_type']) && $item['sender_type'] === 'user' ? 'user' : 'assistant', 'message' => $item['content'] ?? '', - 'timestamp' => isset($item['created_at']) ? date('H:i:s', strtotime($item['created_at'])) : date('H:i:s'), + 'timestamp' => $timestamp, 'id' => $item['id'] ?? '', 'dialog_id' => $item['dialog_id'] ?? '' ]; @@ -131,7 +155,7 @@ try { $history[] = [ 'type' => 'assistant', 'message' => "Привет! Я ваш AI ассистент. Работаем с '{$projectName}'. Чем могу помочь?", - 'timestamp' => date('H:i:s'), + 'timestamp' => date('c'), // ISO 8601 формат 'id' => 'welcome-' . time(), 'dialog_id' => 'new-dialog' ]; diff --git a/include/Webservices/CreateClientProject.php b/include/Webservices/CreateClientProject.php new file mode 100644 index 00000000..e3cbcb1e --- /dev/null +++ b/include/Webservices/CreateClientProject.php @@ -0,0 +1,175 @@ +getMessage() . PHP_EOL, FILE_APPEND); + } + } + + $isNew = false; + $output = null; + + file_put_contents('logs/CreateClientProject.log', $logPrefix . "🔎 Ищем проект по claim_id={$claim_id}" . PHP_EOL, FILE_APPEND); + + // Ищем проект по claim_id (cf_2620) + $query = "SELECT p.projectid + FROM vtiger_project p + INNER JOIN vtiger_projectcf pcf ON p.projectid = pcf.projectid + INNER JOIN vtiger_crmentity e ON e.crmid = p.projectid + WHERE e.deleted = 0 + AND pcf.cf_2620 = ? + LIMIT 1"; + $result = $adb->pquery($query, array($claim_id)); + + if (!$result) { + throw new Exception("SQL error while searching project"); + } + + $projectName = ''; + + if ($adb->num_rows($result) > 0) { + $output = $adb->query_result($result, 0, 'projectid'); + $isNew = false; + file_put_contents('logs/CreateClientProject.log', $logPrefix . "✅ Проект найден по claim_id {$claim_id}: {$output}" . PHP_EOL, FILE_APPEND); + } else { + // Генерируем имя проекта + $lastname = trim($lastname); + if (!empty($lastname)) { + $projectName = $lastname . '_КлиентПрав'; + } elseif (!empty($phone)) { + $projectName = $phone . '_КлиентПрав'; + } else { + $projectName = 'КлиентПрав_' . $claim_id; + } + + $params = array( + 'projectname' => $projectName, + 'projectstatus' => 'Черновик', + 'projecttype' => 'претензионно-исковая работа', + 'linktoaccountscontacts' => $contactIdWithPrefix, + 'cf_1994' => '11x62345', // Заявитель (МОО КлиентПрав) + 'cf_2620' => $claim_id, + 'assigned_user_id' => vtws_getWebserviceEntityId('Users', $current_user->id) + ); + + if (!empty($session_id)) { + $params['cf_2618'] = $session_id; + } + if (!empty($description)) { + $params['description'] = $description; + } + if (!empty($ai_response)) { + $params['cf_2622'] = $ai_response; + } + + file_put_contents('logs/CreateClientProject.log', $logPrefix . 'Массив для создания: ' . json_encode($params) . PHP_EOL, FILE_APPEND); + + try { + $project = vtws_create('Project', $params, $current_user); + $output = substr($project['id'], 3); + $isNew = true; + file_put_contents('logs/CreateClientProject.log', $logPrefix . "✅ Создан новый проект: {$output}" . PHP_EOL, FILE_APPEND); + } catch (WebServiceException $ex) { + file_put_contents('logs/CreateClientProject.log', $logPrefix . '❌ Ошибка создания: ' . $ex->getMessage() . PHP_EOL, FILE_APPEND); + throw $ex; + } + } + + // Получаем название проекта (если проект был найден, а не создан) + if (empty($projectName) && !empty($output)) { + try { + $query = "SELECT projectname FROM vtiger_project WHERE projectid = ? LIMIT 1"; + $result = $adb->pquery($query, array($output)); + if ($adb->num_rows($result) > 0) { + $projectName = $adb->query_result($result, 0, 'projectname'); + file_put_contents('logs/CreateClientProject.log', $logPrefix . "📝 Получено название проекта: {$projectName}" . PHP_EOL, FILE_APPEND); + } + } catch (Exception $e) { + file_put_contents('logs/CreateClientProject.log', $logPrefix . '⚠️ Не удалось получить название проекта: ' . $e->getMessage() . PHP_EOL, FILE_APPEND); + } + } + + $result = array( + 'project_id' => $output, + 'project_name' => $projectName, + 'is_new' => $isNew + ); + + file_put_contents('logs/CreateClientProject.log', $logPrefix . 'Return: ' . json_encode($result) . PHP_EOL, FILE_APPEND); + ob_end_clean(); + + return $result; + + } catch (Exception $ex) { + file_put_contents('logs/CreateClientProject.log', $logPrefix . '❌ Exception: ' . $ex->getMessage() . PHP_EOL, FILE_APPEND); + ob_end_clean(); + throw $ex; + } +} + + diff --git a/include/Webservices/CreateWebClaim.php b/include/Webservices/CreateWebClaim.php index 0e62cdc8..444404e2 100644 --- a/include/Webservices/CreateWebClaim.php +++ b/include/Webservices/CreateWebClaim.php @@ -65,6 +65,16 @@ function vtws_createwebclaim($title, $contact_id, $project_id, $event_type, $des global $adb, $current_user; + // Нормализуем ID контакта и проекта (можно передавать как "12x123" или "123") + $contactIdNumeric = preg_replace('/[^0-9]/', '', $contact_id); + $projectIdNumeric = preg_replace('/[^0-9]/', '', $project_id); + + $contactWsId = '12x' . $contactIdNumeric; + $projectWsId = '33x' . $projectIdNumeric; + + $logstring = date('Y-m-d H:i:s').' Нормализовали ID: contact='.$contactIdNumeric.' (raw='.$contact_id.'), project='.$projectIdNumeric.' (raw='.$project_id.')'.PHP_EOL; + file_put_contents('logs/CreateWebClaim.log', $logstring, FILE_APPEND); + // Маппинг типов событий на русские названия для категории $eventTypeMap = array( 'delay_flight' => 'Задержка рейса', @@ -108,8 +118,8 @@ function vtws_createwebclaim($title, $contact_id, $project_id, $event_type, $des 'parent_id' => '11x67458', // Заявитель - контрагент 'ticketcategories' => $ticketCategory, 'ticketstatus' => 'рассмотрение', - 'contact_id' => '12x'.$contact_id, - 'cf_2066' => '33x'.$project_id, // Связь с проектом + 'contact_id' => $contactWsId, + 'cf_2066' => $projectWsId, // Связь с проектом 'ticketpriorities' => 'High', 'assigned_user_id' => vtws_getWebserviceEntityId('Users', $current_user->id), 'description' => $fullDescription @@ -126,6 +136,32 @@ function vtws_createwebclaim($title, $contact_id, $project_id, $event_type, $des $logstring = date('Y-m-d H:i:s').' ✅ Создана Заявка id='.$ticketId.' ticket_no='.$ticketNumber.PHP_EOL; file_put_contents('logs/CreateWebClaim.log', $logstring, FILE_APPEND); + // 🚧 Создаём двустороннюю связь между Проектом и Заявкой + try { + $relationCheck = $adb->pquery( + "SELECT 1 FROM vtiger_crmentityrel + WHERE (crmid = ? AND relcrmid = ?) + OR (crmid = ? AND relcrmid = ?) + LIMIT 1", + array($projectIdNumeric, $ticketId, $ticketId, $projectIdNumeric) + ); + + if (!$relationCheck || $adb->num_rows($relationCheck) === 0) { + $adb->pquery( + "INSERT INTO vtiger_crmentityrel (crmid, module, relcrmid, relmodule) VALUES (?, ?, ?, ?)", + array($projectIdNumeric, 'Project', $ticketId, 'HelpDesk') + ); + $logstring = date('Y-m-d H:i:s').' 🔗 Добавлена связь Project('.$projectIdNumeric.') ⇄ HelpDesk('.$ticketId.')'.PHP_EOL; + file_put_contents('logs/CreateWebClaim.log', $logstring, FILE_APPEND); + } else { + $logstring = date('Y-m-d H:i:s').' 🔗 Связь Project('.$projectIdNumeric.') ⇄ HelpDesk('.$ticketId.') уже существует'.PHP_EOL; + file_put_contents('logs/CreateWebClaim.log', $logstring, FILE_APPEND); + } + } catch (Exception $relEx) { + $logstring = date('Y-m-d H:i:s').' ⚠️ Ошибка связывания Project('.$projectIdNumeric.') ⇄ HelpDesk('.$ticketId.'): '.$relEx->getMessage().PHP_EOL; + file_put_contents('logs/CreateWebClaim.log', $logstring, FILE_APPEND); + } + // Возвращаем массив (vTiger сам сделает json_encode) $output = array( 'ticket_id' => $ticketId, diff --git a/include/Webservices/CreateWebProject.php b/include/Webservices/CreateWebProject.php index bdd8df20..e44a0c02 100644 --- a/include/Webservices/CreateWebProject.php +++ b/include/Webservices/CreateWebProject.php @@ -52,27 +52,28 @@ function vtws_createwebproject($policy_number, $contact_id, $period_start = '', // Валидация: убираем пробелы из номера полиса $policy_number = trim($policy_number); - $logstring = date('Y-m-d H:i:s').' Ищем проект по policy_number='.$policy_number.' И contact_id='.$contact_id.PHP_EOL; + // Нормализуем contact_id: допускаем как "12x12345", так и "12345" + $contactIdNumeric = preg_replace('/[^0-9]/', '', $contact_id); + $contactIdWithPrefix = '12x' . $contactIdNumeric; + + $logstring = date('Y-m-d H:i:s').' Ищем проект по policy_number='.$policy_number.' И contact_id='.$contactIdNumeric.' (raw='.$contact_id.')'.PHP_EOL; file_put_contents('logs/CreateWebProject.log', $logstring, FILE_APPEND); global $adb, $current_user; $isNew = false; // Флаг: создан ли проект сейчас - // Проверяем существование проекта по номеру полиса И привязке к контакту - // (т.к. по одному полису может быть несколько застрахованных лиц) + // Проверяем существование проекта по номеру полиса И прямой привязке к контакту + // (без зависимости от заполнения vtiger_crmentityrel) $query = "SELECT p.projectid FROM vtiger_project p INNER JOIN vtiger_projectcf pcf ON p.projectid = pcf.projectid - LEFT JOIN vtiger_crmentity e ON e.crmid = p.projectid - LEFT JOIN vtiger_crmentityrel rel ON - (rel.crmid = p.projectid AND rel.relcrmid = ?) - OR (rel.relcrmid = p.projectid AND rel.crmid = ?) + INNER JOIN vtiger_crmentity e ON e.crmid = p.projectid WHERE e.deleted = 0 AND pcf.cf_1885 = ? - AND rel.crmid IS NOT NULL + AND p.linktoaccountscontacts = ? LIMIT 1"; - $result = $adb->pquery($query, array($contact_id, $contact_id, $policy_number)); + $result = $adb->pquery($query, array($policy_number, $contactIdNumeric)); if ($adb->num_rows($result) > 0) { // Проект существует - ПРОСТО ВОЗВРАЩАЕМ ID (НЕ обновляем!) @@ -90,7 +91,7 @@ function vtws_createwebproject($policy_number, $contact_id, $period_start = '', 'projectname' => $projectname, 'projectstatus' => 'модерация', 'projecttype' => 'ерв урегулирование', - 'linktoaccountscontacts' => '12x'.$contact_id, // Привязка к контакту + 'linktoaccountscontacts' => $contactIdWithPrefix, // Привязка к контакту 'cf_1994' => '11x67458', // Заявитель (контрагент record=67458) 'cf_1885' => $policy_number, // Номер полиса 'assigned_user_id' => vtws_getWebserviceEntityId('Users', $current_user->id) diff --git a/languages/ar_ae/custom/Project.php b/languages/ar_ae/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/ar_ae/custom/Project.php +++ b/languages/ar_ae/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/de_de/custom/Project.php b/languages/de_de/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/de_de/custom/Project.php +++ b/languages/de_de/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/en_gb/custom/Project.php b/languages/en_gb/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/en_gb/custom/Project.php +++ b/languages/en_gb/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/en_us/custom/Project.php b/languages/en_us/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/en_us/custom/Project.php +++ b/languages/en_us/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/es_es/custom/Project.php b/languages/es_es/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/es_es/custom/Project.php +++ b/languages/es_es/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/es_mx/custom/Project.php b/languages/es_mx/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/es_mx/custom/Project.php +++ b/languages/es_mx/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/fr_fr/custom/Project.php b/languages/fr_fr/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/fr_fr/custom/Project.php +++ b/languages/fr_fr/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/hu_hu/custom/Project.php b/languages/hu_hu/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/hu_hu/custom/Project.php +++ b/languages/hu_hu/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/it_it/custom/Project.php b/languages/it_it/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/it_it/custom/Project.php +++ b/languages/it_it/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/nl_nl/custom/Project.php b/languages/nl_nl/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/nl_nl/custom/Project.php +++ b/languages/nl_nl/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/pl_pl/custom/Project.php b/languages/pl_pl/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/pl_pl/custom/Project.php +++ b/languages/pl_pl/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/pt_br/custom/Project.php b/languages/pt_br/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/pt_br/custom/Project.php +++ b/languages/pt_br/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/ro_ro/custom/Project.php b/languages/ro_ro/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/ro_ro/custom/Project.php +++ b/languages/ro_ro/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/ru_ru/custom/Project.php b/languages/ru_ru/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/ru_ru/custom/Project.php +++ b/languages/ru_ru/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/sv_se/custom/Project.php b/languages/sv_se/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/sv_se/custom/Project.php +++ b/languages/sv_se/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/languages/tr_tr/custom/Project.php b/languages/tr_tr/custom/Project.php index 4aa6d554..1a38ba96 100644 --- a/languages/tr_tr/custom/Project.php +++ b/languages/tr_tr/custom/Project.php @@ -53,4 +53,5 @@ $languageStrings = array( 'заявление на лист' => 'заявление на лист', 'урегулирование' => 'урегулирование', 'заключение мирового соглашения' => 'заключение мирового соглашения', +'Черновик' => 'Черновик', ); \ No newline at end of file diff --git a/layouts/v7/resources/css/ai-drawer.css b/layouts/v7/resources/css/ai-drawer.css index 533666e9..2c706df4 100644 --- a/layouts/v7/resources/css/ai-drawer.css +++ b/layouts/v7/resources/css/ai-drawer.css @@ -1,20 +1,24 @@ /* AI Drawer - основные стили */ .ai-drawer { position: fixed; - right: -400px; /* Начально скрыт */ + right: 0; /* Всегда прижат к правому краю */ top: 0; width: 400px; min-width: 300px; /* Минимальная ширина */ max-width: 50vw; /* Максимальная ширина - половина экрана */ height: 100vh; + max-height: 100vh; /* Не превышаем высоту экрана */ background: #ffffff; /* Чистый белый фон */ box-shadow: -2px 0 15px rgba(0,0,0,0.1); - transition: right 0.3s ease; + transform: translateX(100%); /* Начально скрыт - сдвинут вправо на 100% своей ширины */ + transition: transform 0.3s ease; z-index: 999999; display: flex; flex-direction: column; font-size: 14px; /* Базовый размер шрифта */ border-left: 1px solid #e9ecef; + overflow: hidden; /* Предотвращаем выход элементов за пределы */ + box-sizing: border-box; /* Учитываем padding и border в ширине */ } /* Полоска для изменения ширины */ @@ -44,13 +48,18 @@ user-select: none; } +/* Убираем transition при изменении размера, чтобы не было задержек */ +.ai-drawer.resizing.open { + transform: translateX(0) !important; +} + .ai-drawer.resizing .ai-drawer-resize-handle { background: #007bff; width: 4px; } .ai-drawer.open { - right: 0; + transform: translateX(0); /* Показываем - сдвигаем на место */ } /* Скрываем кнопку AI когда drawer открыт */ @@ -91,6 +100,9 @@ body.ai-drawer-open .ai-drawer-toggle { align-items: center; font-weight: 600; border-bottom: 1px solid #0056b3; + flex-shrink: 0; /* Не сжимается при изменении размера */ + min-height: 50px; /* Минимальная высота для кнопки закрытия */ + box-sizing: border-box; } .ai-drawer-close { @@ -436,12 +448,42 @@ body.ai-drawer-open .ai-drawer-toggle { .ai-message-content p { margin: 0 0 5px 0; + word-wrap: break-word; + word-break: break-word; } .ai-message-content p:last-child { margin-bottom: 0; } +/* Стили для ссылок в сообщениях */ +.ai-message-link { + color: #007bff; + text-decoration: underline; + cursor: pointer; + word-break: break-word; + display: inline-block; + margin: 2px 0; + padding: 2px 4px; + border-radius: 3px; + transition: all 0.2s ease; +} + +.ai-message-link:hover { + color: #0056b3; + text-decoration: none; + background-color: #e7f3ff; + padding: 2px 6px; +} + +.ai-message-link:visited { + color: #6f42c1; +} + +.ai-message-link:active { + color: #004085; +} + .ai-message-time { font-size: 11px; color: #6c757d; /* Серый цвет для времени */ @@ -456,6 +498,8 @@ body.ai-drawer-open .ai-drawer-toggle { border-top: 1px solid #dee2e6; display: flex; gap: 10px; + flex-shrink: 0; /* Не сжимается при изменении размера */ + box-sizing: border-box; align-items: center; } @@ -510,7 +554,8 @@ body.ai-drawer-open .ai-drawer-toggle { @media (max-width: 768px) { .ai-drawer { width: 100%; - right: -100%; + right: 0; + transform: translateX(100%); /* Начально скрыт на мобильных */ height: 100vh; height: 100dvh; /* Динамическая высота viewport для мобильных */ display: flex; @@ -731,7 +776,8 @@ body.ai-drawer-open .ai-drawer-toggle { width: 400px; min-width: 300px; max-width: 50vw; - right: -400px; + right: 0; + transform: translateX(100%); /* Начально скрыт на планшетах */ height: 100vh; display: flex; flex-direction: column; diff --git a/layouts/v7/resources/js/ai-drawer-simple.js b/layouts/v7/resources/js/ai-drawer-simple.js index 612f9bf7..cb53cfe6 100644 --- a/layouts/v7/resources/js/ai-drawer-simple.js +++ b/layouts/v7/resources/js/ai-drawer-simple.js @@ -48,7 +48,11 @@ class AIDrawer { '
' + '' + '' + '' + @@ -128,7 +132,7 @@ class AIDrawer { // Обработчик изменения размера окна - ограничиваем ширину если нужно window.addEventListener('resize', () => { - if (this.drawerWidth > window.innerWidth / 2) { + if (this.isOpen && this.drawerWidth > window.innerWidth / 2) { const maxWidth = window.innerWidth / 2; this.setDrawerWidth(maxWidth); } @@ -144,8 +148,18 @@ class AIDrawer { const savedWidth = localStorage.getItem('ai-drawer-width'); if (savedWidth) { const width = parseInt(savedWidth, 10); - if (width >= 300 && width <= window.innerWidth / 2) { + const maxWidth = window.innerWidth / 2; + // Проверяем что ширина в допустимых пределах для текущего экрана + if (width >= 300 && width <= maxWidth) { this.setDrawerWidth(width); + } else if (width > maxWidth) { + // Если сохраненная ширина больше максимума - ограничиваем + console.log('AI Drawer: Saved width', width, 'exceeds max', maxWidth, ', adjusting'); + this.setDrawerWidth(maxWidth); + } else { + // Если меньше минимума - устанавливаем минимум + console.log('AI Drawer: Saved width', width, 'is less than minimum, setting to 300'); + this.setDrawerWidth(300); } } @@ -220,6 +234,23 @@ class AIDrawer { open() { console.log('AI Drawer: Opening drawer'); if (this.drawer) { + // Проверяем и корректируем ширину перед открытием + const maxWidth = window.innerWidth / 2; + if (this.drawerWidth > maxWidth) { + console.log('AI Drawer: Adjusting width from', this.drawerWidth, 'to', maxWidth); + this.setDrawerWidth(maxWidth); + } else if (this.drawerWidth < 300) { + console.log('AI Drawer: Adjusting width from', this.drawerWidth, 'to 300'); + this.setDrawerWidth(300); + } + + // Убеждаемся что ширина применена к drawer + this.drawer.style.width = this.drawerWidth + 'px'; + + // Убеждаемся что drawer правильно позиционирован перед открытием + this.drawer.style.right = '0'; + this.drawer.style.transform = 'translateX(0)'; + this.drawer.classList.add('open'); } @@ -234,6 +265,33 @@ class AIDrawer { mainContainer.setAttribute('data-drawer-width', this.drawerWidth); } + // Прокручиваем вниз к последнему сообщению при открытии + const scrollToBottomOnOpen = () => { + const drawerContent = this.drawer?.querySelector('.ai-drawer-content'); + const chatMessages = this.drawer?.querySelector('.ai-chat-messages'); + + if (drawerContent) { + const scroll = () => { + drawerContent.scrollTop = drawerContent.scrollHeight; + console.log('AI Drawer: Scrolled on open, scrollTop:', drawerContent.scrollTop, 'scrollHeight:', drawerContent.scrollHeight); + }; + + // Прокручиваем последнее сообщение в видимую область + if (chatMessages && chatMessages.lastElementChild) { + chatMessages.lastElementChild.scrollIntoView({ behavior: 'smooth', block: 'end' }); + } + + requestAnimationFrame(() => { + scroll(); + requestAnimationFrame(scroll); + }); + } + }; + + // Прокручиваем после анимации открытия + setTimeout(scrollToBottomOnOpen, 300); + setTimeout(scrollToBottomOnOpen, 600); + // История уже загружена при инициализации страницы // Не нужно дополнительных запросов при открытии } @@ -242,6 +300,10 @@ class AIDrawer { console.log('AI Drawer: Closing drawer'); if (this.drawer) { this.drawer.classList.remove('open'); + // Убеждаемся что drawer скрыт через transform + if (!this.drawer.classList.contains('open')) { + this.drawer.style.transform = 'translateX(100%)'; + } } document.body.classList.remove('ai-drawer-open'); @@ -295,6 +357,142 @@ class AIDrawer { } } + // Функция для определения читаемого текста ссылки на основе URL + getLinkText(url) { + const urlLower = url.toLowerCase(); + const maxLength = 60; // Максимальная длина ссылки до замены + + // Если ссылка короткая, показываем её полностью + if (url.length <= maxLength) { + return url; + } + + // Анализируем URL и определяем тип действия + if (urlLower.includes('download') || urlLower.includes('file') || urlLower.includes('скачать')) { + return '📥 Скачать документ'; + } + + if (urlLower.includes('edit') || urlLower.includes('редактир') || urlLower.includes('onlyoffice')) { + return '✏️ Открыть для редактирования'; + } + + if (urlLower.includes('view') || urlLower.includes('просмотр') || urlLower.includes('preview')) { + return '👁️ Открыть для просмотра'; + } + + if (urlLower.includes('document') || urlLower.includes('документ') || urlLower.includes('.docx') || urlLower.includes('.pdf')) { + return '📄 Открыть документ'; + } + + if (urlLower.includes('create') || urlLower.includes('создать')) { + return '➕ Создать документ'; + } + + // Общие варианты для длинных ссылок + const linkTexts = [ + '🔗 Открыть ссылку', + '👉 Смотреть здесь', + '📋 Подробнее', + '🔍 Перейти к документу', + '📎 Открыть' + ]; + + // Выбираем случайный вариант для разнообразия + return linkTexts[Math.floor(Math.random() * linkTexts.length)]; + } + + // Функция для преобразования URL в кликабельные ссылки + convertUrlsToLinks(text) { + if (!text) return ''; + + let result = text; + + // ШАГ 1: Обрабатываем Markdown ссылки [текст](url) + const markdownLinkRegex = /\[([^\]]+)\]\(([^)]+)\)/g; + result = result.replace(markdownLinkRegex, (match, linkText, url) => { + // Проверяем, что это валидный URL + if (url.match(/^https?:\/\//i)) { + return `${linkText}`; + } + return match; // Если не URL, оставляем как есть + }); + + // ШАГ 2: Временно заменяем уже существующие HTML-ссылки на плейсхолдеры + const htmlLinks = []; + const htmlLinkRegex = /]*href\s*=\s*["']([^"']+)["'][^>]*>([^<]*)<\/a>/gi; + result = result.replace(htmlLinkRegex, (match, href, linkText) => { + const placeholder = `__HTML_LINK_${htmlLinks.length}__`; + htmlLinks.push({ href, linkText, match }); + return placeholder; + }); + + // ШАГ 3: Экранируем оставшийся HTML для безопасности + const escaped = result + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + + // ШАГ 4: Восстанавливаем HTML-ссылки (плейсхолдеры не экранированы, т.к. не содержат < >) + let finalResult = escaped; + htmlLinks.forEach((link, index) => { + const placeholder = `__HTML_LINK_${index}__`; + // Используем оригинальную ссылку, но добавляем класс если его нет + let htmlLink = link.match; + if (!htmlLink.includes('class=')) { + htmlLink = htmlLink.replace('"{}|\\^`\[\]]+)/gi; + let urlMatches = []; + let match; + + // Сначала находим все URL и проверяем их контекст + while ((match = urlRegex.exec(finalResult)) !== null) { + const url = match[0]; + const offset = match.index; + const beforeMatch = finalResult.substring(0, offset); + + // Проверяем, нет ли открывающего тега '); + + // Если есть открывающий тег lastCloseTag) { + continue; // Пропускаем, это уже часть ссылки + } + + // Проверяем, не является ли это частью href атрибута + if (beforeMatch.lastIndexOf('href=') > lastCloseTag) { + continue; // Пропускаем, это часть href + } + + urlMatches.push({ url, offset }); + } + + // Заменяем URL в обратном порядке (чтобы не сбить индексы) + for (let i = urlMatches.length - 1; i >= 0; i--) { + const { url, offset } = urlMatches[i]; + const linkText = this.getLinkText(url); + const linkHtml = `${linkText}`; + finalResult = finalResult.substring(0, offset) + linkHtml + finalResult.substring(offset + url.length); + } + + return finalResult; + } + addMessage(text, isUser = false, customTime = null) { console.log('AI Drawer: addMessage called with:', {text: text.substring(0, 50), isUser, customTime}); @@ -331,17 +529,69 @@ class AIDrawer { contentDiv.className = 'ai-message-content'; const textDiv = document.createElement('p'); - textDiv.textContent = text; + // Преобразуем URL в кликабельные ссылки + textDiv.innerHTML = this.convertUrlsToLinks(text); contentDiv.appendChild(textDiv); const timeDiv = document.createElement('div'); timeDiv.className = 'ai-message-time'; if (customTime) { // Если передано время из истории, используем его - const historyTime = new Date(customTime); - timeDiv.textContent = historyTime.toLocaleTimeString(); + try { + // Логируем для отладки + console.log('AI Drawer: Parsing timestamp:', customTime); + const historyTime = new Date(customTime); + // Проверяем что дата валидна + if (isNaN(historyTime.getTime())) { + // Если дата невалидна, пытаемся распарсить как строку времени (старый формат) + console.warn('AI Drawer: Invalid timestamp format:', customTime, 'Parsed as:', historyTime); + timeDiv.textContent = customTime; // Показываем как есть + } else { + // Определяем, нужно ли показывать дату + const now = new Date(); + const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); + const messageDate = new Date(historyTime.getFullYear(), historyTime.getMonth(), historyTime.getDate()); + const isToday = messageDate.getTime() === today.getTime(); + + let formattedTime; + if (isToday) { + // Если сообщение сегодня - показываем только время + formattedTime = historyTime.toLocaleTimeString('ru-RU', { + hour: '2-digit', + minute: '2-digit', + hour12: false + }); + } else { + // Если сообщение не сегодня - показываем дату и время + const dateStr = historyTime.toLocaleDateString('ru-RU', { + day: '2-digit', + month: '2-digit' + }); + const timeStr = historyTime.toLocaleTimeString('ru-RU', { + hour: '2-digit', + minute: '2-digit', + hour12: false + }); + formattedTime = `${dateStr} ${timeStr}`; + } + + console.log('AI Drawer: Successfully formatted timestamp:', customTime, '->', formattedTime); + timeDiv.textContent = formattedTime; + } + } catch (error) { + console.error('AI Drawer: Error parsing timestamp:', customTime, error); + timeDiv.textContent = customTime || new Date().toLocaleTimeString('ru-RU', { + hour: '2-digit', + minute: '2-digit', + hour12: false // 24-часовой формат + }); + } } else { - timeDiv.textContent = new Date().toLocaleTimeString(); + timeDiv.textContent = new Date().toLocaleTimeString('ru-RU', { + hour: '2-digit', + minute: '2-digit', + hour12: false // 24-часовой формат + }); } contentDiv.appendChild(timeDiv); @@ -388,7 +638,11 @@ class AIDrawer { const timeDiv = document.createElement('div'); timeDiv.className = 'ai-message-time'; - timeDiv.textContent = new Date().toLocaleTimeString(); + timeDiv.textContent = new Date().toLocaleTimeString('ru-RU', { + hour: '2-digit', + minute: '2-digit', + hour12: false // 24-часовой формат + }); contentDiv.appendChild(timeDiv); messageDiv.appendChild(avatarDiv); @@ -404,9 +658,12 @@ class AIDrawer { streamText(element, text, speed = 30) { let index = 0; + let currentText = ''; const interval = setInterval(() => { if (index < text.length) { - element.textContent += text[index]; + currentText += text[index]; + // Преобразуем URL в кликабельные ссылки по мере добавления текста + element.innerHTML = this.convertUrlsToLinks(currentText); index++; const content = this.drawer.querySelector('.ai-drawer-content'); @@ -880,6 +1137,41 @@ class AIDrawer { } }); + // Прокручиваем вниз к последнему сообщению после загрузки истории + const scrollToBottom = () => { + const drawerContent = this.drawer?.querySelector('.ai-drawer-content'); + const chatMessages = this.drawer?.querySelector('.ai-chat-messages'); + + if (drawerContent) { + // Способ 1: Прокручиваем контейнер + const scroll = () => { + drawerContent.scrollTop = drawerContent.scrollHeight; + console.log('AI Drawer: Scrolled container, scrollTop:', drawerContent.scrollTop, 'scrollHeight:', drawerContent.scrollHeight); + }; + + // Способ 2: Прокручиваем последнее сообщение в видимую область + if (chatMessages && chatMessages.lastElementChild) { + chatMessages.lastElementChild.scrollIntoView({ behavior: 'smooth', block: 'end' }); + console.log('AI Drawer: Scrolled last message into view'); + } + + // Используем requestAnimationFrame для более надежной прокрутки + requestAnimationFrame(() => { + scroll(); + requestAnimationFrame(() => { + scroll(); + }); + }); + } else { + console.warn('AI Drawer: Drawer content not found for scrolling'); + } + }; + + // Прокручиваем с несколькими задержками для надежности + setTimeout(scrollToBottom, 100); + setTimeout(scrollToBottom, 300); + setTimeout(scrollToBottom, 600); + console.log('AI Drawer: Chat history restored -', data.history.length, 'messages'); } else { console.log('AI Drawer: No chat history found. Response:', data); diff --git a/s3/ERV/398128/398131_Polis.pdf b/s3/ERV/398128/398131_Polis.pdf new file mode 100644 index 00000000..f314c3d2 Binary files /dev/null and b/s3/ERV/398128/398131_Polis.pdf differ diff --git a/s3/ERV/398128/398133_Dokument_udostoveryayuschiy_lichnost.pdf b/s3/ERV/398128/398133_Dokument_udostoveryayuschiy_lichnost.pdf new file mode 100644 index 00000000..80c75a2a Binary files /dev/null and b/s3/ERV/398128/398133_Dokument_udostoveryayuschiy_lichnost.pdf differ diff --git a/s3/ERV/398128/398135/398136_Podtverzhdayuschie_dokumenty.pdf b/s3/ERV/398128/398135/398136_Podtverzhdayuschie_dokumenty.pdf new file mode 100644 index 00000000..9f540822 Binary files /dev/null and b/s3/ERV/398128/398135/398136_Podtverzhdayuschie_dokumenty.pdf differ diff --git a/s3/ERV/398128/398135/398140__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf b/s3/ERV/398128/398135/398140__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf new file mode 100644 index 00000000..5bde4ed3 Binary files /dev/null and b/s3/ERV/398128/398135/398140__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf differ diff --git a/s3/ERV/398235/398238_Polis.pdf b/s3/ERV/398235/398238_Polis.pdf new file mode 100644 index 00000000..d1e80252 Binary files /dev/null and b/s3/ERV/398235/398238_Polis.pdf differ diff --git a/s3/ERV/398235/398240_Dokument_udostoveryayuschiy_lichnost.pdf b/s3/ERV/398235/398240_Dokument_udostoveryayuschiy_lichnost.pdf new file mode 100644 index 00000000..17e97923 Binary files /dev/null and b/s3/ERV/398235/398240_Dokument_udostoveryayuschiy_lichnost.pdf differ diff --git a/s3/ERV/398235/398242_Dokument_udostoveryayuschiy_lichnost.pdf b/s3/ERV/398235/398242_Dokument_udostoveryayuschiy_lichnost.pdf new file mode 100644 index 00000000..915e37b5 Binary files /dev/null and b/s3/ERV/398235/398242_Dokument_udostoveryayuschiy_lichnost.pdf differ diff --git a/s3/ERV/398235/398244/398245_Podtverzhdayuschie_dokumenty.pdf b/s3/ERV/398235/398244/398245_Podtverzhdayuschie_dokumenty.pdf new file mode 100644 index 00000000..019b4e87 Binary files /dev/null and b/s3/ERV/398235/398244/398245_Podtverzhdayuschie_dokumenty.pdf differ diff --git a/s3/ERV/398235/398244/398249__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf b/s3/ERV/398235/398244/398249__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf new file mode 100644 index 00000000..3aa5d46e Binary files /dev/null and b/s3/ERV/398235/398244/398249__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf differ diff --git a/s3/ERV/398253/398256_Polis.pdf b/s3/ERV/398253/398256_Polis.pdf new file mode 100644 index 00000000..2af54ebe Binary files /dev/null and b/s3/ERV/398253/398256_Polis.pdf differ diff --git a/s3/ERV/398253/398258_Dokument_udostoveryayuschiy_lichnost.pdf b/s3/ERV/398253/398258_Dokument_udostoveryayuschiy_lichnost.pdf new file mode 100644 index 00000000..28e052e7 Binary files /dev/null and b/s3/ERV/398253/398258_Dokument_udostoveryayuschiy_lichnost.pdf differ diff --git a/s3/ERV/398253/398260_Dokument_udostoveryayuschiy_lichnost.pdf b/s3/ERV/398253/398260_Dokument_udostoveryayuschiy_lichnost.pdf new file mode 100644 index 00000000..3e5f7abf Binary files /dev/null and b/s3/ERV/398253/398260_Dokument_udostoveryayuschiy_lichnost.pdf differ diff --git a/s3/ERV/398253/398262/398263_Podtverzhdayuschie_dokumenty.pdf b/s3/ERV/398253/398262/398263_Podtverzhdayuschie_dokumenty.pdf new file mode 100644 index 00000000..850ed560 Binary files /dev/null and b/s3/ERV/398253/398262/398263_Podtverzhdayuschie_dokumenty.pdf differ diff --git a/s3/ERV/398253/398262/398267__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf b/s3/ERV/398253/398262/398267__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf new file mode 100644 index 00000000..804fc571 Binary files /dev/null and b/s3/ERV/398253/398262/398267__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf differ diff --git a/s3/ERV/398275/398278_Polis.pdf b/s3/ERV/398275/398278_Polis.pdf new file mode 100644 index 00000000..91289df0 Binary files /dev/null and b/s3/ERV/398275/398278_Polis.pdf differ diff --git a/s3/ERV/398275/398280_Dokument_udostoveryayuschiy_lichnost.pdf b/s3/ERV/398275/398280_Dokument_udostoveryayuschiy_lichnost.pdf new file mode 100644 index 00000000..4e14935e Binary files /dev/null and b/s3/ERV/398275/398280_Dokument_udostoveryayuschiy_lichnost.pdf differ diff --git a/s3/ERV/398275/398282/398283_Podtverzhdayuschie_dokumenty.pdf b/s3/ERV/398275/398282/398283_Podtverzhdayuschie_dokumenty.pdf new file mode 100644 index 00000000..e0ee0c30 Binary files /dev/null and b/s3/ERV/398275/398282/398283_Podtverzhdayuschie_dokumenty.pdf differ diff --git a/s3/ERV/398275/398282/398287__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf b/s3/ERV/398275/398282/398287__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf new file mode 100644 index 00000000..7a2e5860 Binary files /dev/null and b/s3/ERV/398275/398282/398287__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf differ diff --git a/s3/ERV/398294/398297_Polis.pdf b/s3/ERV/398294/398297_Polis.pdf new file mode 100644 index 00000000..a7f0d01b Binary files /dev/null and b/s3/ERV/398294/398297_Polis.pdf differ diff --git a/s3/ERV/398294/398299_Dokument_udostoveryayuschiy_lichnost.pdf b/s3/ERV/398294/398299_Dokument_udostoveryayuschiy_lichnost.pdf new file mode 100644 index 00000000..1771d481 Binary files /dev/null and b/s3/ERV/398294/398299_Dokument_udostoveryayuschiy_lichnost.pdf differ diff --git a/s3/ERV/398294/398301/398302_Podtverzhdayuschie_dokumenty.pdf b/s3/ERV/398294/398301/398302_Podtverzhdayuschie_dokumenty.pdf new file mode 100644 index 00000000..31982a5d Binary files /dev/null and b/s3/ERV/398294/398301/398302_Podtverzhdayuschie_dokumenty.pdf differ diff --git a/s3/ERV/398294/398301/398306__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf b/s3/ERV/398294/398301/398306__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf new file mode 100644 index 00000000..2943f9a5 Binary files /dev/null and b/s3/ERV/398294/398301/398306__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf differ diff --git a/s3/ERV/398311/398314_Polis.pdf b/s3/ERV/398311/398314_Polis.pdf new file mode 100644 index 00000000..14e74edc Binary files /dev/null and b/s3/ERV/398311/398314_Polis.pdf differ diff --git a/s3/ERV/398311/398316_Dokument_udostoveryayuschiy_lichnost.pdf b/s3/ERV/398311/398316_Dokument_udostoveryayuschiy_lichnost.pdf new file mode 100644 index 00000000..fa76212b Binary files /dev/null and b/s3/ERV/398311/398316_Dokument_udostoveryayuschiy_lichnost.pdf differ diff --git a/s3/ERV/398311/398318/398319_Podtverzhdayuschie_dokumenty.pdf b/s3/ERV/398311/398318/398319_Podtverzhdayuschie_dokumenty.pdf new file mode 100644 index 00000000..d5accdd4 Binary files /dev/null and b/s3/ERV/398311/398318/398319_Podtverzhdayuschie_dokumenty.pdf differ diff --git a/s3/ERV/398311/398318/398323__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf b/s3/ERV/398311/398318/398323__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf new file mode 100644 index 00000000..a542b348 Binary files /dev/null and b/s3/ERV/398311/398318/398323__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf differ diff --git a/s3/ERV/398327/398330_Polis.pdf b/s3/ERV/398327/398330_Polis.pdf new file mode 100644 index 00000000..5b253c0e Binary files /dev/null and b/s3/ERV/398327/398330_Polis.pdf differ diff --git a/s3/ERV/398327/398332_Dokument_udostoveryayuschiy_lichnost.pdf b/s3/ERV/398327/398332_Dokument_udostoveryayuschiy_lichnost.pdf new file mode 100644 index 00000000..caf406eb Binary files /dev/null and b/s3/ERV/398327/398332_Dokument_udostoveryayuschiy_lichnost.pdf differ diff --git a/s3/ERV/398327/398334/398335_Podtverzhdayuschie_dokumenty.pdf b/s3/ERV/398327/398334/398335_Podtverzhdayuschie_dokumenty.pdf new file mode 100644 index 00000000..08741025 Binary files /dev/null and b/s3/ERV/398327/398334/398335_Podtverzhdayuschie_dokumenty.pdf differ diff --git a/s3/ERV/398327/398334/398339__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf b/s3/ERV/398327/398334/398339__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf new file mode 100644 index 00000000..e5e14487 Binary files /dev/null and b/s3/ERV/398327/398334/398339__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf differ diff --git a/s3/ERV/398372/398375_Polis.pdf b/s3/ERV/398372/398375_Polis.pdf new file mode 100644 index 00000000..801daa2a Binary files /dev/null and b/s3/ERV/398372/398375_Polis.pdf differ diff --git a/s3/ERV/398372/398377_Dokument_udostoveryayuschiy_lichnost.pdf b/s3/ERV/398372/398377_Dokument_udostoveryayuschiy_lichnost.pdf new file mode 100644 index 00000000..0190d4e5 Binary files /dev/null and b/s3/ERV/398372/398377_Dokument_udostoveryayuschiy_lichnost.pdf differ diff --git a/s3/ERV/398372/398379/398380_Podtverzhdayuschie_dokumenty.pdf b/s3/ERV/398372/398379/398380_Podtverzhdayuschie_dokumenty.pdf new file mode 100644 index 00000000..ff5abfd6 Binary files /dev/null and b/s3/ERV/398372/398379/398380_Podtverzhdayuschie_dokumenty.pdf differ diff --git a/s3/ERV/398372/398379/398384__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf b/s3/ERV/398372/398379/398384__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf new file mode 100644 index 00000000..321953b2 Binary files /dev/null and b/s3/ERV/398372/398379/398384__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf differ diff --git a/s3/ERV/398620/398623_Dokument_udostoveryayuschiy_lichnost.pdf b/s3/ERV/398620/398623_Dokument_udostoveryayuschiy_lichnost.pdf new file mode 100644 index 00000000..801c77c4 Binary files /dev/null and b/s3/ERV/398620/398623_Dokument_udostoveryayuschiy_lichnost.pdf differ diff --git a/s3/ERV/398620/398625/398626_Podtverzhdayuschie_dokumenty.pdf b/s3/ERV/398620/398625/398626_Podtverzhdayuschie_dokumenty.pdf new file mode 100644 index 00000000..9f30bd42 Binary files /dev/null and b/s3/ERV/398620/398625/398626_Podtverzhdayuschie_dokumenty.pdf differ diff --git a/s3/ERV/398620/398625/398636__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf b/s3/ERV/398620/398625/398636__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf new file mode 100644 index 00000000..d2558ee2 Binary files /dev/null and b/s3/ERV/398620/398625/398636__zayavlenie_na_vyplatu_strahovogo_vozmescheniya_LE.pdf differ diff --git a/storage/2025/November/week2/397758_1_заявление_потребителя_Селдушев____стр.pdf b/storage/2025/November/week2/397758_1_заявление_потребителя_Селдушев____стр.pdf new file mode 100644 index 00000000..37ec69ea Binary files /dev/null and b/storage/2025/November/week2/397758_1_заявление_потребителя_Селдушев____стр.pdf differ diff --git a/storage/2025/November/week2/397862_1_заявление_потребителя_Селдушев____стр.pdf b/storage/2025/November/week2/397862_1_заявление_потребителя_Селдушев____стр.pdf new file mode 100644 index 00000000..6a4638b7 Binary files /dev/null and b/storage/2025/November/week2/397862_1_заявление_потребителя_Селдушев____стр.pdf differ diff --git a/storage/2025/November/week2/398005_Повторное_письмо_для_истца_и_представителя_по_делу_33_14330_2025.pdf b/storage/2025/November/week2/398005_Повторное_письмо_для_истца_и_представителя_по_делу_33_14330_2025.pdf new file mode 100644 index 00000000..7ad4eaf3 Binary files /dev/null and b/storage/2025/November/week2/398005_Повторное_письмо_для_истца_и_представителя_по_делу_33_14330_2025.pdf differ diff --git a/storage/2025/November/week2/398012_AgACAgIAAxkBAAEBbfhpFwddy4J6RihLAtoQ2KlGmXpfrwAC0BBrG3WluEi3qL16ZYSVuQEAAwIAA3kAAzYE.pdf b/storage/2025/November/week2/398012_AgACAgIAAxkBAAEBbfhpFwddy4J6RihLAtoQ2KlGmXpfrwAC0BBrG3WluEi3qL16ZYSVuQEAAwIAA3kAAzYE.pdf new file mode 100644 index 00000000..7e4307f2 Binary files /dev/null and b/storage/2025/November/week2/398012_AgACAgIAAxkBAAEBbfhpFwddy4J6RihLAtoQ2KlGmXpfrwAC0BBrG3WluEi3qL16ZYSVuQEAAwIAA3kAAzYE.pdf differ diff --git a/storage/2025/November/week2/398013_AgACAgIAAxkBAAEBbflpFwddZ8Do3I8SEosH8yz5gr09kgAC0RBrG3WluEgzGrWZq_F_UQEAAwIAA3kAAzYE.pdf b/storage/2025/November/week2/398013_AgACAgIAAxkBAAEBbflpFwddZ8Do3I8SEosH8yz5gr09kgAC0RBrG3WluEgzGrWZq_F_UQEAAwIAA3kAAzYE.pdf new file mode 100644 index 00000000..530c4bee Binary files /dev/null and b/storage/2025/November/week2/398013_AgACAgIAAxkBAAEBbflpFwddZ8Do3I8SEosH8yz5gr09kgAC0RBrG3WluEgzGrWZq_F_UQEAAwIAA3kAAzYE.pdf differ diff --git a/storage/2025/November/week2/398041_7_заявление_потребителя_Храмов_.pdf b/storage/2025/November/week2/398041_7_заявление_потребителя_Храмов_.pdf new file mode 100644 index 00000000..e35a3502 Binary files /dev/null and b/storage/2025/November/week2/398041_7_заявление_потребителя_Храмов_.pdf differ diff --git a/storage/2025/November/week2/398043_7_заявление_потребителя_Храмов_.pdf b/storage/2025/November/week2/398043_7_заявление_потребителя_Храмов_.pdf new file mode 100644 index 00000000..4ef2247b Binary files /dev/null and b/storage/2025/November/week2/398043_7_заявление_потребителя_Храмов_.pdf differ diff --git a/storage/2025/November/week2/398060_1_заявление_потребителя_Храмов____стр.pdf b/storage/2025/November/week2/398060_1_заявление_потребителя_Храмов____стр.pdf new file mode 100644 index 00000000..69bbd0e0 Binary files /dev/null and b/storage/2025/November/week2/398060_1_заявление_потребителя_Храмов____стр.pdf differ diff --git a/storage/2025/November/week2/398064_Доказательство_проведение_претензионной_работы__Храмов_Антон_2_стр.pdf b/storage/2025/November/week2/398064_Доказательство_проведение_претензионной_работы__Храмов_Антон_2_стр.pdf new file mode 100644 index 00000000..5905e50e Binary files /dev/null and b/storage/2025/November/week2/398064_Доказательство_проведение_претензионной_работы__Храмов_Антон_2_стр.pdf differ diff --git a/storage/2025/November/week2/398077_7 заявление потребителя.pdf b/storage/2025/November/week2/398077_7 заявление потребителя.pdf new file mode 100644 index 00000000..cac6289f Binary files /dev/null and b/storage/2025/November/week2/398077_7 заявление потребителя.pdf differ diff --git a/storage/2025/November/week2/398079_заявление_потребителя_Чучалина.pdf b/storage/2025/November/week2/398079_заявление_потребителя_Чучалина.pdf new file mode 100644 index 00000000..ac8a0b56 Binary files /dev/null and b/storage/2025/November/week2/398079_заявление_потребителя_Чучалина.pdf differ diff --git a/storage/2025/November/week3/398083_1_заявление_потребителя_Селдушев____стр.pdf b/storage/2025/November/week3/398083_1_заявление_потребителя_Селдушев____стр.pdf new file mode 100644 index 00000000..199af2a4 Binary files /dev/null and b/storage/2025/November/week3/398083_1_заявление_потребителя_Селдушев____стр.pdf differ diff --git a/storage/2025/November/week3/398115_1_заявление_потребителя_Селдушев____стр.pdf b/storage/2025/November/week3/398115_1_заявление_потребителя_Селдушев____стр.pdf new file mode 100644 index 00000000..8aa5d0bb Binary files /dev/null and b/storage/2025/November/week3/398115_1_заявление_потребителя_Селдушев____стр.pdf differ diff --git a/storage/2025/November/week3/398121_AgACAgIAAxkBAAEBbjVpGX70td7j48N0UmneC1DqPjxMnwACcAxrGyIJyUjLbkLZkubDQgEAAwIAA3kAAzYE.pdf b/storage/2025/November/week3/398121_AgACAgIAAxkBAAEBbjVpGX70td7j48N0UmneC1DqPjxMnwACcAxrGyIJyUjLbkLZkubDQgEAAwIAA3kAAzYE.pdf new file mode 100644 index 00000000..7abf4fba Binary files /dev/null and b/storage/2025/November/week3/398121_AgACAgIAAxkBAAEBbjVpGX70td7j48N0UmneC1DqPjxMnwACcAxrGyIJyUjLbkLZkubDQgEAAwIAA3kAAzYE.pdf differ diff --git a/storage/2025/November/week3/398143__заявление_о_выплате_LEX-000175.pdf b/storage/2025/November/week3/398143__заявление_о_выплате_LEX-000175.pdf new file mode 100644 index 00000000..7129200a Binary files /dev/null and b/storage/2025/November/week3/398143__заявление_о_выплате_LEX-000175.pdf differ diff --git a/storage/2025/November/week3/398150_6_Расчет_исковых_требований_Синицын_ООО_СКИЛБОКС_1_стр.pdf b/storage/2025/November/week3/398150_6_Расчет_исковых_требований_Синицын_ООО_СКИЛБОКС_1_стр.pdf new file mode 100644 index 00000000..127ceb98 Binary files /dev/null and b/storage/2025/November/week3/398150_6_Расчет_исковых_требований_Синицын_ООО_СКИЛБОКС_1_стр.pdf differ diff --git a/storage/2025/November/week3/398152_6_Расчет_исковых_требований_Синицын_ООО_СКИЛБОКС_1_стр.pdf b/storage/2025/November/week3/398152_6_Расчет_исковых_требований_Синицын_ООО_СКИЛБОКС_1_стр.pdf new file mode 100644 index 00000000..169c9eb9 Binary files /dev/null and b/storage/2025/November/week3/398152_6_Расчет_исковых_требований_Синицын_ООО_СКИЛБОКС_1_стр.pdf differ diff --git a/storage/2025/November/week3/398153_0_Исковое_заявление_по_делу_Синицын_ООО_СКИЛБОКС_4_стр.pdf b/storage/2025/November/week3/398153_0_Исковое_заявление_по_делу_Синицын_ООО_СКИЛБОКС_4_стр.pdf new file mode 100644 index 00000000..12b28a60 Binary files /dev/null and b/storage/2025/November/week3/398153_0_Исковое_заявление_по_делу_Синицын_ООО_СКИЛБОКС_4_стр.pdf differ diff --git a/storage/2025/November/week3/398155_0_Исковое_заявление_по_делу_Синицын_ООО_СКИЛБОКС_4_стр.pdf b/storage/2025/November/week3/398155_0_Исковое_заявление_по_делу_Синицын_ООО_СКИЛБОКС_4_стр.pdf new file mode 100644 index 00000000..2882d9c6 Binary files /dev/null and b/storage/2025/November/week3/398155_0_Исковое_заявление_по_делу_Синицын_ООО_СКИЛБОКС_4_стр.pdf differ diff --git a/storage/2025/November/week3/398157_доказательство_направления_иска_ответчику_Синицын_ООО_СКИЛБОКС_1_стр.pdf b/storage/2025/November/week3/398157_доказательство_направления_иска_ответчику_Синицын_ООО_СКИЛБОКС_1_стр.pdf new file mode 100644 index 00000000..8f0f9bb1 Binary files /dev/null and b/storage/2025/November/week3/398157_доказательство_направления_иска_ответчику_Синицын_ООО_СКИЛБОКС_1_стр.pdf differ diff --git a/storage/2025/November/week3/398159_6_Расчет_исковых_требований_Синицын_ООО_СКИЛБОКС_1_стр.pdf b/storage/2025/November/week3/398159_6_Расчет_исковых_требований_Синицын_ООО_СКИЛБОКС_1_стр.pdf new file mode 100644 index 00000000..43cab538 Binary files /dev/null and b/storage/2025/November/week3/398159_6_Расчет_исковых_требований_Синицын_ООО_СКИЛБОКС_1_стр.pdf differ diff --git a/storage/2025/November/week3/398160_0_Исковое_заявление_по_делу_Синицын_ООО_СКИЛБОКС_4_стр.pdf b/storage/2025/November/week3/398160_0_Исковое_заявление_по_делу_Синицын_ООО_СКИЛБОКС_4_стр.pdf new file mode 100644 index 00000000..f4bf555f Binary files /dev/null and b/storage/2025/November/week3/398160_0_Исковое_заявление_по_делу_Синицын_ООО_СКИЛБОКС_4_стр.pdf differ diff --git a/storage/2025/November/week3/398165_1_заявление_потребителя_Селдушев____стр.pdf b/storage/2025/November/week3/398165_1_заявление_потребителя_Селдушев____стр.pdf new file mode 100644 index 00000000..e7ba0382 Binary files /dev/null and b/storage/2025/November/week3/398165_1_заявление_потребителя_Селдушев____стр.pdf differ diff --git a/storage/2025/November/week3/398252__заявление_о_выплате_LEX-000176.pdf b/storage/2025/November/week3/398252__заявление_о_выплате_LEX-000176.pdf new file mode 100644 index 00000000..128fa453 Binary files /dev/null and b/storage/2025/November/week3/398252__заявление_о_выплате_LEX-000176.pdf differ diff --git a/storage/2025/November/week3/398270__заявление_о_выплате_LEX-000177.pdf b/storage/2025/November/week3/398270__заявление_о_выплате_LEX-000177.pdf new file mode 100644 index 00000000..92939794 Binary files /dev/null and b/storage/2025/November/week3/398270__заявление_о_выплате_LEX-000177.pdf differ diff --git a/storage/2025/November/week3/398290__заявление_о_выплате_LEX-000178.pdf b/storage/2025/November/week3/398290__заявление_о_выплате_LEX-000178.pdf new file mode 100644 index 00000000..bbf30efb Binary files /dev/null and b/storage/2025/November/week3/398290__заявление_о_выплате_LEX-000178.pdf differ diff --git a/storage/2025/November/week3/398293_Ответ_на_претензию_Ирина_Кулагина.pdf b/storage/2025/November/week3/398293_Ответ_на_претензию_Ирина_Кулагина.pdf new file mode 100644 index 00000000..7995def9 Binary files /dev/null and b/storage/2025/November/week3/398293_Ответ_на_претензию_Ирина_Кулагина.pdf differ diff --git a/storage/2025/November/week3/398309__заявление_о_выплате_LEX-000179.pdf b/storage/2025/November/week3/398309__заявление_о_выплате_LEX-000179.pdf new file mode 100644 index 00000000..39d261f2 Binary files /dev/null and b/storage/2025/November/week3/398309__заявление_о_выплате_LEX-000179.pdf differ diff --git a/storage/2025/November/week3/398326__заявление_о_выплате_LEX-000180.pdf b/storage/2025/November/week3/398326__заявление_о_выплате_LEX-000180.pdf new file mode 100644 index 00000000..c16ad954 Binary files /dev/null and b/storage/2025/November/week3/398326__заявление_о_выплате_LEX-000180.pdf differ diff --git a/storage/2025/November/week3/398342__заявление_о_выплате_LEX-000181.pdf b/storage/2025/November/week3/398342__заявление_о_выплате_LEX-000181.pdf new file mode 100644 index 00000000..b6c66fc3 Binary files /dev/null and b/storage/2025/November/week3/398342__заявление_о_выплате_LEX-000181.pdf differ diff --git a/storage/2025/November/week3/398387__заявление_о_выплате_LEX-000182.pdf b/storage/2025/November/week3/398387__заявление_о_выплате_LEX-000182.pdf new file mode 100644 index 00000000..2b856b04 Binary files /dev/null and b/storage/2025/November/week3/398387__заявление_о_выплате_LEX-000182.pdf differ diff --git a/storage/2025/November/week3/398392_1_заявление_потребителя_Селдушев____стр.pdf b/storage/2025/November/week3/398392_1_заявление_потребителя_Селдушев____стр.pdf new file mode 100644 index 00000000..2ea88638 Binary files /dev/null and b/storage/2025/November/week3/398392_1_заявление_потребителя_Селдушев____стр.pdf differ diff --git a/storage/2025/November/week3/398468_6_Расчет_исковых_требований_Крылова_ГБУ_ЖИЛИЩНИК_РАЙОНА_ЧЕРТАНОВО_ЦЕНТРАЛЬНОЕ_1_стр.pdf b/storage/2025/November/week3/398468_6_Расчет_исковых_требований_Крылова_ГБУ_ЖИЛИЩНИК_РАЙОНА_ЧЕРТАНОВО_ЦЕНТРАЛЬНОЕ_1_стр.pdf new file mode 100644 index 00000000..e6ba7ca0 Binary files /dev/null and b/storage/2025/November/week3/398468_6_Расчет_исковых_требований_Крылова_ГБУ_ЖИЛИЩНИК_РАЙОНА_ЧЕРТАНОВО_ЦЕНТРАЛЬНОЕ_1_стр.pdf differ diff --git a/storage/2025/November/week3/398470_0_Исковое_заявление_по_делу_Крылова_ГБУ_ЖИЛИЩНИК_РАЙОНА_ЧЕРТАНОВО_ЦЕНТРАЛЬНОЕ_5_стр.pdf b/storage/2025/November/week3/398470_0_Исковое_заявление_по_делу_Крылова_ГБУ_ЖИЛИЩНИК_РАЙОНА_ЧЕРТАНОВО_ЦЕНТРАЛЬНОЕ_5_стр.pdf new file mode 100644 index 00000000..aed9048a Binary files /dev/null and b/storage/2025/November/week3/398470_0_Исковое_заявление_по_делу_Крылова_ГБУ_ЖИЛИЩНИК_РАЙОНА_ЧЕРТАНОВО_ЦЕНТРАЛЬНОЕ_5_стр.pdf differ diff --git a/storage/2025/November/week3/398528_1_заявление_потребителя_Селдушев____стр.pdf b/storage/2025/November/week3/398528_1_заявление_потребителя_Селдушев____стр.pdf new file mode 100644 index 00000000..189a0ae3 Binary files /dev/null and b/storage/2025/November/week3/398528_1_заявление_потребителя_Селдушев____стр.pdf differ diff --git a/storage/2025/November/week3/398639__заявление_о_выплате_LEX-000183.pdf b/storage/2025/November/week3/398639__заявление_о_выплате_LEX-000183.pdf new file mode 100644 index 00000000..ae931bf4 Binary files /dev/null and b/storage/2025/November/week3/398639__заявление_о_выплате_LEX-000183.pdf differ diff --git a/storage/2025/November/week3/398658_6_Расчет_исковых_требований_Козлов_ИП_Брехов_Игорь_Игоревич_1_стр.pdf b/storage/2025/November/week3/398658_6_Расчет_исковых_требований_Козлов_ИП_Брехов_Игорь_Игоревич_1_стр.pdf new file mode 100644 index 00000000..924f298d Binary files /dev/null and b/storage/2025/November/week3/398658_6_Расчет_исковых_требований_Козлов_ИП_Брехов_Игорь_Игоревич_1_стр.pdf differ diff --git a/storage/2025/November/week3/398660_6_Расчет_исковых_требований_Козлов_ИП_Брехов_Игорь_Игоревич_1_стр.pdf b/storage/2025/November/week3/398660_6_Расчет_исковых_требований_Козлов_ИП_Брехов_Игорь_Игоревич_1_стр.pdf new file mode 100644 index 00000000..a2908c3b Binary files /dev/null and b/storage/2025/November/week3/398660_6_Расчет_исковых_требований_Козлов_ИП_Брехов_Игорь_Игоревич_1_стр.pdf differ diff --git a/storage/2025/November/week3/398661_0_Исковое_заявление_по_делу_Козлов_ИП_Брехов_Игорь_Игоревич_4_стр.pdf b/storage/2025/November/week3/398661_0_Исковое_заявление_по_делу_Козлов_ИП_Брехов_Игорь_Игоревич_4_стр.pdf new file mode 100644 index 00000000..2e704d83 Binary files /dev/null and b/storage/2025/November/week3/398661_0_Исковое_заявление_по_делу_Козлов_ИП_Брехов_Игорь_Игоревич_4_стр.pdf differ diff --git a/storage/2025/November/week3/398663_0_Исковое_заявление_по_делу_Козлов_ИП_Брехов_Игорь_Игоревич_4_стр.pdf b/storage/2025/November/week3/398663_0_Исковое_заявление_по_делу_Козлов_ИП_Брехов_Игорь_Игоревич_4_стр.pdf new file mode 100644 index 00000000..2428a04f Binary files /dev/null and b/storage/2025/November/week3/398663_0_Исковое_заявление_по_делу_Козлов_ИП_Брехов_Игорь_Игоревич_4_стр.pdf differ diff --git a/storage/2025/November/week3/398665_доказательство_направления_иска_ответчику_Козлов_ИП_Брехов_Игорь_Игоревич_1_стр.pdf b/storage/2025/November/week3/398665_доказательство_направления_иска_ответчику_Козлов_ИП_Брехов_Игорь_Игоревич_1_стр.pdf new file mode 100644 index 00000000..d094ac72 Binary files /dev/null and b/storage/2025/November/week3/398665_доказательство_направления_иска_ответчику_Козлов_ИП_Брехов_Игорь_Игоревич_1_стр.pdf differ diff --git a/storage/2025/November/week3/398667_6_Расчет_исковых_требований_Козлов_ИП_Брехов_Игорь_Игоревич_1_стр.pdf b/storage/2025/November/week3/398667_6_Расчет_исковых_требований_Козлов_ИП_Брехов_Игорь_Игоревич_1_стр.pdf new file mode 100644 index 00000000..231b1c29 Binary files /dev/null and b/storage/2025/November/week3/398667_6_Расчет_исковых_требований_Козлов_ИП_Брехов_Игорь_Игоревич_1_стр.pdf differ diff --git a/storage/2025/November/week3/398668_0_Исковое_заявление_по_делу_Козлов_ИП_Брехов_Игорь_Игоревич_4_стр.pdf b/storage/2025/November/week3/398668_0_Исковое_заявление_по_делу_Козлов_ИП_Брехов_Игорь_Игоревич_4_стр.pdf new file mode 100644 index 00000000..1703861a Binary files /dev/null and b/storage/2025/November/week3/398668_0_Исковое_заявление_по_делу_Козлов_ИП_Брехов_Игорь_Игоревич_4_стр.pdf differ diff --git a/storage/2025/November/week3/398738_6_Расчет_исковых_требований_Чечко_ИП_Кравчук_Гаяна_Андраниковна_1_стр.pdf b/storage/2025/November/week3/398738_6_Расчет_исковых_требований_Чечко_ИП_Кравчук_Гаяна_Андраниковна_1_стр.pdf new file mode 100644 index 00000000..da7751c1 Binary files /dev/null and b/storage/2025/November/week3/398738_6_Расчет_исковых_требований_Чечко_ИП_Кравчук_Гаяна_Андраниковна_1_стр.pdf differ diff --git a/storage/2025/November/week3/398740_6_Расчет_исковых_требований_Чечко_ИП_Кравчук_Гаяна_Андраниковна_1_стр.pdf b/storage/2025/November/week3/398740_6_Расчет_исковых_требований_Чечко_ИП_Кравчук_Гаяна_Андраниковна_1_стр.pdf new file mode 100644 index 00000000..c2cbfcc1 Binary files /dev/null and b/storage/2025/November/week3/398740_6_Расчет_исковых_требований_Чечко_ИП_Кравчук_Гаяна_Андраниковна_1_стр.pdf differ diff --git a/storage/2025/November/week3/398741_0_Исковое_заявление_по_делу_Чечко_ИП_Кравчук_Гаяна_Андраниковна_4_стр.pdf b/storage/2025/November/week3/398741_0_Исковое_заявление_по_делу_Чечко_ИП_Кравчук_Гаяна_Андраниковна_4_стр.pdf new file mode 100644 index 00000000..e716eed2 Binary files /dev/null and b/storage/2025/November/week3/398741_0_Исковое_заявление_по_делу_Чечко_ИП_Кравчук_Гаяна_Андраниковна_4_стр.pdf differ diff --git a/storage/2025/November/week3/398743_0_Исковое_заявление_по_делу_Чечко_ИП_Кравчук_Гаяна_Андраниковна_4_стр.pdf b/storage/2025/November/week3/398743_0_Исковое_заявление_по_делу_Чечко_ИП_Кравчук_Гаяна_Андраниковна_4_стр.pdf new file mode 100644 index 00000000..a20f7297 Binary files /dev/null and b/storage/2025/November/week3/398743_0_Исковое_заявление_по_делу_Чечко_ИП_Кравчук_Гаяна_Андраниковна_4_стр.pdf differ diff --git a/storage/2025/November/week3/398745_доказательство_направления_иска_ответчику_Чечко_ИП_Кравчук_Гаяна_Андраниковна_1_стр.pdf b/storage/2025/November/week3/398745_доказательство_направления_иска_ответчику_Чечко_ИП_Кравчук_Гаяна_Андраниковна_1_стр.pdf new file mode 100644 index 00000000..23e0d539 Binary files /dev/null and b/storage/2025/November/week3/398745_доказательство_направления_иска_ответчику_Чечко_ИП_Кравчук_Гаяна_Андраниковна_1_стр.pdf differ diff --git a/storage/2025/November/week3/398747_6_Расчет_исковых_требований_Чечко_ИП_Кравчук_Гаяна_Андраниковна_1_стр.pdf b/storage/2025/November/week3/398747_6_Расчет_исковых_требований_Чечко_ИП_Кравчук_Гаяна_Андраниковна_1_стр.pdf new file mode 100644 index 00000000..b8cd7b42 Binary files /dev/null and b/storage/2025/November/week3/398747_6_Расчет_исковых_требований_Чечко_ИП_Кравчук_Гаяна_Андраниковна_1_стр.pdf differ diff --git a/storage/2025/November/week3/398748_0_Исковое_заявление_по_делу_Чечко_ИП_Кравчук_Гаяна_Андраниковна_4_стр.pdf b/storage/2025/November/week3/398748_0_Исковое_заявление_по_делу_Чечко_ИП_Кравчук_Гаяна_Андраниковна_4_стр.pdf new file mode 100644 index 00000000..d023371f Binary files /dev/null and b/storage/2025/November/week3/398748_0_Исковое_заявление_по_делу_Чечко_ИП_Кравчук_Гаяна_Андраниковна_4_стр.pdf differ diff --git a/storage/2025/November/week3/398754_1_заявление_потребителя_Селдушев____стр.pdf b/storage/2025/November/week3/398754_1_заявление_потребителя_Селдушев____стр.pdf new file mode 100644 index 00000000..4952fa32 Binary files /dev/null and b/storage/2025/November/week3/398754_1_заявление_потребителя_Селдушев____стр.pdf differ diff --git a/storage/2025/November/week3/398806_Ходатайство_по_делу_.pdf b/storage/2025/November/week3/398806_Ходатайство_по_делу_.pdf new file mode 100644 index 00000000..af4a331b Binary files /dev/null and b/storage/2025/November/week3/398806_Ходатайство_по_делу_.pdf differ diff --git a/storage/2025/November/week3/398828_image001.png b/storage/2025/November/week3/398828_image001.png new file mode 100644 index 00000000..d4677b72 Binary files /dev/null and b/storage/2025/November/week3/398828_image001.png differ diff --git a/storage/2025/November/week3/398829_image002.png b/storage/2025/November/week3/398829_image002.png new file mode 100644 index 00000000..bcb136d1 Binary files /dev/null and b/storage/2025/November/week3/398829_image002.png differ diff --git a/storage/2025/November/week3/398847_7_заявление_потребителя_Родионов__.pdf b/storage/2025/November/week3/398847_7_заявление_потребителя_Родионов__.pdf new file mode 100644 index 00000000..74ee0f6f Binary files /dev/null and b/storage/2025/November/week3/398847_7_заявление_потребителя_Родионов__.pdf differ diff --git a/storage/2025/November/week3/398849_7_заявление_потребителя_Родионов__.pdf b/storage/2025/November/week3/398849_7_заявление_потребителя_Родионов__.pdf new file mode 100644 index 00000000..9e4c3ce2 Binary files /dev/null and b/storage/2025/November/week3/398849_7_заявление_потребителя_Родионов__.pdf differ diff --git a/storage/2025/November/week3/398862_7_заявление_потребителя_Родионов__.pdf b/storage/2025/November/week3/398862_7_заявление_потребителя_Родионов__.pdf new file mode 100644 index 00000000..295d82f4 Binary files /dev/null and b/storage/2025/November/week3/398862_7_заявление_потребителя_Родионов__.pdf differ diff --git a/storage/2025/November/week3/398863_Претензия_в_защиту_интересов_Родионов__Анатолий_1_стр.pdf b/storage/2025/November/week3/398863_Претензия_в_защиту_интересов_Родионов__Анатолий_1_стр.pdf new file mode 100644 index 00000000..1a0d3ded Binary files /dev/null and b/storage/2025/November/week3/398863_Претензия_в_защиту_интересов_Родионов__Анатолий_1_стр.pdf differ diff --git a/storage/2025/November/week3/398865_11_Доказательство_соблюдения_претензионного_порядка__Родионов__Анатолий_2_стр.pdf b/storage/2025/November/week3/398865_11_Доказательство_соблюдения_претензионного_порядка__Родионов__Анатолий_2_стр.pdf new file mode 100644 index 00000000..815beee6 Binary files /dev/null and b/storage/2025/November/week3/398865_11_Доказательство_соблюдения_претензионного_порядка__Родионов__Анатолий_2_стр.pdf differ diff --git a/storage/2025/November/week3/398870_IMG_20251120_183905 (1).pdf b/storage/2025/November/week3/398870_IMG_20251120_183905 (1).pdf new file mode 100644 index 00000000..98a2ec66 Binary files /dev/null and b/storage/2025/November/week3/398870_IMG_20251120_183905 (1).pdf differ diff --git a/storage/2025/November/week3/398917_7 заявление потребителя.pdf b/storage/2025/November/week3/398917_7 заявление потребителя.pdf new file mode 100644 index 00000000..d76007cf Binary files /dev/null and b/storage/2025/November/week3/398917_7 заявление потребителя.pdf differ diff --git a/storage/2025/November/week3/398919_заявление_потребителя_Койтова.pdf b/storage/2025/November/week3/398919_заявление_потребителя_Койтова.pdf new file mode 100644 index 00000000..e1ae61be Binary files /dev/null and b/storage/2025/November/week3/398919_заявление_потребителя_Койтова.pdf differ diff --git a/storage/2025/November/week3/398937_1_заявление_потребителя_Селдушев____стр.pdf b/storage/2025/November/week3/398937_1_заявление_потребителя_Селдушев____стр.pdf new file mode 100644 index 00000000..012d3bcc Binary files /dev/null and b/storage/2025/November/week3/398937_1_заявление_потребителя_Селдушев____стр.pdf differ diff --git a/storage/licenses/48139445fb3cb6dbee379c82a736324f34ffc9af.dat b/storage/licenses/48139445fb3cb6dbee379c82a736324f34ffc9af.dat index bac23d04..d32cb2bc 100644 Binary files a/storage/licenses/48139445fb3cb6dbee379c82a736324f34ffc9af.dat and b/storage/licenses/48139445fb3cb6dbee379c82a736324f34ffc9af.dat differ diff --git a/test/LanguageManager/Workflow2 b/test/LanguageManager/Workflow2 index 886d49e7..ced6c8e9 100644 --- a/test/LanguageManager/Workflow2 +++ b/test/LanguageManager/Workflow2 @@ -1 +1 @@ -2025-11-12 13:20:08 \ No newline at end of file +2025-11-21 14:05:08 \ No newline at end of file diff --git a/test/templates_c/v7/077276469baad8337c580470829ee4c36a1ebc28.file.Properties.tpl.php b/test/templates_c/v7/077276469baad8337c580470829ee4c36a1ebc28.file.Properties.tpl.php new file mode 100644 index 00000000..8748c104 --- /dev/null +++ b/test/templates_c/v7/077276469baad8337c580470829ee4c36a1ebc28.file.Properties.tpl.php @@ -0,0 +1,99 @@ + +decodeProperties(array ( + 'file_dependency' => + array ( + '077276469baad8337c580470829ee4c36a1ebc28' => + array ( + 0 => '/var/www/fastuser/data/www/crm.clientright.ru/includes/runtime/../../layouts/v7/modules/EMAILMaker/tabs/Properties.tpl', + 1 => 1715769019, + 2 => 'file', + ), + ), + 'nocache_hash' => '72523654869205b8ce6a026-98651210', + 'function' => + array ( + ), + 'variables' => + array ( + 'THEME_MODE' => 0, + 'MODULE' => 0, + 'TEMPLATENAME' => 0, + 'RECIPIENTMODULENAMES' => 0, + 'TEMPLATEID' => 0, + 'SELECTMODULE' => 0, + 'MODULENAMES' => 0, + 'SELECT_MODULE_FIELD' => 0, + 'RELATED_MODULES' => 0, + 'RelMod' => 0, + 'RELATED_BLOCKS' => 0, + 'ACCOUNTINFORMATIONS' => 0, + 'CUI_BLOCKS' => 0, + 'USERINFORMATIONS' => 0, + 'MULTICOMPANYINFORMATIONS' => 0, + 'LBL_MULTICOMPANY' => 0, + ), + 'has_nocache_code' => false, + 'version' => 'Smarty-3.1.7', + 'unifunc' => 'content_69205b8ce811c', +),false); /*/%%SmartyHeaderCode%%*/?> + +| * From Name | +tpl_vars['from']->value['from_name'];?> + | +
| * From Mail | +tpl_vars['from']->value['from_mail'];?> + | +
| * + | +
+ tpl_vars['task']->value['from_name'];?>
+
+ |
| * + | +
+ tpl_vars['task']->value['from_mail'];?>
+
+ |
| * + | +
+ tpl_vars['task']->value['recepient'];?>
+
+ |
+
| + | + + + + + | +
| * + | +
+ tpl_vars['task']->value['subject'];?>
+
+ |
+
+
+ + +| + + + | ++ + + | ++ | +
+
+
+ 
+
+
+
+ |
+
| tpl_vars['MODULE']->value);?> + | |
| tpl_vars['MODULE']->value);?> + | |
| tpl_vars['MODULE']->value);?> + |
$ITS4YouEmails_Mailer = ' +';+
Загрузка шага...
+