Помощник по скидкам: обучение, ошибки, AI, тесты

This commit is contained in:
alina 2026-08-21 10:31:16 +00:00
parent d1d30fcb7d
commit 02cf5cab43
4 changed files with 3433 additions and 0 deletions

1097
discount-helper/app.js Normal file

File diff suppressed because it is too large Load Diff

798
discount-helper/data.js Normal file
View File

@ -0,0 +1,798 @@
// === БАЗА ЗНАНИЙ ===
// Центральный источник данных для всего приложения
const KB = {
// Ошибки
errors: [
{
id: 'err_001',
code: '403',
title: 'Нет прав на создание скидки',
meaning: 'У пользователя недостаточно прав для выполнения операции',
causes: [
'Отсутствует роль "Менеджер по скидкам"',
'Истек срок действия полномочий',
'Попытка создать скидку выше лимита'
],
solution: [
'Проверьте свою роль в системе (Раздел "Профиль")',
'Убедитесь, что размер скидки входит в ваш лимит',
'При необходимости запросите согласование у руководителя',
'Обратитесь к администратору для расширения прав'
],
contact: 'helpdesk@kazakhtelecom.kz, внутренний номер: 1111'
},
{
id: 'err_002',
code: 'TARIFF_NOT_FOUND',
title: 'Тариф не найден',
meaning: 'Выбранный тариф недоступен для применения скидки',
causes: [
'Тариф архивный или выведен из эксплуатации',
'На тариф действуют ограничения по скидкам',
'Неверно выбран код тарифа в системе'
],
solution: [
'Проверьте актуальность тарифа в справочнике',
'Убедитесь, что тариф поддерживает скидки',
'Сверьте код тарифа с официальным каталогом',
'Выберите альтернативный тариф из доступных'
],
contact: 'Отдел продуктового маркетинга, номер: 2222'
},
{
id: 'err_003',
code: 'DISCOUNT_LIMIT',
title: 'Превышен лимит скидки',
meaning: 'Запрошенный размер скидки превышает максимально допустимый',
causes: [
'Размер скидки выше полномочий менеджера',
'Превышен совокупный лимит на клиента',
'Для тарифа установлен максимальный порог'
],
solution: [
'Проверьте максимально допустимый размер скидки для тарифа',
'Сверьте свои полномочия (см. таблицу лимитов)',
'Запросите согласование у руководителя при необходимости',
'Предложите клиенту альтернативный вариант скидки'
],
contact: 'Руководитель отдела продаж'
},
{
id: 'err_004',
code: 'INVALID_PERIOD',
title: 'Недопустимый период',
meaning: 'Указанный срок действия скидки не соответствует правилам',
causes: [
'Срок меньше минимального (3 месяца)',
'Срок превышает максимальный (24 месяца)',
'Дата окончания раньше даты начала'
],
solution: [
'Минимальный срок действия скидки — 3 месяца',
'Максимальный срок — 24 месяца',
'Проверьте, что дата окончания позже даты начала',
'Используйте стандартные периоды: 3, 6, 12, 24 месяца'
],
contact: null
},
{
id: 'err_005',
code: 'CLIENT_NOT_FOUND',
title: 'Клиент не найден',
meaning: 'Не удалось найти клиента в базе данных',
causes: [
'Неверно введен ИИН/БИН',
'Клиент отсутствует в базе',
'Техническая ошибка поиска'
],
solution: [
'Проверьте правильность ввода ИИН/БИН (12/9 цифр)',
'Попробуйте найти клиента по номеру договора',
'Убедитесь, что клиент активен в системе',
'При технической ошибке повторите попытку через 5 минут'
],
contact: 'Техподдержка: 1111'
},
{
id: 'err_006',
code: 'DUPLICATE_DISCOUNT',
title: 'Дублирующая скидка',
meaning: 'На данный тариф уже оформлена активная скидка',
causes: [
'Скидка уже действует на этом тарифе',
'Есть_pending заявка на скидку',
'Попытка продления без закрытия предыдущей'
],
solution: [
'Проверьте активные скидки клиента',
'Убедитесь, что текущая скидка завершена',
'При необходимости оформите продление',
'Закройте pending-заявку перед созданием новой'
],
contact: null
},
{
id: 'err_007',
code: 'MISSING_FIELD',
title: 'Не заполнено обязательное поле',
meaning: 'Отсутствуют данные в обязательных полях формы',
causes: [
'Не выбрано основание для скидки',
'Не указан размер скидки',
'Не выбран тариф или срок действия'
],
solution: [
'Проверьте все поля, отмеченные звёздочкой (*)',
'Обязательно выберите основание скидки',
'Укажите размер скидки в процентах или тенге',
'Выберите тариф и срок действия'
],
contact: null
},
{
id: 'err_008',
code: 'SYSTEM_ERROR',
title: 'Системная ошибка',
meaning: 'Внутренняя ошибка системы обработки данных',
causes: [
'Временный сбой сервера',
'Превышено время ожидания ответа',
'Ошибка базы данных'
],
solution: [
'Повторите операцию через 1-2 минуты',
'Очистите кэш браузера (Ctrl+Shift+Delete)',
'Попробуйте в другом браузере',
'При повторении ошибки обратитесь в техподдержку'
],
contact: 'helpdesk@kazakhtelecom.kz, 1111'
}
],
// Уроки
lessons: [
{
id: 'lesson_01',
icon: '💡',
title: 'Что такое скидка',
description: 'Основы работы со скидками: виды, условия, ограничения',
duration: '10 мин',
content: `
<h2>Что такое скидка?</h2>
<p><strong>Скидка</strong> — это уменьшение абонентской платы или стоимости услуги для клиента на определённый период.</p>
<h3>Зачем используются скидки?</h3>
<ul>
<li>Удержание существующих клиентов</li>
<li>Привлечение новых абонентов</li>
<li>Поощрение лояльности</li>
<li>Компенсация при жалобах</li>
<li>Продвижение новых тарифов</li>
</ul>
<h3>Когда можно применять скидку?</h3>
<div class="info-box success">
<strong>✅ Можно:</strong>
<ul>
<li>Клиент хочет уйти к конкуренту</li>
<li>Клиент длительное время пользуется услугами</li>
<li>Проводится акция по тарифу</li>
<li>Клиент пожаловался на качество</li>
<li>Клиент подключает несколько услуг</li>
</ul>
</div>
<div class="info-box danger">
<strong>❌ Нельзя:</strong>
<ul>
<li>Без согласования превышать лимит</li>
<li>Применять к архивным тарифам</li>
<li>Создавать скидку без основания</li>
<li>Обещать клиенту невыполнимые условия</li>
</ul>
</div>
<h3>Виды скидок</h3>
<table class="info-table">
<tr>
<th>Тип</th>
<th>Описание</th>
<th>Пример</th>
</tr>
<tr>
<td><strong>Процентная</strong></td>
<td>Снижение на X%</td>
<td>30% от абонентской платы</td>
</tr>
<tr>
<td><strong>Фиксированная</strong></td>
<td>Снижение на X тенге</td>
<td>5 000 ₸ ежемесячно</td>
</tr>
<tr>
<td><strong>Разовая</strong></td>
<td>Единовременное начисление</td>
<td>Бонус за подключение</td>
</tr>
</table>
<h3>Кто имеет право создавать скидку?</h3>
<ul>
<li><strong>Менеджер Call-центра:</strong> до 20%</li>
<li><strong>Старший менеджер:</strong> до 40%</li>
<li><strong>Руководитель отдела:</strong> до 60%</li>
<li><strong>Директор:</strong> без ограничений</li>
</ul>
<div class="quiz-mini">
<h4>📝 Мини-тест</h4>
<p><strong>Вопрос:</strong> Какой максимальный размер скидки может предложить менеджер Call-центра?</p>
<p><em>Ответ: 20% (смотрите таблицу полномочий выше)</em></p>
</div>
`
},
{
id: 'lesson_02',
icon: '📝',
title: 'Как создать скидку',
description: 'Пошаговая инструкция по оформлению скидки',
duration: '15 мин',
content: `
<h2>Пошаговая инструкция: Создание скидки</h2>
<div class="step">
<div class="step-number">1</div>
<h3>Найдите клиента в системе</h3>
<p>Введите ИИН/БИН или номер договора в поиске.</p>
<div class="tip">💡 Убедитесь, что клиент активен и не имеет блокировок</div>
</div>
<div class="step">
<div class="step-number">2</div>
<h3>Выберите тариф для скидки</h3>
<p>Перейдите в раздел "Тарифы клиента" и выберите активный тариф.</p>
<div class="tip">💡 Скидка применяется только к действующим тарифам</div>
</div>
<div class="step">
<div class="step-number">3</div>
<h3>Нажмите "Добавить скидку"</h3>
<p>Откроется форма создания скидки.</p>
<div class="tip">💡 Кнопка находится в карточке тарифа</div>
</div>
<div class="step">
<div class="step-number">4</div>
<h3>Заполните поля формы</h3>
<ul>
<li><strong>Тип скидки:</strong> процентная или фиксированная</li>
<li><strong>Размер:</strong> числовое значение</li>
<li><strong>Срок действия:</strong> от 3 до 24 месяцев</li>
<li><strong>Основание:</strong> выберите из списка</li>
</ul>
<div class="tip">💡 Все поля обязательны для заполнения</div>
</div>
<div class="step">
<div class="step-number">5</div>
<h3>Проверьте данные</h3>
<p>Перед сохранением убедитесь:</p>
<ul>
<li>Размер скидки в пределах вашего лимита</li>
<li>Тариф поддерживает скидки</li>
<li>Срок действия корректен</li>
<li>Основание выбрано</li>
</ul>
</div>
<div class="step">
<div class="step-number">6</div>
<h3>Сохраните скидку</h3>
<p>Нажмите "Создать скидку". Система проверит данные и применит скидку.</p>
<div class="tip">💡 После сохранения скидка отображается в карточке клиента</div>
</div>
<h3>Типичные ошибки при создании</h3>
<ul>
<li>❌ Не выбрано основание — система не сохранит</li>
<li>❌ Превышен лимит — требуется согласование</li>
<li>❌ Неверный срок — используйте стандартные периоды</li>
<li>❌ Дублирование — проверьте активные скидки</li>
</ul>
`
},
{
id: 'lesson_03',
icon: '⚠️',
title: 'Типичные ошибки',
description: 'Разбор частых ошибок и способы их устранения',
duration: '12 мин',
content: `
<h2>Типичные ошибки и их решения</h2>
<div class="error-example">
<h3>Ошибка 1: "Нет прав на создание скидки"</h3>
<p><strong>Причина:</strong> Вы пытаетесь создать скидку выше своего лимита.</p>
<p><strong>Решение:</strong></p>
<ol>
<li>Проверьте свой лимит полномочий</li>
<li>Запросите согласование у руководителя</li>
<li>Или уменьшите размер скидки</li>
</ol>
</div>
<div class="error-example">
<h3>Ошибка 2: "Тариф не найден"</h3>
<p><strong>Причина:</strong> Тариф архивный или недоступен для скидок.</p>
<p><strong>Решение:</strong></p>
<ol>
<li>Проверьте статус тарифа в справочнике</li>
<li>Предложите клиенту актуальный тариф</li>
<li>Переведите клиента на новый тариф, затем примените скидку</li>
</ol>
</div>
<div class="error-example">
<h3>Ошибка 3: "Дублирующая скидка"</h3>
<p><strong>Причина:</strong> На тарифе уже есть активная скидка.</p>
<p><strong>Решение:</strong></p>
<ol>
<li>Проверьте раздел "Активные скидки"</li>
<li>Дождитесь окончания текущей скидки</li>
<li>Или оформите продление вместо новой</li>
</ol>
</div>
<div class="error-example">
<h3>Ошибка 4: "Недопустимый период"</h3>
<p><strong>Причина:</strong> Срок вне допустимого диапазона.</p>
<p><strong>Решение:</strong></p>
<ol>
<li>Минимальный срок: 3 месяца</li>
<li>Максимальный срок: 24 месяца</li>
<li>Используйте стандартные значения: 3, 6, 12, 24</li>
</ol>
</div>
<h3>Таблица: Коды ошибок</h3>
<table class="info-table">
<tr>
<th>Код</th>
<th>Описание</th>
<th>Действие</th>
</tr>
<tr>
<td>403</td>
<td>Нет прав</td>
<td>Согласование</td>
</tr>
<tr>
<td>TARIFF_NOT_FOUND</td>
<td>Тариф не найден</td>
<td>Проверить тариф</td>
</tr>
<tr>
<td>DISCOUNT_LIMIT</td>
<td>Превышен лимит</td>
<td>Уменьшить / согласовать</td>
</tr>
<tr>
<td>INVALID_PERIOD</td>
<td>Неверный период</td>
<td>Исправить срок</td>
</tr>
</table>
`
},
{
id: 'lesson_04',
icon: '🎯',
title: 'Основания для скидки',
description: 'Какие основания указывать и когда',
duration: '8 мин',
content: `
<h2>Основания для предоставления скидки</h2>
<p>Правильный выбор основания важен для отчётности и анализа эффективности скидок.</p>
<h3>1. Лояльность клиента</h3>
<p><strong>Когда использовать:</strong></p>
<ul>
<li>Клиент пользуется услугами более 1 года</li>
<li>Нет жалоб и просрочек</li>
<li>Клиент подключает дополнительные услуги</li>
</ul>
<p><strong>Максимальный размер:</strong> до 25%</p>
<h3>2. Акция / Продвижение</h3>
<p><strong>Когда использовать:</strong></p>
<ul>
<li>Официальная маркетинговая акция</li>
<li>Запуск нового тарифа</li>
<li>Сезонное предложение</li>
</ul>
<p><strong>Максимальный размер:</strong> до 40% (по условиям акции)</p>
<h3>3. Жалоба клиента</h3>
<p><strong>Когда использовать:</strong></p>
<ul>
<li>Клиент пожаловался на качество</li>
<li>Были технические сбои</li>
<li>Недовольство обслуживанием</li>
</ul>
<p><strong>Максимальный размер:</strong> до 50% (компенсация)</p>
<div class="tip">💡 Требуется указание номера жалобы</div>
<h3>4. Удержание клиента</h3>
<p><strong>Когда использовать:</strong></p>
<ul>
<li>Клиент заявил об уходе</li>
<li>Получено заявление на расторжение</li>
<li>Клиент сравнивает с конкурентами</li>
</ul>
<p><strong>Максимальный размер:</strong> до 60%</p>
<div class="tip">💡 Требуется согласование руководителя</div>
<h3>5. Мультиуслуга</h3>
<p><strong>Когда использовать:</strong></p>
<ul>
<li>Подключение 2+ услуг одновременно</li>
<li>Переход на конвергентный тариф</li>
</ul>
<p><strong>Максимальный размер:</strong> до 30%</p>
<div class="quiz-mini">
<h4>📝 Проверка знаний</h4>
<p><strong>Ситуация:</strong> Клиент хочет уйти к конкуренту из-за высокой цены. Какое основание выбрать?</p>
<p><em>Ответ: "Удержание клиента" — это максимальная скидка до 60%</em></p>
</div>
`
}
],
// Инструкции
instructions: [
{
id: 'inst_01',
icon: '📋',
title: 'Создание процентной скидки',
category: 'Базовые операции',
steps: [
'Откройте карточку клиента',
'Перейдите на вкладку "Тарифы"',
'Выберите активный тариф',
'Нажмите кнопку "Добавить скидку"',
'Выберите тип "Процентная"',
'Укажите размер в процентах (например, 30)',
'Выберите срок действия (3/6/12/24 месяца)',
'Выберите основание из списка',
'Нажмите "Проверить" — система покажет итоговую сумму',
'Нажмите "Создать скидку"'
]
},
{
id: 'inst_02',
icon: '💰',
title: 'Создание фиксированной скидки',
category: 'Базовые операции',
steps: [
'Откройте карточку клиента',
'Перейдите на вкладку "Тарифы"',
'Выберите активный тариф',
'Нажмите кнопку "Добавить скидку"',
'Выберите тип "Фиксированная"',
'Укажите сумму в тенге (например, 5000)',
'Выберите срок действия',
'Выберите основание',
'Проверьте, что сумма не превышает абонентскую плату',
'Нажмите "Создать скидку"'
]
},
{
id: 'inst_03',
icon: '🔄',
title: 'Продление существующей скидки',
category: 'Работа с активными скидками',
steps: [
'Найдите клиента в системе',
'Откройте раздел "Активные скидки"',
'Найдите скидку для продления',
'Нажмите кнопку "Продлить"',
'Выберите новый срок действия',
'Проверьте, что основание актуально',
'Нажмите "Подтвердить продление"',
'Система создаст новую скидку со старой даты окончания'
]
},
{
id: 'inst_04',
icon: '❌',
title: 'Отмена / удаление скидки',
category: 'Работа с активными скидками',
steps: [
'Найдите клиента',
'Откройте "Активные скидки"',
'Выберите скидку для отмены',
'Нажмите "Отменить скидку"',
'Укажите причину отмены',
'Подтвердите операцию',
'Скидка будет отменена с текущей даты',
'Перерасчёт выполнится автоматически'
]
},
{
id: 'inst_05',
icon: '📊',
title: 'Проверка лимитов скидки',
category: 'Контроль',
steps: [
'Откройте свой профиль пользователя',
'Перейдите в раздел "Полномочия"',
'Найдите таблицу "Лимиты на скидки"',
'Определите свой максимальный процент',
'При создании скидки система автоматически проверит лимит',
'При превышении потребуется согласование'
]
},
{
id: 'inst_06',
icon: '📄',
title: 'Запрос согласования скидки',
category: 'Согласования',
steps: [
'При создании скидки с превышением лимита система предложит "Запросить согласование"',
'Нажмите эту кнопку',
'Заполните обоснование (почему нужна такая скидка)',
'Прикрепите документы при необходимости',
'Выберите руководителя для согласования',
'Отправьте запрос',
'Отслеживайте статус в разделе "Мои согласования"',
'После согласования скидка будет доступна для создания'
]
}
],
// FAQ
faq: [
{
id: 'faq_01',
question: 'Как создать скидку?',
answer: 'Откройте карточку клиента → Выберите тариф → Нажмите "Добавить скидку" → Заполните форму (тип, размер, срок, основание) → Проверьте данные → Нажмите "Создать". Подробная инструкция в разделе "Обучение" → "Как создать скидку".'
},
{
id: 'faq_02',
question: 'Почему скидка не применяется?',
answer: 'Возможные причины: 1) Превышен ваш лимит — запросите согласование; 2) Тариф не поддерживает скидки — выберите другой; 3) Уже есть активная скидка — дождитесь окончания или продлите; 4) Не заполнены обязательные поля — проверьте форму.'
},
{
id: 'faq_03',
question: 'Почему не отображается тариф?',
answer: 'Тариф может быть: 1) Архивным (выведен из эксплуатации); 2) Неактивным (истёк срок); 3) Недоступным для вашего региона. Проверьте статус тарифа в справочнике или предложите клиенту актуальные тарифы.'
},
{
id: 'faq_04',
question: 'Как изменить размер скидки?',
answer: 'Изменить активную скидку нельзя. Нужно: 1) Отменить текущую скидку; 2) Создать новую с нужным размером. Убедитесь, что новый размер в пределах вашего лимита.'
},
{
id: 'faq_05',
question: 'Какие поля обязательны?',
answer: 'Все поля формы обязательны: тип скидки, размер, срок действия, основание. Без заполнения любого из них система не сохранит скидку.'
},
{
id: 'faq_06',
question: 'Что делать, если появилась ошибка?',
answer: '1) Запишите код ошибки; 2) Откройте раздел "Ошибки" и найдите код; 3) Следуйте пошаговому решению; 4) Если не помогло — обратитесь в техподдержку (контакты указаны в карточке ошибки).'
},
{
id: 'faq_07',
question: 'Куда обращаться при технической ошибке?',
answer: 'При системных ошибках (код SYSTEM_ERROR, таймауты, сбои): 1) Повторите через 5 минут; 2) Очистите кэш браузера; 3) Если не помогло — helpdesk@kazakhtelecom.kz, внутренний номер 1111.'
},
{
id: 'faq_08',
question: 'Какой максимальный размер скидки я могу предложить?',
answer: 'Зависит от вашей роли: Менеджер Call-центра — до 20%; Старший менеджер — до 40%; Руководитель отдела — до 60%; Директор — без ограничений. Проверьте свои полномочия в профиле.'
},
{
id: 'faq_09',
question: 'Можно ли применить скидку к архивному тарифу?',
answer: 'Нет, к архивным тарифам скидки не применяются. Предложите клиенту перейти на актуальный тариф, затем примените скидку.'
},
{
id: 'faq_10',
question: 'Как проверить, какие скидки активны у клиента?',
answer: 'В карточке клиента откройте вкладку "Активные скидки". Там отображаются все действующие скидки с датами начала и окончания, размером и основанием.'
}
],
// Тесты
tests: [
{
id: 'test_main',
title: 'Готов к работе со скидками',
description: 'Итоговый тест по работе со скидками',
questions: [
{
question: 'Какое действие необходимо выполнить первым при создании скидки?',
answers: [
'Выбрать размер скидки',
'Найти клиента в системе',
'Сохранить заявку',
'Отправить клиенту'
],
correct: 1,
explanation: 'Первым шагом нужно найти клиента в системе по ИИН/БИН или номеру договора.'
},
{
question: 'Максимальный размер скидки для менеджера Call-центра:',
answers: ['10%', '20%', '30%', '40%'],
correct: 1,
explanation: 'Менеджер Call-центра может самостоятельно предлагать скидку до 20%.'
},
{
question: 'Минимальный срок действия скидки:',
answers: ['1 месяц', '3 месяца', '6 месяцев', '12 месяцев'],
correct: 1,
explanation: 'Минимальный срок действия скидки — 3 месяца.'
},
{
question: 'Что делать, если система выдаёт ошибку "Нет прав на создание скидки"?',
answers: [
'Повторить попытку',
'Запросить согласование у руководителя',
'Обратиться в техподдержку',
'Уменьшить размер скидки или запросить согласование'
],
correct: 3,
explanation: 'Нужно либо уменьшить размер скидки до своего лимита, либо запросить согласование.'
},
{
question: 'Какое основание выбрать, если клиент хочет уйти к конкуренту?',
answers: ['Лояльность', 'Акция', 'Удержание клиента', 'Жалоба'],
correct: 2,
explanation: '"Удержание клиента" — специальное основание для таких ситуаций, максимальная скидка до 60%.'
},
{
question: 'Можно ли изменить активную скидку?',
answers: ['Да, в любой момент', 'Нет, нужно отменить и создать новую', 'Только размер', 'Только срок'],
correct: 1,
explanation: 'Изменить активную скидку нельзя. Нужно отменить текущую и создать новую.'
},
{
question: 'Что означает ошибка TARIFF_NOT_FOUND?',
answers: [
'Неверный пароль',
'Тариф архивный или недоступен',
'Клиент не найден',
'Системный сбой'
],
correct: 1,
explanation: 'Эта ошибка означает, что выбранный тариф архивный или недоступен для скидок.'
},
{
question: 'Какое поле НЕ является обязательным при создании скидки?',
answers: ['Тип скидки', 'Размер', 'Основание', 'Все поля обязательны'],
correct: 3,
explanation: 'Все поля формы обязательны для заполнения.'
},
{
question: 'Максимальный срок действия скидки:',
answers: ['6 месяцев', '12 месяцев', '18 месяцев', '24 месяца'],
correct: 3,
explanation: 'Максимальный срок действия скидки — 24 месяца.'
},
{
question: 'Что делать при ошибке "Дублирующая скидка"?',
answers: [
'Создать новую скидку',
'Проверить активные скидки и дождаться окончания',
'Обратиться в техподдержку',
'Удалить клиента'
],
correct: 1,
explanation: 'Нужно проверить активные скидки клиента и дождаться окончания текущей или оформить продление.'
},
{
question: 'Какое основание даёт максимальный размер скидки?',
answers: ['Лояльность', 'Акция', 'Удержание клиента', 'Жалоба'],
correct: 2,
explanation: '"Удержание клиента" позволяет предложить скидку до 60%.'
},
{
question: 'Куда обращаться при системной ошибке SYSTEM_ERROR?',
answers: [
'Руководителю',
'В техподдержку (helpdesk@kazakhtelecom.kz, 1111)',
'Клиенту',
'В отдел кадров'
],
correct: 1,
explanation: 'При системных ошибках нужно обратиться в техподдержку.'
}
]
}
],
// Тарифы для калькулятора
tariffs: [
{ id: 't1', name: 'Интернет ЕШДИ 100', price: 5990 },
{ id: 't2', name: 'Интернет ЕШДИ 200', price: 7990 },
{ id: 't3', name: 'Интернет ЕШДИ 500', price: 10990 },
{ id: 't4', name: 'Домашний телефон + Интернет', price: 4990 },
{ id: 't5', name: 'Триколор (ТВ + Интернет + Телефон)', price: 8990 }
],
// Быстрые решения
quickSolutions: {
'not-created': {
title: 'Не создается скидка',
steps: [
'Проверьте, все ли обязательные поля заполнены (тип, размер, срок, основание)',
'Убедитесь, что размер скидки не превышает ваш лимит',
'Проверьте, что тариф активен и поддерживает скидки',
'Убедитесь, что нет активной скидки на этом тарифе',
'Проверьте срок действия (от 3 до 24 месяцев)'
],
contact: 'Если проблема не решена — раздел "Ошибки" или техподдержка 1111'
},
'error': {
title: 'Появилась ошибка',
steps: [
'Запишите код ошибки (например, 403, TARIFF_NOT_FOUND)',
'Откройте раздел "Ошибки" и найдите код',
'Следуйте пошаговому решению из карточки ошибки',
'Если ошибки нет в справочнике — используйте AI-помощника',
'При технической ошибке повторите через 5 минут'
],
contact: 'helpdesk@kazakhtelecom.kz'
},
'no-tariff': {
title: 'Не вижу нужный тариф',
steps: [
'Проверьте, активен ли тариф у клиента',
'Убедитесь, что тариф не архивный',
'Сверьте код тарифа с официальным каталогом',
'Проверьте доступность тарифа в вашем регионе',
'Предложите клиенту актуальные тарифы из каталога'
],
contact: 'Отдел продуктового маркетинга: 2222'
},
'cant-change': {
title: 'Не могу изменить скидку',
steps: [
'Активную скидку изменить нельзя',
'Отмените текущую скидку (раздел "Активные скидки")',
'Создайте новую скидку с нужными параметрами',
'Убедитесь, что новый размер в пределах лимита',
'Перерасчёт выполнится автоматически'
],
contact: null
},
'which-choose': {
title: 'Какую скидку выбрать',
steps: [
'Определите цель: удержание, лояльность, жалоба, акция',
'Проверьте свой лимит полномочий',
'Для удержания — до 60% (требует согласования)',
'Для лояльности — до 25%',
'При жалобе — до 50% (компенсация)',
'По акции — до 40% (по условиям акции)'
],
contact: null
},
'check-conditions': {
title: 'Проверить условия',
steps: [
'Откройте карточку клиента',
'Проверьте активные тарифы',
'Откройте "Активные скидки"',
'Убедитесь, что нет дублирующих скидок',
'Проверьте срок действия текущих скидок',
'Сверьте лимиты в своём профиле'
],
contact: null
}
}
};

355
discount-helper/index.html Normal file
View File

@ -0,0 +1,355 @@
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Помощник по скидкам</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="app">
<!-- Sidebar -->
<aside class="sidebar" id="sidebar">
<div class="sidebar-header">
<div class="logo">
<span class="logo-icon">🎯</span>
<span class="logo-text">Помощник по скидкам</span>
</div>
<button class="btn-icon close-sidebar" id="closeSidebar">&times;</button>
</div>
<nav class="nav">
<a href="#" class="nav-item active" data-page="home">
<span class="nav-icon">🏠</span>
<span class="nav-text">Главная</span>
</a>
<a href="#" class="nav-item" data-page="search">
<span class="nav-icon">🔎</span>
<span class="nav-text">Найти ответ</span>
</a>
<a href="#" class="nav-item" data-page="learning">
<span class="nav-icon">📚</span>
<span class="nav-text">Обучение</span>
</a>
<a href="#" class="nav-item" data-page="errors">
<span class="nav-icon">⚠️</span>
<span class="nav-text">Ошибки</span>
</a>
<a href="#" class="nav-item" data-page="calculator">
<span class="nav-icon">🧮</span>
<span class="nav-text">Расчет скидки</span>
</a>
<a href="#" class="nav-item" data-page="instructions">
<span class="nav-icon">📖</span>
<span class="nav-text">Инструкции</span>
</a>
<a href="#" class="nav-item" data-page="assistant">
<span class="nav-icon">🤖</span>
<span class="nav-text">Помощник</span>
</a>
<a href="#" class="nav-item" data-page="faq">
<span class="nav-icon">❓</span>
<span class="nav-text">FAQ</span>
</a>
<a href="#" class="nav-item" data-page="tests">
<span class="nav-icon">📝</span>
<span class="nav-text">Тесты</span>
</a>
</nav>
<div class="sidebar-footer">
<a href="#" class="nav-item" data-page="admin">
<span class="nav-icon">⚙️</span>
<span class="nav-text">Админ-панель</span>
</a>
</div>
</aside>
<!-- Main Content -->
<main class="main-content">
<!-- Mobile Header -->
<header class="mobile-header">
<button class="btn-icon" id="openSidebar">☰</button>
<span class="mobile-title">Помощник по скидкам</span>
</header>
<!-- Page: Home -->
<section class="page active" id="page-home">
<div class="hero">
<h1 class="hero-title">Чем могу помочь?</h1>
<div class="search-box">
<input type="text" class="search-input" id="homeSearchInput" placeholder="Введите вопрос… Например: Как создать скидку на тариф?">
<button class="btn btn-primary" id="homeSearchBtn">Найти ответ</button>
</div>
<div class="quick-questions">
<span class="qq-label">Популярные вопросы:</span>
<button class="qq-btn" data-q="Как создать скидку?">Как создать скидку?</button>
<button class="qq-btn" data-q="Почему не проходит скидка?">Почему не проходит скидка?</button>
<button class="qq-btn" data-q="Что означает ошибка?">Что означает ошибка?</button>
<button class="qq-btn" data-q="Какие условия заполнить?">Какие условия заполнить?</button>
</div>
</div>
<div class="upload-section">
<div class="upload-card" id="uploadDropzone">
<div class="upload-icon">📎</div>
<h3>Загрузить скриншот ошибки</h3>
<p>Перетащите изображение сюда или нажмите для загрузки</p>
<input type="file" id="uploadInput" accept="image/*" style="display: none;">
<button class="btn btn-secondary" id="uploadBtn">Загрузить изображение</button>
</div>
</div>
<div class="quick-solutions">
<h2 class="section-title">Быстрые решения</h2>
<div class="solutions-grid">
<div class="solution-card solution-red" data-solution="not-created">
<div class="solution-icon">🔴</div>
<h3>Не создается скидка</h3>
</div>
<div class="solution-card solution-orange" data-solution="error">
<div class="solution-icon">🟠</div>
<h3>Появилась ошибка</h3>
</div>
<div class="solution-card solution-yellow" data-solution="no-tariff">
<div class="solution-icon">🟡</div>
<h3>Не вижу тариф</h3>
</div>
<div class="solution-card solution-blue" data-solution="cant-change">
<div class="solution-icon">🔵</div>
<h3>Не могу изменить</h3>
</div>
<div class="solution-card solution-purple" data-solution="which-choose">
<div class="solution-icon">🟣</div>
<h3>Какую скидку выбрать</h3>
</div>
<div class="solution-card solution-green" data-solution="check-conditions">
<div class="solution-icon">🟢</div>
<h3>Проверить условия</h3>
</div>
</div>
</div>
<div class="features-grid">
<div class="feature-card" data-page="learning">
<div class="feature-icon">📚</div>
<h3>Обучение</h3>
<p>Пошаговые уроки по работе со скидками</p>
</div>
<div class="feature-card" data-page="errors">
<div class="feature-icon">⚠️</div>
<h3>Ошибки</h3>
<p>Справочник ошибок и решений</p>
</div>
<div class="feature-card" data-page="instructions">
<div class="feature-icon">📖</div>
<h3>Инструкции</h3>
<p>Пошаговые руководства</p>
</div>
<div class="feature-card" data-page="assistant">
<div class="feature-icon">🤖</div>
<h3>AI-помощник</h3>
<p>Ответы на любые вопросы</p>
</div>
</div>
</section>
<!-- Page: Search -->
<section class="page" id="page-search">
<h1 class="page-title">Поиск по базе знаний</h1>
<div class="search-section">
<input type="text" class="search-input large" id="searchInput" placeholder="Введите запрос… Например: скидка не создается">
<button class="btn btn-primary btn-large" id="searchBtn">Найти</button>
</div>
<div class="search-results" id="searchResults"></div>
</section>
<!-- Page: Learning -->
<section class="page" id="page-learning">
<h1 class="page-title">Обучение</h1>
<div class="lessons-list" id="lessonsList"></div>
</section>
<!-- Page: Errors -->
<section class="page" id="page-errors">
<h1 class="page-title">Справочник ошибок</h1>
<div class="search-section">
<input type="text" class="search-input" id="errorSearchInput" placeholder="Введите код или текст ошибки…">
</div>
<div class="errors-grid" id="errorsGrid"></div>
</section>
<!-- Page: Calculator -->
<section class="page" id="page-calculator">
<h1 class="page-title">Расчет скидки</h1>
<div class="calculator-card">
<div class="form-group">
<label>Тариф</label>
<select class="input-select" id="calcTariff"></select>
</div>
<div class="form-group">
<label>Тип скидки</label>
<select class="input-select" id="calcType">
<option value="percent">Процентная</option>
<option value="fixed">Фиксированная</option>
</select>
</div>
<div class="form-group">
<label>Размер скидки</label>
<input type="number" class="input" id="calcAmount" placeholder="30" min="0" max="100">
</div>
<div class="form-group">
<label>Срок действия</label>
<select class="input-select" id="calcPeriod">
<option value="3">3 месяца</option>
<option value="6">6 месяцев</option>
<option value="12" selected>12 месяцев</option>
<option value="24">24 месяца</option>
</select>
</div>
<div class="form-group">
<label>Основание</label>
<select class="input-select" id="calcReason">
<option value="">Выберите основание</option>
<option value="loyalty">Лояльность клиента</option>
<option value="promotion">Акция</option>
<option value="complaint">Жалоба клиента</option>
<option value="retention">Удержание клиента</option>
</select>
</div>
<button class="btn btn-primary btn-large" id="calcBtn">Рассчитать</button>
<div class="calc-result" id="calcResult" style="display: none;"></div>
</div>
</section>
<!-- Page: Instructions -->
<section class="page" id="page-instructions">
<h1 class="page-title">Инструкции</h1>
<div class="instructions-list" id="instructionsList"></div>
</section>
<!-- Page: Assistant -->
<section class="page" id="page-assistant">
<h1 class="page-title">🤖 Помощник по скидкам</h1>
<div class="assistant-container">
<div class="chat-messages" id="chatMessages">
<div class="message bot">
<div class="message-content">
<p>Здравствуйте! Я ваш помощник по скидкам.</p>
<p>Задайте мне любой вопрос, например:</p>
<ul>
<li>Как создать скидку на тариф?</li>
<li>Почему не проходит скидка 30%?</li>
<li>Что означает ошибка 403?</li>
</ul>
</div>
</div>
</div>
<div class="chat-input">
<input type="text" class="search-input" id="chatInput" placeholder="Введите ваш вопрос…">
<button class="btn btn-primary" id="chatSendBtn">➤</button>
</div>
<div class="feedback-block" id="feedbackBlock" style="display: none;">
<span>Ответ помог?</span>
<button class="btn-icon feedback-btn" id="feedbackYes">👍</button>
<button class="btn-icon feedback-btn" id="feedbackNo">👎</button>
</div>
</div>
</section>
<!-- Page: FAQ -->
<section class="page" id="page-faq">
<h1 class="page-title">Частые вопросы</h1>
<div class="faq-list" id="faqList"></div>
</section>
<!-- Page: Tests -->
<section class="page" id="page-tests">
<h1 class="page-title">Проверка знаний</h1>
<div class="tests-intro" id="testsIntro">
<p>Пройдите тест, чтобы проверить свои знания по работе со скидками.</p>
<button class="btn btn-primary btn-large" id="startTestBtn">Начать тест</button>
</div>
<div class="test-container" id="testContainer" style="display: none;">
<div class="test-progress">
<div class="progress-bar">
<div class="progress-fill" id="testProgress"></div>
</div>
<span class="test-counter" id="testCounter">1/10</span>
</div>
<div class="test-question" id="testQuestion"></div>
<div class="test-answers" id="testAnswers"></div>
<div class="test-feedback" id="testFeedback"></div>
<button class="btn btn-primary" id="nextQuestionBtn" style="display: none;">Следующий вопрос</button>
</div>
<div class="test-result" id="testResult" style="display: none;">
<h2>Результат</h2>
<div class="result-score" id="resultScore"></div>
<p class="result-message" id="resultMessage"></p>
<button class="btn btn-primary" id="restartTestBtn">Пройти заново</button>
</div>
</section>
<!-- Page: Admin -->
<section class="page" id="page-admin">
<h1 class="page-title">Админ-панель</h1>
<div class="admin-tabs">
<button class="admin-tab active" data-tab="errors">Ошибки</button>
<button class="admin-tab" data-tab="faq">FAQ</button>
<button class="admin-tab" data-tab="lessons">Уроки</button>
<button class="admin-tab" data-tab="instructions">Инструкции</button>
<button class="admin-tab" data-tab="tests">Тесты</button>
</div>
<div class="admin-content">
<div class="admin-panel active" id="admin-errors"></div>
<div class="admin-panel" id="admin-faq"></div>
<div class="admin-panel" id="admin-lessons"></div>
<div class="admin-panel" id="admin-instructions"></div>
<div class="admin-panel" id="admin-tests"></div>
</div>
</section>
<!-- Modal: Error Details -->
<div class="modal-overlay" id="errorModal" style="display: none;">
<div class="modal modal-large">
<div class="modal-header">
<h2 id="errorModalTitle">Ошибка</h2>
<button class="btn-close" id="closeErrorModal">&times;</button>
</div>
<div class="modal-body" id="errorModalBody"></div>
</div>
</div>
<!-- Modal: Upload Result -->
<div class="modal-overlay" id="uploadModal" style="display: none;">
<div class="modal modal-large">
<div class="modal-header">
<h2>Результат анализа</h2>
<button class="btn-close" id="closeUploadModal">&times;</button>
</div>
<div class="modal-body" id="uploadModalBody">
<div class="upload-loading">
<div class="spinner"></div>
<p>Анализирую изображение…</p>
</div>
</div>
</div>
</div>
<!-- Modal: Lesson -->
<div class="modal-overlay" id="lessonModal" style="display: none;">
<div class="modal modal-xlarge">
<div class="modal-header">
<h2 id="lessonModalTitle">Урок</h2>
<button class="btn-close" id="closeLessonModal">&times;</button>
</div>
<div class="modal-body" id="lessonModalBody"></div>
</div>
</div>
</main>
</div>
<script src="data.js"></script>
<script src="app.js"></script>
</body>
</html>

1183
discount-helper/style.css Normal file

File diff suppressed because it is too large Load Diff