Passed
Push — master ( 5bb24e...0e504e )
by Daniil
18:24 queued 12s
created

main.generate_debtors_message()   A

Complexity

Conditions 2

Size

Total Lines 12
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 11
dl 0
loc 12
rs 9.85
c 0
b 0
f 0
cc 2
nop 0
1
import datetime
2
import json
3
import os
4
import re
5
from enum import Enum
6
7
import requests
8
from psycopg2 import ProgrammingError
9
from vk_api.bot_longpoll import VkBotEventType
10
from googletrans import Translator
11
12
from bot import Bot
13
from database import Database
14
from keyboard import Keyboards
15
from scheduler import Date
16
from scheduler import Schedule
17
18
db = Database(os.environ["DATABASE_URL"])
19
bot = Bot()
20
kbs = Keyboards()
21
22
bot.auth()
23
bot.update_version()
24
25
26
class EventTypes(Enum):
27
    NEW_MESSAGE = VkBotEventType.MESSAGE_NEW
28
29
30
def send_schedule(date: str):
31
    s = Schedule(date)
32
    s.get_raw()
33
    if s.is_exist():
34
        sch = s.generate()
35
        bot.send_message(msg=sch, pid=event["message"]["from_id"])
36
    else:
37
        bot.send_message(msg="Расписание отсутствует.", pid=event["message"]["from_id"])
38
39
40
def generate_call_message():
41
    f = db.get_names_using_status(event["message"]["from_id"])
42
    students_ids = db.get_call_ids(event["message"]["from_id"])
43
    if students_ids is not None:
44
        mentions = bot.generate_mentions(ids=students_ids, names=f)
45
    else:
46
        mentions = ""
47
    message = db.get_call_message(event["message"]["from_id"]) or ""
48
    message = f"{mentions}\n{message}"
49
    return message
50
51
52
def generate_debtors_message():
53
    f = db.get_names_using_status(event["message"]["from_id"])
54
    students_ids = db.get_call_ids(event["message"]["from_id"])
55
    slg = db.get_active_expenses_category(event["message"]["from_id"])
56
    nm = db.get_expense_category_by_slug(slg)
57
    sm = db.get_expense_summ(slg)
58
    if students_ids is not None:
59
        mentions = bot.generate_mentions(ids=students_ids, names=f)
60
    else:
61
        mentions = ""
62
    message = f"{mentions}, вам нужно принести по {sm} руб. на {nm}."
63
    return message
64
65
66
def send_call_confirm():
67
    chat_id = int(str(db.get_conversation(event["message"]["from_id"]))[-1])
68
    if db.get_session_state(event["message"]["from_id"]) == "debtors_forming":
69
        message = generate_debtors_message()
70
    else:
71
        message = generate_call_message()
72
    atch = db.get_call_attaches(event["message"]["from_id"])
73
    if atch is None:
74
        atch = ""
75
    if message != "\n" or atch:
76
        bot.send_message(
77
            msg=f"В {'тестовую ' if chat_id == 1 else 'основную '}"
78
            f"беседу будет отправлено сообщение:",
79
            pid=event["message"]["from_id"],
80
            keyboard=kbs.prompt(event["message"]["from_id"]),
81
        )
82
        bot.send_message(msg=message, pid=event["message"]["from_id"], attachment=atch)
83
    else:
84
        db.empty_call_storage(event["message"]["from_id"])
85
        bot.send_gui(
86
            pid=event["message"]["from_id"],
87
            text="Сообщение не может быть пустым. Отмена...",
88
        )
89
90
91
def load_attachs():
92
    attachments = []
93
    for i, v in enumerate(event["message"]["attachments"]):
94
        m = -1
95
        m_url = ""
96
        for ind, val in enumerate(event["message"]["attachments"][i]["photo"]["sizes"]):
97
            if val["height"] > m:
98
                m_url = val["url"]
99
        req = requests.get(m_url)
100
        server = bot.bot_vk.photos.getMessagesUploadServer()
101
        with open(f"photo.jpg", "wb") as f:
102
            f.write(req.content)
103
        file = open(f"photo.jpg", "rb")
104
        upload = requests.post(server["upload_url"], files={"photo": file},).json()
105
        save = bot.bot_vk.photos.saveMessagesPhoto(**upload)
106
        photo = f"photo{save[0]['owner_id']}_{save[0]['id']}"
107
        attachments.append(photo)
108
    atch = ",".join(attachments)
109
    state = db.get_session_state(event["message"]["from_id"])
110
    if state == "ask_for_mailing_message":
111
        db.update_mailing_attaches(event["message"]["from_id"], atch)
112
    elif state == "ask_for_call_message":
113
        db.update_call_attaches(event["message"]["from_id"], atch)
114
115
116
for event in bot.longpoll.listen():
117
    event = {
118
        "type": event.type,
119
        "client_info": event.object.client_info,
120
        "message": event.object.message,
121
    }
122
    if (
123
        event["type"] == EventTypes.NEW_MESSAGE.value
124
        and (event["message"]["text"] or event["message"]["attachments"])
125
        and event["message"]["out"] == 0
126
        and event["message"]["from_id"] == event["message"]["peer_id"]
127
    ):
128
        try:
129
            payload = json.loads(event["message"]["payload"])
130
        except KeyError:
131
            payload = {"button": ""}
132
        text = event["message"]["text"].lower()
133
134
        # :blockstart: Запуск интерфейса
135
        if text in ["начать", "старт", "r"]:
136
            if not db.is_user_exist(event["message"]["from_id"]):
137
                db.create_user(event["message"]["from_id"])
138
            if not db.is_session_exist(event["message"]["from_id"]):
139
                db.create_session(event["message"]["from_id"])
140
            bot.send_gui(pid=event["message"]["from_id"])
141
        # :blockend: Запуск интерфейса
142
143
        # :blockstart: Возврат на главный экран
144
        elif payload["button"] == "home":
145
            bot.send_gui(text="Главный экран", pid=event["message"]["from_id"])
146
        # :blockend: Возврат на главный экран
147
148
        # :blockstart: Призыв
149
        elif payload["button"] == "call":
150
            db.update_session_state(event["message"]["from_id"], "ask_for_call_message")
151
            if not db.call_session_exist(event["message"]["from_id"]):
152
                db.create_call_session(event["message"]["from_id"])
153
            bot.send_message(
154
                msg="Отправьте сообщение к призыву (есть поддержка изображений)",
155
                pid=event["message"]["from_id"],
156
                keyboard=kbs.skip(),
157
            )
158
        elif payload["button"] == "letter":
159
            bot.send_message(
160
                msg=f"Отправка клавиатуры с фамилиями на букву \"{payload['letter']}\"",
161
                pid=event["message"]["from_id"],
162
                keyboard=kbs.generate_names_keyboard(payload["letter"]),
163
            )
164
        elif (
165
            payload["button"] == "student"
166
            and db.get_session_state(event["message"]["from_id"]) != "select_donater"
167
        ):
168
            ids = db.get_call_ids(event["message"]["from_id"])
169
            if ids:
170
                students = ids.split(",")
171
            else:
172
                students = [ids]
173
            if str(db.get_vk_id(payload["id"])) in students:
174
                bot.send_message(
175
                    msg=f"{payload['name']} уже был выбран для призыва. Пропуск.",
176
                    pid=event["message"]["from_id"],
177
                )
178
            else:
179
                db.append_to_call_ids(
180
                    event["message"]["from_id"], db.get_vk_id(payload["id"])
181
                )
182
                bot.send_message(
183
                    msg=f"{payload['name']} добавлен к списку призыва.",
184
                    pid=event["message"]["from_id"],
185
                )
186
        elif (
187
            payload["button"] == "back"
188
            and db.get_session_state(event["message"]["from_id"]) != "select_donater"
189
        ):
190
            bot.send_message(
191
                msg="Отправка клавиатуры с алфавитом.",
192
                pid=event["message"]["from_id"],
193
                keyboard=kbs.generate_call_prompt(),
194
            )
195
        elif payload["button"] == "skip":
196
            db.update_session_state(event["message"]["from_id"], "call_configuring")
197
            bot.send_message(
198
                msg="Отправка клавиатуры с алфавитом.",
199
                pid=event["message"]["from_id"],
200
                keyboard=kbs.generate_call_prompt(),
201
            )
202
        elif (
203
            db.get_session_state(event["message"]["from_id"]) == "ask_for_call_message"
204
        ):
205
            db.update_call_message(
206
                event["message"]["from_id"], event["message"]["text"]
207
            )
208
            if event["message"]["attachments"]:
209
                load_attachs()
210
            bot.send_message(
211
                msg="Отправка клавиатуры призыва",
212
                pid=event["message"]["from_id"],
213
                keyboard=kbs.generate_call_prompt(),
214
            )
215
            db.update_session_state(event["message"]["from_id"], "call_configuring")
216
        elif payload["button"] == "send_to_all":
217
            ids = ",".join(db.get_active_students_ids())
218
            db.update_call_ids(event["message"]["from_id"], ids)
219
            bot.send_message(
220
                msg="Все студенты отмечены как получатели уведомления",
221
                pid=event["message"]["from_id"],
222
            )
223
            send_call_confirm()
224
        elif payload["button"] == "save":
225
            send_call_confirm()
226
        elif (
227
            payload["button"] == "cancel"
228
            and db.get_session_state(event["message"]["from_id"]) == "call_configuring"
229
        ):
230
            db.empty_call_storage(event["message"]["from_id"])
231
            db.update_session_state(event["message"]["from_id"], "main")
232
            bot.send_gui(
233
                text="Выполнение команды отменено.", pid=event["message"]["from_id"]
234
            )
235
        elif payload["button"] == "confirm" and db.get_session_state(
236
            event["message"]["from_id"]
237
        ) in ["call_configuring", "debtors_forming"]:
238
            bot.log.info("Отправка призыва...")
239
            cid = db.get_conversation(event["message"]["from_id"])
240
            if db.get_session_state(event["message"]["from_id"]) == "debtors_forming":
241
                text = generate_debtors_message()
242
            else:
243
                text = generate_call_message()
244
            attachment = db.get_call_attaches(event["message"]["from_id"])
245
            if attachment is None:
246
                attachment = ""
247
            bot.send_message(pid=cid, msg=text, attachment=attachment)
248
            db.empty_call_storage(event["message"]["from_id"])
249
            db.update_session_state(event["message"]["from_id"], "main")
250
            bot.send_gui(text="Сообщение отправлено.", pid=event["message"]["from_id"])
251
        elif payload["button"] == "deny" and db.get_session_state(
252
            event["message"]["from_id"]
253
        ) in ["call_configuring", "debtors_forming"]:
254
            db.update_call_message(event["message"]["from_id"], " ")
255
            db.update_call_ids(event["message"]["from_id"], " ")
256
            db.update_session_state(event["message"]["from_id"], "main")
257
            bot.send_gui(
258
                text="Выполнение команды отменено.", pid=event["message"]["from_id"]
259
            )
260
        elif payload["button"] == "chconv_call":
261
            conv = db.get_conversation(event["message"]["from_id"])
262
            chat = int(str(conv)[-1])
263
            if chat == 1:
264
                db.update_conversation(event["message"]["from_id"], 2000000002)
265
                chat = 2
266
            elif chat == 2:
267
                db.update_conversation(event["message"]["from_id"], 2000000001)
268
                chat = 1
269
            send_call_confirm()
270
271
        elif payload["button"] == "chnames_call":
272
            if db.get_names_using_status(event["message"]["from_id"]):
273
                status = 0
274
            else:
275
                status = 1
276
            db.update_names_using_status(event["message"]["from_id"], status)
277
            send_call_confirm()
278
        # :blockend: Призыв
279
280
        # :blockstart: Расписание
281
        elif payload["button"] == "schedule":
282
            bot.send_message(
283
                msg="Отправка клавиатуры с расписанием.",
284
                pid=event["message"]["from_id"],
285
                keyboard=kbs.generate_schedule_keyboard(),
286
            )
287
        elif payload["button"] == "today":
288
            d = Date()
289
            send_schedule(d.today)
290
        elif payload["button"] == "tomorrow":
291
            d = Date()
292
            send_schedule(d.tomorrow)
293
        elif payload["button"] == "day_after_tomorrow":
294
            d = Date()
295
            send_schedule(d.day_after_tomorrow)
296
        elif payload["button"] == "arbitrary":
297
            bot.send_message(
298
                msg="Напишите дату в формате ДД-ММ-ГГГГ.",
299
                pid=event["message"]["from_id"],
300
                keyboard=kbs.cancel(),
301
            )
302
            db.update_session_state(
303
                event["message"]["from_id"], "ask_for_schedule_date"
304
            )
305
        elif (
306
            payload["button"] == "cancel"
307
            and db.get_session_state(event["message"]["from_id"])
308
            == "ask_for_schedule_date"
309
        ):
310
            db.update_session_state(event["message"]["from_id"], "main")
311
            bot.send_message(
312
                msg="Выполнение команды отменено.",
313
                pid=event["message"]["from_id"],
314
                keyboard=kbs.generate_schedule_keyboard(),
315
            )
316
        elif (
317
            db.get_session_state(event["message"]["from_id"]) == "ask_for_schedule_date"
318
        ):
319
            if re.match(r"^\d\d(.|-|/)\d\d(.|-|/)20\d\d$", event["message"]["text"]):
320
                try:
321
                    d = datetime.datetime.strptime(
322
                        event["message"]["text"], "%d-%m-%Y"
323
                    ).strftime("%Y-%m-%d")
324
                except ValueError:
325
                    bot.send_message(
326
                        msg="Неверный формат даты. Попробуйте еще раз.",
327
                        pid=event["message"]["from_id"],
328
                    )
329
                else:
330
                    s = Schedule(d)
331
                    s.get_raw()
332
                    if s.is_exist():
333
                        schedule = s.generate()
334
                        bot.send_message(
335
                            msg=schedule,
336
                            pid=event["message"]["from_id"],
337
                            keyboard=kbs.generate_schedule_keyboard(),
338
                        )
339
                        db.update_session_state(event["message"]["from_id"], "main")
340
                    else:
341
                        bot.send_message(
342
                            msg="Расписание отсутствует.\nПопробуй указать другую "
343
                            "дату.",
344
                            pid=event["message"]["from_id"],
345
                        )
346
                        db.update_session_state(
347
                            event["message"]["from_id"], "ask_for_schedule_date"
348
                        )
349
            else:
350
                bot.send_message(
351
                    msg="Неверный формат даты. Попробуйте еще раз.",
352
                    pid=event["message"]["from_id"],
353
                )
354
        # :blockend: Расписание
355
356
        # :blockstart: Рассылки
357
        elif payload["button"] == "mailings":
358
            bot.send_message(
359
                msg="Отправка клавиатуры со списком рассылок.",
360
                pid=event["message"]["from_id"],
361
                keyboard=kbs.generate_mailings_keyboard(),
362
            )
363
        elif payload["button"] == "mailing":
364
            if not db.mailing_session_exist(event["message"]["from_id"]):
365
                db.create_mailing_session(event["message"]["from_id"])
366
            db.update_mailing_session(event["message"]["from_id"], payload["slug"])
367
            bot.send_message(
368
                msg=f"Меню управления рассылкой \"{payload['name']}\":",
369
                pid=event["message"]["from_id"],
370
                keyboard=kbs.generate_mailing_mgmt(
371
                    is_admin=bot.is_admin(event["message"]["from_id"]),
372
                    slug=payload["slug"],
373
                    user_id=event["message"]["from_id"],
374
                ),
375
            )
376
        elif payload["button"] == "subscribe":
377
            db.update_subscribe_state(payload["slug"], payload["id"], 1)
378
            bot.send_message(
379
                msg="Вы были успешно подписаны на рассылку.",
380
                pid=event["message"]["from_id"],
381
                keyboard=kbs.generate_mailing_mgmt(
382
                    is_admin=bot.is_admin(event["message"]["from_id"]),
383
                    slug=payload["slug"],
384
                    user_id=event["message"]["from_id"],
385
                ),
386
            )
387
        elif payload["button"] == "unsubscribe":
388
            db.update_subscribe_state(payload["slug"], payload["id"], 0)
389
            bot.send_message(
390
                msg="Вы были успешно отписаны от рассылки.",
391
                pid=event["message"]["from_id"],
392
                keyboard=kbs.generate_mailing_mgmt(
393
                    is_admin=bot.is_admin(event["message"]["from_id"]),
394
                    slug=payload["slug"],
395
                    user_id=event["message"]["from_id"],
396
                ),
397
            )
398
        elif payload["button"] == "send_mailing":
399
            db.update_session_state(
400
                event["message"]["from_id"], "ask_for_mailing_message"
401
            )
402
            bot.send_message(
403
                msg="Отправьте текст рассылки (есть поддержка изображений)",
404
                pid=event["message"]["from_id"],
405
                keyboard=kbs.cancel(),
406
            )
407
        elif (
408
            payload["button"] == "cancel"
409
            and db.get_session_state(event["message"]["from_id"])
410
            == "ask_for_mailing_message"
411
        ):
412
            bot.send_message(
413
                msg="Выполнение команды отменено. Возвращаюсь на экран управления "
414
                "рассылкой.",
415
                pid=event["message"]["from_id"],
416
                keyboard=kbs.generate_mailing_mgmt(
417
                    is_admin=bot.is_admin(event["message"]["from_id"]),
418
                    slug=db.get_mailing_session(event["message"]["from_id"]),
419
                    user_id=event["message"]["from_id"],
420
                ),
421
            )
422
            db.update_session_state(event["message"]["from_id"], "main")
423
        elif (
424
            db.get_session_state(event["message"]["from_id"])
425
            == "ask_for_mailing_message"
426
        ):
427
            db.update_mailing_message(
428
                event["message"]["from_id"], event["message"]["text"]
429
            )
430
            if event["message"]["attachments"]:
431
                load_attachs()
432
            bot.send_message(
433
                msg="Всем подписчикам рассылки будет отправлено сообщение с указанным вами текстом",
434
                pid=event["message"]["from_id"],
435
                keyboard=kbs.prompt(),
436
                forward=f"{event['message']['id']}",
437
            )
438
            db.update_session_state(event["message"]["from_id"], "prompt_mailing")
439
        elif (
440
            payload["button"] == "confirm"
441
            and db.get_session_state(event["message"]["from_id"]) == "prompt_mailing"
442
        ):
443
            attach = db.get_mailing_attaches(event["message"]["from_id"])
444
            if attach is None:
445
                attach = ""
446
            bot.send_mailing(
447
                slug=db.get_mailing_session(event["message"]["from_id"]),
448
                text=db.get_mailing_message(event["message"]["from_id"]),
449
                attach=attach,
450
            )
451
            bot.send_message(
452
                msg="Рассылка отправлена.",
453
                pid=event["message"]["from_id"],
454
                keyboard=kbs.generate_mailings_keyboard(),
455
            )
456
        elif (
457
            payload["button"] == "deny"
458
            and db.get_session_state(event["message"]["from_id"]) == "prompt_mailing"
459
        ):
460
            db.empty_mailing_storage(event["message"]["from_id"])
461
            bot.send_message(
462
                msg="Отправка рассылки отменена.",
463
                pid=event["message"]["from_id"],
464
                keyboard=kbs.generate_mailings_keyboard(),
465
            )
466
        # :blockend: Рассылки
467
468
        # :blockstart: Параметры
469
        elif payload["button"] == "prefs":
470
            bot.send_message(
471
                msg="Параметры",
472
                pid=event["message"]["from_id"],
473
                keyboard=kbs.generate_prefs_keyboard(),
474
            )
475
476
        elif payload["button"] == "chconv":
477
            chat = db.get_conversation(event["message"]["from_id"])
478
            if chat == 2000000001:
479
                bot.send_message(
480
                    msg="Тестовая беседа сейчас активна",
481
                    pid=event["message"]["from_id"],
482
                    keyboard=kbs.generate_conv_selector(chat),
483
                )
484
            elif chat == 2000000002:
485
                bot.send_message(
486
                    msg="Основная беседа сейчас активна",
487
                    pid=event["message"]["from_id"],
488
                    keyboard=kbs.generate_conv_selector(chat),
489
                )
490
491
        elif payload["button"] == "select_main_conv":
492
            chat = 2000000002
493
            db.update_conversation(event["message"]["from_id"], chat)
494
            bot.send_message(
495
                msg="Основная беседа активна.",
496
                pid=event["message"]["from_id"],
497
                keyboard=kbs.generate_conv_selector(chat),
498
            )
499
        elif payload["button"] == "select_test_conv":
500
            chat = 2000000001
501
            db.update_conversation(event["message"]["from_id"], chat)
502
            bot.send_message(
503
                msg="Тестовая беседа активна.",
504
                pid=event["message"]["from_id"],
505
                keyboard=kbs.generate_conv_selector(chat),
506
            )
507
508
        elif payload["button"] == "names":
509
            status = db.get_names_using_status(event["message"]["from_id"])
510
            msg = (
511
                f"Использование имён в призыве "
512
                f"{'активно' if status else 'неактивно'}."
513
            )
514
            bot.send_message(
515
                msg=msg,
516
                pid=event["message"]["from_id"],
517
                keyboard=kbs.generate_names_selector(status),
518
            )
519
520
        elif payload["button"] == "off_using_names":
521
            status = 0
522
            db.update_names_using_status(event["message"]["from_id"], status)
523
            bot.send_message(
524
                msg="Использование имён в призыве отключено.",
525
                pid=event["message"]["from_id"],
526
                keyboard=kbs.generate_names_selector(bool(status)),
527
            )
528
        elif payload["button"] == "on_using_names":
529
            status = 1
530
            db.update_names_using_status(event["message"]["from_id"], status)
531
            bot.send_message(
532
                msg="Использование имён в призыве включено.",
533
                pid=event["message"]["from_id"],
534
                keyboard=kbs.generate_names_selector(bool(status)),
535
            )
536
        # :blockend: Параметры
537
538
        # :blockstart: Финансы
539
540
        elif payload["button"] == "finances":
541
            bot.send_message(
542
                msg="Меню финансов",
543
                pid=event["message"]["from_id"],
544
                keyboard=kbs.finances_main(),
545
            )
546
547
        elif payload["button"] == "fin_category":
548
            if "slug" not in payload and "name" not in payload:
549
                slug = db.get_active_expenses_category(event["message"]["from_id"])
550
                payload.update(
551
                    {"slug": slug, "name": db.get_expense_category_by_slug(slug),}
552
                )
553
            db.update_active_expenses_category(
554
                event["message"]["from_id"], payload["slug"]
555
            )
556
            bot.send_message(
557
                msg=f"Меню управления статьей {payload['name']}.",
558
                pid=event["message"]["from_id"],
559
                keyboard=kbs.fin_category_menu(),
560
            )
561
562
        elif payload["button"] == "balance":
563
            donates = sum(db.get_all_donates())
564
            expenses = sum(db.get_all_expenses())
565
            delta = donates - expenses
566
567
            bot.send_message(
568
                msg=f"Остаток: {delta} руб.", pid=event["message"]["from_id"]
569
            )
570
        elif payload["button"] == "add_expense_cat":
571
            db.update_session_state(
572
                user_id=event["message"]["from_id"],
573
                state="ask_for_new_expenses_cat_prefs",
574
            )
575
            bot.send_message(
576
                msg="Отправьте название статьи расхода и сумму сбора, отделенную "
577
                "запятой.\n Пример: 23 февраля, 500",
578
                pid=event["message"]["from_id"],
579
                keyboard=kbs.cancel(),
580
            )
581
        elif (
582
            db.get_session_state(event["message"]["from_id"])
583
            == "ask_for_new_expenses_cat_prefs"
584
            and payload["button"] == "cancel"
585
        ):
586
            db.update_session_state(event["message"]["from_id"], "main")
587
            bot.send_message(
588
                msg="Операция отменена.",
589
                pid=event["message"]["from_id"],
590
                keyboard=kbs.finances_main(),
591
            )
592
        elif (
593
            db.get_session_state(event["message"]["from_id"])
594
            == "ask_for_new_expenses_cat_prefs"
595
        ):
596
            if re.match(r"^.*,.*\d+$", event["message"]["text"]):
597
                parsed = event["message"]["text"].split(",")
598
                name, summ = parsed
599
                slug = (
600
                    Translator()
601
                    .translate(name)
602
                    .text.lower()
603
                    .replace(" ", "-")
604
                    .replace("'", "")
605
                )
606
                db.add_expences_category(name, slug, summ)
607
                bot.send_message(
608
                    msg=f'Новая статья "{name}" с суммой сборов {summ} р. успешно создана.',
609
                    pid=event["message"]["from_id"],
610
                    keyboard=kbs.finances_main(),
611
                )
612
                db.update_session_state(event["message"]["from_id"], "main")
613
            else:
614
                bot.send_message(
615
                    msg=f"Неверный формат сообщения.",
616
                    pid=event["message"]["from_id"],
617
                    keyboard=kbs.finances_main(),
618
                )
619
620
        elif payload["button"] == "fin_prefs":
621
            cat = db.get_expense_category_by_slug(
622
                db.get_active_expenses_category(event["message"]["from_id"])
623
            )
624
            bot.send_message(
625
                msg=f"Настройки категории {cat}",
626
                pid=event["message"]["from_id"],
627
                keyboard=kbs.fin_prefs(),
628
            )
629
630
        elif payload["button"] == "update_summ":
631
            cat = db.get_expense_category_by_slug(
632
                db.get_active_expenses_category(event["message"]["from_id"])
633
            )
634
            db.update_session_state(
635
                user_id=event["message"]["from_id"], state="ask_for_expense_cat_summ",
636
            )
637
            bot.send_message(
638
                msg=f"Введите новую сумму для статьи {cat}:",
639
                pid=event["message"]["from_id"],
640
                keyboard=kbs.cancel(),
641
            )
642
643
        elif (
644
            payload["button"] == ""
645
            and db.get_session_state(event["message"]["from_id"])
646
            == "ask_for_expense_cat_summ"
647
        ):
648
            if re.match(r"^\d+$", event["message"]["text"]):
649
                db.update_expense_summ(
650
                    db.get_active_expenses_category(event["message"]["from_id"]),
651
                    event["message"]["text"],
652
                )
653
                bot.send_message(
654
                    msg="Сумма сборов обновлена.",
655
                    pid=event["message"]["from_id"],
656
                    keyboard=kbs.fin_prefs(),
657
                )
658
            else:
659
                bot.send_message(
660
                    msg="Неверный формат сообщения. Необходимо только число.",
661
                    pid=event["message"]["from_id"],
662
                )
663
664
        elif (
665
            payload["button"] == "cancel"
666
            and db.get_session_state(event["message"]["from_id"])
667
            == "ask_for_expense_cat_summ"
668
        ):
669
            db.update_session_state(event["message"]["from_id"], "main")
670
            bot.send_message(
671
                msg="Операция отменена.",
672
                pid=event["message"]["from_id"],
673
                keyboard=kbs.fin_category_menu(),
674
            )
675
676
        elif payload["button"] == "update_name":
677
            cat = db.get_expense_category_by_slug(
678
                db.get_active_expenses_category(event["message"]["from_id"])
679
            )
680
            db.update_session_state(
681
                user_id=event["message"]["from_id"], state="ask_for_expense_cat_name",
682
            )
683
            bot.send_message(
684
                msg=f"Введите новое имя для статьи {cat}:",
685
                pid=event["message"]["from_id"],
686
                keyboard=kbs.cancel(),
687
            )
688
689
        elif (
690
            payload["button"] == ""
691
            and db.get_session_state(event["message"]["from_id"])
692
            == "ask_for_expense_cat_name"
693
        ):
694
            db.update_expense_name(
695
                db.get_active_expenses_category(event["message"]["from_id"]),
696
                event["message"]["text"],
697
            )
698
            bot.send_message(
699
                msg="Название сбора обновлено.",
700
                pid=event["message"]["from_id"],
701
                keyboard=kbs.fin_prefs(),
702
            )
703
704
        elif (
705
            payload["button"] == "cancel"
706
            and db.get_session_state(event["message"]["from_id"])
707
            == "ask_for_expense_cat_name"
708
        ):
709
            db.update_session_state(event["message"]["from_id"], "main")
710
            bot.send_message(
711
                msg="Операция отменена.",
712
                pid=event["message"]["from_id"],
713
                keyboard=kbs.fin_category_menu(),
714
            )
715
        elif payload["button"] == "delete_expense":
716
            cat = db.get_expense_category_by_slug(
717
                db.get_active_expenses_category(event["message"]["from_id"])
718
            )
719
            db.update_session_state(
720
                user_id=event["message"]["from_id"], state="confirm_delete_expense",
721
            )
722
            bot.send_message(
723
                msg=f"Вы действительно хотите удалить статью {cat}?\nВсе связанные "
724
                f"записи также будут удалены.",
725
                pid=event["message"]["from_id"],
726
                keyboard=kbs.prompt(),
727
            )
728
729
        elif (
730
            payload["button"] == "confirm"
731
            and db.get_session_state(event["message"]["from_id"])
732
            == "confirm_delete_expense"
733
        ):
734
            slug = db.get_active_expenses_category(event["message"]["from_id"])
735
            name = db.get_expense_category_by_slug(slug)
736
            db.delete_expense_catgory(slug)
737
            db.update_active_expenses_category(event["message"]["from_id"], "none")
738
            db.update_session_state(event["message"]["from_id"], "main")
739
            bot.send_message(
740
                msg=f"Категория {name} удалена.",
741
                pid=event["message"]["from_id"],
742
                keyboard=kbs.finances_main(),
743
            )
744
745
        elif (
746
            payload["button"] == "deny"
747
            and db.get_session_state(event["message"]["from_id"])
748
            == "confirm_delete_expense"
749
        ):
750
            db.update_session_state(event["message"]["from_id"], "main")
751
            bot.send_message(
752
                msg="Операция отменена.",
753
                pid=event["message"]["from_id"],
754
                keyboard=kbs.fin_prefs(),
755
            )
756
757
        elif payload["button"] == "add_donate":
758
            try:
759
                db.update_session_state(event["message"]["from_id"], "select_donater")
760
            except ProgrammingError:
761
                pass
762
            bot.send_message(
763
                msg="Выберите внесшего деньги:",
764
                pid=event["message"]["from_id"],
765
                keyboard=kbs.generate_finances_prompt(),
766
            )
767
768
        elif (
769
            payload["button"] == "student"
770
            and db.get_session_state(event["message"]["from_id"]) == "select_donater"
771
        ):
772
            slug = db.get_active_expenses_category(event["message"]["from_id"])
773
            summ = db.get_expense_summ(slug)
774
            d_list = db.get_list_of_donaters_by_slug(slug, summ)
775
            d_id = db.create_donate(payload["id"], slug)
776
            db.update_donate_id(event["message"]["from_id"], d_id)
777
            db.update_session_state(event["message"]["from_id"], "ask_for_donate_summ")
778
            bot.send_message(
779
                msg="Введите сумму взноса",
780
                pid=event["message"]["from_id"],
781
                keyboard=kbs.cancel(),
782
            )
783
784
        elif (
785
            payload["button"] == "cancel"
786
            and db.get_session_state(event["message"]["from_id"])
787
            == "ask_for_donate_summ"
788
        ):
789
            d_id = db.get_donate_id(event["message"]["from_id"])
790
            db.delete_donate(d_id)
791
            bot.send_message(
792
                msg="Операция отменена.",
793
                pid=event["message"]["from_id"],
794
                keyboard=kbs.fin_category_menu(),
795
            )
796
797
        elif (
798
            payload["button"] == ""
799
            and db.get_session_state(event["message"]["from_id"])
800
            == "ask_for_donate_summ"
801
        ):
802
            if re.match(r"^\d+$", event["message"]["text"]):
803
                d_id = db.get_donate_id(event["message"]["from_id"])
804
                print(d_id)
805
                db.append_summ_to_donate(d_id, event["message"]["text"])
806
                db.update_session_state(event["message"]["from_id"], "main")
807
                bot.send_message(
808
                    "Запись успешно создана.",
809
                    pid=event["message"]["from_id"],
810
                    keyboard=kbs.fin_category_menu(),
811
                )
812
813
            else:
814
                bot.send_message(
815
                    "Неверный формат сообщения. Необходимо только число.",
816
                    pid=event["message"]["from_id"],
817
                )
818
819
        elif (
820
            payload["button"] == "back"
821
            and db.get_session_state(event["message"]["from_id"]) == "select_donater"
822
        ):
823
            bot.send_message(
824
                msg="Отправка клавиатуры с алфавитом.",
825
                pid=event["message"]["from_id"],
826
                keyboard=kbs.generate_finances_prompt(),
827
            )
828
829
        elif (
830
            payload["button"] == "cancel"
831
            and db.get_session_state(event["message"]["from_id"]) == "select_donater"
832
        ):
833
            bot.send_message(
834
                msg="Операция отменена",
835
                pid=event["message"]["from_id"],
836
                keyboard=kbs.fin_category_menu(),
837
            )
838
839
        elif payload["button"] == "fin_stat":
840
841
            bot.send_message(msg="Вычисляю...", pid=event["message"]["from_id"])
842
843
            slug = db.get_active_expenses_category(event["message"]["from_id"])
844
            summ = db.get_expense_summ(slug)
845
            d_ids = db.get_list_of_donaters_by_slug(slug, summ)
846
            s_ids = db.get_active_students_ids()
847
            name = db.get_expense_category_by_slug(slug)
848
849
            donated = len(d_ids)
850
            not_donated = len(s_ids) - donated
851
            collected = sum(db.get_all_donates_in_category(slug))
852
853
            bot.send_message(
854
                msg=f'Статистика по статье "{name}":\n'
855
                f"Всего сдали: {donated} человек;\n"
856
                f"Всего не сдали: {not_donated} человек;\n"
857
                f"Всего собрано: {collected} руб.",
858
                pid=event["message"]["from_id"],
859
            )
860
861
        elif payload["button"] == "add_expense":
862
            db.update_session_state(event["message"]["from_id"], "ask_for_expense_summ")
863
            bot.send_message(
864
                msg="Введите сумму расхода (нужно ввести только число):",
865
                pid=event["message"]["from_id"],
866
                keyboard=kbs.cancel(),
867
            )
868
869
        elif (
870
            payload["button"] == "cancel"
871
            and db.get_session_state(event["message"]["from_id"])
872
            == "ask_for_expense_summ"
873
        ):
874
            db.update_session_state(event["message"]["from_id"], "main")
875
            bot.send_message(
876
                msg="Операция отменена.",
877
                pid=event["message"]["from_id"],
878
                keyboard=kbs.fin_category_menu(),
879
            )
880
881
        elif (
882
            db.get_session_state(event["message"]["from_id"]) == "ask_for_expense_summ"
883
        ):
884
            if re.match(r"^\d+$", event["message"]["text"]):
885
                slug = db.get_active_expenses_category(event["message"]["from_id"])
886
                db.add_expense(slug, event["message"]["text"])
887
                bot.send_message(
888
                    msg="Запись создана.",
889
                    pid=event["message"]["from_id"],
890
                    keyboard=kbs.fin_category_menu(),
891
                )
892
                db.update_session_state(event["message"]["from_id"], "main")
893
894
            else:
895
                bot.send_message(
896
                    msg="Неверный формат сообщения.", pid=event["message"]["from_id"]
897
                )
898
899
        elif payload["button"] == "debtors":
900
            bot.send_message(
901
                msg="Генерация сообщения может занять некоторое " "время...",
902
                pid=event["message"]["from_id"],
903
            )
904
            db.update_session_state(event["message"]["from_id"], "debtors_forming")
905
            slug = db.get_active_expenses_category(event["message"]["from_id"])
906
            summ = db.get_expense_summ(slug)
907
            d_s_ids = db.get_list_of_donaters_by_slug(slug, summ)
908
            d_ids = set([str(db.get_vk_id(i)) for i in d_s_ids])
909
            s_ids = set(db.get_active_students_ids())
910
            debtors = ",".join(s_ids.difference(d_ids))
911
            db.update_call_ids(event["message"]["from_id"], debtors)
912
            send_call_confirm()
913
914
        # :blockend: Финансы
915