gnucash/libgnucash/app-utils/gnc-accounting-period.c
Geert Janssens 1238b9d8cd Prevent gcc from searching config.h in the current directory
This will avoid a ninja-build from picking up a config.h generated by the autotools build
(in the root build directory). Picking up the wrong config.h may lead to all kinds of
subtle issues if the autotools run was done with different options than the cmake run.
2017-10-26 14:05:17 +02:00

323 lines
8.7 KiB
C

/*
* gnc-accounting-period.c --
*
* Copyright (c) 2005 David Hampton <hampton@employees.org>
* All rights reserved.
*
* GnuCash is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* Gnucash is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, contact:
*
* Free Software Foundation Voice: +1-617-542-5942
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
* Boston, MA 02110-1301, USA gnu@gnu.org
*/
/** @addtogroup GUI
@{ */
/** @file gnc-accounting-period.c
@brief General utilities for dealing with accounting periods.
@author David Hampton <hampton@employees.org>
These are general utility functions for specifying an accounting
period and converting it to a value usable by the gnucash engine.
The choice of src/app-utils is arbitrary as these utilities don't
fit well anywhere else. They are at a higher level than a GDate,
so they don't fit in src/core-utils/gnc-gdate-utils.c. They don't
operate on engine data structures, so they don't belong in
src/engine/Period.c. Putting them into src/engine/gnc-date.c
would be the best place for them, but then that creates a new
dependency from the src/engine directory to the src/core-utils
directory that doesn't currently exist. Since that might be a
problem for CashUtils, the app-file directory was chosen.
*/
#include <config.h>
#include <string.h>
#include "gnc-accounting-period.h"
#include "gnc-date.h"
#include "gnc-prefs.h"
#include "qof.h"
#include "gnc-ui-util.h"
static time64 gnc_accounting_period_start_time64 (GncAccountingPeriod which,
const GDate *fy_end,
const GDate *contains);
static time64 gnc_accounting_period_end_time64 (GncAccountingPeriod which,
const GDate *fy_end,
const GDate *contains);
static time64
lookup_start_date_option(GDate *fy_end)
{
time64 time;
int which;
if (gnc_prefs_get_bool (GNC_PREFS_GROUP_ACCT_SUMMARY, GNC_PREF_START_CHOICE_ABS))
time = gnc_prefs_get_int64 (GNC_PREFS_GROUP_ACCT_SUMMARY, GNC_PREF_START_DATE);
else
{
which = gnc_prefs_get_int(GNC_PREFS_GROUP_ACCT_SUMMARY, GNC_PREF_START_PERIOD);
time = gnc_accounting_period_start_time64(which, fy_end, NULL);
}
/* we will need the balance of the last transaction before the start
date, so subtract 1 from start date */
/* CAS: we don't actually do what this comment says. I think that's
because a bug in the engine has been fixed. */
return time;
}
static time64
lookup_end_date_option(GDate *fy_end)
{
time64 time;
int which;
if (gnc_prefs_get_bool (GNC_PREFS_GROUP_ACCT_SUMMARY, GNC_PREF_END_CHOICE_ABS))
time = gnc_prefs_get_int64 (GNC_PREFS_GROUP_ACCT_SUMMARY, GNC_PREF_END_DATE);
else
{
which = gnc_prefs_get_int(GNC_PREFS_GROUP_ACCT_SUMMARY, GNC_PREF_END_PERIOD);
time = gnc_accounting_period_end_time64(which, fy_end, NULL);
}
if (time == 0)
time = -1;
return time;
}
static GDate *
get_fy_end(void)
{
QofBook *book;
GDate *date = NULL;
book = gnc_get_current_book();
qof_instance_get (QOF_INSTANCE (book),
"fy-end", &date,
NULL);
return date;
}
time64
gnc_accounting_period_fiscal_start(void)
{
time64 t;
GDate *fy_end = get_fy_end();
t = lookup_start_date_option(fy_end);
if (fy_end)
g_date_free(fy_end);
return t;
}
time64
gnc_accounting_period_fiscal_end(void)
{
time64 t;
GDate *fy_end = get_fy_end();
t = lookup_end_date_option(fy_end);
if (fy_end)
g_date_free(fy_end);
return t;
}
GDate *
gnc_accounting_period_start_gdate (GncAccountingPeriod which,
const GDate *fy_end,
const GDate *contains)
{
GDate *date;
if (contains)
{
date = g_date_new_dmy(g_date_get_day(contains),
g_date_get_month(contains),
g_date_get_year(contains));
}
else
{
date = g_date_new ();
gnc_gdate_set_today (date);
}
switch (which)
{
default:
g_message("Undefined relative time constant %d", which);
g_date_free(date);
return NULL;
case GNC_ACCOUNTING_PERIOD_TODAY:
/* Already have today's date */
break;
case GNC_ACCOUNTING_PERIOD_MONTH:
gnc_gdate_set_month_start(date);
break;
case GNC_ACCOUNTING_PERIOD_MONTH_PREV:
gnc_gdate_set_prev_month_start(date);
break;
case GNC_ACCOUNTING_PERIOD_QUARTER:
gnc_gdate_set_quarter_start(date);
break;
case GNC_ACCOUNTING_PERIOD_QUARTER_PREV:
gnc_gdate_set_prev_quarter_start(date);
break;
case GNC_ACCOUNTING_PERIOD_CYEAR:
gnc_gdate_set_year_start(date);
break;
case GNC_ACCOUNTING_PERIOD_CYEAR_PREV:
gnc_gdate_set_prev_year_start(date);
break;
case GNC_ACCOUNTING_PERIOD_FYEAR:
if (fy_end == NULL)
{
g_message("Request for fisal year value but no fiscal year end value provided.");
g_date_free(date);
return NULL;
}
gnc_gdate_set_fiscal_year_start(date, fy_end);
break;
case GNC_ACCOUNTING_PERIOD_FYEAR_PREV:
if (fy_end == NULL)
{
g_message("Request for fisal year value but no fiscal year end value provided.");
g_date_free(date);
return NULL;
}
gnc_gdate_set_prev_fiscal_year_start(date, fy_end);
break;
}
return date;
}
static time64
gnc_accounting_period_start_time64 (GncAccountingPeriod which,
const GDate *fy_end,
const GDate *contains)
{
GDate *date;
time64 secs;
date = gnc_accounting_period_start_gdate(which, fy_end, contains);
if (!date)
return 0;
secs = gnc_time64_get_day_start_gdate(date);
g_date_free(date);
return secs;
}
GDate *
gnc_accounting_period_end_gdate (GncAccountingPeriod which,
const GDate *fy_end,
const GDate *contains)
{
GDate *date;
if (contains)
{
date = g_date_new_dmy(g_date_get_day(contains),
g_date_get_month(contains),
g_date_get_year(contains));
}
else
{
date = g_date_new ();
gnc_gdate_set_today (date);
}
switch (which)
{
default:
g_message("Undefined relative time constant %d", which);
g_date_free(date);
return 0;
case GNC_ACCOUNTING_PERIOD_TODAY:
/* Already have today's date */
break;
case GNC_ACCOUNTING_PERIOD_MONTH:
gnc_gdate_set_month_end(date);
break;
case GNC_ACCOUNTING_PERIOD_MONTH_PREV:
gnc_gdate_set_prev_month_end(date);
break;
case GNC_ACCOUNTING_PERIOD_QUARTER:
gnc_gdate_set_quarter_end(date);
break;
case GNC_ACCOUNTING_PERIOD_QUARTER_PREV:
gnc_gdate_set_prev_quarter_end(date);
break;
case GNC_ACCOUNTING_PERIOD_CYEAR:
gnc_gdate_set_year_end(date);
break;
case GNC_ACCOUNTING_PERIOD_CYEAR_PREV:
gnc_gdate_set_prev_year_end(date);
break;
case GNC_ACCOUNTING_PERIOD_FYEAR:
if (fy_end == NULL)
{
g_message("Request for fisal year value but no fiscal year end value provided.");
g_date_free(date);
return 0;
}
gnc_gdate_set_fiscal_year_end(date, fy_end);
break;
case GNC_ACCOUNTING_PERIOD_FYEAR_PREV:
if (fy_end == NULL)
{
g_message("Request for fisal year value but no fiscal year end value provided.");
g_date_free(date);
return 0;
}
gnc_gdate_set_prev_fiscal_year_end(date, fy_end);
break;
}
return date;
}
static time64
gnc_accounting_period_end_time64 (GncAccountingPeriod which,
const GDate *fy_end,
const GDate *contains)
{
GDate *date;
time64 secs;
date = gnc_accounting_period_end_gdate(which, fy_end, contains);
if (!date)
return 0;
secs = gnc_time64_get_day_end_gdate(date);
g_date_free(date);
return secs ;
}
/** @} */