summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2009-09-19 16:58:46 +0200
committerYorhel <git@yorhel.nl>2009-09-19 16:58:46 +0200
commitf98086b625473f8d2dab5369aeed87f55193e503 (patch)
tree588fb5fe2defeb7a6b01f76fe2983e4c60dbe3b0
parentdea3c51ca55e30767d8321f2fa9581d036df0828 (diff)
Added contra account management + several other improvements
The other improvements: - Renamed some actions in geld.ui - Fixed bug in Transaction::load() - Properly set translations.contra=NULL when no contra account is selected - Added default argument for ContraAccount::save()
-rw-r--r--contraaccount.cpp13
-rw-r--r--contraaccount.h3
-rw-r--r--geld.cpp144
-rw-r--r--geld.h6
-rw-r--r--geld.ui103
-rw-r--r--transaction.cpp9
6 files changed, 243 insertions, 35 deletions
diff --git a/contraaccount.cpp b/contraaccount.cpp
index 87606ed..86ce9b8 100644
--- a/contraaccount.cpp
+++ b/contraaccount.cpp
@@ -8,6 +8,7 @@ ContraAccount::ContraAccount(QWidget *parent) :
m_ui(new Ui::ContraAccount)
{
m_ui->setupUi(this);
+ m_ui->Name->setFocus();
}
ContraAccount::~ContraAccount()
@@ -29,6 +30,18 @@ void ContraAccount::on_buttonBox_accepted()
accept();
}
+void ContraAccount::load(int id)
+{
+ QSqlQuery q;
+ q.prepare("SELECT name, account, address FROM contra_accounts WHERE id = ?");
+ q.addBindValue(id);
+ q.exec();
+ q.next();
+ m_ui->Name->setText(q.value(0).toString());
+ m_ui->Account->setText(q.value(1).toString());
+ m_ui->Address->setPlainText(q.value(2).toString());
+}
+
int ContraAccount::save(int id)
{
QSqlQuery q;
diff --git a/contraaccount.h b/contraaccount.h
index 7784cc5..76d8513 100644
--- a/contraaccount.h
+++ b/contraaccount.h
@@ -12,7 +12,8 @@ class ContraAccount : public QDialog {
public:
ContraAccount(QWidget *parent = 0);
~ContraAccount();
- int save(int);
+ void load(int);
+ int save(int = 0);
private:
Ui::ContraAccount *m_ui;
diff --git a/geld.cpp b/geld.cpp
index aaab6dd..1482a5a 100644
--- a/geld.cpp
+++ b/geld.cpp
@@ -5,6 +5,7 @@
#include <QtGlobal>
#include <QSqlQueryModel>
#include <QMessageBox>
+#include "contraaccount.h"
#include "transactionmodel.h"
#include "transaction.h"
@@ -28,20 +29,35 @@ Geld::Geld(QWidget *parent)
TransactionModel *transmod = new TransactionModel(ui->tableTransactions);
ui->tableTransactions->setModel(transmod);
ui->tableTransactions->setColumnHidden(0, true);
- refreshTransactions();
+
+ QSqlQueryModel *contramod = new QSqlQueryModel(ui->tableContra);
+ ui->tableContra->setModel(contramod);
+ ui->tableTransactions->setColumnHidden(0, true);
+ refreshLists();
// the Qt Designer interface lacks functionality for connecting actions to widgets
- ui->tableTransactions->addAction(ui->action_trans_Add);
- ui->tableTransactions->addAction(ui->action_trans_Edit);
- ui->tableTransactions->addAction(ui->action_trans_Delete);
+ ui->tableTransactions->addAction(ui->actionTransAdd);
+ ui->tableTransactions->addAction(ui->actionTransEdit);
+ ui->tableTransactions->addAction(ui->actionTransDelete);
+
+ ui->tableContra->addAction(ui->actionContraAdd);
+ ui->tableContra->addAction(ui->actionContraEdit);
+ ui->tableContra->addAction(ui->actionContraDelete);
// the Qt Designer interface also lacks some functionality when it comes to connecting signals to functions
- connect(ui->btnAddTransaction, SIGNAL(clicked()), this, SLOT(addTransaction()));
- connect(ui->action_trans_Add, SIGNAL(triggered()), this, SLOT(addTransaction()));
- connect(ui->btnEditTransaction, SIGNAL(clicked()), this, SLOT(editTransaction()));
- connect(ui->action_trans_Edit, SIGNAL(triggered()), this, SLOT(editTransaction()));
- connect(ui->tableTransactions, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(editTransaction()));
- connect(ui->action_trans_Delete, SIGNAL(triggered()), this, SLOT(deleteTransaction()));
+ connect(ui->btnAddTransaction, SIGNAL(clicked()), this, SLOT(addTransaction()));
+ connect(ui->actionTransAdd, SIGNAL(triggered()), this, SLOT(addTransaction()));
+ connect(ui->btnEditTransaction, SIGNAL(clicked()), this, SLOT(editTransaction()));
+ connect(ui->actionTransEdit, SIGNAL(triggered()), this, SLOT(editTransaction()));
+ connect(ui->tableTransactions, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(editTransaction()));
+ connect(ui->actionTransDelete, SIGNAL(triggered()), this, SLOT(deleteTransaction()));
+
+ connect(ui->btnAddContra, SIGNAL(clicked()), this, SLOT(addContra()));
+ connect(ui->actionContraAdd, SIGNAL(triggered()), this, SLOT(addContra()));
+ connect(ui->btnEditContra, SIGNAL(clicked()), this, SLOT(editContra()));
+ connect(ui->actionContraEdit, SIGNAL(triggered()), this, SLOT(editContra()));
+ connect(ui->tableContra, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(editContra()));
+ connect(ui->actionContraDelete, SIGNAL(triggered()), this, SLOT(deleteContra()));
ui->statusBar->showMessage(QString("Opened database file %1").arg(f), 0);
}
@@ -92,18 +108,7 @@ void Geld::closeDB()
QSqlDatabase::removeDatabase(conn);
}
-int Geld::selectedTransaction() {
- // this. is. soooooooo. ugly.
- TransactionModel *mod = (TransactionModel *) ui->tableTransactions->model();
- QModelIndexList indexes = ui->tableTransactions->selectionModel()->selection().indexes();
- if(indexes.count() != mod->columnCount()) {
- ui->statusBar->showMessage("Nothing selected.", 3000);
- return 0;
- }
- return mod->data(mod->index(indexes.at(0).row(), 0), Qt::DisplayRole).toInt();
-}
-
-void Geld::refreshTransactions() {
+void Geld::refreshLists() {
ui->tableTransactions->horizontalHeader()->setStretchLastSection(false);
((TransactionModel *) ui->tableTransactions->model())->refresh();
ui->tableTransactions->resizeColumnsToContents();
@@ -114,6 +119,36 @@ void Geld::refreshTransactions() {
q.next();
ui->lblTransactionBalance->setText(QString("Balance: <span style=\"color: %1\">%2</span>")
.arg(q.value(0).toInt() < 0 ? "red" : "green").arg(q.value(0).toDouble()/100, 4, 'f', 2));
+
+ ui->tableContra->horizontalHeader()->setStretchLastSection(false);
+ QSqlQueryModel *m = (QSqlQueryModel *)ui->tableContra->model();
+ m->setQuery(
+ "SELECT c.id, c.account, c.name, COUNT(t.id), c.address "
+ "FROM contra_accounts c "
+ "LEFT JOIN transactions t ON t.contra = c.id "
+ "GROUP BY c.id "
+ "ORDER BY name"
+ );
+ m->setHeaderData(0, Qt::Horizontal, "ID");
+ m->setHeaderData(1, Qt::Horizontal, "Account");
+ m->setHeaderData(2, Qt::Horizontal, "Name");
+ m->setHeaderData(3, Qt::Horizontal, "Transactions");
+ m->setHeaderData(4, Qt::Horizontal, "Address");
+ ui->tableContra->setColumnHidden(0, true);
+ ui->tableContra->resizeColumnsToContents();
+ ui->tableContra->horizontalHeader()->setStretchLastSection(true);
+}
+
+int Geld::selectedTransaction()
+{
+ // this. is. soooooooo. ugly.
+ TransactionModel *mod = (TransactionModel *) ui->tableTransactions->model();
+ QModelIndexList indexes = ui->tableTransactions->selectionModel()->selection().indexes();
+ if(indexes.count() != mod->columnCount()) {
+ ui->statusBar->showMessage("Nothing selected.", 3000);
+ return 0;
+ }
+ return mod->data(mod->index(indexes.at(0).row(), 0), Qt::DisplayRole).toInt();
}
void Geld::editTransaction()
@@ -125,7 +160,7 @@ void Geld::editTransaction()
t.load(id);
if(t.exec() == QDialog::Accepted) {
t.save(id);
- refreshTransactions();
+ refreshLists();
}
}
@@ -134,7 +169,7 @@ void Geld::addTransaction()
Transaction t(this);
if(t.exec() == QDialog::Accepted) {
t.save();
- refreshTransactions();
+ refreshLists();
}
}
@@ -148,7 +183,66 @@ void Geld::deleteTransaction()
q.prepare("DELETE FROM transactions WHERE id = ?");
q.addBindValue(id);
q.exec();
- refreshTransactions();
+ refreshLists();
+ }
+}
+
+int Geld::selectedContra()
+{
+ // this. is. soooooooo. ugly.
+ QAbstractItemModel *mod = ui->tableContra->model();
+ QModelIndexList indexes = ui->tableContra->selectionModel()->selection().indexes();
+ if(indexes.count() != mod->columnCount()) {
+ ui->statusBar->showMessage("Nothing selected.", 3000);
+ return 0;
+ }
+ return mod->data(mod->index(indexes.at(0).row(), 0), Qt::DisplayRole).toInt();
+}
+
+void Geld::addContra()
+{
+ ContraAccount c(this);
+ if(c.exec() == QDialog::Accepted) {
+ c.save();
+ refreshLists();
+ }
+}
+
+void Geld::editContra()
+{
+ int id = selectedContra();
+ if(!id)
+ return;
+ ContraAccount c(this);
+ c.load(id);
+ if(c.exec() == QDialog::Accepted) {
+ c.save(id);
+ refreshLists();
+ }
+}
+
+void Geld::deleteContra()
+{
+ int id = selectedContra();
+ if(!id)
+ return;
+ QSqlQuery q;
+ q.prepare("SELECT 1 FROM transactions WHERE contra = ? LIMIT 1");
+ q.addBindValue(id);
+ q.exec();
+ if(q.next()) {
+ QMessageBox::critical(this, "Can't delete contra account",
+ "This contra account appears to be refered to from a transaction. "
+ "Please make sure there are no transactions with this contra account in the database and try again."
+ );
+ return;
+ }
+ if(QMessageBox::question(this, "You sure?", "Are you sure you want to remove the selected contra account?", QMessageBox::No|QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {
+ QSqlQuery q;
+ q.prepare("DELETE FROM contra_accounts WHERE id = ?");
+ q.addBindValue(id);
+ q.exec();
+ refreshLists();
}
}
diff --git a/geld.h b/geld.h
index b807cd0..5523c7b 100644
--- a/geld.h
+++ b/geld.h
@@ -21,13 +21,17 @@ private:
void initDB(QString f);
void closeDB();
int selectedTransaction();
- void refreshTransactions();
+ int selectedContra();
+ void refreshLists();
Ui::Geld *ui;
private slots:
void addTransaction();
void editTransaction();
void deleteTransaction();
+ void addContra();
+ void editContra();
+ void deleteContra();
};
#endif // GELD_H
diff --git a/geld.ui b/geld.ui
index e3e618a..62be078 100644
--- a/geld.ui
+++ b/geld.ui
@@ -20,6 +20,9 @@
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
+ <property name="tabPosition">
+ <enum>QTabWidget::North</enum>
+ </property>
<property name="currentIndex">
<number>0</number>
</property>
@@ -63,7 +66,7 @@
<item row="1" column="2">
<widget class="QPushButton" name="btnAddTransaction">
<property name="text">
- <string>&amp;Add new transaction</string>
+ <string>&amp;New transaction</string>
</property>
</widget>
</item>
@@ -82,6 +85,74 @@
</item>
</layout>
</widget>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Contra accounts</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="1" column="2">
+ <widget class="QPushButton" name="btnAddContra">
+ <property name="text">
+ <string>&amp;New contra account</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="3">
+ <widget class="QTableView" name="tableContra">
+ <property name="contextMenuPolicy">
+ <enum>Qt::ActionsContextMenu</enum>
+ </property>
+ <property name="editTriggers">
+ <set>QAbstractItemView::NoEditTriggers</set>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior">
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <attribute name="horizontalHeaderHighlightSections">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="verticalHeaderVisible">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="verticalHeaderDefaultSectionSize">
+ <number>18</number>
+ </attribute>
+ <attribute name="verticalHeaderVisible">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="verticalHeaderDefaultSectionSize">
+ <number>18</number>
+ </attribute>
+ <attribute name="horizontalHeaderHighlightSections">
+ <bool>false</bool>
+ </attribute>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QPushButton" name="btnEditContra">
+ <property name="text">
+ <string>&amp;Edit</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
</widget>
</item>
</layout>
@@ -115,7 +186,7 @@
<string>Ctrl+Q</string>
</property>
</action>
- <action name="action_trans_Delete">
+ <action name="actionTransDelete">
<property name="text">
<string>&amp;Delete</string>
</property>
@@ -123,7 +194,7 @@
<string>Remove transaction</string>
</property>
</action>
- <action name="action_trans_Add">
+ <action name="actionTransAdd">
<property name="text">
<string>&amp;New transaction</string>
</property>
@@ -131,7 +202,7 @@
<string>Add new transaction</string>
</property>
</action>
- <action name="action_trans_Edit">
+ <action name="actionTransEdit">
<property name="text">
<string>&amp;Edit</string>
</property>
@@ -139,6 +210,30 @@
<string>Edit transaction</string>
</property>
</action>
+ <action name="actionContraAdd">
+ <property name="text">
+ <string>&amp;New contra account</string>
+ </property>
+ <property name="toolTip">
+ <string>Add new contra account</string>
+ </property>
+ </action>
+ <action name="actionContraEdit">
+ <property name="text">
+ <string>&amp;Edit</string>
+ </property>
+ <property name="toolTip">
+ <string>Edit contra account</string>
+ </property>
+ </action>
+ <action name="actionContraDelete">
+ <property name="text">
+ <string>&amp;Delete</string>
+ </property>
+ <property name="toolTip">
+ <string>Remove contra account</string>
+ </property>
+ </action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
diff --git a/transaction.cpp b/transaction.cpp
index 071f24d..36ca247 100644
--- a/transaction.cpp
+++ b/transaction.cpp
@@ -61,8 +61,8 @@ void Transaction::load(int id)
q.next();
m_ui->Date->setText(q.value(0).toString());
m_ui->Amount->setText(QString("%1").arg(q.value(1).toDouble()/100, 4, 'f', 2));
- m_ui->Contra->setCurrentIndex(m_ui->Contra->findData(q.value(3)));
- m_ui->Description->setPlainText(q.value(4).toString());
+ m_ui->Contra->setCurrentIndex(q.value(2).isNull() ? 0 : m_ui->Contra->findData(q.value(2)));
+ m_ui->Description->setPlainText(q.value(3).toString());
}
void Transaction::save(int id)
@@ -74,7 +74,8 @@ void Transaction::save(int id)
);
q.addBindValue(m_ui->Date->text());
q.addBindValue(m_ui->Amount->text().toDouble()*100);
- q.addBindValue(m_ui->Contra->itemData(m_ui->Contra->currentIndex()).toInt());
+ int contra = m_ui->Contra->itemData(m_ui->Contra->currentIndex()).toInt();
+ q.addBindValue(contra ? contra : QVariant(QVariant::Int));
q.addBindValue(m_ui->Description->toPlainText());
if(id)
q.addBindValue(id);
@@ -88,7 +89,7 @@ void Transaction::on_Contra_currentIndexChanged(int index)
ContraAccount c(this);
if(c.exec() == QDialog::Accepted) {
- int id = c.save(0);
+ int id = c.save();
populateContra();
m_ui->Contra->setCurrentIndex(m_ui->Contra->findData(id));
} else {