diff --git a/gui/platform_edit.ui b/gui/platform_edit.ui
index 56f5558..df3d028 100644
--- a/gui/platform_edit.ui
+++ b/gui/platform_edit.ui
@@ -218,7 +218,7 @@
- Fund dealing fee*
+ Fund dealing fee
@@ -342,7 +342,7 @@
8
- 262
+ 540
191
21
@@ -508,6 +508,24 @@
on the value above £ there is no charge
+
+
+
+ 10
+ 284
+ 151
+ 16
+
+
+
+
+ 11
+
+
+
+ Fund platform fee*
+
+
diff --git a/src/db_handler.py b/src/db_handler.py
index dbbd5c8..3543e1e 100644
--- a/src/db_handler.py
+++ b/src/db_handler.py
@@ -246,3 +246,20 @@ class DBHandler:
state_data = [state, index]
self.cur.execute("UPDATE tblPlatforms SET IsEnabled = ? WHERE PlatformID = ?", state_data)
self.conn.commit()
+
+ def remove_platform(self, index: int):
+ tbl_list = ["tblPlatforms", "tblFlatPlatFees", "tblFlatDealFees", "tblFundPlatFee"]
+ for tbl in tbl_list:
+ self.cur.execute(f"DELETE FROM {tbl} WHERE PlatformID = {index}")
+
+ res = self.cur.execute("SELECT PlatformID from tblPlatforms").fetchall()
+ n = len(res)
+ for i in range(n):
+ for tbl in tbl_list:
+ self.cur.execute(f"""
+ UPDATE {tbl}
+ SET PlatformID = {index + i}
+ WHERE PlatformID = {index + 1 + i}
+ """)
+
+ self.conn.commit()
diff --git a/src/output_window.py b/src/output_window.py
index f8dbdcb..39a20e1 100644
--- a/src/output_window.py
+++ b/src/output_window.py
@@ -24,6 +24,7 @@ class OutputWindow(QWidget):
# Handle events
self.save_graph_but.clicked.connect(self.save_graph)
+ self.save_csv_but.clicked.connect(self.save_csv)
self.time_slider.valueChanged.connect(self.change_time)
def display_output(self, results: list, years: int):
@@ -43,14 +44,68 @@ class OutputWindow(QWidget):
def save_graph(self):
file_picker = QFileDialog(self)
- file_picker.setFileMode(QFileDialog.FileMode.Directory)
- folder_path = ""
- if file_picker.exec():
- folder_path = file_picker.selectedFiles()[0]
-
+ file_picker.setFileMode(QFileDialog.FileMode.AnyFile)
+ file_picker.setDefaultSuffix("png")
+ file_picker.setWindowTitle("Save results as PNG")
+ file_picker.setAcceptMode(QFileDialog.AcceptMode.AcceptSave)
+ file_picker.setNameFilter("*.png")
+ file_path = ""
cur_time = datetime.now()
- filename_str = f"{folder_path}/SIPPCompare-{cur_time.year}.{cur_time.month}.{cur_time.day}.png"
- self.fig.savefig(filename_str, dpi=150)
+ filename_str = f"{file_path}/SIPPCompare-{cur_time.year}.{cur_time.month}.{cur_time.day}.png"
+ file_picker.selectFile(filename_str)
+ if file_picker.exec():
+ file_path = file_picker.selectedFiles()[0]
+
+ try:
+ self.fig.savefig(file_path, dpi=150)
+ except:
+ pass
+
+ def save_csv(self):
+ file_picker = QFileDialog(self)
+ file_picker.setFileMode(QFileDialog.FileMode.AnyFile)
+ file_picker.setDefaultSuffix("csv")
+ file_picker.setWindowTitle("Save results as CSV")
+ file_picker.setAcceptMode(QFileDialog.AcceptMode.AcceptSave)
+ file_picker.setNameFilter("*.csv")
+ file_path = ""
+ cur_time = datetime.now()
+ filename_str = f"{file_path}/SIPPCompare-{cur_time.year}.{cur_time.month}.{cur_time.day}.csv"
+ file_picker.selectFile(filename_str)
+ if file_picker.exec():
+ file_path = file_picker.selectedFiles()[0]
+
+ try:
+ csvfile = open(file_path, "wt")
+ csv_string = (
+ "Platform Name,Fund Platform Fee,Share Platform Fee,Fund Dealing Fee,"
+ "Share Dealing Fee,Total Platform Fees,Total Dealing Fees,Total Fund Fees,"
+ "Total Share Fees,Total Fees"
+ )
+
+ for result in self.results:
+ csv_string += '\n'
+ pn = result[4]
+ fpf = result[0]
+ spf = result[2]
+ fdf = result[1]
+ sdf = result[3]
+
+ tpf = fpf + spf
+ tdf = sdf + fdf
+
+ tff = fpf + fdf
+ tsf = spf + sdf
+ tf = tff + tsf
+ csv_string += (
+ f"{pn},\"£{fpf:,.2f}\",\"£{spf:,.2f}\",\"£{fdf:,.2f}\",\"£{sdf:,.2f}\","
+ f"\"£{tpf:,.2f}\",\"£{tdf:,.2f}\",\"£{tff:,.2f}\",\"£{tsf:,.2f}\",\"£{tf:,.2f}\""
+ )
+
+ csvfile.write(csv_string)
+ csvfile.close()
+ except OSError:
+ print("ERROR FILE SAVE FAILED")
def change_time(self):
years: int = self.time_slider.value()
diff --git a/src/platform_edit.py b/src/platform_edit.py
index b625550..a3d14a6 100644
--- a/src/platform_edit.py
+++ b/src/platform_edit.py
@@ -65,7 +65,7 @@ class PlatformEdit(QWidget):
if self.plat.fund_deal_fee is None:
self.check_boxes_ticked[1] = False
- self.plat_fund_deal_fee_check.setChecked(False)
+ self.fund_deal_fee_check.setChecked(False)
else:
self.check_boxes_ticked[1] = True
self.fund_deal_fee_check.setChecked(True)
@@ -317,8 +317,6 @@ class PlatformEdit(QWidget):
prev_box_row = cur_box_pos[0] - 1
prev_box_item = self.gridLayout_2.itemAtPosition(prev_box_row, cur_box_pos[1]).widget()
- #if loading:
- # prev_box_item.setValue(self.plat.fund_plat_fee[0][x+1])
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")
diff --git a/src/platform_list.py b/src/platform_list.py
index 63a3c1f..0630462 100644
--- a/src/platform_list.py
+++ b/src/platform_list.py
@@ -1,7 +1,7 @@
from PyQt6 import uic
from PyQt6.QtCore import QRegularExpression
-from PyQt6.QtGui import QIcon, QRegularExpressionValidator
-from PyQt6.QtWidgets import QWidget, QListWidgetItem, QDialog
+from PyQt6.QtGui import QIcon, QRegularExpressionValidator, QFont
+from PyQt6.QtWidgets import QWidget, QListWidgetItem, QDialog, QDialogButtonBox, QMessageBox
import resource_finder
from db_handler import DBHandler
@@ -34,6 +34,25 @@ class PlatformRename(QDialog):
event.ignore()
self.reject()
+
+class RemoveConfirm(QMessageBox):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.setWindowIcon(QIcon(resource_finder.get_res_path("icon2.ico")))
+ self.setWindowTitle("Remove platform?")
+ self.setIcon(QMessageBox.Icon.Warning)
+ font = QFont()
+ font.setPointSize(11)
+ self.setFont(font)
+ self.setText("Are you sure you want to remove this platform?")
+ self.setInformativeText("This action is immediate and permanent")
+
+ self.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.Cancel)
+ self.setDefaultButton(QMessageBox.StandardButton.Cancel)
+ font.setPointSize(10)
+ self.findChild(QDialogButtonBox).setFont(font)
+
+
class PlatformList(QWidget):
def __init__(self, db: DBHandler):
super().__init__()
@@ -44,20 +63,12 @@ class PlatformList(QWidget):
self.db = db
self.plat_edit_win = None
self.plat_list_dialog = PlatformRename()
+ self.del_plat_dialog = RemoveConfirm()
self.plat_list = []
self.plat_name_list = []
self.new_plat_name = ""
self.update_plat_list()
-
- for i in range(len(self.plat_name_list)):
- plat_name = self.plat_name_list[i]
- item = QListWidgetItem()
- if plat_name is not None:
- item.setText(plat_name)
- else:
- item.setText(f"Unnamed [ID: {i}]")
-
- self.platListWidget.addItem(item)
+ self.db_indices = [x for x in range(len(self.plat_name_list))]
# Handle events
self.add_plat_but.clicked.connect(self.add_platform)
@@ -70,6 +81,17 @@ class PlatformList(QWidget):
def update_plat_list(self):
self.plat_name_list = self.db.retrieve_plat_list()
self.plat_list = self.db.retrieve_platforms()
+ self.platListWidget.clear()
+
+ for i in range(len(self.plat_name_list)):
+ plat_name = self.plat_name_list[i]
+ item = QListWidgetItem()
+ if plat_name is not None:
+ item.setText(plat_name)
+ else:
+ item.setText(f"Unnamed [ID: {i}]")
+
+ self.platListWidget.addItem(item)
def add_platform(self):
name_dialog_res = self.plat_list_dialog.exec()
@@ -97,6 +119,11 @@ class PlatformList(QWidget):
else:
self.plat_enabled_check.setChecked(False)
+ if index in self.db_indices:
+ self.del_plat_but.setEnabled(True)
+ else:
+ self.del_plat_but.setEnabled(False)
+
def edit_platform(self):
index = self.platListWidget.currentRow()
self.plat_edit_win = PlatformEdit(self.plat_list[index])
@@ -104,6 +131,8 @@ class PlatformList(QWidget):
def save_platforms(self):
self.db.write_platforms(self.plat_list)
+ self.update_plat_list()
+ self.db_indices = [x for x in range(len(self.plat_name_list))]
def toggle_platform_state(self):
index = self.platListWidget.currentRow()
@@ -111,4 +140,8 @@ class PlatformList(QWidget):
self.db.toggle_platform_state(index, state)
def remove_platform(self):
- return None
+ index = self.platListWidget.currentRow()
+ del_dialog_res = self.del_plat_dialog.exec()
+ if del_dialog_res == QMessageBox.StandardButton.Yes:
+ self.db.remove_platform(index)
+ self.update_plat_list()