QString makeAccount( const QString& _name, MyMoneyAccount::accountTypeE _type, MyMoneyMoney _balance, const QDate& _open, const QString& _parent, QString _currency, bool _taxReport ) { MyMoneyAccount info; MyMoneyFileTransaction ft; info.setName(_name); info.setAccountType(_type); info.setOpeningDate(_open); if ( _currency != "" ) info.setCurrencyId(_currency); else info.setCurrencyId(MyMoneyFile::instance()->baseCurrency().id()); if(_taxReport) info.setValue("Tax", "Yes"); MyMoneyAccount parent = MyMoneyFile::instance()->account(_parent); MyMoneyFile::instance()->addAccount( info, parent ); // create the opening balance transaction if any if(!_balance.isZero()) { MyMoneySecurity sec = MyMoneyFile::instance()->currency(info.currencyId()); MyMoneyFile::instance()->openingBalanceAccount(sec); MyMoneyFile::instance()->createOpeningBalanceTransaction(info, _balance); } ft.commit(); return info.id(); }
void KEquityPriceUpdateDlg::slotQuoteFailed(const QString& _id, const QString& _symbol) { QList<QTreeWidgetItem*> foundItems = lvEquityList->findItems(_id, Qt::MatchExactly, ID_COL); QTreeWidgetItem* item = 0; if (! foundItems.empty()) item = foundItems.at(0); // Give the user some options int result; if (_id.contains(" ")) { result = KMessageBox::warningContinueCancel(this, i18n("Failed to retrieve an exchange rate for %1 from %2. It will be skipped this time.", _symbol, item->text(SOURCE_COL)), i18n("Price Update Failed")); } else { result = KMessageBox::questionYesNoCancel(this, QString("<qt>%1</qt>").arg(i18n("Failed to retrieve a quote for %1 from %2. Press <b>No</b> to remove the online price source from this security permanently, <b>Yes</b> to continue updating this security during future price updates or <b>Cancel</b> to stop the current update operation.", _symbol, item->text(SOURCE_COL))), i18n("Price Update Failed"), KStandardGuiItem::yes(), KStandardGuiItem::no()); } if (result == KMessageBox::No) { // Disable price updates for this security MyMoneyFileTransaction ft; try { // Get this security (by ID) MyMoneySecurity security = MyMoneyFile::instance()->security(_id.toUtf8()); // Set the quote source to blank security.setValue("kmm-online-source", QString()); security.setValue("kmm-online-quote-system", QString()); // Re-commit the security MyMoneyFile::instance()->modifySecurity(security); ft.commit(); } catch (const MyMoneyException &e) { KMessageBox::error(this, QString("<qt>") + i18n("Cannot update security <b>%1</b>: %2", _symbol, e.what()) + QString("</qt>"), i18n("Price Update Failed")); } } // As long as the user doesn't want to cancel, move on! if (result != KMessageBox::Cancel) { QTreeWidgetItem* next = 0; prgOnlineProgress->setValue(prgOnlineProgress->value() + 1); item->setSelected(false); // launch the NEXT one ... in case of m_fUpdateAll == false, we // need to parse the list to find the next selected one next = lvEquityList->invisibleRootItem()->child(lvEquityList->invisibleRootItem()->indexOfChild(item) + 1); if (!m_fUpdateAll) { while (next && !next->isSelected()) { prgOnlineProgress->setValue(prgOnlineProgress->value() + 1); next = lvEquityList->invisibleRootItem()->child(lvEquityList->invisibleRootItem()->indexOfChild(next) + 1); } } if (next) { m_webQuote.launch(next->text(SYMBOL_COL), next->text(ID_COL), next->text(SOURCE_COL)); } else { finishUpdate(); } } else { finishUpdate(); } }
void QueryTableTest::setUp () { storage = new MyMoneySeqAccessMgr; file = MyMoneyFile::instance(); file->attachStorage(storage); MyMoneyFileTransaction ft; file->addCurrency(MyMoneySecurity("CAD", "Canadian Dollar", "C$")); file->addCurrency(MyMoneySecurity("USD", "US Dollar", "$")); file->addCurrency(MyMoneySecurity("JPY", "Japanese Yen", QChar(0x00A5), 100, 1)); file->addCurrency(MyMoneySecurity("GBP", "British Pound", "#")); file->setBaseCurrency(file->currency("USD")); MyMoneyPayee payeeTest("Test Payee"); file->addPayee(payeeTest); MyMoneyPayee payeeTest2("Thomas Baumgart"); file->addPayee(payeeTest2); acAsset = (MyMoneyFile::instance()->asset().id()); acLiability = (MyMoneyFile::instance()->liability().id()); acExpense = (MyMoneyFile::instance()->expense().id()); acIncome = (MyMoneyFile::instance()->income().id()); acChecking = makeAccount(QString("Checking Account"),MyMoneyAccount::Checkings,moCheckingOpen,QDate(2004,5,15),acAsset); acCredit = makeAccount(QString("Credit Card"),MyMoneyAccount::CreditCard,moCreditOpen,QDate(2004,7,15),acLiability); acSolo = makeAccount(QString("Solo"),MyMoneyAccount::Expense,0,QDate(2004,1,11),acExpense); acParent = makeAccount(QString("Parent"),MyMoneyAccount::Expense,0,QDate(2004,1,11),acExpense); acChild = makeAccount(QString("Child"),MyMoneyAccount::Expense,0,QDate(2004,2,11),acParent); acForeign = makeAccount(QString("Foreign"),MyMoneyAccount::Expense,0,QDate(2004,1,11),acExpense); acTax = makeAccount(QString("Tax"), MyMoneyAccount::Expense,0,QDate(2005,1,11),acExpense, "", true); MyMoneyInstitution i("Bank of the World","","","","","",""); file->addInstitution(i); inBank = i.id(); ft.commit(); }
void makePrice(const QString& _currencyid, const QDate& _date, const MyMoneyMoney& _price ) { MyMoneyFileTransaction ft; MyMoneyFile* file = MyMoneyFile::instance(); MyMoneySecurity curr = file->currency(_currencyid); MyMoneyPrice price(_currencyid, file->baseCurrency().id(), _date, _price, "test"); file->addPrice(price); ft.commit(); }
void makeEquityPrice(const QString& _id, const QDate& _date, const MyMoneyMoney& _price ) { MyMoneyFile* file = MyMoneyFile::instance(); MyMoneyFileTransaction ft; QString basecurrencyid = file->baseCurrency().id(); MyMoneyPrice price = file->price( _id, basecurrencyid, _date, true ); if ( !price.isValid() ) { MyMoneyPrice newprice( _id, basecurrencyid, _date, _price, "test" ); file->addPrice(newprice); } ft.commit(); }
// This variant is only called when a single tag is selected and renamed. void KTagsView::slotRenameTag(QListWidgetItem* ta) { //if there is no current item selected, exit if (m_allowEditing == false || !m_tagsList->currentItem() || ta != m_tagsList->currentItem()) return; //qDebug() << "[KTagsView::slotRenameTag]"; // create a copy of the new name without appended whitespaces QString new_name = ta->text(); if (m_tag.name() != new_name) { MyMoneyFileTransaction ft; try { // check if we already have a tag with the new name try { // this function call will throw an exception, if the tag // hasn't been found. MyMoneyFile::instance()->tagByName(new_name); // the name already exists, ask the user whether he's sure to keep the name if (KMessageBox::questionYesNo(this, i18n("A tag with the name '%1' already exists. It is not advisable to have " "multiple tags with the same identification name. Are you sure you would like " "to rename the tag?", new_name)) != KMessageBox::Yes) { ta->setText(m_tag.name()); return; } } catch (const MyMoneyException &) { // all ok, the name is unique } m_tag.setName(new_name); m_newName = new_name; MyMoneyFile::instance()->modifyTag(m_tag); // the above call to modifyTag will reload the view so // all references and pointers to the view have to be // re-established. // make sure, that the record is visible even if it moved // out of sight due to the rename operation ensureTagVisible(m_tag.id()); ft.commit(); } catch (const MyMoneyException &e) { KMessageBox::detailedSorry(0, i18n("Unable to modify tag"), i18n("%1 thrown in %2:%3", e.what(), e.file(), e.line())); } } else { ta->setText(new_name); } }
void KEquityPriceUpdateDlg::storePrices() { // update the new prices into the equities MyMoneyFile* file = MyMoneyFile::instance(); QList<MyMoneySecurity> equities = file->securityList(); QTreeWidgetItem* item = 0; MyMoneyFileTransaction ft; QString name; try { for (int i = 0; i < lvEquityList->invisibleRootItem()->childCount(); ++i) { item = lvEquityList->invisibleRootItem()->child(i); // turn on signals before we modify the last entry in the list MyMoneyFile::instance()->blockSignals(i < lvEquityList->invisibleRootItem()->childCount() - 1); MyMoneyMoney rate(item->text(PRICE_COL)); if (!rate.isZero()) { QString id = item->text(ID_COL).toUtf8(); // if the ID has a space, then this is TWO ID's, so it's a currency quote if (QString(id).contains(" ")) { QStringList ids = id.split(' ', QString::SkipEmptyParts); QString fromid = ids[0].toUtf8(); QString toid = ids[1].toUtf8(); name = QString("%1 --> %2").arg(fromid).arg(toid); MyMoneyPrice price(fromid, toid, QDate().fromString(item->text(DATE_COL), Qt::ISODate), rate, item->text(SOURCE_COL)); file->addPrice(price); } else // otherwise, it's a security quote { MyMoneySecurity security = MyMoneyFile::instance()->security(id); name = security.name(); MyMoneyPrice price(id, security.tradingCurrency(), QDate().fromString(item->text(DATE_COL), Qt::ISODate), rate, item->text(SOURCE_COL)); // TODO (Ace) Better handling of the case where there is already a price // for this date. Currently, it just overrides the old value. Really it // should check to see if the price is the same and prompt the user. MyMoneyFile::instance()->addPrice(price); } } } ft.commit(); } catch (const MyMoneyException &) { qDebug("Unable to add price information for %s", qPrintable(name)); } }
QString makeEquity(const QString& _name, const QString& _symbol ) { MyMoneySecurity equity; MyMoneyFileTransaction ft; equity.setName( _name ); equity.setTradingSymbol( _symbol ); equity.setSmallestAccountFraction( 1000 ); equity.setSecurityType( MyMoneySecurity::SECURITY_NONE /*MyMoneyEquity::ETYPE_STOCK*/ ); MyMoneyFile::instance()->addSecurity( equity ); ft.commit(); return equity.id(); }
TransactionHelper::TransactionHelper( const QDate& _date, const QString& _action, MyMoneyMoney _value, const QString& _accountid, const QString& _categoryid, const QString& _currencyid, const QString& _payee ) { // _currencyid is the currency of the transaction, and of the _value // both the account and category can have their own currency (athough the category having // a foreign currency is not yet supported by the program, the reports will still allow it, // so it must be tested.) MyMoneyFile* file = MyMoneyFile::instance(); bool haspayee = ! _payee.isEmpty(); MyMoneyPayee payeeTest = file->payeeByName(_payee); MyMoneyFileTransaction ft; setPostDate(_date); QString currencyid = _currencyid; if ( currencyid.isEmpty() ) currencyid=MyMoneyFile::instance()->baseCurrency().id(); setCommodity(currencyid); MyMoneyMoney price; MyMoneySplit splitLeft; if ( haspayee ) splitLeft.setPayeeId(payeeTest.id()); splitLeft.setAction(_action); splitLeft.setValue(-_value); price = MyMoneyFile::instance()->price(currencyid, file->account(_accountid).currencyId(),_date).rate(file->account(_accountid).currencyId()); splitLeft.setShares(-_value * price); splitLeft.setAccountId(_accountid); addSplit(splitLeft); MyMoneySplit splitRight; if ( haspayee ) splitRight.setPayeeId(payeeTest.id()); splitRight.setAction(_action); splitRight.setValue(_value); price = MyMoneyFile::instance()->price(currencyid, file->account(_categoryid).currencyId(),_date).rate(file->account(_categoryid).currencyId()); splitRight.setShares(_value * price ); splitRight.setAccountId(_categoryid); addSplit(splitRight); MyMoneyFile::instance()->addTransaction(*this); ft.commit(); }
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 KTagsView::slotUpdateTag() { if (m_updateButton->isEnabled()) { MyMoneyFileTransaction ft; m_updateButton->setEnabled(false); try { m_tag.setName(m_newName); m_tag.setTagColor(m_colorbutton->color()); m_tag.setClosed(m_closed->isChecked()); m_tag.setNotes(m_notes->toPlainText()); MyMoneyFile::instance()->modifyTag(m_tag); ft.commit(); } catch (const MyMoneyException &e) { KMessageBox::detailedSorry(0, i18n("Unable to modify tag"), i18n("%1 thrown in %2:%3", e.what(), e.file(), e.line())); } } }
void KNewAccountDlg::slotNewClicked() { MyMoneyInstitution institution; KNewBankDlg dlg(institution, this); if (dlg.exec()) { MyMoneyFileTransaction ft; try { MyMoneyFile *file = MyMoneyFile::instance(); institution = dlg.institution(); file->addInstitution(institution); ft.commit(); slotLoadInstitutions(institution.name()); } catch (MyMoneyException *e) { delete e; KMessageBox::information(this, i18n("Cannot add institution")); } } }
void KNewInvestmentWizard::createObjects(const QString& parentId) { MyMoneyFile* file = MyMoneyFile::instance(); QValueList<MyMoneySecurity> list = MyMoneyFile::instance()->securityList(); QValueList<MyMoneySecurity>::ConstIterator it; MyMoneySecurity::eSECURITYTYPE type = KMyMoneyUtils::stringToSecurity(m_securityType->currentText()); MyMoneyFileTransaction ft; try { // update all relevant attributes only, if we create a stock // account and the security is unknown or we modifiy the security MyMoneySecurity newSecurity(m_security); newSecurity.setName(m_investmentName->text()); newSecurity.setTradingSymbol(m_investmentSymbol->text()); newSecurity.setTradingMarket(m_tradingMarket->currentText()); newSecurity.setSmallestAccountFraction(m_fraction->value()); newSecurity.setTradingCurrency(m_tradingCurrencyEdit->security().id()); newSecurity.setSecurityType(type); newSecurity.deletePair("kmm-online-source"); newSecurity.deletePair("kmm-online-quote-system"); newSecurity.deletePair("kmm-online-factor"); newSecurity.deletePair("kmm-security-id"); if(!m_onlineSourceCombo->currentText().isEmpty()) { if (m_useFinanceQuote->isChecked()) { FinanceQuoteProcess p; newSecurity.setValue("kmm-online-quote-system", "Finance::Quote"); newSecurity.setValue("kmm-online-source", p.crypticName(m_onlineSourceCombo->currentText())); }else{ newSecurity.setValue("kmm-online-source", m_onlineSourceCombo->currentText()); } } if(m_onlineFactor->isEnabled() && (m_onlineFactor->value() != MyMoneyMoney(1,1))) newSecurity.setValue("kmm-online-factor", m_onlineFactor->value().toString()); if(!m_investmentIdentification->text().isEmpty()) newSecurity.setValue("kmm-security-id", m_investmentIdentification->text()); if(m_security.id().isEmpty() || newSecurity != m_security) { m_security = newSecurity; // add or update it if(m_security.id().isEmpty()) { file->addSecurity(m_security); } else { file->modifySecurity(m_security); } } if(m_createAccount) { // now that the security exists, we can add the account to store it m_account.setName(m_investmentName->text()); if(m_account.accountType() == MyMoneyAccount::UnknownAccountType) m_account.setAccountType(MyMoneyAccount::Stock); m_account.setCurrencyId(m_security.id()); switch(m_priceMode->currentItem()) { case 0: m_account.deletePair("priceMode"); break; case 1: case 2: m_account.setValue("priceMode", QString("%1").arg(m_priceMode->currentItem())); break; } if(m_account.id().isEmpty()) { MyMoneyAccount parent = file->account(parentId); file->addAccount(m_account, parent); } else file->modifyAccount(m_account); } ft.commit(); } catch(MyMoneyException* e) { KMessageBox::detailedSorry(0, i18n("Unable to create all objects for the investment"), QString("%1 caugt in %2:%3").arg(e->what()).arg(e->file()).arg(e->line())); delete e; } }
void InvTransactionHelper::init( const QDate& _date, const QString& _action, MyMoneyMoney _shares, MyMoneyMoney _price, const QString& _stockaccountid, const QString& _transferid, const QString& _categoryid ) { MyMoneyFile* file = MyMoneyFile::instance(); MyMoneyAccount stockaccount = file->account(_stockaccountid); MyMoneyMoney value = _shares * _price; setPostDate(_date); setCommodity("USD"); MyMoneySplit s1; s1.setValue(value); s1.setAccountId(_stockaccountid); if ( _action == MyMoneySplit::ActionReinvestDividend ) { s1.setShares(_shares); s1.setAction(MyMoneySplit::ActionReinvestDividend); MyMoneySplit s2; s2.setAccountId(_categoryid); s2.setShares(-value); s2.setValue(-value); addSplit(s2); } else if ( _action == MyMoneySplit::ActionDividend || _action == MyMoneySplit::ActionYield ) { s1.setAccountId(_categoryid); s1.setShares(-value); s1.setValue(-value); // Split 2 will be the zero-amount investment split that serves to // mark this transaction as a cash dividend and note which stock account // it belongs to. MyMoneySplit s2; s2.setValue(0); s2.setShares(0); s2.setAction(_action); s2.setAccountId(_stockaccountid); addSplit(s2); MyMoneySplit s3; s3.setAccountId(_transferid); s3.setShares(value); s3.setValue(value); addSplit(s3); } else if ( _action == MyMoneySplit::ActionBuyShares ) { s1.setShares(_shares); s1.setAction(MyMoneySplit::ActionBuyShares); MyMoneySplit s3; s3.setAccountId(_transferid); s3.setShares(-value); s3.setValue(-value); addSplit(s3); } addSplit(s1); //kdDebug(2) << "created transaction, now adding..." << endl; MyMoneyFileTransaction ft; file->addTransaction(*this); //kdDebug(2) << "updating price..." << endl; // update the price, while we're here QString stockid = stockaccount.currencyId(); QString basecurrencyid = file->baseCurrency().id(); MyMoneyPrice price = file->price( stockid, basecurrencyid, _date, true ); if ( !price.isValid() ) { MyMoneyPrice newprice( stockid, basecurrencyid, _date, _price, "test" ); file->addPrice(newprice); } ft.commit(); //kdDebug(2) << "successfully added " << id() << endl; }
void TransactionHelper::update(void) { MyMoneyFileTransaction ft; MyMoneyFile::instance()->modifyTransaction(*this); ft.commit(); }
TransactionHelper::~TransactionHelper() { MyMoneyFileTransaction ft; MyMoneyFile::instance()->removeTransaction(*this); ft.commit(); }
void CsvUtil::createAccount(MyMoneyAccount& newAccount, MyMoneyAccount& parentAccount, MyMoneyAccount& brokerageAccount, MyMoneyMoney openingBal) { MyMoneyFile* file = MyMoneyFile::instance(); // make sure we have a currency. If none is assigned, we assume base currency if (newAccount.currencyId().isEmpty()) newAccount.setCurrencyId(file->baseCurrency().id()); MyMoneyFileTransaction ft; try { int pos; // check for ':' in the name and use it as separator for a hierarchy while ((pos = newAccount.name().indexOf(MyMoneyFile::AccountSeperator)) != -1) { QString part = newAccount.name().left(pos); QString remainder = newAccount.name().mid(pos + 1); const MyMoneyAccount& existingAccount = file->subAccountByName(parentAccount, part); if (existingAccount.id().isEmpty()) { newAccount.setName(part); file->addAccount(newAccount, parentAccount); parentAccount = newAccount; } else { parentAccount = existingAccount; } newAccount.setParentAccountId(QString()); // make sure, there's no parent newAccount.clearId(); // and no id set for adding newAccount.removeAccountIds(); // and no sub-account ids newAccount.setName(remainder); } const MyMoneySecurity& sec = file->security(newAccount.currencyId()); // Check the opening balance if (openingBal.isPositive() && newAccount.accountGroup() == MyMoneyAccount::Liability) { QString message = i18n("This account is a liability and if the " "opening balance represents money owed, then it should be negative. " "Negate the amount?\n\n" "Please click Yes to change the opening balance to %1,\n" "Please click No to leave the amount as %2,\n" "Please click Cancel to abort the account creation." , MyMoneyUtils::formatMoney(-openingBal, newAccount, sec) , MyMoneyUtils::formatMoney(openingBal, newAccount, sec)); int ans = KMessageBox::questionYesNoCancel(0, message); if (ans == KMessageBox::Yes) { openingBal = -openingBal; } else if (ans == KMessageBox::Cancel) return; } file->addAccount(newAccount, parentAccount); if (newAccount.accountType() == MyMoneyAccount::Investment && !brokerageAccount.name().isEmpty()) { file->addAccount(brokerageAccount, parentAccount); // set a link from the investment account to the brokerage account file->modifyAccount(newAccount); file->createOpeningBalanceTransaction(brokerageAccount, openingBal); } else file->createOpeningBalanceTransaction(newAccount, openingBal); ft.commit(); } catch (const MyMoneyException &e) { KMessageBox::information(0, i18n("Unable to add account: %1", e.what())); } }