summaryrefslogtreecommitdiffstats
path: root/kmymoney2/dialogs/transactioneditor.h
diff options
context:
space:
mode:
Diffstat (limited to 'kmymoney2/dialogs/transactioneditor.h')
-rw-r--r--kmymoney2/dialogs/transactioneditor.h416
1 files changed, 416 insertions, 0 deletions
diff --git a/kmymoney2/dialogs/transactioneditor.h b/kmymoney2/dialogs/transactioneditor.h
new file mode 100644
index 0000000..bf47598
--- /dev/null
+++ b/kmymoney2/dialogs/transactioneditor.h
@@ -0,0 +1,416 @@
+/***************************************************************************
+ transactioneditor.h
+ ----------
+ begin : Wed Jun 07 2006
+ copyright : (C) 2006 by Thomas Baumgart
+ email : Thomas Baumgart <ipwizard@users.sourceforge.net>
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef TRANSACTIONEDITOR_H
+#define TRANSACTIONEDITOR_H
+
+// ----------------------------------------------------------------------------
+// QT Includes
+
+#include <qobject.h>
+#include <qwidgetlist.h>
+
+// ----------------------------------------------------------------------------
+// KDE Includes
+
+
+// ----------------------------------------------------------------------------
+// Project Includes
+
+#include <kmymoney/mymoneyscheduled.h>
+#include <kmymoney/transactioneditorcontainer.h>
+#include <kmymoney/register.h>
+
+class KCurrencyExchange;
+class KMyMoneyCategory;
+
+class TransactionEditor : public QObject
+{
+ Q_OBJECT
+public:
+ TransactionEditor() {}
+ TransactionEditor(TransactionEditorContainer* regForm, KMyMoneyRegister::Transaction* item, const KMyMoneyRegister::SelectedTransactions& list, const QDate& lastPostDate);
+ virtual ~TransactionEditor();
+
+ /**
+ * This method is used as a helper because virtual methods cannot be
+ * called within a constructor. Thus setup() should be called immediately
+ * after a TransactionEditor() object or one of its derivatives is
+ * constructed. The parameter @a account identifies the account that
+ * is currently opened in the calling ledger view.
+ *
+ * This account will not be included in category sets. The default is
+ * no account so all will be shown. I have no idea anymore, what I
+ * tried to say with the first sentence above. :( Maybe this is crap.
+ *
+ * @param tabOrderWidgets QWidgetList which will be filled with the pointers
+ * to the editWidgets in their tab order
+ * @param account account that is currently shown in the calling ledger view
+ * @param action default action (defaults to ActionNone).
+ */
+ void setup(QWidgetList& tabOrderWidgets, const MyMoneyAccount& account = MyMoneyAccount(), KMyMoneyRegister::Action action = KMyMoneyRegister::ActionNone);
+
+ /**
+ * Enter the transactions into the ledger. In case of a newly created
+ * transaction @a newId contains the assigned id. In case @a askForSchedule
+ * is true (the default), the user will be asked if he wants to enter new
+ * transactions with a post date in the future into the ledger or rather
+ * create a schedule for them. In case @a suppressBalanceWarnings is @p false
+ * (the default) a warning will be displayed when the balance crosses the minimum
+ * or maximum balance settings for the account.
+ */
+ virtual bool enterTransactions(QString& newId, bool askForSchedule = true, bool suppressBalanceWarnings = false);
+
+ /**
+ * This method creates a transaction based on the contents of the current widgets,
+ * the splits in m_split in single selection mode or an existing transaction/split
+ * and the contents of the widgets in multi selection mode.
+ *
+ * The split referencing the current account is returned as the first split in the
+ * transaction's split list.
+ *
+ * @param t reference to created transaction
+ * @param torig the original transaction
+ * @param sorig the original split
+ * @param skipPriceDialog if @p true the user will not be requested for price information
+ * (defaults to @p false)
+ *
+ * @return @p false if aborted by user, @p true otherwise
+ *
+ * @note Usually not used directly. If unsure, use enterTransactions() instead.
+ */
+ virtual bool createTransaction(MyMoneyTransaction& t, const MyMoneyTransaction& torig, const MyMoneySplit& sorig, bool skipPriceDialog = false) = 0;
+
+ /**
+ * This method returns information about the completeness of the data
+ * entered. This can be used to control the availability of the
+ * 'Enter transaction' action.
+ *
+ * @retval true if entering the transaction into the engine
+ * @retval false if not enough information is present to enter the
+ * transaction into the engine
+ *
+ * @param reason will be filled with a string about the reason why the
+ * completeness is not reached. Empty if the return value
+ * is @c true.
+ *
+ * @sa transactionDataSufficient()
+ */
+ virtual bool isComplete(QString& reason) const = 0;
+
+ /**
+ * This method returns information if the editor is started with multiple transactions
+ * being selected or not.
+ *
+ * @retval false only a single transaction was selected when the editor was started
+ * @retval true multiple transactions were selected when the editor was started
+ */
+ virtual bool isMultiSelection(void) const { return m_transactions.count() > 1; }
+
+ virtual bool fixTransactionCommodity(const MyMoneyAccount& account);
+
+ virtual bool canAssignNumber(void) const;
+ virtual void assignNextNumber(void);
+
+ /**
+ * Returns a pointer to the widget that should receive
+ * the focus after the editor has been started.
+ */
+ virtual QWidget* firstWidget(void) const = 0;
+
+ /**
+ * Returns a pointer to a widget by name
+ */
+ QWidget* haveWidget(const QString& name) const;
+
+ void setTransaction(const MyMoneyTransaction& t, const MyMoneySplit& s);
+
+ bool eventFilter(QObject* o, QEvent* e);
+
+ const MyMoneyAccount& account(void) const { return m_account; }
+
+ void clearFinalWidgets(void);
+
+ void addFinalWidget(const QWidget*);
+
+public slots:
+ void slotReloadEditWidgets(void);
+
+ /**
+ * The default implementation returns QDialog::Rejected
+ */
+ virtual int slotEditSplits(void);
+
+ /**
+ * Modify the account which the transaction should be based on. The
+ * initial value for the account is passed during setup().
+ *
+ * @param id of the account to be used
+ */
+ void slotUpdateAccount(const QString& id);
+
+protected:
+ virtual void createEditWidgets(void) = 0;
+ virtual void setupFinalWidgets(void) = 0;
+ virtual void loadEditWidgets(KMyMoneyRegister::Action action = KMyMoneyRegister::ActionNone) = 0;
+ void setupCategoryWidget(KMyMoneyCategory* category, const QValueList<MyMoneySplit>& splits, QString& categoryId, const char* splitEditSlot, bool allowObjectCreation = true);
+
+ /**
+ * This method sets the precision of the value widgets to reflect
+ * the account in m_account. If m_account has no id, the precision
+ * defaults to 2.
+ */
+ void setupPrecision(void);
+
+protected slots:
+ virtual void slotUpdateButtonState(void);
+ virtual void slotUpdateAccount(void);
+ virtual void slotNumberChanged(const QString&);
+
+signals:
+ /**
+ * This signal is sent out by the destructor to inform other entities
+ * that editing has been finished. The parameter @a t contains the list
+ * of transactions that were processed.
+ */
+ void finishEdit(const KMyMoneyRegister::SelectedTransactions& t);
+
+ /**
+ * This signal is sent out whenever enough data is present to enter the
+ * transaction into the ledger. This signal can be used to control the
+ * KAction which implements entering the transaction.
+ *
+ * @sa isComplete()
+ *
+ * @param state @a true if enough data is present, @a false otherwise.
+ */
+ void transactionDataSufficient(bool state);
+
+ /**
+ * This signal is sent out, when a new payee needs to be created
+ * @sa KMyMoneyCombo::createItem()
+ *
+ * @param txt The name of the payee to be created
+ * @param id A connected slot should store the id of the created object in this variable
+ */
+ void createPayee(const QString& txt, QString& id);
+
+ /**
+ * This signal is sent out, when a new category needs to be created
+ * Depending on the setting of either a payment or deposit, the parent
+ * account will be preset to Expense or Income.
+ *
+ * @param account reference to account info. Will be filled by called slot
+ * @param parent reference to parent account
+ */
+ void createCategory(MyMoneyAccount& account, const MyMoneyAccount& parent);
+
+ /**
+ * This signal is sent out, when a new security (e.g. stock )needs to be created
+ * @a Parent should be the investment account under which the security account
+ * will be created.
+ *
+ * @param account reference to account info. Will be filled by called slot
+ * @param parent reference to parent account
+ */
+ void createSecurity(MyMoneyAccount& account, const MyMoneyAccount& parent);
+
+ /**
+ * Signal is emitted, if any of the widgets enters (@a state equals @a true)
+ * or leaves (@a state equals @a false) object creation mode.
+ *
+ * @param state Enter (@a true) or leave (@a false) object creation
+ */
+ void objectCreation(bool state);
+
+ void statusMsg(const QString& txt);
+
+ void statusProgress(int cnt, int base);
+
+ /**
+ * This signal is sent out for each newly added transaction
+ *
+ * @param date the post date of the newly created transaction
+ */
+ void lastPostDateUsed(const QDate& date);
+
+ /**
+ * This signal is sent out, if the user decides to schedule the transaction @a t
+ * rather then adding it to the ledger right away.
+ */
+ void scheduleTransaction(const MyMoneyTransaction& t, MyMoneySchedule::occurenceE occurence);
+
+ /**
+ * This signal is sent out, if the user double clicks the number field
+ */
+ void assignNumber(void);
+
+ /**
+ * This signal is sent out, if the user has pressed the ESC key.
+ */
+ void escapePressed(void);
+
+ /**
+ * This signal is sent out, if the user has pressed the Return or Enter
+ * key and asks to end editing the transaction
+ */
+ void returnPressed(void);
+
+ /**
+ * This signal is sent out, if any of the balance warning levels
+ * for @p account has been reached. @p msg contains the message text.
+ * @p parent points to the parent widget to be used for the warning message box.
+ */
+ void balanceWarning(QWidget* parent, const MyMoneyAccount& account, const QString& msg);
+
+protected:
+ QValueList<MyMoneySplit> m_splits;
+ KMyMoneyRegister::SelectedTransactions m_transactions;
+ QValueList<const QWidget*> m_finalEditWidgets;
+ TransactionEditorContainer* m_regForm;
+ KMyMoneyRegister::Transaction* m_item;
+ KMyMoneyRegister::QWidgetContainer m_editWidgets;
+ MyMoneyAccount m_account;
+ MyMoneyTransaction m_transaction;
+ MyMoneySplit m_split;
+ QDate m_lastPostDate;
+ QMap<QString, MyMoneyMoney> m_priceInfo;
+ KMyMoneyRegister::Action m_initialAction;
+ bool m_openEditSplits;
+};
+
+
+class StdTransactionEditor : public TransactionEditor
+{
+ Q_OBJECT
+public:
+ StdTransactionEditor();
+ StdTransactionEditor(TransactionEditorContainer* regForm, KMyMoneyRegister::Transaction* item, const KMyMoneyRegister::SelectedTransactions& list, const QDate& lastPostDate);
+ ~StdTransactionEditor();
+
+ bool isComplete(QString& reason) const;
+ QWidget* firstWidget(void) const;
+
+ bool eventFilter(QObject* o, QEvent* e);
+
+ /**
+ * This method creates a transaction based on the contents of the current widgets,
+ * the splits in m_split in single selection mode or an existing transaction/split
+ * and the contents of the widgets in multi selection mode.
+ *
+ * The split referencing the current account is returned as the first split in the
+ * transaction's split list.
+ *
+ * @param t reference to created transaction
+ * @param torig the original transaction
+ * @param sorig the original split
+ * @param skipPriceDialog if @p true the user will not be requested for price information
+ * (defaults to @p false)
+ *
+ * @return @p false if aborted by user, @p true otherwise
+ *
+ * @note Usually not used directly. If unsure, use enterTransactions() instead.
+ */
+ bool createTransaction(MyMoneyTransaction& t, const MyMoneyTransaction& torig, const MyMoneySplit& sorig, bool skipPriceDialog = false);
+
+public slots:
+ int slotEditSplits(void);
+ void slotUpdateAmount(const QString&);
+
+protected slots:
+ void slotReloadEditWidgets(void);
+ void slotUpdatePayment(const QString&);
+ void slotUpdateDeposit(const QString&);
+ void slotUpdateCategory(const QString&);
+ void slotUpdatePayee(const QString&);
+ void slotUpdateCashFlow(KMyMoneyRegister::CashFlowDirection);
+ void slotCreateCategory(const QString&, QString&);
+ void slotUpdateAction(int action);
+ void slotUpdateAccount(const QString& id);
+
+protected:
+ /**
+ * This method creates all necessary widgets for this transaction editor.
+ * All signals will be connected to the relevant slots.
+ */
+ void createEditWidgets(void);
+
+ /**
+ * This method (re-)loads the widgets with the transaction information
+ * contained in @a m_transaction and @a m_split.
+ *
+ * @param action preset the edit wigdets for @a action if no transaction
+ * is present
+ */
+ void loadEditWidgets(KMyMoneyRegister::Action action = KMyMoneyRegister::ActionNone);
+
+ void setupCategoryWidget(QString&);
+ void updateAmount(const MyMoneyMoney& value);
+ bool isTransfer(const QString& accId1, const QString& accId2) const;
+
+ void checkPayeeInSplit(MyMoneySplit& s, const QString& payeeId);
+
+ /**
+ * This method fills the editor widgets with the last transaction
+ * that can be found for payee @a payeeId in the account @a m_account.
+ */
+ void autoFill(const QString& payeeId);
+
+ /**
+ * Extracts the amount of the transaction from the widgets depending
+ * if form or register based input method is used.
+ * Returns if an amount has been found in @a update.
+ *
+ * @param update pointer to update information flag
+ * @return amount of transaction (deposit positive, payment negative)
+ */
+ MyMoneyMoney amountFromWidget(bool* update = 0) const;
+
+ /**
+ * Create or update a VAT split
+ */
+ void updateVAT(bool amountChanged = true);
+
+ MyMoneyMoney removeVatSplit(void);
+
+ /**
+ * This method adds a VAT split to transaction @a tr if necessary.
+ *
+ * @param tr transaction that the split should be added to
+ * @param amount Amount to be used for the calculation. Depending upon the
+ * setting of the resp. category, this value is treated as
+ * either gross or net value.
+ * @retval false VAT split has not been added
+ * @retval true VAT split has been added
+ */
+ bool addVatSplit(MyMoneyTransaction& tr, const MyMoneyMoney& amount);
+
+ void setupFinalWidgets(void);
+
+ /**
+ * This method returns the sum of all splits of transaction @a t that
+ * reference account m_account.
+ */
+ MyMoneyMoney shares(const MyMoneyTransaction& t) const;
+
+private:
+ MyMoneyMoney m_shares;
+ bool m_inUpdateVat;
+};
+
+
+#endif