File indexing completed on 2024-05-19 05:08:16

0001 /*
0002     SPDX-FileCopyrightText: 2021 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "kenterscheduledlg.h"
0007 
0008 // ----------------------------------------------------------------------------
0009 // QT Includes
0010 
0011 #include <QDate>
0012 #include <QIcon>
0013 #include <QWindow>
0014 
0015 // ----------------------------------------------------------------------------
0016 // KDE Includes
0017 
0018 #include <KConfigGroup>
0019 #include <KGuiItem>
0020 #include <KHelpClient>
0021 #include <KLocalizedString>
0022 #include <KMessageBox>
0023 #include <KSharedConfig>
0024 #include <KStandardGuiItem>
0025 #include <KWindowConfig>
0026 
0027 // ----------------------------------------------------------------------------
0028 // Project Includes
0029 
0030 #include "ui_kenterscheduledlg.h"
0031 
0032 #include "dialogenums.h"
0033 #include "icons.h"
0034 #include "kmymoneyutils.h"
0035 #include "mymoneyaccount.h"
0036 #include "mymoneyenums.h"
0037 #include "mymoneyexception.h"
0038 #include "mymoneymoney.h"
0039 #include "mymoneyschedule.h"
0040 
0041 using namespace Icons;
0042 
0043 class KEnterScheduleDlgPrivate
0044 {
0045     Q_DISABLE_COPY(KEnterScheduleDlgPrivate)
0046 
0047 public:
0048     KEnterScheduleDlgPrivate()
0049         : ui(new Ui::KEnterScheduleDlg)
0050         , m_editor(nullptr)
0051         , m_showWarningOnce(true)
0052         , m_extendedReturnCode(eDialogs::ScheduleResultCode::Cancel)
0053     {
0054     }
0055 
0056     ~KEnterScheduleDlgPrivate()
0057     {
0058         delete ui;
0059     }
0060 
0061     Ui::KEnterScheduleDlg* ui;
0062     NewTransactionEditor* m_editor;
0063     MyMoneySchedule m_schedule;
0064     bool m_showWarningOnce;
0065     eDialogs::ScheduleResultCode m_extendedReturnCode;
0066 };
0067 
0068 KEnterScheduleDlg::KEnterScheduleDlg(QWidget* parent, const MyMoneySchedule& schedule)
0069     : QDialog(parent)
0070     , d_ptr(new KEnterScheduleDlgPrivate)
0071 {
0072     Q_D(KEnterScheduleDlg);
0073 
0074     // restore the last used dialog size
0075     KConfigGroup grp = KSharedConfig::openConfig()->group("KEnterScheduleDlg");
0076     if (grp.isValid()) {
0077         KWindowConfig::restoreWindowSize(windowHandle(), grp);
0078     }
0079     // let the minimum size be 780x410
0080     resize(QSize(780, 410).expandedTo(windowHandle() ? windowHandle()->size() : QSize()));
0081 
0082     // position the dialog centered on the application (for some reason without
0083     // a call to winId() the dialog is positioned in the upper left corner of
0084     // the screen, but winId() crashes on MS-Windows ...
0085     if (parent)
0086         move(parent->pos() + QPoint(parent->width() / 2, parent->height() / 2) - QPoint(width() / 2, height() / 2));
0087 
0088     d->ui->setupUi(this);
0089 
0090     d->m_editor = d->ui->m_editor;
0091     d->m_editor->setShowButtons(false);
0092     d->m_editor->layout()->setContentsMargins(0, 0, 0, 0);
0093 
0094     d->m_schedule = schedule;
0095     const auto account = schedule.account();
0096     if (!account.id().isEmpty()) {
0097         d->m_editor->setAccountId(account.id());
0098     }
0099 
0100     d->m_extendedReturnCode = eDialogs::ScheduleResultCode::Enter;
0101 
0102     d->ui->buttonOk->setIcon(Icons::get(Icon::KeyEnter));
0103     d->ui->buttonSkip->setIcon(Icons::get(Icon::SeekForward));
0104     KGuiItem::assign(d->ui->buttonCancel, KStandardGuiItem::cancel());
0105     KGuiItem::assign(d->ui->buttonHelp, KStandardGuiItem::help());
0106     d->ui->buttonIgnore->setHidden(true);
0107     d->ui->buttonSkip->setHidden(true);
0108 
0109     try {
0110         if (d->m_schedule.type() == eMyMoney::Schedule::Type::LoanPayment) {
0111             // in case of a loan payment we need to adjust the schedule locally
0112             // to contain the actual values for the next transaction. We do that
0113             // on a copy of the schedule.
0114             auto loanSchedule(d->m_schedule);
0115             auto t = loanSchedule.transaction();
0116             KMyMoneyUtils::calculateAutoLoan(loanSchedule, t, QMap<QString, MyMoneyMoney>());
0117             loanSchedule.setTransaction(t);
0118             d->m_editor->loadSchedule(loanSchedule);
0119         } else {
0120             d->m_editor->loadSchedule(d->m_schedule);
0121             d->m_editor->setKeepCategoryAmount(d->m_schedule.keepMultiCurrencyAmount());
0122         }
0123     } catch (const MyMoneyException& e) {
0124         KMessageBox::detailedError(this, i18n("Unable to load schedule details"), QString::fromLatin1(e.what()));
0125     }
0126 
0127     // setup name and type
0128     d->ui->m_scheduleName->setText(d->m_schedule.name());
0129     d->ui->m_type->setText(KMyMoneyUtils::scheduleTypeToString(d->m_schedule.type()));
0130 
0131     connect(d->ui->buttonHelp, &QAbstractButton::clicked, this, [&]() {
0132         KHelpClient::invokeHelp("details.schedules.entering");
0133     });
0134 
0135     connect(d->ui->buttonIgnore, &QAbstractButton::clicked, this, [&]() {
0136         Q_D(KEnterScheduleDlg);
0137         d->m_extendedReturnCode = eDialogs::ScheduleResultCode::Ignore;
0138         accept();
0139     });
0140     connect(d->ui->buttonSkip, &QAbstractButton::clicked, this, [&]() {
0141         Q_D(KEnterScheduleDlg);
0142         d->m_extendedReturnCode = eDialogs::ScheduleResultCode::Skip;
0143         accept();
0144     });
0145 }
0146 
0147 KEnterScheduleDlg::~KEnterScheduleDlg()
0148 {
0149     Q_D(KEnterScheduleDlg);
0150 
0151     // store the last used dialog size
0152     KConfigGroup grp = KSharedConfig::openConfig()->group("KEnterScheduleDlg");
0153     if (grp.isValid()) {
0154         KWindowConfig::saveWindowSize(windowHandle(), grp);
0155     }
0156 
0157     delete d;
0158 }
0159 
0160 eDialogs::ScheduleResultCode KEnterScheduleDlg::resultCode() const
0161 {
0162     Q_D(const KEnterScheduleDlg);
0163     if (result() == QDialog::Accepted)
0164         return d->m_extendedReturnCode;
0165     return eDialogs::ScheduleResultCode::Cancel;
0166 }
0167 
0168 void KEnterScheduleDlg::setShowExtendedKeys(bool visible)
0169 {
0170     Q_D(KEnterScheduleDlg);
0171     d->ui->buttonIgnore->setVisible(visible);
0172     d->ui->buttonSkip->setVisible(visible);
0173 }
0174 
0175 MyMoneyTransaction KEnterScheduleDlg::transaction()
0176 {
0177     Q_D(const KEnterScheduleDlg);
0178     auto t = d->m_editor->transaction();
0179     t.clearId();
0180     t.setEntryDate(QDate());
0181     return t;
0182 }
0183 
0184 QDate KEnterScheduleDlg::date(const QDate& _date) const
0185 {
0186     Q_D(const KEnterScheduleDlg);
0187     auto date(_date);
0188     return d->m_schedule.adjustedDate(date, d->m_schedule.weekendOption());
0189 }
0190 
0191 int KEnterScheduleDlg::exec()
0192 {
0193     Q_D(KEnterScheduleDlg);
0194     if (d->m_showWarningOnce) {
0195         d->m_showWarningOnce = false;
0196         KMessageBox::information(parentWidget(),
0197                                  QString("<qt>%1</qt>")
0198                                      .arg(i18n("<p>Please check that all the details in the following dialog are correct and press OK.</p><p>Editable data can "
0199                                                "be changed and can either be applied to just this occurrence or for all subsequent occurrences for this "
0200                                                "schedule.  (You will be asked what you intend after pressing OK in the following dialog)</p>")),
0201                                  i18n("Enter scheduled transaction"),
0202                                  "EnterScheduleDlgInfo");
0203     }
0204 
0205     return QDialog::exec();
0206 }