/*************************************************************************** transactioneditor.h ---------- begin : Wed Jun 07 2006 copyright : (C) 2006 by Thomas Baumgart email : Thomas Baumgart ***************************************************************************/ /*************************************************************************** * * * 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 #include // ---------------------------------------------------------------------------- // KDE Includes // ---------------------------------------------------------------------------- // Project Includes #include #include #include class KCurrencyExchange; class KMyMoneyCategory; class TransactionEditor : public TQObject { Q_OBJECT TQ_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& 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 tqparent * account will be preset to Expense or Income. * * @param account reference to account info. Will be filled by called slot * @param tqparent reference to tqparent account */ void createCategory(MyMoneyAccount& account, const MyMoneyAccount& tqparent); /** * 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 tqparent reference to tqparent account */ void createSecurity(MyMoneyAccount& account, const MyMoneyAccount& tqparent); /** * 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 tqparent points to the tqparent widget to be used for the warning message box. */ void balanceWarning(TQWidget* tqparent, const MyMoneyAccount& account, const TQString& msg); protected: TQValueList m_splits; KMyMoneyRegister::SelectedTransactions m_transactions; TQValueList 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 m_priceInfo; KMyMoneyRegister::Action m_initialAction; bool m_openEditSplits; }; class StdTransactionEditor : public TransactionEditor { Q_OBJECT TQ_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