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

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     const auto toSplits = to.splits();
0067     const auto tnSplits = tn.splits();
0068 
0069     try {
0070         if (toSplits.isEmpty())
0071             throw MYMONEYEXCEPTION(i18n("Transaction %1 has no splits", to.id()));
0072         if (tnSplits.isEmpty())
0073             throw MYMONEYEXCEPTION(i18n("Transaction %1 has no splits", tn.id()));
0074 
0075         QString po, pn;
0076         if (!toSplits.front().payeeId().isEmpty())
0077             po = file->payee(toSplits.front().payeeId()).name();
0078         if (!tnSplits.front().payeeId().isEmpty())
0079             pn = file->payee(tnSplits.front().payeeId()).name();
0080 
0081         if (po != pn) {
0082             messageDetail += i18n("<p>Payee changed.<br/>&nbsp;&nbsp;&nbsp;Old: <b>%1</b>, New: <b>%2</b></p>", po, pn);
0083         }
0084 
0085         if (toSplits.front().accountId() != tnSplits.front().accountId()) {
0086             messageDetail += i18n("<p>Account changed.<br/>&nbsp;&nbsp;&nbsp;Old: <b>%1</b>, New: <b>%2</b></p>",
0087                                   file->account(toSplits.front().accountId()).name(),
0088                                   file->account(tnSplits.front().accountId()).name());
0089         }
0090 
0091         if (file->isTransfer(to) && file->isTransfer(tn)) {
0092             if (toSplits.at(1).accountId() != tnSplits.at(1).accountId()) {
0093                 messageDetail += i18n("<p>Transfer account changed.<br/>&nbsp;&nbsp;&nbsp;Old: <b>%1</b>, New: <b>%2</b></p>",
0094                                       file->account(toSplits.at(1).accountId()).name(),
0095                                       file->account(tnSplits.at(1).accountId()).name());
0096             }
0097         } else {
0098             QString co, cn;
0099             switch (to.splitCount()) {
0100             default:
0101                 co = i18nc("Split transaction (category replacement)", "Split transaction");
0102                 break;
0103             case 2:
0104                 co = file->accountToCategory(toSplits.at(1).accountId());
0105             case 1:
0106                 break;
0107             }
0108 
0109             switch (tn.splitCount()) {
0110             default:
0111                 cn = i18nc("Split transaction (category replacement)", "Split transaction");
0112                 break;
0113             case 2:
0114                 cn = file->accountToCategory(tnSplits.at(1).accountId());
0115             case 1:
0116                 break;
0117             }
0118             if (co != cn) {
0119                 messageDetail += i18n("<p>Category changed.<br/>&nbsp;&nbsp;&nbsp;Old: <b>%1</b>, New: <b>%2</b></p>", co, cn);
0120             }
0121         }
0122 
0123         QString mo, mn;
0124         mo = toSplits.front().memo();
0125         mn = tnSplits.front().memo();
0126         if (mo.isEmpty())
0127             mo = QString("<i>") + i18nc("Empty memo", "empty") + QString("</i>");
0128         if (mn.isEmpty())
0129             mn = QString("<i>") + i18nc("Empty memo", "empty") + QString("</i>");
0130         if (mo != mn) {
0131             messageDetail += i18n("<p>Memo changed.<br/>&nbsp;&nbsp;&nbsp;Old: <b>%1</b>, New: <b>%2</b></p>", mo, mn);
0132         }
0133 
0134         QString no, nn;
0135         no = toSplits.front().number();
0136         nn = tnSplits.front().number();
0137         if (no.isEmpty())
0138             no = QString("<i>") + i18nc("No number", "empty") + QString("</i>");
0139         if (nn.isEmpty())
0140             nn = QString("<i>") + i18nc("No number", "empty") + QString("</i>");
0141         if (no != nn) {
0142             messageDetail += i18n("<p>Number changed.<br/>&nbsp;&nbsp;&nbsp;Old: <b>%1</b>, New: <b>%2</b></p>", no, nn);
0143         }
0144 
0145         const MyMoneySecurity& sec = MyMoneyFile::instance()->security(to.commodity());
0146         MyMoneyMoney ao, an;
0147         ao = toSplits.front().value();
0148         an = tnSplits.front().value();
0149         if (ao != an) {
0150             messageDetail += i18n("<p>Amount changed.<br/>&nbsp;&nbsp;&nbsp;Old: <b>%1</b>, New: <b>%2</b></p>", ao.formatMoney(sec.smallestAccountFraction()), an.formatMoney(sec.smallestAccountFraction()));
0151         }
0152 
0153         eMyMoney::Split::State fo, fn;
0154         fo = toSplits.front().reconcileFlag();
0155         fn = tnSplits.front().reconcileFlag();
0156         if (fo != fn) {
0157             messageDetail += i18n("<p>Reconciliation flag changed.<br/>&nbsp;&nbsp;&nbsp;Old: <b>%1</b>, New: <b>%2</b></p>",    KMyMoneyUtils::reconcileStateToString(fo, true), KMyMoneyUtils::reconcileStateToString(fn, true));
0158         }
0159     } catch (const MyMoneyException& e) {
0160         KMessageBox::error(this, i18n("Fatal error in determining data: %1", QString::fromLatin1(e.what())));
0161     }
0162 
0163     messageDetail += "</qt>";
0164     ui->m_details->setText(messageDetail);
0165     return;
0166 }
0167 
0168 KConfirmManualEnterDlg::Action KConfirmManualEnterDlg::action() const
0169 {
0170     if (ui->m_discardRadio->isChecked())
0171         return UseOriginal;
0172     if (ui->m_setRadio->isChecked())
0173         return ModifyAlways;
0174     return ModifyOnce;
0175 }