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 KEquityPriceUpdateDlg::addPricePair(const MyMoneySecurityPair& pair, bool dontCheckExistance) { MyMoneyFile* file = MyMoneyFile::instance(); QString symbol = QString("%1 > %2").arg(pair.first, pair.second); QString id = QString("%1 %2").arg(pair.first, pair.second); // Check that the pair does not already exist if (lvEquityList->findItems(id, Qt::MatchExactly, ID_COL).empty()) { const MyMoneyPrice &pr = file->price(pair.first, pair.second); if (pr.source() != "KMyMoney") { bool keep = true; if ((pair.first == file->baseCurrency().id()) || (pair.second == file->baseCurrency().id())) { const QString& foreignCurrency = file->foreignCurrency(pair.first, pair.second); // check that the foreign currency is still in use QList<MyMoneyAccount>::const_iterator it_a; QList<MyMoneyAccount> list; file->accountList(list); for (it_a = list.constBegin(); !dontCheckExistance && it_a != list.constEnd(); ++it_a) { // if it's an account denominated in the foreign currency // keep it if (((*it_a).currencyId() == foreignCurrency) && !(*it_a).isClosed()) break; // if it's an investment traded in the foreign currency // keep it if ((*it_a).isInvest() && !(*it_a).isClosed()) { MyMoneySecurity sec = file->security((*it_a).currencyId()); if (sec.tradingCurrency() == foreignCurrency) break; } } // if it is in use, it_a is not equal to list.end() if (it_a == list.constEnd() && !dontCheckExistance) keep = false; } if (keep) { QTreeWidgetItem* item = new QTreeWidgetItem(); item->setText(SYMBOL_COL, symbol); item->setText(NAME_COL, i18n("%1 units in %2", pair.first, pair.second)); if (pr.isValid()) { item->setText(PRICE_COL, pr.rate(pair.second).formatMoney(file->currency(pair.second).tradingSymbol(), KMyMoneyGlobalSettings::pricePrecision())); item->setText(DATE_COL, pr.date().toString(Qt::ISODate)); } item->setText(ID_COL, id); item->setText(SOURCE_COL, "Yahoo Currency"); // This string value should not be localized lvEquityList->invisibleRootItem()->addChild(item); } } } }
MyMoneyMoney ReportAccount::foreignCurrencyPrice(const QString foreignCurrency, const QDate& date, bool exactDate) const { DEBUG_ENTER(Q_FUNC_INFO); MyMoneyMoney result(1, 1); MyMoneyFile* file = MyMoneyFile::instance(); MyMoneySecurity security = file->security(foreignCurrency); //check whether it is a currency or a commodity. In the latter case case, get the trading currency QString tradingCurrency; if (security.isCurrency()) { tradingCurrency = foreignCurrency; } else { tradingCurrency = security.tradingCurrency(); } //It makes no sense to get the price if both currencies are the same if (currency().id() != tradingCurrency) { const MyMoneyPrice &price = file->price(currency().id(), tradingCurrency, date, exactDate); if (price.isValid()) { result = price.rate(tradingCurrency); DEBUG_OUTPUT(QString("Converting deep %1 to currency %2, price on %3 is %4") .arg(file->currency(currency().id()).name()) .arg(file->currency(foreignCurrency).name()) .arg(date.toString()) .arg(result.toDouble())); } else { DEBUG_OUTPUT(QString("No price to convert deep %1 to currency %2 on %3") .arg(file->currency(currency().id()).name()) .arg(file->currency(foreignCurrency).name()) .arg(date.toString())); } } return result; }
void KEquityPriceUpdateDlg::addInvestment(const MyMoneySecurity& inv) { MyMoneyFile* file = MyMoneyFile::instance(); QString symbol = inv.tradingSymbol(); QString id = inv.id(); // Check that the pair does not already exist if (lvEquityList->findItems(id, Qt::MatchExactly, ID_COL).empty()) { // check that the security is still in use QList<MyMoneyAccount>::const_iterator it_a; QList<MyMoneyAccount> list; file->accountList(list); for (it_a = list.constBegin(); it_a != list.constEnd(); ++it_a) { if ((*it_a).isInvest() && ((*it_a).currencyId() == inv.id()) && !(*it_a).isClosed()) break; } // if it is in use, it_a is not equal to list.end() if (it_a != list.constEnd()) { QTreeWidgetItem* item = new QTreeWidgetItem(); item->setText(SYMBOL_COL, symbol); item->setText(NAME_COL, inv.name()); MyMoneySecurity currency = file->currency(inv.tradingCurrency()); const MyMoneyPrice &pr = file->price(id.toUtf8(), inv.tradingCurrency()); if (pr.isValid()) { item->setText(PRICE_COL, pr.rate(currency.id()).formatMoney(currency.tradingSymbol(), KMyMoneyGlobalSettings::pricePrecision())); item->setText(DATE_COL, pr.date().toString(Qt::ISODate)); } item->setText(ID_COL, id); if (inv.value("kmm-online-quote-system") == "Finance::Quote") item->setText(SOURCE_COL, QString("Finance::Quote %1").arg(inv.value("kmm-online-source"))); else item->setText(SOURCE_COL, inv.value("kmm-online-source")); lvEquityList->invisibleRootItem()->addChild(item); // If this investment is denominated in a foreign currency, ensure that // the appropriate price pair is also on the list if (currency.id() != file->baseCurrency().id()) { addPricePair(MyMoneySecurityPair(currency.id(), file->baseCurrency().id())); } } } }
KNewAccountDlg::KNewAccountDlg(const MyMoneyAccount& account, bool isEditing, bool categoryEditor, QWidget *parent, const char *name, const QString& title) : KNewAccountDlgDecl(parent,name,true), m_account(account), m_bSelectedParentAccount(false), m_categoryEditor(categoryEditor), m_isEditing(isEditing) { QString columnName = ( (categoryEditor) ? i18n("Categories") : i18n("Accounts") ); m_qlistviewParentAccounts->setRootIsDecorated(true); m_qlistviewParentAccounts->setAllColumnsShowFocus(true); m_qlistviewParentAccounts->setSectionHeader(columnName); m_qlistviewParentAccounts->setMultiSelection(false); m_qlistviewParentAccounts->header()->setResizeEnabled(true); m_qlistviewParentAccounts->setColumnWidthMode(0, QListView::Maximum); m_qlistviewParentAccounts->setEnabled(false); // never show the horizontal scroll bar m_qlistviewParentAccounts->setHScrollBarMode(QScrollView::AlwaysOff); m_subAccountLabel->setText(i18n("Is a sub account")); m_qlistviewParentAccounts->header()->setFont(KMyMoneyGlobalSettings::listHeaderFont()); accountNameEdit->setText(account.name()); descriptionEdit->setText(account.description()); typeCombo->setEnabled(true); MyMoneyFile *file = MyMoneyFile::instance(); // load the price mode combo m_priceMode->insertItem(i18n("default price mode", "<default>"), 0); m_priceMode->insertItem(i18n("Price per share"), 1); m_priceMode->insertItem(i18n("Total for all shares"), 2); int priceMode = 0; if(m_account.accountType() == MyMoneyAccount::Investment) { m_priceMode->setEnabled(true); if(!m_account.value("priceMode").isEmpty()) priceMode = m_account.value("priceMode").toInt(); } m_priceMode->setCurrentItem(priceMode); bool haveMinBalance = false; bool haveMaxCredit = false; if (categoryEditor) { // get rid of the tabs that are not used for categories QWidget* tab = m_tab->page(m_tab->indexOf(m_institutionTab)); if(tab) m_tab->removePage(tab); tab = m_tab->page(m_tab->indexOf(m_limitsTab)); if(tab) m_tab->removePage(tab); //m_qlistviewParentAccounts->setEnabled(true); startDateEdit->setEnabled(false); accountNoEdit->setEnabled(false); m_institutionBox->hide(); m_qcheckboxNoVat->hide(); typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::Income)); typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::Expense)); // Hardcoded but acceptable switch (account.accountType()) { case MyMoneyAccount::Income: typeCombo->setCurrentItem(0); break; case MyMoneyAccount::Expense: default: typeCombo->setCurrentItem(1); break; } m_currency->setEnabled(true); if (m_isEditing) { typeCombo->setEnabled(false); m_currency->setDisabled(MyMoneyFile::instance()->isReferenced(m_account)); } m_qcheckboxPreferred->hide(); m_qcheckboxTax->setChecked(account.value("Tax") == "Yes"); loadVatAccounts(); } else { // get rid of the tabs that are not used for accounts QWidget* taxtab = m_tab->page(m_tab->indexOf(m_taxTab)); if (taxtab) { if(m_account.isAssetLiability()) { m_vatCategory->setText(i18n( "VAT account")); m_vatAssignmentFrame->hide(); m_qcheckboxTax->setChecked(account.value("Tax") == "Yes"); } else { m_tab->removePage(taxtab); } } switch(m_account.accountType()) { case MyMoneyAccount::Savings: case MyMoneyAccount::Cash: haveMinBalance = true; break; case MyMoneyAccount::Checkings: haveMinBalance = true; haveMaxCredit = true; break; case MyMoneyAccount::CreditCard: haveMaxCredit = true; break; default: // no limit available, so we might get rid of the tab QWidget* tab = m_tab->page(m_tab->indexOf(m_limitsTab)); if(tab) m_tab->removePage(tab); // don't try to hide the widgets we just wiped // in the next step haveMaxCredit = haveMinBalance = true; break; } if(!haveMaxCredit) { m_maxCreditLabel->setEnabled(false); m_maxCreditLabel->hide(); m_maxCreditEarlyEdit->hide(); m_maxCreditAbsoluteEdit->hide(); } if(!haveMinBalance) { m_minBalanceLabel->setEnabled(false); m_minBalanceLabel->hide(); m_minBalanceEarlyEdit->hide(); m_minBalanceAbsoluteEdit->hide(); } typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::Checkings)); typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::Savings)); typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::Cash)); typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::CreditCard)); typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::Loan)); typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::Investment)); typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::Asset)); typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::Liability)); typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::Stock)); /* typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::CertificateDep)); typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::MoneyMarket)); typeCombo->insertItem(KMyMoneyUtils::accountTypeToString(MyMoneyAccount::Currency)); */ // Hardcoded but acceptable switch (account.accountType()) { default: case MyMoneyAccount::Checkings: typeCombo->setCurrentItem(0); break; case MyMoneyAccount::Savings: typeCombo->setCurrentItem(1); break; case MyMoneyAccount::Cash: typeCombo->setCurrentItem(2); break; case MyMoneyAccount::CreditCard: typeCombo->setCurrentItem(3); break; case MyMoneyAccount::Loan: typeCombo->setCurrentItem(4); break; case MyMoneyAccount::Investment: typeCombo->setCurrentItem(5); break; case MyMoneyAccount::Asset: typeCombo->setCurrentItem(6); break; case MyMoneyAccount::Liability: typeCombo->setCurrentItem(7); break; case MyMoneyAccount::Stock: m_institutionBox->hide(); typeCombo->setCurrentItem(8); break; /* case MyMoneyAccount::CertificateDep: typeCombo->setCurrentItem(5); break; case MyMoneyAccount::MoneyMarket: typeCombo->setCurrentItem(7); break; case MyMoneyAccount::Currency: typeCombo->setCurrentItem(8); break; */ } if(!m_account.openingDate().isValid()) m_account.setOpeningDate(QDate::currentDate()); startDateEdit->setDate(m_account.openingDate()); accountNoEdit->setText(account.number()); m_qcheckboxPreferred->setChecked(account.value("PreferredAccount") == "Yes"); m_qcheckboxNoVat->setChecked(account.value("NoVat") == "Yes"); loadKVP("iban", ibanEdit); loadKVP("minBalanceAbsolute", m_minBalanceAbsoluteEdit); loadKVP("minBalanceEarly", m_minBalanceEarlyEdit); loadKVP("maxCreditAbsolute", m_maxCreditAbsoluteEdit); loadKVP("maxCreditEarly", m_maxCreditEarlyEdit); // reverse the sign for display purposes if(!m_maxCreditAbsoluteEdit->lineedit()->text().isEmpty()) m_maxCreditAbsoluteEdit->setValue(m_maxCreditAbsoluteEdit->value()*MyMoneyMoney(-1,1)); if(!m_maxCreditEarlyEdit->lineedit()->text().isEmpty()) m_maxCreditEarlyEdit->setValue(m_maxCreditEarlyEdit->value()*MyMoneyMoney(-1,1)); loadKVP("lastNumberUsed", m_lastCheckNumberUsed); // we do not allow to change the account type once an account // was created. Same applies to currency if it is referenced. if (m_isEditing) { typeCombo->setEnabled(false); m_currency->setDisabled(MyMoneyFile::instance()->isReferenced(m_account)); } if(m_account.isInvest()) { typeCombo->setEnabled(false); m_qcheckboxPreferred->hide(); m_currencyText->hide(); m_currency->hide(); } else { // use the old field and override a possible new value if(!MyMoneyMoney(account.value("minimumBalance")).isZero()) { m_minBalanceAbsoluteEdit->setValue(MyMoneyMoney(account.value("minimumBalance"))); } } // m_qcheckboxTax->hide(); TODO should only be visible for VAT category/account } m_currency->setSecurity(file->currency(account.currencyId())); // Load the institutions // then the accounts QString institutionName; try { if (m_isEditing && !account.institutionId().isEmpty()) institutionName = file->institution(account.institutionId()).name(); else institutionName = QString(); } catch (MyMoneyException *e) { qDebug("exception in init for account dialog: %s", e->what().latin1()); delete e; } initParentWidget(account.parentAccountId(), account.id()); if(m_account.isInvest()) m_qlistviewParentAccounts->setEnabled(false); if (!categoryEditor) slotLoadInstitutions(institutionName); accountNameEdit->setFocus(); if (title) setCaption(title); // load button icons KIconLoader* il = KGlobal::iconLoader(); cancelButton->setGuiItem(KStdGuiItem::cancel()); createButton->setGuiItem(KStdGuiItem::ok()); connect(cancelButton, SIGNAL(clicked()), SLOT(reject())); connect(createButton, SIGNAL(clicked()), this, SLOT(okClicked())); connect(m_qlistviewParentAccounts, SIGNAL(selectionChanged(QListViewItem*)), this, SLOT(slotSelectionChanged(QListViewItem*))); connect(m_qbuttonNew, SIGNAL(clicked()), this, SLOT(slotNewClicked())); connect(typeCombo, SIGNAL(activated(const QString&)), this, SLOT(slotAccountTypeChanged(const QString&))); connect(accountNameEdit, SIGNAL(textChanged(const QString&)), this, SLOT(slotCheckFinished())); connect(m_vatCategory, SIGNAL(toggled(bool)), this, SLOT(slotVatChanged(bool))); connect(m_vatAssignment, SIGNAL(toggled(bool)), this, SLOT(slotVatAssignmentChanged(bool))); connect(m_vatCategory, SIGNAL(toggled(bool)), this, SLOT(slotCheckFinished())); connect(m_vatAssignment, SIGNAL(toggled(bool)), this, SLOT(slotCheckFinished())); connect(m_vatRate, SIGNAL(textChanged(const QString&)), this, SLOT(slotCheckFinished())); connect(m_vatAccount, SIGNAL(stateChanged()), this, SLOT(slotCheckFinished())); connect(m_minBalanceEarlyEdit, SIGNAL(valueChanged(const QString&)), this, SLOT(slotAdjustMinBalanceAbsoluteEdit(const QString&))); connect(m_minBalanceAbsoluteEdit, SIGNAL(valueChanged(const QString&)), this, SLOT(slotAdjustMinBalanceEarlyEdit(const QString&))); connect(m_maxCreditEarlyEdit, SIGNAL(valueChanged(const QString&)), this, SLOT(slotAdjustMaxCreditAbsoluteEdit(const QString&))); connect(m_maxCreditAbsoluteEdit, SIGNAL(valueChanged(const QString&)), this, SLOT(slotAdjustMaxCreditEarlyEdit(const QString&))); connect(m_qcomboboxInstitutions, SIGNAL(activated(const QString&)), this, SLOT(slotLoadInstitutions(const QString&))); m_vatCategory->setChecked(false); m_vatAssignment->setChecked(false); // make sure our account does not have an id and no parent assigned // and certainly no children in case we create a new account if(!m_isEditing) { m_account.clearId(); m_account.setParentAccountId(QString()); QStringList::ConstIterator it; while((it = m_account.accountList().begin()) != m_account.accountList().end()) m_account.removeAccountId(*it); if(m_parentItem == 0) { // force loading of initial parent m_account.setAccountType(MyMoneyAccount::UnknownAccountType); MyMoneyAccount::_accountTypeE type = account.accountType(); if(type == MyMoneyAccount::UnknownAccountType) type = MyMoneyAccount::Checkings; slotAccountTypeChanged(KMyMoneyUtils::accountTypeToString(type)); } } else { if(!m_account.value("VatRate").isEmpty()) { m_vatCategory->setChecked(true); m_vatRate->setValue(MyMoneyMoney(m_account.value("VatRate"))*MyMoneyMoney(100,1)); } else { if(!m_account.value("VatAccount").isEmpty()) { QString accId = m_account.value("VatAccount").latin1(); try { // make sure account exists MyMoneyFile::instance()->account(accId); m_vatAssignment->setChecked(true); m_vatAccount->setSelected(accId); m_grossAmount->setChecked(true); if(m_account.value("VatAmount") == "Net") m_netAmount->setChecked(true); } catch(MyMoneyException *e) { delete e; } } } } slotVatChanged(m_vatCategory->isChecked()); slotVatAssignmentChanged(m_vatAssignment->isChecked()); slotCheckFinished(); kMandatoryFieldGroup* requiredFields = new kMandatoryFieldGroup (this); requiredFields->setOkButton(createButton); // button to be enabled when all fields present requiredFields->add(accountNameEdit); // using a timeout is the only way, I got the 'ensureItemVisible' // working when creating the dialog. I assume, this // has something to do with the delayed update of the display somehow. QTimer::singleShot(50, this, SLOT(timerDone())); }