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/>&nbsp;&nbsp;&nbsp;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/>&nbsp;&nbsp;&nbsp;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/>&nbsp;&nbsp;&nbsp;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/>&nbsp;&nbsp;&nbsp;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/>&nbsp;&nbsp;&nbsp;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/>&nbsp;&nbsp;&nbsp;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/>&nbsp;&nbsp;&nbsp;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/>&nbsp;&nbsp;&nbsp;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 }