diff --git a/kmymoney/converter/mymoneystatementreader.cpp b/kmymoney/converter/mymoneystatementreader.cpp --- a/kmymoney/converter/mymoneystatementreader.cpp +++ b/kmymoney/converter/mymoneystatementreader.cpp @@ -598,7 +598,6 @@ if (security.id().isEmpty()) { security.setName(sec_in.m_strName); security.setTradingSymbol(sec_in.m_strSymbol); - security.setSmallestAccountFraction(1000); security.setTradingCurrency(file->baseCurrency().id()); security.setValue("kmm-security-id", sec_in.m_strId); security.setValue("kmm-online-source", "Yahoo"); @@ -784,7 +783,7 @@ return; } MyMoneyMoney total = -statementTransactionUnderImport.m_amount - statementTransactionUnderImport.m_fees; - s1.setPrice((total / statementTransactionUnderImport.m_shares).convert(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision()))); + s1.setPrice((total / statementTransactionUnderImport.m_shares).convertPrecision(file->security(thisaccount.currencyId()).pricePrecision())); } s2.setMemo(statementTransactionUnderImport.m_strMemo); @@ -859,7 +858,7 @@ s1.setPrice(statementTransactionUnderImport.m_price.abs()); } else if (!statementTransactionUnderImport.m_shares.isZero()) { MyMoneyMoney total = statementTransactionUnderImport.m_amount + statementTransactionUnderImport.m_fees.abs(); - s1.setPrice((total / statementTransactionUnderImport.m_shares).abs().convert(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision()))); + s1.setPrice((total / statementTransactionUnderImport.m_shares).abs().convertPrecision(file->security(thisaccount.currencyId()).pricePrecision())); } if (statementTransactionUnderImport.m_eAction == MyMoneyStatement::Transaction::eaBuy) s1.setShares(statementTransactionUnderImport.m_shares.abs()); diff --git a/kmymoney/converter/tests/converter-test.cpp b/kmymoney/converter/tests/converter-test.cpp --- a/kmymoney/converter/tests/converter-test.cpp +++ b/kmymoney/converter/tests/converter-test.cpp @@ -46,7 +46,7 @@ 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("JPY", "Japanese Yen", QChar(0x00A5), 1)); file->addCurrency(MyMoneySecurity("GBP", "British Pound", "#")); file->setBaseCurrency(file->currency("USD")); diff --git a/kmymoney/dialogs/CMakeLists.txt b/kmymoney/dialogs/CMakeLists.txt --- a/kmymoney/dialogs/CMakeLists.txt +++ b/kmymoney/dialogs/CMakeLists.txt @@ -16,6 +16,7 @@ kcurrencycalculator.cpp kcurrencyeditdlg.cpp kavailablecurrencydlg.cpp + kcurrencyeditordlg.cpp keditscheduledlg.cpp kenterscheduledlg.cpp kequitypriceupdatedlg.cpp @@ -60,7 +61,7 @@ kaccountselectdlgdecl.ui kbackupdlgdecl.ui kcategoryreassigndlgdecl.ui kchooseimportexportdlgdecl.ui kconfirmmanualenterdlgdecl.ui - kcurrencycalculatordecl.ui kcurrencyeditdlg.ui kavailablecurrencydlg.ui + kcurrencycalculatordecl.ui kcurrencyeditdlg.ui kavailablecurrencydlg.ui kcurrencyeditordlg.ui keditscheduledlgdecl.ui kenterscheduledlgdecl.ui kequitypriceupdatedlgdecl.ui kexportdlgdecl.ui diff --git a/kmymoney/dialogs/investtransactioneditor.cpp b/kmymoney/dialogs/investtransactioneditor.cpp --- a/kmymoney/dialogs/investtransactioneditor.cpp +++ b/kmymoney/dialogs/investtransactioneditor.cpp @@ -229,7 +229,6 @@ value = new kMyMoneyEdit; value->setPlaceholderText(i18n("Price")); value->setResetButtonVisible(false); - value->setPrecision(KMyMoneyGlobalSettings::pricePrecision()); m_editWidgets["price"] = value; connect(value, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateButtonState())); connect(value, SIGNAL(valueChanged(QString)), this, SLOT(slotUpdateTotalAmount())); @@ -1107,14 +1106,15 @@ price = priceEdit->value().abs(); if (priceMode() == PricePerTransaction) { + priceEdit->setPrecision(m_currency.pricePrecision()); label->setText(i18n("Transaction amount")); if (!sharesEdit->value().isZero()) priceEdit->setValue(sharesEdit->value().abs() * price); } else if (priceMode() == PricePerShare) { + priceEdit->setPrecision(m_security.pricePrecision()); label->setText(i18n("Price/Share")); priceEdit->setValue(price); - } else priceEdit->setValue(price); } diff --git a/kmymoney/dialogs/kcurrencycalculator.cpp b/kmymoney/dialogs/kcurrencycalculator.cpp --- a/kmymoney/dialogs/kcurrencycalculator.cpp +++ b/kmymoney/dialogs/kcurrencycalculator.cpp @@ -157,7 +157,7 @@ boldFont.setBold(true); m_toCurrencyText->setFont(boldFont); - m_fromAmount->setText(m_value.formatMoney("", MyMoneyMoney::denomToPrec(m_fromCurrency.smallestAccountFraction()))); + m_fromAmount->setText(m_value.formatMoney(QString(), MyMoneyMoney::denomToPrec(m_fromCurrency.smallestAccountFraction()))); m_dateText->setText(QLocale().toString(date)); @@ -172,10 +172,10 @@ } // fill in initial values - m_toAmount->loadText(m_result.formatMoney("", MyMoneyMoney::denomToPrec(m_resultFraction))); + m_toAmount->loadText(m_result.formatMoney(QString(), MyMoneyMoney::denomToPrec(m_resultFraction))); m_toAmount->setPrecision(MyMoneyMoney::denomToPrec(m_resultFraction)); - m_conversionRate->setPrecision(KMyMoneyGlobalSettings::pricePrecision()); + m_conversionRate->setPrecision(m_fromCurrency.pricePrecision()); connect(m_amountButton, SIGNAL(clicked()), this, SLOT(slotSetToAmount())); connect(m_rateButton, SIGNAL(clicked()), this, SLOT(slotSetExchangeRate())); @@ -236,9 +236,9 @@ if (!result.isZero()) { price = result / m_value; - m_conversionRate->loadText(price.formatMoney("", KMyMoneyGlobalSettings::pricePrecision())); + m_conversionRate->loadText(price.formatMoney(QString(), m_fromCurrency.pricePrecision())); m_result = (m_value * price).convert(m_resultFraction); - m_toAmount->loadText(m_result.formatMoney("", MyMoneyMoney::denomToPrec(m_resultFraction))); + m_toAmount->loadText(m_result.formatMoney(m_resultFraction)); } updateExample(price); } @@ -254,9 +254,9 @@ } if (!price.isZero()) { - m_conversionRate->loadText(price.formatMoney("", KMyMoneyGlobalSettings::pricePrecision())); + m_conversionRate->loadText(price.formatMoney(QString(), m_fromCurrency.pricePrecision())); m_result = (m_value * price).convert(m_resultFraction); - m_toAmount->loadText(m_result.formatMoney("", MyMoneyMoney::denomToPrec(m_resultFraction))); + m_toAmount->loadText(m_result.formatMoney(QString(), MyMoneyMoney::denomToPrec(m_resultFraction))); } updateExample(price); } @@ -274,12 +274,12 @@ } } else { msg = QString("1 %1 = %2 %3").arg(m_fromCurrency.tradingSymbol()) - .arg(price.formatMoney("", KMyMoneyGlobalSettings::pricePrecision())) + .arg(price.formatMoney(QString(), m_fromCurrency.pricePrecision())) .arg(m_toCurrency.tradingSymbol()); if (m_fromCurrency.isCurrency()) { msg += QString("\n"); msg += QString("1 %1 = %2 %3").arg(m_toCurrency.tradingSymbol()) - .arg((MyMoneyMoney::ONE / price).formatMoney("", KMyMoneyGlobalSettings::pricePrecision())) + .arg((MyMoneyMoney::ONE / price).formatMoney(QString(), m_toCurrency.pricePrecision())) .arg(m_fromCurrency.tradingSymbol()); } } diff --git a/kmymoney/dialogs/kcurrencyeditdlg.h b/kmymoney/dialogs/kcurrencyeditdlg.h --- a/kmymoney/dialogs/kcurrencyeditdlg.h +++ b/kmymoney/dialogs/kcurrencyeditdlg.h @@ -39,6 +39,7 @@ #include "ui_kcurrencyeditdlg.h" #include "ui_kavailablecurrencydlg.h" +#include "ui_kcurrencyeditordlg.h" #include "mymoneysecurity.h" namespace Ui @@ -48,6 +49,7 @@ class QTreeWidgetItem; class KAvailableCurrencyDlg; +class KCurrencyEditorDlg; /** * @author Thomas Baumgart @@ -81,6 +83,7 @@ void slotAddCurrency(); void slotRemoveCurrency(); void slotRemoveUnusedCurrency(); + void slotEditCurrency(); signals: void selectObject(const MyMoneySecurity& currency); @@ -91,6 +94,7 @@ private: typedef enum:int { RemoveSelected, RemoveUnused} removalModeE; KAvailableCurrencyDlg* m_availableCurrencyDlg; + KCurrencyEditorDlg* m_currencyEditorDlg; MyMoneySecurity m_currency; /** * Search widget for the list diff --git a/kmymoney/dialogs/kcurrencyeditdlg.cpp b/kmymoney/dialogs/kcurrencyeditdlg.cpp --- a/kmymoney/dialogs/kcurrencyeditdlg.cpp +++ b/kmymoney/dialogs/kcurrencyeditdlg.cpp @@ -51,6 +51,7 @@ #include #include #include +#include #include // this delegate is needed to disable editing the currency id (column 1) @@ -86,6 +87,8 @@ ui->m_currencyList->setItemDelegate(new KCurrencyEditDelegate(ui->m_currencyList)); ui->m_closeButton->setIcon(QIcon::fromTheme(QStringLiteral("dialog-close"), QIcon::fromTheme(QStringLiteral("stop")))); + ui->m_editCurrencyButton->setIcon(QIcon::fromTheme(QStringLiteral("document-edit"), + QIcon::fromTheme(QStringLiteral("text-editor")))); ui->m_selectBaseCurrencyButton->setIcon(QIcon::fromTheme(QStringLiteral("kmymoney"))); connect(ui->m_currencyList, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotOpenContextMenu(QPoint))); @@ -96,6 +99,7 @@ connect(ui->m_selectBaseCurrencyButton, SIGNAL(clicked()), this, SLOT(slotSelectBaseCurrency())); connect(ui->m_addCurrencyButton, SIGNAL(clicked()), this, SLOT(slotAddCurrency())); connect(ui->m_removeCurrencyButton, SIGNAL(clicked()), this, SLOT(slotRemoveCurrency())); + connect(ui->m_editCurrencyButton, SIGNAL(clicked()), this, SLOT(slotEditCurrency())); connect(ui->m_removeUnusedCurrencyButton, SIGNAL(clicked()), this, SLOT(slotRemoveUnusedCurrency())); QTimer::singleShot(10, this, SLOT(timerDone())); @@ -255,6 +259,7 @@ const int count = ui->m_currencyList->selectedItems().count(); ui->m_selectBaseCurrencyButton->setDisabled(rc1 || count != 1); + ui->m_editCurrencyButton->setDisabled(count != 1); ui->m_removeCurrencyButton->setDisabled((rc1 || rc2) && count <= 1); emit selectObject(m_currency); } @@ -354,3 +359,21 @@ { removeCurrency(RemoveUnused); } + +void KCurrencyEditDlg::slotEditCurrency() +{ + MyMoneySecurity currency = ui->m_currencyList->currentItem()->data(0, Qt::UserRole).value(); + m_currencyEditorDlg = new KCurrencyEditorDlg(currency); // create new dialog for editing currency + if (m_currencyEditorDlg->exec() != QDialog::Rejected) { + MyMoneyFile* file = MyMoneyFile::instance(); + MyMoneyFileTransaction ft; + currency.setPricePrecision(m_currencyEditorDlg->ui->m_pricePrecision->value()); + try { + file->modifyCurrency(currency); + ft.commit(); + } catch (const MyMoneyException &e) { + qDebug("%s", qPrintable(e.what())); + } + } + delete m_currencyEditorDlg; +} diff --git a/kmymoney/dialogs/kcurrencyeditdlg.ui b/kmymoney/dialogs/kcurrencyeditdlg.ui --- a/kmymoney/dialogs/kcurrencyeditdlg.ui +++ b/kmymoney/dialogs/kcurrencyeditdlg.ui @@ -56,50 +56,57 @@ - - + + - Close + Remove + + + + .. - - + + - Remove unused currencies + Add - + .. - - + + - Remove + Edit + + + + + + + Remove unused currencies - + .. - - + + - Select as base currency + Close - - + + - Add - - - - .. + Select as base currency diff --git a/kmymoney/dialogs/kcurrencyeditordlg.h b/kmymoney/dialogs/kcurrencyeditordlg.h new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/kcurrencyeditordlg.h @@ -0,0 +1,54 @@ +/*************************************************************************** + kcurrencyeditordlg.h - description + ------------------- + begin : Sat Apr 09 2017 + copyright : (C) 2017 Łukasz Wojniłowicz + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KCURRENCYEDITORDLG_H +#define KCURRENCYEDITORDLG_H + +// ---------------------------------------------------------------------------- +// QT Includes + +// ---------------------------------------------------------------------------- +// KDE Includes + +#include + +// ---------------------------------------------------------------------------- +// Project Includes + +#include + +namespace Ui +{ +class KCurrencyEditorDlg; +} + +class QTreeWidgetItem; + +class KCurrencyEditorDlg : public QDialog +{ + Q_OBJECT +public: + KCurrencyEditorDlg(MyMoneySecurity ¤cy, QWidget *parent = 0); + ~KCurrencyEditorDlg(); + + Ui::KCurrencyEditorDlg* ui; + +protected slots: + void loadCurrency(MyMoneySecurity& currency); + +}; + +#endif diff --git a/kmymoney/dialogs/kcurrencyeditordlg.cpp b/kmymoney/dialogs/kcurrencyeditordlg.cpp new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/kcurrencyeditordlg.cpp @@ -0,0 +1,55 @@ +/*************************************************************************** + kcurrencyeditordlg.cpp - description + ------------------- + begin : Sat Apr 09 2017 + copyright : (C) 2017 Łukasz Wojniłowicz + + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kcurrencyeditordlg.h" + +// ---------------------------------------------------------------------------- +// QT Includes + +// ---------------------------------------------------------------------------- +// KDE Includes + +// ---------------------------------------------------------------------------- +// Project Includes + +#include "ui_kcurrencyeditordlg.h" + +KCurrencyEditorDlg::KCurrencyEditorDlg(MyMoneySecurity& currency, QWidget *parent) : ui(new Ui::KCurrencyEditorDlg) +{ + Q_UNUSED(parent); + ui->setupUi(this); + loadCurrency(currency); +} + +KCurrencyEditorDlg::~KCurrencyEditorDlg() +{ + delete ui; +} + +void KCurrencyEditorDlg::loadCurrency(MyMoneySecurity& currency) +{ + ui->leName->setText(currency.name()); + ui->leSymbol->setText(currency.tradingSymbol()); + int precision = MyMoneyMoney::denomToPrec(currency.smallestCashFraction()); + MyMoneyMoney smallestFraction = MyMoneyMoney::ONE / MyMoneyMoney(currency.smallestCashFraction()); + ui->leCashFraction->setText(smallestFraction.formatMoney(currency.tradingSymbol(), precision)); + precision = MyMoneyMoney::denomToPrec(currency.smallestAccountFraction()); + smallestFraction = MyMoneyMoney::ONE / MyMoneyMoney(currency.smallestAccountFraction()); + ui->leAccountFraction->setText(smallestFraction.formatMoney(currency.tradingSymbol(), precision)); + ui->leRoundingMethod->setText(currency.roundingMethodToString(currency.roundingMethod())); + ui->m_pricePrecision->setValue(currency.pricePrecision()); +} diff --git a/kmymoney/dialogs/kcurrencyeditordlg.ui b/kmymoney/dialogs/kcurrencyeditordlg.ui new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/kcurrencyeditordlg.ui @@ -0,0 +1,156 @@ + + + KCurrencyEditorDlg + + + + 0 + 0 + 226 + 206 + + + + Currency editor + + + true + + + + + + + + Name: + + + + + + + Symbol: + + + + + + + Smallest cash unit: + + + + + + + Smallest money unit: + + + + + + + Remainder: + + + + + + + Price precision: + + + + + + + 2 + + + 10 + + + + + + + TextLabel + + + + + + + TextLabel + + + + + + + TextLabel + + + + + + + TextLabel + + + + + + + TextLabel + + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + buttonBox + accepted() + KCurrencyEditorDlg + accept() + + + 199 + 296 + + + 199 + 159 + + + + + buttonBox + rejected() + KCurrencyEditorDlg + reject() + + + 199 + 296 + + + 199 + 159 + + + + + diff --git a/kmymoney/dialogs/kequitypriceupdatedlg.cpp b/kmymoney/dialogs/kequitypriceupdatedlg.cpp --- a/kmymoney/dialogs/kequitypriceupdatedlg.cpp +++ b/kmymoney/dialogs/kequitypriceupdatedlg.cpp @@ -217,7 +217,8 @@ 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())); + MyMoneySecurity currency = file->currency(pair.second); + item->setText(PRICE_COL, pr.rate(pair.second).formatMoney(currency.tradingSymbol(), currency.pricePrecision())); item->setText(DATE_COL, pr.date().toString(Qt::ISODate)); } item->setText(ID_COL, id); @@ -254,7 +255,7 @@ 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(PRICE_COL, pr.rate(currency.id()).formatMoney(currency.tradingSymbol(), currency.pricePrecision())); item->setText(DATE_COL, pr.date().toString(Qt::ISODate)); } item->setText(ID_COL, id); @@ -492,7 +493,7 @@ if (date > QDate::currentDate()) date = QDate::currentDate(); - MyMoneyMoney price = MyMoneyMoney(_price, MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision())); + MyMoneyMoney price = MyMoneyMoney::ONE; QString id = _id.toUtf8(); MyMoneySecurity sec; if (_id.contains(" ") == 0) { @@ -518,7 +519,9 @@ } } } - item->setText(PRICE_COL, price.formatMoney(sec.tradingSymbol(), KMyMoneyGlobalSettings::pricePrecision())); + price *= MyMoneyMoney(_price, MyMoneyMoney::precToDenom(sec.pricePrecision())); + + item->setText(PRICE_COL, price.formatMoney(sec.tradingSymbol(), sec.pricePrecision())); item->setText(DATE_COL, date.toString(Qt::ISODate)); logStatusMessage(i18n("Price for %1 updated (id %2)", _symbol, _id)); // make sure to make OK button available diff --git a/kmymoney/dialogs/kmymoneypricedlg.cpp b/kmymoney/dialogs/kmymoneypricedlg.cpp --- a/kmymoney/dialogs/kmymoneypricedlg.cpp +++ b/kmymoney/dialogs/kmymoneypricedlg.cpp @@ -191,7 +191,7 @@ priceTreeItem->setText(KPriceTreeItem::ePriceCurrency, to.id()); priceTreeItem->setText(KPriceTreeItem::ePriceDate, QLocale().toString(price.date(), QLocale::ShortFormat)); priceTreeItem->setData(KPriceTreeItem::ePriceDate, KPriceTreeItem::OrderRole, QVariant(price.date())); - priceTreeItem->setText(KPriceTreeItem::ePricePrice, price.rate(priceBase).formatMoney("", KMyMoneyGlobalSettings::pricePrecision())); + priceTreeItem->setText(KPriceTreeItem::ePricePrice, price.rate(priceBase).formatMoney("", from.pricePrecision())); priceTreeItem->setTextAlignment(KPriceTreeItem::ePricePrice, Qt::AlignRight | Qt::AlignVCenter); priceTreeItem->setData(KPriceTreeItem::ePricePrice, KPriceTreeItem::OrderRole, QVariant::fromValue(price.rate(priceBase))); priceTreeItem->setText(KPriceTreeItem::ePriceSource, price.source()); @@ -268,7 +268,7 @@ if (item) { MyMoneySecurity from(MyMoneyFile::instance()->security(item->data(0, Qt::UserRole).value().from())); MyMoneySecurity to(MyMoneyFile::instance()->security(item->data(0, Qt::UserRole).value().to())); - signed64 fract = MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision()); + signed64 fract = MyMoneyMoney::precToDenom(from.pricePrecision()); QPointer calc = new KCurrencyCalculator(from, diff --git a/kmymoney/dialogs/settings/ksettingsgeneraldecl.ui b/kmymoney/dialogs/settings/ksettingsgeneraldecl.ui --- a/kmymoney/dialogs/settings/ksettingsgeneraldecl.ui +++ b/kmymoney/dialogs/settings/ksettingsgeneraldecl.ui @@ -25,58 +25,6 @@ - - - Precision settings - - - - - - Price precision - - - false - - - - - - - 10 - - - - - - - digits - - - false - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 391 - 21 - - - - - - - - Autosave options @@ -212,7 +160,7 @@ - 366 + 366 @@ -350,7 +298,7 @@ - Start with homepage + Start with ho&mepage true @@ -591,11 +539,6 @@ - QSpinBox - QSpinBox -
knuminput.h
-
- KLineEdit QLineEdit
klineedit.h
@@ -606,12 +549,6 @@
kcombobox.h
- QTabWidget - QTabWidget -
ktabwidget.h
- 1 -
- kMyMoneyDateInput QFrame
kmymoneydateinput.h
diff --git a/kmymoney/kmymoney.cpp b/kmymoney/kmymoney.cpp --- a/kmymoney/kmymoney.cpp +++ b/kmymoney/kmymoney.cpp @@ -2550,7 +2550,6 @@ d->m_myMoneyView->updateViewType(); // update the sql storage module settings - MyMoneyStorageSql::setPrecision(KMyMoneyGlobalSettings::pricePrecision()); MyMoneyStorageSql::setStartDate(KMyMoneyGlobalSettings::startDate().date()); // update the report module settings @@ -3330,10 +3329,9 @@ MyMoneySecurity security = MyMoneyFile::instance()->security(d->m_selectedInvestment.currencyId()); MyMoneySecurity currency = MyMoneyFile::instance()->security(security.tradingCurrency()); const MyMoneyPrice &price = MyMoneyFile::instance()->price(security.id(), currency.id()); - signed64 fract = MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision()); QPointer calc = - new KCurrencyCalculator(security, currency, MyMoneyMoney::ONE, price.rate(currency.id()), price.date(), fract); + new KCurrencyCalculator(security, currency, MyMoneyMoney::ONE, price.rate(currency.id()), price.date(), MyMoneyMoney::precToDenom(security.pricePrecision())); calc->setupPriceEditor(); // The dialog takes care of adding the price if necessary diff --git a/kmymoney/kmymoney.kcfg b/kmymoney/kmymoney.kcfg --- a/kmymoney/kmymoney.kcfg +++ b/kmymoney/kmymoney.kcfg @@ -88,12 +88,6 @@ false - - - 4 - 4 - 10 - true diff --git a/kmymoney/models/accountsmodel.cpp b/kmymoney/models/accountsmodel.cpp --- a/kmymoney/models/accountsmodel.cpp +++ b/kmymoney/models/accountsmodel.cpp @@ -287,7 +287,7 @@ QList::const_iterator it_p; QString security = account.currencyId(); for (it_p = prices.constBegin(); it_p != prices.constEnd(); ++it_p) { - value = (value * (MyMoneyMoney::ONE / (*it_p).rate(security))).convert(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision())); + value = (value * (MyMoneyMoney::ONE / (*it_p).rate(security))).convertPrecision(m_file->security(security).pricePrecision()); if ((*it_p).from() == security) security = (*it_p).to(); else diff --git a/kmymoney/mymoney/mymoneyfile.cpp b/kmymoney/mymoney/mymoneyfile.cpp --- a/kmymoney/mymoney/mymoneyfile.cpp +++ b/kmymoney/mymoney/mymoneyfile.cpp @@ -2737,7 +2737,7 @@ currencyList.append(MyMoneySecurity("AUD", i18n("Australian Dollar"), "$")); currencyList.append(MyMoneySecurity("AZN", i18n("Azerbaijani Manat"), "m.")); currencyList.append(MyMoneySecurity("BSD", i18n("Bahamian Dollar"), "$")); - currencyList.append(MyMoneySecurity("BHD", i18n("Bahraini Dinar"), "BHD", 1000, 1000)); + currencyList.append(MyMoneySecurity("BHD", i18n("Bahraini Dinar"), "BHD", 1000)); currencyList.append(MyMoneySecurity("BDT", i18n("Bangladeshi Taka"))); currencyList.append(MyMoneySecurity("BBD", i18n("Barbados Dollar"), "$")); currencyList.append(MyMoneySecurity("BTC", i18n("Bitcoin"), "BTC")); @@ -2755,7 +2755,7 @@ currencyList.append(MyMoneySecurity("BIF", i18n("Burundi Franc"))); currencyList.append(MyMoneySecurity("XAF", i18n("CFA Franc BEAC"))); currencyList.append(MyMoneySecurity("XOF", i18n("CFA Franc BCEAO"))); - currencyList.append(MyMoneySecurity("XPF", i18n("CFP Franc Pacifique"), "F", 1, 1, 100)); + currencyList.append(MyMoneySecurity("XPF", i18n("CFP Franc Pacifique"), "F", 1, 100)); currencyList.append(MyMoneySecurity("KHR", i18n("Cambodia Riel"))); currencyList.append(MyMoneySecurity("CAD", i18n("Canadian Dollar"), "$")); currencyList.append(MyMoneySecurity("CVE", i18n("Cape Verde Escudo"))); @@ -2790,34 +2790,34 @@ currencyList.append(MyMoneySecurity("HTG", i18n("Haitian Gourde"))); currencyList.append(MyMoneySecurity("HNL", i18n("Honduran Lempira"))); currencyList.append(MyMoneySecurity("HKD", i18n("Hong Kong Dollar"), "$")); - currencyList.append(MyMoneySecurity("HUF", i18n("Hungarian Forint"), "HUF", 1, 1, 100)); + currencyList.append(MyMoneySecurity("HUF", i18n("Hungarian Forint"), "HUF", 1, 100)); currencyList.append(MyMoneySecurity("ISK", i18n("Iceland Krona"))); currencyList.append(MyMoneySecurity("INR", i18n("Indian Rupee"), QChar(0x20A8))); - currencyList.append(MyMoneySecurity("IDR", i18n("Indonesian Rupiah"), "IDR", 100, 1)); - currencyList.append(MyMoneySecurity("IRR", i18n("Iranian Rial"), "IRR", 1, 1)); - currencyList.append(MyMoneySecurity("IQD", i18n("Iraqi Dinar"), "IQD", 1000, 1000)); + currencyList.append(MyMoneySecurity("IDR", i18n("Indonesian Rupiah"), "IDR", 1)); + currencyList.append(MyMoneySecurity("IRR", i18n("Iranian Rial"), "IRR", 1)); + currencyList.append(MyMoneySecurity("IQD", i18n("Iraqi Dinar"), "IQD", 1000)); currencyList.append(MyMoneySecurity("ILS", i18n("Israeli New Shekel"), QChar(0x20AA))); currencyList.append(MyMoneySecurity("JMD", i18n("Jamaican Dollar"), "$")); - currencyList.append(MyMoneySecurity("JPY", i18n("Japanese Yen"), QChar(0x00A5), 100, 1)); - currencyList.append(MyMoneySecurity("JOD", i18n("Jordanian Dinar"), "JOD", 1000, 1000)); + currencyList.append(MyMoneySecurity("JPY", i18n("Japanese Yen"), QChar(0x00A5), 1)); + currencyList.append(MyMoneySecurity("JOD", i18n("Jordanian Dinar"), "JOD", 1000)); currencyList.append(MyMoneySecurity("KZT", i18n("Kazakhstan Tenge"))); currencyList.append(MyMoneySecurity("KES", i18n("Kenyan Shilling"))); - currencyList.append(MyMoneySecurity("KWD", i18n("Kuwaiti Dinar"), "KWD", 1000, 1000)); + currencyList.append(MyMoneySecurity("KWD", i18n("Kuwaiti Dinar"), "KWD", 1000)); currencyList.append(MyMoneySecurity("KGS", i18n("Kyrgyzstan Som"))); currencyList.append(MyMoneySecurity("LAK", i18n("Laos Kip"), QChar(0x20AD))); currencyList.append(MyMoneySecurity("LVL", i18n("Latvian Lats"))); currencyList.append(MyMoneySecurity("LBP", i18n("Lebanese Pound"), QChar(0x00A3))); currencyList.append(MyMoneySecurity("LSL", i18n("Lesotho Loti"))); currencyList.append(MyMoneySecurity("LRD", i18n("Liberian Dollar"), "$")); - currencyList.append(MyMoneySecurity("LYD", i18n("Libyan Dinar"), "LYD", 1000, 1000)); + currencyList.append(MyMoneySecurity("LYD", i18n("Libyan Dinar"), "LYD", 1000)); currencyList.append(MyMoneySecurity("MOP", i18n("Macau Pataca"))); currencyList.append(MyMoneySecurity("MKD", i18n("Macedonian Denar"))); - currencyList.append(MyMoneySecurity("MGF", i18n("Malagasy Franc"), "MGF", 500, 500)); + currencyList.append(MyMoneySecurity("MGF", i18n("Malagasy Franc"), "MGF", 500)); currencyList.append(MyMoneySecurity("MWK", i18n("Malawi Kwacha"))); currencyList.append(MyMoneySecurity("MYR", i18n("Malaysian Ringgit"))); currencyList.append(MyMoneySecurity("MVR", i18n("Maldive Rufiyaa"))); currencyList.append(MyMoneySecurity("MLF", i18n("Mali Republic Franc"))); - currencyList.append(MyMoneySecurity("MRO", i18n("Mauritanian Ouguiya"), "MRO", 5, 5)); + currencyList.append(MyMoneySecurity("MRO", i18n("Mauritanian Ouguiya"), "MRO", 5)); currencyList.append(MyMoneySecurity("MUR", i18n("Mauritius Rupee"))); currencyList.append(MyMoneySecurity("MXN", i18n("Mexican Peso"), "$")); currencyList.append(MyMoneySecurity("MDL", i18n("Moldavian Leu"))); @@ -2832,7 +2832,7 @@ currencyList.append(MyMoneySecurity("NGN", i18n("Nigerian Naira"), QChar(0x20A6))); currencyList.append(MyMoneySecurity("KPW", i18n("North Korean Won"), QChar(0x20A9))); currencyList.append(MyMoneySecurity("NOK", i18n("Norwegian Kroner"), "kr")); - currencyList.append(MyMoneySecurity("OMR", i18n("Omani Rial"), "OMR", 1000, 1000)); + currencyList.append(MyMoneySecurity("OMR", i18n("Omani Rial"), "OMR", 1000)); currencyList.append(MyMoneySecurity("PKR", i18n("Pakistan Rupee"))); currencyList.append(MyMoneySecurity("PAB", i18n("Panamanian Balboa"))); currencyList.append(MyMoneySecurity("PGK", i18n("Papua New Guinea Kina"))); @@ -2869,7 +2869,7 @@ currencyList.append(MyMoneySecurity("THB", i18n("Thai Baht"), QChar(0x0E3F))); currencyList.append(MyMoneySecurity("TOP", i18n("Tongan Pa'anga"))); currencyList.append(MyMoneySecurity("TTD", i18n("Trinidad and Tobago Dollar"), "$")); - currencyList.append(MyMoneySecurity("TND", i18n("Tunisian Dinar"), "TND", 1000, 1000)); + currencyList.append(MyMoneySecurity("TND", i18n("Tunisian Dinar"), "TND", 1000)); currencyList.append(MyMoneySecurity("TRY", i18n("Turkish Lira"), QChar(0x20BA))); currencyList.append(MyMoneySecurity("TMM", i18n("Turkmenistan Manat"))); currencyList.append(MyMoneySecurity("USD", i18n("US Dollar"), "$")); @@ -2885,10 +2885,10 @@ currencyList.append(MyMoneySecurity("ZMK", i18n("Zambian Kwacha"))); currencyList.append(MyMoneySecurity("ZWD", i18n("Zimbabwe Dollar"), "$")); - currencyList.append(MyMoneySecurity("XAU", i18n("Gold"), "XAU", 1, 1000000)); - currencyList.append(MyMoneySecurity("XPD", i18n("Palladium"), "XPD", 1, 1000000)); - currencyList.append(MyMoneySecurity("XPT", i18n("Platinum"), "XPT", 1, 1000000)); - currencyList.append(MyMoneySecurity("XAG", i18n("Silver"), "XAG", 1, 1000000)); + currencyList.append(MyMoneySecurity("XAU", i18n("Gold"), "XAU", 1000000)); + currencyList.append(MyMoneySecurity("XPD", i18n("Palladium"), "XPD", 1000000)); + currencyList.append(MyMoneySecurity("XPT", i18n("Platinum"), "XPT", 1000000)); + currencyList.append(MyMoneySecurity("XAG", i18n("Silver"), "XAG", 1000000)); currencyList.append(ancientCurrencies().keys()); return currencyList; diff --git a/kmymoney/mymoney/mymoneysecurity.h b/kmymoney/mymoney/mymoneysecurity.h --- a/kmymoney/mymoney/mymoneysecurity.h +++ b/kmymoney/mymoney/mymoneysecurity.h @@ -54,7 +54,10 @@ public: MyMoneySecurity(); MyMoneySecurity(const QString& id, const MyMoneySecurity& equity); - MyMoneySecurity(const QString& id, const QString& name, const QString& symbol = QString(), const int partsPerUnit = 100, const int smallestCashFraction = 100, const int smallestAccountFraction = 0); + MyMoneySecurity(const QString& id, const QString& name, const QString& symbol = QString(), + const int smallestCashFraction = DEFAULT_CASH_FRACTION, + const int smallestAccountFraction = DEFAULT_ACCOUNT_FRACTION, + const int pricePrecision = DEFAULT_PRICE_PRECISION); MyMoneySecurity(const QDomElement& node); virtual ~MyMoneySecurity(); @@ -87,68 +90,78 @@ const QString& name() const { return m_name; } + void setName(const QString& str) { m_name = str; } const QString& tradingSymbol() const { return m_tradingSymbol; } + void setTradingSymbol(const QString& str) { m_tradingSymbol = str; } eSECURITYTYPE securityType() const { return m_securityType; } + void setSecurityType(const eSECURITYTYPE& s) { m_securityType = s; } + bool isCurrency() const { return m_securityType == SECURITY_CURRENCY; - }; + } AlkValue::RoundingMethod roundingMethod() const { return m_roundingMethod; } + void setRoundingMethod(const AlkValue::RoundingMethod& rnd) { m_roundingMethod = rnd; } const QString& tradingMarket() const { return m_tradingMarket; } + void setTradingMarket(const QString& str) { m_tradingMarket = str; } const QString& tradingCurrency() const { return m_tradingCurrency; - }; + } + void setTradingCurrency(const QString& str) { m_tradingCurrency = str; - }; + } int smallestAccountFraction() const { return m_smallestAccountFraction; - }; + } + void setSmallestAccountFraction(const int sf) { m_smallestAccountFraction = sf; - }; + } - int partsPerUnit() const { - return m_partsPerUnit; - }; int smallestCashFraction() const { return m_smallestCashFraction; - }; + } - void setPartsPerUnit(const int ppu) { - m_partsPerUnit = ppu; - }; void setSmallestCashFraction(const int sf) { m_smallestCashFraction = sf; - }; + } + + int pricePrecision() const { + return m_pricePrecision; + } + + void setPricePrecision(const int pp) { + m_pricePrecision = pp; + } void writeXML(QDomDocument& document, QDomElement& parent) const; @@ -185,17 +198,23 @@ */ static QString roundingMethodToString(const AlkValue::RoundingMethod roundingMethod); - protected: QString m_name; QString m_tradingSymbol; QString m_tradingMarket; QString m_tradingCurrency; eSECURITYTYPE m_securityType; - AlkValue::RoundingMethod m_roundingMethod; - int m_smallestAccountFraction; int m_smallestCashFraction; - int m_partsPerUnit; + int m_smallestAccountFraction; + int m_pricePrecision; + AlkValue::RoundingMethod m_roundingMethod; + +private: + enum DefaultValues { + DEFAULT_CASH_FRACTION = 100, + DEFAULT_ACCOUNT_FRACTION = 100, + DEFAULT_PRICE_PRECISION = 4, + }; }; /** diff --git a/kmymoney/mymoney/mymoneysecurity.cpp b/kmymoney/mymoney/mymoneysecurity.cpp --- a/kmymoney/mymoney/mymoneysecurity.cpp +++ b/kmymoney/mymoney/mymoneysecurity.cpp @@ -36,30 +36,30 @@ #include "mymoneyexception.h" -MyMoneySecurity::MyMoneySecurity() - : m_securityType(SECURITY_NONE) - , m_roundingMethod(AlkValue::RoundRound) - , m_smallestAccountFraction(100) - , m_smallestCashFraction(100) - , m_partsPerUnit(100) +MyMoneySecurity::MyMoneySecurity() : + m_securityType(SECURITY_NONE), + m_smallestCashFraction(DEFAULT_CASH_FRACTION), + m_smallestAccountFraction(DEFAULT_ACCOUNT_FRACTION), + m_pricePrecision(DEFAULT_PRICE_PRECISION), + m_roundingMethod(AlkValue::RoundRound) { } -MyMoneySecurity::MyMoneySecurity(const QString& id, const QString& name, const QString& symbol, const int partsPerUnit, const int smallestCashFraction, const int smallestAccountFraction) - : MyMoneyObject(id) - , m_name(name) - , m_securityType(SECURITY_CURRENCY) - , m_roundingMethod(AlkValue::RoundRound) - , m_smallestCashFraction(100) - , m_partsPerUnit(100) +MyMoneySecurity::MyMoneySecurity(const QString& id, const QString& name, const QString& symbol, + const int smallestCashFraction, const int smallestAccountFraction, const int pricePrecision) : + MyMoneyObject(id), + m_name(name), + m_securityType(SECURITY_CURRENCY), + m_smallestCashFraction(smallestCashFraction), + m_smallestAccountFraction(smallestAccountFraction), + m_pricePrecision(pricePrecision), + m_roundingMethod(AlkValue::RoundRound) { if (symbol.isEmpty()) m_tradingSymbol = id; else m_tradingSymbol = symbol; - m_partsPerUnit = partsPerUnit; - m_smallestCashFraction = smallestCashFraction; if (smallestAccountFraction) m_smallestAccountFraction = smallestAccountFraction; else @@ -86,11 +86,20 @@ setTradingSymbol(QStringEmpty(node.attribute("symbol"))); setSecurityType(static_cast(node.attribute("type").toInt())); setRoundingMethod(static_cast(node.attribute("rounding-method").toInt())); - setSmallestAccountFraction(node.attribute("saf").toInt()); + int saf = node.attribute("saf").toUInt(); + int pp = node.attribute("pp").toUInt(); + if (saf == 0) + saf = 100; + if (pp == 0 || pp > 10) + pp = 4; + setSmallestAccountFraction(saf); + setPricePrecision(pp); if (isCurrency()) { - setPartsPerUnit(node.attribute("ppu").toInt()); - setSmallestCashFraction(node.attribute("scf").toInt()); + int scf = node.attribute("scf").toUInt(); + if (scf == 0) + scf = 100; + setSmallestCashFraction(scf); } else { setTradingCurrency(QStringEmpty(node.attribute("trading-currency"))); setTradingMarket(QStringEmpty(node.attribute("trading-market"))); @@ -113,9 +122,8 @@ && (m_securityType == r.m_securityType) && (m_smallestAccountFraction == r.m_smallestAccountFraction) && (m_smallestCashFraction == r.m_smallestCashFraction) - && (m_partsPerUnit == r.m_partsPerUnit) + && (m_pricePrecision == r.m_pricePrecision) && this->MyMoneyKeyValueContainer::operator == (r); - } bool MyMoneySecurity::operator < (const MyMoneySecurity& right) const @@ -146,10 +154,10 @@ el.setAttribute("type", static_cast(m_securityType)); el.setAttribute("rounding-method", static_cast(m_roundingMethod)); el.setAttribute("saf", m_smallestAccountFraction); - if (isCurrency()) { - el.setAttribute("ppu", m_partsPerUnit); + el.setAttribute("pp", m_pricePrecision); + if (isCurrency()) el.setAttribute("scf", m_smallestCashFraction); - } else { + else { el.setAttribute("trading-currency", m_tradingCurrency); el.setAttribute("trading-market", m_tradingMarket); } diff --git a/kmymoney/mymoney/storage/mymoneydbdef.cpp b/kmymoney/mymoney/storage/mymoneydbdef.cpp --- a/kmymoney/mymoney/storage/mymoneydbdef.cpp +++ b/kmymoney/mymoney/storage/mymoneydbdef.cpp @@ -335,6 +335,7 @@ appendField(MyMoneyDbIntColumn("roundingMethod", MyMoneyDbIntColumn::SMALL, UNSIGNED, false, NOTNULL)); appendField(MyMoneyDbTextColumn("typeString")); appendField(MyMoneyDbColumn("smallestAccountFraction", "varchar(24)")); + appendField(MyMoneyDbIntColumn("pricePrecision", MyMoneyDbIntColumn::SMALL, UNSIGNED, false, NOTNULL)); appendField(MyMoneyDbTextColumn("tradingMarket")); appendField(MyMoneyDbColumn("tradingCurrency", "char(3)")); MyMoneyDbTable t("kmmSecurities", fields); @@ -367,9 +368,9 @@ appendField(MyMoneyDbIntColumn("symbol2", MyMoneyDbIntColumn::SMALL, UNSIGNED)); appendField(MyMoneyDbIntColumn("symbol3", MyMoneyDbIntColumn::SMALL, UNSIGNED)); appendField(MyMoneyDbColumn("symbolString", "varchar(255)")); - appendField(MyMoneyDbColumn("partsPerUnit", "varchar(24)")); appendField(MyMoneyDbColumn("smallestCashFraction", "varchar(24)")); appendField(MyMoneyDbColumn("smallestAccountFraction", "varchar(24)")); + appendField(MyMoneyDbIntColumn("pricePrecision", MyMoneyDbIntColumn::SMALL, UNSIGNED)); MyMoneyDbTable t("kmmCurrencies", fields); t.buildSQLStrings(); m_tables[t.name()] = t; diff --git a/kmymoney/mymoney/storage/mymoneystoragedump.cpp b/kmymoney/mymoney/storage/mymoneystoragedump.cpp --- a/kmymoney/mymoney/storage/mymoneystoragedump.cpp +++ b/kmymoney/mymoney/storage/mymoneystoragedump.cpp @@ -263,6 +263,7 @@ s << " Type = " << MyMoneySecurity::securityTypeToString((*it_e).securityType()) << "\n"; s << " smallest account fraction = " << (*it_e).smallestAccountFraction() << "\n"; + s << " price precision = " << (*it_e).pricePrecision() << "\n"; s << " KVP: " << "\n"; QMapkvp = (*it_e).pairs(); diff --git a/kmymoney/mymoney/storage/mymoneystoragesql.cpp b/kmymoney/mymoney/storage/mymoneystoragesql.cpp --- a/kmymoney/mymoney/storage/mymoneystoragesql.cpp +++ b/kmymoney/mymoney/storage/mymoneystoragesql.cpp @@ -1968,14 +1968,14 @@ sharesList << s.shares().toString(); MyMoneyAccount acc = m_storagePtr->account(s.accountId()); MyMoneySecurity sec = m_storagePtr->security(acc.currencyId()); - sharesFormattedList << s.shares(). + sharesFormattedList << s.price(). formatMoney("", MyMoneyMoney::denomToPrec(sec.smallestAccountFraction()), false). replace(QChar(','), QChar('.')); MyMoneyMoney price = s.actualPrice(); if (!price.isZero()) { priceList << price.toString(); priceFormattedList << price.formatMoney - ("", m_precision, false) + ("", sec.pricePrecision(), false) .replace(QChar(','), QChar('.')); } else { priceList << QString(); @@ -2247,6 +2247,7 @@ q.bindValue(":typeString", MyMoneySecurity::securityTypeToString(security.securityType())); q.bindValue(":roundingMethod", static_cast(security.roundingMethod())); q.bindValue(":smallestAccountFraction", security.smallestAccountFraction()); + q.bindValue(":pricePrecision", security.pricePrecision()); q.bindValue(":tradingCurrency", security.tradingCurrency()); q.bindValue(":tradingMarket", security.tradingMarket()); if (!q.exec()) throw MYMONEYEXCEPTION(buildError(q, Q_FUNC_INFO, QString("writing Securities"))); // krazy:exclude=crashy @@ -2312,8 +2313,9 @@ q.bindValue(":toId", p.to()); q.bindValue(":priceDate", p.date().toString(Qt::ISODate)); q.bindValue(":price", p.rate(QString()).toString()); + const MyMoneySecurity sec = m_storagePtr->security(p.to()); q.bindValue(":priceFormatted", - p.rate(QString()).formatMoney("", m_precision)); + p.rate(QString()).formatMoney("", sec.pricePrecision())); q.bindValue(":priceSource", p.source()); if (!q.exec()) throw MYMONEYEXCEPTION(buildError(q, Q_FUNC_INFO, QString("writing Price"))); // krazy:exclude=crashy @@ -2433,9 +2435,9 @@ q.bindValue(":symbol2", symutf[1]); q.bindValue(":symbol3", symutf[2]); q.bindValue(":symbolString", symbol); - q.bindValue(":partsPerUnit", currency.partsPerUnit()); q.bindValue(":smallestCashFraction", currency.smallestCashFraction()); q.bindValue(":smallestAccountFraction", currency.smallestAccountFraction()); + q.bindValue(":pricePrecision", currency.pricePrecision()); if (!q.exec()) throw MYMONEYEXCEPTION(buildError(q, Q_FUNC_INFO, QString("writing Currencies"))); // krazy:exclude=crashy } @@ -4280,27 +4282,31 @@ int typeCol = t.fieldNumber("type"); int roundingMethodCol = t.fieldNumber("roundingMethod"); int smallestAccountFractionCol = t.fieldNumber("smallestAccountFraction"); + int pricePrecisionCol = t.fieldNumber("pricePrecision"); int tradingCurrencyCol = t.fieldNumber("tradingCurrency"); int tradingMarketCol = t.fieldNumber("tradingMarket"); while (q.next()) { MyMoneySecurity e; QString eid; - int saf = 0; eid = GETSTRING(idCol); e.setName(GETSTRING(nameCol)); e.setTradingSymbol(GETSTRING(symbolCol)); e.setSecurityType(static_cast(GETINT(typeCol))); e.setRoundingMethod(static_cast(GETINT(roundingMethodCol))); - saf = GETINT(smallestAccountFractionCol); + int saf = GETINT(smallestAccountFractionCol); + int pp = GETINT(pricePrecisionCol); e.setTradingCurrency(GETSTRING(tradingCurrencyCol)); e.setTradingMarket(GETSTRING(tradingMarketCol)); if (e.tradingCurrency().isEmpty()) e.setTradingCurrency(m_storage->pairs()["kmm-baseCurrency"]); if (saf == 0) saf = 100; + if (pp == 0 || pp > 10) + pp = 4; e.setSmallestAccountFraction(saf); + e.setPricePrecision(pp); // Process any key value pairs e.setPairs(readKeyValuePairs("SECURITY", eid).pairs()); @@ -4498,9 +4504,9 @@ int symbol1Col = t.fieldNumber("symbol1"); int symbol2Col = t.fieldNumber("symbol2"); int symbol3Col = t.fieldNumber("symbol3"); - int partsPerUnitCol = t.fieldNumber("partsPerUnit"); int smallestCashFractionCol = t.fieldNumber("smallestCashFraction"); int smallestAccountFractionCol = t.fieldNumber("smallestAccountFraction"); + int pricePrecisionCol = t.fieldNumber("pricePrecision"); while (q.next()) { QString id; @@ -4512,9 +4518,9 @@ symbol[0] = QChar(GETINT(symbol1Col)); symbol[1] = QChar(GETINT(symbol2Col)); symbol[2] = QChar(GETINT(symbol3Col)); - c.setPartsPerUnit(GETINT(partsPerUnitCol)); c.setSmallestCashFraction(GETINT(smallestCashFractionCol)); c.setSmallestAccountFraction(GETINT(smallestAccountFractionCol)); + c.setPricePrecision(GETINT(pricePrecisionCol)); c.setTradingSymbol(QString(symbol, 3).trimmed()); cList[id] = MyMoneySecurity(id, c); @@ -4920,14 +4926,8 @@ return (const_cast (this)->m_error); } -int MyMoneyStorageSql::m_precision = 4; QDate MyMoneyStorageSql::m_startDate = QDate(1900, 1, 1); -void MyMoneyStorageSql::setPrecision(int prec) -{ - m_precision = prec; -} - void MyMoneyStorageSql::setStartDate(const QDate& startDate) { m_startDate = startDate; diff --git a/kmymoney/mymoney/tests/mymoneyforecast-test.cpp b/kmymoney/mymoney/tests/mymoneyforecast-test.cpp --- a/kmymoney/mymoney/tests/mymoneyforecast-test.cpp +++ b/kmymoney/mymoney/tests/mymoneyforecast-test.cpp @@ -53,7 +53,7 @@ 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("JPY", "Japanese Yen", QChar(0x00A5), 1)); file->addCurrency(MyMoneySecurity("GBP", "British Pound", "#")); file->setBaseCurrency(file->currency("USD")); diff --git a/kmymoney/mymoney/tests/mymoneysecurity-test.cpp b/kmymoney/mymoney/tests/mymoneysecurity-test.cpp --- a/kmymoney/mymoney/tests/mymoneysecurity-test.cpp +++ b/kmymoney/mymoney/tests/mymoneysecurity-test.cpp @@ -35,7 +35,6 @@ QVERIFY(m->tradingCurrency().isEmpty()); QVERIFY(m->smallestCashFraction() == 100); QVERIFY(m->smallestAccountFraction() == 100); - QVERIFY(m->partsPerUnit() == 100); } void MyMoneySecurityTest::testCopyConstructor() @@ -76,16 +75,14 @@ m->setSecurityType(MyMoneySecurity::SECURITY_STOCK); m->setSmallestAccountFraction(50); m->setSmallestCashFraction(2); - m->setPartsPerUnit(30); QVERIFY(m->name() == "Name"); QVERIFY(m->tradingSymbol() == "Symbol"); QVERIFY(m->tradingMarket() == "Market"); QVERIFY(m->tradingCurrency() == "Currency"); QVERIFY(m->securityType() == MyMoneySecurity::SECURITY_STOCK); QVERIFY(m->smallestAccountFraction() == 50); QVERIFY(m->smallestCashFraction() == 2); - QVERIFY(m->partsPerUnit() == 30); } /* @@ -122,15 +119,12 @@ n.setSecurityType(MyMoneySecurity::SECURITY_CURRENCY); QVERIFY(!(n == *m)); n = *m; - n.setSmallestAccountFraction(40); + n.setPricePrecision(8); QVERIFY(!(n == *m)); n = *m; n.setSmallestCashFraction(20); QVERIFY(!(n == *m)); n = *m; - n.setPartsPerUnit(3); - QVERIFY(!(n == *m)); - n = *m; n.setValue("Key", "NewValue"); QVERIFY(!(n == *m)); } @@ -165,9 +159,6 @@ n.setSmallestCashFraction(20); QVERIFY(n != *m); n = *m; - n.setPartsPerUnit(3); - QVERIFY(n != *m); - n = *m; n.setValue("Key", "NewValue"); QVERIFY(n != *m); } diff --git a/kmymoney/reports/kreportchartview.h b/kmymoney/reports/kreportchartview.h --- a/kmymoney/reports/kreportchartview.h +++ b/kmymoney/reports/kreportchartview.h @@ -82,7 +82,7 @@ /** * Draw a PivotGridRowSet in a chart */ - unsigned drawPivotRowSet(int rowNum, const PivotGridRowSet& rowSet, const ERowType rowType, const QString& legendText, int startColumn = 1, int endColumn = 0); + unsigned drawPivotRowSet(const QString& rowAcc, int rowNum, const PivotGridRowSet& rowSet, const ERowType rowType, const QString& legendText, int startColumn = 1, int endColumn = 0); /** * Set cell data diff --git a/kmymoney/reports/kreportchartview.cpp b/kmymoney/reports/kreportchartview.cpp --- a/kmymoney/reports/kreportchartview.cpp +++ b/kmymoney/reports/kreportchartview.cpp @@ -298,13 +298,13 @@ //skip the budget difference rowset if (rowTypeList[i] != eBudgetDiff) { QString legendText; + QString rowName = it_row.key().name(); //only show the column type in the header if there is more than one type - if (rowTypeList.size() > 1) { - legendText = QString(columnTypeHeaderList[i] + " - " + it_row.key().name()); - } else { - legendText = QString(it_row.key().name()); - } + if (rowTypeList.size() > 1) + legendText = QString(columnTypeHeaderList.at(i) + QLatin1Literal(" - ") + rowName); + else + legendText = rowName; //set the legend text legend->setText(rowNum, legendText); @@ -314,7 +314,7 @@ legendText.clear(); //set the cell value and tooltip - rowNum = drawPivotRowSet(rowNum, it_row.value(), rowTypeList[i], legendText, 1, numColumns() - 1); + rowNum = drawPivotRowSet(it_row.key().id(), rowNum, it_row.value(), rowTypeList[i], legendText, 1, numColumns() - 1); } } } @@ -342,14 +342,13 @@ //skip the budget difference rowset if (rowTypeList[i] != eBudgetDiff) { QString legendText; - + QString rowName = it_innergroup.key(); //only show the column type in the header if there is more than one type - if (rowTypeList.size() > 1) { - legendText = QString(columnTypeHeaderList[i] + " - " + it_innergroup.key()); - } else { - legendText = QString(it_innergroup.key()); - } + if (rowTypeList.size() > 1) + legendText = QString(columnTypeHeaderList.at(i) + QLatin1Literal(" - ") + rowName); + else + legendText = rowName; //set the legend text legend->setText(rowNum, legendText); @@ -359,7 +358,7 @@ legendText.clear(); //set the cell value and tooltip - rowNum = drawPivotRowSet(rowNum, (*it_innergroup).m_total, rowTypeList[i], legendText, 1, numColumns() - 1); + rowNum = drawPivotRowSet(QString(), rowNum, (*it_innergroup).m_total, rowTypeList[i], legendText, 1, numColumns() - 1); } } ++it_innergroup; @@ -380,13 +379,13 @@ //skip the budget difference rowset if (rowTypeList[i] != eBudgetDiff) { QString legendText; + QString rowName = it_outergroup.key(); //only show the column type in the header if there is more than one type - if (rowTypeList.size() > 1) { - legendText = QString(columnTypeHeaderList[i] + " - " + it_outergroup.key()); - } else { - legendText = QString(it_outergroup.key()); - } + if (rowTypeList.size() > 1) + legendText = QString(columnTypeHeaderList.at(i) + QLatin1Literal(" - ") + rowName); + else + legendText = rowName; //set the legend text legend->setText(rowNum, legendText); @@ -396,7 +395,7 @@ legendText.clear(); //set the cell value and tooltip - rowNum = drawPivotRowSet(rowNum, (*it_outergroup).m_total, rowTypeList[i], legendText, 1, numColumns() - 1); + rowNum = drawPivotRowSet(QString(), rowNum, (*it_outergroup).m_total, rowTypeList[i], legendText, 1, numColumns() - 1); } } ++it_outergroup; @@ -411,11 +410,10 @@ QString legendText; //only show the column type in the header if there is more than one type - if (rowTypeList.size() > 1) { - legendText = QString(columnTypeHeaderList[i] + " - " + i18nc("Total balance", "Total")); + if (rowTypeList.size() > 1) + legendText = QString(columnTypeHeaderList.at(i) + QLatin1Literal(" - ") + i18nc("Total balance", "Total")); + else legendText = QString(i18nc("Total balance", "Total")); - } else { - } //set the legend text legend->setText(rowNum, legendText); @@ -425,7 +423,7 @@ legendText.clear(); //set the cell value - rowNum = drawPivotRowSet(rowNum, grid.m_total, rowTypeList[i], legendText, 1, numColumns() - 1); + rowNum = drawPivotRowSet(QString(), rowNum, grid.m_total, rowTypeList[i], legendText, 1, numColumns() - 1); } } } @@ -442,11 +440,10 @@ QString legendText; //only show the column type in the header if there is more than one type - if (rowTypeList.size() > 1) { - legendText = QString(columnTypeHeaderList[i] + " - " + i18nc("Total balance", "Total")); - } else { + if (rowTypeList.size() > 1) + legendText = QString(columnTypeHeaderList.at(i) + QLatin1Literal(" - ") + i18nc("Total balance", "Total")); + else legendText = QString(i18nc("Total balance", "Total")); - } //set the legend legend->setText(rowNum, legendText); @@ -457,15 +454,15 @@ if (config.isMixedTime() && (rowTypeList[i] == eActual || rowTypeList[i] == eForecast)) { if (rowTypeList[i] == eActual) { - rowNum = drawPivotRowSet(rowNum, grid.m_total, rowTypeList[i], legendText, 1, config.currentDateColumn()); + rowNum = drawPivotRowSet(QString(), rowNum, grid.m_total, rowTypeList[i], legendText, 1, config.currentDateColumn()); } else if (rowTypeList[i] == eForecast) { - rowNum = drawPivotRowSet(rowNum, grid.m_total, rowTypeList[i], legendText, config.currentDateColumn(), numColumns() - 1); + rowNum = drawPivotRowSet(QString(), rowNum, grid.m_total, rowTypeList[i], legendText, config.currentDateColumn(), numColumns() - 1); } else { - rowNum = drawPivotRowSet(rowNum, grid.m_total, rowTypeList[i], legendText, 1, numColumns() - 1); + rowNum = drawPivotRowSet(QString(), rowNum, grid.m_total, rowTypeList[i], legendText, 1, numColumns() - 1); } } else { //set cell value - rowNum = drawPivotRowSet(rowNum, grid.m_total, rowTypeList[i], legendText, 1, numColumns() - 1); + rowNum = drawPivotRowSet(QString(), rowNum, grid.m_total, rowTypeList[i], legendText, 1, numColumns() - 1); } } } @@ -597,14 +594,15 @@ barDiagram->axes().at(1)->setLabels(labels); } -unsigned KReportChartView::drawPivotRowSet(int rowNum, const PivotGridRowSet& rowSet, const ERowType rowType, const QString& legendText, int startColumn, int endColumn) +unsigned KReportChartView::drawPivotRowSet(const QString& rowAcc, int rowNum, const PivotGridRowSet& rowSet, const ERowType rowType, const QString& legendText, int startColumn, int endColumn) { if (coordinatePlane()->diagram()->datasetDimension() != 1) return ++rowNum; //if endColumn is invalid, make it the same as numColumns if (endColumn == 0) endColumn = numColumns(); + MyMoneyFile* file = MyMoneyFile::instance(); double value; QString toolTip; @@ -615,15 +613,31 @@ justifyModelSize(rowNum + 1, endColumn > numColumns() - 1 ? endColumn + 1 : numColumns()); } + int precision = 0; + if (!rowAcc.isEmpty()) { + const MyMoneyAccount acc = file->account(rowAcc); + if (rowType == ePrice) { + if (acc.isInvest()) + precision = file->currency(acc.currencyId()).pricePrecision(); + } else { + if (acc.isInvest()) // stock account isn't eveluated in currency, so take investment account instead + precision = MyMoneyMoney::denomToPrec(file->account(acc.parentAccountId()).fraction()); + else + precision = MyMoneyMoney::denomToPrec(acc.fraction()); + } + } + if (precision == 0) + precision = file->baseCurrency().pricePrecision(); + // Columns if (seriesTotals()) { value = rowSet[rowType].m_total.toDouble(); //set the tooltip if (!legendText.isEmpty()) toolTip = QString("

%1

%2
") .arg(legendText) - .arg(value, 0, 'g', KMyMoneyGlobalSettings::pricePrecision()); + .arg(value, 0, 'f', precision); //set the cell value if (accountSeries()) @@ -642,7 +656,7 @@ if (!legendText.isEmpty()) toolTip = QString("

%1

%2
") .arg(legendText) - .arg(value, 0, 'g', KMyMoneyGlobalSettings::pricePrecision()); + .arg(value, 0, 'f', precision); if (accountSeries()) this->setDataCell(column, rowNum, value, toolTip); diff --git a/kmymoney/reports/listtable.cpp b/kmymoney/reports/listtable.cpp --- a/kmymoney/reports/listtable.cpp +++ b/kmymoney/reports/listtable.cpp @@ -452,9 +452,10 @@ .arg(i18n("Calculated"), tlinkBegin, tlinkEnd); csv += "\"" + i18n("Calculated") + "\","; } else if (*it_column == "price") { + int pricePrecision = file->security(file->account((*it_row)["accountid"]).currencyId()).pricePrecision(); result += QString("%3%2 %1%4") - .arg(MyMoneyMoney(data).formatMoney(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision())), currencyID, tlinkBegin, tlinkEnd); - csv += "\"" + currencyID + " " + MyMoneyMoney(data).formatMoney(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision()), false) + "\","; + .arg(MyMoneyMoney(data).formatMoney(QString(), pricePrecision), currencyID, tlinkBegin, tlinkEnd); + csv += "\"" + currencyID + " " + MyMoneyMoney(data).formatMoney(QString(), pricePrecision, false) + "\","; } else { result += QString("%4%2 %3%5") .arg((*it_column == "value") ? " class=\"value\"" : "") diff --git a/kmymoney/reports/pivottable.h b/kmymoney/reports/pivottable.h --- a/kmymoney/reports/pivottable.h +++ b/kmymoney/reports/pivottable.h @@ -161,7 +161,6 @@ * with $red, $green and $blue being the actual value for the * chosen color. */ - QString coloredAmount(const MyMoneyMoney& amount, const QString& currencySymbol = QString()) const; QString coloredAmount(const MyMoneyMoney& amount, const QString& currencySymbol, int prec) const; protected: diff --git a/kmymoney/reports/pivottable.cpp b/kmymoney/reports/pivottable.cpp --- a/kmymoney/reports/pivottable.cpp +++ b/kmymoney/reports/pivottable.cpp @@ -1536,6 +1536,10 @@ { DEBUG_ENTER(Q_FUNC_INFO); + MyMoneyFile* file = MyMoneyFile::instance(); + int pricePrecision = 0; + int currencyPrecision = 0; + int precision = 2; QString colspan = QString(" colspan=\"%1\"").arg(m_numColumns + 1 + (m_config_f.isShowingRowTotals() ? 1 : 0)); // @@ -1626,6 +1630,7 @@ // // I hope this doesn't bog the performance of reports, given that we're copying the entire report // data. If this is a perf hit, we could change to storing outergroup pointers, I think. + QList outergroups; PivotGrid::const_iterator it_outergroup_map = m_grid.begin(); while (it_outergroup_map != m_grid.end()) { @@ -1670,27 +1675,47 @@ QString rowdata; int column = 1; + pricePrecision = 0; // new row => new account => new precision + currencyPrecision = 0; bool isUsed = it_row.value()[eActual][0].isUsed(); while (column < m_numColumns) { QString lb; - if (column != 1) + if (column > 1) lb = leftborder; - for (int i = 0; i < m_rowTypeList.size(); ++i) { + foreach (const auto rowType, m_rowTypeList) { + if (rowType == ePrice) { + if (pricePrecision == 0) { + if (it_row.key().isInvest()) { + pricePrecision = file->currency(it_row.key().currencyId()).pricePrecision(); + precision = pricePrecision; + } else + precision = 2; + } else + precision = pricePrecision; + } else { + if (currencyPrecision == 0) { + if (it_row.key().isInvest()) // stock account isn't eveluated in currency, so take investment account instead + currencyPrecision = MyMoneyMoney::denomToPrec(it_row.key().parent().fraction()); + else + currencyPrecision = MyMoneyMoney::denomToPrec(it_row.key().fraction()); + precision = currencyPrecision; + } else + precision = currencyPrecision; + } rowdata += QString("%1") - .arg(coloredAmount(it_row.value()[ m_rowTypeList[i] ][column])) - .arg(i == 0 ? lb : QString()); - - isUsed |= it_row.value()[ m_rowTypeList[i] ][column].isUsed(); + .arg(coloredAmount(it_row.value()[rowType][column], QString(), precision)) + .arg(lb); + lb.clear(); + isUsed |= it_row.value()[rowType][column].isUsed(); } - - column++; + ++column; } if (m_config_f.isShowingRowTotals()) { for (int i = 0; i < m_rowTypeList.size(); ++i) { rowdata += QString("%1") - .arg(coloredAmount(it_row.value()[ m_rowTypeList[i] ].m_total)) + .arg(coloredAmount(it_row.value()[ m_rowTypeList[i] ].m_total, QString(), precision)) .arg(i == 0 ? leftborder : QString()); } } @@ -1774,7 +1799,7 @@ for (int i = 0; i < m_rowTypeList.size(); ++i) { finalRow += QString("%1") - .arg(coloredAmount((*it_innergroup).m_total[ m_rowTypeList[i] ][column])) + .arg(coloredAmount((*it_innergroup).m_total[ m_rowTypeList[i] ][column], QString(), precision)) .arg(i == 0 ? lb : QString()); isUsed |= (*it_innergroup).m_total[ m_rowTypeList[i] ][column].isUsed(); } @@ -1785,7 +1810,7 @@ if (m_config_f.isShowingRowTotals()) { for (int i = 0; i < m_rowTypeList.size(); ++i) { finalRow += QString("%1") - .arg(coloredAmount((*it_innergroup).m_total[ m_rowTypeList[i] ].m_total)) + .arg(coloredAmount((*it_innergroup).m_total[ m_rowTypeList[i] ].m_total, QString(), precision)) .arg(i == 0 ? leftborder : QString()); } } @@ -1817,7 +1842,7 @@ for (int i = 0; i < m_rowTypeList.size(); ++i) { result += QString("%1") - .arg(coloredAmount((*it_outergroup).m_total[ m_rowTypeList[i] ][column])) + .arg(coloredAmount((*it_outergroup).m_total[ m_rowTypeList[i] ][column], QString(), precision)) .arg(i == 0 ? lb : QString()); } @@ -1827,7 +1852,7 @@ if (m_config_f.isShowingRowTotals()) { for (int i = 0; i < m_rowTypeList.size(); ++i) { result += QString("%1") - .arg(coloredAmount((*it_outergroup).m_total[ m_rowTypeList[i] ].m_total)) + .arg(coloredAmount((*it_outergroup).m_total[ m_rowTypeList[i] ].m_total, QString(), precision)) .arg(i == 0 ? leftborder : QString()); } } @@ -1855,7 +1880,7 @@ for (int i = 0; i < m_rowTypeList.size(); ++i) { result += QString("%1") - .arg(coloredAmount(m_grid.m_total[ m_rowTypeList[i] ][totalcolumn])) + .arg(coloredAmount(m_grid.m_total[ m_rowTypeList[i] ][totalcolumn], QString(), precision)) .arg(i == 0 ? lb : QString()); } @@ -1865,7 +1890,7 @@ if (m_config_f.isShowingRowTotals()) { for (int i = 0; i < m_rowTypeList.size(); ++i) { result += QString("%1") - .arg(coloredAmount(m_grid.m_total[ m_rowTypeList[i] ].m_total)) + .arg(coloredAmount(m_grid.m_total[ m_rowTypeList[i] ].m_total, QString(), precision)) .arg(i == 0 ? leftborder : QString()); } } @@ -1893,11 +1918,6 @@ chartView.drawPivotChart(m_grid, m_config_f, m_numColumns, m_columnHeadings, m_rowTypeList, m_columnTypeHeaderList); } -QString PivotTable::coloredAmount(const MyMoneyMoney& amount, const QString& currencySymbol) const -{ - return coloredAmount(amount, currencySymbol, KMyMoneyGlobalSettings::pricePrecision()); -} - QString PivotTable::coloredAmount(const MyMoneyMoney& amount, const QString& currencySymbol, int prec) const { QString result; diff --git a/kmymoney/reports/querytable.cpp b/kmymoney/reports/querytable.cpp --- a/kmymoney/reports/querytable.cpp +++ b/kmymoney/reports/querytable.cpp @@ -776,7 +776,7 @@ qA["action"] = (*it_split).action(); qA["shares"] = shares.isZero() ? "" : shares.toString(); - qA["price"] = shares.isZero() ? "" : xr.convert(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision())).toString(); + qA["price"] = shares.isZero() ? "" : xr.convertPrecision(splitAcc.currency().pricePrecision()).toString(); if (((*it_split).action() == MyMoneySplit::ActionBuyShares) && shares.isNegative()) qA["action"] = "Sell"; @@ -1132,7 +1132,7 @@ qA["institution"] = institution.isEmpty() ? i18n("No Institution") : file->institution(institution).name(); qA["rank"] = "0"; - qA["price"] = startPrice.convert(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision())).toString(); + qA["price"] = startPrice.convertPrecision(account.currency().pricePrecision()).toString(); if (account.isInvest()) { qA["shares"] = startShares.toString(); } @@ -1144,7 +1144,7 @@ m_rows += qA; //ending balance - qA["price"] = endPrice.convert(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision())).toString(); + qA["price"] = endPrice.convertPrecision(account.currency().pricePrecision()).toString(); if (account.isInvest()) { qA["shares"] = endShares.toString(); @@ -1499,7 +1499,7 @@ netprice = netprice.reduce(); shares = shares.reduce(); - qaccountrow["price"] = netprice.convert(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision())).toString(); + qaccountrow["price"] = netprice.convertPrecision(account.currency().pricePrecision()).toString(); qaccountrow["value"] = (netprice * shares).convert(fraction).toString(); qaccountrow["shares"] = shares.toString(); @@ -1697,7 +1697,7 @@ qA["action"] = (*it_split).action(); qA["shares"] = shares.isZero() ? "" : (*it_split).shares().toString(); - qA["price"] = shares.isZero() ? "" : xr.convert(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision())).toString(); + qA["price"] = shares.isZero() ? "" : xr.convertPrecision(splitAcc.currency().pricePrecision()).toString(); if (((*it_split).action() == MyMoneySplit::ActionBuyShares) && (*it_split).shares().isNegative()) qA["action"] = "Sell"; @@ -1709,7 +1709,7 @@ a_fullname = splitAcc.fullName(); a_memo = (*it_split).memo(); - qA["price"] = xr.convert(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision())).toString(); + qA["price"] = xr.convertPrecision(splitAcc.currency().pricePrecision()).toString(); qA["account"] = splitAcc.name(); qA["accountid"] = splitAcc.id(); qA["topaccount"] = splitAcc.topParentName(); @@ -1884,7 +1884,7 @@ qA["institution"] = institution.isEmpty() ? i18n("No Institution") : file->institution(institution).name(); qA["rank"] = "0"; - qA["price"] = startPrice.convert(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision())).toString(); + qA["price"] = startPrice.convertPrecision(account.currency().pricePrecision()).toString(); if (account.isInvest()) { qA["shares"] = startShares.toString(); } @@ -1897,7 +1897,7 @@ qA["rank"] = "3"; //ending balance - qA["price"] = endPrice.convert(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision())).toString(); + qA["price"] = endPrice.convertPrecision(account.currency().pricePrecision()).toString(); if (account.isInvest()) { qA["shares"] = endShares.toString(); diff --git a/kmymoney/reports/tests/pivotgrid-test.cpp b/kmymoney/reports/tests/pivotgrid-test.cpp --- a/kmymoney/reports/tests/pivotgrid-test.cpp +++ b/kmymoney/reports/tests/pivotgrid-test.cpp @@ -37,7 +37,7 @@ 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("JPY", "Japanese Yen", QChar(0x00A5), 1)); file->addCurrency(MyMoneySecurity("GBP", "British Pound", "#")); file->setBaseCurrency(file->currency("USD")); diff --git a/kmymoney/reports/tests/pivottable-test.cpp b/kmymoney/reports/tests/pivottable-test.cpp --- a/kmymoney/reports/tests/pivottable-test.cpp +++ b/kmymoney/reports/tests/pivottable-test.cpp @@ -49,7 +49,7 @@ 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("JPY", "Japanese Yen", QChar(0x00A5), 1)); file->addCurrency(MyMoneySecurity("GBP", "British Pound", "#")); file->setBaseCurrency(file->currency("USD")); diff --git a/kmymoney/reports/tests/querytable-test.cpp b/kmymoney/reports/tests/querytable-test.cpp --- a/kmymoney/reports/tests/querytable-test.cpp +++ b/kmymoney/reports/tests/querytable-test.cpp @@ -45,7 +45,7 @@ MyMoneyFileTransaction ft; file->addCurrency(MyMoneySecurity("CAD", "Canadian Dollar", "C$")); file->addCurrency(MyMoneySecurity("USD", "US Dollar", "$")); - file->addCurrency(MyMoneySecurity("JPY", "Japanese Yen", QChar(0x00A5), 100, 100)); + file->addCurrency(MyMoneySecurity("JPY", "Japanese Yen", QChar(0x00A5), 1)); file->addCurrency(MyMoneySecurity("GBP", "British Pound", "#")); file->setBaseCurrency(file->currency("USD")); diff --git a/kmymoney/views/kgloballedgerview.cpp b/kmymoney/views/kgloballedgerview.cpp --- a/kmymoney/views/kgloballedgerview.cpp +++ b/kmymoney/views/kgloballedgerview.cpp @@ -799,7 +799,7 @@ if (currencyId != base.id()) { const MyMoneyPrice &priceInfo = file->price(sec.tradingCurrency(), base.id()); d->m_balanceIsApproximated |= !priceInfo.isValid(); - rate = (rate * priceInfo.rate(base.id())).convert(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision())); + rate = (rate * priceInfo.rate(base.id())).convertPrecision(sec.pricePrecision()); } balance += ((*it_b) * rate).convert(base.smallestAccountFraction()); } diff --git a/kmymoney/views/khomeview.cpp b/kmymoney/views/khomeview.cpp --- a/kmymoney/views/khomeview.cpp +++ b/kmymoney/views/khomeview.cpp @@ -937,7 +937,7 @@ MyMoneyMoney balance = file->balance(stock.id(), QDate::currentDate()); MyMoneySecurity security = file->security(stock.currencyId()); const MyMoneyPrice &price = file->price(stock.currencyId(), security.tradingCurrency()); - val = (balance * price.rate(security.tradingCurrency())).convert(MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision())); + val = (balance * price.rate(security.tradingCurrency())).convertPrecision(security.pricePrecision()); // adjust value of security to the currency of the account MyMoneySecurity accountCurrency = file->currency(acc.currencyId()); val = val * file->price(security.tradingCurrency(), accountCurrency.id()).rate(accountCurrency.id()); diff --git a/kmymoney/views/kinvestmentview.cpp b/kmymoney/views/kinvestmentview.cpp --- a/kmymoney/views/kinvestmentview.cpp +++ b/kmymoney/views/kinvestmentview.cpp @@ -149,7 +149,6 @@ i18n("Change the security information of the selected entry.")); KGuiItem::assign(m_editSecurityButton, editButtonItem); - connect(m_showCurrencyButton, SIGNAL(toggled(bool)), this, SLOT(slotLoadView())); connect(m_securitiesList, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateSecuritiesButtons())); connect(m_editSecurityButton, SIGNAL(clicked()), this, SLOT(slotEditSecurity())); connect(m_deleteSecurityButton, SIGNAL(clicked()), this, SLOT(slotDeleteSecurity())); @@ -444,7 +443,7 @@ //column 4 is the current price // Get the price precision from the configuration - prec = KMyMoneyGlobalSettings::pricePrecision(); + prec = security.pricePrecision(); // prec = MyMoneyMoney::denomToPrec(m_tradingCurrency.smallestAccountFraction()); if (price.isValid()) { @@ -483,9 +482,6 @@ QList list = MyMoneyFile::instance()->securityList(); QList::ConstIterator it; - if (m_showCurrencyButton->isChecked()) { - list += MyMoneyFile::instance()->currencyList(); - } for (it = list.constBegin(); it != list.constEnd(); ++it) { QTreeWidgetItem* newItem = new QTreeWidgetItem(m_securitiesList); loadSecurityItem(newItem, *it); diff --git a/kmymoney/views/kinvestmentviewdecl.ui b/kmymoney/views/kinvestmentviewdecl.ui --- a/kmymoney/views/kinvestmentviewdecl.ui +++ b/kmymoney/views/kinvestmentviewdecl.ui @@ -7,7 +7,7 @@ 0 0 439 - 140 + 164
@@ -24,7 +24,16 @@ Equities - + + 0 + + + 0 + + + 0 + + 0 @@ -181,18 +190,6 @@ Fraction - - - Cash Fraction - - -
-
- - - - Show national currencies -
@@ -256,20 +253,14 @@ - KMyMoneyAccountCombo - KComboBox -
kmymoneyaccountcombo.h
-
- KComboBox QComboBox
kcombobox.h
- QTabWidget - QTabWidget -
ktabwidget.h
- 1 + KMyMoneyAccountCombo + KComboBox +
kmymoneyaccountcombo.h
diff --git a/kmymoney/widgets/transaction.cpp b/kmymoney/widgets/transaction.cpp --- a/kmymoney/widgets/transaction.cpp +++ b/kmymoney/widgets/transaction.cpp @@ -1561,7 +1561,7 @@ case ValueColumn2: align |= Qt::AlignRight; if ((fieldEditable = havePrice()) == true && !m_split.shares().isZero()) { - txt = m_split.price().formatMoney("", KMyMoneyGlobalSettings::pricePrecision()); + txt = m_split.price().formatMoney("", m_security.pricePrecision()); } break; } @@ -1718,7 +1718,7 @@ case PriceColumn: align |= Qt::AlignRight; if (havePrice() && !m_split.shares().isZero()) { - txt = m_split.price().formatMoney(m_currency.tradingSymbol(), KMyMoneyGlobalSettings::pricePrecision()); + txt = m_split.price().formatMoney(m_currency.tradingSymbol(), m_security.pricePrecision()); } break; diff --git a/kmymoney/wizards/newaccountwizard/knewaccountwizard.cpp b/kmymoney/wizards/newaccountwizard/knewaccountwizard.cpp --- a/kmymoney/wizards/newaccountwizard/knewaccountwizard.cpp +++ b/kmymoney/wizards/newaccountwizard/knewaccountwizard.cpp @@ -484,7 +484,6 @@ m_mandatoryGroup->add(m_accountName); m_mandatoryGroup->add(m_conversionRate->lineedit()); - m_conversionRate->setPrecision(KMyMoneyGlobalSettings::pricePrecision()); m_conversionRate->setValue(MyMoneyMoney::ONE); slotUpdateCurrency(); @@ -541,6 +540,7 @@ m_conversionExample->setVisible(show); m_onlineQuote->setVisible(show); m_conversionRate->setEnabled(show); // make sure to include/exclude in mandatoryGroup + m_conversionRate->setPrecision(m_currencyComboBox->security().pricePrecision()); m_mandatoryGroup->changed(); slotUpdateConversionRate(m_conversionRate->lineedit()->text()); } @@ -576,7 +576,7 @@ void AccountTypePage::slotUpdateConversionRate(const QString& txt) { - m_conversionExample->setText(i18n("1 %1 equals %2", MyMoneyFile::instance()->baseCurrency().tradingSymbol(), MyMoneyMoney(txt).formatMoney(m_currencyComboBox->security().tradingSymbol(), KMyMoneyGlobalSettings::pricePrecision()))); + m_conversionExample->setText(i18n("1 %1 equals %2", MyMoneyFile::instance()->baseCurrency().tradingSymbol(), MyMoneyMoney(txt).formatMoney(m_currencyComboBox->security().tradingSymbol(), m_currencyComboBox->security().pricePrecision()))); } bool AccountTypePage::isComplete() const @@ -1577,7 +1577,7 @@ m_dataList->append(i18n("Currency: %1", m_wizard->currency().name())); m_dataList->append(i18n("Opening date: %1", QLocale().toString(acc.openingDate()))); if (m_wizard->currency().id() != MyMoneyFile::instance()->baseCurrency().id()) { - m_dataList->append(i18n("Conversion rate: %1", m_wizard->conversionRate().rate(QString()).formatMoney("", KMyMoneyGlobalSettings::pricePrecision()))); + m_dataList->append(i18n("Conversion rate: %1", m_wizard->conversionRate().rate(QString()).formatMoney("", m_wizard->currency().pricePrecision()))); } if (!acc.isLoan() || !m_wizard->openingBalance().isZero()) m_dataList->append(i18n("Opening balance: %1", MyMoneyUtils::formatMoney(m_wizard->openingBalance(), acc, sec))); diff --git a/kmymoney/wizards/newinvestmentwizard/kinvestmentdetailswizardpage.cpp b/kmymoney/wizards/newinvestmentwizard/kinvestmentdetailswizardpage.cpp --- a/kmymoney/wizards/newinvestmentwizard/kinvestmentdetailswizardpage.cpp +++ b/kmymoney/wizards/newinvestmentwizard/kinvestmentdetailswizardpage.cpp @@ -75,6 +75,8 @@ registerField("fraction", m_fraction, "value", SIGNAL(textChanged())); connect(m_fraction, SIGNAL(textChanged(QString)), this, SIGNAL(completeChanged())); + + registerField("pricePrecision", m_pricePrecision, "value", SIGNAL(valueChanged())); } /** @@ -90,6 +92,7 @@ else m_roundingMethod->setCurrentIndex(m_roundingMethod->findData(security.roundingMethod())); m_fraction->setValue(MyMoneyMoney(security.smallestAccountFraction(), 1)); + m_pricePrecision->setValue(security.pricePrecision()); m_tradingCurrencyEdit->setSecurity(tradingCurrency); m_investmentIdentification->setText(security.value("kmm-security-id")); diff --git a/kmymoney/wizards/newinvestmentwizard/kinvestmentdetailswizardpagedecl.ui b/kmymoney/wizards/newinvestmentwizard/kinvestmentdetailswizardpagedecl.ui --- a/kmymoney/wizards/newinvestmentwizard/kinvestmentdetailswizardpagedecl.ui +++ b/kmymoney/wizards/newinvestmentwizard/kinvestmentdetailswizardpagedecl.ui @@ -7,11 +7,11 @@ 0 0 216 - 266 + 304 - In&vestment details + Investment details @@ -201,17 +201,37 @@
- + + + + This controls what to do with digit situated after precision digits in amount values. + + + + Remainder + + + + Price precision + + + - + - This controls what to do with digit situated after precision digits in amount values. + This determines how many digits after decimal symbol price can have. + + + 2 + + + 10 diff --git a/kmymoney/wizards/newinvestmentwizard/knewinvestmentwizard.cpp b/kmymoney/wizards/newinvestmentwizard/knewinvestmentwizard.cpp --- a/kmymoney/wizards/newinvestmentwizard/knewinvestmentwizard.cpp +++ b/kmymoney/wizards/newinvestmentwizard/knewinvestmentwizard.cpp @@ -181,6 +181,7 @@ newSecurity.setTradingSymbol(field("investmentSymbol").toString()); newSecurity.setTradingMarket(field("tradingMarket").toString()); newSecurity.setSmallestAccountFraction(field("fraction").value().formatMoney("", 0, false).toUInt()); + newSecurity.setPricePrecision(MyMoneyMoney(field("pricePrecision").toUInt()).formatMoney("", 0, false).toUInt()); newSecurity.setTradingCurrency(field("tradingCurrencyEdit").value().id()); newSecurity.setSecurityType(type); newSecurity.setRoundingMethod(roudingMethod);