1 /***************************************************************************
2                           kreportconfigurationdlg.cpp  -  description
3                              -------------------
4     begin                : Mon Jun 21 2004
5     copyright            : (C) 2000-2004 by Michael Edwardes
6     email                : mte@users.sourceforge.net
7                            Javier Campos Morales <javi_c@users.sourceforge.net>
8                            Felix Rodriguez <frodriguez@users.sourceforge.net>
9                            John C <thetacoturtle@users.sourceforge.net>
10                            Thomas Baumgart <ipwizard@users.sourceforge.net>
11                            Kevin Tambascio <ktambascio@users.sourceforge.net>
12                            Ace Jones <ace.j@hotpop.com>
13                            (C) 2017, 2018 by Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
14                            2018 by Michael Kiefer <Michael-Kiefer@web.de>
15  ***************************************************************************/
16 
17 /***************************************************************************
18  *                                                                         *
19  *   This program is free software; you can redistribute it and/or modify  *
20  *   it under the terms of the GNU General Public License as published by  *
21  *   the Free Software Foundation; either version 2 of the License, or     *
22  *   (at your option) any later version.                                   *
23  *                                                                         *
24  ***************************************************************************/
25 
26 #include "kreportconfigurationfilterdlg.h"
27 
28 // ----------------------------------------------------------------------------
29 // QT Includes
30 
31 #include <QPushButton>
32 
33 // ----------------------------------------------------------------------------
34 // KDE Includes
35 
36 #include <KHelpClient>
37 #include <KLocalizedString>
38 
39 // ----------------------------------------------------------------------------
40 // Project Includes
41 
42 #include "ktransactionfilter.h"
43 #include "kmymoneyaccountselector.h"
44 #include "mymoneyfile.h"
45 #include "mymoneyexception.h"
46 #include "mymoneybudget.h"
47 #include "mymoneyreport.h"
48 #include "daterangedlg.h"
49 #include "reporttabimpl.h"
50 #include "mymoneyenums.h"
51 
52 #include <ui_kreportconfigurationfilterdlg.h>
53 #include <ui_reporttabgeneral.h>
54 #include <ui_reporttabrowcolpivot.h>
55 #include <ui_reporttabrowcolquery.h>
56 #include <ui_reporttabchart.h>
57 #include <ui_reporttabrange.h>
58 #include <ui_reporttabcapitalgain.h>
59 #include <ui_reporttabperformance.h>
60 
61 class KReportConfigurationFilterDlgPrivate
62 {
63   Q_DISABLE_COPY(KReportConfigurationFilterDlgPrivate)
64 
65 public:
KReportConfigurationFilterDlgPrivate(KReportConfigurationFilterDlg * qq)66   KReportConfigurationFilterDlgPrivate(KReportConfigurationFilterDlg *qq) :
67     q_ptr(qq),
68     ui(new Ui::KReportConfigurationFilterDlg),
69     m_tabRowColPivot(nullptr),
70     m_tabRowColQuery(nullptr),
71     m_tabChart(nullptr),
72     m_tabRange(nullptr),
73     m_dateRange(nullptr)
74   {
75   }
76 
~KReportConfigurationFilterDlgPrivate()77   ~KReportConfigurationFilterDlgPrivate()
78   {
79     delete ui;
80   }
81 
82   KReportConfigurationFilterDlg      *q_ptr;
83   Ui::KReportConfigurationFilterDlg  *ui;
84 
85   QPointer<ReportTabGeneral>     m_tabGeneral;
86   QPointer<ReportTabRowColPivot> m_tabRowColPivot;
87   QPointer<ReportTabRowColQuery> m_tabRowColQuery;
88   QPointer<ReportTabChart>       m_tabChart;
89   QPointer<ReportTabRange>       m_tabRange;
90   QPointer<ReportTabCapitalGain> m_tabCapitalGain;
91   QPointer<ReportTabPerformance> m_tabPerformance;
92   QPointer<KTransactionFilter>           m_tabFilters;
93 
94   MyMoneyReport m_initialState;
95   MyMoneyReport m_currentState;
96   QVector<MyMoneyBudget> m_budgets;
97   DateRangeDlg                    *m_dateRange;
98 };
99 
KReportConfigurationFilterDlg(MyMoneyReport report,QWidget * parent)100 KReportConfigurationFilterDlg::KReportConfigurationFilterDlg(MyMoneyReport report, QWidget *parent) :
101   QDialog(parent),
102   d_ptr(new KReportConfigurationFilterDlgPrivate(this))
103 {
104   Q_D(KReportConfigurationFilterDlg);
105 
106   d->ui->setupUi(this);
107   d->m_initialState = report;
108   d->m_currentState = report;
109 
110   //
111   // Rework labeling
112   //
113 
114   setWindowTitle(i18n("Report Configuration"));
115   //
116   // Rework the buttons
117   //
118 
119   // the Apply button is always enabled
120   d->ui->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true);
121   d->ui->buttonBox->button(QDialogButtonBox::Apply)->setToolTip(i18nc("@info:tooltip for report configuration apply button", "Apply the configuration changes to the report"));
122 
123 
124   connect(d->ui->buttonBox->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, this, &KReportConfigurationFilterDlg::slotSearch);
125   connect(d->ui->buttonBox->button(QDialogButtonBox::Close), &QAbstractButton::clicked, this, &QDialog::close);
126   connect(d->ui->buttonBox->button(QDialogButtonBox::Reset), &QAbstractButton::clicked, this, &KReportConfigurationFilterDlg::slotReset);
127   connect(d->ui->buttonBox->button(QDialogButtonBox::Help), &QAbstractButton::clicked, this, &KReportConfigurationFilterDlg::slotShowHelp);
128 
129   //
130   // Add new tabs
131   //
132   if (d->m_initialState.reportType() == eMyMoney::Report::ReportType::PivotTable) {
133     // we will use date range together with data range
134     d->m_tabFilters = new KTransactionFilter(this, (report.rowType() == eMyMoney::Report::RowType::Account), false, false);
135   } else {
136     d->m_tabFilters = new KTransactionFilter(this, (report.rowType() == eMyMoney::Report::RowType::Account), report.isInvestmentsOnly());
137     d->m_dateRange = d->m_tabFilters->dateRange();
138   }
139 
140   d->ui->m_tabWidget->addTab(d->m_tabFilters, i18nc("Filters tab", "Filters"));
141 
142   d->m_tabGeneral = new ReportTabGeneral(d->ui->m_criteriaTab);
143   d->ui->m_criteriaTab->insertTab(0, d->m_tabGeneral, i18nc("General tab", "General"));
144 
145   if (d->m_initialState.reportType() == eMyMoney::Report::ReportType::PivotTable) {
146     int tabNr = 1;
147     if (!(d->m_initialState.isIncludingPrice() || d->m_initialState.isIncludingAveragePrice())) {
148       d->m_tabRowColPivot = new ReportTabRowColPivot(d->ui->m_criteriaTab);
149       d->ui->m_criteriaTab->insertTab(tabNr++, d->m_tabRowColPivot, i18n("Rows/Columns"));
150       connect(d->m_tabRowColPivot->ui->m_comboRows, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, static_cast<void (KReportConfigurationFilterDlg::*)(int)>(&KReportConfigurationFilterDlg::slotRowTypeChanged));
151       connect(d->m_tabRowColPivot->ui->m_comboRows, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, static_cast<void (KReportConfigurationFilterDlg::*)(int)>(&KReportConfigurationFilterDlg::slotUpdateColumnsCombo));
152       //control the state of the includeTransfer check
153       connect(d->m_tabFilters->categoriesView(), &KMyMoneySelector::stateChanged, this, &KReportConfigurationFilterDlg::slotUpdateCheckTransfers);
154     }
155 
156     d->m_tabChart = new ReportTabChart(d->ui->m_criteriaTab);
157     d->ui->m_criteriaTab->insertTab(tabNr++, d->m_tabChart, i18n("Chart"));
158 
159     d->m_tabRange = new ReportTabRange(d->ui->m_criteriaTab);
160     d->ui->m_criteriaTab->insertTab(tabNr++, d->m_tabRange, i18n("Range"));
161 
162     d->m_dateRange = d->m_tabRange->m_dateRange;
163 
164     if (!(d->m_initialState.isIncludingPrice() || d->m_initialState.isIncludingAveragePrice())) {
165       connect(d->m_tabRange->ui->m_comboColumns, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, &KReportConfigurationFilterDlg::slotColumnTypeChanged);
166       connect(d->m_tabRange->ui->m_comboColumns, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, static_cast<void (KReportConfigurationFilterDlg::*)(int)>(&KReportConfigurationFilterDlg::slotUpdateColumnsCombo));
167     }
168     connect(d->m_tabChart->ui->m_logYaxis, &QCheckBox::stateChanged, this, &KReportConfigurationFilterDlg::slotLogAxisChanged);
169     connect(d->m_tabChart->ui->m_negExpenses, &QCheckBox::stateChanged, this, &KReportConfigurationFilterDlg::slotNegExpensesChanged);
170   } else if (d->m_initialState.reportType() == eMyMoney::Report::ReportType::QueryTable) {
171     // eInvestmentHoldings is a special-case report, and you cannot configure the
172     // rows & columns of that report.
173     if (d->m_initialState.rowType() < eMyMoney::Report::RowType::AccountByTopAccount) {
174       d->m_tabRowColQuery = new ReportTabRowColQuery(d->ui->m_criteriaTab);
175       d->ui->m_criteriaTab->insertTab(1, d->m_tabRowColQuery, i18n("Rows/Columns"));
176     }
177     if (d->m_initialState.queryColumns() & eMyMoney::Report::QueryColumn::CapitalGain) {
178       d->m_tabCapitalGain = new ReportTabCapitalGain(d->ui->m_criteriaTab);
179       d->ui->m_criteriaTab->insertTab(1, d->m_tabCapitalGain, i18n("Report"));
180     }
181     if (d->m_initialState.queryColumns() & eMyMoney::Report::QueryColumn::Performance) {
182       d->m_tabPerformance = new ReportTabPerformance(d->ui->m_criteriaTab);
183       d->ui->m_criteriaTab->insertTab(1, d->m_tabPerformance, i18n("Report"));
184     }
185   }
186 
187   d->ui->m_criteriaTab->setCurrentIndex(d->ui->m_criteriaTab->indexOf(d->m_tabGeneral));
188   d->ui->m_criteriaTab->setMinimumSize(500, 200);
189 
190   QList<MyMoneyBudget> list = MyMoneyFile::instance()->budgetList();
191   QList<MyMoneyBudget>::const_iterator it_b;
192   for (it_b = list.constBegin(); it_b != list.constEnd(); ++it_b) {
193     d->m_budgets.push_back(*it_b);
194   }
195 
196   //
197   // Now set up the widgets with proper values
198   //
199   slotReset();
200 }
201 
~KReportConfigurationFilterDlg()202 KReportConfigurationFilterDlg::~KReportConfigurationFilterDlg()
203 {
204 }
205 
getConfig() const206 MyMoneyReport KReportConfigurationFilterDlg::getConfig() const
207 {
208   Q_D(const KReportConfigurationFilterDlg);
209   return d->m_currentState;
210 }
211 
slotSearch()212 void KReportConfigurationFilterDlg::slotSearch()
213 {
214   Q_D(KReportConfigurationFilterDlg);
215   // setup the filter from the dialog widgets
216   auto filter = d->m_tabFilters->setupFilter();
217 
218   // Copy the m_filter over to the filter part of m_currentConfig.
219   d->m_currentState.assignFilter(filter);
220 
221   // Then extract the report properties
222   d->m_currentState.setName(d->m_tabGeneral->ui->m_editName->text());
223   d->m_currentState.setComment(d->m_tabGeneral->ui->m_editComment->text());
224   d->m_currentState.setConvertCurrency(d->m_tabGeneral->ui->m_checkCurrency->isChecked());
225   d->m_currentState.setFavorite(d->m_tabGeneral->ui->m_checkFavorite->isChecked());
226   d->m_currentState.setSkipZero(d->m_tabGeneral->ui->m_skipZero->isChecked());
227 
228   if (d->m_tabRowColPivot) {
229     eMyMoney::Report::DetailLevel dl[4] = { eMyMoney::Report::DetailLevel::All, eMyMoney::Report::DetailLevel::Top, eMyMoney::Report::DetailLevel::Group, eMyMoney::Report::DetailLevel::Total };
230 
231     d->m_currentState.setDetailLevel(dl[d->m_tabRowColPivot->ui->m_comboDetail->currentIndex()]);
232 
233     // modify the rowtype only if the widget is enabled
234     if (d->m_tabRowColPivot->ui->m_comboRows->isEnabled()) {
235       eMyMoney::Report::RowType rt[2] = { eMyMoney::Report::RowType::ExpenseIncome, eMyMoney::Report::RowType::AssetLiability };
236       d->m_currentState.setRowType(rt[d->m_tabRowColPivot->ui->m_comboRows->currentIndex()]);
237     }
238 
239     d->m_currentState.setShowingRowTotals(false);
240     if (d->m_tabRowColPivot->ui->m_comboRows->currentIndex() == 0)
241       d->m_currentState.setShowingRowTotals(d->m_tabRowColPivot->ui->m_checkTotalColumn->isChecked());
242 
243     d->m_currentState.setShowingColumnTotals(d->m_tabRowColPivot->ui->m_checkTotalRow->isChecked());
244     d->m_currentState.setIncludingSchedules(d->m_tabRowColPivot->ui->m_checkScheduled->isChecked());
245 
246     d->m_currentState.setIncludingTransfers(d->m_tabRowColPivot->ui->m_checkTransfers->isChecked());
247 
248     d->m_currentState.setIncludingUnusedAccounts(d->m_tabRowColPivot->ui->m_checkUnused->isChecked());
249 
250     if (d->m_tabRowColPivot->ui->m_comboBudget->isEnabled()) {
251       d->m_currentState.setBudget(d->m_budgets[d->m_tabRowColPivot->ui->m_comboBudget->currentItem()].id(), d->m_initialState.rowType() == eMyMoney::Report::RowType::BudgetActual);
252     } else {
253       d->m_currentState.setBudget(QString(), false);
254     }
255 
256     //set moving average days
257     if (d->m_tabRowColPivot->ui->m_movingAverageDays->isEnabled()) {
258       d->m_currentState.setMovingAverageDays(d->m_tabRowColPivot->ui->m_movingAverageDays->value());
259     }
260   } else if (d->m_tabRowColQuery) {
261     eMyMoney::Report::RowType rtq[8] = { eMyMoney::Report::RowType::Category, eMyMoney::Report::RowType::TopCategory, eMyMoney::Report::RowType::Tag, eMyMoney::Report::RowType::Payee, eMyMoney::Report::RowType::Account, eMyMoney::Report::RowType::TopAccount, eMyMoney::Report::RowType::Month, eMyMoney::Report::RowType::Week };
262     d->m_currentState.setRowType(rtq[d->m_tabRowColQuery->ui->m_comboOrganizeBy->currentIndex()]);
263 
264     unsigned qc = eMyMoney::Report::QueryColumn::None;
265 
266     if (d->m_currentState.queryColumns() & eMyMoney::Report::QueryColumn::Loan)
267       // once a loan report, always a loan report
268       qc = eMyMoney::Report::QueryColumn::Loan;
269 
270     if (d->m_tabRowColQuery->ui->m_checkNumber->isChecked())
271       qc |= eMyMoney::Report::QueryColumn::Number;
272     if (d->m_tabRowColQuery->ui->m_checkPayee->isChecked())
273       qc |= eMyMoney::Report::QueryColumn::Payee;
274     if (d->m_tabRowColQuery->ui->m_checkTag->isChecked())
275       qc |= eMyMoney::Report::QueryColumn::Tag;
276     if (d->m_tabRowColQuery->ui->m_checkCategory->isChecked())
277       qc |= eMyMoney::Report::QueryColumn::Category;
278     if (d->m_tabRowColQuery->ui->m_checkMemo->isChecked())
279       qc |= eMyMoney::Report::QueryColumn::Memo;
280     if (d->m_tabRowColQuery->ui->m_checkAccount->isChecked())
281       qc |= eMyMoney::Report::QueryColumn::Account;
282     if (d->m_tabRowColQuery->ui->m_checkReconciled->isChecked())
283       qc |= eMyMoney::Report::QueryColumn::Reconciled;
284     if (d->m_tabRowColQuery->ui->m_checkAction->isChecked())
285       qc |= eMyMoney::Report::QueryColumn::Action;
286     if (d->m_tabRowColQuery->ui->m_checkShares->isChecked())
287       qc |= eMyMoney::Report::QueryColumn::Shares;
288     if (d->m_tabRowColQuery->ui->m_checkPrice->isChecked())
289       qc |= eMyMoney::Report::QueryColumn::Price;
290     if (d->m_tabRowColQuery->ui->m_checkBalance->isChecked())
291       qc |= eMyMoney::Report::QueryColumn::Balance;
292 
293     d->m_currentState.setQueryColumns(static_cast<eMyMoney::Report::QueryColumn>(qc));
294 
295     d->m_currentState.setTax(d->m_tabRowColQuery->ui->m_checkTax->isChecked());
296     d->m_currentState.setInvestmentsOnly(d->m_tabRowColQuery->ui->m_checkInvestments->isChecked());
297     d->m_currentState.setLoansOnly(d->m_tabRowColQuery->ui->m_checkLoans->isChecked());
298 
299     d->m_currentState.setDetailLevel(d->m_tabRowColQuery->ui->m_checkHideSplitDetails->isChecked() ?
300                                   eMyMoney::Report::DetailLevel::None : eMyMoney::Report::DetailLevel::All);
301     d->m_currentState.setHideTransactions(d->m_tabRowColQuery->ui->m_checkHideTransactions->isChecked());
302     d->m_currentState.setShowingColumnTotals(!d->m_tabRowColQuery->ui->m_checkHideTotals->isChecked());
303 
304     d->m_currentState.setIncludingTransfers(d->m_tabRowColQuery->ui->m_checkTransfers->isChecked());
305   }
306 
307   if (d->m_tabChart) {
308     eMyMoney::Report::ChartType ct[5] = { eMyMoney::Report::ChartType::Line, eMyMoney::Report::ChartType::Bar, eMyMoney::Report::ChartType::StackedBar, eMyMoney::Report::ChartType::Pie, eMyMoney::Report::ChartType::Ring };
309     eMyMoney::Report::ChartPalette cp[4] = { eMyMoney::Report::ChartPalette::Application, eMyMoney::Report::ChartPalette::Default, eMyMoney::Report::ChartPalette::Rainbow, eMyMoney::Report::ChartPalette::Subdued };
310     d->m_currentState.setChartType(ct[d->m_tabChart->ui->m_comboType->currentIndex()]);
311     d->m_currentState.setChartPalette(cp[d->m_tabChart->ui->m_comboPalette->currentIndex()]);
312     d->m_currentState.setChartCHGridLines(d->m_tabChart->ui->m_checkCHGridLines->isChecked());
313     d->m_currentState.setChartSVGridLines(d->m_tabChart->ui->m_checkSVGridLines->isChecked());
314     d->m_currentState.setChartDataLabels(d->m_tabChart->ui->m_checkValues->isChecked());
315     d->m_currentState.setChartByDefault(d->m_tabChart->ui->m_checkShowChart->isChecked());
316     d->m_currentState.setChartLineWidth(d->m_tabChart->ui->m_lineWidth->value());
317     d->m_currentState.setLogYAxis(d->m_tabChart->ui->m_logYaxis->isChecked());
318     d->m_currentState.setNegExpenses(d->m_tabChart->ui->m_negExpenses->isChecked());
319   }
320 
321   if (d->m_tabRange) {
322     d->m_currentState.setDataRangeStart(d->m_tabRange->ui->m_dataRangeStart->text());
323     d->m_currentState.setDataRangeEnd(d->m_tabRange->ui->m_dataRangeEnd->text());
324     d->m_currentState.setDataMajorTick(d->m_tabRange->ui->m_dataMajorTick->text());
325     d->m_currentState.setDataMinorTick(d->m_tabRange->ui->m_dataMinorTick->text());
326     d->m_currentState.setYLabelsPrecision(d->m_tabRange->ui->m_yLabelsPrecision->value());
327     d->m_currentState.setDataFilter((eMyMoney::Report::DataLock)d->m_tabRange->ui->m_dataLock->currentIndex());
328 
329     eMyMoney::Report::ColumnType ct[6] = { eMyMoney::Report::ColumnType::Days, eMyMoney::Report::ColumnType::Weeks, eMyMoney::Report::ColumnType::Months, eMyMoney::Report::ColumnType::BiMonths, eMyMoney::Report::ColumnType::Quarters, eMyMoney::Report::ColumnType::Years };
330     bool dy[6] = { true, true, false, false, false, false };
331     d->m_currentState.setColumnType(ct[d->m_tabRange->ui->m_comboColumns->currentIndex()]);
332 
333     //TODO (Ace) This should be implicit in the call above.  MMReport needs fixin'
334     d->m_currentState.setColumnsAreDays(dy[d->m_tabRange->ui->m_comboColumns->currentIndex()]);
335     d->m_currentState.setDateFilter(d->m_dateRange->fromDate(), d->m_dateRange->toDate());
336   }
337 
338   // setup the date lock
339   eMyMoney::TransactionFilter::Date range = d->m_dateRange->dateRange();
340   d->m_currentState.setDateFilter(range);
341 
342   if (d->m_tabCapitalGain) {
343     d->m_currentState.setTermSeparator(d->m_tabCapitalGain->ui->m_termSeparator->date());
344     d->m_currentState.setShowSTLTCapitalGains(d->m_tabCapitalGain->ui->m_showSTLTCapitalGains->isChecked());
345     d->m_currentState.setSettlementPeriod(d->m_tabCapitalGain->ui->m_settlementPeriod->value());
346     d->m_currentState.setShowingColumnTotals(!d->m_tabCapitalGain->ui->m_checkHideTotals->isChecked());
347     d->m_currentState.setInvestmentSum(static_cast<eMyMoney::Report::InvestmentSum>(d->m_tabCapitalGain->ui->m_investmentSum->currentData().toInt()));
348   }
349 
350   if (d->m_tabPerformance) {
351     d->m_currentState.setShowingColumnTotals(!d->m_tabPerformance->ui->m_checkHideTotals->isChecked());
352     d->m_currentState.setInvestmentSum(static_cast<eMyMoney::Report::InvestmentSum>(d->m_tabPerformance->ui->m_investmentSum->currentData().toInt()));
353   }
354 
355   done(true);
356 }
357 
slotRowTypeChanged(int row)358 void KReportConfigurationFilterDlg::slotRowTypeChanged(int row)
359 {
360   Q_D(KReportConfigurationFilterDlg);
361   d->m_tabRowColPivot->ui->m_checkTotalColumn->setEnabled(row == 0);
362 }
363 
slotColumnTypeChanged(int row)364 void KReportConfigurationFilterDlg::slotColumnTypeChanged(int row)
365 {
366   Q_D(KReportConfigurationFilterDlg);
367   if ((d->m_tabRowColPivot->ui->m_comboBudget->isEnabled() && row < 2)) {
368     d->m_tabRange->ui->m_comboColumns->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false);
369   }
370 }
371 
slotUpdateColumnsCombo()372 void KReportConfigurationFilterDlg::slotUpdateColumnsCombo()
373 {
374   Q_D(KReportConfigurationFilterDlg);
375   const int monthlyIndex = 2;
376   const int incomeExpenseIndex = 0;
377   const bool isIncomeExpenseForecast = d->m_currentState.isIncludingForecast() && d->m_tabRowColPivot->ui->m_comboRows->currentIndex() == incomeExpenseIndex;
378   if (isIncomeExpenseForecast && d->m_tabRange->ui->m_comboColumns->currentIndex() != monthlyIndex) {
379     d->m_tabRange->ui->m_comboColumns->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false);
380   }
381 }
382 
slotUpdateColumnsCombo(int)383 void KReportConfigurationFilterDlg::slotUpdateColumnsCombo(int)
384 {
385   slotUpdateColumnsCombo();
386 }
387 
slotLogAxisChanged(int state)388 void KReportConfigurationFilterDlg::slotLogAxisChanged(int state)
389 {
390   Q_D(KReportConfigurationFilterDlg);
391   if (state == Qt::Checked)
392     d->m_tabRange->setRangeLogarythmic(true);
393   else
394     d->m_tabRange->setRangeLogarythmic(false);
395 }
396 
slotNegExpensesChanged(int state)397 void KReportConfigurationFilterDlg::slotNegExpensesChanged(int state)
398 {
399   Q_D(KReportConfigurationFilterDlg);
400   d->m_tabChart->setNegExpenses(state == Qt::Checked);
401 }
402 
slotReset()403 void KReportConfigurationFilterDlg::slotReset()
404 {
405   Q_D(KReportConfigurationFilterDlg);
406   //
407   // Set up the widget from the initial filter
408   //
409   d->m_currentState = d->m_initialState;
410 
411   //
412   // Report Properties
413   //
414 
415   d->m_tabGeneral->ui->m_editName->setText(d->m_initialState.name());
416   d->m_tabGeneral->ui->m_editComment->setText(d->m_initialState.comment());
417   d->m_tabGeneral->ui->m_checkCurrency->setChecked(d->m_initialState.isConvertCurrency());
418   d->m_tabGeneral->ui->m_checkFavorite->setChecked(d->m_initialState.isFavorite());
419 
420   if (d->m_initialState.isIncludingPrice() || d->m_initialState.isSkippingZero()) {
421     d->m_tabGeneral->ui->m_skipZero->setChecked(d->m_initialState.isSkippingZero());
422   } else {
423     d->m_tabGeneral->ui->m_skipZero->setEnabled(false);
424   }
425 
426   if (d->m_tabRowColPivot) {
427     KComboBox *combo = d->m_tabRowColPivot->ui->m_comboDetail;
428     switch (d->m_initialState.detailLevel()) {
429       case eMyMoney::Report::DetailLevel::None:
430       case eMyMoney::Report::DetailLevel::End:
431       case eMyMoney::Report::DetailLevel::All:
432         combo->setCurrentItem(i18nc("All accounts", "All"), false);
433         break;
434       case eMyMoney::Report::DetailLevel::Top:
435         combo->setCurrentItem(i18n("Top-Level"), false);
436         break;
437       case eMyMoney::Report::DetailLevel::Group:
438         combo->setCurrentItem(i18n("Groups"), false);
439         break;
440       case eMyMoney::Report::DetailLevel::Total:
441         combo->setCurrentItem(i18n("Totals"), false);
442         break;
443     }
444 
445     combo = d->m_tabRowColPivot->ui->m_comboRows;
446     switch (d->m_initialState.rowType()) {
447       case eMyMoney::Report::RowType::ExpenseIncome:
448       case eMyMoney::Report::RowType::Budget:
449       case eMyMoney::Report::RowType::BudgetActual:
450         combo->setCurrentItem(i18n("Income & Expenses"), false); // income / expense
451         break;
452       default:
453         combo->setCurrentItem(i18n("Assets & Liabilities"), false); // asset / liability
454         break;
455     }
456     d->m_tabRowColPivot->ui->m_checkTotalColumn->setChecked(d->m_initialState.isShowingRowTotals());
457     d->m_tabRowColPivot->ui->m_checkTotalRow->setChecked(d->m_initialState.isShowingColumnTotals());
458 
459     slotRowTypeChanged(combo->currentIndex());
460 
461     //load budgets combo
462     if (d->m_initialState.rowType() == eMyMoney::Report::RowType::Budget
463         || d->m_initialState.rowType() == eMyMoney::Report::RowType::BudgetActual) {
464       d->m_tabRowColPivot->ui->m_comboRows->setEnabled(false);
465       d->m_tabRowColPivot->ui->m_rowsLabel->setEnabled(false);
466       d->m_tabRowColPivot->ui->m_budgetFrame->setEnabled(!d->m_budgets.empty());
467       auto i = 0;
468       for (QVector<MyMoneyBudget>::const_iterator it_b = d->m_budgets.constBegin(); it_b != d->m_budgets.constEnd(); ++it_b) {
469         d->m_tabRowColPivot->ui->m_comboBudget->insertItem((*it_b).name(), i);
470         //set the current selected item
471         if ((d->m_initialState.budget() == "Any" && (*it_b).budgetStart().year() == QDate::currentDate().year())
472             || d->m_initialState.budget() == (*it_b).id())
473           d->m_tabRowColPivot->ui->m_comboBudget->setCurrentItem(i);
474         i++;
475       }
476     }
477 
478     //set moving average days spinbox
479     QSpinBox *spinbox = d->m_tabRowColPivot->ui->m_movingAverageDays;
480     spinbox->setEnabled(d->m_initialState.isIncludingMovingAverage());
481     d->m_tabRowColPivot->ui->m_movingAverageLabel->setEnabled(d->m_initialState.isIncludingMovingAverage());
482 
483     if (d->m_initialState.isIncludingMovingAverage()) {
484       spinbox->setValue(d->m_initialState.movingAverageDays());
485     }
486 
487     d->m_tabRowColPivot->ui->m_checkScheduled->setChecked(d->m_initialState.isIncludingSchedules());
488     d->m_tabRowColPivot->ui->m_checkTransfers->setChecked(d->m_initialState.isIncludingTransfers());
489     d->m_tabRowColPivot->ui->m_checkUnused->setChecked(d->m_initialState.isIncludingUnusedAccounts());
490   } else if (d->m_tabRowColQuery) {
491     KComboBox *combo = d->m_tabRowColQuery->ui->m_comboOrganizeBy;
492     switch (d->m_initialState.rowType()) {
493       case eMyMoney::Report::RowType::NoRows:
494       case eMyMoney::Report::RowType::Category:
495         combo->setCurrentItem(i18n("Categories"), false);
496         break;
497       case eMyMoney::Report::RowType::TopCategory:
498         combo->setCurrentItem(i18n("Top Categories"), false);
499         break;
500       case eMyMoney::Report::RowType::Tag:
501         combo->setCurrentItem(i18n("Tags"), false);
502         break;
503       case eMyMoney::Report::RowType::Payee:
504         combo->setCurrentItem(i18n("Payees"), false);
505         break;
506       case eMyMoney::Report::RowType::Account:
507         combo->setCurrentItem(i18n("Accounts"), false);
508         break;
509       case eMyMoney::Report::RowType::TopAccount:
510         combo->setCurrentItem(i18n("Top Accounts"), false);
511         break;
512       case eMyMoney::Report::RowType::Month:
513         combo->setCurrentItem(i18n("Month"), false);
514         break;
515       case eMyMoney::Report::RowType::Week:
516         combo->setCurrentItem(i18n("Week"), false);
517         break;
518       default:
519         throw MYMONEYEXCEPTION_CSTRING("KReportConfigurationFilterDlg::slotReset(): QueryTable report has invalid rowtype");
520     }
521 
522     unsigned qc = d->m_initialState.queryColumns();
523     d->m_tabRowColQuery->ui->m_checkNumber->setChecked(qc & eMyMoney::Report::QueryColumn::Number);
524     d->m_tabRowColQuery->ui->m_checkPayee->setChecked(qc & eMyMoney::Report::QueryColumn::Payee);
525     d->m_tabRowColQuery->ui->m_checkTag->setChecked(qc & eMyMoney::Report::QueryColumn::Tag);
526     d->m_tabRowColQuery->ui->m_checkCategory->setChecked(qc & eMyMoney::Report::QueryColumn::Category);
527     d->m_tabRowColQuery->ui->m_checkMemo->setChecked(qc & eMyMoney::Report::QueryColumn::Memo);
528     d->m_tabRowColQuery->ui->m_checkAccount->setChecked(qc & eMyMoney::Report::QueryColumn::Account);
529     d->m_tabRowColQuery->ui->m_checkReconciled->setChecked(qc & eMyMoney::Report::QueryColumn::Reconciled);
530     d->m_tabRowColQuery->ui->m_checkAction->setChecked(qc & eMyMoney::Report::QueryColumn::Action);
531     d->m_tabRowColQuery->ui->m_checkShares->setChecked(qc & eMyMoney::Report::QueryColumn::Shares);
532     d->m_tabRowColQuery->ui->m_checkPrice->setChecked(qc & eMyMoney::Report::QueryColumn::Price);
533     d->m_tabRowColQuery->ui->m_checkBalance->setChecked(qc & eMyMoney::Report::QueryColumn::Balance);
534 
535     d->m_tabRowColQuery->ui->m_checkTax->setChecked(d->m_initialState.isTax());
536     d->m_tabRowColQuery->ui->m_checkInvestments->setChecked(d->m_initialState.isInvestmentsOnly());
537     d->m_tabRowColQuery->ui->m_checkLoans->setChecked(d->m_initialState.isLoansOnly());
538 
539     d->m_tabRowColQuery->ui->m_checkHideTransactions->setChecked(d->m_initialState.isHideTransactions());
540     d->m_tabRowColQuery->ui->m_checkHideTotals->setChecked(!d->m_initialState.isShowingColumnTotals());
541     d->m_tabRowColQuery->ui->m_checkHideSplitDetails->setEnabled(!d->m_initialState.isHideTransactions());
542 
543     d->m_tabRowColQuery->ui->m_checkHideSplitDetails->setChecked
544     (d->m_initialState.detailLevel() == eMyMoney::Report::DetailLevel::None || d->m_initialState.isHideTransactions());
545     d->m_tabRowColQuery->ui->m_checkTransfers->setChecked(d->m_initialState.isIncludingTransfers());
546   }
547 
548   if (d->m_tabChart) {
549     KMyMoneyGeneralCombo* combo = d->m_tabChart->ui->m_comboType;
550     switch (d->m_initialState.chartType()) {
551       case eMyMoney::Report::ChartType::None:
552         combo->setCurrentItem(static_cast<int>(eMyMoney::Report::ChartType::Line));
553         break;
554       case eMyMoney::Report::ChartType::Line:
555       case eMyMoney::Report::ChartType::Bar:
556       case eMyMoney::Report::ChartType::StackedBar:
557       case eMyMoney::Report::ChartType::Pie:
558       case eMyMoney::Report::ChartType::Ring:
559         combo->setCurrentItem(static_cast<int>(d->m_initialState.chartType()));
560         break;
561       default:
562         throw MYMONEYEXCEPTION_CSTRING("KReportConfigurationFilterDlg::slotReset(): Report has invalid charttype");
563     }
564     combo = d->m_tabChart->ui->m_comboPalette;
565     switch (d->m_initialState.chartPalette()) {
566       case eMyMoney::Report::ChartPalette::Application:
567       case eMyMoney::Report::ChartPalette::Default:
568       case eMyMoney::Report::ChartPalette::Rainbow:
569       case eMyMoney::Report::ChartPalette::Subdued:
570         combo->setCurrentItem(static_cast<int>(d->m_initialState.chartPalette()));
571         break;
572       default:
573         throw MYMONEYEXCEPTION_CSTRING("KReportConfigurationFilterDlg::slotReset(): Report has invalid chartpalette");
574     }
575     d->m_tabChart->ui->m_checkCHGridLines->setChecked(d->m_initialState.isChartCHGridLines());
576     d->m_tabChart->ui->m_checkSVGridLines->setChecked(d->m_initialState.isChartSVGridLines());
577     d->m_tabChart->ui->m_checkValues->setChecked(d->m_initialState.isChartDataLabels());
578     d->m_tabChart->ui->m_checkShowChart->setChecked(d->m_initialState.isChartByDefault());
579     d->m_tabChart->ui->m_lineWidth->setValue(d->m_initialState.chartLineWidth());
580     d->m_tabChart->ui->m_logYaxis->setChecked(d->m_initialState.isLogYAxis());
581     d->m_tabChart->ui->m_negExpenses->setChecked(d->m_initialState.isNegExpenses());
582   }
583 
584   if (d->m_tabRange) {
585     d->m_tabRange->ui->m_dataRangeStart->setText(d->m_initialState.dataRangeStart());
586     d->m_tabRange->ui->m_dataRangeEnd->setText(d->m_initialState.dataRangeEnd());
587     d->m_tabRange->ui->m_dataMajorTick->setText(d->m_initialState.dataMajorTick());
588     d->m_tabRange->ui->m_dataMinorTick->setText(d->m_initialState.dataMinorTick());
589     d->m_tabRange->ui->m_yLabelsPrecision->setValue(d->m_initialState.yLabelsPrecision());
590     d->m_tabRange->ui->m_dataLock->setCurrentIndex((int)d->m_initialState.dataFilter());
591 
592     KComboBox *combo = d->m_tabRange->ui->m_comboColumns;
593     if (d->m_initialState.isColumnsAreDays()) {
594       switch (d->m_initialState.columnType()) {
595         case eMyMoney::Report::ColumnType::NoColumns:
596         case eMyMoney::Report::ColumnType::Days:
597           combo->setCurrentItem(i18nc("@item the columns will display daily data", "Daily"), false);
598           break;
599         case eMyMoney::Report::ColumnType::Weeks:
600           combo->setCurrentItem(i18nc("@item the columns will display weekly data", "Weekly"), false);
601           break;
602         default:
603           break;
604       }
605     } else {
606       switch (d->m_initialState.columnType()) {
607         case eMyMoney::Report::ColumnType::NoColumns:
608         case eMyMoney::Report::ColumnType::Months:
609           combo->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false);
610           break;
611         case eMyMoney::Report::ColumnType::BiMonths:
612           combo->setCurrentItem(i18nc("@item the columns will display bi-monthly data", "Bi-Monthly"), false);
613           break;
614         case eMyMoney::Report::ColumnType::Quarters:
615           combo->setCurrentItem(i18nc("@item the columns will display quarterly data", "Quarterly"), false);
616           break;
617         case eMyMoney::Report::ColumnType::Years:
618           combo->setCurrentItem(i18nc("@item the columns will display yearly data", "Yearly"), false);
619           break;
620         default:
621           break;
622       }
623     }
624   }
625 
626   if (d->m_tabCapitalGain) {
627     d->m_tabCapitalGain->ui->m_termSeparator->setDate(d->m_initialState.termSeparator());
628     d->m_tabCapitalGain->ui->m_showSTLTCapitalGains->setChecked(d->m_initialState.isShowingSTLTCapitalGains());
629     d->m_tabCapitalGain->ui->m_settlementPeriod->setValue(d->m_initialState.settlementPeriod());
630     d->m_tabCapitalGain->ui->m_checkHideTotals->setChecked(!d->m_initialState.isShowingColumnTotals());
631     d->m_tabCapitalGain->ui->m_investmentSum->blockSignals(true);
632     d->m_tabCapitalGain->ui->m_investmentSum->clear();
633     d->m_tabCapitalGain->ui->m_investmentSum->addItem(i18n("Only owned"), static_cast<int>(eMyMoney::Report::InvestmentSum::Owned));
634     d->m_tabCapitalGain->ui->m_investmentSum->addItem(i18n("Only sold"), static_cast<int>(eMyMoney::Report::InvestmentSum::Sold));
635     d->m_tabCapitalGain->ui->m_investmentSum->blockSignals(false);
636     d->m_tabCapitalGain->ui->m_investmentSum->setCurrentIndex(d->m_tabCapitalGain->ui->m_investmentSum->findData(static_cast<int>(d->m_initialState.investmentSum())));
637   }
638 
639   if (d->m_tabPerformance) {
640     d->m_tabPerformance->ui->m_checkHideTotals->setChecked(!d->m_initialState.isShowingColumnTotals());
641     d->m_tabPerformance->ui->m_investmentSum->blockSignals(true);
642     d->m_tabPerformance->ui->m_investmentSum->clear();
643     d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("From period"), static_cast<int>(eMyMoney::Report::InvestmentSum::Period));
644     d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("Owned and sold"), static_cast<int>(eMyMoney::Report::InvestmentSum::OwnedAndSold));
645     d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("Only owned"), static_cast<int>(eMyMoney::Report::InvestmentSum::Owned));
646     d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("Only sold"), static_cast<int>(eMyMoney::Report::InvestmentSum::Sold));
647     d->m_tabPerformance->ui->m_investmentSum->blockSignals(false);
648     d->m_tabPerformance->ui->m_investmentSum->setCurrentIndex(d->m_tabPerformance->ui->m_investmentSum->findData(static_cast<int>(d->m_initialState.investmentSum())));
649   }
650 
651   d->m_tabFilters->resetFilter(d->m_initialState);
652 
653   if (d->m_dateRange) {
654     d->m_initialState.updateDateFilter();
655     QDate dateFrom, dateTo;
656     if (d->m_initialState.dateFilter(dateFrom, dateTo)) {
657       if (d->m_initialState.isDateUserDefined()) {
658         d->m_dateRange->setDateRange(dateFrom, dateTo);
659       } else {
660         d->m_dateRange->setDateRange(d->m_initialState.dateRange());
661       }
662     } else {
663       d->m_dateRange->setDateRange(eMyMoney::TransactionFilter::Date::All);
664     }
665   }
666 }
667 
slotShowHelp()668 void KReportConfigurationFilterDlg::slotShowHelp()
669 {
670   Q_D(KReportConfigurationFilterDlg);
671   if (d->ui->m_tabWidget->currentIndex() == 1)
672     d->m_tabFilters->slotShowHelp();
673   else
674     KHelpClient::invokeHelp("details.reports.config");
675 }
676 
677 //TODO Fix the reports and engine to include transfers even if categories are filtered - bug #1523508
slotUpdateCheckTransfers()678 void KReportConfigurationFilterDlg::slotUpdateCheckTransfers()
679 {
680   Q_D(KReportConfigurationFilterDlg);
681   auto cb = d->m_tabRowColPivot->ui->m_checkTransfers;
682   if (!d->m_tabFilters->categoriesView()->allItemsSelected()) {
683     cb->setChecked(false);
684     cb->setDisabled(true);
685   } else {
686     cb->setEnabled(true);
687   }
688 }
689