diff --git a/analysismonth.py b/analysismonth.py new file mode 100644 index 0000000..ed739a9 --- /dev/null +++ b/analysismonth.py @@ -0,0 +1,117 @@ +import currencyes +from bot import bot +import matplotlib.pyplot as plt +from database.models import User, Transaction +import datetime +import locales + + +# функция для обработки аналитики и построения диаграмм +def analysis_month(message): + transactions = Transaction.select().where( + Transaction.user == User.get(username=message.chat.id), + Transaction.month == datetime.datetime.today().strftime('%m') + ) + incomes = 0 + consuptions = 0 + for i in transactions: + if i.type == 'incom': + incomes += i.sum + elif i.type == 'consuption': + consuptions += i.sum + + vals = [incomes, consuptions] + labels = [] + + if locales.LOCALE == 'ru': + labels = ['Доходы', 'Расходы'] + elif locales.LOCALE == 'en': + labels = ['Incomes', 'Consuptions'] + + exp = (0.1, 0) + plt.pie(vals, labels=labels, explode=exp, wedgeprops=dict(width=0.5)) + plt.legend() + plt.savefig('diagrams/diagramallmonth.png') + mes = labels[0] + ' : +' + str(vals[0]) + '\n' + labels[1] + ' : -' + str(vals[1]) + '\n' + with open('diagrams/diagramallmonth.png', 'rb') as diagram: + bot.send_photo(message.chat.id, diagram) + bot.send_message(message.chat.id, mes) + + +def analysis_month_rm(message): + transactions = Transaction.select().where( + Transaction.user == User.get(username=message.chat.id), + Transaction.month == datetime.datetime.now().strftime('%m'), + Transaction.type == 'consuption' + ) + vals = [] + labels = [] + for i in transactions: + if have_in_vals(i.category, labels)[0]: + pos = have_in_vals(i.category, labels)[1] + vals[pos] += i.sum + else: + labels.append(i.category) + vals.append(i.sum) + + exp = [] + for _ in labels: + exp.append(0.1) + + plt.pie(vals, labels=labels, explode=exp, wedgeprops=dict(width=0.5)) + plt.legend() + plt.savefig('diagrams/rmanalysismonth.png') + + mes = '' + pos = 0 + for i in labels: + mes += i + ' : -' + str(vals[pos]) + currencyes.currensyes['ru-ruble'] + '\n' + pos += 1 + + with open('diagrams/rmanalysismonth.png', 'rb') as diagram: + bot.send_photo(message.chat.id, diagram) + bot.send_message(message.chat.id, mes) + + +def have_in_vals(category, labels): + pos = 0 + for i in labels: + if i == category: + return True, pos + pos += 1 + return False, pos + + +def analysis_month_add(message): + transactions = Transaction.select().where( + Transaction.user == User.get(username=message.chat.id), + Transaction.month == datetime.datetime.now().strftime('%m'), + Transaction.type == 'incom' + ) + vals = [] + labels = [] + for i in transactions: + if have_in_vals(i.category, labels)[0]: + pos = have_in_vals(i.category, labels)[1] + vals[pos] += i.sum + else: + labels.append(i.category) + vals.append(i.sum) + + exp = [] + for _ in labels: + exp.append(0.1) + + plt.pie(vals, labels=labels, explode=exp, wedgeprops=dict(width=0.5)) + plt.legend() + plt.savefig('diagrams/addanalysismonth.png') + + mes = '' + pos = 0 + for i in labels: + mes += i + ' : +' + str(vals[pos]) + currencyes.currensyes['ru-ruble'] + '\n' + pos += 1 + + with open('diagrams/addanalysismonth.png', 'rb') as diagram: + bot.send_photo(message.chat.id, diagram) + bot.send_message(message.chat.id, mes) diff --git a/database.sqlite b/database.sqlite index a7453c0..3c24cde 100644 Binary files a/database.sqlite and b/database.sqlite differ diff --git a/database/models.py b/database/models.py index 95f9058..8bbf98a 100644 --- a/database/models.py +++ b/database/models.py @@ -26,7 +26,9 @@ class Transaction(BaseModel): type = CharField(column_name='TransactionType', max_length=10, null=False, default='incom') sum = FloatField(column_name='TransactionSum', null=False, default=0) user = ForeignKeyField(User, unique=False) - date = DateField(column_name='Date', default=datetime.datetime.today()) + year = CharField(column_name='Year', max_length=10, default=datetime.datetime.now().strftime("%Y")) + month = CharField(column_name='month', max_length=10, default=datetime.datetime.now().strftime('%m')) + day = CharField(column_name='day', max_length=10, default=datetime.datetime.now().strftime('%d')) time = TimeField(column_name='time', default=datetime.datetime.now()) category = TextField(column_name='category', default='None category') diff --git a/diagrams/addanalysismonth.png b/diagrams/addanalysismonth.png new file mode 100644 index 0000000..aee21eb Binary files /dev/null and b/diagrams/addanalysismonth.png differ diff --git a/diagrams/diagramallmonth.png b/diagrams/diagramallmonth.png new file mode 100644 index 0000000..d360b74 Binary files /dev/null and b/diagrams/diagramallmonth.png differ diff --git a/diagrams/rmanalysismonth.png b/diagrams/rmanalysismonth.png new file mode 100644 index 0000000..d60b2c9 Binary files /dev/null and b/diagrams/rmanalysismonth.png differ diff --git a/main.py b/main.py index ee1ab21..aef6edb 100644 --- a/main.py +++ b/main.py @@ -5,6 +5,8 @@ import locales from changelocale import change_locale from database.models import User, Transaction from currencyes import currensyes +from multiprocessing import Process +from analysismonth import analysis_month, analysis_month_rm, analysis_month_add # функция ограничения количества знаков после запятой @@ -12,244 +14,258 @@ def to_fixed(num_obj, digits=0): return f"{num_obj:.{digits}f}" -# основной обработчик для бота -def main_bot(messages): - for message in messages: - if message.text.split(' ')[0] == '/start' or message.text.split(' ')[0] == '/help': - mes = None - if locales.LOCALE == 'ru': - mes = locales.ru['help_message'] - elif locales.LOCALE == 'en': - mes = locales.en['help_message'] - _, user = User.get_or_create(username=message.chat.id) - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/ru' or message.text.split(' ')[0] == '/en': - change_locale(message) # функция для изменения языка - elif message.text.split(' ')[0] == '/balance': - user = User.get(username=message.chat.id) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Баланс: ' - elif locales.LOCALE == 'en': - mes = 'Balance: ' - mes += to_fixed(user.balance, 2) + currensyes['ru-ruble'] - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/add' or message.text.split(' ')[0] == '+': - if len(message.text.split(' ')) < 2: +def main(): + # основной обработчик для бота + def main_bot(messages): + for message in messages: + if message.text.split(' ')[0] == '/start' or message.text.split(' ')[0] == '/help': mes = None if locales.LOCALE == 'ru': - mes = locales.ru['erradd'] + mes = locales.ru['help_message'] elif locales.LOCALE == 'en': - mes = locales.en['erradd'] + mes = locales.en['help_message'] + _, user = User.get_or_create(username=message.chat.id) bot.send_message(message.chat.id, mes) - else: + elif message.text.split(' ')[0] == '/ru' or message.text.split(' ')[0] == '/en': + change_locale(message) # функция для изменения языка + elif message.text.split(' ')[0] == '/balance': user = User.get(username=message.chat.id) - user.balance += float(message.text.split(' ')[1]) - user.save() - if len(message.text.split(' ')) == 3: - Transaction.create( - sum=int(message.text.split(' ')[1]), - type='incom', - user=User.get(username=message.chat.id), - category=message.text.split(' ')[2] - ) - else: - Transaction.create( - sum=int(message.text.split(' ')[1]), - type='incom', - user=User.get(username=message.chat.id) - ) - bot.send_message(message.chat.id, to_fixed(user.balance, 2) + currensyes['ru-ruble']) - elif message.text.split(' ')[0] == '/rm' or message.text.split(' ')[0] == '-': - if len(message.text.split(' ')) < 2: - mes = None + mes = '' if locales.LOCALE == 'ru': - mes = locales.ru['errrm'] + mes = 'Баланс: ' elif locales.LOCALE == 'en': - mes = locales.en['errrm'] + mes = 'Balance: ' + mes += to_fixed(user.balance, 2) + currensyes['ru-ruble'] bot.send_message(message.chat.id, mes) - else: - user = User.get(username=message.chat.id) - user.balance -= float(message.text.split(' ')[1]) - user.save() - if len(message.text.split(' ')) == 3: - Transaction.create( - sum=int(message.text.split(' ')[1]), - type='consuption', - user=User.get(username=message.chat.id), - category=message.text.split(' ')[2] - ) + elif message.text.split(' ')[0] == '/add' or message.text.split(' ')[0] == '+': + if len(message.text.split(' ')) < 2: + mes = None + if locales.LOCALE == 'ru': + mes = locales.ru['erradd'] + elif locales.LOCALE == 'en': + mes = locales.en['erradd'] + bot.send_message(message.chat.id, mes) else: - Transaction.create( - sum=int(message.text.split(' ')[1]), - type='consuption', - user=User.get(username=message.chat.id) - ) - bot.send_message(message.chat.id, to_fixed(user.balance, 2) + currensyes['ru-ruble']) - elif message.text.split(' ')[0] == '/addtoday': - transactions = Transaction.select().where( - Transaction.type == 'incom', - Transaction.date == datetime.datetime.today(), - Transaction.user == User.get(username=message.chat.id).id - ) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Ваши доходы за сегодня:\n\n' - elif locales.LOCALE == 'en': - mes = 'Your incomes today:\n\n' - iteration = 1 - if len(transactions) == 0: + user = User.get(username=message.chat.id) + user.balance += float(message.text.split(' ')[1]) + user.save() + if len(message.text.split(' ')) == 3: + Transaction.create( + sum=int(message.text.split(' ')[1]), + type='incom', + user=User.get(username=message.chat.id), + category=message.text.split(' ')[2] + ) + else: + Transaction.create( + sum=int(message.text.split(' ')[1]), + type='incom', + user=User.get(username=message.chat.id) + ) + bot.send_message(message.chat.id, to_fixed(user.balance, 2) + currensyes['ru-ruble']) + elif message.text.split(' ')[0] == '/rm' or message.text.split(' ')[0] == '-': + if len(message.text.split(' ')) < 2: + mes = None + if locales.LOCALE == 'ru': + mes = locales.ru['errrm'] + elif locales.LOCALE == 'en': + mes = locales.en['errrm'] + bot.send_message(message.chat.id, mes) + else: + user = User.get(username=message.chat.id) + user.balance -= float(message.text.split(' ')[1]) + user.save() + if len(message.text.split(' ')) == 3: + Transaction.create( + sum=int(message.text.split(' ')[1]), + type='consuption', + user=User.get(username=message.chat.id), + category=message.text.split(' ')[2] + ) + else: + Transaction.create( + sum=int(message.text.split(' ')[1]), + type='consuption', + user=User.get(username=message.chat.id) + ) + bot.send_message(message.chat.id, to_fixed(user.balance, 2) + currensyes['ru-ruble']) + elif message.text.split(' ')[0] == '/addtoday': + transactions = Transaction.select().where( + Transaction.type == 'incom', + Transaction.day == datetime.datetime.today().strftime('%d'), + Transaction.user == User.get(username=message.chat.id).id + ) + mes = '' if locales.LOCALE == 'ru': - mes += 'Нет доходов за сегодня' + mes = 'Ваши доходы за сегодня:\n\n' elif locales.LOCALE == 'en': - mes += 'No incomes today' - for i in transactions: - mes += '-------------------------------------\n' - mes += str(iteration) + ' || +' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ - + ' || ' + str(i.date) + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' - iteration += 1 - mes += '-------------------------------------\n' - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/rmtoday': - transactions = Transaction.select().where( - Transaction.type == 'consuption', - Transaction.date == datetime.datetime.today(), - Transaction.user == User.get(username=message.chat.id).id - ) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Ваши расходы за сегодня:\n\n' - elif locales.LOCALE == 'en': - mes = 'Your consuptions today:\n\n' - iteration = 1 - if len(transactions) == 0: - if locales.LOCALE == 'ru': - mes += 'Нет расходов за сегодня' - elif locales.LOCALE == 'en': - mes += 'No consuptions today' - for i in transactions: - mes += '-------------------------------------\n' - mes += str(iteration) + ' || -' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ - + ' || ' + str(i.date) + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' - iteration += 1 - mes += '-------------------------------------\n' - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/rmall': - transactions = Transaction.select().where( - Transaction.type == 'consuption', - Transaction.user == User.get(username=message.chat.id).id - ) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Ваши расходы за все время:\n\n' - elif locales.LOCALE == 'en': - mes = 'Your all consuptions:\n\n' - iteration = 1 - if len(transactions) == 0: - if locales.LOCALE == 'ru': - mes += 'Нет расходов за все время' - elif locales.LOCALE == 'en': - mes += 'No consuptions for all time' - for i in transactions: - mes += '-------------------------------------\n' - mes += str(iteration) + ' || -' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ - + ' || ' + str(i.date) + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' - iteration += 1 - mes += '-------------------------------------\n' - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/addall': - transactions = Transaction.select().where( - Transaction.type == 'incom', - Transaction.user == User.get(username=message.chat.id).id - ) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Ваши доходы за все время:\n\n' - elif locales.LOCALE == 'en': - mes = 'Your all incomes:\n\n' - iteration = 1 - if len(transactions) == 0: - if locales.LOCALE == 'ru': - mes += 'Нет доходов за все время' - elif locales.LOCALE == 'en': - mes += 'No incomes for all time' - for i in transactions: - mes += '-------------------------------------\n' - mes += str(iteration) + ' || +' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ - + ' || ' + str(i.date) + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' - iteration += 1 - mes += '-------------------------------------\n' - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/rmmonth': - transactions = Transaction.select().where( - Transaction.user == User.get(username=message.chat.id), - Transaction.type == 'consuption' - ) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Ваши расходы за этот месяц:\n\n' - elif locales.LOCALE == 'en': - mes = 'Your consuptions for this month:\n\n' - iteration = 1 - if len(transactions) == 0: - if locales.LOCALE == 'ru': - mes += 'Нет расходов за этот месяц\n' - elif locales.LOCALE == 'en': - mes += 'No consuptions for this month\n' - - for i in transactions: - if str(i.date).split('-')[1] == datetime.datetime.today().strftime('%m'): - mes += '-------------------------------------\n' - mes += str(iteration) + ' || -' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ - + ' || ' + str(i.date) + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' - iteration += 1 - mes += '-------------------------------------\n' - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/addmonth': - transactions = Transaction.select().where( - Transaction.user == User.get(username=message.chat.id), - Transaction.type == 'incom' - ) - mes = '' - if locales.LOCALE == 'ru': - mes = 'Ваши доходы за этот месяц:\n\n' - elif locales.LOCALE == 'en': - mes = 'Your incomes for this month:\n\n' - iteration = 1 - if len(transactions) == 0: - if locales.LOCALE == 'ru': - mes += 'Нет доходов за этот месяц\n' - elif locales.LOCALE == 'en': - mes += 'No incomes for this month\n' - - for i in transactions: - if str(i.date).split('-')[1] == datetime.datetime.today().strftime('%m'): + mes = 'Your incomes today:\n\n' + iteration = 1 + if len(transactions) == 0: + if locales.LOCALE == 'ru': + mes += 'Нет доходов за сегодня\n' + elif locales.LOCALE == 'en': + mes += 'No incomes today\n' + for i in transactions: mes += '-------------------------------------\n' mes += str(iteration) + ' || +' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ - + ' || ' + str(i.date) + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' + + ' || ' + str(i.day) + '-' + str(i.month) + '-' + str(i.year) \ + + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' iteration += 1 - mes += '-------------------------------------\n' - bot.send_message(message.chat.id, mes) - elif message.text.split(' ')[0] == '/analysismonth': - bot.send_message(message.chat.id, 'pass') - else: - mes = None - if locales.LOCALE == 'ru': - mes = locales.ru['error404_message'] - elif locales.LOCALE == 'en': - mes = locales.en['error404_message'] - bot.send_message(message.chat.id, mes) + mes += '-------------------------------------\n' + bot.send_message(message.chat.id, mes) + elif message.text.split(' ')[0] == '/rmtoday': + transactions = Transaction.select().where( + Transaction.type == 'consuption', + Transaction.day == datetime.datetime.today().strftime('%d'), + Transaction.user == User.get(username=message.chat.id).id + ) + mes = '' + if locales.LOCALE == 'ru': + mes = 'Ваши расходы за сегодня:\n\n' + elif locales.LOCALE == 'en': + mes = 'Your consuptions today:\n\n' + iteration = 1 + if len(transactions) == 0: + if locales.LOCALE == 'ru': + mes += 'Нет расходов за сегодня\n' + elif locales.LOCALE == 'en': + mes += 'No consuptions today\n' + for i in transactions: + mes += '-------------------------------------\n' + mes += str(iteration) + ' || -' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ + + ' || ' + str(i.day) + '-' + str(i.month) + '-' + str(i.year) \ + + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' + iteration += 1 + mes += '-------------------------------------\n' + bot.send_message(message.chat.id, mes) + elif message.text.split(' ')[0] == '/rmall': + transactions = Transaction.select().where( + Transaction.type == 'consuption', + Transaction.user == User.get(username=message.chat.id).id + ) + mes = '' + if locales.LOCALE == 'ru': + mes = 'Ваши расходы за все время:\n\n' + elif locales.LOCALE == 'en': + mes = 'Your all consuptions:\n\n' + iteration = 1 + if len(transactions) == 0: + if locales.LOCALE == 'ru': + mes += 'Нет расходов за все время\n' + elif locales.LOCALE == 'en': + mes += 'No consuptions for all time\n' + for i in transactions: + mes += '-------------------------------------\n' + mes += str(iteration) + ' || -' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ + + ' || ' + str(i.day) + '-' + str(i.month) + '-' + str(i.year) \ + + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' + iteration += 1 + mes += '-------------------------------------\n' + bot.send_message(message.chat.id, mes) + elif message.text.split(' ')[0] == '/addall': + transactions = Transaction.select().where( + Transaction.type == 'incom', + Transaction.user == User.get(username=message.chat.id).id + ) + mes = '' + if locales.LOCALE == 'ru': + mes = 'Ваши доходы за все время:\n\n' + elif locales.LOCALE == 'en': + mes = 'Your all incomes:\n\n' + iteration = 1 + if len(transactions) == 0: + if locales.LOCALE == 'ru': + mes += 'Нет доходов за все время\n' + elif locales.LOCALE == 'en': + mes += 'No incomes for all time\n' + for i in transactions: + mes += '-------------------------------------\n' + mes += str(iteration) + ' || +' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ + + ' || ' + str(i.day) + '-' + str(i.month) + '-' + str(i.year) \ + + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' + iteration += 1 + mes += '-------------------------------------\n' + bot.send_message(message.chat.id, mes) + elif message.text.split(' ')[0] == '/rmmonth': + transactions = Transaction.select().where( + Transaction.user == User.get(username=message.chat.id), + Transaction.month == datetime.datetime.now().strftime('%m'), + Transaction.type == 'consuption' + ) + mes = '' + if locales.LOCALE == 'ru': + mes = 'Ваши расходы за этот месяц:\n\n' + elif locales.LOCALE == 'en': + mes = 'Your consuptions for this month:\n\n' + iteration = 1 + if len(transactions) == 0: + if locales.LOCALE == 'ru': + mes += 'Нет расходов за этот месяц\n' + elif locales.LOCALE == 'en': + mes += 'No consuptions for this month\n' + + for i in transactions: + mes += '-------------------------------------\n' + mes += str(iteration) + ' || -' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ + + ' || ' + str(i.day) + '-' + str(i.month) + '-' + str(i.year) \ + + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' + iteration += 1 + mes += '-------------------------------------\n' + bot.send_message(message.chat.id, mes) + elif message.text.split(' ')[0] == '/addmonth': + transactions = Transaction.select().where( + Transaction.user == User.get(username=message.chat.id), + Transaction.month == datetime.datetime.now().strftime('%m'), + Transaction.type == 'incom' + ) + mes = '' + if locales.LOCALE == 'ru': + mes = 'Ваши доходы за этот месяц:\n\n' + elif locales.LOCALE == 'en': + mes = 'Your incomes for this month:\n\n' + iteration = 1 + if len(transactions) == 0: + if locales.LOCALE == 'ru': + mes += 'Нет доходов за этот месяц\n' + elif locales.LOCALE == 'en': + mes += 'No incomes for this month\n' + + for i in transactions: + mes += '-------------------------------------\n' + mes += str(iteration) + ' || +' + str(i.sum) + currensyes['ru-ruble'] + ' || ' + i.category \ + + ' || ' + str(i.day) + '-' + str(i.month) + '-' + str(i.year) \ + + ' || ' + i.time.strftime('%H:%M:%S') + ' ||\n' + iteration += 1 + mes += '-------------------------------------\n' + bot.send_message(message.chat.id, mes) + elif message.text.split(' ')[0] == '/analysismonth': + Process(target=analysis_month, args=(message,)).start() + elif message.text.split(' ')[0] == '/rmanalysismonth': + Process(target=analysis_month_rm, args=(message, )).start() + elif message.text.split(' ')[0] == '/addanalysismonth': + Process(target=analysis_month_add, args=(message,)).start() + else: + mes = None + if locales.LOCALE == 'ru': + mes = locales.ru['error404_message'] + elif locales.LOCALE == 'en': + mes = locales.en['error404_message'] + bot.send_message(message.chat.id, mes) + + bot.set_update_listener(main_bot) + + try: + bot.polling(none_stop=True) + while True: + pass + except KeyboardInterrupt: + cprint('\ngoodbye', 'green') + exit() + except Exception as e: + cprint(str(e), 'red') + bot.polling(none_stop=True) -bot.set_update_listener(main_bot) - -try: - bot.polling(none_stop=True) - while True: - pass -except KeyboardInterrupt: - cprint('\ngoodbye', 'green') - exit() -except Exception as e: - cprint(str(e), 'red') - bot.polling(none_stop=True) +if __name__ == '__main__': + main()