Branch data Line data Source code
1 : : /*
2 : : * gnc-accounting-period.c --
3 : : *
4 : : * Copyright (c) 2005 David Hampton <hampton@employees.org>
5 : : * All rights reserved.
6 : : *
7 : : * GnuCash is free software; you can redistribute it and/or modify
8 : : * it under the terms of the GNU Library General Public License as
9 : : * published by the Free Software Foundation; either version 2 of
10 : : * the License, or (at your option) any later version.
11 : : *
12 : : * Gnucash is distributed in the hope that it will be useful,
13 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 : : * Library General Public License for more details.
16 : : *
17 : : * You should have received a copy of the GNU General Public License
18 : : * along with this program; if not, contact:
19 : : *
20 : : * Free Software Foundation Voice: +1-617-542-5942
21 : : * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
22 : : * Boston, MA 02110-1301, USA gnu@gnu.org
23 : : */
24 : :
25 : : /** @addtogroup GUI
26 : : @{ */
27 : : /** @file gnc-accounting-period.c
28 : : @brief General utilities for dealing with accounting periods.
29 : : @author David Hampton <hampton@employees.org>
30 : :
31 : : These are general utility functions for specifying an accounting
32 : : period and converting it to a value usable by the gnucash engine.
33 : : The choice of src/app-utils is arbitrary as these utilities don't
34 : : fit well anywhere else. They are at a higher level than a GDate,
35 : : so they don't fit in src/core-utils/gnc-gdate-utils.c. They don't
36 : : operate on engine data structures, so they don't belong in
37 : : src/engine/Period.c. Putting them into src/engine/gnc-date.c
38 : : would be the best place for them, but then that creates a new
39 : : dependency from the src/engine directory to the src/core-utils
40 : : directory that doesn't currently exist. Since that might be a
41 : : problem for CashUtils, the app-file directory was chosen.
42 : : */
43 : :
44 : : #include <config.h>
45 : : #include <string.h>
46 : : #include "gnc-accounting-period.h"
47 : : #include "gnc-date.h"
48 : : #include "gnc-prefs.h"
49 : : #include "qof.h"
50 : : #include "gnc-session.h"
51 : :
52 : : static const QofLogModule log_module = G_LOG_DOMAIN;
53 : : static time64 gnc_accounting_period_start_time64 (GncAccountingPeriod which,
54 : : const GDate *fy_end,
55 : : const GDate *contains);
56 : : static time64 gnc_accounting_period_end_time64 (GncAccountingPeriod which,
57 : : const GDate *fy_end,
58 : : const GDate *contains);
59 : :
60 : : static time64
61 : 177 : lookup_start_date_option (GDate *fy_end)
62 : : {
63 : : time64 time;
64 : : int which;
65 : :
66 : 177 : if (gnc_prefs_get_bool (GNC_PREFS_GROUP_ACCT_SUMMARY, GNC_PREF_START_CHOICE_ABS))
67 : 0 : time = gnc_time64_get_day_start (gnc_prefs_get_int64
68 : : (GNC_PREFS_GROUP_ACCT_SUMMARY, GNC_PREF_START_DATE));
69 : : else
70 : : {
71 : 177 : which = gnc_prefs_get_int (GNC_PREFS_GROUP_ACCT_SUMMARY, GNC_PREF_START_PERIOD);
72 : 177 : time = gnc_accounting_period_start_time64 (which, fy_end, NULL);
73 : : }
74 : : /* we will need the balance of the last transaction before the start
75 : : date, so subtract 1 from start date */
76 : : /* CAS: we don't actually do what this comment says. I think that's
77 : : because a bug in the engine has been fixed. */
78 : 177 : return time;
79 : : }
80 : :
81 : : static time64
82 : 213 : lookup_end_date_option (GDate *fy_end)
83 : : {
84 : : time64 time;
85 : : int which;
86 : :
87 : 213 : if (gnc_prefs_get_bool (GNC_PREFS_GROUP_ACCT_SUMMARY, GNC_PREF_END_CHOICE_ABS))
88 : 0 : time = gnc_time64_get_day_end (gnc_prefs_get_int64
89 : : (GNC_PREFS_GROUP_ACCT_SUMMARY, GNC_PREF_END_DATE));
90 : : else
91 : : {
92 : 213 : which = gnc_prefs_get_int (GNC_PREFS_GROUP_ACCT_SUMMARY, GNC_PREF_END_PERIOD);
93 : 213 : time = gnc_accounting_period_end_time64 (which, fy_end, NULL);
94 : : }
95 : 213 : if (time == 0)
96 : 0 : time = -1;
97 : 213 : return time;
98 : : }
99 : :
100 : : static GDate *
101 : 390 : get_fy_end (void)
102 : : {
103 : : QofBook *book;
104 : 390 : GDate *date = NULL;
105 : :
106 : 390 : book = qof_session_get_book(gnc_get_current_session());
107 : 390 : qof_instance_get (QOF_INSTANCE (book), "fy-end", &date, NULL);
108 : 390 : return date;
109 : : }
110 : :
111 : : time64
112 : 177 : gnc_accounting_period_fiscal_start (void)
113 : : {
114 : : time64 t;
115 : 177 : GDate *fy_end = get_fy_end();
116 : 177 : t = lookup_start_date_option (fy_end);
117 : 177 : if (fy_end)
118 : 0 : g_date_free (fy_end);
119 : 177 : return t;
120 : : }
121 : :
122 : : time64
123 : 213 : gnc_accounting_period_fiscal_end (void)
124 : : {
125 : : time64 t;
126 : 213 : GDate *fy_end = get_fy_end();
127 : :
128 : 213 : t = lookup_end_date_option (fy_end);
129 : 213 : if (fy_end)
130 : 0 : g_date_free (fy_end);
131 : 213 : return t;
132 : : }
133 : :
134 : : GDate *
135 : 177 : gnc_accounting_period_start_gdate (GncAccountingPeriod which,
136 : : const GDate *fy_end,
137 : : const GDate *contains)
138 : : {
139 : : GDate *date;
140 : :
141 : 177 : if (contains)
142 : : {
143 : 0 : date = g_date_new_dmy (g_date_get_day (contains),
144 : : g_date_get_month (contains),
145 : 0 : g_date_get_year (contains));
146 : : }
147 : : else
148 : : {
149 : 177 : date = g_date_new ();
150 : 177 : gnc_gdate_set_today (date);
151 : : }
152 : :
153 : 177 : switch (which)
154 : : {
155 : 0 : default:
156 : 0 : PINFO ("Undefined relative time constant %d", which);
157 : 0 : g_date_free (date);
158 : 0 : return NULL;
159 : :
160 : 177 : case GNC_ACCOUNTING_PERIOD_TODAY:
161 : : /* Already have today's date */
162 : 177 : break;
163 : :
164 : 0 : case GNC_ACCOUNTING_PERIOD_MONTH:
165 : 0 : gnc_gdate_set_month_start (date);
166 : 0 : break;
167 : :
168 : 0 : case GNC_ACCOUNTING_PERIOD_MONTH_PREV:
169 : 0 : gnc_gdate_set_prev_month_start (date);
170 : 0 : break;
171 : :
172 : 0 : case GNC_ACCOUNTING_PERIOD_QUARTER:
173 : 0 : gnc_gdate_set_quarter_start (date);
174 : 0 : break;
175 : :
176 : 0 : case GNC_ACCOUNTING_PERIOD_QUARTER_PREV:
177 : 0 : gnc_gdate_set_prev_quarter_start (date);
178 : 0 : break;
179 : :
180 : 0 : case GNC_ACCOUNTING_PERIOD_CYEAR:
181 : 0 : gnc_gdate_set_year_start (date);
182 : 0 : break;
183 : :
184 : 0 : case GNC_ACCOUNTING_PERIOD_CYEAR_PREV:
185 : 0 : gnc_gdate_set_prev_year_start (date);
186 : 0 : break;
187 : :
188 : 0 : case GNC_ACCOUNTING_PERIOD_FYEAR:
189 : 0 : if (fy_end == NULL)
190 : : {
191 : 0 : PINFO ("Request for fisal year value but no fiscal year end value provided.");
192 : 0 : g_date_free (date);
193 : 0 : return NULL;
194 : : }
195 : 0 : gnc_gdate_set_fiscal_year_start (date, fy_end);
196 : 0 : break;
197 : :
198 : 0 : case GNC_ACCOUNTING_PERIOD_FYEAR_PREV:
199 : 0 : if (fy_end == NULL)
200 : : {
201 : 0 : PINFO ("Request for fisal year value but no fiscal year end value provided.");
202 : 0 : g_date_free (date);
203 : 0 : return NULL;
204 : : }
205 : 0 : gnc_gdate_set_prev_fiscal_year_start (date, fy_end);
206 : 0 : break;
207 : : }
208 : 177 : return date;
209 : : }
210 : :
211 : : static time64
212 : 177 : gnc_accounting_period_start_time64 (GncAccountingPeriod which,
213 : : const GDate *fy_end,
214 : : const GDate *contains)
215 : : {
216 : : GDate *date;
217 : : time64 secs;
218 : :
219 : 177 : date = gnc_accounting_period_start_gdate (which, fy_end, contains);
220 : 177 : if (!date)
221 : 0 : return 0;
222 : :
223 : 177 : secs = gnc_time64_get_day_start_gdate (date);
224 : 177 : g_date_free (date);
225 : 177 : return secs;
226 : : }
227 : :
228 : : GDate *
229 : 213 : gnc_accounting_period_end_gdate (GncAccountingPeriod which,
230 : : const GDate *fy_end,
231 : : const GDate *contains)
232 : : {
233 : : GDate *date;
234 : :
235 : 213 : if (contains)
236 : : {
237 : 0 : date = g_date_new_dmy (g_date_get_day (contains),
238 : : g_date_get_month (contains),
239 : 0 : g_date_get_year (contains));
240 : : }
241 : : else
242 : : {
243 : 213 : date = g_date_new ();
244 : 213 : gnc_gdate_set_today (date);
245 : : }
246 : :
247 : 213 : switch (which)
248 : : {
249 : 0 : default:
250 : 0 : PINFO ("Undefined relative time constant %d", which);
251 : 0 : g_date_free (date);
252 : 0 : return 0;
253 : :
254 : 213 : case GNC_ACCOUNTING_PERIOD_TODAY:
255 : : /* Already have today's date */
256 : 213 : break;
257 : :
258 : 0 : case GNC_ACCOUNTING_PERIOD_MONTH:
259 : 0 : gnc_gdate_set_month_end (date);
260 : 0 : break;
261 : :
262 : 0 : case GNC_ACCOUNTING_PERIOD_MONTH_PREV:
263 : 0 : gnc_gdate_set_prev_month_end (date);
264 : 0 : break;
265 : :
266 : 0 : case GNC_ACCOUNTING_PERIOD_QUARTER:
267 : 0 : gnc_gdate_set_quarter_end (date);
268 : 0 : break;
269 : :
270 : 0 : case GNC_ACCOUNTING_PERIOD_QUARTER_PREV:
271 : 0 : gnc_gdate_set_prev_quarter_end (date);
272 : 0 : break;
273 : :
274 : 0 : case GNC_ACCOUNTING_PERIOD_CYEAR:
275 : 0 : gnc_gdate_set_year_end (date);
276 : 0 : break;
277 : :
278 : 0 : case GNC_ACCOUNTING_PERIOD_CYEAR_PREV:
279 : 0 : gnc_gdate_set_prev_year_end (date);
280 : 0 : break;
281 : :
282 : 0 : case GNC_ACCOUNTING_PERIOD_FYEAR:
283 : 0 : if (fy_end == NULL)
284 : : {
285 : 0 : PINFO ("Request for fisal year value but no fiscal year end value provided.");
286 : 0 : g_date_free (date);
287 : 0 : return 0;
288 : : }
289 : 0 : gnc_gdate_set_fiscal_year_end (date, fy_end);
290 : 0 : break;
291 : :
292 : 0 : case GNC_ACCOUNTING_PERIOD_FYEAR_PREV:
293 : 0 : if (fy_end == NULL)
294 : : {
295 : 0 : PINFO ("Request for fisal year value but no fiscal year end value provided.");
296 : 0 : g_date_free (date);
297 : 0 : return 0;
298 : : }
299 : 0 : gnc_gdate_set_prev_fiscal_year_end (date, fy_end);
300 : 0 : break;
301 : : }
302 : :
303 : 213 : return date;
304 : : }
305 : :
306 : : static time64
307 : 213 : gnc_accounting_period_end_time64 (GncAccountingPeriod which,
308 : : const GDate *fy_end,
309 : : const GDate *contains)
310 : : {
311 : : GDate *date;
312 : : time64 secs;
313 : :
314 : 213 : date = gnc_accounting_period_end_gdate (which, fy_end, contains);
315 : 213 : if (!date)
316 : 0 : return 0;
317 : :
318 : 213 : secs = gnc_time64_get_day_end_gdate (date);
319 : 213 : g_date_free (date);
320 : 213 : return secs ;
321 : : }
322 : :
323 : : /** @} */
|