diff --git a/kmymoney/dialogs/investactivities.cpp b/kmymoney/dialogs/investactivities.cpp --- a/kmymoney/dialogs/investactivities.cpp +++ b/kmymoney/dialogs/investactivities.cpp @@ -450,12 +450,22 @@ bool Sell::isComplete(QString& reason) const { + Q_D(const Activity); + auto rc = Activity::isComplete(reason); - rc &= haveAssetAccount(); rc &= haveFees(true); rc &= haveInterest(true); rc &= haveShares(); rc &= havePrice(); + + // allow a sell operation that reduces the number of shares + // to pay fees. This is to handle mutual fund account fees. + // There is no money transferred -- only a reduction in shares. + if (rc) { + if (!d->m_parent->totalAmount().isZero()) { + rc &= haveAssetAccount(); + } + } return rc; } @@ -511,13 +521,14 @@ !createCategorySplits(t, interestAccountWidget, interestAmountWidget, MyMoneyMoney::MINUS_ONE, interestSplits, m_interestSplits)) return false; - createAssetAccountSplit(assetAccountSplit, s0); - - MyMoneyMoney total = sumSplits(s0, feeSplits, interestSplits); - assetAccountSplit.setValue(-total); + const auto total = sumSplits(s0, feeSplits, interestSplits); + if (!total.isZero()) { + createAssetAccountSplit(assetAccountSplit, s0); + assetAccountSplit.setValue(-total); - if (!d->m_parent->setupPrice(t, assetAccountSplit)) - return false; + if (!d->m_parent->setupPrice(t, assetAccountSplit)) + return false; + } return true; } diff --git a/kmymoney/dialogs/investtransactioneditor.h b/kmymoney/dialogs/investtransactioneditor.h --- a/kmymoney/dialogs/investtransactioneditor.h +++ b/kmymoney/dialogs/investtransactioneditor.h @@ -75,7 +75,7 @@ bool fixTransactionCommodity(const MyMoneyAccount& /* account */) override; - void totalAmount(MyMoneyMoney& amount) const; + MyMoneyMoney totalAmount() const; bool setupPrice(const MyMoneyTransaction& t, MyMoneySplit& split); diff --git a/kmymoney/dialogs/investtransactioneditor.cpp b/kmymoney/dialogs/investtransactioneditor.cpp --- a/kmymoney/dialogs/investtransactioneditor.cpp +++ b/kmymoney/dialogs/investtransactioneditor.cpp @@ -868,17 +868,19 @@ } -void InvestTransactionEditor::totalAmount(MyMoneyMoney& amount) const +MyMoneyMoney InvestTransactionEditor::totalAmount() const { + MyMoneyMoney amount; + auto activityCombo = dynamic_cast(haveWidget("activity")); auto sharesEdit = dynamic_cast(haveWidget("shares")); auto priceEdit = dynamic_cast(haveWidget("price")); auto feesEdit = dynamic_cast(haveWidget("fee-amount")); auto interestEdit = dynamic_cast(haveWidget("interest-amount")); if (!activityCombo || !sharesEdit || !priceEdit || !feesEdit || !interestEdit) - return; + return amount; if (priceMode() == eDialogs::PriceMode::PricePerTransaction) amount = priceEdit->value().abs(); @@ -911,17 +913,16 @@ } amount += (interest * factor); } + return amount; } void InvestTransactionEditor::slotUpdateTotalAmount() { Q_D(InvestTransactionEditor); auto total = dynamic_cast(haveWidget("total")); if (total && total->isVisible()) { - MyMoneyMoney amount; - totalAmount(amount); - total->setText(amount.convert(d->m_currency.smallestAccountFraction(), d->m_security.roundingMethod()) + total->setText(totalAmount().convert(d->m_currency.smallestAccountFraction(), d->m_security.roundingMethod()) .formatMoney(d->m_currency.tradingSymbol(), MyMoneyMoney::denomToPrec(d->m_currency.smallestAccountFraction()))); } }