File indexing completed on 2024-05-19 05:06:58

0001 /*
0002     SPDX-FileCopyrightText: 2019 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 
0007 #include "onlinebalanceproxymodel.h"
0008 #include "accountsmodel.h"
0009 #include "mymoneyfile.h"
0010 #include "securitiesmodel.h"
0011 
0012 // ----------------------------------------------------------------------------
0013 // QT Includes
0014 
0015 #include <QDate>
0016 
0017 // ----------------------------------------------------------------------------
0018 // KDE Includes
0019 
0020 #include <KLocalizedString>
0021 
0022 // ----------------------------------------------------------------------------
0023 // Project Includes
0024 
0025 #include "mymoneymoney.h"
0026 #include "journalmodel.h"
0027 #include "accountsmodel.h"
0028 #include "mymoneyenums.h"
0029 
0030 class OnlineBalanceProxyModelPrivate
0031 {
0032     Q_DECLARE_PUBLIC(OnlineBalanceProxyModel);
0033     OnlineBalanceProxyModel* q_ptr;
0034 
0035 public:
0036     OnlineBalanceProxyModelPrivate(OnlineBalanceProxyModel* qq)
0037         : q_ptr(qq)
0038     {
0039     }
0040 
0041     ~OnlineBalanceProxyModelPrivate() {}
0042 };
0043 
0044 OnlineBalanceProxyModel::OnlineBalanceProxyModel(QObject *parent)
0045     : QSortFilterProxyModel(parent)
0046     , d_ptr(new OnlineBalanceProxyModelPrivate(this))
0047 {
0048 }
0049 
0050 OnlineBalanceProxyModel::~OnlineBalanceProxyModel()
0051 {
0052     Q_D(OnlineBalanceProxyModel);
0053     delete d;
0054 }
0055 
0056 void OnlineBalanceProxyModel::setSourceModel(QAbstractItemModel* sourceModel)
0057 {
0058     QSortFilterProxyModel::setSourceModel(sourceModel);
0059 
0060     // make sure that data changes in the source model invalidate our filter
0061     connect(sourceModel, &QAbstractItemModel::dataChanged, this, [&]() {
0062         invalidateFilter();
0063     });
0064 }
0065 
0066 int OnlineBalanceProxyModel::columnCount(const QModelIndex& parent) const
0067 {
0068     Q_UNUSED(parent);
0069     return MyMoneyFile::instance()->journalModel()->columnCount();
0070 }
0071 
0072 QModelIndex OnlineBalanceProxyModel::index(int row, int column, const QModelIndex& parent) const
0073 {
0074     switch(column) {
0075     case JournalModel::Column::Balance:
0076         column = AccountsModel::Column::Balance;
0077         break;
0078     default:
0079         break;
0080     }
0081     return QSortFilterProxyModel::index(row, column, parent);
0082 }
0083 
0084 QVariant OnlineBalanceProxyModel::data(const QModelIndex& idx, int role) const
0085 {
0086     if (role == eMyMoney::Model::BaseModelRole) {
0087         return eMyMoney::Model::OnlineBalanceEntryRole;
0088     }
0089 
0090     if (idx.isValid()) {
0091         switch(role) {
0092         case eMyMoney::Model::DelegateRole:
0093             return static_cast<int>(eMyMoney::Delegates::Types::OnlineBalanceDelegate);
0094 
0095         case Qt::DisplayRole:
0096             switch (idx.column()) {
0097             case JournalModel::Column::EntryDate:
0098             case JournalModel::Column::Date:
0099                 return QSortFilterProxyModel::data(idx, eMyMoney::Model::AccountOnlineBalanceDateRole);
0100             case JournalModel::Column::Balance:
0101                 return QSortFilterProxyModel::data(idx, eMyMoney::Model::AccountBalanceRole);
0102             }
0103             break;
0104 
0105         case eMyMoney::Model::JournalSplitIdRole:
0106         case eMyMoney::Model::SplitAccountIdRole:
0107             return QSortFilterProxyModel::data(idx, eMyMoney::Model::IdRole);
0108 
0109         case eMyMoney::Model::TransactionPostDateRole:
0110         case eMyMoney::Model::TransactionEntryDateRole:
0111             return QSortFilterProxyModel::data(idx, eMyMoney::Model::AccountOnlineBalanceDateRole);
0112 
0113         case Qt::ForegroundRole:
0114             return QVariant();
0115 
0116         case Qt::FontRole:
0117             return QVariant();
0118 
0119         case Qt::TextAlignmentRole:
0120             switch(idx.column()) {
0121             case AccountsModel::Column::Balance:
0122                 return QVariant(Qt::AlignRight | Qt::AlignVCenter);
0123 
0124             default:
0125                 return QVariant(Qt::AlignLeft | Qt::AlignVCenter);
0126             }
0127             break;
0128         }
0129     }
0130 
0131     return QSortFilterProxyModel::data(idx, role);
0132 }
0133 
0134 Qt::ItemFlags OnlineBalanceProxyModel::flags(const QModelIndex& idx) const
0135 {
0136     Q_UNUSED(idx)
0137     return Qt::NoItemFlags;
0138 }
0139 
0140 bool OnlineBalanceProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
0141 {
0142     // never show a favorite entry
0143     auto idx = sourceModel()->index(source_row, 0, source_parent);
0144     if (idx.data(eMyMoney::Model::AccountIsFavoriteIndexRole).toBool() == true)
0145         return false;
0146 
0147     // don't show an online balance if there isn't any for the account
0148     const auto dateValue = idx.data(eMyMoney::Model::AccountOnlineBalanceDateRole);
0149     if (!dateValue.isValid()) {
0150         return false;
0151     }
0152 
0153     return dateValue.toDate().isValid();
0154 }