async def all_payers(message: types.Message): payers = db.all_payers() if not payers: await message.answer("Сурикаты не найдены 😢") else: answer = '🌿 Сурикаты:\n\n' for payer in payers: answer += payer + '\n' await message.answer(answer)
async def handle_docs_photo(message: types.Message): global cost global products if len(db.all_payers()) < 2: await message.answer("⚠️ Сурикатов должно быть двое. ⚠️\n" "Добавьте их через команду /add_payer") return # Получаем изображение в виде экземпляра io.BytesIO. bytes_of_photo = await bot.download_file_by_id(message.photo[-1].file_id) # Приводим к numpy массиву. img = Image.open(bytes_of_photo) img = np.array(img) try: # Получаем данные из qr-кода на изображении и обрабатываем их (основной расход глобальный). ticket_data = await scan_qr_image(img) is_simple, products = await parse_ticket(ticket_data) except Exception as e: print('Возникла ошибка: ', e) await message.answer(f"🆘 Что-то пошло не так:\n{e}") return # Если чек простой (нельзя считать каждый продукт отдельно), то обрабатываем его как кастомный расход. # Предварительно узнаем из какого магазина чек. if is_simple: keyboard = InlineKeyboardMarkup(row_width=2) button1 = InlineKeyboardButton('✴️ Давай', callback_data='Давай') button2 = InlineKeyboardButton('🚫 Отмена', callback_data='Отмена') keyboard.add(button1, button2) await message.answer( "Мне не удалось детально просканировать чек 🥺\n\n" f"Чек в {cost['магазин']} на сумму {cost['сумма']}.\n\n" "Но я могу добавить сумму в нём как общий расход (пополам).\n" "Хотите продолжить?", reply_markup=keyboard) else: keyboard = InlineKeyboardMarkup(row_width=2) button1 = InlineKeyboardButton("❇️ Пополам", callback_data="Пополам") button2 = InlineKeyboardButton("🆚 Уточнить", callback_data="Уточнить") button3 = InlineKeyboardButton('🚫 Отмена', callback_data='Отмена') keyboard.add(button1, button2, button3) products_str = await products2str(products) await message.answer( "💙 Отлично! Мне удалось полностью обработать чек.\n\n" f"Чек из {cost['магазин']} на сумму {cost['сумма']}.\n\n" f"Проверьте товары в чеке:\n\n{products_str}\n" "Если Вы уверены, что все товары общие, то можно делить сумму чека на двоих пополам ❇️\n" "Иначе, Вы можете уточнить плательщика для каждого товара 🆚", reply_markup=keyboard)
async def get_keyboard_payers(alias: str, need_cancel=True) -> InlineKeyboardMarkup: """ Возвращает клавиатуру с плательщиками. :alias: псевдоним, добавяемый перед callback_data у кнопок. :return: клавиатура с плательщиками. """ keyboard = InlineKeyboardMarkup(row_width=2) for payer in db.all_payers(): button = InlineKeyboardButton(payer, callback_data=str(alias + payer)) keyboard.insert(button) if need_cancel: cancel_button = InlineKeyboardButton("🚫 Отмена", callback_data='Отмена') keyboard.add(cancel_button) return keyboard
async def add_custom_cost(message: types.Message): global cost if len(db.all_payers()) < 2: await message.answer("⚠️ Сурикатов должно быть двое. ⚠️\n" "Добавьте их через команду /add_payer") else: try: cost = parse_custom_cost_message(message.text) except Exception as e: print('Возникла ошибка: ', e) await message.answer( "🆘 Что-то пошло не так...\n" "⚠ Вводите расходы в виде МАГАЗИН - СТОИМОСТЬ. ⚠") else: await message.answer("Кто оплатил покупку? 🧐", reply_markup=await get_keyboard_payers(alias='simple_'))
async def add_payer_name(message: types.Message, state: FSMContext): async with state.proxy() as data: data['text'] = message.text name = data['text'] try: db.add_payer(name) except Exception as e: print('Возникла ошибка: ', e) await message.answer(f"🆘 Что-то пошло не так:\n{e}") else: await message.answer(f"✅ {name} добавлен(-а) в список сурикатов!") if len(db.all_payers()) < 2: await message.answer( "Сурикату одиноко 😢\nДобавьте ему пару через /add_payer") else: await message.answer( "💃 Ого! Да у нас тут целая сурикачья семья.\nМожем приступать к ведению бюджета!" ) await state.finish()
#%% Добавляем плательщиков. db.add_payer('Владимир') db.add_payer('Дарья') #%% Добавим расход в виде словаря. cost = { 'дата': get_now_formatted(), 'плательщик': 'Владимир', 'сумма': 1550, 'магазин': 'Магнит' } db.add_cost(cost) #%% Вывод всех плательщиков. print('Все плательщики:') for payer in db.all_payers(): print(payer) #%% Итоговый вывод. print('\n' + db.total_credit()) #%% cost = { 'дата': get_now_formatted(), 'плательщик': 'Дарья', 'сумма': 782, 'магазин': 'Лента' } db.add_cost(cost) print('\n' + db.total_credit())