You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmymoney/kmymoney2/mymoney/mymoneytransactionfilter.h

579 lines
19 KiB

/***************************************************************************
mymoneytransactionfilter.h - description
-------------------
begin : Fri Aug 22 2003
copyright : (C) 2000-2003 by Michael Edwardes
email : mte@users.sourceforge.net
Javier Campos Morales <javi_c@users.sourceforge.net>
Felix Rodriguez <frodriguez@users.sourceforge.net>
John C <thetacoturtle@users.sourceforge.net>
Thomas Baumgart <ipwizard@users.sourceforge.net>
Kevin Tambascio <ktambascio@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 MYMONEYTRANSACTIONFILTER_H
#define MYMONEYTRANSACTIONFILTER_H
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
// ----------------------------------------------------------------------------
// QT Includes
#include <tqstring.h>
#include <tqdatetime.h>
#include <tqmap.h>
#include <tqasciidict.h>
#include <tqintdict.h>
#include <tqregexp.h>
// ----------------------------------------------------------------------------
// KDE Includes
// ----------------------------------------------------------------------------
// Project Includes
#include <kmymoney/mymoneytransaction.h>
#include <kmymoney/export.h>
/**
* @author Thomas Baumgart
*/
class KMYMONEY_EXPORT MyMoneyTransactionFilter
{
public:
// Make sure to keep the following enum valus in sync with the values
// used by the GUI (for KMyMoney in kfindtransactiondlgdecl.ui)
enum typeOptionE {
allTypes = 0,
payments,
deposits,
transfers,
// insert new constants above of this line
typeOptionCount
};
// Make sure to keep the following enum valus in sync with the values
// used by the GUI (for KMyMoney in kfindtransactiondlgdecl.ui)
enum stateOptionE {
allStates = 0,
notReconciled,
cleared,
reconciled,
frozen,
// insert new constants above of this line
stateOptionCount
};
// Make sure to keep the following enum valus in sync with the values
// used by the GUI (for KMyMoney in kfindtransactiondlgdecl.ui)
enum validityOptionE {
anyValidity = 0,
valid,
invalid,
// insert new constants above of this line
validityOptionCount
};
// Make sure to keep the following enum valus in sync with the values
// used by the GUI (for KMyMoney in kfindtransactiondlgdecl.ui)
enum dateOptionE {
allDates = 0,
asOfToday,
currentMonth,
currentYear,
monthToDate,
yearToDate,
yearToMonth,
lastMonth,
lastYear,
last7Days,
last30Days,
last3Months,
last6Months,
last12Months,
next7Days,
next30Days,
next3Months,
next6Months,
next12Months,
userDefined,
last3ToNext3Months,
last11Months,
currentQuarter,
lastQuarter,
nextQuarter,
currentFiscalYear,
lastFiscalYear,
today,
// insert new constants above of this line
dateOptionCount
};
typedef union {
unsigned allFilter;
struct {
unsigned textFilter : 1;
unsigned accountFilter : 1;
unsigned payeeFilter : 1;
unsigned categoryFilter : 1;
unsigned nrFilter : 1;
unsigned dateFilter : 1;
unsigned amountFilter : 1;
unsigned typeFilter : 1;
unsigned stateFilter : 1;
unsigned validityFilter : 1;
} singleFilter;
} FilterSet;
/**
* This is the standard constructor for a transaction filter.
* It creates the object and calls setReportAllSplits() to
* report all matching splits as separate entries. Use
* setReportAllSplits() to override this behaviour.
*/
MyMoneyTransactionFilter();
/**
* This is a convenience constructor to allow construction of
* a simple account filter. It is basically the same as the
* following:
*
* @code
* :
* MyMoneyTransactionFilter filter;
* filter.setReportAllSplits(false);
* filter.addAccount(id);
* :
* @endcode
*
* @param id reference to account id
*/
MyMoneyTransactionFilter(const TQString& id);
~MyMoneyTransactionFilter();
/**
* This method is used to clear the filter. All settings will be
* removed.
*/
void clear(void);
/**
* This method is used to clear the accounts filter only.
*/
void clearAccountFilter(void);
/**
* This method is used to set the regular expression filter to the value specified
* as parameter @p exp. The following text based fields are searched:
*
* - Memo
* - Payee
* - Category
* - Shares / Value
* - Number
*
* @param exp The regular expression that must be found in a transaction
* before it is included in the result set.
* @param invert If true, value must not be contained in any of the above mentioned fields
*
*/
void setTextFilter(const TQRegExp& exp, bool invert = false);
/**
* This method will add the account with id @p id to the list of matching accounts.
* If the list is empty, any transaction will match.
*
* @param id internal ID of the account
*/
void addAccount(const TQString& id);
/**
* This is a convenience method and behaves exactly like the above
* method but for a list of id's.
*/
void addAccount(const TQStringList& ids);
/**
* This method will add the category with id @p id to the list of matching categories.
* If the list is empty, only transaction with a single asset/liability account will match.
*
* @param id internal ID of the account
*/
void addCategory(const TQString& id);
/**
* This is a convenience method and behaves exactly like the above
* method but for a list of id's.
*/
void addCategory(const TQStringList& ids);
/**
* This method sets the date filter to match only transactions with posting dates in
* the date range specified by @p from and @p to. If @p from equal TQDate()
* all transactions with dates prior to @p to match. If @p to equals TQDate()
* all transactions with posting dates past @p from match. If @p from and @p to
* are equal TQDate() the filter is not activated and all transactions match.
*
* @param from from date
* @param to to date
*/
void setDateFilter(const TQDate& from, const TQDate& to);
void setDateFilter(dateOptionE range);
/**
* This method sets the amount filter to match only transactions with
* an amount in the range specified by @p from and @p to.
* If a specific amount should be searched, @p from and @p to should be
* the same value.
*
* @param from smallest value to match
* @param to largest value to match
*/
void setAmountFilter(const MyMoneyMoney& from, const MyMoneyMoney& to);
/**
* This method will add the payee with id @p id to the list of matching payees.
* If the list is empty, any transaction will match.
*
* @param id internal id of the payee
*/
void addPayee(const TQString& id);
/**
*/
void addType(const int type);
/**
*/
void addValidity(const int type);
/**
*/
void addState(const int state);
/**
* This method sets the number filter to match only transactions with
* a number in the range specified by @p from and @p to.
* If a specific number should be searched, @p from and @p to should be
* the same value.
*
* @param from smallest value to match
* @param to largest value to match
*
* @note @p from and @p to can contain alphanumeric text
*/
void setNumberFilter(const TQString& from, const TQString& to);
/**
* This method is used to check a specific transaction against the filter.
* The transaction will match the whole filter, if all specified filters
* match. If the filter is cleared using the clear() method, any transaciton
* matches.
*
* @param transaction A transaction
*
* @retval true The transaction matches the filter set
* @retval false The transaction does not match at least one of
* the filters in the filter set
*/
bool match(const MyMoneyTransaction& transaction);
/**
* This method is used to check a specific split against the
* text filter. The split will match if all specified and
* checked filters match. If the filter is cleared using the clear()
* method, any split matches.
*
* @param sp pointer to the split to be checked
*
* @retval true The split matches the filter set
* @retval false The split does not match at least one of
* the filters in the filter set
*/
bool matchText(const MyMoneySplit * const sp) const;
/**
* This method is used to check a specific split against the
* amount filter. The split will match if all specified and
* checked filters match. If the filter is cleared using the clear()
* method, any split matches.
*
* @param sp pointer to the split to be checked
*
* @retval true The split matches the filter set
* @retval false The split does not match at least one of
* the filters in the filter set
*/
bool matchAmount(const MyMoneySplit * const sp) const;
/**
* Convenience method which actually returns matchText(sp) && matchAmount(sp).
*/
bool match(const MyMoneySplit * const sp) const;
/**
* This method is used to switch the amount of splits reported
* by matchingSplits(). If the argument @p report is @p true (the default
* if no argument specified) then matchingSplits() will return all
* matching splits of the transaction. If @p report is set to @p false,
* then only the very first matching split will be returned by
* matchingSplits().
*
* @param report controls the behaviour of matchingsSplits() as explained above.
*/
void setReportAllSplits(const bool report = true);
void setConsiderCategory(const bool check = true);
/**
* This method returns a list of the matching splits for the filter.
* If m_reportAllSplits is set to false, then only the very first
* split will be returned. Use setReportAllSplits() to change the
* behaviour.
*
* @return reference list of MyMoneySplit objects containing the
* matching splits. If multiple splits match, only the first
* one will be returned.
*
* @note an empty list will be returned, if the filter only required
* to check the data contained in the MyMoneyTransaction
* object (e.g. posting-date, state, etc.).
*
* @note The constructors set m_reportAllSplits differently. Please
* see the documentation of the constructors MyMoneyTransactionFilter()
* and MyMoneyTransactionFilter(const TQString&) for details.
*/
const TQValueList<MyMoneySplit>& matchingSplits(void) const;
/**
* This method returns the from date set in the filter. If
* no value has been set up for this filter, then TQDate() is
* returned.
*
* @return returns m_fromDate
*/
const TQDate fromDate(void) const { return m_fromDate; };
/**
* This method returns the to date set in the filter. If
* no value has been set up for this filter, then TQDate() is
* returned.
*
* @return returns m_toDate
*/
const TQDate toDate(void) const { return m_toDate; };
/**
* This method is used to return information about the
* presence of a specific category in the category filter.
* The category in question is included in the filter set,
* if it has been set or no category filter is set.
*
* @param cat id of category in question
* @return true if category is in filter set, false otherwise
*/
bool includesCategory( const TQString& cat ) const;
/**
* This method is used to return information about the
* presence of a specific account in the account filter.
* The account in question is included in the filter set,
* if it has been set or no account filter is set.
*
* @param acc id of account in question
* @return true if account is in filter set, false otherwise
*/
bool includesAccount( const TQString& acc ) const;
/**
* This method is used to return information about the
* presence of a specific payee in the account filter.
* The payee in question is included in the filter set,
* if it has been set or no account filter is set.
*
* @param pye id of payee in question
* @return true if payee is in filter set, false otherwise
*/
bool includesPayee( const TQString& pye ) const;
/**
* This method is used to return information about the
* presence of a date filter.
*
* @param from result value for the beginning of the date range
* @param to result value for the end of the date range
* @return true if an amount filter is set
*/
bool dateFilter( TQDate& from, TQDate& to ) const;
/**
* This method is used to return information about the
* presence of an amount filter.
*
* @param from result value for the low end of the amount range
* @param to result value for the high end of the amount range
* @return true if an amount filter is set
*/
bool amountFilter( MyMoneyMoney& from, MyMoneyMoney& to ) const;
/**
* This method is used to return information about the
* presence of an number filter.
*
* @param from result value for the low end of the number range
* @param to result value for the high end of the number range
* @return true if a number filter is set
*/
bool numberFilter( TQString& from, TQString& to ) const;
/**
* This method returns whether a payee filter has been set,
* and if so, it returns all the payees set in the filter.
*
* @param list list to append payees into
* @return return true if a payee filter has been set
*/
bool payees(TQStringList& list) const;
/**
* This method returns whether an account filter has been set,
* and if so, it returns all the accounts set in the filter.
*
* @param list list to append accounts into
* @return return true if an account filter has been set
*/
bool accounts(TQStringList& list) const;
/**
* This method returns whether a category filter has been set,
* and if so, it returns all the categories set in the filter.
*
* @param list list to append categories into
* @return return true if a category filter has been set
*/
bool categories(TQStringList& list) const;
/**
* This method returns whether a type filter has been set,
* and if so, it returns the first type in the filter.
*
* @param i int to replace with first type filter, untouched otherwise
* @return return true if a type filter has been set
*/
bool firstType(int& i) const;
bool types(TQValueList<int>& list) const;
/**
* This method returns whether a state filter has been set,
* and if so, it returns the first state in the filter.
*
* @param i reference to int to replace with first state filter, untouched otherwise
* @return return true if a state filter has been set
*/
bool firstState(int& i) const;
bool states(TQValueList<int>& list) const;
/**
* This method returns whether a text filter has been set,
* and if so, it returns the text filter.
*
* @param text regexp to replace with text filter, or blank if none set
* @return return true if a text filter has been set
*/
bool textFilter(TQRegExp& text) const;
/**
* This method returns whether the text filter should return
* that DO NOT contain the text
*/
bool isInvertingText(void) const {return m_invertText;};
/**
* This method translates a plain-language date range into TQDate
* start & end
*
* @param range Plain-language range of dates, e.g. 'CurrentYear'
* @param start TQDate will be set to corresponding to the first date in @p range
* @param end TQDate will be set to corresponding to the last date in @p range
* @return return true if a range was successfully set, or false if @p range was invalid
*/
static bool translateDateRange(dateOptionE range, TQDate& start, TQDate& end);
static void setFiscalYearStart(int firstMonth, int firstDay);
FilterSet filterSet(void) const { return m_filterSet; };
/**
* This member removes all references to object identified by @p id. Used
* to remove objects which are about to be removed from the engine.
*/
void removeReference(const TQString& id);
private:
/**
* This is a conversion tool from MyMoneySplit::reconcileFlagE
* to MyMoneyTransactionFilter::stateE types
*
* @param split reference to split in question
*
* @return converted reconcile flag of the split passed as parameter
*/
int splitState(const MyMoneySplit& split) const;
/**
* This is a conversion tool from MyMoneySplit::action
* to MyMoneyTransactionFilter::typeE types
*
* @param t reference to transaction
* @param split reference to split in question
*
* @return converted action of the split passed as parameter
*/
int splitType(const MyMoneyTransaction& t, const MyMoneySplit& split) const;
/**
* This method checks if a transaction is valid or not. A transaction
* is considered valid, if the sum of all splits is zero, invalid otherwise.
*
* @param transaction reference to transaction to be checked
* @retval valid transaction is valid
* @retval invalid transaction is invalid
*/
validityOptionE validTransaction(const MyMoneyTransaction& transaction) const;
protected:
FilterSet m_filterSet;
bool m_reportAllSplits;
bool m_considerCategory;
TQRegExp m_text;
bool m_invertText;
TQAsciiDict<char> m_accounts;
TQAsciiDict<char> m_payees;
TQAsciiDict<char> m_categories;
TQIntDict<char> m_states;
TQIntDict<char> m_types;
TQIntDict<char> m_validity;
TQString m_fromNr, m_toNr;
TQDate m_fromDate, m_toDate;
MyMoneyMoney m_fromAmount, m_toAmount;
TQValueList<MyMoneySplit> m_matchingSplits;
};
#endif