Compare commits

...

2 Commits
main ... pages

View File

@ -83,6 +83,9 @@
<h2 id="resultTitle" style="margin-bottom:var(--kt-ai-space-3)"></h2>
<div id="resultCategory" class="kb-category" style="margin-bottom:var(--kt-ai-space-4)"></div>
<div id="resultContent"></div>
<p id="noSourceMsg" style="color:var(--kt-ai-fg-muted);font-size:var(--kt-ai-text-sm);margin-top:var(--kt-ai-space-4);display:none">
⚠️ Полная инструкция ещё не загружена
</p>
<a id="resultLink" class="instruction-link kt-ai-link" href="#" target="_blank" style="display:none">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>
Открыть полную инструкцию
@ -134,148 +137,17 @@
<script>
const KNOWLEDGE_BASE = [
{
id: 1,
question: "Как создать новый договор?",
category: "Создание",
keywords: ["создать", "новый", "договор", "регистрация"],
steps: [
"Откройте раздел «Договоры» → «Создать договор»",
"Заполните обязательные поля: контрагент, предмет, сумма, срок действия",
"Прикрепите скан-копию договора в формате PDF",
"Нажмите «Сохранить и отправить на согласование»"
],
instructionUrl: "#",
tip: "Все обязательные поля отмечены звёздочкой (*)"
},
{
id: 2,
question: "Как изменить существующий договор?",
category: "Создание",
keywords: ["изменить", "редактировать", "обновить", "дополнительное"],
steps: [
"Найдите договор в реестре через поиск или фильтры",
"Откройте карточку договора",
"Нажмите кнопку «Редактировать» или «Создать дополнительное соглашение»",
"Внесите изменения, сохраните и отправьте на согласование"
],
instructionUrl: "#",
tip: "Изменения вступают в силу после подписания обеими сторонами"
},
{
id: 3,
question: "Как отправить договор на согласование?",
category: "Согласование",
keywords: ["отправить", "согласование", "маршрут", "визировать"],
steps: [
"Откройте черновик договора",
"Проверьте заполненность всех обязательных полей",
"Нажмите «Отправить на согласование»",
"Выберите маршрут согласования или используйте стандартный",
"Подтвердите отправку — договор уйдёт первому согласующему"
],
instructionUrl: "#",
tip: "Статус изменится на «На согласовании», вы увидите текущий этап"
},
{
id: 4,
question: "Как отозвать договор с согласования?",
category: "Согласование",
keywords: ["отозвать", "вернуть", "отменить", "согласование"],
steps: [
"Откройте договор со статусом «На согласовании»",
"Нажмите кнопку «Отозвать» (доступна, если договор ещё не подписан)",
"Укажите причину отзыва в комментарии",
"Договор вернётся в статус «Черновик»"
],
instructionUrl: "#",
tip: "Отозвать можно только до момента финального подписания"
},
{
id: 5,
question: "Как подписать договор электронной подписью?",
category: "Подписание",
keywords: ["подписать", "эцп", "подпись", "нцр"],
steps: [
"Откройте договор со статусом «Готов к подписанию»",
"Нажмите «Подписать ЭЦП»",
"Выберите сертификат подписи из списка",
"Введите пароль от токена/ключа",
"Дождитесь подтверждения — статус сменится на «Подписан»"
],
instructionUrl: "#",
tip: "Требуется установленный плагин ЭЦП и действующий сертификат"
},
{
id: 6,
question: "Как посмотреть статус договора?",
category: "Создание",
keywords: ["статус", "этап", "где находится", "отследить"],
steps: [
"Откройте реестр договоров",
"Найдите нужный договор (поиск/фильтры)",
"Статус отображается в отдельной колонке цветом",
"Кликните на статус для детальной информации по этапам"
],
instructionUrl: "#",
tip: "Зелёный — подписан, жёлтый — на согласовании, серый — черновик"
},
{
id: 7,
question: "Как получить архивную копию договора?",
category: "Архив",
keywords: ["архив", "копия", "выгрузить", "скачать", "экспорт"],
steps: [
"Откройте исполненный договор (статус «Архив»)",
"Нажмите кнопку «Скачать» или «Выгрузить»",
"Выберите формат: PDF с подписями или XML",
"Файл загрузится на устройство"
],
instructionUrl: "#",
tip: "Архивные договоры хранятся 5 лет после исполнения"
},
{
id: 8,
question: "Как переместить договор в архив?",
category: "Архив",
keywords: ["архив", "переместить", "исполнен", "закрыть"],
steps: [
"Убедитесь, что договор полностью исполнен (все обязательства закрыты)",
"Откройте карточку договора",
"Нажмите «Закрыть договор» или «Переместить в архив»",
"Подтвердите действие — статус сменится на «Архив»"
],
instructionUrl: "#",
tip: "Архивный договор нельзя редактировать, только просматривать"
},
{
id: 9,
question: "Как назначить ответственного за договор?",
category: "Создание",
keywords: ["ответственный", "назначить", "владелец", "куратор"],
steps: [
"Откройте договор в режиме редактирования",
"В поле «Ответственный» начните вводить ФИО сотрудника",
"Выберите сотрудника из выпадающего списка",
"Сохраните изменения"
],
instructionUrl: "#",
tip: "Ответственный получает уведомления об этапах договора"
},
{
id: 10,
question: "Как найти договор по контрагенту?",
category: "Создание",
keywords: ["найти", "поиск", "контрагент", "поставщик", "заказчик"],
steps: [
"Откройте реестр договоров",
"В фильтре «Контрагент» введите название компании или БИН",
"Нажмите «Применить» или Enter",
"Система покажет все договоры с этим контрагентом"
],
instructionUrl: "#",
tip: "Можно искать по части названия — система подскажет варианты"
}
{ id: 1, question: "Как создать новый договор?", category: "Создание", keywords: ["создать", "новый", "договор", "регистрация"] },
{ id: 2, question: "Как изменить существующий договор?", category: "Создание", keywords: ["изменить", "редактировать", "обновить", "дополнительное"] },
{ id: 3, question: "Как отправить договор на согласование?", category: "Согласование", keywords: ["отправить", "согласование", "маршрут", "визировать"] },
{ id: 4, question: "Как отозвать договор с согласования?", category: "Согласование", keywords: ["отозвать", "вернуть", "отменить", "согласование"] },
{ id: 5, question: "Как подписать договор электронной подписью?", category: "Подписание", keywords: ["подписать", "эцп", "подпись", "нцр"] },
{ id: 6, question: "Как посмотреть статус договора?", category: "Создание", keywords: ["статус", "этап", "где находится", "отследить"] },
{ id: 7, question: "Как получить архивную копию договора?", category: "Архив", keywords: ["архив", "копия", "выгрузить", "скачать", "экспорт"] },
{ id: 8, question: "Как переместить договор в архив?", category: "Архив", keywords: ["архив", "переместить", "исполнен", "закрыть"] },
{ id: 9, question: "Как назначить ответственного за договор?", category: "Создание", keywords: ["ответственный", "назначить", "владелец", "куратор"] },
{ id: 10, question: "Как найти договор по контрагенту?", category: "Создание", keywords: ["найти", "поиск", "контрагент", "поставщик", "заказчик"] },
{ id: 11, question: "Как оформить допсоглашение после окончания договора?", category: "Создание", keywords: ["допсоглашение", "окончание", "истёк", "срок", "продлить"] }
];
let currentCategory = 'all';
@ -300,7 +172,7 @@ function renderKB() {
<div class="kb-category">${kb.category}</div>
<h3 style="margin:0 0 var(--kt-ai-space-2) 0">${kb.question}</h3>
<p style="color:var(--kt-ai-fg-muted);font-size:var(--kt-ai-text-sm);margin:0">
${kb.steps.length} шагов • ${kb.tip}
Нажмите, чтобы увидеть ответ
</p>
</article>
`).join('');
@ -335,20 +207,16 @@ function performSearch() {
document.getElementById('resultTitle').textContent = result.question;
document.getElementById('resultCategory').textContent = result.category;
document.getElementById('resultContent').innerHTML = `
<ol class="steps-list">
${result.steps.map(s => `<li>${s}</li>`).join('')}
</ol>
<p style="color:var(--kt-ai-fg-muted);font-size:var(--kt-ai-text-sm);margin-top:var(--kt-ai-space-4)">
💡 ${result.tip}
</p>
<div class="kt-ai-empty" style="padding:var(--kt-ai-space-6);text-align:center">
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="var(--kt-ai-fg-faint)" stroke-width="1.5" style="margin-bottom:var(--kt-ai-space-3)">
<circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/>
</svg>
<p style="margin:0;color:var(--kt-ai-fg-muted)">Ответ ещё не загружен</p>
<p style="margin:var(--kt-ai-space-2) 0 0 0;font-size:var(--kt-ai-text-sm);color:var(--kt-ai-fg-faint)">Инструкция по этому вопросу будет добавлена позже</p>
</div>
`;
const linkEl = document.getElementById('resultLink');
if (result.instructionUrl && result.instructionUrl !== '#') {
linkEl.href = result.instructionUrl;
linkEl.style.display = 'inline-flex';
} else {
linkEl.style.display = 'none';
}
document.getElementById('resultLink').style.display = 'none';
document.getElementById('noSourceMsg').style.display = 'none';
resultBlock.style.display = 'block';
emptyState.style.display = 'none';
} else {
@ -364,18 +232,13 @@ function showKBDetail(id) {
document.getElementById('modalTitle').textContent = kb.question;
document.getElementById('modalBody').innerHTML = `
<div class="kb-category" style="margin-bottom:var(--kt-ai-space-4)">${kb.category}</div>
<ol class="steps-list">
${kb.steps.map(s => `<li>${s}</li>`).join('')}
</ol>
<div class="kt-ai-card" style="background:var(--kt-ai-bg-soft);margin-top:var(--kt-ai-space-5)">
<strong>💡 Совет:</strong>
<p style="margin:var(--kt-ai-space-2) 0 0 0;color:var(--kt-ai-fg-muted)">${kb.tip}</p>
<div class="kt-ai-empty" style="padding:var(--kt-ai-space-6);text-align:center">
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="var(--kt-ai-fg-faint)" stroke-width="1.5" style="margin-bottom:var(--kt-ai-space-3)">
<circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/>
</svg>
<p style="margin:0;color:var(--kt-ai-fg-muted)">Ответ ещё не загружен</p>
<p style="margin:var(--kt-ai-space-2) 0 0 0;font-size:var(--kt-ai-text-sm);color:var(--kt-ai-fg-faint)">Инструкция по этому вопросу будет добавлена позже</p>
</div>
${kb.instructionUrl && kb.instructionUrl !== '#' ? `
<a href="${kb.instructionUrl}" class="kt-ai-btn" data-variant="primary" style="margin-top:var(--kt-ai-space-5);width:100%" target="_blank">
Открыть полную инструкцию
</a>
` : ''}
`;
document.getElementById('modalOverlay').classList.add('active');