diff --git a/kmymoney/mymoney/mymoneytransactionfilter.h b/kmymoney/mymoney/mymoneytransactionfilter.h --- a/kmymoney/mymoney/mymoneytransactionfilter.h +++ b/kmymoney/mymoney/mymoneytransactionfilter.h @@ -295,6 +295,8 @@ void setConsiderCategory(const bool check = true); + void setTreatTransfersAsIncomeExpense(const bool check = true); + /** * This method is to avoid returning matching splits list * if only its count is needed @@ -498,6 +500,12 @@ */ bool isInvertingText() const; + /** + * This method returns whether transfers should be treated as + * income/expense transactions or not + */ + bool treatTransfersAsIncomeExpense() const; + /** * This method translates a plain-language date range into QDate * start & end diff --git a/kmymoney/mymoney/mymoneytransactionfilter.cpp b/kmymoney/mymoney/mymoneytransactionfilter.cpp --- a/kmymoney/mymoney/mymoneytransactionfilter.cpp +++ b/kmymoney/mymoney/mymoneytransactionfilter.cpp @@ -49,6 +49,7 @@ : m_reportAllSplits(false) , m_considerCategory(false) , m_matchOnly(false) + , m_treatTransfersAsIncomeExpense(false) , m_matchingSplitsCount(0) , m_invertText(false) { @@ -59,6 +60,7 @@ bool m_reportAllSplits; bool m_considerCategory; bool m_matchOnly; + bool m_treatTransfersAsIncomeExpense; uint m_matchingSplitsCount; @@ -271,6 +273,18 @@ d->m_considerCategory = check; } +void MyMoneyTransactionFilter::setTreatTransfersAsIncomeExpense(const bool check) +{ + Q_D(MyMoneyTransactionFilter); + d->m_treatTransfersAsIncomeExpense = check; +} + +bool MyMoneyTransactionFilter::treatTransfersAsIncomeExpense() const +{ + Q_D(const MyMoneyTransactionFilter); + return d->m_treatTransfersAsIncomeExpense; +} + uint MyMoneyTransactionFilter::matchingSplitsCount(const MyMoneyTransaction& transaction) { Q_D(MyMoneyTransactionFilter); @@ -593,16 +607,15 @@ int MyMoneyTransactionFilter::splitType(const MyMoneyTransaction& t, const MyMoneySplit& split, const MyMoneyAccount& acc) const { - qDebug() << "SplitType"; + Q_D(const MyMoneyTransactionFilter); if (acc.isIncomeExpense()) return (int)eMyMoney::TransactionFilter::Type::All; - if (t.splitCount() == 2) { + if (t.splitCount() == 2 && !d->m_treatTransfersAsIncomeExpense) { const auto& splits = t.splits(); const auto file = MyMoneyFile::instance(); const auto& a = splits.at(0).id().compare(split.id()) == 0 ? acc : file->account(splits.at(0).accountId()); const auto& b = splits.at(1).id().compare(split.id()) == 0 ? acc : file->account(splits.at(1).accountId()); - qDebug() << "first split: " << splits.at(0).accountId() << "second split: " << splits.at(1).accountId(); if (!a.isIncomeExpense() && !b.isIncomeExpense()) return (int)eMyMoney::TransactionFilter::Type::Transfers; diff --git a/kmymoney/plugins/views/reports/core/querytable.cpp b/kmymoney/plugins/views/reports/core/querytable.cpp --- a/kmymoney/plugins/views/reports/core/querytable.cpp +++ b/kmymoney/plugins/views/reports/core/querytable.cpp @@ -487,17 +487,20 @@ case eMyMoney::Report::RowType::Category: case eMyMoney::Report::RowType::TopCategory: use_summary = false; - use_transfers = false; + use_transfers = report.isIncludingTransfers(); + report.setTreatTransfersAsIncomeExpense(use_transfers); hide_details = false; break; case eMyMoney::Report::RowType::Payee: use_summary = false; - use_transfers = false; + use_transfers = report.isIncludingTransfers(); + report.setTreatTransfersAsIncomeExpense(use_transfers); hide_details = (m_config.detailLevel() == eMyMoney::Report::DetailLevel::None); break; case eMyMoney::Report::RowType::Tag: use_summary = false; - use_transfers = false; + use_transfers = report.isIncludingTransfers(); + report.setTreatTransfersAsIncomeExpense(use_transfers); hide_details = (m_config.detailLevel() == eMyMoney::Report::DetailLevel::None); tag_special_case = true; break; @@ -556,7 +559,10 @@ myBegin = it_split; if ((myBegin == splits.end()) && ! splitAcc.isIncomeExpense()) { - myBegin = it_split; + // continue if split references an unselected account + if (report.includesAccount(splitAcc.id())) { + myBegin = it_split; + } } } diff --git a/kmymoney/plugins/views/reports/kreportconfigurationfilterdlg.cpp b/kmymoney/plugins/views/reports/kreportconfigurationfilterdlg.cpp --- a/kmymoney/plugins/views/reports/kreportconfigurationfilterdlg.cpp +++ b/kmymoney/plugins/views/reports/kreportconfigurationfilterdlg.cpp @@ -298,6 +298,8 @@ eMyMoney::Report::DetailLevel::None : eMyMoney::Report::DetailLevel::All); d->m_currentState.setHideTransactions(d->m_tabRowColQuery->ui->m_checkHideTransactions->isChecked()); d->m_currentState.setShowingColumnTotals(!d->m_tabRowColQuery->ui->m_checkHideTotals->isChecked()); + + d->m_currentState.setIncludingTransfers(d->m_tabRowColQuery->ui->m_checkTransfers->isChecked()); } if (d->m_tabChart) { @@ -530,6 +532,7 @@ d->m_tabRowColQuery->ui->m_checkHideSplitDetails->setChecked (d->m_initialState.detailLevel() == eMyMoney::Report::DetailLevel::None || d->m_initialState.isHideTransactions()); + d->m_tabRowColQuery->ui->m_checkTransfers->setChecked(d->m_initialState.isIncludingTransfers()); } if (d->m_tabChart) { diff --git a/kmymoney/plugins/views/reports/reporttabrowcolquery.ui b/kmymoney/plugins/views/reports/reporttabrowcolquery.ui --- a/kmymoney/plugins/views/reports/reporttabrowcolquery.ui +++ b/kmymoney/plugins/views/reports/reporttabrowcolquery.ui @@ -394,6 +394,13 @@ + + + + Include transfers + + + diff --git a/kmymoney/plugins/xmlhelper/xmlstoragehelper.cpp b/kmymoney/plugins/xmlhelper/xmlstoragehelper.cpp --- a/kmymoney/plugins/xmlhelper/xmlstoragehelper.cpp +++ b/kmymoney/plugins/xmlhelper/xmlstoragehelper.cpp @@ -759,6 +759,7 @@ report.setLoansOnly(node.attribute(attributeName(Attribute::Report::Loans), "0").toUInt()); report.setHideTransactions(node.attribute(attributeName(Attribute::Report::HideTransactions), "0").toUInt()); report.setShowingColumnTotals(node.attribute(attributeName(Attribute::Report::ShowColumnTotals), "1").toUInt()); + report.setIncludingTransfers(node.attribute(attributeName(Attribute::Report::IncludesTransfers), "0").toUInt()); const auto detailLevelFromXML = stringToDetailLevel(node.attribute(attributeName(Attribute::Report::Detail), "none")); if (detailLevelFromXML == eMyMoney::Report::DetailLevel::All) report.setDetailLevel(detailLevelFromXML); @@ -866,7 +867,7 @@ if (report.reportType() == eMyMoney::Report::ReportType::PivotTable) el.setAttribute(attributeName(Attribute::Report::Type), "pivottable 1.15"); else if (report.reportType() == eMyMoney::Report::ReportType::QueryTable) - el.setAttribute(attributeName(Attribute::Report::Type), "querytable 1.14"); + el.setAttribute(attributeName(Attribute::Report::Type), "querytable 1.15"); else if (report.reportType() == eMyMoney::Report::ReportType::InfoTable) el.setAttribute(attributeName(Attribute::Report::Type), "infotable 1.0"); @@ -944,6 +945,7 @@ el.setAttribute(attributeName(Attribute::Report::HideTransactions), report.isHideTransactions()); el.setAttribute(attributeName(Attribute::Report::ShowColumnTotals), report.isShowingColumnTotals()); el.setAttribute(attributeName(Attribute::Report::Detail), reportNames(report.detailLevel())); + el.setAttribute(attributeName(Attribute::Report::IncludesTransfers), report.isIncludingTransfers()); // write performance tab if (report.queryColumns() & eMyMoney::Report::QueryColumn::Performance || report.queryColumns() & eMyMoney::Report::QueryColumn::CapitalGain)