summaryrefslogtreecommitdiff
path: root/src/transform.h
blob: 92e16e0117485f4324b4d48844f7928afdad881a (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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*
 * Copyright (c) 2003-2007, John Wiegley.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * - Neither the name of New Artisans LLC nor the names of its
 *   contributors may be used to endorse or promote products derived from
 *   this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _TRANSFORM_H
#define _TRANSFORM_H

#include "xpath.h"

namespace ledger {

class transform_t {
 public:
  virtual ~transform_t() {}
  virtual void execute(xml::document_t * document) = 0;
};

class check_transform : public transform_t {
  // --check checks the validity of the item list.
 public:
  virtual void execute(xml::document_t * document);
};

class accounts_transform : public transform_t {
  // --accounts transforms the report tree into an account-wise view.
 public:
  virtual void execute(xml::document_t * document);
};

class compact_transform : public transform_t {
  // --compact compacts an account tree to remove accounts with only
  // one child account.
 public:
  virtual void execute(xml::document_t * document);
};

class clean_transform : public transform_t {
  // --clean clears out entries and accounts that have no contents.
 public:
  virtual void execute(xml::document_t * document);
};

class entries_transform : public transform_t {
  // --entries transforms the report tree into an entries-wise view.
 public:
  virtual void execute(xml::document_t * document);
};

class optimize_transform : public transform_t {
  // --optimize optimizes entries for display by the print command.
  // What this means is that if an entry has two transactions of the
  // commodity (one the negative of the other), the amount of the
  // second transaction will be nulled out.
 public:
  virtual void execute(xml::document_t * document);
};

class split_transform : public transform_t {
  // --split breaks entry with two or more transactions into what
  // seems like two entries each with one transaction -- even though
  // it is the same entry being reported in both cases.  This is
  // useful before sorting, for exampel, in order to sort by
  // transaction instead of by entry.
 public:
  virtual void execute(xml::document_t * document);
};

class merge_transform : public transform_t {
  // --merge is the opposite of --split: any adjacent transactions
  // which share the same entry will be merged into a group of
  // transactions under one reported entry.
 public:
  virtual void execute(xml::document_t * document);
};

class combine_transform : public transform_t {
  // --combine EXPR combines all transactions matching EXPR so that
  // they appear within the same virtual entry (whose date will span
  // the earliest to the latest of those entries, and whose payee name
  // will show the terminating date or a label that is characteristic
  // of the set).
 public:
  virtual void execute(xml::document_t * document);
};

class group_transform : public transform_t {
  // --group groups all transactions that affect the same account
  // within an entry, so that they appear as a single transaction.
 public:
  virtual void execute(xml::document_t * document);
};

class collapse_transform : public transform_t {
  // --collapse makes all transactions within an entry appear as a
  // single transaction, even if they affect different accounts.  The
  // fictitous account "<total>" is used to represent the final sum,
  // if multiple accounts are involved.
 public:
  virtual void execute(xml::document_t * document);
};

class subtotal_transform : public transform_t {
  // --subtotal will combine the transactions from all entries into
  // one giant entry.  When used in conjunction with --group, the
  // affect is very similar to a regular balance report.
 public:
  virtual void execute(xml::document_t * document);
};

#if 0
class select_transform : public transform_t
{
 protected:
  xml::xpath_t xpath;

 public:
  select_transform(const string& selection_path) {
    xpath.parse(selection_path);
  }
  virtual ~select_transform() {}

  virtual void execute(xml::document_t * document);
};

class remove_transform : public select_transform
{
 public:
  remove_transform(const string& selection_path)
    : select_transform(selection_path) {}

  virtual void execute(xml::document_t * document);
};
#endif

} // namespace ledger

#endif // _TRANSFORM_H