1 /********************************************************************\
2  * AccountP.h -- Account engine-private data structure              *
3  * Copyright (C) 1997 Robin D. Clark                                *
4  * Copyright (C) 1997-2002, Linas Vepstas <linas@linas.org>         *
5  *                                                                  *
6  * This program is free software; you can redistribute it and/or    *
7  * modify it under the terms of the GNU General Public License as   *
8  * published by the Free Software Foundation; either version 2 of   *
9  * the License, or (at your option) any later version.              *
10  *                                                                  *
11  * This program is distributed in the hope that it will be useful,  *
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
14  * GNU General Public License for more details.                     *
15  *                                                                  *
16  * You should have received a copy of the GNU General Public License*
17  * along with this program; if not, contact:                        *
18  *                                                                  *
19  * Free Software Foundation           Voice:  +1-617-542-5942       *
20  * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
21  * Boston, MA  02110-1301,  USA       gnu@gnu.org                   *
22  *                                                                  *
23 \********************************************************************/
24 
25 /** @file AccountP.h
26  *
27  * This is the *private* header for the account structure.
28  * No one outside of the engine should ever include this file.
29  *
30  * This header includes prototypes for "dangerous" functions.
31  * Invoking any of these functions potentially leave the account
32  * in an inconsistent state.  If they are not used in the proper
33  * setting, they can leave the account structures in an inconsistent
34  * state.  Thus, these methods should never be used outside of
35  * the engine, which is why they are "hidden" here.
36  *
37  */
38 
39 #ifndef XACC_ACCOUNT_P_H
40 #define XACC_ACCOUNT_P_H
41 
42 #include "Account.h"
43 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
48 #define GNC_ID_ROOT_ACCOUNT        "RootAccount"
49 
50 /** STRUCTS *********************************************************/
51 
52 /** This is the data that describes an account.
53  *
54  * This is the *private* header for the account structure.
55  * No one outside of the engine should ever include this file.
56 */
57 
58 typedef enum
59 {
60     Unset = -1,
61     False,
62     True
63 } TriState;
64 
65 /** \struct Account */
66 typedef struct AccountPrivate
67 {
68     /* The accountName is an arbitrary string assigned by the user.
69      * It is intended to a short, 5 to 30 character long string that
70      * is displayed by the GUI as the account mnemonic.
71      */
72     const char *accountName;
73 
74     /* The accountCode is an arbitrary string assigned by the user.
75      * It is intended to be reporting code that is a synonym for the
76      * accountName. Typically, it will be a numeric value that follows
77      * the numbering assignments commonly used by accountants, such
78      * as 100, 200 or 600 for top-level accounts, and 101, 102..  etc.
79      * for detail accounts.
80      */
81     const char *accountCode;
82 
83     /* The description is an arbitrary string assigned by the user.
84      * It is intended to be a longer, 1-5 sentence description of what
85      * this account is all about.
86      */
87     const char *description;
88 
89     /* The type field is the account type, picked from the enumerated
90      * list that includes ACCT_TYPE_BANK, ACCT_TYPE_STOCK,
91      * ACCT_TYPE_CREDIT, ACCT_TYPE_INCOME, etc.  Its intended use is to
92      * be a hint to the GUI as to how to display and format the
93      * transaction data.
94      */
95     GNCAccountType type;
96 
97     /*
98      * The commodity field denotes the kind of 'stuff' stored
99      * in this account.  The 'amount' field of a split indicates
100      * how much of the 'stuff' there is.
101      */
102     gnc_commodity * commodity;
103     int commodity_scu;
104     gboolean non_standard_scu;
105 
106     /* The parent and children pointers are used to implement an account
107      * hierarchy, of accounts that have sub-accounts ("detail accounts").
108      */
109     Account *parent;    /* back-pointer to parent */
110     GList *children;    /* list of sub-accounts */
111 
112     /* protected data - should only be set by backends */
113     gnc_numeric starting_balance;
114     gnc_numeric starting_noclosing_balance;
115     gnc_numeric starting_cleared_balance;
116     gnc_numeric starting_reconciled_balance;
117 
118     /* cached parameters */
119     gnc_numeric balance;
120     gnc_numeric noclosing_balance;
121     gnc_numeric cleared_balance;
122     gnc_numeric reconciled_balance;
123 
124     gboolean balance_dirty;     /* balances in splits incorrect */
125 
126     GList *splits;              /* list of split pointers */
127     gboolean sort_dirty;        /* sort order of splits is bad */
128 
129     LotList   *lots;		/* list of lot pointers */
130     GNCPolicy *policy;		/* Cached pointer to policy method */
131 
132     TriState sort_reversed;
133     TriState equity_type;
134     char *notes;
135     char *color;
136     char *tax_us_code;
137     char *tax_us_pns;
138     char *last_num;
139     char *sort_order;
140     char *filter;
141 
142     /* The "mark" flag can be used by the user to mark this account
143      * in any way desired.  Handy for specialty traversals of the
144      * account tree. */
145     short mark;
146     gboolean defer_bal_computation;
147 } AccountPrivate;
148 
149 struct account_s
150 {
151     QofInstance inst;
152 };
153 
154 /* Set the account's GncGUID. This should only be done when reading
155  * an account from a datafile, or some other external source. Never
156  * call this on an existing account! */
157 void xaccAccountSetGUID (Account *account, const GncGUID *guid);
158 
159 /* Register Accounts with the engine */
160 gboolean xaccAccountRegister (void);
161 
162 /* Structure for accessing static functions for testing */
163 typedef struct
164 {
165     AccountPrivate *(*get_private) (Account *acc);
166     Account *(*coll_get_root_account) (QofCollection *col);
167     void (*xaccFreeAccountChildren) (Account *acc);
168     void (*xaccFreeAccount) (Account *acc);
169     void (*qofAccountSetParent) (Account *acc, QofInstance *parent);
170     Account *(*gnc_account_lookup_by_full_name_helper) (const Account *acc,
171             gchar **names);
172 } AccountTestFunctions;
173 
174 AccountTestFunctions* _utest_account_fill_functions(void);
175 
176 #ifdef __cplusplus
177 } /* extern "C" */
178 #endif
179 
180 #endif /* XACC_ACCOUNT_P_H */
181