Compare commits

...

11 Commits

Author SHA1 Message Date
Roland W-H
cc5686d3d7
Merge PR #2 from RolandWH/testing (user defined fund_plat_fee)
Implement user defined fund_plat_fee using a table interface where each row is a band. There is full input validation using a combination of the FastEditQDoubleSpinBox widget and custom code that checks the numbers in each row are sane (each band less than previous band, fee is a non-zero number).
2025-03-18 13:39:02 +00:00
e0f49a1c14 add dynamic 'on the value above' label 2025-03-18 13:35:55 +00:00
255fed7ce7 fix inout validation on first row 2025-03-18 13:06:45 +00:00
a99a6263a8 ensure the fee for a band is non-zero 2025-03-18 13:00:02 +00:00
0338bc0bb7 fix input validation when removing rows 2025-03-18 12:47:31 +00:00
93f69cc0da add input validation to fund_plat_fee tiers 2025-03-18 12:17:19 +00:00
ead59079b3 make font sizes consistent 2025-03-18 10:44:41 +00:00
df7baa2df2 increase font size for better readability 2025-03-17 21:57:30 +00:00
d1cf30422c correct indentation in fee calculation func 2025-03-17 21:56:39 +00:00
f395f155d0 make fund deal fee checkbox optional 2025-03-17 21:55:13 +00:00
32bc3add9b make fund_plat_fee user defined (no validation) 2025-03-17 15:16:02 +00:00
5 changed files with 466 additions and 43 deletions

View File

@ -35,7 +35,7 @@
<x>10</x> <x>10</x>
<y>0</y> <y>0</y>
<width>401</width> <width>401</width>
<height>171</height> <height>176</height>
</rect> </rect>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
@ -53,6 +53,11 @@
</property> </property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="value_lab"> <widget class="QLabel" name="value_lab">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Pension value</string> <string>Pension value</string>
</property> </property>
@ -60,6 +65,11 @@
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QDoubleSpinBox" name="value_input"> <widget class="QDoubleSpinBox" name="value_input">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="frame"> <property name="frame">
<bool>true</bool> <bool>true</bool>
</property> </property>
@ -82,6 +92,11 @@
</item> </item>
<item row="1" column="0" colspan="2"> <item row="1" column="0" colspan="2">
<widget class="QLabel" name="mix_lab"> <widget class="QLabel" name="mix_lab">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Investment mix (funds 50% / shares 50%)</string> <string>Investment mix (funds 50% / shares 50%)</string>
</property> </property>
@ -108,6 +123,11 @@
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="share_trades_lab"> <widget class="QLabel" name="share_trades_lab">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Annual share trades</string> <string>Annual share trades</string>
</property> </property>
@ -115,6 +135,11 @@
</item> </item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="fund_trades_lab"> <widget class="QLabel" name="fund_trades_lab">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Annual fund trades</string> <string>Annual fund trades</string>
</property> </property>
@ -122,6 +147,11 @@
</item> </item>
<item row="4" column="1"> <item row="4" column="1">
<widget class="QComboBox" name="fund_trades_combo"> <widget class="QComboBox" name="fund_trades_combo">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="editable"> <property name="editable">
<bool>true</bool> <bool>true</bool>
</property> </property>
@ -132,6 +162,11 @@
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Calculate</string> <string>Calculate</string>
</property> </property>
@ -139,6 +174,11 @@
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QComboBox" name="share_trades_combo"> <widget class="QComboBox" name="share_trades_combo">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="editable"> <property name="editable">
<bool>true</bool> <bool>true</bool>
</property> </property>
@ -151,6 +191,11 @@
<property name="enabled"> <property name="enabled">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
</widget> </widget>
<widget class="QMenuBar" name="menuBar"> <widget class="QMenuBar" name="menuBar">
<property name="geometry"> <property name="geometry">
@ -161,7 +206,17 @@
<height>33</height> <height>33</height>
</rect> </rect>
</property> </property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<widget class="QMenu" name="menuPlatforms"> <widget class="QMenu" name="menuPlatforms">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="title"> <property name="title">
<string>File</string> <string>File</string>
</property> </property>
@ -173,6 +228,11 @@
<property name="text"> <property name="text">
<string>Edit Platforms</string> <string>Edit Platforms</string>
</property> </property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
</action> </action>
</widget> </widget>
<tabstops> <tabstops>

View File

@ -34,6 +34,11 @@
<height>250</height> <height>250</height>
</rect> </rect>
</property> </property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
</widget> </widget>
<widget class="QPushButton" name="res_ok_but"> <widget class="QPushButton" name="res_ok_but">
<property name="geometry"> <property name="geometry">
@ -44,6 +49,11 @@
<height>24</height> <height>24</height>
</rect> </rect>
</property> </property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>OK</string> <string>OK</string>
</property> </property>
@ -57,6 +67,11 @@
<height>24</height> <height>24</height>
</rect> </rect>
</property> </property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Save</string> <string>Save</string>
</property> </property>

View File

@ -6,32 +6,20 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>498</width> <width>630</width>
<height>303</height> <height>567</height>
</rect> </rect>
</property> </property>
<property name="minimumSize">
<size>
<width>498</width>
<height>303</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>498</width>
<height>303</height>
</size>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>Platform Editor</string> <string>Platform Editor</string>
</property> </property>
<widget class="QWidget" name="gridLayoutWidget"> <widget class="QWidget" name="gridLayoutWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>20</x> <x>10</x>
<y>20</y> <y>20</y>
<width>461</width> <width>611</width>
<height>243</height> <height>241</height>
</rect> </rect>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
@ -75,6 +63,11 @@
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="buttonSymbols"> <property name="buttonSymbols">
<enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum> <enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum>
</property> </property>
@ -92,7 +85,7 @@
<item row="2" column="3"> <item row="2" column="3">
<widget class="QCheckBox" name="fund_deal_fee_check"> <widget class="QCheckBox" name="fund_deal_fee_check">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<property name="checked"> <property name="checked">
<bool>true</bool> <bool>true</bool>
@ -101,6 +94,11 @@
</item> </item>
<item row="6" column="2"> <item row="6" column="2">
<widget class="FastEditQDoubleSpinBox" name="share_deal_fee_box"> <widget class="FastEditQDoubleSpinBox" name="share_deal_fee_box">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="buttonSymbols"> <property name="buttonSymbols">
<enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum> <enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum>
</property> </property>
@ -117,6 +115,11 @@
</item> </item>
<item row="8" column="0" colspan="2"> <item row="8" column="0" colspan="2">
<widget class="QLabel" name="share_deal_reduce_trades_lab"> <widget class="QLabel" name="share_deal_reduce_trades_lab">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Share dealing discount # of trades</string> <string>Share dealing discount # of trades</string>
</property> </property>
@ -127,6 +130,11 @@
</item> </item>
<item row="5" column="0" colspan="2"> <item row="5" column="0" colspan="2">
<widget class="QLabel" name="share_plat_max_fee_lab"> <widget class="QLabel" name="share_plat_max_fee_lab">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Share platform monthly fee cap</string> <string>Share platform monthly fee cap</string>
</property> </property>
@ -134,6 +142,11 @@
</item> </item>
<item row="2" column="2"> <item row="2" column="2">
<widget class="FastEditQDoubleSpinBox" name="fund_deal_fee_box"> <widget class="FastEditQDoubleSpinBox" name="fund_deal_fee_box">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="buttonSymbols"> <property name="buttonSymbols">
<enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum> <enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum>
</property> </property>
@ -150,6 +163,11 @@
</item> </item>
<item row="6" column="0" colspan="2"> <item row="6" column="0" colspan="2">
<widget class="QLabel" name="share_deal_fee_lab"> <widget class="QLabel" name="share_deal_fee_lab">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Share dealing fee*</string> <string>Share dealing fee*</string>
</property> </property>
@ -160,6 +178,11 @@
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="buttonSymbols"> <property name="buttonSymbols">
<enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum> <enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum>
</property> </property>
@ -186,6 +209,11 @@
</item> </item>
<item row="2" column="0" colspan="2"> <item row="2" column="0" colspan="2">
<widget class="QLabel" name="fund_deal_fee_lab"> <widget class="QLabel" name="fund_deal_fee_lab">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Fund dealing fee*</string> <string>Fund dealing fee*</string>
</property> </property>
@ -195,10 +223,21 @@
<widget class="QCheckBox" name="share_plat_max_fee_check"/> <widget class="QCheckBox" name="share_plat_max_fee_check"/>
</item> </item>
<item row="0" column="2"> <item row="0" column="2">
<widget class="QLineEdit" name="plat_name_box"/> <widget class="QLineEdit" name="plat_name_box">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
</widget>
</item> </item>
<item row="9" column="0" colspan="2"> <item row="9" column="0" colspan="2">
<widget class="QLabel" name="share_deal_reduce_amount_lab"> <widget class="QLabel" name="share_deal_reduce_amount_lab">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Share dealing discount amount</string> <string>Share dealing discount amount</string>
</property> </property>
@ -206,6 +245,11 @@
</item> </item>
<item row="4" column="0" colspan="2"> <item row="4" column="0" colspan="2">
<widget class="QLabel" name="share_plat_fee_lab"> <widget class="QLabel" name="share_plat_fee_lab">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Share platform fee*</string> <string>Share platform fee*</string>
</property> </property>
@ -213,6 +257,11 @@
</item> </item>
<item row="4" column="2"> <item row="4" column="2">
<widget class="FastEditQDoubleSpinBox" name="share_plat_fee_box"> <widget class="FastEditQDoubleSpinBox" name="share_plat_fee_box">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="buttonSymbols"> <property name="buttonSymbols">
<enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum> <enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum>
</property> </property>
@ -229,6 +278,11 @@
</item> </item>
<item row="0" column="0" colspan="2"> <item row="0" column="0" colspan="2">
<widget class="QLabel" name="plat_name_lab"> <widget class="QLabel" name="plat_name_lab">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Platform name</string> <string>Platform name</string>
</property> </property>
@ -239,6 +293,11 @@
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="buttonSymbols"> <property name="buttonSymbols">
<enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum> <enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum>
</property> </property>
@ -261,12 +320,17 @@
</property> </property>
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>350</x> <x>482</x>
<y>270</y> <y>534</y>
<width>141</width> <width>141</width>
<height>24</height> <height>24</height>
</rect> </rect>
</property> </property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>Save</string> <string>Save</string>
</property> </property>
@ -274,8 +338,8 @@
<widget class="QLabel" name="req_field_lab"> <widget class="QLabel" name="req_field_lab">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>8</x>
<y>280</y> <y>262</y>
<width>191</width> <width>191</width>
<height>21</height> <height>21</height>
</rect> </rect>
@ -287,7 +351,7 @@
<widget class="QLabel" name="active_lab"> <widget class="QLabel" name="active_lab">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>437</x> <x>577</x>
<y>10</y> <y>10</y>
<width>61</width> <width>61</width>
<height>16</height> <height>16</height>
@ -300,6 +364,147 @@
<set>Qt::AlignmentFlag::AlignCenter</set> <set>Qt::AlignmentFlag::AlignCenter</set>
</property> </property>
</widget> </widget>
<widget class="QWidget" name="gridLayoutWidget_2">
<property name="geometry">
<rect>
<x>11</x>
<y>309</y>
<width>611</width>
<height>31</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<property name="verticalSpacing">
<number>0</number>
</property>
<item row="0" column="3">
<widget class="FastEditQDoubleSpinBox" name="first_tier_fee_box">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum>
</property>
<property name="correctionMode">
<enum>QAbstractSpinBox::CorrectionMode::CorrectToNearestValue</enum>
</property>
<property name="suffix">
<string>%</string>
</property>
<property name="maximum">
<double>100.000000000000000</double>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="first_tier_lab">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string>on the first</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="first_tier_fee_lab">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string>the fee is</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="FastEditQDoubleSpinBox" name="first_tier_box">
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::ButtonSymbols::NoButtons</enum>
</property>
<property name="correctionMode">
<enum>QAbstractSpinBox::CorrectionMode::CorrectToNearestValue</enum>
</property>
<property name="prefix">
<string>£</string>
</property>
<property name="maximum">
<double>9999999.000000000000000</double>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QPushButton" name="add_row_but">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>532</x>
<y>481</y>
<width>91</width>
<height>24</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Add row</string>
</property>
</widget>
<widget class="QPushButton" name="del_row_but">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>440</x>
<y>481</y>
<width>91</width>
<height>24</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Remove row</string>
</property>
</widget>
<widget class="QLabel" name="val_above_lab">
<property name="geometry">
<rect>
<x>6</x>
<y>479</y>
<width>421</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>on the value above £ there is no charge</string>
</property>
</widget>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>
@ -321,7 +526,6 @@
<tabstop>share_deal_fee_box</tabstop> <tabstop>share_deal_fee_box</tabstop>
<tabstop>share_deal_reduce_trades_box</tabstop> <tabstop>share_deal_reduce_trades_box</tabstop>
<tabstop>share_deal_reduce_amount_box</tabstop> <tabstop>share_deal_reduce_amount_box</tabstop>
<tabstop>save_but</tabstop>
<tabstop>plat_name_check</tabstop> <tabstop>plat_name_check</tabstop>
<tabstop>fund_deal_fee_check</tabstop> <tabstop>fund_deal_fee_check</tabstop>
<tabstop>share_plat_fee_check</tabstop> <tabstop>share_plat_fee_check</tabstop>
@ -329,6 +533,11 @@
<tabstop>share_deal_fee_check</tabstop> <tabstop>share_deal_fee_check</tabstop>
<tabstop>share_deal_reduce_trades_check</tabstop> <tabstop>share_deal_reduce_trades_check</tabstop>
<tabstop>share_deal_reduce_amount_check</tabstop> <tabstop>share_deal_reduce_amount_check</tabstop>
<tabstop>first_tier_box</tabstop>
<tabstop>first_tier_fee_box</tabstop>
<tabstop>del_row_but</tabstop>
<tabstop>add_row_but</tabstop>
<tabstop>save_but</tabstop>
</tabstops> </tabstops>
<resources/> <resources/>
<connections> <connections>

View File

@ -66,7 +66,6 @@ class SIPPCompare(QMainWindow):
def init_variables(self): def init_variables(self):
self.optional_boxes = self.platform_win.get_optional_boxes() self.optional_boxes = self.platform_win.get_optional_boxes()
self.fund_plat_fee = self.platform_win.get_fund_plat_fee() self.fund_plat_fee = self.platform_win.get_fund_plat_fee()
self.fund_deal_fee = self.platform_win.get_fund_deal_fee()
self.share_plat_fee = self.platform_win.get_share_plat_fee() self.share_plat_fee = self.platform_win.get_share_plat_fee()
self.share_deal_fee = self.platform_win.get_share_deal_fee() self.share_deal_fee = self.platform_win.get_share_deal_fee()
@ -77,16 +76,21 @@ class SIPPCompare(QMainWindow):
self.plat_name = None self.plat_name = None
if self.optional_boxes[1]: if self.optional_boxes[1]:
self.fund_deal_fee = self.platform_win.get_fund_deal_fee()
else:
self.fund_deal_fee = None
if self.optional_boxes[2]:
self.share_plat_max_fee = self.platform_win.get_share_plat_max_fee() self.share_plat_max_fee = self.platform_win.get_share_plat_max_fee()
else: else:
self.share_plat_max_fee = None self.share_plat_max_fee = None
if self.optional_boxes[2]: if self.optional_boxes[3]:
self.share_deal_reduce_trades = self.platform_win.get_share_deal_reduce_trades() self.share_deal_reduce_trades = self.platform_win.get_share_deal_reduce_trades()
else: else:
self.share_deal_reduce_trades = None self.share_deal_reduce_trades = None
if self.optional_boxes[3]: if self.optional_boxes[4]:
self.share_deal_reduce_amount = self.platform_win.get_share_deal_reduce_amount() self.share_deal_reduce_amount = self.platform_win.get_share_deal_reduce_amount()
else: else:
self.share_deal_reduce_amount = None self.share_deal_reduce_amount = None
@ -101,7 +105,8 @@ class SIPPCompare(QMainWindow):
slider_val: int = self.mix_slider.value() slider_val: int = self.mix_slider.value()
funds_value = (slider_val / 100) * value_num funds_value = (slider_val / 100) * value_num
fund_trades_num = int(self.fund_trades_combo.currentText()) fund_trades_num = int(self.fund_trades_combo.currentText())
self.fund_deal_fees = fund_trades_num * self.fund_deal_fee if self.fund_deal_fee is not None:
self.fund_deal_fees = fund_trades_num * self.fund_deal_fee
for i in range(1, len(self.fund_plat_fee[0])): for i in range(1, len(self.fund_plat_fee[0])):
band = self.fund_plat_fee[0][i] band = self.fund_plat_fee[0][i]
@ -120,15 +125,15 @@ class SIPPCompare(QMainWindow):
if self.share_plat_max_fee is not None: if self.share_plat_max_fee is not None:
if (self.share_plat_fee * shares_value / 12) > self.share_plat_max_fee: if (self.share_plat_fee * shares_value / 12) > self.share_plat_max_fee:
self.share_plat_fees = self.share_plat_max_fee * 12 self.share_plat_fees = self.share_plat_max_fee * 12
else: else:
self.share_plat_fees = self.share_plat_fee * shares_value self.share_plat_fees = self.share_plat_fee * shares_value
share_trades_num = int(self.share_trades_combo.currentText()) share_trades_num = int(self.share_trades_combo.currentText())
if self.share_deal_reduce_trades is not None: if self.share_deal_reduce_trades is not None:
if (share_trades_num / 12) >= self.share_deal_reduce_trades: if (share_trades_num / 12) >= self.share_deal_reduce_trades:
self.share_deal_fees = self.share_deal_reduce_amount * share_trades_num self.share_deal_fees = self.share_deal_reduce_amount * share_trades_num
else: else:
self.share_deal_fees = self.share_deal_fee * share_trades_num self.share_deal_fees = self.share_deal_fee * share_trades_num
self.show_output_win() self.show_output_win()

View File

@ -1,8 +1,9 @@
from PyQt6.QtCore import QRegularExpression from PyQt6.QtCore import QRegularExpression
from PyQt6.QtGui import QRegularExpressionValidator from PyQt6.QtGui import QRegularExpressionValidator, QFont
from PyQt6.QtWidgets import QWidget from PyQt6.QtWidgets import QWidget, QLabel
from PyQt6 import uic from PyQt6 import uic
from widgets.fastedit_spinbox import FastEditQDoubleSpinBox
import main_window import main_window
@ -16,11 +17,7 @@ class PlatformEdit(QWidget):
# Create main window object, passing this instance as param # Create main window object, passing this instance as param
self.main_win = main_window.SIPPCompare(self) self.main_win = main_window.SIPPCompare(self)
# TODO: Make fund_plat_fee user-defined self.fund_plat_fee = []
self.fund_plat_fee = [
[0, 250000, 1000000, 2000000],
[0, 0.25, 0.1, 0.05]
]
self.plat_name = "" self.plat_name = ""
self.fund_deal_fee = 0.0 self.fund_deal_fee = 0.0
self.share_plat_fee = 0.0 self.share_plat_fee = 0.0
@ -28,19 +25,22 @@ class PlatformEdit(QWidget):
self.share_deal_fee = 0.0 self.share_deal_fee = 0.0
self.share_deal_reduce_trades = 0.0 self.share_deal_reduce_trades = 0.0
self.share_deal_reduce_amount = 0.0 self.share_deal_reduce_amount = 0.0
self.widgets_list_list = []
self.fund_fee_rows = 1
# Debugging feature: set with "--DEBUG_AUTOFILL" cmd argument # Debugging feature: set with "--DEBUG_AUTOFILL" cmd argument
self.autofill = autofill self.autofill = autofill
if autofill: if autofill:
self.save_but.setEnabled(True) self.save_but.setEnabled(True)
self.required_fields = [ self.required_fields = [
self.fund_deal_fee_box,
self.share_plat_fee_box, self.share_plat_fee_box,
self.share_deal_fee_box self.share_deal_fee_box
] ]
self.optional_fields = [ self.optional_fields = [
self.plat_name_box, self.plat_name_box,
self.fund_deal_fee_box,
self.share_plat_max_fee_box, self.share_plat_max_fee_box,
self.share_deal_reduce_trades_box, self.share_deal_reduce_trades_box,
self.share_deal_reduce_amount_box self.share_deal_reduce_amount_box
@ -48,12 +48,14 @@ class PlatformEdit(QWidget):
self.optional_check_boxes = [ self.optional_check_boxes = [
self.plat_name_check, self.plat_name_check,
self.fund_deal_fee_check,
self.share_plat_max_fee_check, self.share_plat_max_fee_check,
self.share_deal_reduce_trades_check, self.share_deal_reduce_trades_check,
self.share_deal_reduce_amount_check self.share_deal_reduce_amount_check
] ]
self.check_boxes_ticked = [ self.check_boxes_ticked = [
True,
True, True,
False, False,
False, False,
@ -74,8 +76,14 @@ class PlatformEdit(QWidget):
for check_box in self.optional_check_boxes: for check_box in self.optional_check_boxes:
check_box.checkStateChanged.connect(self.check_valid) check_box.checkStateChanged.connect(self.check_valid)
self.first_tier_box.valueChanged.connect(self.check_valid)
self.first_tier_fee_box.valueChanged.connect(self.check_valid)
self.first_tier_box.valueChanged.connect(self.update_tier_labels)
# NOTE: Signal defined in UI file to close window when save button clicked # NOTE: Signal defined in UI file to close window when save button clicked
self.save_but.clicked.connect(self.init_variables) self.save_but.clicked.connect(self.init_variables)
self.add_row_but.clicked.connect(self.add_row)
self.del_row_but.clicked.connect(self.remove_row)
# Set validators # Set validators
# Regex accepts any characters that match [a-Z], [0-9] or _ # Regex accepts any characters that match [a-Z], [0-9] or _
@ -83,11 +91,28 @@ class PlatformEdit(QWidget):
QRegularExpressionValidator(QRegularExpression("\\w*")) QRegularExpressionValidator(QRegularExpression("\\w*"))
) )
def create_plat_fee_struct(self):
plat_fee_struct = [[0], [0]]
plat_fee_struct[0].append(self.first_tier_box.value())
plat_fee_struct[1].append(self.first_tier_fee_box.value())
for i in range(len(self.widgets_list_list)):
band = self.widgets_list_list[i][1].value()
fee = self.widgets_list_list[i][3].value()
plat_fee_struct[0].append(band)
plat_fee_struct[1].append(fee)
return plat_fee_struct
# Get fee structure variables from user input when "Save" clicked # Get fee structure variables from user input when "Save" clicked
def init_variables(self): def init_variables(self):
# If debugging, save time by hardcoding # If debugging, save time by hardcoding
if self.autofill: if self.autofill:
self.plat_name = "AJBell" self.plat_name = "AJBell"
self.fund_plat_fee = [
[0, 250000, 1000000, 2000000],
[0, 0.25, 0.1, 0.05]
]
self.fund_deal_fee = 1.50 self.fund_deal_fee = 1.50
self.share_plat_fee = 0.0025 self.share_plat_fee = 0.0025
self.share_plat_max_fee = 3.50 self.share_plat_max_fee = 3.50
@ -96,6 +121,7 @@ class PlatformEdit(QWidget):
self.share_deal_reduce_amount = 3.50 self.share_deal_reduce_amount = 3.50
else: else:
self.plat_name = self.plat_name_box.text() self.plat_name = self.plat_name_box.text()
self.fund_plat_fee = self.create_plat_fee_struct()
self.fund_deal_fee = float(self.fund_deal_fee_box.value()) self.fund_deal_fee = float(self.fund_deal_fee_box.value())
self.share_plat_fee = float(self.share_plat_fee_box.value()) / 100 self.share_plat_fee = float(self.share_plat_fee_box.value()) / 100
self.share_plat_max_fee = float(self.share_plat_max_fee_box.value()) self.share_plat_max_fee = float(self.share_plat_max_fee_box.value())
@ -116,6 +142,7 @@ class PlatformEdit(QWidget):
# It's also called when any field emits a textChanged() or valueChanged() signal # It's also called when any field emits a textChanged() or valueChanged() signal
def check_valid(self): def check_valid(self):
valid = True valid = True
tiers_valid = True
# Check all required fields have a non-zero value # Check all required fields have a non-zero value
for field in self.required_fields: for field in self.required_fields:
@ -145,11 +172,118 @@ class PlatformEdit(QWidget):
input_box_item.setEnabled(False) input_box_item.setEnabled(False)
self.check_boxes_ticked[i] = False self.check_boxes_ticked[i] = False
if valid: if self.first_tier_fee_box.value() == 0:
tiers_valid = False
if self.fund_fee_rows > 1:
if self.widgets_list_list[0][1].value() <= self.first_tier_box.value():
tiers_valid = False
if self.widgets_list_list[0][3].value() == 0:
tiers_valid = False
for i in range(len(self.widgets_list_list) - 1, 0, -1):
if self.widgets_list_list[i][1].value() <= self.widgets_list_list[i-1][1].value():
tiers_valid = False
if self.widgets_list_list[i][3].value() == 0:
tiers_valid = False
if tiers_valid and self.fund_fee_rows < 6:
self.add_row_but.setEnabled(True)
else:
self.add_row_but.setEnabled(False)
if valid and tiers_valid:
self.save_but.setEnabled(True) self.save_but.setEnabled(True)
else: else:
self.save_but.setEnabled(False) self.save_but.setEnabled(False)
def update_tier_labels(self):
if self.fund_fee_rows > 1:
prev_value = self.first_tier_box.value()
self.widgets_list_list[0][0].setText(f"between £{int(prev_value)} and")
for i in range(len(self.widgets_list_list) - 1, 0, -1):
prev_value = self.widgets_list_list[i-1][1].value()
self.widgets_list_list[i][0].setText(f"between £{int(prev_value)} and")
if self.fund_fee_rows > 1:
max_band = self.widgets_list_list[self.fund_fee_rows - 2][1].value()
else:
max_band = self.first_tier_box.value()
self.val_above_lab.setText(f"on the value above £{int(max_band)} there is no charge")
def add_row(self):
widgets = []
font = QFont()
font.setPointSize(11)
widgets.append(QLabel(self.gridLayoutWidget_2))
widgets[0].setFont(font)
widgets.append(FastEditQDoubleSpinBox(self.gridLayoutWidget_2))
widgets[1].setPrefix("£")
widgets[1].setMaximum(9999999)
widgets[1].setButtonSymbols(FastEditQDoubleSpinBox.ButtonSymbols.NoButtons)
widgets[1].setFont(font)
widgets[1].valueChanged.connect(self.check_valid)
widgets[1].valueChanged.connect(self.update_tier_labels)
widgets.append(QLabel(self.gridLayoutWidget_2))
widgets[2].setText(f"the fee is")
widgets[2].setFont(font)
widgets.append(FastEditQDoubleSpinBox(self.gridLayoutWidget_2))
widgets[3].setSuffix("%")
widgets[3].setMaximum(100)
widgets[3].setButtonSymbols(FastEditQDoubleSpinBox.ButtonSymbols.NoButtons)
widgets[3].setFont(font)
widgets[3].valueChanged.connect(self.check_valid)
# TODO: why 28.5?
self.gridLayoutWidget_2.setGeometry(11, 309, 611, int(round(28.5 * (self.fund_fee_rows + 1), 0)))
for i in range(len(widgets)):
self.gridLayout_2.addWidget(widgets[i], self.fund_fee_rows, i, 1, 1)
self.fund_fee_rows += 1
self.widgets_list_list.append(widgets)
cur_label_idx = self.gridLayout_2.indexOf(widgets[0])
cur_box_idx = self.gridLayout_2.indexOf(widgets[1])
cur_label_pos = list(self.gridLayout_2.getItemPosition(cur_label_idx))[:2]
cur_box_pos = list(self.gridLayout_2.getItemPosition(cur_box_idx))[:2]
prev_box_row = cur_box_pos[0] - 1
prev_box_item = self.gridLayout_2.itemAtPosition(prev_box_row, cur_box_pos[1]).widget()
cur_label_item = self.gridLayout_2.itemAtPosition(cur_label_pos[0], cur_label_pos[1]).widget()
cur_label_item.setText(f"between £{int(prev_box_item.value())} and")
if self.fund_fee_rows > 1:
self.del_row_but.setEnabled(True)
if self.fund_fee_rows > 5:
self.add_row_but.setEnabled(False)
self.check_valid()
# TODO: Tab order
def remove_row(self):
for widget in self.widgets_list_list[self.fund_fee_rows - 2]:
self.gridLayout_2.removeWidget(widget)
widget.hide()
self.widgets_list_list.pop()
self.fund_fee_rows -= 1
self.gridLayoutWidget_2.setGeometry(11, 309, 611, int(round(28.5 * self.fund_fee_rows, 0)))
if self.fund_fee_rows < 2:
self.del_row_but.setEnabled(False)
if self.fund_fee_rows < 6:
self.add_row_but.setEnabled(True)
self.check_valid()
self.update_tier_labels()
# Getter functions (is this necessary? maybe directly reading class vars would be best...) # Getter functions (is this necessary? maybe directly reading class vars would be best...)
def get_optional_boxes(self): def get_optional_boxes(self):
return self.check_boxes_ticked return self.check_boxes_ticked