Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from datetime import datetime
- import openpyxl
- from openpyxl import (Workbook, styles)
- from openpyxl.styles import Alignment
- from openpyxl.styles.borders import (Side, Border)
- import re
- import subprocess
- from time import sleep
- VALUE = 'EUR'
- INCORRECT_INPUT = 'Incorrect input. Try again.'
- numbers_of_banks = {'SuperBank': '480', 'GorgeousBank': '720'}
- expenses = {'480': [], '720': []}
- flag = True
- def error(text):
- global flag
- flag = False
- print(text)
- def report_create(report_name, expenses, plus, minus, delta, save_name):
- wb = Workbook()
- sheet = wb['Sheet']
- sheet['A1'].value = report_name
- sheet['A1'].font = styles.Font(size=16, bold=True)
- medium_side = Side(style='medium')
- medium_border = Border(left=medium_side, right=medium_side, top=medium_side, bottom=medium_side)
- alignment = Alignment(horizontal='center', vertical='bottom')
- font = styles.Font(size=13)
- sheet['A3'].value, sheet['A3'].border, sheet['A3'].font, sheet[
- 'A3'].alignment = 'Date and time', medium_border, font, alignment
- sheet['B3'].value, sheet['B3'].border, sheet['B3'].font, sheet[
- 'B3'].alignment = "SMS's text", medium_border, font, alignment
- sheet['C3'].value, sheet['C3'].border, sheet['C3'].font, sheet[
- 'C3'].alignment = 'Transfer', medium_border, font, alignment
- sheet['D3'].value, sheet['D3'].border, sheet['D3'].font, sheet[
- 'D3'].alignment = 'Withdrawal', medium_border, font, alignment
- sheet['E3'].value, sheet['E3'].border, sheet['E3'].font, sheet[
- 'E3'].alignment = 'Balance', medium_border, font, alignment
- sheet.column_dimensions['A'].width = 25
- sheet.column_dimensions['B'].width = 87
- sheet.column_dimensions['C'].width = 15
- sheet.column_dimensions['D'].width = 15
- sheet.column_dimensions['E'].width = 15
- thin_side = Side(style='thin')
- thin_border = Border(left=thin_side, right=thin_side, top=thin_side, bottom=thin_side)
- for i, expense in enumerate(expenses):
- sheet[f'A{4 + i}'].value, sheet[f'A{4 + i}'].border, sheet[f'A{4 + i}'].font, sheet[
- f'A{4 + i}'].alignment = str(expense[0]), medium_border, font, alignment
- sheet[f'B{4 + i}'].value, sheet[f'B{4 + i}'].border, sheet[f'B{4 + i}'].font, sheet[f'B{4 + i}'].alignment = \
- expense[4], medium_border, font, alignment
- sheet[f'C{4 + i}'].value, sheet[f'C{4 + i}'].border, sheet[f'C{4 + i}'].font, sheet[f'C{4 + i}'].alignment = \
- expense[2] if expense[2] > 0 else 0, medium_border, font, alignment
- sheet[f'D{4 + i}'].value, sheet[f'D{4 + i}'].border, sheet[f'D{4 + i}'].font, sheet[
- f'D{4 + i}'].alignment = abs(expense[2]) if expense[2] < 0 else 0, medium_border, font, alignment
- sheet[f'E{4 + i}'].value, sheet[f'E{4 + i}'].border, sheet[f'E{4 + i}'].font, sheet[f'E{4 + i}'].alignment = \
- expense[3], medium_border, font, alignment
- special_border = Border(left=thin_side, right=thin_side, top=Side(style='thick'), bottom=thin_side)
- sheet[f'A{5 + i}'].border = Border(top=Side(style='thick'))
- sheet[f'B{5 + i}'].border = Border(top=Side(style='thick'))
- sheet[f'C{5 + i}'].value, sheet[f'C{5 + i}'].border, sheet[f'C{5 + i}'].font, sheet[
- f'C{5 + i}'].alignment = f'{plus} {VALUE}', special_border, styles.Font(size=13, bold=True), alignment
- sheet[f'D{5 + i}'].value, sheet[f'D{5 + i}'].border, sheet[f'D{5 + i}'].font, sheet[
- f'D{5 + i}'].alignment = f'{minus} {VALUE}', special_border, styles.Font(size=13, bold=True), alignment
- sheet[f'E{5 + i}'].value, sheet[f'E{5 + i}'].border, sheet[f'E{5 + i}'].font, sheet[f'E{5 + i}'].alignment = \
- f'{expenses[-1][3]} {VALUE}', special_border, styles.Font(size=13, bold=True), alignment
- sheet.merge_cells(f'C{6 + i}:D{6 + i}')
- sheet[f'C{6 + i}'].value, sheet[f'C{6 + i}'].border, sheet[f'D{6 + i}'].border, sheet[f'C{6 + i}'].font, sheet[
- f'C{6 + i}'].alignment = f'Delta: {delta} {VALUE}', thin_border, thin_border, styles.Font(size=13,
- bold=True), alignment
- try:
- wb.save(save_name)
- except:
- raise Exception
- with open('SMSs.txt', 'r') as file:
- for line in file:
- try:
- bank_num, date_time, text = line.split(';')
- except:
- error(f'Incorrect format of input: {line}')
- break
- try:
- date_time = datetime.strptime(date_time, '%Y-%m-%d %H:%M:%S')
- except:
- error(f'Incorrect format of date or time: {line}')
- break
- try:
- if bank_num == numbers_of_banks['SuperBank']:
- operation, card, amount, _, balance = re.split(r'[,:]', text)
- card, amount, balance = card[card.index('card') + 5:], int(amount.split()[0]), int(balance.split()[0])
- if operation == 'Withdrawal':
- amount = -amount
- elif operation == 'Transfer':
- pass
- else:
- error(f'Unknown operation: {line}')
- break
- elif bank_num == numbers_of_banks['GorgeousBank']:
- card, amount, _, balance = re.split(r'[,:]', text)
- amount, balance = int(amount.split()[0]), int(balance.split()[0])
- else:
- error(f'Unknown number of bank: {line}')
- break
- expenses[bank_num].append((date_time, card, amount, balance, line))
- except:
- error(f'Incorrect format of message text: {line}')
- break
- if flag:
- banks_cards = {number: expenses[number][0][1] for number in numbers_of_banks.values()}
- for bank in expenses.keys(): expenses[bank].sort(key=lambda d: d[0])
- while True:
- print('Choose an option\n1 - Show current funds\n2 - Expenses per month\n3 - Exit from the program')
- while True:
- try:
- choice = int(input('Your choice: '))
- if 1 <= choice <= 3:
- break
- else:
- print(INCORRECT_INPUT)
- except:
- print(INCORRECT_INPUT)
- if choice == 1:
- print('Your current funds:')
- total = 0
- for bank in numbers_of_banks.keys():
- balance = expenses[numbers_of_banks[bank]][-1][3]
- total += balance
- print(f'{banks_cards[numbers_of_banks[bank]]} ({bank}): {balance} {VALUE}')
- print(f'Total: {total} {VALUE}')
- input('Press Enter')
- elif choice == 2:
- print('Enter month and year in the following format MM-YYYY')
- while True:
- try:
- date = datetime.strptime(input(), '%m-%Y')
- break
- except:
- print(INCORRECT_INPUT)
- while True:
- print('Select a credit card:')
- i = 1
- for bank in numbers_of_banks.keys():
- print(f'{i} - {banks_cards[numbers_of_banks[bank]]} ({bank})')
- i += 1
- print(f'{i} - Total')
- print(f'{i + 1} - Exit to the main menu')
- while True:
- try:
- choice = int(input('Your choice:'))
- if 1 <= choice <= i + 1:
- break
- else:
- print(INCORRECT_INPUT)
- except:
- print(INCORRECT_INPUT)
- if choice == i:
- date_expenses = list()
- for number_of_bank in numbers_of_banks.values():
- for expense in expenses[number_of_bank]:
- if expense[0].month == date.month and expense[0].year == date.year: date_expenses.append(
- expense)
- report_name = f"Report for {date.strftime('%B')} {date.year}, all credit cards"
- plus = sum([expense[2] if expense[2] > 0 else 0 for expense in date_expenses])
- print(f'Received: {plus} {VALUE}')
- minus = sum([abs(expense[2]) if expense[2] < 0 else 0 for expense in date_expenses])
- print(f'Spent: {minus} {VALUE}')
- delta = plus - minus
- if delta >= 0: delta = f'+{delta}'
- print(f'Delta: {delta} {VALUE}')
- while True:
- ans = input('Export a full report to Excel (y/n)?')
- if ans.lower()[0] == 'y':
- save_name = f'{"_".join(re.split("[ ,]", report_name)[2:4])}_all_cards_report.xlsx'
- try:
- report_create(report_name, date_expenses, plus, minus, delta, save_name)
- except:
- print('Close an excel file.')
- print('Report created, opening ...')
- subprocess.Popen(save_name, shell=True)
- sleep(3)
- break
- elif ans.lower()[0] == 'n':
- break
- else:
- print(INCORRECT_INPUT)
- elif choice < i:
- bank_num = list(numbers_of_banks.values())[choice - 1]
- date_expenses = list()
- for expense in expenses[bank_num]:
- print(expense[0].month, date.month, expense[0].year, date.year)
- if expense[0].month == date.month and expense[0].year == date.year: date_expenses.append(
- expense)
- report_name = f"Report for {date.strftime('%B')} {date.year}, " \
- f"card {banks_cards[bank_num]} ({list(numbers_of_banks.keys())[choice - 1]})"
- plus = sum([expense[2] if expense[2] > 0 else 0 for expense in date_expenses])
- print(f'Received: {plus} {VALUE}')
- minus = sum([abs(expense[2]) if expense[2] < 0 else 0 for expense in date_expenses])
- print(f'Spent: {minus} {VALUE}')
- delta = plus - minus
- if delta >= 0: delta = f'+{delta}'
- print(f'Delta: {delta} {VALUE}')
- while True:
- ans = input('Export a full report to Excel (y/n)?')
- if ans.lower() != None and ans.lower()[0] == 'y':
- save_name = f'{"_".join(re.split("[ ,]", report_name)[2:4])}_{re.split("[()]", report_name.split()[-1])[1]}_report.xlsx'
- try:
- report_create(report_name, date_expenses, plus, minus, delta, save_name)
- except:
- print('Close an excel file.')
- print('Report created, opening ... (if some excel file is opened, close it)')
- subprocess.Popen(save_name, shell=True)
- sleep(3)
- break
- elif ans.lower() != None and ans.lower()[0] == 'n':
- break
- else:
- print(INCORRECT_INPUT)
- else:
- break
- elif choice == 3:
- break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement