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

0001 /*
0002     SPDX-FileCopyrightText: 2016-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 LEDGERTRANSACTION_P_H
0008 #define LEDGERTRANSACTION_P_H
0009 
0010 // ----------------------------------------------------------------------------
0011 // QT Includes
0012 
0013 #include <QString>
0014 
0015 // ----------------------------------------------------------------------------
0016 // KDE Includes
0017 
0018 #include <KLocalizedString>
0019 
0020 // ----------------------------------------------------------------------------
0021 // Project Includes
0022 
0023 #include "mymoneysplit.h"
0024 #include "mymoneytransaction.h"
0025 #include "mymoneyfile.h"
0026 #include "mymoneyaccount.h"
0027 #include "mymoneypayee.h"
0028 #include "mymoneymoney.h"
0029 
0030 class LedgerTransactionPrivate
0031 {
0032 public:
0033     LedgerTransactionPrivate() :
0034         m_erroneous(false)
0035     {
0036     }
0037 
0038     virtual ~LedgerTransactionPrivate()
0039     {
0040     }
0041 
0042     void init(const MyMoneyTransaction& t, const MyMoneySplit& s)
0043     {
0044         m_transaction = t;
0045         m_split = s;
0046         // extract the payee id
0047         auto payeeId = m_split.payeeId();
0048         if(payeeId.isEmpty()) {
0049             foreach (const auto split, m_transaction.splits()) {
0050                 if(!split.payeeId().isEmpty()) {
0051                     payeeId = split.payeeId();
0052                     break;
0053                 }
0054             }
0055         }
0056         if(!payeeId.isEmpty()) {
0057             m_payeeId = payeeId;
0058             m_payeeName = MyMoneyFile::instance()->payee(payeeId).name();
0059         }
0060 
0061         m_account = MyMoneyFile::instance()->accountToCategory(m_split.accountId());
0062         m_costCenterId = m_split.costCenterId();
0063 
0064         // A transaction can have more than 2 splits ...
0065         if(m_transaction.splitCount() > 2) {
0066             m_counterAccount = i18n("Split transaction");
0067 
0068             // ... exactly two splits ...
0069         } else if(m_transaction.splitCount() == 2) {
0070             foreach (const auto split, m_transaction.splits()) {
0071                 if(split.id() != m_split.id()) {
0072                     m_counterAccountId = split.accountId();
0073                     m_counterAccount = MyMoneyFile::instance()->accountToCategory(m_counterAccountId);
0074                     // in case the own split does not have a costcenter, but the counter split does
0075                     // we use it nevertheless
0076                     if(m_costCenterId.isEmpty())
0077                         m_costCenterId = split.costCenterId();
0078                     break;
0079                 }
0080             }
0081 
0082             // ... or a single split
0083         } else if(!m_split.shares().isZero()) {
0084             m_counterAccount = i18n("*** UNASSIGNED ***");
0085         }
0086 
0087         // The transaction is erroneous in case it is not balanced
0088         m_erroneous = !m_transaction.splitSum().isZero();
0089 
0090         // now take care of the values
0091         setupValueDisplay();
0092     }
0093 
0094     void setupValueDisplay()
0095     {
0096         const auto file = MyMoneyFile::instance();
0097         const auto acc = file->account(m_split.accountId());
0098 
0099         auto value = m_split.value(m_transaction.commodity(), acc.currencyId());
0100         m_signedShares = value.formatMoney(acc.fraction());
0101 
0102         if(value.isNegative()) {
0103             m_shares = m_payment = (-value).formatMoney(acc.fraction());
0104         } else {
0105             m_shares = m_deposit = m_signedShares;
0106         }
0107 
0108         // figure out if it is a debit or credit split. s.a. https://en.wikipedia.org/wiki/Debits_and_credits#Aspects_of_transactions
0109         if(m_split.shares().isNegative()) {
0110             m_sharesSuffix = i18nc("Credit suffix", "Cr.");
0111         } else {
0112             m_sharesSuffix = i18nc("Debit suffix", "Dr.");
0113         }
0114     }
0115 
0116     MyMoneyTransaction  m_transaction;
0117     MyMoneySplit        m_split;
0118     QString             m_counterAccountId;
0119     QString             m_counterAccount;
0120     QString             m_account;
0121     QString             m_costCenterId;
0122     QString             m_payeeName;
0123     QString             m_payeeId;
0124     QString             m_shares;
0125     QString             m_signedShares;
0126     QString             m_payment;
0127     QString             m_deposit;
0128     QString             m_balance;
0129     QString             m_sharesSuffix; // shows Cr or Dr
0130     bool                m_erroneous;
0131 };
0132 
0133 #endif // LEDGERTRANSACTION_P_H