Advertisement
Guest User

Untitled

a guest
May 26th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.60 KB | None | 0 0
  1. from datetime import datetime
  2. import openpyxl
  3. from openpyxl import (Workbook, styles)
  4. from openpyxl.styles import Alignment
  5. from openpyxl.styles.borders import (Side, Border)
  6. import re
  7. import subprocess
  8. from time import sleep
  9.  
  10. VALUE = 'EUR'
  11. INCORRECT_INPUT = 'Incorrect input. Try again.'
  12.  
  13. numbers_of_banks = {'SuperBank': '480', 'GorgeousBank': '720'}
  14. expenses = {'480': [], '720': []}
  15. flag = True
  16.  
  17.  
  18. def error(text):
  19.     global flag
  20.     flag = False
  21.     print(text)
  22.  
  23.  
  24. def report_create(report_name, expenses, plus, minus, delta, save_name):
  25.     wb = Workbook()
  26.     sheet = wb['Sheet']
  27.     sheet['A1'].value = report_name
  28.     sheet['A1'].font = styles.Font(size=16, bold=True)
  29.  
  30.     medium_side = Side(style='medium')
  31.     medium_border = Border(left=medium_side, right=medium_side, top=medium_side, bottom=medium_side)
  32.     alignment = Alignment(horizontal='center', vertical='bottom')
  33.     font = styles.Font(size=13)
  34.  
  35.     sheet['A3'].value, sheet['A3'].border, sheet['A3'].font, sheet[
  36.         'A3'].alignment = 'Date and time', medium_border, font, alignment
  37.     sheet['B3'].value, sheet['B3'].border, sheet['B3'].font, sheet[
  38.         'B3'].alignment = "SMS's text", medium_border, font, alignment
  39.     sheet['C3'].value, sheet['C3'].border, sheet['C3'].font, sheet[
  40.         'C3'].alignment = 'Transfer', medium_border, font, alignment
  41.     sheet['D3'].value, sheet['D3'].border, sheet['D3'].font, sheet[
  42.         'D3'].alignment = 'Withdrawal', medium_border, font, alignment
  43.     sheet['E3'].value, sheet['E3'].border, sheet['E3'].font, sheet[
  44.         'E3'].alignment = 'Balance', medium_border, font, alignment
  45.     sheet.column_dimensions['A'].width = 25
  46.     sheet.column_dimensions['B'].width = 87
  47.     sheet.column_dimensions['C'].width = 15
  48.     sheet.column_dimensions['D'].width = 15
  49.     sheet.column_dimensions['E'].width = 15
  50.  
  51.     thin_side = Side(style='thin')
  52.     thin_border = Border(left=thin_side, right=thin_side, top=thin_side, bottom=thin_side)
  53.  
  54.     for i, expense in enumerate(expenses):
  55.         sheet[f'A{4 + i}'].value, sheet[f'A{4 + i}'].border, sheet[f'A{4 + i}'].font, sheet[
  56.             f'A{4 + i}'].alignment = str(expense[0]), medium_border, font, alignment
  57.         sheet[f'B{4 + i}'].value, sheet[f'B{4 + i}'].border, sheet[f'B{4 + i}'].font, sheet[f'B{4 + i}'].alignment = \
  58.         expense[4], medium_border, font, alignment
  59.         sheet[f'C{4 + i}'].value, sheet[f'C{4 + i}'].border, sheet[f'C{4 + i}'].font, sheet[f'C{4 + i}'].alignment = \
  60.         expense[2] if expense[2] > 0 else 0, medium_border, font, alignment
  61.         sheet[f'D{4 + i}'].value, sheet[f'D{4 + i}'].border, sheet[f'D{4 + i}'].font, sheet[
  62.             f'D{4 + i}'].alignment = abs(expense[2]) if expense[2] < 0 else 0, medium_border, font, alignment
  63.         sheet[f'E{4 + i}'].value, sheet[f'E{4 + i}'].border, sheet[f'E{4 + i}'].font, sheet[f'E{4 + i}'].alignment = \
  64.         expense[3], medium_border, font, alignment
  65.  
  66.     special_border = Border(left=thin_side, right=thin_side, top=Side(style='thick'), bottom=thin_side)
  67.     sheet[f'A{5 + i}'].border = Border(top=Side(style='thick'))
  68.     sheet[f'B{5 + i}'].border = Border(top=Side(style='thick'))
  69.     sheet[f'C{5 + i}'].value, sheet[f'C{5 + i}'].border, sheet[f'C{5 + i}'].font, sheet[
  70.         f'C{5 + i}'].alignment = f'{plus} {VALUE}', special_border, styles.Font(size=13, bold=True), alignment
  71.     sheet[f'D{5 + i}'].value, sheet[f'D{5 + i}'].border, sheet[f'D{5 + i}'].font, sheet[
  72.         f'D{5 + i}'].alignment = f'{minus} {VALUE}', special_border, styles.Font(size=13, bold=True), alignment
  73.     sheet[f'E{5 + i}'].value, sheet[f'E{5 + i}'].border, sheet[f'E{5 + i}'].font, sheet[f'E{5 + i}'].alignment = \
  74.         f'{expenses[-1][3]} {VALUE}', special_border, styles.Font(size=13, bold=True), alignment
  75.  
  76.     sheet.merge_cells(f'C{6 + i}:D{6 + i}')
  77.     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[
  78.         f'C{6 + i}'].alignment = f'Delta: {delta} {VALUE}', thin_border, thin_border, styles.Font(size=13,
  79.                                                                                                   bold=True), alignment
  80.  
  81.     try:
  82.         wb.save(save_name)
  83.     except:
  84.         raise Exception
  85.  
  86.  
  87. with open('SMSs.txt', 'r') as file:
  88.     for line in file:
  89.         try:
  90.             bank_num, date_time, text = line.split(';')
  91.         except:
  92.             error(f'Incorrect format of input: {line}')
  93.             break
  94.  
  95.         try:
  96.             date_time = datetime.strptime(date_time, '%Y-%m-%d %H:%M:%S')
  97.         except:
  98.             error(f'Incorrect format of date or time: {line}')
  99.             break
  100.  
  101.         try:
  102.             if bank_num == numbers_of_banks['SuperBank']:
  103.                 operation, card, amount, _, balance = re.split(r'[,:]', text)
  104.                 card, amount, balance = card[card.index('card') + 5:], int(amount.split()[0]), int(balance.split()[0])
  105.                 if operation == 'Withdrawal':
  106.                     amount = -amount
  107.                 elif operation == 'Transfer':
  108.                     pass
  109.                 else:
  110.                     error(f'Unknown operation: {line}')
  111.                     break
  112.             elif bank_num == numbers_of_banks['GorgeousBank']:
  113.                 card, amount, _, balance = re.split(r'[,:]', text)
  114.                 amount, balance = int(amount.split()[0]), int(balance.split()[0])
  115.             else:
  116.                 error(f'Unknown number of bank: {line}')
  117.                 break
  118.             expenses[bank_num].append((date_time, card, amount, balance, line))
  119.         except:
  120.             error(f'Incorrect format of message text: {line}')
  121.             break
  122.  
  123. if flag:
  124.     banks_cards = {number: expenses[number][0][1] for number in numbers_of_banks.values()}
  125.     for bank in expenses.keys(): expenses[bank].sort(key=lambda d: d[0])
  126.     while True:
  127.         print('Choose an option\n1 - Show current funds\n2 - Expenses per month\n3 - Exit from the program')
  128.         while True:
  129.             try:
  130.                 choice = int(input('Your choice: '))
  131.                 if 1 <= choice <= 3:
  132.                     break
  133.                 else:
  134.                     print(INCORRECT_INPUT)
  135.             except:
  136.                 print(INCORRECT_INPUT)
  137.  
  138.         if choice == 1:
  139.             print('Your current funds:')
  140.             total = 0
  141.             for bank in numbers_of_banks.keys():
  142.                 balance = expenses[numbers_of_banks[bank]][-1][3]
  143.                 total += balance
  144.                 print(f'{banks_cards[numbers_of_banks[bank]]} ({bank}):  {balance} {VALUE}')
  145.             print(f'Total:  {total} {VALUE}')
  146.             input('Press Enter')
  147.  
  148.         elif choice == 2:
  149.             print('Enter month and year in the following format MM-YYYY')
  150.             while True:
  151.                 try:
  152.                     date = datetime.strptime(input(), '%m-%Y')
  153.                     break
  154.                 except:
  155.                     print(INCORRECT_INPUT)
  156.             while True:
  157.                 print('Select a credit card:')
  158.                 i = 1
  159.                 for bank in numbers_of_banks.keys():
  160.                     print(f'{i} - {banks_cards[numbers_of_banks[bank]]} ({bank})')
  161.                     i += 1
  162.                 print(f'{i} - Total')
  163.                 print(f'{i + 1} - Exit to the main menu')
  164.                 while True:
  165.                     try:
  166.                         choice = int(input('Your choice:'))
  167.                         if 1 <= choice <= i + 1:
  168.                             break
  169.                         else:
  170.                             print(INCORRECT_INPUT)
  171.                     except:
  172.                         print(INCORRECT_INPUT)
  173.  
  174.                 if choice == i:
  175.                     date_expenses = list()
  176.                     for number_of_bank in numbers_of_banks.values():
  177.                         for expense in expenses[number_of_bank]:
  178.                             if expense[0].month == date.month and expense[0].year == date.year: date_expenses.append(
  179.                                 expense)
  180.                     report_name = f"Report for {date.strftime('%B')} {date.year}, all credit cards"
  181.                     plus = sum([expense[2] if expense[2] > 0 else 0 for expense in date_expenses])
  182.                     print(f'Received:  {plus} {VALUE}')
  183.                     minus = sum([abs(expense[2]) if expense[2] < 0 else 0 for expense in date_expenses])
  184.                     print(f'Spent:  {minus} {VALUE}')
  185.                     delta = plus - minus
  186.                     if delta >= 0: delta = f'+{delta}'
  187.                     print(f'Delta:  {delta} {VALUE}')
  188.                     while True:
  189.                         ans = input('Export a full report to Excel (y/n)?')
  190.                         if ans.lower()[0] == 'y':
  191.                             save_name = f'{"_".join(re.split("[ ,]", report_name)[2:4])}_all_cards_report.xlsx'
  192.                             try:
  193.                                 report_create(report_name, date_expenses, plus, minus, delta, save_name)
  194.                             except:
  195.                                 print('Close an excel file.')
  196.                             print('Report created, opening ...')
  197.                             subprocess.Popen(save_name, shell=True)
  198.                             sleep(3)
  199.                             break
  200.                         elif ans.lower()[0] == 'n':
  201.                             break
  202.                         else:
  203.                             print(INCORRECT_INPUT)
  204.                 elif choice < i:
  205.                     bank_num = list(numbers_of_banks.values())[choice - 1]
  206.                     date_expenses = list()
  207.                     for expense in expenses[bank_num]:
  208.                         print(expense[0].month, date.month, expense[0].year, date.year)
  209.                         if expense[0].month == date.month and expense[0].year == date.year: date_expenses.append(
  210.                             expense)
  211.                     report_name = f"Report for {date.strftime('%B')} {date.year}, " \
  212.                         f"card {banks_cards[bank_num]} ({list(numbers_of_banks.keys())[choice - 1]})"
  213.                     plus = sum([expense[2] if expense[2] > 0 else 0 for expense in date_expenses])
  214.                     print(f'Received:  {plus} {VALUE}')
  215.                     minus = sum([abs(expense[2]) if expense[2] < 0 else 0 for expense in date_expenses])
  216.                     print(f'Spent:  {minus} {VALUE}')
  217.                     delta = plus - minus
  218.                     if delta >= 0: delta = f'+{delta}'
  219.                     print(f'Delta:  {delta} {VALUE}')
  220.                     while True:
  221.                         ans = input('Export a full report to Excel (y/n)?')
  222.                         if  ans.lower() != None and ans.lower()[0] == 'y':
  223.                             save_name = f'{"_".join(re.split("[ ,]", report_name)[2:4])}_{re.split("[()]", report_name.split()[-1])[1]}_report.xlsx'
  224.                             try:
  225.                                 report_create(report_name, date_expenses, plus, minus, delta, save_name)
  226.                             except:
  227.                                 print('Close an excel file.')
  228.                             print('Report created, opening ... (if some excel file is opened, close it)')
  229.                             subprocess.Popen(save_name, shell=True)
  230.                             sleep(3)
  231.                             break
  232.                         elif ans.lower() != None and ans.lower()[0] == 'n':
  233.                             break
  234.                         else:
  235.                             print(INCORRECT_INPUT)
  236.  
  237.                 else:
  238.                     break
  239.  
  240.         elif choice == 3:
  241.             break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement