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