diff --git a/ChangeLog b/ChangeLog index 5bbec26..3c26785 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -v0.3 (05/05/2012) +v0.3 (12/05/2012) ** User ** New interface in Qt4 Use BDD file from .local/share/kisscount @@ -21,6 +21,8 @@ v0.3 (05/05/2012) Last account/category wasn't taken in account during search New users have system language set instead of English Account/Category modification are immediatly reported in other panels + Accounts and categories where badly mapped during import + Fix cost not taken in account during import v0.2 (04/07/2011) Remove dependancies of libsqlite and libxml diff --git a/ressources/icons/about.png b/ressources/icons/about.png new file mode 100644 index 0000000..fe7dd00 Binary files /dev/null and b/ressources/icons/about.png differ diff --git a/ressources/icons/charts.png b/ressources/icons/charts.png new file mode 100644 index 0000000..6a22112 Binary files /dev/null and b/ressources/icons/charts.png differ diff --git a/ressources/icons/check.png b/ressources/icons/check.png new file mode 100644 index 0000000..f1d290c Binary files /dev/null and b/ressources/icons/check.png differ diff --git a/ressources/icons/delete.png b/ressources/icons/delete.png new file mode 100644 index 0000000..2c2f99e Binary files /dev/null and b/ressources/icons/delete.png differ diff --git a/ressources/icons/exit.png b/ressources/icons/exit.png new file mode 100644 index 0000000..2196355 Binary files /dev/null and b/ressources/icons/exit.png differ diff --git a/ressources/icons/export.png b/ressources/icons/export.png new file mode 100644 index 0000000..aaacd1b Binary files /dev/null and b/ressources/icons/export.png differ diff --git a/ressources/icons/import.png b/ressources/icons/import.png new file mode 100644 index 0000000..f63bf29 Binary files /dev/null and b/ressources/icons/import.png differ diff --git a/ressources/icons/preferences.png b/ressources/icons/preferences.png new file mode 100644 index 0000000..f0df664 Binary files /dev/null and b/ressources/icons/preferences.png differ diff --git a/ressources/icons/search.png b/ressources/icons/search.png new file mode 100644 index 0000000..04d0b5e Binary files /dev/null and b/ressources/icons/search.png differ diff --git a/ressources/icons/switch_user.png b/ressources/icons/switch_user.png new file mode 100644 index 0000000..67af195 Binary files /dev/null and b/ressources/icons/switch_user.png differ diff --git a/ressources/icons/user.png b/ressources/icons/user.png new file mode 100644 index 0000000..0080d73 Binary files /dev/null and b/ressources/icons/user.png differ diff --git a/src/model/Database.cpp b/src/model/Database.cpp index 956afa1..441db21 100644 --- a/src/model/Database.cpp +++ b/src/model/Database.cpp @@ -477,7 +477,7 @@ bool Database::GetOperation(int id, Operation* op) void Database::LinkOrUnlinkOperation(User* user, Operation& op) { Operation linked; - QString req; + QString req, v; QSqlRecord set; Account account, account2; bool _virtual; @@ -513,7 +513,7 @@ void Database::LinkOrUnlinkOperation(User* user, Operation& op) query.clear(); req = QString("SELECT id, account FROM operation WHERE description=\"%1\" AND month='%2' AND year='%3' AND amount='%4' AND meta='0' AND account !='%5' AND transfert=''") - .arg(op.description, QString::number(op.month), QString::number(op.year), QString::number(-op.amount), QString::number(op.account)); + .arg(op.description, QString::number(op.month), QString::number(op.year), v.sprintf("%d", -op.amount), QString::number(op.account)); EXECUTE_SQL_QUERY(req, ); @@ -555,7 +555,7 @@ void Database::LinkOrUnlinkOperation(User* user, Operation& op) void Database::UpdateOperation(User* user, Operation& op, bool checkTransfert) { - QString req; + QString req, v; QSqlQuery query(_db); if (checkTransfert) @@ -565,7 +565,7 @@ void Database::UpdateOperation(User* user, Operation& op, bool checkTransfert) req = "UPDATE operation SET parent='%1', account='%2', year='%3', month='%4', day='%5', amount='%6', description=\"%7\", category='%8'" ; req = req.arg((op.parent) ? QString::number(op.parent) : "", QString::number(op.account), QString::number(op.year), QString::number(op.month), - QString::number(op.day), QString::number(op.amount), op.description, QString::number(op.category)); + QString::number(op.day), v.sprintf("%d", op.amount), op.description, QString::number(op.category)); req += ", fix_cost='%1', checked='%2', transfert='%3', meta='%4', virtual='%5', formula='%6' WHERE id='%7'"; req = req.arg(QString::number(op.fix_cost), QString::number(op.checked), (op.transfert) ? QString::number(op.transfert): "", QString::number(op.meta), QString::number(op._virtual), op.formula, QString::number(op.id)); @@ -578,7 +578,7 @@ void Database::UpdateOperation(User* user, Operation& op, bool checkTransfert) int Database::AddOperation(User* user, Operation& op, bool checkTransfert) { - QString req; + QString req, v; QSqlRecord set; QSqlQuery query(_db); @@ -587,7 +587,7 @@ int Database::AddOperation(User* user, Operation& op, bool checkTransfert) req = "INSERT INTO operation ('user', 'parent', 'account', 'year', 'month', 'day', 'amount', 'description', 'category', 'fix_cost', 'formula', 'transfert', 'meta', 'virtual', 'checked') VALUES ('%1', '%2', '%3', '%4', '%5', '%6', '%7', '%8'" ; req = req.arg(QString::number(user->_id), (op.parent) ? QString::number(op.parent): "", QString::number(op.account), QString::number(op.year), - QString::number(op.month), QString::number(op.day), QString::number(op.amount), op.description); + QString::number(op.month), QString::number(op.day), v.sprintf("%d", op.amount), op.description); req += ", '%1', '%2', '%3', '%4', '%5', '%6', '%7')"; req = req.arg(QString::number(op.category), QString::number(op.fix_cost), op.formula, (op.transfert) ? QString::number(op.transfert): "", QString::number(op.meta), QString::number(op._virtual), QString::number(op.checked)); @@ -750,11 +750,11 @@ int Database::MetaPositiveAmount(int id) void Database::SetAccountAmount(int accountId, int month, int year, int amount) { - QString req; + QString req, v; QSqlQuery query(_db); req = "INSERT or REPLACE INTO account_amount ('account', 'year', 'month', 'amount') VALUES ('%1', '%2', '%3', '%4')" ; - req = req.arg(QString::number(accountId), QString::number(year), QString::number(month), QString::number(amount)); + req = req.arg(QString::number(accountId), QString::number(year), QString::number(month), v.sprintf("%d", amount)); EXECUTE_SQL_UPDATE(req, ); } @@ -1099,7 +1099,7 @@ std::map > Database::GetAllOperations(User* user) void Database::GenerateMonth(User* user, int monthFrom, int yearFrom, int monthTo, int yearTo) { std::vector::iterator it; - QString req; + QString req, v; QSqlRecord set; int amount; QSqlQuery query(_db); @@ -1135,7 +1135,7 @@ void Database::GenerateMonth(User* user, int monthFrom, int yearFrom, int monthT req = "INSERT INTO account_amount ('account', 'year', 'month', 'amount') VALUES " ; req += "('%1', '%2', '%3', '%4')"; - req = req.arg(QString::number(it->id), QString::number(yearTo), QString::number(monthTo), QString::number(amount)); + req = req.arg(QString::number(it->id), QString::number(yearTo), QString::number(monthTo), v.sprintf("%d", amount)); EXECUTE_SQL_UPDATE(req, ); } @@ -1246,7 +1246,7 @@ std::vector* Database::Search(User* user, QString* description, QDate { QSqlRecord set; QSqlQuery query(_db); - QString req; + QString req, v; bool firstCond = false; std::vector::iterator it; std::vector::iterator accountIt; @@ -1309,13 +1309,13 @@ std::vector* Database::Search(User* user, QString* description, QDate if (amountFrom) { if (firstCond) req += " AND " ; else firstCond = true; - req += "ABS(amount) >= " + QString::number(*amountFrom); + req += "ABS(amount) >= " + v.sprintf("%d", *amountFrom); } if (amountTo) { if (firstCond) req += " AND " ; else firstCond = true; - req += "ABS(amount) <= " + QString::number(*amountTo); + req += "ABS(amount) <= " + v.sprintf("%d", *amountTo); } if (categories.size()) diff --git a/src/model/export/ExportEngine.hpp b/src/model/export/ExportEngine.hpp index ae81d1e..df4ea4c 100644 --- a/src/model/export/ExportEngine.hpp +++ b/src/model/export/ExportEngine.hpp @@ -55,7 +55,7 @@ protected: std::map _accounts; std::map _categories; - std::map _accountAmounts; + std::map _accountAmounts; }; #endif diff --git a/src/model/export/XMLExportEngine.cpp b/src/model/export/XMLExportEngine.cpp index e15936b..805363e 100644 --- a/src/model/export/XMLExportEngine.cpp +++ b/src/model/export/XMLExportEngine.cpp @@ -84,7 +84,7 @@ bool XMLExportEngine::SaveAccounts() bool XMLExportEngine::SaveAccountAmounts() { - std::map::iterator it; + std::map::iterator it; QString v; for(it=_accountAmounts.begin(); it!=_accountAmounts.end(); it++) @@ -93,7 +93,7 @@ bool XMLExportEngine::SaveAccountAmounts() _writer->writeAttribute("account", QString::number(it->first.account)); _writer->writeAttribute("month", QString::number(it->first.month)); _writer->writeAttribute("year", QString::number(it->first.year)); - _writer->writeAttribute("amount", v.sprintf("%.2lf", it->second)); + _writer->writeAttribute("amount", v.sprintf("%d", it->second)); _writer->writeEndElement(); } @@ -148,7 +148,7 @@ bool XMLExportEngine::SaveOperations(std::vector* operations) _writer->writeAttribute("day", QString::number(it->day)); _writer->writeAttribute("month", QString::number(it->month)); _writer->writeAttribute("year", QString::number(it->year)); - _writer->writeAttribute("amount", QString::number(it->amount)); + _writer->writeAttribute("amount", v.sprintf("%d", it->amount)); _writer->writeAttribute("description", it->description); _writer->writeAttribute("category", QString::number(it->category)); _writer->writeAttribute("fix_cost", (it->fix_cost ? "1" : "0")); diff --git a/src/model/import/ImportEngine.cpp b/src/model/import/ImportEngine.cpp index 8d1acb8..84d2e3a 100644 --- a/src/model/import/ImportEngine.cpp +++ b/src/model/import/ImportEngine.cpp @@ -302,15 +302,40 @@ void ImportEngine::ParseFile(std::vector& accounts, std::vector* ImportEngine::GetOperations(std::map& accounts, std::map& categories) { int i; - + std::map::iterator it; + std::map newAccountAmount; + AccountAmount account; + for(i=0; i<(int)_operations.size(); i++) { - if (_operations[i].account < 0) + if (_accounts[_operations[i].account] < 0) + // Unresolved account, get new account id from User _operations[i].account = accounts[_operations[i].account]; - if (_operations[i].category < 0) + else + // Apply local mapping + _operations[i].account = _accounts[_operations[i].account]; + + if (_categories[_operations[i].category] < 0) _operations[i].category = categories[_operations[i].category]; + else + _operations[i].category = _categories[_operations[i].category]; + } + for(it=_accountAmounts.begin(); it!=_accountAmounts.end(); it++) + { + account = it->first; + + if (_accounts[account.account] < 0) + account.account = accounts[account.account]; + else + account.account = _accounts[account.account]; + newAccountAmount[account] = it->second; + } + + _accountAmounts.clear(); + _accountAmounts = newAccountAmount; + if (_kiss->GetOperationOrder() == "ASC") std::sort(_operations.begin(), _operations.end(), sortOperations); else diff --git a/src/model/import/XMLImportEngine.cpp b/src/model/import/XMLImportEngine.cpp index 470dd7f..a713701 100644 --- a/src/model/import/XMLImportEngine.cpp +++ b/src/model/import/XMLImportEngine.cpp @@ -213,14 +213,14 @@ void XMLImportEngine::LoadOperation(const QXmlAttributes& attrs) op.amount = attrs.value("amount").toInt(); op.description = attrs.value("description"); op.category = attrs.value("category").toInt(); - op.category = (attrs.value("fix_cost") == "1"); + op.fix_cost = (attrs.value("fix_cost") == "1"); op.account = attrs.value("account").toInt(); op.checked = (attrs.value("checked") == "1"); op.transfert = attrs.value("transfert").toInt(); op.formula = attrs.value("formula"); op.meta = (attrs.value("meta") == "1"); op._virtual = (attrs.value("virtual") == "1"); - + UNESCAPE_CHARS(op.description); _operations.push_back(op); diff --git a/src/view/ImportPanel.cpp b/src/view/ImportPanel.cpp index e70a135..e1afc95 100644 --- a/src/view/ImportPanel.cpp +++ b/src/view/ImportPanel.cpp @@ -255,8 +255,10 @@ void ImportPanel::OnLoadOperations() if (_accountsGrid->item(i, 2)->text() == _("Create one")) nbAccounts++; else - accounts[_accountsGrid->item(i, 0)->text().toInt()] = - user->GetAccountId(_accountsGrid->item(i, 1)->text()); + { + oldid = _unresolvedAccounts[i].id; + accounts[oldid] = user->GetAccountId(_accountsGrid->item(i, 2)->text()); + } } for(i=0; i<_categoriesGrid->rowCount(); i++) @@ -264,8 +266,10 @@ void ImportPanel::OnLoadOperations() if (_categoriesGrid->item(i, 2)->text() == _("Create one")) nbCategories++; else - categories[_categoriesGrid->item(i, 0)->text().toInt()] = - user->GetAccountId(_categoriesGrid->item(i, 1)->text()); + { + oldid = _unresolvedCategories[i].id; + categories[oldid] = user->GetCategoryId(_categoriesGrid->item(i, 2)->text());; + } } if (nbAccounts || nbCategories) @@ -295,10 +299,15 @@ void ImportPanel::OnLoadOperations() account.name = _accountsGrid->item(i, 1)->text(); else account.name = _accountsGrid->item(i, 0)->text(); + if (account.name.length() == 0) + { + QMessageBox::critical(0, _("Error"), _("Account ") + QString::number(i) + _(" must have a name")); + return; + } account.number = _accountsGrid->item(i, 0)->text(); oldid = account.id; - _resolvedAccounts[oldid] = accounts[_accountsGrid->item(i, 0)->text().toInt()] = _kiss->AddAccount(account); + accounts[oldid] = account.id = _kiss->AddAccount(account); } } @@ -313,9 +322,15 @@ void ImportPanel::OnLoadOperations() category.name = _categoriesGrid->item(i, 1)->text(); else category.name = _categoriesGrid->item(i, 0)->text(); + + if (category.name.length() == 0) + { + QMessageBox::critical(0, _("Error"), _("Category ") + QString::number(i) + _(" must have a name")); + return; + } oldid = category.id; - _resolvedCategories[oldid] = categories[_categoriesGrid->item(i, 0)->text().toInt()] = category.id = _kiss->AddCategory(category); + categories[oldid] = category.id = _kiss->AddCategory(category); } } @@ -396,9 +411,6 @@ void ImportPanel::OnIntegrate() { account = it->first.account; - if (_resolvedAccounts.count(account)) - account = _resolvedAccounts[account]; - amount = _kiss->GetAccountAmount(account, it->first.month, it->first.year); if (!amount) diff --git a/src/view/PreferencesPanel.cpp b/src/view/PreferencesPanel.cpp index 8d072f3..c1dfe06 100644 --- a/src/view/PreferencesPanel.cpp +++ b/src/view/PreferencesPanel.cpp @@ -847,7 +847,7 @@ void PreferencesPanel::OnAccountModified(int row, int col) if (value.size()) { new_account.number = value; - op_complete--; + //op_complete--; } // Account modification @@ -863,6 +863,14 @@ void PreferencesPanel::OnAccountModified(int row, int col) if (col == ACCOUNT_NAME) { + if (new_account.name.length() == 0) + { + QMessageBox::critical(0, _("Error"), _("Account must have a name")+new_account.name+_(" already exists")); + _accountsGrid->setItem(row, ACCOUNT_NAME, new QTableWidgetItem(user->_accounts[row].name)); + _inModification = false; + return ; + } + try { new_id = user->GetAccountId(new_account.name); if (new_id != new_account.id) @@ -882,7 +890,7 @@ void PreferencesPanel::OnAccountModified(int row, int col) // New account else { - if (op_complete) + if (op_complete || new_account.name.length() == 0) { _inModification = false; return ; @@ -1020,6 +1028,14 @@ void PreferencesPanel::OnCategoryModified(int row, int col) new_cat.font = old_cat.font; new_cat.parent = old_cat.parent; + if (new_cat.name.length() == 0) + { + QMessageBox::critical(0, _("Error"), _("Category must have a name")); + _categoriesGrid->setItem(row, CATEGORY_NAME, new QTableWidgetItem(_(user->_categories[row].name.toStdString().c_str()))); + _inModification = false; + return ; + } + try { new_id = user->GetCategoryId(new_cat.name); if (new_id != new_cat.id)