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