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