SIPPCompare/src/main_window.py
2025-01-28 15:25:41 +00:00

89 lines
3.5 KiB
Python

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()