This commit is contained in:
tikeev.k
2026-06-01 17:38:44 +03:00
commit 4548a57f83
14 changed files with 2989 additions and 0 deletions

170
bot/taxonomy.py Normal file
View File

@@ -0,0 +1,170 @@
"""Справочник разделов и подтем заявок.
Источник правды — схема ~/Рабочий стол/древо.drawio. Структура повторяет
дерево решений из этой схемы: SECTIONS — корневые разделы, TOPICS — подтемы
первого уровня, SUBTOPICS — дополнительный уровень для редких случаев.
"""
from __future__ import annotations
# (code, label) — код хранится в callback_data, label показывается пользователю
# и пишется в БД (поле department).
SECTIONS: list[tuple[str, str]] = [
("phone", "Телефония"),
("call_center", "Коллцентр / Скорозвон"),
("amocrm", "AmoCRM"),
("bitrix", "Битрикс"),
("onec", "1С"),
("mail", "Почта"),
("pc", "Не работает ПК / программа"),
("printer", "Принтер / сканер"),
("order", "Заказ техники"),
("employee", "Создание / удаление сотрудника"),
("other", "Другое"),
]
TOPICS: dict[str, list[tuple[str, str]]] = {
"phone": [
("no_calls", "Нет входящих / исходящих звонков"),
("bad_sound", "Плохая слышимость / шум"),
("headset", "Не работает гарнитура"),
("ext_number", "Добавить / изменить внутренний номер"),
("sip", "Настройка SIP / softphone"),
("other", "Другое"),
],
"call_center": [
("no_leads", "Не передаются лиды в CRM"),
("new_script", "Нужно создать новый сценарий"),
("edit_script", "Изменить сценарий"),
("headset", "Не работает гарнитура в Скорозвоне"),
("connect_emp", "Подключить сотрудника к Скорозвону"),
("other", "Другое"),
],
"amocrm": [
("no_login", "Не получается зайти в аккаунт"),
("no_notify", "Не приходят уведомления"),
("no_contact", "Не отображается контакт"),
("no_funnel", "Не отображается воронка"),
("create_lead", "Создать пустые карточки / лид"),
("no_call", "Нет звонка"),
("no_chat", "Нет переписки"),
("no_tasks", "Не создаются задачи"),
("other", "Другое"),
],
"bitrix": [
("portal_down", "Не работает портал"),
("no_funnel", "Не отображается воронка"),
("crm_error", "Ошибка CRM"),
("bp_broken", "Не работает бизнес-процесс"),
("lead_route", "Проблема с распределением лидов"),
("no_notify", "Не приходят уведомления"),
("no_fields", "Не отображаются поля"),
("no_deals", "Не отображаются сделки"),
("other", "Другое"),
],
"onec": [
("no_start", "Не запускается"),
("no_access", "Нет доступа"),
("db_error", "Ошибка базы"),
("slow", "Медленно работает"),
("sync_error", "Ошибка синхронизации"),
("no_print", "Не печатает документы"),
("user_setup", "Нужна настройка пользователя"),
("other", "Другое"),
],
"mail": [
("send_recv", "Не приходят / не отправляются письма"),
("forgot_pass", "Забыт пароль"),
("setup", "Настройка почты"),
("spam", "Спам / вирусное письмо"),
("attachments", "Проблема с вложениями"),
("other", "Другое"),
],
"pc": [
("no_power", "ПК не включается"),
("no_internet", "Нет интернета"),
("slow", "Медленно работает"),
("app_no_start", "Не запускается программа"),
("rdp", "Не работает RDP"),
("av_devices", "Нет звука / микрофона / камеры"),
("files_access", "Проблема с файлами / доступом"),
("install", "Нужна установка / обновление ПО"),
("other", "Другое"),
],
"printer": [
("no_print", "Не печатает"),
("no_scan", "Не сканирует"),
("paper_jam", "Замятие бумаги"),
("no_conn", "Нет подключения"),
("no_toner", "Закончился тонер / краска"),
("print_errors", "Печатает с ошибками"),
("other", "Другое"),
],
"order": [
("laptop", "Ноутбук"),
("aio", "Моноблок"),
("headset", "Гарнитура"),
("phone", "Телефон"),
("peripherals", "Клавиатура / мышь / периферия"),
("other", "Другое"),
],
"employee": [
("create", "Создать сотрудника"),
("remove", "Удалить сотрудника"),
("grant", "Выдать доступы"),
("revoke", "Заблокировать доступы"),
("mail", "Создать почту"),
("setup_place", "Настроить рабочее место"),
("change_dept", "Изменить отдел / должность"),
("other", "Другое"),
],
"other": [
("manual", "Описать проблему вручную"),
("consult", "Консультация"),
("attach", "Прикрепить файл / скриншот"),
("specialist", "Связаться со специалистом"),
],
}
# Третий уровень: уточнение для конкретной подтемы. В схеме сейчас есть только
# один такой случай — «Нет звонков» в Телефонии: уточняем в какой CRM.
SUBTOPICS: dict[tuple[str, str], list[tuple[str, str]]] = {
("phone", "no_calls"): [
("amocrm", "AmoCRM"),
("info_hub", "Info-hub"),
("crm", "CRM"),
],
}
# Инструкции, которые показываем пользователю перед созданием заявки.
# Ключ — (section_code, topic_code). Структура готова, тексты впишутся отдельно.
# Если записи нет — после выбора темы сразу идём дальше (без шага инструкции).
INSTRUCTIONS: dict[tuple[str, str], str] = {}
def section_label(code: str) -> str:
for c, label in SECTIONS:
if c == code:
return label
return code
def topic_label(section_code: str, topic_code: str) -> str:
for c, label in TOPICS.get(section_code, []):
if c == topic_code:
return label
return topic_code
def subtopic_label(section_code: str, topic_code: str, subtopic_code: str) -> str:
for c, label in SUBTOPICS.get((section_code, topic_code), []):
if c == subtopic_code:
return label
return subtopic_code
def has_subtopics(section_code: str, topic_code: str) -> bool:
return bool(SUBTOPICS.get((section_code, topic_code)))
def instruction_for(section_code: str, topic_code: str) -> str | None:
return INSTRUCTIONS.get((section_code, topic_code))