r15009 - gnucash/trunk/src - Allow budget values to default to unset, rather than zero.
Chris Shoemaker
chris at cvs.gnucash.org
Wed Oct 11 16:55:21 EDT 2006
Author: chris
Date: 2006-10-11 16:55:20 -0400 (Wed, 11 Oct 2006)
New Revision: 15009
Trac: http://svn.gnucash.org/trac/changeset/15009
Modified:
gnucash/trunk/src/engine/gnc-budget.c
gnucash/trunk/src/engine/gnc-budget.h
gnucash/trunk/src/engine/gw-engine-spec.scm
gnucash/trunk/src/gnome/gnc-plugin-page-budget.c
gnucash/trunk/src/report/standard-reports/budget.scm
Log:
Allow budget values to default to unset, rather than zero.
Main patch by Gregory Alexander <gregalexa at gmail.com>.
On editing, interpret a blank as an unset budget value.
On reporting, show "." for unset budget values.
Add bugdet functions for testing whether a budget value is set or not,
and for unsetting it.
Modified: gnucash/trunk/src/engine/gnc-budget.c
===================================================================
--- gnucash/trunk/src/engine/gnc-budget.c 2006-10-11 20:49:49 UTC (rev 15008)
+++ gnucash/trunk/src/engine/gnc-budget.c 2006-10-11 20:55:20 UTC (rev 15009)
@@ -220,6 +220,31 @@
/* period_num is zero-based */
/* What happens when account is deleted, after we have an entry for it? */
void
+gnc_budget_unset_account_period_value(GncBudget *budget, Account *account,
+ guint period_num)
+{
+ const GUID *guid;
+ KvpFrame *frame;
+ gchar path[BUF_SIZE];
+ gchar *bufend;
+
+ gnc_budget_begin_edit(budget);
+ frame = qof_instance_get_slots(QOF_INSTANCE(budget));
+ guid = xaccAccountGetGUID(account);
+ bufend = guid_to_string_buff(guid, path);
+ g_sprintf(bufend, "/%d", period_num);
+
+ kvp_frame_set_value(frame, path, NULL);
+ qof_instance_set_dirty(&budget->inst);
+ gnc_budget_commit_edit(budget);
+
+ qof_event_gen( &budget->inst.entity, QOF_EVENT_MODIFY, NULL);
+
+}
+
+/* period_num is zero-based */
+/* What happens when account is deleted, after we have an entry for it? */
+void
gnc_budget_set_account_period_value(GncBudget *budget, Account *account,
guint period_num, gnc_numeric val)
{
@@ -234,7 +259,10 @@
bufend = guid_to_string_buff(guid, path);
g_sprintf(bufend, "/%d", period_num);
- kvp_frame_set_numeric(frame, path, val);
+ if (gnc_numeric_check(val))
+ kvp_frame_set_value(frame, path, NULL);
+ else
+ kvp_frame_set_numeric(frame, path, val);
qof_instance_set_dirty(&budget->inst);
gnc_budget_commit_edit(budget);
@@ -275,7 +303,23 @@
#endif
-/* Does not distinguish between unset and zero - returns zero either way. */
+gboolean
+gnc_budget_is_account_period_value_set(GncBudget *budget, Account *account,
+ guint period_num)
+{
+ gchar path[BUF_SIZE];
+ gchar *bufend;
+ KvpFrame *frame;
+
+ g_return_val_if_fail(GNC_IS_BUDGET(budget), FALSE);
+ g_return_val_if_fail(account, FALSE);
+
+ frame = qof_instance_get_slots(QOF_INSTANCE(budget));
+ bufend = guid_to_string_buff(xaccAccountGetGUID(account), path);
+ g_sprintf(bufend, "/%d", period_num);
+ return (kvp_frame_get_value(frame, path) != NULL);
+}
+
gnc_numeric
gnc_budget_get_account_period_value(GncBudget *budget, Account *account,
guint period_num)
@@ -292,7 +336,9 @@
frame = qof_instance_get_slots(QOF_INSTANCE(budget));
bufend = guid_to_string_buff(xaccAccountGetGUID(account), path);
g_sprintf(bufend, "/%d", period_num);
- numeric = kvp_frame_get_numeric(frame, path); /* Zero if unset */
+
+ numeric = kvp_frame_get_numeric(frame, path);
+ /* This still returns zero if unset, but callers can check for that. */
return numeric;
}
Modified: gnucash/trunk/src/engine/gnc-budget.h
===================================================================
--- gnucash/trunk/src/engine/gnc-budget.h 2006-10-11 20:49:49 UTC (rev 15008)
+++ gnucash/trunk/src/engine/gnc-budget.h 2006-10-11 20:55:20 UTC (rev 15009)
@@ -115,7 +115,12 @@
/* Period indices are zero-based. */
void gnc_budget_set_account_period_value(
GncBudget* budget, Account* account, guint period_num, gnc_numeric val);
+void gnc_budget_unset_account_period_value(
+ GncBudget* budget, Account* account, guint period_num);
+gboolean gnc_budget_is_account_period_value_set(
+ GncBudget *budget, Account *account, guint period_num);
+
gnc_numeric gnc_budget_get_account_period_value(
GncBudget *budget, Account *account, guint period_num);
gnc_numeric gnc_budget_get_account_period_actual_value(
Modified: gnucash/trunk/src/engine/gw-engine-spec.scm
===================================================================
--- gnucash/trunk/src/engine/gw-engine-spec.scm 2006-10-11 20:49:49 UTC (rev 15008)
+++ gnucash/trunk/src/engine/gw-engine-spec.scm 2006-10-11 20:55:20 UTC (rev 15009)
@@ -2580,6 +2580,17 @@
(gw:wrap-function
ws
+ 'gnc:budget-is-account-period-value-set
+ '<gw:bool>
+ "gnc_budget_is_account_period_value_set"
+ '((<gnc:Budget*> budget)
+ (<gnc:Account*> acct)
+ (<gw:unsigned-int> period_num)
+ )
+ "Determine if the given account and budget period has a budgeted value.")
+
+(gw:wrap-function
+ ws
'gnc:budget-get-account-period-value
'<gnc:numeric>
"gnc_budget_get_account_period_value"
Modified: gnucash/trunk/src/gnome/gnc-plugin-page-budget.c
===================================================================
--- gnucash/trunk/src/gnome/gnc-plugin-page-budget.c 2006-10-11 20:49:49 UTC (rev 15008)
+++ gnucash/trunk/src/gnome/gnc-plugin-page-budget.c 2006-10-11 20:55:20 UTC (rev 15009)
@@ -964,13 +964,19 @@
budget = GNC_BUDGET(g_object_get_data(G_OBJECT(col), "budget"));
period_num = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(col),
"period_num"));
- numeric = gnc_budget_get_account_period_value(budget, account, period_num);
- if (gnc_numeric_zero_p(numeric))
+ if (!gnc_budget_is_account_period_value_set(budget, account, period_num)) {
amtbuff[0] = '\0';
- else
- xaccSPrintAmount (amtbuff, numeric,
- gnc_account_print_info (account, FALSE));
+ } else {
+ numeric = gnc_budget_get_account_period_value(budget, account,
+ period_num);
+ if (gnc_numeric_check(numeric)) {
+ strcpy(amtbuff, "error");
+ } else {
+ xaccSPrintAmount(amtbuff, numeric,
+ gnc_account_print_info(account, FALSE));
+ }
+ }
return g_strdup(amtbuff);
}
@@ -981,7 +987,7 @@
{
GncBudget *budget;
guint period_num;
- gnc_numeric numeric = gnc_numeric_zero();
+ gnc_numeric numeric = gnc_numeric_error(GNC_ERROR_ARG);
if (!xaccParseAmount (new_text, TRUE, &numeric, NULL) &&
!(new_text && *new_text == '\0'))
@@ -992,7 +998,11 @@
budget = GNC_BUDGET(g_object_get_data(G_OBJECT(col), "budget"));
- gnc_budget_set_account_period_value(budget, account, period_num, numeric);
+ if (new_text && *new_text == '\0')
+ gnc_budget_unset_account_period_value(budget, account, period_num);
+ else
+ gnc_budget_set_account_period_value(budget, account, period_num,
+ numeric);
}
static void
Modified: gnucash/trunk/src/report/standard-reports/budget.scm
===================================================================
--- gnucash/trunk/src/report/standard-reports/budget.scm 2006-10-11 20:49:49 UTC (rev 15008)
+++ gnucash/trunk/src/report/standard-reports/budget.scm 2006-10-11 20:55:20 UTC (rev 15009)
@@ -114,15 +114,16 @@
(act-col (+ 1 bgt-col))
(comm (gnc:account-get-commodity acct))
+ (bgt-unset? (not (gnc:budget-is-account-period-value-set
+ budget acct period)))
(numeric-val (gnc:budget-get-account-period-value
budget acct period))
- (bgt-val (gnc:make-gnc-monetary
- comm numeric-val))
+ (bgt-val (if bgt-unset? "."
+ (gnc:make-gnc-monetary comm numeric-val)))
(numeric-val (gnc:budget-get-account-period-actual-value
budget acct period))
- (act-val (gnc:make-gnc-monetary
- comm numeric-val))
+ (act-val (gnc:make-gnc-monetary comm numeric-val))
(reverse-balance? (gnc:account-reverse-balance? acct))
)
More information about the gnucash-changes
mailing list