summaryrefslogtreecommitdiffstats
path: root/kmymoney2/reports/querytable.h
blob: 7beb3d435cb34e3165806933d2bce14250c24ea6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/***************************************************************************
                          querytable.h
                         -------------------
    begin                : Fri Jul 23 2004
    copyright            : (C) 2004-2005 by Ace Jones
                           (C) 2007 Sascha Pfau
    email                :  acejones@users.sourceforge.net
                            MrPeacock@gmail.com
 ***************************************************************************/
 
/****************************************************************************
  Contains code from the func_xirr and related methods of financial.cpp 
  - KOffice 1.6 by Sascha Pfau.  Sascha agreed to relicense those methods under
  GPLv2 or later.
*****************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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 QUERYTABLE_H
#define QUERYTABLE_H

// ----------------------------------------------------------------------------
// QT Includes

#include <qstringlist.h>

// ----------------------------------------------------------------------------
// KDE Includes

// ----------------------------------------------------------------------------
// Project Includes

#include "../mymoney/mymoneyreport.h"
#include "listtable.h"

namespace reports {

class ReportAccount;

/**
  * Calculates a query of information about the transaction database.
  *
  * This is a middle-layer class, between the UI and the engine.  The
  * MyMoneyReport class holds only the CONFIGURATION parameters.  This
  * class actually does the work of retrieving the data from the engine
  * and formatting it for the user.
  *
  * @author Ace Jones
  *
  * @short
**/

class QueryTable : public ListTable
{
  public:
    QueryTable(const MyMoneyReport&);
    void init(void);

  protected:
    void constructAccountTable(void);
    void constructTransactionTable(void);
    void constructPerformanceRow( const ReportAccount& account, TableRow& result ) const;
    void constructSplitsTable(void);

};

//
// Cash Flow analysis tools for investment reports
//

class CashFlowListItem
{
public:
  CashFlowListItem(void) {}
  CashFlowListItem( const QDate& _date, const MyMoneyMoney& _value ): m_date(_date), m_value(_value) {}
  bool operator<( const CashFlowListItem _second ) const { return m_date < _second.m_date; }
  bool operator<=( const CashFlowListItem _second ) const { return m_date <= _second.m_date; }
  bool operator>( const CashFlowListItem _second ) const { return m_date > _second.m_date; }
  const QDate& date( void ) const { return m_date; }
  const MyMoneyMoney& value( void ) const { return m_value; }
  MyMoneyMoney NPV( double _rate ) const;

  static void setToday( const QDate& _today ) { m_sToday = _today; }
  const QDate& today( void ) const { return m_sToday; }

private:
  QDate m_date;
  MyMoneyMoney m_value;

  static QDate m_sToday;
};

class CashFlowList: public QValueList<CashFlowListItem>
{
  public:
    CashFlowList(void) {}
    MyMoneyMoney NPV(double rate) const;
    double IRR(void) const;
    MyMoneyMoney total(void) const;
    void dumpDebug(void) const;

    /**
     * Function: XIRR
     *
     * Compute the internal rate of return for a non-periodic series of cash flows.
     *
     * XIRR ( Values; Dates; [ Guess = 0.1 ] )
     **/
    double calculateXIRR ( void ) const;

  protected:
    CashFlowListItem mostRecent(void) const;

  private:
        /**
   * helper: xirrResult
   *
   * args[0] = values
   * args[1] = dates
         **/
    double xirrResult ( double& rate ) const;

        /**
     *
     * helper: xirrResultDerive
     *
     * args[0] = values
     * args[1] = dates
         **/
    double xirrResultDerive ( double& rate ) const;
};

}

#endif // QUERYREPORT_H