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 }