File indexing completed on 2024-05-12 16:42:03
0001 /* 0002 SPDX-FileCopyrightText: 2007-2011 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 #include "kconfirmmanualenterdlg.h" 0008 0009 // ---------------------------------------------------------------------------- 0010 // QT Includes 0011 0012 #include <QButtonGroup> 0013 #include <QRadioButton> 0014 0015 // ---------------------------------------------------------------------------- 0016 // KDE Includes 0017 0018 #include <KTextEdit> 0019 #include <KMessageBox> 0020 #include <KLocalizedString> 0021 0022 // ---------------------------------------------------------------------------- 0023 // Project Includes 0024 0025 #include "ui_kconfirmmanualenterdlg.h" 0026 0027 #include "mymoneymoney.h" 0028 #include "mymoneyfile.h" 0029 #include "mymoneyaccount.h" 0030 #include "mymoneysecurity.h" 0031 #include "mymoneypayee.h" 0032 #include "mymoneysplit.h" 0033 #include "mymoneyschedule.h" 0034 #include "mymoneyexception.h" 0035 #include "kmymoneyutils.h" 0036 #include "mymoneytransaction.h" 0037 #include "mymoneyenums.h" 0038 0039 KConfirmManualEnterDlg::KConfirmManualEnterDlg(const MyMoneySchedule& schedule, QWidget* parent) : 0040 QDialog(parent), 0041 ui(new Ui::KConfirmManualEnterDlg) 0042 { 0043 ui->setupUi(this); 0044 ui->buttonGroup1->setId(ui->m_discardRadio, 0); 0045 ui->buttonGroup1->setId(ui->m_onceRadio, 1); 0046 ui->buttonGroup1->setId(ui->m_setRadio, 2); 0047 0048 ui->m_onceRadio->setChecked(true); 0049 0050 if (schedule.type() == eMyMoney::Schedule::Type::LoanPayment) { 0051 ui->m_setRadio->setEnabled(false); 0052 ui->m_discardRadio->setEnabled(false); 0053 } 0054 } 0055 0056 KConfirmManualEnterDlg::~KConfirmManualEnterDlg() 0057 { 0058 delete ui; 0059 } 0060 0061 void KConfirmManualEnterDlg::loadTransactions(const MyMoneyTransaction& to, const MyMoneyTransaction& tn) 0062 { 0063 QString messageDetail("<qt>"); 0064 auto file = MyMoneyFile::instance(); 0065 0066 try { 0067 int noItemsChanged = 0; 0068 0069 if (to.splits().isEmpty()) 0070 throw MYMONEYEXCEPTION(i18n("Transaction %1 has no splits", to.id())); 0071 if (tn.splits().isEmpty()) 0072 throw MYMONEYEXCEPTION(i18n("Transaction %1 has no splits", tn.id())); 0073 0074 QString po, pn; 0075 if (!to.splits().front().payeeId().isEmpty()) 0076 po = file->payee(to.splits().front().payeeId()).name(); 0077 if (!tn.splits().front().payeeId().isEmpty()) 0078 pn = file->payee(tn.splits().front().payeeId()).name(); 0079 0080 if (po != pn) { 0081 noItemsChanged++; 0082 messageDetail += i18n("<p>Payee changed.<br/> Old: <b>%1</b>, New: <b>%2</b></p>", po, pn); 0083 } 0084 0085 if (to.splits().front().accountId() != tn.splits().front().accountId()) { 0086 noItemsChanged++; 0087 messageDetail += i18n("<p>Account changed.<br/> Old: <b>%1</b>, New: <b>%2</b></p>" 0088 , file->account(to.splits().front().accountId()).name() 0089 , file->account(tn.splits().front().accountId()).name()); 0090 } 0091 0092 if (file->isTransfer(to) && file->isTransfer(tn)) { 0093 if (to.splits()[1].accountId() != tn.splits()[1].accountId()) { 0094 noItemsChanged++; 0095 messageDetail += i18n("<p>Transfer account changed.<br/> Old: <b>%1</b>, New: <b>%2</b></p>" 0096 , file->account(to.splits()[1].accountId()).name() 0097 , file->account(tn.splits()[1].accountId()).name()); 0098 } 0099 } else { 0100 QString co, cn; 0101 switch (to.splitCount()) { 0102 default: 0103 co = i18nc("Split transaction (category replacement)", "Split transaction"); 0104 break; 0105 case 2: 0106 co = file->accountToCategory(to.splits()[1].accountId()); 0107 case 1: 0108 break; 0109 } 0110 0111 switch (tn.splitCount()) { 0112 default: 0113 cn = i18nc("Split transaction (category replacement)", "Split transaction"); 0114 break; 0115 case 2: 0116 cn = file->accountToCategory(tn.splits()[1].accountId()); 0117 case 1: 0118 break; 0119 } 0120 if (co != cn) { 0121 noItemsChanged++; 0122 messageDetail += i18n("<p>Category changed.<br/> Old: <b>%1</b>, New: <b>%2</b></p>", co, cn); 0123 } 0124 } 0125 0126 QString mo, mn; 0127 mo = to.splits().front().memo(); 0128 mn = tn.splits().front().memo(); 0129 if (mo.isEmpty()) 0130 mo = QString("<i>") + i18nc("Empty memo", "empty") + QString("</i>"); 0131 if (mn.isEmpty()) 0132 mn = QString("<i>") + i18nc("Empty memo", "empty") + QString("</i>"); 0133 if (mo != mn) { 0134 noItemsChanged++; 0135 messageDetail += i18n("<p>Memo changed.<br/> Old: <b>%1</b>, New: <b>%2</b></p>", mo, mn); 0136 } 0137 0138 QString no, nn; 0139 no = to.splits().front().number(); 0140 nn = tn.splits().front().number(); 0141 if (no.isEmpty()) 0142 no = QString("<i>") + i18nc("No number", "empty") + QString("</i>"); 0143 if (nn.isEmpty()) 0144 nn = QString("<i>") + i18nc("No number", "empty") + QString("</i>"); 0145 if (no != nn) { 0146 noItemsChanged++; 0147 messageDetail += i18n("<p>Number changed.<br/> Old: <b>%1</b>, New: <b>%2</b></p>", no, nn); 0148 } 0149 0150 const MyMoneySecurity& sec = MyMoneyFile::instance()->security(to.commodity()); 0151 MyMoneyMoney ao, an; 0152 ao = to.splits().front().value(); 0153 an = tn.splits().front().value(); 0154 if (ao != an) { 0155 noItemsChanged++; 0156 messageDetail += i18n("<p>Amount changed.<br/> Old: <b>%1</b>, New: <b>%2</b></p>", ao.formatMoney(sec.smallestAccountFraction()), an.formatMoney(sec.smallestAccountFraction())); 0157 } 0158 0159 eMyMoney::Split::State fo, fn; 0160 fo = to.splits().front().reconcileFlag(); 0161 fn = tn.splits().front().reconcileFlag(); 0162 if (fo != fn) { 0163 noItemsChanged++; 0164 messageDetail += i18n("<p>Reconciliation flag changed.<br/> Old: <b>%1</b>, New: <b>%2</b></p>", KMyMoneyUtils::reconcileStateToString(fo, true), KMyMoneyUtils::reconcileStateToString(fn, true)); 0165 } 0166 } catch (const MyMoneyException &e) { 0167 KMessageBox::error(this, i18n("Fatal error in determining data: %1", QString::fromLatin1(e.what()))); 0168 } 0169 0170 messageDetail += "</qt>"; 0171 ui->m_details->setText(messageDetail); 0172 return; 0173 } 0174 0175 KConfirmManualEnterDlg::Action KConfirmManualEnterDlg::action() const 0176 { 0177 if (ui->m_discardRadio->isChecked()) 0178 return UseOriginal; 0179 if (ui->m_setRadio->isChecked()) 0180 return ModifyAlways; 0181 return ModifyOnce; 0182 }