diff options
Diffstat (limited to 'kmymoney2/reports/pivotgrid.h')
-rw-r--r-- | kmymoney2/reports/pivotgrid.h | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/kmymoney2/reports/pivotgrid.h b/kmymoney2/reports/pivotgrid.h new file mode 100644 index 0000000..ca7f5ab --- /dev/null +++ b/kmymoney2/reports/pivotgrid.h @@ -0,0 +1,151 @@ +/*************************************************************************** + pivotgrid.h + ------------------- + begin : Sat May 22 2004 + copyright : (C) 2004-2005 by Ace Jones + email : <[email protected]> + Thomas Baumgart <[email protected]> + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 PIVOTGRID_H +#define PIVOTGRID_H + +// ---------------------------------------------------------------------------- +// QT Includes + +#include <qmap.h> +#include <qvaluelist.h> + +// ---------------------------------------------------------------------------- +// KDE Includes + +// ---------------------------------------------------------------------------- +// Project Includes + +#include "reportaccount.h" + +namespace reports { + + enum ERowType {eActual, eBudget, eBudgetDiff, eForecast, eAverage, ePrice }; + + /** + * The fundamental data construct of this class is a 'grid'. It is organized as follows: + * + * A 'Row' is a row of money values, each column is a month. The first month corresponds to + * m_beginDate. + * + * A 'Row Pair' is two rows of money values. Each column is the SAME month. One row is the + * 'actual' values for the period, the other row is the 'budgetted' values for the same + * period. For ease of implementation, a Row Pair is implemented as a Row which contains + * another Row. The inherited Row is the 'actual', the contained row is the 'Budget'. + * + * An 'Inner Group' contains a rows for each subordinate account within a single top-level + * account. It also contains a mapping from the account descriptor for the subordinate account + * to its row data. So if we have an Expense account called "Computers", with sub-accounts called + * "Hardware", "Software", and "Peripherals", there will be one Inner Group for "Computers" + * which contains three Rows. + * + * An 'Outer Group' contains Inner Row Groups for all the top-level accounts in a given + * account class. Account classes are Expense, Income, Asset, Liability. In the case above, + * the "Computers" Inner Group is contained within the "Expense" Outer Group. + * + * A 'Grid' is the set of all Outer Groups contained in this report. + * + */ + class PivotCell: public MyMoneyMoney + { + public: + PivotCell() : m_stockSplit(MyMoneyMoney(1,1)), m_cellUsed(false) {} + PivotCell(const MyMoneyMoney& value); + static PivotCell stockSplit(const MyMoneyMoney& factor); + PivotCell operator += (const PivotCell& right); + PivotCell operator += (const MyMoneyMoney& value); + const QString formatMoney(int fraction, bool showThousandSeparator = true) const; + const QString formatMoney(const QString& currency, const int prec, bool showThousandSeparator = true) const; + MyMoneyMoney calculateRunningSum(const MyMoneyMoney& runningSum); + MyMoneyMoney cellBalance(const MyMoneyMoney& _balance); + bool isUsed(void) const { return m_cellUsed; } + private: + MyMoneyMoney m_stockSplit; + MyMoneyMoney m_postSplit; + bool m_cellUsed; + }; + class PivotGridRow: public QValueList<PivotCell> + { + public: + + PivotGridRow( unsigned _numcolumns = 0 ) + { + if ( _numcolumns ) + insert( end(), _numcolumns, PivotCell() ); + } + MyMoneyMoney m_total; + }; + + class PivotGridRowSet: public QMap<ERowType, PivotGridRow> + { + public: + PivotGridRowSet( unsigned _numcolumns = 0 ); + }; + + class PivotInnerGroup: public QMap<ReportAccount,PivotGridRowSet> + { + public: + PivotInnerGroup( unsigned _numcolumns = 0 ): m_total(_numcolumns) {} + + PivotGridRowSet m_total; + }; + + class PivotOuterGroup: public QMap<QString,PivotInnerGroup> + { + public: + PivotOuterGroup( unsigned _numcolumns = 0, unsigned _sort=m_kDefaultSortOrder, bool _inverted=false): m_total(_numcolumns), m_inverted(_inverted), m_sortOrder(_sort) {} + int operator<( const PivotOuterGroup& _right ) + { + if ( m_sortOrder != _right.m_sortOrder ) + return m_sortOrder < _right.m_sortOrder; + else + return m_displayName < _right.m_displayName; + } + PivotGridRowSet m_total; + + // An inverted outergroup means that all values placed in subordinate rows + // should have their sign inverted from typical cash-flow notation. Also it + // means that when the report is summed, the values should be inverted again + // so that the grand total is really "non-inverted outergroup MINUS inverted outergroup". + bool m_inverted; + + // The localized name of the group for display in the report. Outergoups need this + // independently, because they will lose their association with the TGrid when the + // report is rendered. + QString m_displayName; + + // lower numbers sort toward the top of the report. defaults to 100, which is a nice + // middle-of-the-road value + unsigned m_sortOrder; + + // default sort order + static const unsigned m_kDefaultSortOrder; + }; + class PivotGrid: public QMap<QString,PivotOuterGroup> + { + public: + PivotGridRowSet rowSet (QString id); + + PivotGridRowSet m_total; + }; + +} + +#endif +// PIVOTGRID_H +// vim:cin:si:ai:et:ts=2:sw=2: |