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)