File indexing completed on 2024-06-16 04:46:40

0001 /*
0002     SPDX-FileCopyrightText: 2000-2004 Michael Edwardes <mte@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2000-2004 Javier Campos Morales <javi_c@users.sourceforge.net>
0004     SPDX-FileCopyrightText: 2000-2004 Felix Rodriguez <frodriguez@users.sourceforge.net>
0005     SPDX-FileCopyrightText: 2000-2004 John C <thetacoturtle@users.sourceforge.net>
0006     SPDX-FileCopyrightText: 2000-2004 Thomas Baumgart <ipwizard@users.sourceforge.net>
0007     SPDX-FileCopyrightText: 2000-2004 Kevin Tambascio <ktambascio@users.sourceforge.net>
0008     SPDX-FileCopyrightText: 2000-2004 Ace Jones <ace.j@hotpop.com>
0009     SPDX-FileCopyrightText: 2017, 2018 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0010     SPDX-FileCopyrightText: 2018 Michael Kiefer <Michael-Kiefer@web.de>
0011     SPDX-License-Identifier: GPL-2.0-or-later
0012 */
0013 
0014 #include "kreportconfigurationfilterdlg.h"
0015 
0016 // ----------------------------------------------------------------------------
0017 // QT Includes
0018 
0019 #include <QPushButton>
0020 
0021 // ----------------------------------------------------------------------------
0022 // KDE Includes
0023 
0024 #include <KHelpClient>
0025 #include <KLocalizedString>
0026 
0027 // ----------------------------------------------------------------------------
0028 // Project Includes
0029 
0030 #include "ktransactionfilter.h"
0031 #include "kmymoneyaccountselector.h"
0032 #include "mymoneyfile.h"
0033 #include "mymoneyexception.h"
0034 #include "mymoneybudget.h"
0035 #include "mymoneyreport.h"
0036 #include "daterangedlg.h"
0037 #include "reporttabimpl.h"
0038 #include "mymoneyenums.h"
0039 
0040 #include <ui_kreportconfigurationfilterdlg.h>
0041 #include <ui_reporttabgeneral.h>
0042 #include <ui_reporttabrowcolpivot.h>
0043 #include <ui_reporttabrowcolquery.h>
0044 #include <ui_reporttabchart.h>
0045 #include <ui_reporttabrange.h>
0046 #include <ui_reporttabcapitalgain.h>
0047 #include <ui_reporttabperformance.h>
0048 
0049 class KReportConfigurationFilterDlgPrivate
0050 {
0051     Q_DISABLE_COPY(KReportConfigurationFilterDlgPrivate)
0052 
0053 public:
0054     KReportConfigurationFilterDlgPrivate(KReportConfigurationFilterDlg *qq) :
0055         q_ptr(qq),
0056         ui(new Ui::KReportConfigurationFilterDlg),
0057         m_tabRowColPivot(nullptr),
0058         m_tabRowColQuery(nullptr),
0059         m_tabChart(nullptr),
0060         m_tabRange(nullptr),
0061         m_dateRange(nullptr)
0062     {
0063     }
0064 
0065     ~KReportConfigurationFilterDlgPrivate()
0066     {
0067         delete ui;
0068     }
0069 
0070     KReportConfigurationFilterDlg      *q_ptr;
0071     Ui::KReportConfigurationFilterDlg  *ui;
0072 
0073     QPointer<ReportTabGeneral>     m_tabGeneral;
0074     QPointer<ReportTabRowColPivot> m_tabRowColPivot;
0075     QPointer<ReportTabRowColQuery> m_tabRowColQuery;
0076     QPointer<ReportTabChart>       m_tabChart;
0077     QPointer<ReportTabRange>       m_tabRange;
0078     QPointer<ReportTabCapitalGain> m_tabCapitalGain;
0079     QPointer<ReportTabPerformance> m_tabPerformance;
0080     QPointer<KTransactionFilter>           m_tabFilters;
0081 
0082     MyMoneyReport m_initialState;
0083     MyMoneyReport m_currentState;
0084     QVector<MyMoneyBudget> m_budgets;
0085     DateRangeDlg                    *m_dateRange;
0086 };
0087 
0088 KReportConfigurationFilterDlg::KReportConfigurationFilterDlg(MyMoneyReport report, QWidget *parent) :
0089     QDialog(parent),
0090     d_ptr(new KReportConfigurationFilterDlgPrivate(this))
0091 {
0092     Q_D(KReportConfigurationFilterDlg);
0093 
0094     d->ui->setupUi(this);
0095     d->m_initialState = report;
0096     d->m_currentState = report;
0097 
0098     //
0099     // Rework labeling
0100     //
0101 
0102     setWindowTitle(i18n("Report Configuration"));
0103     //
0104     // Rework the buttons
0105     //
0106 
0107     // the Apply button is always enabled
0108     d->ui->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true);
0109     d->ui->buttonBox->button(QDialogButtonBox::Apply)->setToolTip(i18nc("@info:tooltip for report configuration apply button", "Apply the configuration changes to the report"));
0110 
0111 
0112     connect(d->ui->buttonBox->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, this, &KReportConfigurationFilterDlg::slotSearch);
0113     connect(d->ui->buttonBox->button(QDialogButtonBox::Close), &QAbstractButton::clicked, this, &QDialog::close);
0114     connect(d->ui->buttonBox->button(QDialogButtonBox::Reset), &QAbstractButton::clicked, this, &KReportConfigurationFilterDlg::slotReset);
0115     connect(d->ui->buttonBox->button(QDialogButtonBox::Help), &QAbstractButton::clicked, this, &KReportConfigurationFilterDlg::slotShowHelp);
0116 
0117     //
0118     // Add new tabs
0119     //
0120     if (d->m_initialState.reportType() == eMyMoney::Report::ReportType::PivotTable) {
0121         // we will use date range together with data range
0122         d->m_tabFilters = new KTransactionFilter(this, (report.rowType() == eMyMoney::Report::RowType::Account), true, false);
0123     } else {
0124         d->m_tabFilters = new KTransactionFilter(this, (report.rowType() == eMyMoney::Report::RowType::Account), report.isInvestmentsOnly());
0125         d->m_dateRange = d->m_tabFilters->dateRange();
0126     }
0127 
0128     d->ui->m_tabWidget->addTab(d->m_tabFilters, i18nc("Filters tab", "Filters"));
0129 
0130     d->m_tabGeneral = new ReportTabGeneral(d->ui->m_criteriaTab);
0131     d->ui->m_criteriaTab->insertTab(0, d->m_tabGeneral, i18nc("General tab", "General"));
0132 
0133     if (d->m_initialState.reportType() == eMyMoney::Report::ReportType::PivotTable) {
0134         int tabNr = 1;
0135         if (!(d->m_initialState.isIncludingPrice() || d->m_initialState.isIncludingAveragePrice())) {
0136             d->m_tabRowColPivot = new ReportTabRowColPivot(d->ui->m_criteriaTab);
0137             d->ui->m_criteriaTab->insertTab(tabNr++, d->m_tabRowColPivot, i18n("Rows/Columns"));
0138             connect(d->m_tabRowColPivot->ui->m_comboRows, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, static_cast<void (KReportConfigurationFilterDlg::*)(int)>(&KReportConfigurationFilterDlg::slotRowTypeChanged));
0139             connect(d->m_tabRowColPivot->ui->m_comboRows, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, static_cast<void (KReportConfigurationFilterDlg::*)(int)>(&KReportConfigurationFilterDlg::slotUpdateColumnsCombo));
0140             //control the state of the includeTransfer check
0141             connect(d->m_tabFilters->categoriesView(), &KMyMoneySelector::stateChanged, this, &KReportConfigurationFilterDlg::slotUpdateCheckTransfers);
0142         }
0143 
0144         d->m_tabChart = new ReportTabChart(d->ui->m_criteriaTab);
0145         d->ui->m_criteriaTab->insertTab(tabNr++, d->m_tabChart, i18n("Chart"));
0146 
0147         d->m_tabRange = new ReportTabRange(d->ui->m_criteriaTab);
0148         d->ui->m_criteriaTab->insertTab(tabNr, d->m_tabRange, i18n("Range"));
0149 
0150         d->m_dateRange = d->m_tabRange->m_dateRange;
0151 
0152         if (!(d->m_initialState.isIncludingPrice() || d->m_initialState.isIncludingAveragePrice())) {
0153             connect(d->m_tabRange->ui->m_comboColumns, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, &KReportConfigurationFilterDlg::slotColumnTypeChanged);
0154             connect(d->m_tabRange->ui->m_comboColumns, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, static_cast<void (KReportConfigurationFilterDlg::*)(int)>(&KReportConfigurationFilterDlg::slotUpdateColumnsCombo));
0155         }
0156         connect(d->m_tabChart->ui->m_logYaxis, &QCheckBox::stateChanged, this, &KReportConfigurationFilterDlg::slotLogAxisChanged);
0157         connect(d->m_tabChart->ui->m_negExpenses, &QCheckBox::stateChanged, this, &KReportConfigurationFilterDlg::slotNegExpensesChanged);
0158     } else if (d->m_initialState.reportType() == eMyMoney::Report::ReportType::QueryTable) {
0159         // eInvestmentHoldings is a special-case report, and you cannot configure the
0160         // rows & columns of that report.
0161         if (d->m_initialState.rowType() < eMyMoney::Report::RowType::AccountByTopAccount) {
0162             d->m_tabRowColQuery = new ReportTabRowColQuery(d->ui->m_criteriaTab);
0163             d->ui->m_criteriaTab->insertTab(1, d->m_tabRowColQuery, i18n("Rows/Columns"));
0164         }
0165         if (d->m_initialState.queryColumns() & eMyMoney::Report::QueryColumn::CapitalGain) {
0166             d->m_tabCapitalGain = new ReportTabCapitalGain(d->ui->m_criteriaTab);
0167             d->ui->m_criteriaTab->insertTab(1, d->m_tabCapitalGain, i18n("Report"));
0168         }
0169         if (d->m_initialState.queryColumns() & eMyMoney::Report::QueryColumn::Performance) {
0170             d->m_tabPerformance = new ReportTabPerformance(d->ui->m_criteriaTab);
0171             d->ui->m_criteriaTab->insertTab(1, d->m_tabPerformance, i18n("Report"));
0172         }
0173     }
0174 
0175     d->ui->m_criteriaTab->setCurrentIndex(d->ui->m_criteriaTab->indexOf(d->m_tabGeneral));
0176     d->ui->m_criteriaTab->setMinimumSize(500, 200);
0177 
0178     QList<MyMoneyBudget> list = MyMoneyFile::instance()->budgetList();
0179     QList<MyMoneyBudget>::const_iterator it_b;
0180     for (it_b = list.constBegin(); it_b != list.constEnd(); ++it_b) {
0181         d->m_budgets.push_back(*it_b);
0182     }
0183 
0184     //
0185     // Now set up the widgets with proper values
0186     //
0187     slotReset();
0188 }
0189 
0190 KReportConfigurationFilterDlg::~KReportConfigurationFilterDlg()
0191 {
0192 }
0193 
0194 MyMoneyReport KReportConfigurationFilterDlg::getConfig() const
0195 {
0196     Q_D(const KReportConfigurationFilterDlg);
0197     return d->m_currentState;
0198 }
0199 
0200 void KReportConfigurationFilterDlg::slotSearch()
0201 {
0202     Q_D(KReportConfigurationFilterDlg);
0203     // setup the filter from the dialog widgets
0204     auto filter = d->m_tabFilters->setupFilter();
0205 
0206     // Copy the m_filter over to the filter part of m_currentConfig.
0207     d->m_currentState.assignFilter(filter);
0208 
0209     // Then extract the report properties
0210     d->m_currentState.setName(d->m_tabGeneral->ui->m_editName->text());
0211     d->m_currentState.setComment(d->m_tabGeneral->ui->m_editComment->text());
0212     d->m_currentState.setConvertCurrency(d->m_tabGeneral->ui->m_checkCurrency->isChecked());
0213     d->m_currentState.setFavorite(d->m_tabGeneral->ui->m_checkFavorite->isChecked());
0214     d->m_currentState.setSkipZero(d->m_tabGeneral->ui->m_skipZero->isChecked());
0215 
0216     if (d->m_tabRowColPivot) {
0217         eMyMoney::Report::DetailLevel dl[4] = { eMyMoney::Report::DetailLevel::All, eMyMoney::Report::DetailLevel::Top, eMyMoney::Report::DetailLevel::Group, eMyMoney::Report::DetailLevel::Total };
0218 
0219         d->m_currentState.setDetailLevel(dl[d->m_tabRowColPivot->ui->m_comboDetail->currentIndex()]);
0220 
0221         // modify the rowtype only if the widget is enabled
0222         if (d->m_tabRowColPivot->ui->m_comboRows->isEnabled()) {
0223             eMyMoney::Report::RowType rt[2] = { eMyMoney::Report::RowType::ExpenseIncome, eMyMoney::Report::RowType::AssetLiability };
0224             d->m_currentState.setRowType(rt[d->m_tabRowColPivot->ui->m_comboRows->currentIndex()]);
0225         }
0226 
0227         d->m_currentState.setShowingRowTotals(false);
0228         if (d->m_tabRowColPivot->ui->m_comboRows->currentIndex() == 0)
0229             d->m_currentState.setShowingRowTotals(d->m_tabRowColPivot->ui->m_checkTotalColumn->isChecked());
0230 
0231         d->m_currentState.setShowingColumnTotals(d->m_tabRowColPivot->ui->m_checkTotalRow->isChecked());
0232         d->m_currentState.setIncludingSchedules(d->m_tabRowColPivot->ui->m_checkScheduled->isChecked());
0233         d->m_currentState.setPropagateBudgetDifference(d->m_tabRowColPivot->ui->m_propagateRemainder->isChecked());
0234         d->m_currentState.setIncludingTransfers(d->m_tabRowColPivot->ui->m_checkTransfers->isChecked());
0235 
0236         d->m_currentState.setIncludingUnusedAccounts(d->m_tabRowColPivot->ui->m_checkUnused->isChecked());
0237 
0238         if (d->m_tabRowColPivot->ui->m_comboBudget->isEnabled() && (d->m_budgets.count() > 0)) {
0239             d->m_currentState.setBudget(d->m_budgets[d->m_tabRowColPivot->ui->m_comboBudget->currentItem()].id(), d->m_initialState.rowType() == eMyMoney::Report::RowType::BudgetActual);
0240         } else {
0241             d->m_currentState.setBudget(QString(), false);
0242         }
0243 
0244         //set moving average days
0245         if (d->m_tabRowColPivot->ui->m_movingAverageDays->isEnabled()) {
0246             d->m_currentState.setMovingAverageDays(d->m_tabRowColPivot->ui->m_movingAverageDays->value());
0247         }
0248     } else if (d->m_tabRowColQuery) {
0249         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, };
0250         d->m_currentState.setRowType(rtq[d->m_tabRowColQuery->ui->m_comboOrganizeBy->currentIndex()]);
0251 
0252         unsigned qc = eMyMoney::Report::QueryColumn::None;
0253 
0254         if (d->m_currentState.queryColumns() & eMyMoney::Report::QueryColumn::Loan)
0255             // once a loan report, always a loan report
0256             qc = eMyMoney::Report::QueryColumn::Loan;
0257 
0258         if (d->m_tabRowColQuery->ui->m_checkNumber->isChecked())
0259             qc |= eMyMoney::Report::QueryColumn::Number;
0260         if (d->m_tabRowColQuery->ui->m_checkPayee->isChecked())
0261             qc |= eMyMoney::Report::QueryColumn::Payee;
0262         if (d->m_tabRowColQuery->ui->m_checkTag->isChecked())
0263             qc |= eMyMoney::Report::QueryColumn::Tag;
0264         if (d->m_tabRowColQuery->ui->m_checkCategory->isChecked())
0265             qc |= eMyMoney::Report::QueryColumn::Category;
0266         if (d->m_tabRowColQuery->ui->m_checkMemo->isChecked())
0267             qc |= eMyMoney::Report::QueryColumn::Memo;
0268         if (d->m_tabRowColQuery->ui->m_checkAccount->isChecked())
0269             qc |= eMyMoney::Report::QueryColumn::Account;
0270         if (d->m_tabRowColQuery->ui->m_checkReconciled->isChecked())
0271             qc |= eMyMoney::Report::QueryColumn::Reconciled;
0272         if (d->m_tabRowColQuery->ui->m_checkAction->isChecked())
0273             qc |= eMyMoney::Report::QueryColumn::Action;
0274         if (d->m_tabRowColQuery->ui->m_checkShares->isChecked())
0275             qc |= eMyMoney::Report::QueryColumn::Shares;
0276         if (d->m_tabRowColQuery->ui->m_checkPrice->isChecked())
0277             qc |= eMyMoney::Report::QueryColumn::Price;
0278         if (d->m_tabRowColQuery->ui->m_checkBalance->isChecked())
0279             qc |= eMyMoney::Report::QueryColumn::Balance;
0280 
0281         d->m_currentState.setQueryColumns(static_cast<eMyMoney::Report::QueryColumn>(qc));
0282 
0283         d->m_currentState.setTax(d->m_tabRowColQuery->ui->m_checkTax->isChecked());
0284         d->m_currentState.setInvestmentsOnly(d->m_tabRowColQuery->ui->m_checkInvestments->isChecked());
0285         d->m_currentState.setLoansOnly(d->m_tabRowColQuery->ui->m_checkLoans->isChecked());
0286 
0287         d->m_currentState.setDetailLevel(d->m_tabRowColQuery->ui->m_checkHideSplitDetails->isChecked() ?
0288                                          eMyMoney::Report::DetailLevel::None : eMyMoney::Report::DetailLevel::All);
0289         d->m_currentState.setHideTransactions(d->m_tabRowColQuery->ui->m_checkHideTransactions->isChecked());
0290         d->m_currentState.setShowingColumnTotals(!d->m_tabRowColQuery->ui->m_checkHideTotals->isChecked());
0291 
0292         d->m_currentState.setIncludingTransfers(d->m_tabRowColQuery->ui->m_checkTransfers->isChecked());
0293     }
0294 
0295     if (d->m_tabChart) {
0296         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 };
0297         eMyMoney::Report::ChartPalette cp[4] = { eMyMoney::Report::ChartPalette::Application, eMyMoney::Report::ChartPalette::Default, eMyMoney::Report::ChartPalette::Rainbow, eMyMoney::Report::ChartPalette::Subdued };
0298         d->m_currentState.setChartType(ct[d->m_tabChart->ui->m_comboType->currentIndex()]);
0299         d->m_currentState.setChartPalette(cp[d->m_tabChart->ui->m_comboPalette->currentIndex()]);
0300         d->m_currentState.setChartCHGridLines(d->m_tabChart->ui->m_checkCHGridLines->isChecked());
0301         d->m_currentState.setChartSVGridLines(d->m_tabChart->ui->m_checkSVGridLines->isChecked());
0302         d->m_currentState.setChartDataLabels(d->m_tabChart->ui->m_checkValues->isChecked());
0303         d->m_currentState.setChartByDefault(d->m_tabChart->ui->m_checkShowChart->isChecked());
0304         d->m_currentState.setChartLineWidth(d->m_tabChart->ui->m_lineWidth->value());
0305         d->m_currentState.setLogYAxis(d->m_tabChart->ui->m_logYaxis->isChecked());
0306         d->m_currentState.setNegExpenses(d->m_tabChart->ui->m_negExpenses->isChecked());
0307     }
0308 
0309     if (d->m_tabRange) {
0310         d->m_currentState.setDataRangeStart(d->m_tabRange->ui->m_dataRangeStart->text());
0311         d->m_currentState.setDataRangeEnd(d->m_tabRange->ui->m_dataRangeEnd->text());
0312         d->m_currentState.setDataMajorTick(d->m_tabRange->ui->m_dataMajorTick->text());
0313         d->m_currentState.setDataMinorTick(d->m_tabRange->ui->m_dataMinorTick->text());
0314         d->m_currentState.setYLabelsPrecision(d->m_tabRange->ui->m_yLabelsPrecision->value());
0315         d->m_currentState.setDataFilter((eMyMoney::Report::DataLock)d->m_tabRange->ui->m_dataLock->currentIndex());
0316 
0317         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, };
0318         bool dy[6] = { true, true, false, false, false, false };
0319         d->m_currentState.setColumnType(ct[d->m_tabRange->ui->m_comboColumns->currentIndex()]);
0320 
0321         //TODO (Ace) This should be implicit in the call above.  MMReport needs fixin'
0322         d->m_currentState.setColumnsAreDays(dy[d->m_tabRange->ui->m_comboColumns->currentIndex()]);
0323         d->m_currentState.setDateFilter(d->m_dateRange->fromDate(), d->m_dateRange->toDate());
0324     }
0325 
0326     // setup the date lock
0327     eMyMoney::TransactionFilter::Date range = d->m_dateRange->dateRange();
0328     d->m_currentState.setDateFilter(range);
0329 
0330     if (d->m_tabCapitalGain) {
0331         d->m_currentState.setTermSeparator(d->m_tabCapitalGain->ui->m_termSeparator->date());
0332         d->m_currentState.setShowSTLTCapitalGains(d->m_tabCapitalGain->ui->m_showSTLTCapitalGains->isChecked());
0333         d->m_currentState.setSettlementPeriod(d->m_tabCapitalGain->ui->m_settlementPeriod->value());
0334         d->m_currentState.setShowingColumnTotals(!d->m_tabCapitalGain->ui->m_checkHideTotals->isChecked());
0335         d->m_currentState.setInvestmentSum(static_cast<eMyMoney::Report::InvestmentSum>(d->m_tabCapitalGain->ui->m_investmentSum->currentData().toInt()));
0336     }
0337 
0338     if (d->m_tabPerformance) {
0339         d->m_currentState.setShowingColumnTotals(!d->m_tabPerformance->ui->m_checkHideTotals->isChecked());
0340         d->m_currentState.setInvestmentSum(static_cast<eMyMoney::Report::InvestmentSum>(d->m_tabPerformance->ui->m_investmentSum->currentData().toInt()));
0341     }
0342 
0343     done(true);
0344 }
0345 
0346 void KReportConfigurationFilterDlg::slotRowTypeChanged(int row)
0347 {
0348     Q_D(KReportConfigurationFilterDlg);
0349     d->m_tabRowColPivot->ui->m_checkTotalColumn->setEnabled(row == 0);
0350 }
0351 
0352 void KReportConfigurationFilterDlg::slotColumnTypeChanged(int row)
0353 {
0354     Q_D(KReportConfigurationFilterDlg);
0355     if ((d->m_tabRowColPivot->ui->m_comboBudget->isEnabled() && row < 2)) {
0356         d->m_tabRange->ui->m_comboColumns->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false);
0357     }
0358 }
0359 
0360 void KReportConfigurationFilterDlg::slotUpdateColumnsCombo()
0361 {
0362     Q_D(KReportConfigurationFilterDlg);
0363     const int monthlyIndex = 2;
0364     const int incomeExpenseIndex = 0;
0365     const bool isIncomeExpenseForecast = d->m_currentState.isIncludingForecast() && d->m_tabRowColPivot->ui->m_comboRows->currentIndex() == incomeExpenseIndex;
0366     if (isIncomeExpenseForecast && d->m_tabRange->ui->m_comboColumns->currentIndex() != monthlyIndex) {
0367         d->m_tabRange->ui->m_comboColumns->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false);
0368     }
0369 }
0370 
0371 void KReportConfigurationFilterDlg::slotUpdateColumnsCombo(int)
0372 {
0373     slotUpdateColumnsCombo();
0374 }
0375 
0376 void KReportConfigurationFilterDlg::slotLogAxisChanged(int state)
0377 {
0378     Q_D(KReportConfigurationFilterDlg);
0379     if (state == Qt::Checked)
0380         d->m_tabRange->setRangeLogarythmic(true);
0381     else
0382         d->m_tabRange->setRangeLogarythmic(false);
0383 }
0384 
0385 void KReportConfigurationFilterDlg::slotNegExpensesChanged(int state)
0386 {
0387     Q_D(KReportConfigurationFilterDlg);
0388     d->m_tabChart->setNegExpenses(state == Qt::Checked);
0389 }
0390 
0391 void KReportConfigurationFilterDlg::slotReset()
0392 {
0393     Q_D(KReportConfigurationFilterDlg);
0394     //
0395     // Set up the widget from the initial filter
0396     //
0397     d->m_currentState = d->m_initialState;
0398 
0399     //
0400     // Report Properties
0401     //
0402 
0403     d->m_tabGeneral->ui->m_editName->setText(d->m_initialState.name());
0404     d->m_tabGeneral->ui->m_editComment->setText(d->m_initialState.comment());
0405     d->m_tabGeneral->ui->m_checkCurrency->setChecked(d->m_initialState.isConvertCurrency());
0406     d->m_tabGeneral->ui->m_checkFavorite->setChecked(d->m_initialState.isFavorite());
0407 
0408     if (d->m_initialState.isIncludingPrice() || d->m_initialState.isSkippingZero()) {
0409         d->m_tabGeneral->ui->m_skipZero->setChecked(d->m_initialState.isSkippingZero());
0410     } else {
0411         d->m_tabGeneral->ui->m_skipZero->setEnabled(false);
0412     }
0413 
0414     if (d->m_tabRowColPivot) {
0415         KComboBox *combo = d->m_tabRowColPivot->ui->m_comboDetail;
0416         switch (d->m_initialState.detailLevel()) {
0417         case eMyMoney::Report::DetailLevel::None:
0418         case eMyMoney::Report::DetailLevel::End:
0419         case eMyMoney::Report::DetailLevel::All:
0420             combo->setCurrentItem(i18nc("All accounts", "All"), false);
0421             break;
0422         case eMyMoney::Report::DetailLevel::Top:
0423             combo->setCurrentItem(i18n("Top-Level"), false);
0424             break;
0425         case eMyMoney::Report::DetailLevel::Group:
0426             combo->setCurrentItem(i18n("Groups"), false);
0427             break;
0428         case eMyMoney::Report::DetailLevel::Total:
0429             combo->setCurrentItem(i18n("Totals"), false);
0430             break;
0431         }
0432 
0433         combo = d->m_tabRowColPivot->ui->m_comboRows;
0434         switch (d->m_initialState.rowType()) {
0435         case eMyMoney::Report::RowType::ExpenseIncome:
0436         case eMyMoney::Report::RowType::Budget:
0437         case eMyMoney::Report::RowType::BudgetActual:
0438             combo->setCurrentItem(i18n("Income & Expenses"), false); // income / expense
0439             break;
0440         default:
0441             combo->setCurrentItem(i18n("Assets & Liabilities"), false); // asset / liability
0442             break;
0443         }
0444         d->m_tabRowColPivot->ui->m_checkTotalColumn->setChecked(d->m_initialState.isShowingRowTotals());
0445         d->m_tabRowColPivot->ui->m_checkTotalRow->setChecked(d->m_initialState.isShowingColumnTotals());
0446         d->m_tabRowColPivot->ui->m_propagateRemainder->setEnabled(d->m_initialState.rowType() == eMyMoney::Report::RowType::BudgetActual);
0447         d->m_tabRowColPivot->ui->m_propagateRemainder->setChecked(d->m_initialState.isPropagateBudgetDifference());
0448         d->m_tabRowColPivot->ui->m_checkTotalRow->setDisabled(d->m_initialState.isPropagateBudgetDifference());
0449 
0450         connect(d->m_tabRowColPivot->ui->m_propagateRemainder, &QCheckBox::stateChanged, this, [&](int _state) {
0451             Q_D(KReportConfigurationFilterDlg);
0452             const auto state = static_cast<Qt::CheckState>(_state);
0453             d->m_tabRowColPivot->ui->m_checkTotalColumn->setDisabled(state == Qt::Checked);
0454             switch (state) {
0455             case Qt::Checked:
0456                 d->m_tabRowColPivot->ui->m_checkTotalColumn->setChecked(false);
0457                 break;
0458             default:
0459                 break;
0460             }
0461         });
0462 
0463         slotRowTypeChanged(combo->currentIndex());
0464 
0465         //load budgets combo
0466         d->m_tabRowColPivot->ui->m_comboBudget->setDisabled(true);
0467         if (d->m_initialState.rowType() == eMyMoney::Report::RowType::Budget
0468                 || d->m_initialState.rowType() == eMyMoney::Report::RowType::BudgetActual) {
0469             d->m_tabRowColPivot->ui->m_comboBudget->setEnabled(true);
0470             d->m_tabRowColPivot->ui->m_comboRows->setEnabled(false);
0471             d->m_tabRowColPivot->ui->m_rowsLabel->setEnabled(false);
0472             d->m_tabRowColPivot->ui->m_budgetFrame->setEnabled(!d->m_budgets.empty());
0473             auto i = 0;
0474             for (QVector<MyMoneyBudget>::const_iterator it_b = d->m_budgets.constBegin(); it_b != d->m_budgets.constEnd(); ++it_b) {
0475                 d->m_tabRowColPivot->ui->m_comboBudget->insertItem((*it_b).name(), i);
0476                 //set the current selected item
0477                 if ((d->m_initialState.budget() == "Any" && (*it_b).budgetStart().year() == QDate::currentDate().year())
0478                         || d->m_initialState.budget() == (*it_b).id())
0479                     d->m_tabRowColPivot->ui->m_comboBudget->setCurrentItem(i);
0480                 i++;
0481             }
0482         }
0483 
0484         //set moving average days spinbox
0485         QSpinBox *spinbox = d->m_tabRowColPivot->ui->m_movingAverageDays;
0486         spinbox->setEnabled(d->m_initialState.isIncludingMovingAverage());
0487         d->m_tabRowColPivot->ui->m_movingAverageLabel->setEnabled(d->m_initialState.isIncludingMovingAverage());
0488 
0489         if (d->m_initialState.isIncludingMovingAverage()) {
0490             spinbox->setValue(d->m_initialState.movingAverageDays());
0491         }
0492 
0493         d->m_tabRowColPivot->ui->m_checkScheduled->setChecked(d->m_initialState.isIncludingSchedules());
0494         d->m_tabRowColPivot->ui->m_checkTransfers->setChecked(d->m_initialState.isIncludingTransfers());
0495         d->m_tabRowColPivot->ui->m_checkUnused->setChecked(d->m_initialState.isIncludingUnusedAccounts());
0496     } else if (d->m_tabRowColQuery) {
0497         KComboBox *combo = d->m_tabRowColQuery->ui->m_comboOrganizeBy;
0498         switch (d->m_initialState.rowType()) {
0499         case eMyMoney::Report::RowType::NoRows:
0500         case eMyMoney::Report::RowType::Category:
0501             combo->setCurrentItem(i18n("Categories"), false);
0502             break;
0503         case eMyMoney::Report::RowType::TopCategory:
0504             combo->setCurrentItem(i18n("Top Categories"), false);
0505             break;
0506         case eMyMoney::Report::RowType::Tag:
0507             combo->setCurrentItem(i18n("Tags"), false);
0508             break;
0509         case eMyMoney::Report::RowType::Payee:
0510             combo->setCurrentItem(i18n("Payees"), false);
0511             break;
0512         case eMyMoney::Report::RowType::Account:
0513             combo->setCurrentItem(i18n("Accounts"), false);
0514             break;
0515         case eMyMoney::Report::RowType::TopAccount:
0516             combo->setCurrentItem(i18n("Top Accounts"), false);
0517             break;
0518         case eMyMoney::Report::RowType::Month:
0519             combo->setCurrentItem(i18n("Month"), false);
0520             break;
0521         case eMyMoney::Report::RowType::Week:
0522             combo->setCurrentItem(i18n("Week"), false);
0523             break;
0524         default:
0525             throw MYMONEYEXCEPTION_CSTRING("KReportConfigurationFilterDlg::slotReset(): QueryTable report has invalid rowtype");
0526         }
0527 
0528         unsigned qc = d->m_initialState.queryColumns();
0529         d->m_tabRowColQuery->ui->m_checkNumber->setChecked(qc & eMyMoney::Report::QueryColumn::Number);
0530         d->m_tabRowColQuery->ui->m_checkPayee->setChecked(qc & eMyMoney::Report::QueryColumn::Payee);
0531         d->m_tabRowColQuery->ui->m_checkTag->setChecked(qc & eMyMoney::Report::QueryColumn::Tag);
0532         d->m_tabRowColQuery->ui->m_checkCategory->setChecked(qc & eMyMoney::Report::QueryColumn::Category);
0533         d->m_tabRowColQuery->ui->m_checkMemo->setChecked(qc & eMyMoney::Report::QueryColumn::Memo);
0534         d->m_tabRowColQuery->ui->m_checkAccount->setChecked(qc & eMyMoney::Report::QueryColumn::Account);
0535         d->m_tabRowColQuery->ui->m_checkReconciled->setChecked(qc & eMyMoney::Report::QueryColumn::Reconciled);
0536         d->m_tabRowColQuery->ui->m_checkAction->setChecked(qc & eMyMoney::Report::QueryColumn::Action);
0537         d->m_tabRowColQuery->ui->m_checkShares->setChecked(qc & eMyMoney::Report::QueryColumn::Shares);
0538         d->m_tabRowColQuery->ui->m_checkPrice->setChecked(qc & eMyMoney::Report::QueryColumn::Price);
0539         d->m_tabRowColQuery->ui->m_checkBalance->setChecked(qc & eMyMoney::Report::QueryColumn::Balance);
0540 
0541         d->m_tabRowColQuery->ui->m_checkTax->setChecked(d->m_initialState.isTax());
0542         d->m_tabRowColQuery->ui->m_checkInvestments->setChecked(d->m_initialState.isInvestmentsOnly());
0543         d->m_tabRowColQuery->ui->m_checkLoans->setChecked(d->m_initialState.isLoansOnly());
0544 
0545         d->m_tabRowColQuery->ui->m_checkHideTransactions->setChecked(d->m_initialState.isHideTransactions());
0546         d->m_tabRowColQuery->ui->m_checkHideTotals->setChecked(!d->m_initialState.isShowingColumnTotals());
0547         d->m_tabRowColQuery->ui->m_checkHideSplitDetails->setEnabled(!d->m_initialState.isHideTransactions());
0548 
0549         d->m_tabRowColQuery->ui->m_checkHideSplitDetails->setChecked
0550         (d->m_initialState.detailLevel() == eMyMoney::Report::DetailLevel::None || d->m_initialState.isHideTransactions());
0551         d->m_tabRowColQuery->ui->m_checkTransfers->setChecked(d->m_initialState.isIncludingTransfers());
0552     }
0553 
0554     if (d->m_tabChart) {
0555         KMyMoneyGeneralCombo* combo = d->m_tabChart->ui->m_comboType;
0556         switch (d->m_initialState.chartType()) {
0557         case eMyMoney::Report::ChartType::None:
0558             combo->setCurrentItem(static_cast<int>(eMyMoney::Report::ChartType::Line));
0559             break;
0560         case eMyMoney::Report::ChartType::Line:
0561         case eMyMoney::Report::ChartType::Bar:
0562         case eMyMoney::Report::ChartType::StackedBar:
0563         case eMyMoney::Report::ChartType::Pie:
0564         case eMyMoney::Report::ChartType::Ring:
0565             combo->setCurrentItem(static_cast<int>(d->m_initialState.chartType()));
0566             break;
0567         default:
0568             throw MYMONEYEXCEPTION_CSTRING("KReportConfigurationFilterDlg::slotReset(): Report has invalid charttype");
0569         }
0570         combo = d->m_tabChart->ui->m_comboPalette;
0571         switch (d->m_initialState.chartPalette()) {
0572         case eMyMoney::Report::ChartPalette::Application:
0573         case eMyMoney::Report::ChartPalette::Default:
0574         case eMyMoney::Report::ChartPalette::Rainbow:
0575         case eMyMoney::Report::ChartPalette::Subdued:
0576             combo->setCurrentItem(static_cast<int>(d->m_initialState.chartPalette()));
0577             break;
0578         default:
0579             throw MYMONEYEXCEPTION_CSTRING("KReportConfigurationFilterDlg::slotReset(): Report has invalid chartpalette");
0580         }
0581         d->m_tabChart->ui->m_checkCHGridLines->setChecked(d->m_initialState.isChartCHGridLines());
0582         d->m_tabChart->ui->m_checkSVGridLines->setChecked(d->m_initialState.isChartSVGridLines());
0583         d->m_tabChart->ui->m_checkValues->setChecked(d->m_initialState.isChartDataLabels());
0584         d->m_tabChart->ui->m_checkShowChart->setChecked(d->m_initialState.isChartByDefault());
0585         d->m_tabChart->ui->m_lineWidth->setValue(d->m_initialState.chartLineWidth());
0586         d->m_tabChart->ui->m_logYaxis->setChecked(d->m_initialState.isLogYAxis());
0587         d->m_tabChart->ui->m_negExpenses->setChecked(d->m_initialState.isNegExpenses());
0588     }
0589 
0590     if (d->m_tabRange) {
0591         d->m_tabRange->ui->m_dataRangeStart->setText(d->m_initialState.dataRangeStart());
0592         d->m_tabRange->ui->m_dataRangeEnd->setText(d->m_initialState.dataRangeEnd());
0593         d->m_tabRange->ui->m_dataMajorTick->setText(d->m_initialState.dataMajorTick());
0594         d->m_tabRange->ui->m_dataMinorTick->setText(d->m_initialState.dataMinorTick());
0595         d->m_tabRange->ui->m_yLabelsPrecision->setValue(d->m_initialState.yLabelsPrecision());
0596         d->m_tabRange->ui->m_dataLock->setCurrentIndex((int)d->m_initialState.dataFilter());
0597 
0598         KComboBox *combo = d->m_tabRange->ui->m_comboColumns;
0599         if (d->m_initialState.isColumnsAreDays()) {
0600             switch (d->m_initialState.columnType()) {
0601             case eMyMoney::Report::ColumnType::NoColumns:
0602             case eMyMoney::Report::ColumnType::Days:
0603                 combo->setCurrentItem(i18nc("@item the columns will display daily data", "Daily"), false);
0604                 break;
0605             case eMyMoney::Report::ColumnType::Weeks:
0606                 combo->setCurrentItem(i18nc("@item the columns will display weekly data", "Weekly"), false);
0607                 break;
0608             default:
0609                 break;
0610             }
0611         } else {
0612             switch (d->m_initialState.columnType()) {
0613             case eMyMoney::Report::ColumnType::NoColumns:
0614             case eMyMoney::Report::ColumnType::Months:
0615                 combo->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false);
0616                 break;
0617             case eMyMoney::Report::ColumnType::BiMonths:
0618                 combo->setCurrentItem(i18nc("@item the columns will display bi-monthly data", "Bi-Monthly"), false);
0619                 break;
0620             case eMyMoney::Report::ColumnType::Quarters:
0621                 combo->setCurrentItem(i18nc("@item the columns will display quarterly data", "Quarterly"), false);
0622                 break;
0623             case eMyMoney::Report::ColumnType::Years:
0624                 combo->setCurrentItem(i18nc("@item the columns will display yearly data", "Yearly"), false);
0625                 break;
0626             default:
0627                 break;
0628             }
0629         }
0630     }
0631 
0632     if (d->m_tabCapitalGain) {
0633         d->m_tabCapitalGain->ui->m_termSeparator->setDate(d->m_initialState.termSeparator());
0634         d->m_tabCapitalGain->ui->m_showSTLTCapitalGains->setChecked(d->m_initialState.isShowingSTLTCapitalGains());
0635         d->m_tabCapitalGain->ui->m_settlementPeriod->setValue(d->m_initialState.settlementPeriod());
0636         d->m_tabCapitalGain->ui->m_checkHideTotals->setChecked(!d->m_initialState.isShowingColumnTotals());
0637         d->m_tabCapitalGain->ui->m_investmentSum->blockSignals(true);
0638         d->m_tabCapitalGain->ui->m_investmentSum->clear();
0639         d->m_tabCapitalGain->ui->m_investmentSum->addItem(i18n("Only owned"), static_cast<int>(eMyMoney::Report::InvestmentSum::Owned));
0640         d->m_tabCapitalGain->ui->m_investmentSum->addItem(i18n("Only sold"), static_cast<int>(eMyMoney::Report::InvestmentSum::Sold));
0641         d->m_tabCapitalGain->ui->m_investmentSum->blockSignals(false);
0642         d->m_tabCapitalGain->ui->m_investmentSum->setCurrentIndex(d->m_tabCapitalGain->ui->m_investmentSum->findData(static_cast<int>(d->m_initialState.investmentSum())));
0643     }
0644 
0645     if (d->m_tabPerformance) {
0646         d->m_tabPerformance->ui->m_checkHideTotals->setChecked(!d->m_initialState.isShowingColumnTotals());
0647         d->m_tabPerformance->ui->m_investmentSum->blockSignals(true);
0648         d->m_tabPerformance->ui->m_investmentSum->clear();
0649         d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("From period"), static_cast<int>(eMyMoney::Report::InvestmentSum::Period));
0650         d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("Owned and sold"), static_cast<int>(eMyMoney::Report::InvestmentSum::OwnedAndSold));
0651         d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("Only owned"), static_cast<int>(eMyMoney::Report::InvestmentSum::Owned));
0652         d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("Only sold"), static_cast<int>(eMyMoney::Report::InvestmentSum::Sold));
0653         d->m_tabPerformance->ui->m_investmentSum->blockSignals(false);
0654         d->m_tabPerformance->ui->m_investmentSum->setCurrentIndex(d->m_tabPerformance->ui->m_investmentSum->findData(static_cast<int>(d->m_initialState.investmentSum())));
0655     }
0656 
0657     d->m_tabFilters->resetFilter(d->m_initialState);
0658 
0659     if (d->m_dateRange) {
0660         d->m_initialState.updateDateFilter();
0661         QDate dateFrom, dateTo;
0662         if (d->m_initialState.dateFilter(dateFrom, dateTo)) {
0663             if (d->m_initialState.isDateUserDefined()) {
0664                 d->m_dateRange->setDateRange(dateFrom, dateTo);
0665             } else {
0666                 d->m_dateRange->setDateRange(d->m_initialState.dateRange());
0667             }
0668         } else {
0669             d->m_dateRange->setDateRange(eMyMoney::TransactionFilter::Date::All);
0670         }
0671     }
0672 }
0673 
0674 void KReportConfigurationFilterDlg::slotShowHelp()
0675 {
0676     Q_D(KReportConfigurationFilterDlg);
0677     if (d->ui->m_tabWidget->currentIndex() == 1)
0678         d->m_tabFilters->slotShowHelp();
0679     else
0680         KHelpClient::invokeHelp("details.reports.config");
0681 }
0682 
0683 //TODO Fix the reports and engine to include transfers even if categories are filtered - bug #1523508
0684 void KReportConfigurationFilterDlg::slotUpdateCheckTransfers()
0685 {
0686     Q_D(KReportConfigurationFilterDlg);
0687     auto cb = d->m_tabRowColPivot->ui->m_checkTransfers;
0688     if (!d->m_tabFilters->categoriesView()->allItemsSelected()) {
0689         cb->setChecked(false);
0690         cb->setDisabled(true);
0691     } else {
0692         cb->setEnabled(true);
0693     }
0694 }