KNewLoanWizard::KNewLoanWizard(QWidget *parent) : KNewLoanWizardDecl(parent), m_pages(Page_Summary + 1, true) { setModal(true); KMyMoneyMVCCombo::setSubstringSearchForChildren(m_namePage, !KMyMoneySettings::stringMatchFromStart()); // make sure, the back button does not clear fields setOption(QWizard::IndependentPages, true); // connect(m_payeeEdit, SIGNAL(newPayee(QString)), this, SLOT(slotNewPayee(QString))); connect(m_namePage->m_payeeEdit, SIGNAL(createItem(QString,QString&)), this, SIGNAL(createPayee(QString,QString&))); connect(m_additionalFeesPage, SIGNAL(newCategory(MyMoneyAccount&)), this, SIGNAL(newCategory(MyMoneyAccount&))); connect(MyMoneyFile::instance(), SIGNAL(dataChanged()), this, SLOT(slotReloadEditWidgets())); resetCalculator(); slotReloadEditWidgets(); // As default we assume a liability loan, with fixed interest rate, // with a first payment due on the 30th of this month. All payments // should be recorded and none have been made so far. //FIXME: port m_firstPaymentPage->m_firstDueDateEdit->loadDate(QDate(QDate::currentDate().year(), QDate::currentDate().month(), 30)); // FIXME: we currently only support interest calculation on reception m_pages.clearBit(Page_InterestCalculation); // turn off all pages that are contained here for derived classes m_pages.clearBit(Page_EditIntro); m_pages.clearBit(Page_EditSelection); m_pages.clearBit(Page_EffectiveDate); m_pages.clearBit(Page_PaymentEdit); m_pages.clearBit(Page_InterestEdit); m_pages.clearBit(Page_SummaryEdit); // for now, we don't have online help :-( setOption(QWizard::HaveHelpButton, false); // setup a phony transaction for additional fee processing m_account = MyMoneyAccount("Phony-ID", MyMoneyAccount()); m_split.setAccountId(m_account.id()); m_split.setValue(MyMoneyMoney()); m_transaction.addSplit(m_split); KMyMoneyUtils::updateWizardButtons(this); }
void onlineJobAdministrationTest::initTestCase() { file = MyMoneyFile::instance(); storage = new MyMoneySeqAccessMgr; file->attachStorage(storage); try { MyMoneyAccount account = MyMoneyAccount(); account.setName("Test Account"); account.setAccountType(MyMoneyAccount::Savings); MyMoneyAccount asset = file->asset(); MyMoneyFileTransaction transaction; file->addAccount(account , asset); accountId = account.id(); transaction.commit(); } catch (const MyMoneyException& ex) { QFAIL(qPrintable("Unexpected exception " + ex.what())); } }
void KMyMoneyAccountTreeView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) { QTreeView::selectionChanged(selected, deselected); if (!selected.empty()) { QModelIndexList indexes = selected.front().indexes(); if (!indexes.empty()) { QVariant data = model()->data(model()->index(indexes.front().row(), AccountsModel::Account, indexes.front().parent()), AccountsModel::AccountRole); if (data.isValid()) { if (data.canConvert<MyMoneyAccount>()) { emit selectObject(data.value<MyMoneyAccount>()); } if (data.canConvert<MyMoneyInstitution>()) { emit selectObject(data.value<MyMoneyInstitution>()); } // an object was successfully selected return; } } } // since no object was selected reset the object selection emit selectObject(MyMoneyAccount()); emit selectObject(MyMoneyInstitution()); }
void MyMoneyAccountTest::testReadXML() { MyMoneyAccount a; QString ref_ok = QString( "<!DOCTYPE TEST>\n" "<ACCOUNT-CONTAINER>\n" " <ACCOUNT parentaccount=\"Parent\" lastmodified=\"%1\" lastreconciled=\"\" institution=\"B000001\" number=\"465500\" opened=\"%2\" type=\"9\" id=\"A000001\" name=\"AccountName\" description=\"Desc\" >\n" " <SUBACCOUNTS>\n" " <SUBACCOUNT id=\"A000002\" />\n" " <SUBACCOUNT id=\"A000003\" />\n" " </SUBACCOUNTS>\n" " <KEYVALUEPAIRS>\n" " <PAIR key=\"key\" value=\"value\" />\n" " <PAIR key=\"Key\" value=\"Value\" />\n" " <PAIR key=\"reconciliationHistory\" value=\"2011-01-01:123/100;2011-02-01:114/25\"/>\n" " </KEYVALUEPAIRS>\n" " </ACCOUNT>\n" "</ACCOUNT-CONTAINER>\n"). arg(QDate::currentDate().toString(Qt::ISODate)).arg(QDate::currentDate().toString(Qt::ISODate)); QString ref_false = QString( "<!DOCTYPE TEST>\n" "<ACCOUNT-CONTAINER>\n" " <KACCOUNT parentaccount=\"Parent\" lastmodified=\"%1\" lastreconciled=\"\" institution=\"B000001\" number=\"465500\" opened=\"%2\" type=\"9\" id=\"A000001\" name=\"AccountName\" description=\"Desc\" >\n" " <SUBACCOUNTS>\n" " <SUBACCOUNT id=\"A000002\" />\n" " <SUBACCOUNT id=\"A000003\" />\n" " </SUBACCOUNTS>\n" " <KEYVALUEPAIRS>\n" " <PAIR key=\"key\" value=\"value\" />\n" " <PAIR key=\"Key\" value=\"Value\" />\n" " </KEYVALUEPAIRS>\n" " </KACCOUNT>\n" "</ACCOUNT-CONTAINER>\n"). arg(QDate::currentDate().toString(Qt::ISODate)).arg(QDate::currentDate().toString(Qt::ISODate)); QDomDocument doc; QDomElement node; doc.setContent(ref_false); node = doc.documentElement().firstChild().toElement(); try { a = MyMoneyAccount(node); QFAIL("Missing expected exception"); } catch (const MyMoneyException &) { } doc.setContent(ref_ok); node = doc.documentElement().firstChild().toElement(); a.addAccountId("TEST"); a.setValue("KEY", "VALUE"); try { a = MyMoneyAccount(node); QVERIFY(a.id() == "A000001"); QVERIFY(a.m_name == "AccountName"); QVERIFY(a.m_parentAccount == "Parent"); QVERIFY(a.m_lastModified == QDate::currentDate()); QVERIFY(a.m_lastReconciliationDate == QDate()); QVERIFY(a.m_institution == "B000001"); QVERIFY(a.m_number == "465500"); QVERIFY(a.m_openingDate == QDate::currentDate()); QVERIFY(a.m_accountType == MyMoneyAccount::Asset); QVERIFY(a.m_description == "Desc"); QVERIFY(a.accountList().count() == 2); QVERIFY(a.accountList()[0] == "A000002"); QVERIFY(a.accountList()[1] == "A000003"); QVERIFY(a.pairs().count() == 4); QVERIFY(a.value("key") == "value"); QVERIFY(a.value("Key") == "Value"); QVERIFY(a.value("lastStatementDate").isEmpty()); QVERIFY(a.reconciliationHistory().count() == 2); QVERIFY(a.reconciliationHistory()[QDate(2011, 1, 1)] == MyMoneyMoney(123, 100)); QVERIFY(a.reconciliationHistory()[QDate(2011, 2, 1)] == MyMoneyMoney(456, 100)); } catch (const MyMoneyException &) { QFAIL("Unexpected exception"); } }
void KNewAccountDlg::initParentWidget(QString parentId, const QString& accountId) { MyMoneyFile *file = MyMoneyFile::instance(); MyMoneyAccount liabilityAccount = file->liability(); MyMoneyAccount assetAccount = file->asset(); MyMoneyAccount expenseAccount = file->expense(); MyMoneyAccount incomeAccount = file->income(); MyMoneyAccount equityAccount = file->equity(); m_parentItem = 0; m_accountItem = 0; // Determine the parent account try { m_parentAccount = file->account(parentId); } catch (MyMoneyException *e) { m_bSelectedParentAccount = false; m_parentAccount = MyMoneyAccount(); if(m_account.accountType() != MyMoneyAccount::UnknownAccountType) { parentAccount(); parentId = m_parentAccount.id(); } delete e; } m_bSelectedParentAccount = true; // extract the account type from the combo box MyMoneyAccount::accountTypeE type; MyMoneyAccount::accountTypeE groupType; type = KMyMoneyUtils::stringToAccountType(typeCombo->currentText()); groupType = MyMoneyAccount::accountGroup(type); m_qlistviewParentAccounts->clear(); // Now scan all 4 account roots to load the list and mark the parent try { if (!m_categoryEditor) { if(groupType == MyMoneyAccount::Asset || type == MyMoneyAccount::Loan) { // Asset KMyMoneyAccountTreeBaseItem *assetTopLevelAccount = new KMyMoneyAccountTreeItem(m_qlistviewParentAccounts, assetAccount); if(m_parentAccount.id().isEmpty()) { m_parentAccount = assetAccount; parentId = m_parentAccount.id(); } if (parentId == assetAccount.id()) m_parentItem = assetTopLevelAccount; assetTopLevelAccount->setOpen(true); for ( QStringList::ConstIterator it = assetAccount.accountList().begin(); it != assetAccount.accountList().end(); ++it ) { MyMoneyAccount acc = file->account(*it); if(acc.isClosed()) continue; KMyMoneyAccountTreeBaseItem *accountItem = new KMyMoneyAccountTreeItem(assetTopLevelAccount, acc); if(parentId == acc.id()) { m_parentItem = accountItem; } else if(accountId == acc.id()) { if(m_isEditing) accountItem->setSelectable(false); m_accountItem = accountItem; } QStringList subAccounts = acc.accountList(); if (subAccounts.count() >= 1) { showSubAccounts(subAccounts, accountItem, parentId, acc.id()); } } } if(groupType == MyMoneyAccount::Liability) { // Liability KMyMoneyAccountTreeBaseItem *liabilityTopLevelAccount = new KMyMoneyAccountTreeItem(m_qlistviewParentAccounts, liabilityAccount); if(m_parentAccount.id().isEmpty()) { m_parentAccount = liabilityAccount; parentId = m_parentAccount.id(); } if (parentId == liabilityAccount.id()) m_parentItem = liabilityTopLevelAccount; liabilityTopLevelAccount->setOpen(true); for ( QStringList::ConstIterator it = liabilityAccount.accountList().begin(); it != liabilityAccount.accountList().end(); ++it ) { MyMoneyAccount acc = file->account(*it); if(acc.isClosed()) continue; KMyMoneyAccountTreeBaseItem *accountItem = new KMyMoneyAccountTreeItem(liabilityTopLevelAccount, acc); if(parentId == acc.id()) { m_parentItem = accountItem; } else if(accountId == acc.id()) { if(m_isEditing) accountItem->setSelectable(false); m_accountItem = accountItem; } QStringList subAccounts = acc.accountList(); if (subAccounts.count() >= 1) { showSubAccounts(subAccounts, accountItem, parentId, acc.id()); } } } } else { if(groupType == MyMoneyAccount::Income) { // Income KMyMoneyAccountTreeBaseItem *incomeTopLevelAccount = new KMyMoneyAccountTreeItem(m_qlistviewParentAccounts, incomeAccount); if(m_parentAccount.id().isEmpty()) { m_parentAccount = incomeAccount; parentId = m_parentAccount.id(); } if (parentId == incomeAccount.id()) m_parentItem = incomeTopLevelAccount; incomeTopLevelAccount->setOpen(true); for ( QStringList::ConstIterator it = incomeAccount.accountList().begin(); it != incomeAccount.accountList().end(); ++it ) { KMyMoneyAccountTreeBaseItem *accountItem = new KMyMoneyAccountTreeItem(incomeTopLevelAccount, file->account(*it)); QString id = file->account(*it).id(); if(parentId == id) { m_parentItem = accountItem; } else if(accountId == id) { if(m_isEditing) accountItem->setSelectable(false); m_accountItem = accountItem; } QStringList subAccounts = file->account(*it).accountList(); if (subAccounts.count() >= 1) { showSubAccounts(subAccounts, accountItem, parentId, accountId); } } } if(groupType == MyMoneyAccount::Expense) { // Expense KMyMoneyAccountTreeBaseItem *expenseTopLevelAccount = new KMyMoneyAccountTreeItem(m_qlistviewParentAccounts, expenseAccount); if(m_parentAccount.id().isEmpty()) { m_parentAccount = expenseAccount; parentId = m_parentAccount.id(); } if (parentId == expenseAccount.id()) m_parentItem = expenseTopLevelAccount; expenseTopLevelAccount->setOpen(true); for ( QStringList::ConstIterator it = expenseAccount.accountList().begin(); it != expenseAccount.accountList().end(); ++it ) { KMyMoneyAccountTreeBaseItem *accountItem = new KMyMoneyAccountTreeItem(expenseTopLevelAccount, file->account(*it)); QString id = file->account(*it).id(); if(parentId == id) { m_parentItem = accountItem; } else if(accountId == id) { if(m_isEditing) accountItem->setSelectable(false); m_accountItem = accountItem; } QStringList subAccounts = file->account(*it).accountList(); if (subAccounts.count() >= 1) { showSubAccounts(subAccounts, accountItem, parentId, accountId); } } } } } catch (MyMoneyException *e) { qDebug("Exception in assets account refresh: %s", e->what().latin1()); delete e; } m_qlistviewParentAccounts->setColumnWidth(0, m_qlistviewParentAccounts->width()); if (m_parentItem) { m_subAccountLabel->setText(i18n("Is a sub account of %1").arg(m_parentAccount.name())); m_parentItem->setOpen(true); m_qlistviewParentAccounts->setSelected(m_parentItem, true); } m_qlistviewParentAccounts->setEnabled(true); }
KTagsView::KTagsView(QWidget *parent) : QWidget(parent), m_needReload(false), m_inSelection(false), m_allowEditing(true), m_tagFilterType(0) { setupUi(this); m_filterProxyModel = new AccountNamesFilterProxyModel(this); m_filterProxyModel->addAccountGroup(MyMoneyAccount::Asset); m_filterProxyModel->addAccountGroup(MyMoneyAccount::Liability); m_filterProxyModel->addAccountGroup(MyMoneyAccount::Income); m_filterProxyModel->addAccountGroup(MyMoneyAccount::Expense); m_filterProxyModel->setSourceModel(Models::instance()->accountsModel()); m_filterProxyModel->sort(0); // create the searchline widget // and insert it into the existing layout m_searchWidget = new KListWidgetSearchLine(this, m_tagsList); m_searchWidget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); m_tagsList->setContextMenuPolicy(Qt::CustomContextMenu); m_listTopHLayout->insertWidget(0, m_searchWidget); //load the filter type m_filterBox->addItem(i18nc("@item Show all tags", "All")); m_filterBox->addItem(i18nc("@item Show only used tags", "Used")); m_filterBox->addItem(i18nc("@item Show only unused tags", "Unused")); m_filterBox->addItem(i18nc("@item Show only opened tags", "Opened")); m_filterBox->addItem(i18nc("@item Show only closed tags", "Closed")); m_filterBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); KGuiItem newButtonItem(QString(""), QIcon::fromTheme("list-add-tag"), i18n("Creates a new tag"), i18n("Use this to create a new tag.")); KGuiItem::assign(m_newButton, newButtonItem); m_newButton->setToolTip(newButtonItem.toolTip()); KGuiItem renameButtonItem(QString(""), QIcon::fromTheme("edit-rename"), i18n("Rename the current selected tag"), i18n("Use this to start renaming the selected tag.")); KGuiItem::assign(m_renameButton, renameButtonItem); m_renameButton->setToolTip(renameButtonItem.toolTip()); KGuiItem deleteButtonItem(QString(""), QIcon::fromTheme("list-remove-tag"), i18n("Delete the current selected tag"), i18n("Use this to delete the selected tag.")); KGuiItem::assign(m_deleteButton, deleteButtonItem); m_deleteButton->setToolTip(deleteButtonItem.toolTip()); KGuiItem updateButtonItem(i18nc("Update tag", "Update"), QIcon::fromTheme("dialog-ok"), i18n("Accepts the entered data and stores it"), i18n("Use this to accept the modified data.")); KGuiItem::assign(m_updateButton, updateButtonItem); m_updateButton->setEnabled(false); QList<KMyMoneyRegister::Column> cols; cols << KMyMoneyRegister::DateColumn; cols << KMyMoneyRegister::AccountColumn; cols << KMyMoneyRegister::DetailColumn; cols << KMyMoneyRegister::ReconcileFlagColumn; cols << KMyMoneyRegister::PaymentColumn; cols << KMyMoneyRegister::DepositColumn; m_register->setupRegister(MyMoneyAccount(), cols); m_register->setSelectionMode(QTableWidget::SingleSelection); m_register->setDetailsColumnType(KMyMoneyRegister::AccountFirst); m_balanceLabel->hide(); connect(m_tagsList, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(slotSelectTag(QListWidgetItem*,QListWidgetItem*))); connect(m_tagsList, SIGNAL(itemSelectionChanged()), this, SLOT(slotSelectTag())); connect(m_tagsList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(slotStartRename(QListWidgetItem*))); connect(m_tagsList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(slotRenameTag(QListWidgetItem*))); connect(m_tagsList, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotOpenContextMenu(QPoint))); connect(m_renameButton, SIGNAL(clicked()), this, SLOT(slotRenameButtonCliked())); connect(m_deleteButton, SIGNAL(clicked()), kmymoney->action("tag_delete"), SLOT(trigger())); connect(m_newButton, SIGNAL(clicked()), this, SLOT(slotTagNew())); connect(m_colorbutton, SIGNAL(changed(QColor)), this, SLOT(slotTagDataChanged())); connect(m_closed, SIGNAL(stateChanged(int)), this, SLOT(slotTagDataChanged())); connect(m_notes, SIGNAL(textChanged()), this, SLOT(slotTagDataChanged())); connect(m_updateButton, SIGNAL(clicked()), this, SLOT(slotUpdateTag())); connect(m_helpButton, SIGNAL(clicked()), this, SLOT(slotHelp())); connect(m_register, SIGNAL(editTransaction()), this, SLOT(slotSelectTransaction())); connect(MyMoneyFile::instance(), SIGNAL(dataChanged()), this, SLOT(slotLoadTags())); connect(m_filterBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotChangeFilter(int))); // use the size settings of the last run (if any) KConfigGroup grp = KSharedConfig::openConfig()->group("Last Use Settings"); m_splitter->restoreState(grp.readEntry("KTagsViewSplitterSize", QByteArray())); m_splitter->setChildrenCollapsible(false); // At start we haven't any tag selected m_tabWidget->setEnabled(false); // disable tab widget m_deleteButton->setEnabled(false); // disable delete and rename button m_renameButton->setEnabled(false); m_tag = MyMoneyTag(); // make sure we don't access an undefined tag clearItemData(); }
MyMoneyTransaction KNewLoanWizard::transaction() const { MyMoneyTransaction t; bool hasInterest = !field("interestRateEdit").value<MyMoneyMoney>().isZero(); MyMoneySplit sPayment, sInterest, sAmortization; // setup accounts. at this point, we cannot fill in the id of the // account that the amortization will be performed on, because we // create the account. So the id is yet unknown. sPayment.setAccountId(field("paymentAccountEdit").toStringList().first()); //Only create the interest split if not zero if (hasInterest) { sInterest.setAccountId(field("interestAccountEdit").toStringList().first()); sInterest.setValue(MyMoneyMoney::autoCalc); sInterest.setShares(sInterest.value()); sInterest.setAction(MyMoneySplit::ActionInterest); } // values if (field("borrowButton").toBool()) { sPayment.setValue(-field("paymentEdit").value<MyMoneyMoney>()); } else { sPayment.setValue(field("paymentEdit").value<MyMoneyMoney>()); } sAmortization.setValue(MyMoneyMoney::autoCalc); // don't forget the shares sPayment.setShares(sPayment.value()); sAmortization.setShares(sAmortization.value()); // setup the commodity MyMoneyAccount acc = MyMoneyFile::instance()->account(sPayment.accountId()); t.setCommodity(acc.currencyId()); // actions sPayment.setAction(MyMoneySplit::ActionAmortization); sAmortization.setAction(MyMoneySplit::ActionAmortization); // payee QString payeeId = field("payeeEdit").toString(); sPayment.setPayeeId(payeeId); sAmortization.setPayeeId(payeeId); MyMoneyAccount account("Phony-ID", MyMoneyAccount()); sAmortization.setAccountId(account.id()); // IMPORTANT: Payment split must be the first one, because // the schedule view expects it this way during display t.addSplit(sPayment); t.addSplit(sAmortization); if (hasInterest) { t.addSplit(sInterest); } // copy the splits from the other costs and update the payment split foreach (const MyMoneySplit& it, m_transaction.splits()) { if (it.accountId() != account.id()) { MyMoneySplit sp = it; sp.clearId(); t.addSplit(sp); sPayment.setValue(sPayment.value() - sp.value()); sPayment.setShares(sPayment.value()); t.modifySplit(sPayment); } } return t; }