Files
tg_zayavka/bot/taxonomy.py
tikeev.k 4548a57f83 .
2026-06-01 17:38:44 +03:00

171 lines
8.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Справочник разделов и подтем заявок.
Источник правды — схема ~/Рабочий стол/древо.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))