Important
ПРАВИЛА ДЛЯ РАЗРАБОТЧИКОВ:
- Вся документация по данному приложению ведется исключительно на русском языке.
- Комментарии в коде должны быть подробными и на русском языке.
- Любые изменения или дополнения функционала должны обязательно отражаться как в текстовой документации (
README.md,FEATURES.md), так и в графических блок-схемах (docs/DIAGRAMS.md). - Соблюдение структуры и профессионального уровня документации является обязательным.
Система управления заявками сотрудников с интеграцией Telegram Mini App для 5000+ пользователей.
-
МТО (Материально-техническое обеспечение)
- Заказа спецодежды и формы
- Получение документов, удостоверений и бейджей
-
Лицензирование
- Лицензии охранника и разрешения на оружие
- Медицинские книжки и допуски
-
Финансы
- Вопросы по зарплате (удержания/начисления)
- Получение справок (2-НДФЛ, для банка и т.д.)
-
Кадры (HR)
- Кадровые вопросы (отпуска, переводы)
- Бытовые условия (общежитие, питание, транспорт)
-
Подработки
- Заявка на конкретную смену (доска заказов)
- Общая заявка (готовность подрабатывать)
-
Анонимные сообщения
- Сообщения о нарушениях, коррупции, безопасности
- Полная конфиденциальность
-
График
- Обмен сменами
- Управление рабочим временем
- ✅ Умное автозаполнение - ФИО, табельный номер, объект и телефон подтягиваются из профиля
- ✅ Свободный ввод - Текстовые поля для комментариев на каждом этапе
- ✅ Вложение файлов - Загрузка фото, видео, аудио и документов (до 5 файлов по 5 МБ)
- ✅ Статусы заявок - Принято, В работе, Решено, Связаться
- ✅ Приоритет по телефону - Кнопка "Связаться" для срочных вопросов
- ✅ Валидация форм - Проверка обязательных полей
- ✅ Отзывчивый дизайн - Оптимизация для мобильных устройств
src/
├── app/
│ ├── api/
│ │ └── requests/
│ │ ├── route.ts # CRUD операций с заявками
│ │ └── [id]/route.ts # Операции с конкретной заявкой
│ └── page.tsx # Главная страница Mini App
├── components/
│ ├── forms/
│ │ ├── RequestForm.tsx # Универсальный компонент формы
│ │ ├── MTOForms.tsx # Формы блока МТО
│ │ ├── LicensingFinanceForms.tsx # Формы лицензирования и финансов
│ │ ├── HRGigAnonymousForms.tsx # Формы HR, подработок и анонимных сообщений
│ │ └── ScheduleForms.tsx # Формы графика
│ └── ui/ # shadcn/ui компоненты
├── lib/
│ └── db.ts # Prisma клиент
└── prisma/
└── schema.prisma # Схема базы данных
- Frontend: Next.js 16, React 18, TypeScript 5
- UI Library: shadcn/ui с Lucide icons
- Styling: Tailwind CSS 4
- Database: Prisma ORM + SQLite (можно переключить на PostgreSQL/MySQL)
- API: Next.js API Routes
bun installbun run db:pushbun run devПриложение будет доступно по адресу http://localhost:3000
Получить заявки пользователя
Query параметры:
userId- ID пользователя (опционально)telegramId- Telegram ID пользователя (опционально)
Ответ:
{
"requests": [
{
"id": "string",
"block": "string",
"category": "string",
"status": "pending | in_progress | resolved | priority",
"title": "string",
"description": "string",
"fullName": "string",
"personnelNumber": "string",
"currentObject": "string",
"phone": "string",
"formData": "string (JSON)",
"response": "string",
"responseLink": "string",
"respondedAt": "string (ISO 8601)",
"createdAt": "string (ISO 8601)",
"updatedAt": "string (ISO 8601)",
"attachments": [...]
}
]
}Создать новую заявку
Тело запроса:
{
"block": "MTO | LICENSING | FINANCE | HR | GIG | ANONYMOUS | SCHEDULE",
"category": "string",
"title": "string",
"description": "string",
"formData": {},
"attachments": [
{
"file": File,
"preview": "string"
}
],
"telegramId": "string",
"fullName": "string",
"personnelNumber": "string",
"currentObject": "string",
"phone": "string"
}Ответ:
{
"requestId": "string",
"request": {...},
"message": "string"
}Обновить заявку
Тело запроса:
{
"status": "pending | in_progress | resolved | priority",
"response": "string",
"responseLink": "string",
"userId": "string",
"telegramId": "string"
}Получить заявку по ID
Ответ:
{
"request": {
...,
"user": {
"id": "string",
"name": "string",
"personnelNumber": "string",
"phone": "string"
}
}
}id- Уникальный IDtelegramId- Telegram ID (уникальный)email- Email (уникальный)name- ФИОpersonnelNumber- Табельный номер (уникальный)phone- ТелефонcurrentObject- Текущий объектposition- Должностьdistrict- Район городаisAnonymous- Признак анонимного пользователя
id- Уникальный IDuserId- ID пользователя (опционально для анонимных заявок)anonymousId- ID для анонимных заявокblock- Блок заявкиcategory- Категорияstatus- Статусtitle- Заголовокdescription- ОписаниеformData- Данные формы (JSON)response- Ответ менеджераresponseLink- Ссылка на документ- Автозаполняемые поля: fullName, personnelNumber, currentObject, phone
id- Уникальный IDrequestId- ID заявкиfileName- Имя файлаfileUrl- URL файлаfileType- Тип файлаfileSize- Размер в байтах
- Заявки на подработки
type- specific (конкретная смена) или general (общая заявка)- Поля для конкретных смен: gigObjectId, gigObjectName
- Поля для общих заявок: availability, district
- Обмен сменами
shiftDateTime- Дата/время сменыreason- Причинаstatus- СтатусfoundReplacement- ID замены
Универсальный компонент для всех форм с поддержкой:
- Выпадающих списков (select)
- Текстовых полей (text, number, textarea)
- Даты (date)
- Загрузки файлов (file)
- Условного отображения полей
- Автозаполнения данных профиля
- Адаптивный для мобильных устройств
- Темная тема
- Стилизованные с помощью Tailwind CSS
- Иконки от Lucide
- Валидация данных на клиенте и сервере
- Проверка прав доступа при обновлении заявок
- Анонимные сообщения не связываются с пользователем
- Загрузка файлов с ограничением размера и типа
- WebSocket сервис для реального времени
- Загрузка файлов в облачное хранилище
- Admin-панель для обработки заявок
- Интеграция Telegram Mini Apps SDK
- Push-уведомления
- Фильтрация и поиск заявок
- Экспорт заявок в Excel/PDF
Для полноценной работы с Telegram Mini App:
- Установите Telegram Web App SDK:
bun install @telegram-apps/sdk- Инициализируйте приложение:
import WebApp from "@telegram-apps/sdk";
const webApp = WebApp();
webApp.ready();- Получите данные пользователя:
const initData = webApp.initDataUnsafe;
const telegramId = initData.user?.id;- Используйте хедер Telegram для навигации и цветов
MIT
Для вопросов и предложений создайте issue в репозитории проекта.