/
wtaket
/
bot
Обзор
Документация
Войти
/
wtaket
/
bot
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
bot.py
204 строки
8 KB
wtaket
upload files
30 май 2025, 08:37
30 май 2025, 08:37
a13edcc
Код
Авторство
О чём код?
from telegram import Update, ReplyKeyboardMarkup, KeyboardButton from telegram.ext import ( Application, CommandHandler, MessageHandler, ContextTypes, filters ) TOKEN = "7742825308:AAH5MocItpg_TGeYbYd7p8pCykR0aHRVjgQ" WORK_TYPES = { "1️⃣ ПЗУ": "общестроительные", "2️⃣ АР": "общестроительные", "3️⃣ КЖ": "общестроительные", "4️⃣ КМ": "общестроительные", "5️⃣ ЭОМ": "инженерные", "6️⃣ ВК": "инженерные", "7️⃣ ОВ": "инженерные", "8️⃣ СС": "инженерные", "9️⃣ ТКР": "инженерные", } ENGINEER_SALARY = 120000 async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): """Инициализация диалога""" work_buttons = sorted(WORK_TYPES.keys()) buttons = [work_buttons[i:i+3] for i in range(0, len(work_buttons), 3)] buttons.append(["✅ Подтвердить выбор"]) markup = ReplyKeyboardMarkup(buttons, resize_keyboard=True) await update.message.reply_text( "🏗 *Выберите разделы исполнительной документации:*\n\n" + "\n".join(f"- {work}" for work in WORK_TYPES.keys()) + "\n\nВыберите нужные разделы и нажмите '✅ Подтвердить выбор'", reply_markup=markup, parse_mode="Markdown" ) context.user_data.clear() context.user_data["stage"] = "selecting_works" context.user_data["selected_works"] = [] async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE): """Главный обработчик сообщений""" current_stage = context.user_data.get("stage") user_input = update.message.text if not current_stage: await update.message.reply_text("Пожалуйста, начните с команды /start") return if current_stage == "selecting_works": if user_input == "✅ Подтвердить выбор": await confirm_works(update, context) else: await select_works(update, context) elif current_stage == "entering_duration": await handle_duration(update, context) elif current_stage == "entering_cost": await handle_cost(update, context) async def select_works(update: Update, context: ContextTypes.DEFAULT_TYPE): """Обработчик выбора разделов""" user_input = update.message.text selected = context.user_data["selected_works"] if user_input in WORK_TYPES: if user_input in selected: selected.remove(user_input) action = "❌ Удалено" else: selected.append(user_input) action = "✅ Добавлено" context.user_data["selected_works"] = selected status = f"{action}: {user_input}\n\nТекущий выбор:\n" + \ "\n".join(f"- {work}" for work in selected) if selected else "Нет выбранных разделов" await update.message.reply_text( f"{status}\n\nПродолжайте выбирать или нажмите '✅ Подтвердить выбор'" ) else: await update.message.reply_text("Пожалуйста, выбирайте разделы из предложенного списка") async def confirm_works(update: Update, context: ContextTypes.DEFAULT_TYPE): """Подтверждение выбора разделов""" selected = context.user_data["selected_works"] if not selected: await update.message.reply_text("❌ Вы не выбрали ни одного раздела. Пожалуйста, сделайте выбор.") return context.user_data["stage"] = "entering_duration" await update.message.reply_text( f"📋 *Выбранные разделы:*\n" + "\n".join(f"- {work}" for work in selected) + "\n\n📅 *Укажите длительность строительства (в месяцах):*", parse_mode="Markdown", reply_markup=ReplyKeyboardMarkup([[KeyboardButton("↩ Назад к выбору")]], resize_keyboard=True) ) async def handle_duration(update: Update, context: ContextTypes.DEFAULT_TYPE): """Обработчик длительности""" if update.message.text == "↩ Назад к выбору": await start(update, context) return try: duration = int(update.message.text) if duration <= 0: raise ValueError context.user_data["duration"] = duration context.user_data["stage"] = "entering_cost" await update.message.reply_text( "💰 *Укажите стоимость СМР (в рублях):*", parse_mode="Markdown", reply_markup=ReplyKeyboardMarkup([[KeyboardButton("↩ Назад к длительности")]], resize_keyboard=True) ) except ValueError: await update.message.reply_text("❌ Пожалуйста, введите целое число месяцев (например: 6)") async def handle_cost(update: Update, context: ContextTypes.DEFAULT_TYPE): """Обработчик стоимости и расчет""" if update.message.text == "↩ Назад к длительности": context.user_data["stage"] = "entering_duration" await update.message.reply_text( "📅 Укажите длительность строительства (в месяцах):", reply_markup=ReplyKeyboardMarkup([[KeyboardButton("↩ Назад к выбору")]], resize_keyboard=True) ) return try: cost = float(update.message.text) if cost <= 0: raise ValueError # Получаем данные selected_works = context.user_data["selected_works"] duration = context.user_data["duration"] # Определяем группы выбранных работ groups = {WORK_TYPES[work] for work in selected_works} # Расчет количества инженеров num_engineers = 1 if len(selected_works) > 3 or len(groups) > 1: num_engineers = 2 if len(selected_works) > 6: num_engineers = 3 # Расчет стоимости if cost < 100_000_000: percent = 0.03 elif cost < 250_000_000: percent = 0.025 elif cost < 500_000_000: percent = 0.02 else: percent = 0.015 service_cost = cost * percent salary_cost = num_engineers * ENGINEER_SALARY * duration # Корректировка стоимости if service_cost > salary_cost: service_cost = salary_cost * 0.9 # Понижаем на 10% ниже зарплат # Формируем результат result = ( f"📊 *Итоговый расчет*\n\n" f"▪ Выбрано разделов: {len(selected_works)}\n" f"▪ Длительность: {duration} мес.\n" f"▪ Стоимость СМР: {cost:,.0f} руб.\n\n" f"🔧 Стоимость документации: {service_cost:,.0f} руб.\n" f"👷 Затраты на {num_engineers} инженеров: {salary_cost:,.0f} руб. (ЗП инженера: {ENGINEER_SALARY:,.0f} руб./мес.)\n\n" f"💡 {'Документация дороже зарплат' if service_cost > salary_cost else 'Зарплаты инженеров дороже документации'}" ) await update.message.reply_text( result, parse_mode="Markdown", reply_markup=ReplyKeyboardMarkup([[KeyboardButton("/start - Новый расчет")]], resize_keyboard=True) ) except ValueError: await update.message.reply_text("❌ Пожалуйста, введите корректную сумму (например: 150000000)") def main(): app = Application.builder().token(TOKEN).build() app.add_handler(CommandHandler("start", start)) app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message)) app.run_polling() if __name__ == "__main__": main()