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

122
README.md Normal file
View File

@@ -0,0 +1,122 @@
# Telegram IT Ticket Bot
Бот создает IT-заявки по логике из блок-схемы: сотрудник выбирает направление, тему проблемы, получает короткую инструкцию, а если проблема не решена, бот собирает детали и сохраняет заявку в SQLite.
## Быстрый старт
1. Создайте бота в Telegram через BotFather и получите токен.
2. Скопируйте настройки:
```bash
cp .env.example .env
```
3. Заполните `.env`:
```env
BOT_TOKEN=ваш_токен
ADMIN_DEPARTMENTS=7350810301:IT;123456789:HR,Финансы
DATABASE_PATH=/app/data/tickets.db
SLA_MINUTES=60
```
`ADMIN_DEPARTMENTS` задает права администраторов по отделам:
```env
telegram_id:Отдел
telegram_id:Отдел1,Отдел2
```
Пример: `7350810301:IT` значит, что этот админ видит и управляет только заявками отдела `IT`.
4. Запустите:
```bash
docker compose up --build -d
```
5. Откройте Telegram и напишите боту `/start`.
## Команды
`/start` - главное меню сотрудника.
`/admin` - панель администратора: сводка по статусам и фильтры заявок.
`/find <номер>` - открыть конкретную заявку по номеру (только для администраторов).
## Для сотрудника
В разделе «Мои заявки» по активной заявке доступна кнопка **«💬 Добавить
комментарий»**: текст попадает в историю заявки и приходит уведомлением исполнителю
(а если заявку ещё не взяли — всем администраторам отдела). Внутренние заметки
администраторов сотруднику не показываются.
**Проверка дубликатов.** Если перед созданием у сотрудника уже есть открытая заявка
по той же теме, бот не плодит дубль, а предлагает выбор: **«Дополнить заявку #N»**
(введённое описание и вложение уходят комментарием к существующей заявке и
уведомлением исполнителю) или **«Создать новую заявку»**. Если старая заявка к этому
моменту уже закрыта, бот просто создаёт новую.
**Чат с поддержкой.** По активной заявке есть кнопка **«💬 Чат с поддержкой»** — это
живое общение, а не комментарии: сотрудник просто пишет сообщения, они идут исполнителю
(или администраторам отдела), «❌ Завершить чат» выходит из режима. Отдельная кнопка
**«💬 Добавить комментарий»** остаётся для заметок к заявке.
**Закрыть свою заявку.** По активной заявке сотрудник может нажать **«✅ Вопрос решён,
закрыть»** (с подтверждением) — если проблема решилась сама. Исполнителю уходит
уведомление; при необходимости администратор может переоткрыть заявку.
**Скриншот** запрашивается только для темы «Ошибка программы». Для остальных тем шаг
вложения пропускается. Шаг «удобное время визита» убран.
## Панель администратора
`/admin` открывает дашборд со счётчиками (открытые, новые, в работе, ожидание,
отложенные, просроченные) и кнопками-фильтрами, а также поиском по номеру и архивом.
Из карточки заявки доступны действия по всему жизненному циклу:
- **Взять в работу / Перехватить / Вернуть в работу** — назначение на себя.
- **Назначить** — передать заявку другому администратору отдела.
- **Закрыть** — со своим текстом решения (а не фиксированным «Выполнено»).
- **Отклонить** — с указанием причины.
- **В ожидание** — статус «ждём ответа заявителя» с уведомлением сотрудника.
- **Отложить** — с выбором причины из готового списка «быстрых ответов» (ждём
запчасти, согласуем время и т.д.) или своей причины; причина уходит заявителю
и пишется в историю.
- **Переоткрыть** — вернуть закрытую/отклонённую заявку в работу.
- **Приоритет** — низкий / средний / высокий / критичный.
- **Заметка** — внутренний комментарий (не виден заявителю).
- **Чат** — живая переписка с заявителем. Исполнитель пишет сообщения (текст/фото),
заявитель получает их и, нажав «💬 Ответить», входит в чат и просто пишет в ответ —
без оформления «комментариев». Сообщения с обеих сторон попадают в историю заявки
как переписка. «Закрыть чат» / «Завершить чат» завершает режим у каждой стороны.
- **История** — полный журнал изменений по заявке.
Статусы: `Новая`, `В работе`, `Ожидание ответа`, `Отложена`, `Закрыта`, `Отклонена`.
Новые заявки создаются с приоритетом «средний»; приоритет меняет администратор.
### SLA и эскалация
Дедлайн считается от времени создания плюс `SLA_MINUTES`. Просроченные заявки
помечаются 🔴 в списках и карточке. Фоновая задача раз в минуту находит просроченные
заявки и один раз отправляет администраторам отдела уведомление об эскалации.
## Данные
SQLite-база хранится в `./data/tickets.db`, каталог подключен в контейнер как volume.
При запуске на старой базе схема мигрирует автоматически (добавляются поля приоритета,
SLA и таблицы истории/пользователей) — данные не теряются.
Таблицы:
- `tickets` — заявки (статус, приоритет, исполнитель, время создания, SLA-флаг).
- `ticket_events` — журнал событий и комментарии по каждой заявке.
- `users` — имена пользователей/администраторов (для отображения исполнителя).
## Что удобно добавить перед интеграцией с сайтом
- Авторизацию по телефону, корпоративному ID или коду.
- Экспорт заявок и истории в API будущего сайта.
- Настраиваемый SLA и приоритет на уровне отдела/темы.
- Отчёты и выгрузку статистики по исполнителям.