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()
示例#6
0
#%% Добавляем плательщиков.
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())