|
|
|
/***************************************************************************
|
|
|
|
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 <tqobject.h>
|
|
|
|
#include <tqwidgetlist.h>
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// KDE Includes
|
|
|
|
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// Project Includes
|
|
|
|
|
|
|
|
#include <kmymoney/mymoneyscheduled.h>
|
|
|
|
#include <kmymoney/transactioneditorcontainer.h>
|
|
|
|
#include <kmymoney/register.h>
|
|
|
|
|
|
|
|
class KCurrencyExchange;
|
|
|
|
class KMyMoneyCategory;
|
|
|
|
|
|
|
|
class TransactionEditor : public TQObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
|
|
|
TransactionEditor() {}
|
|
|
|
TransactionEditor(TransactionEditorContainer* regForm, KMyMoneyRegister::Transaction* item, const KMyMoneyRegister::SelectedTransactions& list, const TQDate& 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 TQWidgetList 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(TQWidgetList& 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(TQString& 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(TQString& 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 TQWidget* firstWidget(void) const = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns a pointer to a widget by name
|
|
|
|
*/
|
|
|
|
TQWidget* haveWidget(const TQString& name) const;
|
|
|
|
|
|
|
|
void setTransaction(const MyMoneyTransaction& t, const MyMoneySplit& s);
|
|
|
|
|
|
|
|
bool eventFilter(TQObject* o, TQEvent* e);
|
|
|
|
|
|
|
|
const MyMoneyAccount& account(void) const { return m_account; }
|
|
|
|
|
|
|
|
void clearFinalWidgets(void);
|
|
|
|
|
|
|
|
void addFinalWidget(const TQWidget*);
|
|
|
|
|
|
|
|
public slots:
|
|
|
|
void slotReloadEditWidgets(void);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The default implementation returns TQDialog::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 TQString& 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 TQValueList<MyMoneySplit>& splits, TQString& 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 TQString&);
|
|
|
|
|
|
|
|
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 TQString& txt, TQString& 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 TQString& 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 TQDate& 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(TQWidget* parent, const MyMoneyAccount& account, const TQString& msg);
|
|
|
|
|
|
|
|
protected:
|
|
|
|
TQValueList<MyMoneySplit> m_splits;
|
|
|
|
KMyMoneyRegister::SelectedTransactions m_transactions;
|
|
|
|
TQValueList<const TQWidget*> m_finalEditWidgets;
|
|
|
|
TransactionEditorContainer* m_regForm;
|
|
|
|
KMyMoneyRegister::Transaction* m_item;
|
|
|
|
KMyMoneyRegister::TQWidgetContainer m_editWidgets;
|
|
|
|
MyMoneyAccount m_account;
|
|
|
|
MyMoneyTransaction m_transaction;
|
|
|
|
MyMoneySplit m_split;
|
|
|
|
TQDate m_lastPostDate;
|
|
|
|
TQMap<TQString, 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 TQDate& lastPostDate);
|
|
|
|
~StdTransactionEditor();
|
|
|
|
|
|
|
|
bool isComplete(TQString& reason) const;
|
|
|
|
TQWidget* firstWidget(void) const;
|
|
|
|
|
|
|
|
bool eventFilter(TQObject* o, TQEvent* 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 TQString&);
|
|
|
|
|
|
|
|
protected slots:
|
|
|
|
void slotReloadEditWidgets(void);
|
|
|
|
void slotUpdatePayment(const TQString&);
|
|
|
|
void slotUpdateDeposit(const TQString&);
|
|
|
|
void slotUpdateCategory(const TQString&);
|
|
|
|
void slotUpdatePayee(const TQString&);
|
|
|
|
void slotUpdateCashFlow(KMyMoneyRegister::CashFlowDirection);
|
|
|
|
void slotCreateCategory(const TQString&, TQString&);
|
|
|
|
void slotUpdateAction(int action);
|
|
|
|
void slotUpdateAccount(const TQString& 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(TQString&);
|
|
|
|
void updateAmount(const MyMoneyMoney& value);
|
|
|
|
bool isTransfer(const TQString& accId1, const TQString& accId2) const;
|
|
|
|
|
|
|
|
void checkPayeeInSplit(MyMoneySplit& s, const TQString& 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 TQString& 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
|