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