1 /***************************************************************************
2                              kloanpayoutpage.cpp
3                              -------------------
4     begin                : Tue Sep 25 2006
5     copyright            : (C) 2007 Thomas Baumgart
6     email                : Thomas Baumgart <ipwizard@users.sourceforge.net>
7                            (C) 2017 by Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
8  ***************************************************************************/
9 
10 /***************************************************************************
11  *                                                                         *
12  *   This program is free software; you can redistribute it and/or modify  *
13  *   it under the terms of the GNU General Public License as published by  *
14  *   the Free Software Foundation; either version 2 of the License, or     *
15  *   (at your option) any later version.                                   *
16  *                                                                         *
17  ***************************************************************************/
18 
19 #include "kloanpayoutpage.h"
20 #include "kloanpayoutpage_p.h"
21 
22 // ----------------------------------------------------------------------------
23 // QT Includes
24 
25 #include <QCheckBox>
26 #include <QFrame>
27 #include <QHash>
28 #include <QIcon>
29 #include <QLineEdit>
30 #include <QPushButton>
31 #include <QTimer>
32 
33 // ----------------------------------------------------------------------------
34 // KDE Includes
35 
36 #include <KGuiItem>
37 #include <KLocalizedString>
38 
39 // ----------------------------------------------------------------------------
40 // Project Includes
41 
42 #include "ui_kaccounttypepage.h"
43 #include "ui_kloanpayoutpage.h"
44 
45 #include <kguiutils.h>
46 #include "icons.h"
47 #include "kmymoneyaccountselector.h"
48 #include "kmymoneycategory.h"
49 #include "kmymoneydateinput.h"
50 #include "kmymoneywizardpage.h"
51 #include "knewaccountwizard.h"
52 #include "knewaccountwizard_p.h"
53 #include "kaccountsummarypage.h"
54 #include "kaccounttypepage.h"
55 #include "kaccounttypepage_p.h"
56 #include "mymoneyaccount.h"
57 #include "mymoneyenums.h"
58 #include "mymoneyfile.h"
59 #include "wizardpage.h"
60 
61 using namespace NewAccountWizard;
62 using namespace Icons;
63 using namespace eMyMoney;
64 
65 namespace NewAccountWizard
66 {
LoanPayoutPage(Wizard * wizard)67   LoanPayoutPage::LoanPayoutPage(Wizard* wizard) :
68     QWidget(wizard),
69     WizardPage<Wizard>(*new LoanPayoutPagePrivate(wizard), StepPayout, this, wizard)
70   {
71     Q_D(LoanPayoutPage);
72     d->ui->setupUi(this);
73     d->m_mandatoryGroup->add(d->ui->m_assetAccount->lineEdit());
74     d->m_mandatoryGroup->add(d->ui->m_loanAccount->lineEdit());
75 
76     KGuiItem createAssetButtenItem(i18n("&Create..."),
77                                    Icons::get(Icon::DocumentNew),
78         i18n("Create a new asset account"),
79         i18n("If the asset account does not yet exist, press this button to create it."));
80     KGuiItem::assign(d->ui->m_createAssetButton, createAssetButtenItem);
81     d->ui->m_createAssetButton->setToolTip(createAssetButtenItem.toolTip());
82     d->ui->m_createAssetButton->setWhatsThis(createAssetButtenItem.whatsThis());
83     connect(d->ui->m_createAssetButton, &QAbstractButton::clicked, this, &LoanPayoutPage::slotCreateAssetAccount);
84 
85     connect(d->ui->m_noPayoutTransaction, &QAbstractButton::toggled, this, &LoanPayoutPage::slotButtonsToggled);
86     connect(d->ui->m_refinanceLoan, &QAbstractButton::toggled, this, &LoanPayoutPage::slotButtonsToggled);
87 
88     connect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, this, &LoanPayoutPage::slotLoadWidgets);
89     slotLoadWidgets();
90   }
91 
~LoanPayoutPage()92   LoanPayoutPage::~LoanPayoutPage()
93   {
94   }
95 
slotButtonsToggled()96   void LoanPayoutPage::slotButtonsToggled()
97   {
98     Q_D(LoanPayoutPage);
99     // we don't go directly, as the order of the emission of signals to slots is
100     // not defined. Using a single shot timer postpones the call of m_mandatoryGroup::changed()
101     // until the next round of the main loop so we can be sure to see all relevant changes
102     // that happened in the meantime (eg. widgets are enabled and disabled)
103     QTimer::singleShot(0, d->m_mandatoryGroup, SLOT(changed()));
104   }
105 
slotCreateAssetAccount()106   void LoanPayoutPage::slotCreateAssetAccount()
107   {
108     Q_D(LoanPayoutPage);
109     MyMoneyAccount acc;
110     acc.setAccountType(Account::Type::Asset);
111     acc.setOpeningDate(d->m_wizard->d_func()->m_accountTypePage->d_func()->ui->m_openingDate->date());
112 
113     emit d->m_wizard->createAccount(acc);
114 
115     if (!acc.id().isEmpty()) {
116         d->ui->m_assetAccount->setSelectedItem(acc.id());
117       }
118   }
119 
slotLoadWidgets()120   void LoanPayoutPage::slotLoadWidgets()
121   {
122     Q_D(LoanPayoutPage);
123     AccountSet set;
124     set.addAccountGroup(Account::Type::Asset);
125     set.load(d->ui->m_assetAccount->selector());
126 
127     set.clear();
128     set.addAccountType(Account::Type::Loan);
129     set.load(d->ui->m_loanAccount->selector());
130   }
131 
enterPage()132   void LoanPayoutPage::enterPage()
133   {
134     Q_D(LoanPayoutPage);
135     // only allow to create new asset accounts for liability loans
136     d->ui->m_createAssetButton->setEnabled(d->m_wizard->moneyBorrowed());
137     d->ui->m_refinanceLoan->setEnabled(d->m_wizard->moneyBorrowed());
138     if (!d->m_wizard->moneyBorrowed()) {
139         d->ui->m_refinanceLoan->setChecked(false);
140       }
141     d->ui->m_payoutDetailFrame->setDisabled(d->ui->m_noPayoutTransaction->isChecked());
142   }
143 
nextPage() const144   KMyMoneyWizardPage* LoanPayoutPage::nextPage() const
145   {
146     Q_D(const LoanPayoutPage);
147     return d->m_wizard->d_func()->m_accountSummaryPage;
148   }
149 
initialFocusWidget() const150   QWidget* LoanPayoutPage::initialFocusWidget() const
151   {
152     Q_D(const LoanPayoutPage);
153     return d->ui->m_noPayoutTransaction;
154   }
155 
isComplete() const156   bool LoanPayoutPage::isComplete() const
157   {
158     Q_D(const LoanPayoutPage);
159     return KMyMoneyWizardPage::isComplete() | d->ui->m_noPayoutTransaction->isChecked();
160   }
161 
payoutAccountId() const162   QString LoanPayoutPage::payoutAccountId() const
163   {
164     Q_D(const LoanPayoutPage);
165     if (d->ui->m_refinanceLoan->isChecked()) {
166         return d->ui->m_loanAccount->selectedItem();
167       } else {
168         return d->ui->m_assetAccount->selectedItem();
169       }
170   }
171 
172 }
173