mirror of
https://github.com/RolandWH/SIPPCompare.git
synced 2025-06-28 07:11:16 +01:00
initial commit
This commit is contained in:
9
src/main.py
Normal file
9
src/main.py
Normal file
@ -0,0 +1,9 @@
|
||||
import sys
|
||||
|
||||
from PyQt6.QtWidgets import QApplication
|
||||
import main_window
|
||||
|
||||
app = QApplication(sys.argv)
|
||||
window = main_window.SIPPCompare()
|
||||
window.show()
|
||||
app.exec()
|
88
src/main_window.py
Normal file
88
src/main_window.py
Normal file
@ -0,0 +1,88 @@
|
||||
from PyQt6.QtWidgets import QMainWindow
|
||||
from PyQt6 import uic
|
||||
import platform_edit
|
||||
import output_window
|
||||
|
||||
|
||||
class SIPPCompare(QMainWindow):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
uic.loadUi("gui/main_gui.ui", self)
|
||||
|
||||
# Define class variables
|
||||
self.tiered_fees = [
|
||||
[0, 250000, 1000000, 2000000],
|
||||
[0, 0.25, 0.1, 0.05]
|
||||
]
|
||||
self.fund_deal_fee = 1.5
|
||||
self.share_plat_fee = 0.0025
|
||||
self.share_plat_max_fee = 3.5
|
||||
self.share_deal_fee = 5
|
||||
self.share_deal_reduce_trades = 10
|
||||
self.share_deal_reduce_amount = 3.5
|
||||
|
||||
self.result = None
|
||||
self.platform_win = None
|
||||
self.output_win = None
|
||||
|
||||
# Handle events
|
||||
self.calc_but.clicked.connect(self.calculate_fee)
|
||||
self.actionEdit_Platforms.triggered.connect(self.show_platform_edit)
|
||||
self.mix_slider.valueChanged.connect(self.update_slider_lab)
|
||||
|
||||
# Display slider position as mix between two nums (funds/shares)
|
||||
def update_slider_lab(self):
|
||||
slider_val = self.mix_slider.value()
|
||||
self.mix_lab.setText(f"Investment mix (funds {slider_val}% / shares {100 - slider_val}%)")
|
||||
#mix_percent_lab_str = f"{slider_val}% / {100 - slider_val}%"
|
||||
#self.mix_percent_lab.setText(mix_percent_lab_str)
|
||||
|
||||
# Calculate fees
|
||||
def calculate_fee(self):
|
||||
value_num = float(self.value_input.text()[1:])
|
||||
slider_val = self.mix_slider.value()
|
||||
funds_value = (slider_val / 100) * value_num
|
||||
fund_trades_num = int(self.fund_trades_combo.currentText())
|
||||
fund_deal_fees = fund_trades_num * self.fund_deal_fee
|
||||
fund_plat_fees = 0
|
||||
remaining = funds_value
|
||||
|
||||
for i in range(1, len(self.tiered_fees[0])):
|
||||
band = self.tiered_fees[0][i]
|
||||
prev_band = self.tiered_fees[0][i - 1]
|
||||
fee = self.tiered_fees[1][i]
|
||||
gap = (band - prev_band)
|
||||
|
||||
if remaining > gap:
|
||||
fund_plat_fees += gap * (fee / 100)
|
||||
remaining -= gap
|
||||
else:
|
||||
fund_plat_fees += remaining * (fee / 100)
|
||||
break
|
||||
|
||||
shares_value = (1 - (slider_val / 100)) * value_num
|
||||
share_plat_fees = self.share_plat_fee * shares_value
|
||||
if (share_plat_fees / 12) > self.share_plat_max_fee:
|
||||
share_plat_fees = self.share_plat_max_fee * 12
|
||||
share_trades_num = int(self.share_trades_combo.currentText())
|
||||
share_deal_fees = self.share_deal_fee * share_trades_num
|
||||
if (share_trades_num / 12) > self.share_deal_reduce_trades:
|
||||
share_deal_fees = self.share_deal_reduce_amount * share_trades_num
|
||||
|
||||
self.show_output_win(fund_plat_fees, fund_deal_fees, share_plat_fees, share_deal_fees)
|
||||
|
||||
# Show the output window - this func is called from calculate_fee()
|
||||
def show_output_win(self, fund_plat_fees, fund_deal_fees, share_plat_fees, share_deal_fees):
|
||||
# Check window isn't already open
|
||||
if self.output_win is None:
|
||||
self.output_win = output_window.OutputWindow()
|
||||
# Refresh the results when new fees are calculated
|
||||
self.output_win.display_output(fund_plat_fees, fund_deal_fees, share_plat_fees, share_deal_fees)
|
||||
self.output_win.show()
|
||||
|
||||
# Show the platform editor window (currently useless)
|
||||
def show_platform_edit(self):
|
||||
# Check window isn't already open
|
||||
if self.platform_win is None:
|
||||
self.platform_win = platform_edit.PlatformEdit()
|
||||
self.platform_win.show()
|
28
src/output_window.py
Normal file
28
src/output_window.py
Normal file
@ -0,0 +1,28 @@
|
||||
from PyQt6.QtWidgets import QWidget
|
||||
from PyQt6 import uic
|
||||
|
||||
class OutputWindow(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
uic.loadUi("gui/output_window.ui", self)
|
||||
|
||||
def display_output(self, fund_plat_fees: float, fund_deal_fees: float,
|
||||
share_plat_fees: float, share_deal_fees: float):
|
||||
results_str = "Fees breakdown:"
|
||||
|
||||
results_str += "\n\nPlatform fees:"
|
||||
results_str += f"\n\tFund platform fees: £{round(fund_plat_fees, 2):.2f}"
|
||||
results_str += f"\n\tShare platform fees: £{round(share_plat_fees, 2):.2f}"
|
||||
total_plat_fees = fund_plat_fees + share_plat_fees
|
||||
results_str += f"\n\tTotal platform fees: £{round(total_plat_fees, 2):.2f}"
|
||||
|
||||
results_str += "\n\nDealing fees:"
|
||||
results_str += f"\n\tFund dealing fees: £{round(fund_deal_fees, 2):.2f}"
|
||||
results_str += f"\n\tShare dealing fees: £{round(share_deal_fees, 2):.2f}"
|
||||
total_deal_fees = fund_deal_fees + share_deal_fees
|
||||
results_str += f"\n\tTotal dealing fees: £{round(total_deal_fees, 2):.2f}"
|
||||
|
||||
total_fees = total_plat_fees + total_deal_fees
|
||||
results_str += f"\n\nTotal fees: £{round(total_fees, 2):.2f}"
|
||||
|
||||
self.output.setText(results_str)
|
7
src/platform_edit.py
Normal file
7
src/platform_edit.py
Normal file
@ -0,0 +1,7 @@
|
||||
from PyQt6.QtWidgets import QWidget
|
||||
from PyQt6 import uic
|
||||
|
||||
class PlatformEdit(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
uic.loadUi("gui/platform_edit.ui", self)
|
Reference in New Issue
Block a user