Создание ТГ-Бота. Техническое задание на Telegram-бота Общие требования Язык и фреймворк: TypeScript, библиотека Telegraf.js. Хранение данных: база данных компании PostgreSQL. Тестовые данные YooKassa: укажите пример тестовых ключей/токена. Интеграция: с Битрикс24 и с информационной системой «Global Monitoring». Сценарий взаимодействия Старт бота. При получении /start бот отправляет приветствие: «Здравствуйте! Для оформления подписки на ценовой обзор выберите рынок.» – После этого выводит кнопки InlineKeyboard с вариантами рынков: Рынок свинины, Рынок говядины, Рынок баранины, Рынок ЦБ, Рынок индейки, Рынок утки, Рынок яиц. Выбор рынка. Пользователь нажимает кнопку с названием рынка. Бот сохраняет выбранный рынок в сессии пользователя и переходит к следующему шагу. Выбор срока подписки. Бот отправляет сообщение: «Выберите необходимый срок подписки:» – Предлагает кнопки с вариантами: «1 месяц – 9 200 ₽» «3 месяца – 24 840 ₽» «6 месяцев – 41 400 ₽» «12 месяцев – 57 600 ₽» Пользователь выбирает один вариант. Бот сохраняет выбранный срок (например, 1, 3, 6 или 12 месяцев) и подтверждает выбор сообщением: «Вы выбрали подписку на N месяцев.» Запрос ФИО. Бот просит ввести полные ФИО: «Пожалуйста, укажите Ваши Фамилию, Имя и Отчество.» – Пользователь отправляет сообщение с ФИО. Бот проверяет корректность (минимально наличие двух слов). Запрос E-mail, телефона и компании (при наличии). Последовательно бот запрашивает: «Укажите адрес электронной почты (E-mail):» – после ввода проверяет формат e-mail (регулярным выражением). Если формат неверный, просит ввести снова. «Укажите номер телефона (пример: +7 123 456-78-90):» – проверяет формат телефона (+7 или 8 и цифры). Если формат неверный, просит ввести снова. «Укажите наименование компании (необязательно) (пример: ООО «Рога и копыта»):» – пользователь отправляет сообщение с наименованием компании или нажимает кнопку «Пропустить». Подтверждение введенных данных. Бот выводит сводку введённых данных и предлагает подтвердить: «Проверьте, пожалуйста, введённые данные.» Данные: ФИО, E-mail, телефон, компания, выбранный рынок и срок подписки (N месяцев). – Внизу две кнопки: «Подтвердить» и «Отмена». Корректировка данных. Если пользователь нажал «Отмена»: Бот спрашивает, что нужно изменить (например, через меню кнопок или повторным запросом): «Что вы хотите изменить?», варианты виде кнопок InlineKeyboard: «Рынок», «Срок», «ФИО», «E-mail», «Телефон», «Компания». После выбора поля бот запрашивает новое значение (аналогично первому вводу) и обновляет сохранённые данные. *** Затем снова показывает обновлённую сводку с кнопками «Подтвердить» и «Отмена». || На это шаге бот отправляет запрос в bitrix на формирование карточки ЛИДа следующие данные: «ФИО»*, «E-mail»*, «Телефон»*, «Компания» и «ID_user». После подтверждения данных, бот предлагает выбрать платежную систему для оплаты подписки: «Выберите способ оплаты:» – Внизу две кнопки: «ЮKassa (Россия)» и «...? (Другие страны)» После выбора способа оплаты бот вызывает метод для отправки счета через выбранную платежную систему (например ЮKassa). После вызова бот отправляет пользователю сообщение с кнопкой «Оплатить X руб.». Обработка платежа. Пользователь нажимает «Оплатить» и проходит процедуру оплаты. После успешной оплаты бот получит сообщение об оплате. По этому событию бот должен завершить оформление: активировать подписку пользователя. Записать в памяти дату окончания (текущая дата + N месяцев). || На это шаге бот отправляет запрос в bitrix на перенос карточки ЛИДа в карточку ЗАВЕРШЕННАЯ СДЕЛКА. || Также бот отправляет запрос на автоматическую регистрацию учетной записи в информационной система «Global Monitoring». – После успешной оплаты бот отправляет пользователю следующие сообщения: «Спасибо, оплата прошла успешно! Подписка на ценовой обзор активирована на N месяцев. Дата окончания подписки: YYYY-MM-DD. | За 7 дней до окончания подписки (и после каждый день до окончания), пользователю автоматически присылать сообщение: «Уважаемый пользователь! Срок действия подписки на ценовой обзор рынка N заканчивается через N дней – YYYY-MM-DD. Оформите подписку заново, чтобы и дальше получать актуальную информацию. *файл с ЦО.pdf» || Бот по запросу к API информационной системы «Global Monitoring» получает последний загруженный файл с ценовым обзором выбранного рынка. (Параметр N и дата расчёта указывается динамически на основе выбора пользователя.) «Также для вас автоматически была создана учетная запись в информационной системе «Global Monitoring». Данные для входа: Логин(e-mail) и пароль: *** (автоматическая генерация на стороне информационной системе «Global Monitoring») Ссылка для входа: https://website.ru/.» Панель администратора бота Старт бота. При получении /start бот отправляет приветствие: «Здравствуйте! Выберите действие:» – После этого выводит кнопки InlineKeyboard с вариантами управления: Управление рынками, Управление тарифами, Включение/отключение платежей, Экспорт пользователей в CSV, Просмотр логов, Назад Управление рынками. Администратор нажимает на кнопку «Управление рынками». Бот отправляет сообщение: «Выберите действие:» – Предлагает кнопки с вариантами: Добавить рынок, Редактировать рынок, Назад – Администратор выбирает «Добавить рынок». Бот просит ввести название рынка: «Пожалуйста, укажите название рынка (например, Свинина)» – Администратор отправляет сообщение с названием рынка. Бот сохраняет название рынка и подтверждает сообщением: «Вы добавили рынок X.» | Бот предлагает кнопки с вариантами: Панель управления, Управление рынками – Администратор выбирает «Редактировать рынок». Бот выводит кнопки InlineKeyboard с вариантами рынков: Рынок свинины, Рынок говядины, Рынок баранины, Рынок ЦБ, Рынок индейки, Рынок утки, Рынок яиц, Назад – Администратор выбирает необходимый рынок. Бот выводит кнопки InlineKeyboard с вариантами действий: Переименовать рынок, Удалить рынок, Включить/Отключить рынок, Назад – Администратор выбирает «Переименовать рынок». Бот отправляет сообщение: «Пожалуйста, укажите новое название рынка X» | (где X – выбранный рынок) – Администратор отправляет сообщение с новым названием рынка. Бот сохраняет новое название рынка и подтверждает сообщением: «Вы переименовали рынок X в рынок Y.» | (где Y – новое название рынка) Бот предлагает кнопки с вариантами: Панель управления, Управление рынками, Назад – Администратор выбирает «Удалить рынок». Бот выводит кнопки InlineKeyboard с вариантами рынков: Рынок свинины, Рынок говядины, Рынок баранины, Рынок ЦБ, Рынок индейки, Рынок утки, Рынок яиц. – Администратор выбирает необходимый рынок. Бот выводит сообщение: «Вы действительно хотите удалить рынок?» – Предлагает кнопки с вариантами: Да, Отмена – Администратор выбирает вариант «Да». Бот выводит сообщение: «Рынок X удален» Бот предлагает кнопки с вариантами: Панель управления, Управление рынками – Администратор выбирает вариант «Отмена». | Возвращается на шаг «Редактировать рынок» – Администратор выбирает «Включить/Отключить рынок». Бот выводит кнопки InlineKeyboard с вариантами рынков: Рынок свинины, Рынок говядины, Рынок баранины, Рынок ЦБ, Рынок индейки, Рынок утки, Рынок яиц, Назад | Напротив каждого наименования рынка будет находиться emoji, который показывает текущее состояние рынка: ✔ – рынок включен, × – рынок выключен. При клике на рынок будет меняться его состояние. Если был включен ✔, то при нажатии статус изменится на ×. Управление тарифами. Администратор нажимает на кнопку «Управление тарифами». Бот отправляет сообщение: «Выберите действие:» – Предлагает кнопки с вариантами: Добавить тариф, Редактировать тариф, Назад – Администратор выбирает «Добавить тариф». Бот просит ввести название рынка: «Пожалуйста, укажите название тарифа (например, 9 месяцев)» – Администратор отправляет сообщение с названием тарифа. Затем бот запрашивает стоимость тарифа: «Пожалуйста, укажите стоимость тарифа (например, 53820)» – Администратор отправляет сообщение со стоимостью тарифа. Бот сохраняет название название тарифа и стоимость и подтверждает сообщением: «Вы добавили новый тариф X – Y» | (где X – название тарифа, Y – стоимость тарифа) Бот предлагает кнопки с вариантами: Панель управления, Управление тарифами – Администратор выбирает «Редактировать тариф». Бот выводит кнопки InlineKeyboard с вариантами тарифа: 1 месяц – 9 200 ₽, 3 месяца – 24 840 ₽, 6 месяцев – 41 400 ₽, 12 месяцев – 57 600 ₽, Назад – Администратор выбирает необходимый тариф. Бот выводит кнопки InlineKeyboard с вариантами действий: Переименовать тариф, Удалить тариф, Включить/Отключить тариф, Назад – Администратор выбирает «Переименовать тариф». Бот отправляет сообщение: «Пожалуйста, укажите новое название тарифа X» | (где X – выбранный тариф) – Администратор отправляет сообщение с новым названием тарифа. Затем бот запрашивает стоимость тарифа: «Пожалуйста, укажите новую стоимость тарифа Y» | (где Y – стоимость тарифа) Бот сохраняет новое название тарифа и подтверждает сообщением: «Вы переименовали рынок X в рынок Z.» | (где Z – новое название тарифа) Бот предлагает кнопки с вариантами: Панель управления, Управление тарифами, Назад – Администратор выбирает «Удалить тариф». Бот выводит кнопки InlineKeyboard с вариантами тарифов: 1 месяц – 9 200 ₽, 3 месяца – 24 840 ₽, 6 месяцев – 41 400 ₽, 12 месяцев – 57 600 ₽, Назад – Администратор выбирает необходимый тариф. Бот выводит сообщение: «Вы действительно хотите удалить тариф X?» | (где X – выбранный тариф) – Предлагает кнопки с вариантами: Да, Отмена – Администратор выбирает вариант «Да». Бот выводит сообщение: «Тариф X удален» Бот предлагает кнопки с вариантами: Панель управления, Управление тарифами – Администратор выбирает вариант «Отмена». | Возвращается на шаг «Редактировать тариф» – Администратор выбирает «Включить/Отключить тариф». Бот выводит кнопки InlineKeyboard с вариантами тарифов: 1 месяц – 9 200 ₽, 3 месяца – 24 840 ₽, 6 месяцев – 41 400 ₽, 12 месяцев – 57 600 ₽, Назад | Напротив каждого наименования тарифа будет находиться emoji, который показывает текущее состояние тарифа: ✔ – тариф включен, × – тариф выключен. При клике на тариф будет меняться его состояние. Если был включен ✔, то при нажатии статус изменится на ×. Управление Включением/отключением платежей; – Администратор выбирает «Включение/Отключение платежей». Бот выводит сообщение: «Вы действительно хотите отключить платежи?» – Предлагает кнопки с вариантами: Да, Отмена – Администратор выбирает вариант «Да». Бот выводит сообщение: «Платежи отключены» – Администратор выбирает вариант «Отмена». | Возвращается на шаг «Выберите действие» Если платежи были отключены → – Администратор выбирает «Включение/Отключение платежей». Бот выводит сообщение: «Вы действительно хотите включить платежи?» – Предлагает кнопки с вариантами: Да, Отмена – Администратор выбирает вариант «Да». Бот выводит сообщение: «Платежи включены» – Администратор выбирает вариант «Отмена». | Возвращается на шаг «Выберите действие» Управление Экспортом пользователей в CSV; – Администратор выбирает «Экспорт пользователей в CSV». Бот присылает файл: «*файл.csv» | Файл включает в себя набор полей: ФИО, e-mail, телефон, компания, рынок, срок, дата начала подписки, дата окончания подписки. – Предлагает кнопки с вариантами: Да, Отмена Просмотр логов в боте. (Время хранения ~ 7 дней) 1. Бизнес-события (выбор рынка, выбор тарифа, подтверждение данных, создание лида в Bitrix, успешная генерация учётки в Global Monitoring, активация подписки. Важно — логировать какое действие и какие агрегированные данные (например: рынок=«Свинина», срок=3 мес), а не полные необработанные входящие сообщения.) 2. Платежи (Создание счета, переход к оплате, callback от ЮKassa (webhook), успешная/неудачная оплата, id транзакции, сумма, статус. Логируйте события с привязкой к user_id / order_id / correlation_id и временем.) 3. Интеграции (Запросы/ответы к Bitrix24, Global Monitoring, ЮKassa: endpoint, method, status_code, duration_ms, request_id/transaction id, краткий body.) 4. Аудит (Авторизация администратора, изменение тарифов/рынков, включение/отключение платежей, экспорт CSV — кто, когда, какие поля изменил.) 5. Ошибки (Необработанные исключения, таймауты внешних API, ошибки базы — stacktrace, состояние операции, context (user_id, correlation_id).)