prilesnoe_test

Форк
0
325 строк · 15.8 Кб
1
from aiogram import Bot, Dispatcher, types, F
2
from aiogram.fsm.context import FSMContext
3
from aiogram.fsm.state import State, StatesGroup
4
from aiogram.fsm.storage.memory import MemoryStorage
5
from aiogram.filters import Command
6
from aiogram.types import Message
7
from aiogram import Router
8
import logika
9
import logging
10
import asyncio
11

12
#Свое надо вставить
13
API_TOKEN = ''
14

15
logging.basicConfig(level=logging.INFO)
16

17
bot = Bot(token=API_TOKEN)
18
storage = MemoryStorage()
19
dp = Dispatcher(storage=storage)
20

21
# Создание роутера
22
router = Router()
23

24
# Состояния для FSM
25
class Form(StatesGroup):
26
    consent = State()
27
    divizion = State()
28
    full_name = State() #фамилия имя отчетсво
29
    plot_number = State() #участок
30
    electricity_meter = State() #Счетчик
31
    meter_reading = State() #показание
32
    burned_out = State() # нагорело
33
    amount = State() #сумма 
34
    payment_receipt = State() # Чек
35
    phone_number = State() #номер телефона
36

37
meter_reading = 0
38
burned_out = 0
39

40
#full_name, plot_number, amount, payment_receipt, phone_number - для аванса
41

42
#full_name, plot_number, amount, payment_receipt, phone_number - Членские взносы
43
# Регистрация роутеров
44
dp.include_router(router)
45

46
# Обработчик команды /start
47
@router.message(Command(commands=["start"]))
48
async def cmd_start(message: Message, state: FSMContext):
49
    await state.set_state(Form.consent)
50
    kb = [
51
        [
52
            types.KeyboardButton(text="Да"),
53
            types.KeyboardButton(text="Нет")
54
        ],
55
    ]
56
    keyboard = types.ReplyKeyboardMarkup(
57
        keyboard=kb,
58
        resize_keyboard=True,
59
        input_field_placeholder="Выберите развлетнение действия."
60
    )
61
    await message.answer("Здравствуйте! Соглашаетесь ли вы на обработку персональных данных?", reply_markup=keyboard)
62

63
# Обработчик ответа на согласие
64
@router.message(F.text.lower() == "да")
65
async def process_consent_yes(message: Message, state: FSMContext):
66
    await message.reply("Вы приняли обработку персональных данных.")
67
    await state.set_state(Form.divizion)
68
    kb1 = [
69
        [
70
            types.KeyboardButton(text="Оплата электроэнергии"),
71
            types.KeyboardButton(text="Аванс"),
72
            types.KeyboardButton(text="Членские взносы")
73
        ]
74
    ]
75
    keyboard = types.ReplyKeyboardMarkup(
76
        keyboard=kb1,
77
        resize_keyboard=True,
78
        input_field_placeholder="Выберите тип оплаты"
79
    )
80
    await message.answer("Выберите, что вы будете оплачивать:", reply_markup=keyboard)
81

82
@router.message(F.text.lower() == "нет")
83
async def process_consent_no(message: Message, state: FSMContext):
84
    await state.clear()
85
    await message.reply("""Вы отклонили обработку персональных данных.
86
Диалог завершен. Если хотите начать заново, напишите или нажмите /start""", reply_markup=types.ReplyKeyboardRemove())
87

88

89
def electricity_payment(): #Оплата электроэнергии
90
    # Обработчик ввода ФИО
91
    @router.message(Form.full_name)
92
    async def process_full_name(message: Message, state: FSMContext):
93
        await state.update_data(full_name=message.text)
94
        await state.set_state(Form.plot_number)
95
        await message.answer("Введите номер участка:")
96

97
    # Обработчик ввода номера участка
98
    @router.message(Form.plot_number)
99
    async def process_plot_number(message: Message, state: FSMContext):
100
        await state.update_data(plot_number=message.text)
101
        await state.set_state(Form.electricity_meter)
102
        await message.answer("""Скиньте ССЫЛКУ на фото счетчика. Ссылку можете получить с помощью онлайн сервиса: https://imgur.com/upload
103
        Если вы скините фотографию счетчика, то в конце он выдаст ошибку про занесение в таблицу.""")
104

105
    # Обработчик ввода фото счётчика
106
    @router.message(Form.electricity_meter)
107
    async def process_electricity_meter(message: Message, state: FSMContext):
108
        await state.update_data(electricity_meter=message.text)
109
        await state.set_state(Form.meter_reading)
110
        await message.answer("Укажите текущее показания счетчика.")
111

112
    # Обработчик ввода текущих показаний счетчика
113
    @router.message(Form.meter_reading)
114
    async def process_meter_reading(message: Message, state: FSMContext):
115
        await state.update_data(meter_reading=message.text)
116
        await state.set_state(Form.burned_out)
117
        await message.answer("Укажите количество кВт, которое нагорело за отчетный период.")
118

119
    # Обработчик ввода нагоревших кВт
120
    @router.message(Form.burned_out)
121
    async def process_burned_out(message: Message, state: FSMContext):
122
        await state.update_data(burned_out=message.text)
123
        await state.set_state(Form.amount)
124
        await message.answer("Укажите сумму к оплате:")
125

126
    # Обработчик ввода суммы к оплате
127
    @router.message(Form.amount)
128
    async def process_amount(message: Message, state: FSMContext):
129
        await state.update_data(amount=message.text)
130
        await state.set_state(Form.payment_receipt)
131
        await message.answer("""Скиньте ССЫЛКУ на чек оплаты. Ссылку можете получить с помощью онлайн сервиса: https://imgur.com/upload
132
        Если вы скините фотографию счетчика, то в конце он выдаст ошибку про занесение в таблицу.""")
133

134
    # Обработчик прикрепления чека оплаты
135
    @router.message(Form.payment_receipt)
136
    async def process_payment_receipt(message: Message, state: FSMContext):
137
        await state.update_data(payment_receipt=message.text)
138
        await state.set_state(Form.phone_number)
139
        await message.answer("Введите номер телефона в формате +79xxxxxxxxx:")
140

141

142
    # Обработчик ввода номера телефона
143
    @router.message(Form.phone_number)
144
    async def process_phone_number(message: Message, state: FSMContext):
145
        phone_number = message.text.strip()
146

147
        # Проверка корректности номера телефона
148
        if (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
            # Сохранение номера телефона
152
            await state.update_data(phone_number=phone_number)
153

154
            # Получение всех данных пользователя из состояния
155
            user_data = await state.get_data()
156

157
            # Вызов функции из logika.py для сохранения данных
158
            result = logika.save_user_data(
159
                user_data['full_name'], user_data['plot_number'],
160
                user_data.get('electricity_meter', b''), user_data.get('meter_reading', ''),
161
                user_data.get('burned_out', ''), user_data['amount'],
162
                user_data.get('payment_receipt', b''), user_data['phone_number'], user_data['divizion']
163
            )
164

165
            # Отправка результата пользователю
166
            await message.answer(result)
167

168
            # Очистка состояния
169
            await state.clear()
170

171
        else:
172
            # Сообщение об ошибке, если номер некорректен
173
            await message.answer("Некорректный номер телефона. Введите номер в формате +79xxxxxxxxx или 89xxxxxxxxx:")
174

175

176
def prepaid_expense(): #Аванс
177
    @router.message(Form.full_name)
178
    async def prepaid_expense_full_name(message:Message, state:FSMContext):
179
        await state.update_data(full_name=message.text)
180
        await state.set_state(Form.plot_number)
181
        await message.answer("Введите номер участка:")
182

183
    @router.message(Form.plot_number)
184
    async def prepaid_expense_plot_number(message:Message, state:FSMContext):
185
        await state.update_data(plot_number=message.text)
186
        await state.set_state(Form.amount)
187
        await message.answer("Укажите сумму к оплате:")
188

189
    @router.message(Form.amount)
190
    async def prepaid_expense_amount(message:Message, state:FSMContext):
191
        await state.update_data(amount=message.text)
192
        await state.set_state(Form.payment_receipt)
193
        await message.answer("""Скиньте ССЫЛКУ на чек оплаты. Ссылку можете получить с помощью онлайн сервиса: https://imgur.com/upload
194
        Если вы скините фотографию счетчика, то в конце он выдаст ошибку про занесение в таблицу.""")
195

196
    @router.message(Form.payment_receipt)
197
    async def prepaid_expense_payment_receipt(message:Message, state:FSMContext):
198
        await state.update_data(payment_receipt=message.text)
199
        await state.set_state(Form.phone_number)
200
        await message.answer("Номер телефона в формате +79xxxxxxxxx")
201

202
    # Обработчик ввода номера телефона
203
    @router.message(Form.phone_number)
204
    async def process_phone_number(message: Message, state: FSMContext):
205
        phone_number = message.text.strip()
206

207
        # Проверка корректности номера телефона
208
        if (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
            # Сохранение номера телефона
212
            await state.update_data(phone_number=phone_number)
213

214
            # Получение всех данных пользователя из состояния
215
            user_data = await state.get_data()
216

217
            # Вызов функции из logika.py для сохранения данных
218
            result = logika.save_user_data(
219
                user_data['full_name'], user_data['plot_number'],
220
                user_data.get('electricity_meter', b''), user_data.get('meter_reading', ''),
221
                user_data.get('burned_out', ''), user_data['amount'],
222
                user_data.get('payment_receipt', b''), user_data['phone_number'], user_data['divizion']
223
            )
224

225
            # Отправка результата пользователю
226
            await message.answer(result)
227

228
            # Очистка состояния
229
            await state.clear()
230

231
        else:
232
            # Сообщение об ошибке, если номер некорректен
233
            await message.answer("Некорректный номер телефона. Введите номер в формате +79xxxxxxxxx или 89xxxxxxxxx:")
234

235
def fees(): #Для Членских взносов
236
    @router.message(Form.full_name)
237
    async def fees_full_name(message:Message, state:FSMContext):
238
        await state.update_data(full_name=message.text)
239
        await state.set_state(Form.plot_number)
240
        await message.answer("Введите номер участка:")
241

242
    @router.message(Form.plot_number)
243
    async def fees_plot_number(message:Message, state:FSMContext):
244
        await state.update_data(plot_number=message.text)
245
        await state.set_state(Form.amount)
246
        await message.answer("Укажите сумму к оплате:")
247

248
    @router.message(Form.amount)
249
    async def fees_amount(message:Message, state:FSMContext):
250
        await state.update_data(amount=message.text)
251
        await state.set_state(Form.payment_receipt)
252
        await message.answer("""Скиньте ССЫЛКУ на чек оплаты. Ссылку можете получить с помощью онлайн сервиса: https://imgur.com/upload
253
        Если вы скините фотографию счетчика, то в конце он выдаст ошибку про занесение в таблицу.""")
254

255
    @router.message(Form.payment_receipt)
256
    async def fees_payment_receipt(message:Message, state:FSMContext):
257
        await state.update_data(payment_receipt=message.text)
258
        await state.set_state(Form.phone_number)
259
        await message.answer("Номер телефона в формате 89xxxxxxxxx")
260

261
    # Обработчик ввода номера телефона
262
    @router.message(Form.phone_number)
263
    async def fees_phone_number(message: Message, state: FSMContext):
264
        phone_number = message.text.strip()
265

266
        # Проверка корректности номера телефона
267
        if (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
            # Сохранение номера телефона
271
            await state.update_data(phone_number=phone_number)
272

273
            # Получение всех данных пользователя из состояния
274
            user_data = await state.get_data()
275

276
            # Вызов функции из logika.py для сохранения данных
277
            result = logika.save_user_data(
278
                user_data['full_name'], user_data['plot_number'],
279
                user_data.get('electricity_meter', b''), user_data.get('meter_reading', ''),
280
                user_data.get('burned_out', ''), user_data['amount'],
281
                user_data.get('payment_receipt', b''), user_data['phone_number'], user_data['divizion']
282
            )
283

284
            # Отправка результата пользователю
285
            await message.answer(result)
286

287
            # Очистка состояния
288
            await state.clear()
289

290
        else:
291
            # Сообщение об ошибке, если номер некорректен
292
            await message.answer("Некорректный номер телефона. Введите номер в формате +79xxxxxxxxx или 89xxxxxxxxx:")
293

294

295

296
@router.message(F.text.lower() == "оплата электроэнергии.")
297
async def handle_electricity_payment(message:Message, state:FSMContext):
298
    await state.set_state(Form.full_name)
299
    await message.answer("Введите ваше ФИО")
300

301
    electricity_payment()
302

303

304
@router.message(F.text.lower() == "Аванс")
305
async def handle_prepaid_expense(message:Message, state:FSMContext):
306
    await state.set_state(Form.full_name)
307
    await message.answer("Введите ваше ФИО")
308

309
    prepaid_expense()
310

311

312
@router.message(F.text.lower() == "Членские взносы")
313
async def handle_fees(message:Message, state:FSMContext):
314
    await state.set_state(Form.full_name)
315
    await message.answer("Введите ваше ФИО")
316

317
    fees()
318

319

320

321
async def main():
322
    await dp.start_polling(bot)
323

324
if __name__ == "__main__":
325
    asyncio.run(main())
326

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.