File indexing completed on 2024-05-12 16:42:07

0001 /*
0002     SPDX-FileCopyrightText: 2002-2018 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-FileCopyrightText: 2017-2018 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #ifndef KFINDTRANSACTIONDLG_P_H
0008 #define KFINDTRANSACTIONDLG_P_H
0009 
0010 #include "kfindtransactiondlg.h"
0011 
0012 // ----------------------------------------------------------------------------
0013 // QT Includes
0014 
0015 #include <QTimer>
0016 #include <QPushButton>
0017 #include <QPointer>
0018 #include <QHeaderView>
0019 
0020 // ----------------------------------------------------------------------------
0021 // KDE Includes
0022 
0023 #include <KGuiItem>
0024 #include <KStandardGuiItem>
0025 #include <KLocalizedString>
0026 #include <KLineEdit>
0027 
0028 // ----------------------------------------------------------------------------
0029 // Project Includes
0030 
0031 #include "ktransactionfilter.h"
0032 #include "mymoneyaccount.h"
0033 #include "mymoneyfile.h"
0034 #include "mymoneymoney.h"
0035 #include "mymoneypayee.h"
0036 #include "mymoneytag.h"
0037 #include "kmymoneysettings.h"
0038 #include "register.h"
0039 #include "transaction.h"
0040 #include "mymoneysplit.h"
0041 #include "mymoneytransaction.h"
0042 #include "mymoneytransactionfilter.h"
0043 
0044 #include "ui_kfindtransactiondlg.h"
0045 
0046 #include "widgetenums.h"
0047 #include "mymoneyenums.h"
0048 
0049 class KFindTransactionDlgPrivate
0050 {
0051     Q_DISABLE_COPY(KFindTransactionDlgPrivate)
0052     Q_DECLARE_PUBLIC(KFindTransactionDlg)
0053 
0054 public:
0055     enum opTypeE {
0056         addAccountToFilter = 0,
0057         addCategoryToFilter,
0058         addPayeeToFilter,
0059         addTagToFilter,
0060     };
0061 
0062     explicit KFindTransactionDlgPrivate(KFindTransactionDlg *qq) :
0063         q_ptr(qq),
0064         ui(new Ui::KFindTransactionDlg),
0065         m_needReload(true)
0066     {
0067     }
0068 
0069     ~KFindTransactionDlgPrivate()
0070     {
0071         delete ui;
0072     }
0073 
0074     void init(bool withEquityAccounts)
0075     {
0076         Q_Q(KFindTransactionDlg);
0077         m_needReload = false;
0078         ui->setupUi(q);
0079 
0080         m_tabFilters = new KTransactionFilter(q, withEquityAccounts);
0081         ui->m_tabWidget->insertTab(0, m_tabFilters, i18nc("Criteria tab", "Criteria"));
0082 
0083         ui->m_register->installEventFilter(q);
0084         ui->m_tabWidget->setTabEnabled(ui->m_tabWidget->indexOf(ui->m_resultPage), false);
0085 
0086         // setup the register
0087         QList<eWidgets::eTransaction::Column> cols {
0088             eWidgets::eTransaction::Column::Date,
0089             eWidgets::eTransaction::Column::Account,
0090             eWidgets::eTransaction::Column::Detail,
0091             eWidgets::eTransaction::Column::ReconcileFlag,
0092             eWidgets::eTransaction::Column::Payment,
0093             eWidgets::eTransaction::Column::Deposit,
0094         };
0095         ui->m_register->setupRegister(MyMoneyAccount(), cols);
0096         ui->m_register->setSelectionMode(QTableWidget::SingleSelection);
0097 
0098         q->connect(ui->m_register, &KMyMoneyRegister::Register::editTransaction, q, &KFindTransactionDlg::slotSelectTransaction);
0099         q->connect(ui->m_register->horizontalHeader(), &QWidget::customContextMenuRequested, q, &KFindTransactionDlg::slotSortOptions);
0100 
0101         // setup the connections
0102         q->connect(ui->buttonBox->button(QDialogButtonBox::Open), &QAbstractButton::clicked, q, &KFindTransactionDlg::slotSearch);
0103         q->connect(ui->buttonBox->button(QDialogButtonBox::Reset), &QAbstractButton::clicked, q, &KFindTransactionDlg::slotReset);
0104         q->connect(ui->buttonBox->button(QDialogButtonBox::Close), &QAbstractButton::clicked, q, &QObject::deleteLater);
0105         q->connect(ui->buttonBox->button(QDialogButtonBox::Help), &QAbstractButton::clicked, q, &KFindTransactionDlg::slotShowHelp);
0106 
0107         // only allow searches when a selection has been made
0108         ui->buttonBox->button(QDialogButtonBox::Open)->setEnabled(false);
0109         KGuiItem::assign(ui->buttonBox->button(QDialogButtonBox::Open), KStandardGuiItem::find());
0110         ui->buttonBox->button(QDialogButtonBox::Open)->setToolTip(i18nc("@info:tooltip for find transaction Open button", "Search transactions"));
0111         q->connect(m_tabFilters, &KTransactionFilter::selectionNotEmpty, ui->buttonBox->button(QDialogButtonBox::Open), &QWidget::setEnabled);
0112 
0113         // get signal about engine changes
0114         q->connect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, q, &KFindTransactionDlg::slotRefreshView);
0115 
0116         // set initial focus to text entry field
0117         KLineEdit* textEdit = m_tabFilters->findChild<KLineEdit*>(QLatin1String("m_textEdit"));
0118         if (textEdit)
0119             textEdit->setFocus();
0120     }
0121 
0122     /**
0123       * q method loads the register with the matching transactions
0124       */
0125     void loadView()
0126     {
0127         // setup sort order
0128         ui->m_register->setSortOrder(KMyMoneySettings::sortSearchView());
0129 
0130         // clear out old data
0131         ui->m_register->clear();
0132 
0133         // retrieve the list from the engine
0134         MyMoneyFile::instance()->transactionList(m_transactionList, m_filter);
0135 
0136         // create the elements for the register
0137         QList<QPair<MyMoneyTransaction, MyMoneySplit> >::const_iterator it;
0138         QMap<QString, int>uniqueMap;
0139         MyMoneyMoney deposit, payment;
0140 
0141         int splitCount = 0;
0142         for (it = m_transactionList.constBegin(); it != m_transactionList.constEnd(); ++it) {
0143             const MyMoneySplit& split = (*it).second;
0144             MyMoneyAccount acc = MyMoneyFile::instance()->account(split.accountId());
0145             ++splitCount;
0146             uniqueMap[(*it).first.id()]++;
0147 
0148             KMyMoneyRegister::Register::transactionFactory(ui->m_register, (*it).first, (*it).second, uniqueMap[(*it).first.id()]);
0149             {   // debug stuff
0150                 if (split.shares().isNegative()) {
0151                     payment += split.shares().abs();
0152                 } else {
0153                     deposit += split.shares().abs();
0154                 }
0155             }
0156         }
0157 
0158         // add the group markers
0159         ui->m_register->addGroupMarkers();
0160 
0161         // sort the transactions according to the sort setting
0162         ui->m_register->sortItems();
0163 
0164         // remove trailing and adjacent markers
0165         ui->m_register->removeUnwantedGroupMarkers();
0166 
0167         // turn on the ledger lens for the register
0168         ui->m_register->setLedgerLensForced();
0169 
0170         ui->m_register->updateRegister(true);
0171 
0172         ui->m_register->setFocusToTop();
0173         ui->m_register->selectItem(ui->m_register->focusItem());
0174 
0175 #ifdef KMM_DEBUG
0176         ui->m_foundText->setText(i18np("Found %1 matching transaction (D %2 / P %3 = %4)",
0177                                        "Found %1 matching transactions (D %2 / P %3 = %4)", splitCount, deposit.formatMoney("", 2), payment.formatMoney("", 2), (deposit - payment).formatMoney("", 2)));
0178 #else
0179         ui->m_foundText->setText(i18np("Found %1 matching transaction", "Found %1 matching transactions", splitCount));
0180 #endif
0181 
0182         ui->m_tabWidget->setTabEnabled(ui->m_tabWidget->indexOf(ui->m_resultPage), true);
0183         ui->m_tabWidget->setCurrentIndex(ui->m_tabWidget->indexOf(ui->m_resultPage));
0184 
0185         Q_Q(KFindTransactionDlg);
0186         QTimer::singleShot(10, q, SLOT(slotRightSize()));
0187     }
0188 
0189 
0190     KFindTransactionDlg      *q_ptr;
0191     Ui::KFindTransactionDlg  *ui;
0192 
0193     /**
0194       * q member holds a list of all transactions matching the filter criteria
0195       */
0196     QList<QPair<MyMoneyTransaction, MyMoneySplit> > m_transactionList;
0197 
0198     MyMoneyTransactionFilter        m_filter;
0199 
0200     bool                            m_needReload;
0201     QPointer<KTransactionFilter>            m_tabFilters;
0202 
0203 };
0204 
0205 #endif