diff --git a/kmymoney/dialogs/investactivities.cpp b/kmymoney/dialogs/investactivities.cpp --- a/kmymoney/dialogs/investactivities.cpp +++ b/kmymoney/dialogs/investactivities.cpp @@ -455,12 +455,23 @@ 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 to be saved without specifying a brokerage + // account, when the proceeds equal the fees. This will handle sales + // made solely to cover annual account fees, where there is no money + // transferred. + if (rc) { + if (!d->m_parent->totalAmount().isZero()) { + rc &= haveAssetAccount(); + } + } return rc; } @@ -516,13 +527,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 @@ -819,17 +819,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(); @@ -862,17 +864,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()))); } }