171 lines
8.0 KiB
Python
171 lines
8.0 KiB
Python
"""Справочник разделов и подтем заявок.
|
||
|
||
Источник правды — схема ~/Рабочий стол/древо.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))
|