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/mymoneybudget.h

265 lines
8.3 KiB

/***************************************************************************
mymoneybudget.h
-------------------
begin : Sun Jan 22 2006
copyright : (C) 2006 by Darren Gould
email : darren_gould@gmx.de
***************************************************************************/
/***************************************************************************
* *
* 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 MYMONEYBUDGET_H
#define MYMONEYBUDGET_H
// ----------------------------------------------------------------------------
// TQt Includes
#include <tqmap.h>
#include <tqvaluelist.h>
#include <tqstring.h>
class TQDomElement;
class TQDomDocument;
// ----------------------------------------------------------------------------
// Project Includes
#include <kmymoney/mymoneyobject.h>
#include <kmymoney/mymoneyaccount.h>
#include <kmymoney/mymoneymoney.h>
#include <kmymoney/export.h>
/**
* This class defines a Budget within the MyMoneyEngine. The Budget class
* contains all the configuration parameters needed to run a Budget, plus
* XML serialization.
*
* As noted above, this class only provides a Budget DEFINITION. The
* generation and presentation of the Budget itself are left to higher
* level classes.
*
* @author Darren Gould <darren_gould@gmx.de>
*/
class KMYMONEY_EXPORT MyMoneyBudget: public MyMoneyObject
{
public:
MyMoneyBudget(void);
~MyMoneyBudget();
MyMoneyBudget(const TQString& _name);
/**
* This constructor creates an object based on the data found in the
* TQDomElement referenced by @p node. If problems arise, the @p id of
* the object is cleared (see MyMoneyObject::clearId()).
*/
MyMoneyBudget(const TQDomElement& node);
/**
* This constructor creates an object based on the data found in the
* MyMoneyBudget budget object.
*/
MyMoneyBudget(const TQString& id, const MyMoneyBudget& budget);
/**
* Helper class for MyMoneyBudget
*
* This is an abstraction of the PERIOD stored in the BUDGET/ACCOUNT tag in XML
*
* @author Darren Gould
*/
class PeriodGroup
{
public:
// get functions
const TQDate& startDate ( void ) const { return m_start; }
const MyMoneyMoney& amount( void ) const { return m_amount; }
// set functions
void setStartDate ( const TQDate& _start ) { m_start = _start; }
void setAmount( const MyMoneyMoney& _amount ) { m_amount = _amount;}
bool operator == (const PeriodGroup &r) const { return (m_start == r.m_start && m_amount == r.m_amount); }
private:
TQDate m_start;
MyMoneyMoney m_amount;
};
/**
* Helper class for MyMoneyBudget
*
* This is an abstraction of the Account Data stored in the BUDGET tag in XML
*
* @author Darren Gould
*/
class AccountGroup
{
public:
typedef enum
{
eNone = 0,
eMonthly,
eMonthByMonth,
eYearly,
eMax
} eBudgetLevel;
static const TQStringList kBudgetLevelText;
public:
AccountGroup() : m_budgetlevel(eNone), m_budgetsubaccounts(false) {}
// get functions
const TQString& id( void ) const { return m_id; }
bool budgetSubaccounts( void ) const { return m_budgetsubaccounts; }
eBudgetLevel budgetLevel( void ) const { return m_budgetlevel; }
const PeriodGroup& period( const TQDate &_date ) const { return m_periods[_date]; }
const TQMap<TQDate, PeriodGroup>& getPeriods( void ) const { return m_periods; }
void clearPeriods(void) { m_periods.clear(); }
const MyMoneyMoney balance( void ) const
{
MyMoneyMoney balance;
TQMap<TQDate, PeriodGroup>::const_iterator it;
for(it = m_periods.begin(); it != m_periods.end(); ++it)
{
balance += (*it).amount();
}
return balance;
};
const MyMoneyMoney totalBalance(void) const
{
MyMoneyMoney bal = balance();
switch(m_budgetlevel) {
default:
break;
case eMonthly:
bal = bal * 12;
break;
}
return bal;
}
// set functions
void setId( TQString _id ) { m_id = _id; }
void setBudgetLevel( eBudgetLevel _level ) { m_budgetlevel = _level; }
void setBudgetSubaccounts( bool _b ) { m_budgetsubaccounts = _b; }
void addPeriod( const TQDate& _date, PeriodGroup &period ) { m_periods[_date] = period; }
// This member adds the value of another account group
// m_budgetlevel is adjusted to the larger one of both
// m_budgetsubaccounts remains unaffected
AccountGroup operator += (const AccountGroup& r);
bool operator == (const AccountGroup &r) const;
bool isZero(void) const;
protected:
void convertToMonthly(void);
void convertToYearly(void);
void convertToMonthByMonth(void);
private:
TQString m_id;
eBudgetLevel m_budgetlevel;
bool m_budgetsubaccounts;
TQMap<TQDate, PeriodGroup> m_periods;
};
/**
* This operator tests for equality of two MyMoneyBudget objects
*/
bool operator == (const MyMoneyBudget &) const;
// Simple get operations
const TQString& name(void) const { return m_name; }
const TQDate& budgetStart(void) const { return m_start; }
TQString id(void) const { return m_id; }
const AccountGroup & account(const TQString _id) const;
bool contains(const TQString _id) const { return m_accounts.contains(_id); }
TQValueList<AccountGroup> getaccounts(void) const { return m_accounts.values(); }
// Simple set operations
void setName(const TQString& _name) { m_name = _name; }
void setBudgetStart(const TQDate& _start);
void setAccount(const AccountGroup &_account, const TQString _id);
/**
* This method writes this Budget to the DOM element @p e,
* within the DOM document @p doc.
*
* @param e The element which should be populated with info from this Budget
* @param doc The document which we can use to create new sub-elements
* if needed
*/
void write(TQDomElement& e, TQDomDocument *doc) const;
/**
* This method reads a Budget from the DOM element @p e, and
* populates this Budget with the results.
*
* @param e The element from which the Budget should be read
*
* @return bool True if a Budget was successfully loaded from the
* element @p e. If false is returned, the contents of this Budget
* object are undefined.
*/
bool read(const TQDomElement& e);
/**
* This method creates a TQDomElement for the @p document
* under the parent node @p parent. (This version overwrites the
* MMObject base class.)
*
* @param document reference to TQDomDocument
* @param parent reference to TQDomElement parent node
*/
virtual void writeXML(TQDomDocument& document, TQDomElement& parent) const;
/**
* This method checks if a reference to the given object exists. It returns,
* a @p true if the object is referencing the one requested by the
* parameter @p id and the balance() returned is zero.
* If it does not, this method returns @p false.
*
* @param id id of the object to be checked for references
* @retval true This object references object with id @p id.
* @retval false This object does not reference the object with id @p id.
*/
virtual bool hasReferenceTo(const TQString& id) const;
/**
* 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:
/**
* The user-assigned name of the Budget
*/
TQString m_name;
/**
* The user-assigned year of the Budget
*/
TQDate m_start;
/**
* Map the budgeted accounts
*
* Each account Id is stored against the AccountGroup information
*/
TQMap<TQString, AccountGroup> m_accounts;
};
#endif // MYMONEYBudget_H