prilesnoe_test
/
tg.py
325 строк · 15.8 Кб
1from aiogram import Bot, Dispatcher, types, F2from aiogram.fsm.context import FSMContext3from aiogram.fsm.state import State, StatesGroup4from aiogram.fsm.storage.memory import MemoryStorage5from aiogram.filters import Command6from aiogram.types import Message7from aiogram import Router8import logika9import logging10import asyncio11
12#Свое надо вставить
13API_TOKEN = ''14
15logging.basicConfig(level=logging.INFO)16
17bot = Bot(token=API_TOKEN)18storage = MemoryStorage()19dp = Dispatcher(storage=storage)20
21# Создание роутера
22router = Router()23
24# Состояния для FSM
25class Form(StatesGroup):26consent = State()27divizion = State()28full_name = State() #фамилия имя отчетсво29plot_number = State() #участок30electricity_meter = State() #Счетчик31meter_reading = State() #показание32burned_out = State() # нагорело33amount = State() #сумма34payment_receipt = State() # Чек35phone_number = State() #номер телефона36
37meter_reading = 038burned_out = 039
40#full_name, plot_number, amount, payment_receipt, phone_number - для аванса
41
42#full_name, plot_number, amount, payment_receipt, phone_number - Членские взносы
43# Регистрация роутеров
44dp.include_router(router)45
46# Обработчик команды /start
47@router.message(Command(commands=["start"]))48async def cmd_start(message: Message, state: FSMContext):49await state.set_state(Form.consent)50kb = [51[52types.KeyboardButton(text="Да"),53types.KeyboardButton(text="Нет")54],55]56keyboard = types.ReplyKeyboardMarkup(57keyboard=kb,58resize_keyboard=True,59input_field_placeholder="Выберите развлетнение действия."60)61await message.answer("Здравствуйте! Соглашаетесь ли вы на обработку персональных данных?", reply_markup=keyboard)62
63# Обработчик ответа на согласие
64@router.message(F.text.lower() == "да")65async def process_consent_yes(message: Message, state: FSMContext):66await message.reply("Вы приняли обработку персональных данных.")67await state.set_state(Form.divizion)68kb1 = [69[70types.KeyboardButton(text="Оплата электроэнергии"),71types.KeyboardButton(text="Аванс"),72types.KeyboardButton(text="Членские взносы")73]74]75keyboard = types.ReplyKeyboardMarkup(76keyboard=kb1,77resize_keyboard=True,78input_field_placeholder="Выберите тип оплаты"79)80await message.answer("Выберите, что вы будете оплачивать:", reply_markup=keyboard)81
82@router.message(F.text.lower() == "нет")83async def process_consent_no(message: Message, state: FSMContext):84await state.clear()85await message.reply("""Вы отклонили обработку персональных данных.86Диалог завершен. Если хотите начать заново, напишите или нажмите /start""", reply_markup=types.ReplyKeyboardRemove())87
88
89def electricity_payment(): #Оплата электроэнергии90# Обработчик ввода ФИО91@router.message(Form.full_name)92async def process_full_name(message: Message, state: FSMContext):93await state.update_data(full_name=message.text)94await state.set_state(Form.plot_number)95await message.answer("Введите номер участка:")96
97# Обработчик ввода номера участка98@router.message(Form.plot_number)99async def process_plot_number(message: Message, state: FSMContext):100await state.update_data(plot_number=message.text)101await state.set_state(Form.electricity_meter)102await message.answer("""Скиньте ССЫЛКУ на фото счетчика. Ссылку можете получить с помощью онлайн сервиса: https://imgur.com/upload103Если вы скините фотографию счетчика, то в конце он выдаст ошибку про занесение в таблицу.""")104
105# Обработчик ввода фото счётчика106@router.message(Form.electricity_meter)107async def process_electricity_meter(message: Message, state: FSMContext):108await state.update_data(electricity_meter=message.text)109await state.set_state(Form.meter_reading)110await message.answer("Укажите текущее показания счетчика.")111
112# Обработчик ввода текущих показаний счетчика113@router.message(Form.meter_reading)114async def process_meter_reading(message: Message, state: FSMContext):115await state.update_data(meter_reading=message.text)116await state.set_state(Form.burned_out)117await message.answer("Укажите количество кВт, которое нагорело за отчетный период.")118
119# Обработчик ввода нагоревших кВт120@router.message(Form.burned_out)121async def process_burned_out(message: Message, state: FSMContext):122await state.update_data(burned_out=message.text)123await state.set_state(Form.amount)124await message.answer("Укажите сумму к оплате:")125
126# Обработчик ввода суммы к оплате127@router.message(Form.amount)128async def process_amount(message: Message, state: FSMContext):129await state.update_data(amount=message.text)130await state.set_state(Form.payment_receipt)131await message.answer("""Скиньте ССЫЛКУ на чек оплаты. Ссылку можете получить с помощью онлайн сервиса: https://imgur.com/upload132Если вы скините фотографию счетчика, то в конце он выдаст ошибку про занесение в таблицу.""")133
134# Обработчик прикрепления чека оплаты135@router.message(Form.payment_receipt)136async def process_payment_receipt(message: Message, state: FSMContext):137await state.update_data(payment_receipt=message.text)138await state.set_state(Form.phone_number)139await message.answer("Введите номер телефона в формате +79xxxxxxxxx:")140
141
142# Обработчик ввода номера телефона143@router.message(Form.phone_number)144async def process_phone_number(message: Message, state: FSMContext):145phone_number = message.text.strip()146
147# Проверка корректности номера телефона148if (len(phone_number) == 12 and phone_number.startswith('+7') and phone_number[1:].isdigit()) or \149(len(phone_number) == 11 and phone_number.isdigit() and phone_number.startswith('89')):150
151# Сохранение номера телефона152await state.update_data(phone_number=phone_number)153
154# Получение всех данных пользователя из состояния155user_data = await state.get_data()156
157# Вызов функции из logika.py для сохранения данных158result = logika.save_user_data(159user_data['full_name'], user_data['plot_number'],160user_data.get('electricity_meter', b''), user_data.get('meter_reading', ''),161user_data.get('burned_out', ''), user_data['amount'],162user_data.get('payment_receipt', b''), user_data['phone_number'], user_data['divizion']163)164
165# Отправка результата пользователю166await message.answer(result)167
168# Очистка состояния169await state.clear()170
171else:172# Сообщение об ошибке, если номер некорректен173await message.answer("Некорректный номер телефона. Введите номер в формате +79xxxxxxxxx или 89xxxxxxxxx:")174
175
176def prepaid_expense(): #Аванс177@router.message(Form.full_name)178async def prepaid_expense_full_name(message:Message, state:FSMContext):179await state.update_data(full_name=message.text)180await state.set_state(Form.plot_number)181await message.answer("Введите номер участка:")182
183@router.message(Form.plot_number)184async def prepaid_expense_plot_number(message:Message, state:FSMContext):185await state.update_data(plot_number=message.text)186await state.set_state(Form.amount)187await message.answer("Укажите сумму к оплате:")188
189@router.message(Form.amount)190async def prepaid_expense_amount(message:Message, state:FSMContext):191await state.update_data(amount=message.text)192await state.set_state(Form.payment_receipt)193await message.answer("""Скиньте ССЫЛКУ на чек оплаты. Ссылку можете получить с помощью онлайн сервиса: https://imgur.com/upload194Если вы скините фотографию счетчика, то в конце он выдаст ошибку про занесение в таблицу.""")195
196@router.message(Form.payment_receipt)197async def prepaid_expense_payment_receipt(message:Message, state:FSMContext):198await state.update_data(payment_receipt=message.text)199await state.set_state(Form.phone_number)200await message.answer("Номер телефона в формате +79xxxxxxxxx")201
202# Обработчик ввода номера телефона203@router.message(Form.phone_number)204async def process_phone_number(message: Message, state: FSMContext):205phone_number = message.text.strip()206
207# Проверка корректности номера телефона208if (len(phone_number) == 12 and phone_number.startswith('+7') and phone_number[1:].isdigit()) or \209(len(phone_number) == 11 and phone_number.isdigit() and phone_number.startswith('89')):210
211# Сохранение номера телефона212await state.update_data(phone_number=phone_number)213
214# Получение всех данных пользователя из состояния215user_data = await state.get_data()216
217# Вызов функции из logika.py для сохранения данных218result = logika.save_user_data(219user_data['full_name'], user_data['plot_number'],220user_data.get('electricity_meter', b''), user_data.get('meter_reading', ''),221user_data.get('burned_out', ''), user_data['amount'],222user_data.get('payment_receipt', b''), user_data['phone_number'], user_data['divizion']223)224
225# Отправка результата пользователю226await message.answer(result)227
228# Очистка состояния229await state.clear()230
231else:232# Сообщение об ошибке, если номер некорректен233await message.answer("Некорректный номер телефона. Введите номер в формате +79xxxxxxxxx или 89xxxxxxxxx:")234
235def fees(): #Для Членских взносов236@router.message(Form.full_name)237async def fees_full_name(message:Message, state:FSMContext):238await state.update_data(full_name=message.text)239await state.set_state(Form.plot_number)240await message.answer("Введите номер участка:")241
242@router.message(Form.plot_number)243async def fees_plot_number(message:Message, state:FSMContext):244await state.update_data(plot_number=message.text)245await state.set_state(Form.amount)246await message.answer("Укажите сумму к оплате:")247
248@router.message(Form.amount)249async def fees_amount(message:Message, state:FSMContext):250await state.update_data(amount=message.text)251await state.set_state(Form.payment_receipt)252await message.answer("""Скиньте ССЫЛКУ на чек оплаты. Ссылку можете получить с помощью онлайн сервиса: https://imgur.com/upload253Если вы скините фотографию счетчика, то в конце он выдаст ошибку про занесение в таблицу.""")254
255@router.message(Form.payment_receipt)256async def fees_payment_receipt(message:Message, state:FSMContext):257await state.update_data(payment_receipt=message.text)258await state.set_state(Form.phone_number)259await message.answer("Номер телефона в формате 89xxxxxxxxx")260
261# Обработчик ввода номера телефона262@router.message(Form.phone_number)263async def fees_phone_number(message: Message, state: FSMContext):264phone_number = message.text.strip()265
266# Проверка корректности номера телефона267if (len(phone_number) == 12 and phone_number.startswith('+7') and phone_number[1:].isdigit()) or \268(len(phone_number) == 11 and phone_number.isdigit() and phone_number.startswith('89')):269
270# Сохранение номера телефона271await state.update_data(phone_number=phone_number)272
273# Получение всех данных пользователя из состояния274user_data = await state.get_data()275
276# Вызов функции из logika.py для сохранения данных277result = logika.save_user_data(278user_data['full_name'], user_data['plot_number'],279user_data.get('electricity_meter', b''), user_data.get('meter_reading', ''),280user_data.get('burned_out', ''), user_data['amount'],281user_data.get('payment_receipt', b''), user_data['phone_number'], user_data['divizion']282)283
284# Отправка результата пользователю285await message.answer(result)286
287# Очистка состояния288await state.clear()289
290else:291# Сообщение об ошибке, если номер некорректен292await message.answer("Некорректный номер телефона. Введите номер в формате +79xxxxxxxxx или 89xxxxxxxxx:")293
294
295
296@router.message(F.text.lower() == "оплата электроэнергии.")297async def handle_electricity_payment(message:Message, state:FSMContext):298await state.set_state(Form.full_name)299await message.answer("Введите ваше ФИО")300
301electricity_payment()302
303
304@router.message(F.text.lower() == "Аванс")305async def handle_prepaid_expense(message:Message, state:FSMContext):306await state.set_state(Form.full_name)307await message.answer("Введите ваше ФИО")308
309prepaid_expense()310
311
312@router.message(F.text.lower() == "Членские взносы")313async def handle_fees(message:Message, state:FSMContext):314await state.set_state(Form.full_name)315await message.answer("Введите ваше ФИО")316
317fees()318
319
320
321async def main():322await dp.start_polling(bot)323
324if __name__ == "__main__":325asyncio.run(main())326