gnucash master: Bug 728136 - Rate in Job

Geert Janssens gjanssens at code.gnucash.org
Tue May 13 11:34:57 EDT 2014


Updated	 via  https://github.com/Gnucash/gnucash/commit/93e58f30 (commit)
	from  https://github.com/Gnucash/gnucash/commit/f89e0c04 (commit)



commit 93e58f3087b3f8a5e8f767397bb18b00bcce0cea
Author: Michalis Kamprianis <michalis at linuxmail.org>
Date:   Sat Apr 26 21:34:46 2014 +0200

    Bug 728136 - Rate in Job
    
    Added rate in job for automatic filling in price in customer invoices and vendor bills.
    
    	modified:   src/business/business-gnome/dialog-job.c
    	modified:   src/business/business-gnome/gtkbuilder/dialog-job.glade
    	modified:   src/business/business-ledger/gncEntryLedgerLoad.c
    	modified:   src/engine/gncJob.c
    	modified:   src/engine/gncJob.h
    	modified:   src/engine/test/test-job.c

diff --git a/src/business/business-gnome/dialog-job.c b/src/business/business-gnome/dialog-job.c
index 806995f..dc8c841 100644
--- a/src/business/business-gnome/dialog-job.c
+++ b/src/business/business-gnome/dialog-job.c
@@ -27,6 +27,7 @@
 #include <glib/gi18n.h>
 
 #include "dialog-utils.h"
+#include "gnc-amount-edit.h"
 #include "gnc-component-manager.h"
 #include "gnc-ui.h"
 #include "gnc-gui-query.h"
@@ -75,6 +76,7 @@ struct _job_window
     GtkWidget *	cust_edit;
     GtkWidget *	name_entry;
     GtkWidget *	desc_entry;
+    GtkWidget *	rate_entry;
     GtkWidget *	active_check;
 
     JobDialogType	dialog_type;
@@ -109,6 +111,8 @@ static void gnc_ui_to_job (JobWindow *jw, GncJob *job)
                    0, -1));
     gncJobSetReference (job, gtk_editable_get_chars
                         (GTK_EDITABLE (jw->desc_entry), 0, -1));
+    gncJobSetRate (job, gnc_amount_edit_get_amount
+                        (GNC_AMOUNT_EDIT (jw->rate_entry)));
     gncJobSetActive (job, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
                      (jw->active_check)));
     {
@@ -302,7 +306,7 @@ gnc_job_new_window (QofBook *bookp, GncOwner *owner, GncJob *job)
 {
     JobWindow *jw;
     GtkBuilder *builder;
-    GtkWidget *owner_box, *owner_label;
+    GtkWidget *owner_box, *owner_label, *edit, *hbox;
 
     /*
      * Find an existing window for this job.  If found, bring it to
@@ -345,6 +349,15 @@ gnc_job_new_window (QofBook *bookp, GncOwner *owner, GncJob *job)
     owner_box = GTK_WIDGET(gtk_builder_get_object (builder, "customer_hbox"));
     owner_label = GTK_WIDGET(gtk_builder_get_object (builder, "owner_label"));
 
+    edit = gnc_amount_edit_new();
+    gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE);
+
+    jw->rate_entry = edit;
+    gtk_widget_show (edit);
+
+    hbox = GTK_WIDGET(gtk_builder_get_object (builder, "rate_entry"));
+    gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
+
     /* Setup signals */
     gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, jw);
 
@@ -361,6 +374,8 @@ gnc_job_new_window (QofBook *bookp, GncOwner *owner, GncJob *job)
         gtk_entry_set_text (GTK_ENTRY (jw->id_entry), gncJobGetID (job));
         gtk_entry_set_text (GTK_ENTRY (jw->name_entry), gncJobGetName (job));
         gtk_entry_set_text (GTK_ENTRY (jw->desc_entry), gncJobGetReference (job));
+        gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (jw->rate_entry),
+                                      gncJobGetRate (job));
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (jw->active_check),
                                       gncJobGetActive (job));
 
@@ -561,6 +576,8 @@ gnc_job_search (GncJob *start, GncOwner *owner, QofBook *book)
                                            JOB_ACTIVE, NULL);
         params = gnc_search_param_prepend (params, _("Billing ID"), NULL, type,
                                            JOB_REFERENCE, NULL);
+        params = gnc_search_param_prepend (params, _("Rate"), NULL, type,
+                                           JOB_RATE, NULL);
         params = gnc_search_param_prepend (params, _("Job Number"), NULL, type,
                                            JOB_ID, NULL);
         params = gnc_search_param_prepend (params, _("Job Name"), NULL, type,
@@ -572,6 +589,8 @@ gnc_job_search (GncJob *start, GncOwner *owner, QofBook *book)
     {
         columns = gnc_search_param_prepend (columns, _("Billing ID"), NULL, type,
                                             JOB_REFERENCE, NULL);
+        columns = gnc_search_param_prepend (columns, _("Rate"), NULL, type,
+                                            JOB_RATE, NULL);
         columns = gnc_search_param_prepend (columns, _("Company"), NULL, type,
                                             JOB_OWNER, OWNER_NAME, NULL);
         columns = gnc_search_param_prepend (columns, _("Job Name"), NULL, type,
diff --git a/src/business/business-gnome/gtkbuilder/dialog-job.glade b/src/business/business-gnome/gtkbuilder/dialog-job.glade
index 038fc50..9b20e83 100644
--- a/src/business/business-gnome/gtkbuilder/dialog-job.glade
+++ b/src/business/business-gnome/gtkbuilder/dialog-job.glade
@@ -249,6 +249,20 @@
                             <property name="position">1</property>
                           </packing>
                         </child>
+                        <child>
+                          <object class="GtkLabel" id="labelrate">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="xalign">1</property>
+                            <property name="label" translatable="yes">Rate</property>
+                            <property name="justify">right</property>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -293,6 +307,20 @@
                             <property name="position">1</property>
                           </packing>
                         </child>
+                        <child>
+                          <object class="GtkHBox" id="rate_entry">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <child>
+                              <placeholder/>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
                       </object>
                       <packing>
                         <property name="expand">True</property>
diff --git a/src/business/business-ledger/gncEntryLedgerLoad.c b/src/business/business-ledger/gncEntryLedgerLoad.c
index e96eff7..adcdba5 100644
--- a/src/business/business-ledger/gncEntryLedgerLoad.c
+++ b/src/business/business-ledger/gncEntryLedgerLoad.c
@@ -379,6 +379,17 @@ void gnc_entry_ledger_load (GncEntryLedger *ledger, GList *entry_list)
                 GncTaxIncluded taxincluded_p = GNC_TAXINCLUDED_USEGLOBAL;
                 gboolean taxincluded = FALSE;
                 gnc_numeric discount = gnc_numeric_zero ();
+                gnc_numeric price = gnc_numeric_zero ();
+
+                /* Determine the Price from Customer's or Vendor's Job */
+                switch (gncOwnerGetType (gncInvoiceGetOwner (ledger->invoice)))
+                {
+                case GNC_OWNER_JOB:
+                    price = gncJobGetRate( gncOwnerGetJob (gncInvoiceGetOwner (ledger->invoice)));
+                    break;
+                default:
+                    break;
+                }
 
                 /* Determine the TaxIncluded and Discount values */
                 switch (gncOwnerGetType (owner))
@@ -443,11 +454,13 @@ void gnc_entry_ledger_load (GncEntryLedger *ledger, GList *entry_list)
                     gncEntrySetInvTaxTable (blank_entry, table);
                     gncEntrySetInvTaxIncluded (blank_entry, taxincluded);
                     gncEntrySetInvDiscount (blank_entry, discount);
+                    gncEntrySetInvPrice (blank_entry, price);
                 }
                 else
                 {
                     gncEntrySetBillTaxTable (blank_entry, table);
                     gncEntrySetBillTaxIncluded (blank_entry, taxincluded);
+                    gncEntrySetBillPrice (blank_entry, price);
                 }
             }
 
diff --git a/src/engine/gncJob.c b/src/engine/gncJob.c
index d4200a1..7388b51 100644
--- a/src/engine/gncJob.c
+++ b/src/engine/gncJob.c
@@ -56,6 +56,7 @@ struct _gncJobClass
 static QofLogModule log_module = GNC_MOD_BUSINESS;
 
 #define _GNC_MOD_NAME        GNC_ID_JOB
+#define GNC_JOB_RATE         "job-rate"
 
 /* ================================================================== */
 /* misc inline functions */
@@ -306,6 +307,28 @@ void gncJobSetReference (GncJob *job, const char *desc)
     gncJobCommitEdit (job);
 }
 
+void gncJobSetRate (GncJob *job, gnc_numeric rate)
+{
+    if (!job) return;
+    if (gnc_numeric_equal (gncJobGetRate(job), rate)) return;
+
+    gncJobBeginEdit (job);
+    if (!gnc_numeric_zero_p(rate))
+        kvp_frame_set_numeric(job->inst.kvp_data, GNC_JOB_RATE, rate);
+    else
+    {
+        KvpFrame *frame;
+        KvpValue *value;
+
+        value = NULL;
+        frame = kvp_frame_set_value_nc (job->inst.kvp_data,
+                                        GNC_JOB_RATE, value);
+        if (!frame) kvp_value_delete (value);
+    }
+    mark_job (job);
+    gncJobCommitEdit (job);
+}
+
 void gncJobSetOwner (GncJob *job, GncOwner *owner)
 {
     if (!job) return;
@@ -429,6 +452,12 @@ const char * gncJobGetReference (const GncJob *job)
     return job->desc;
 }
 
+gnc_numeric gncJobGetRate (const GncJob *job)
+{
+    if (!job) return gnc_numeric_zero ();
+    return kvp_frame_get_numeric(job->inst.kvp_data, GNC_JOB_RATE);
+}
+
 GncOwner * gncJobGetOwner (GncJob *job)
 {
     if (!job) return NULL;
@@ -488,6 +517,12 @@ gboolean gncJobEqual(const GncJob * a, const GncJob *b)
         return FALSE;
     }
 
+    if (!gnc_numeric_equal(gncJobGetRate(a), gncJobGetRate(b)))
+    {
+        PWARN("Rates differ");
+        return FALSE;
+    }
+
     if (a->active != b->active)
     {
         PWARN("Active flags differ");
@@ -536,6 +571,7 @@ gboolean gncJobRegister (void)
         { JOB_NAME, QOF_TYPE_STRING, (QofAccessFunc)gncJobGetName, (QofSetterFunc)gncJobSetName },
         { JOB_ACTIVE, QOF_TYPE_BOOLEAN, (QofAccessFunc)gncJobGetActive, (QofSetterFunc)gncJobSetActive },
         { JOB_REFERENCE, QOF_TYPE_STRING, (QofAccessFunc)gncJobGetReference, (QofSetterFunc)gncJobSetReference },
+        { JOB_RATE, QOF_TYPE_NUMERIC, (QofAccessFunc)gncJobGetRate, (QofSetterFunc)gncJobSetRate },
 #ifdef GNUCASH_MAJOR_VERSION
         { JOB_OWNER, GNC_ID_OWNER, (QofAccessFunc)gncJobGetOwner, NULL },
 #else
diff --git a/src/engine/gncJob.h b/src/engine/gncJob.h
index b74b53b..b40cdbc 100644
--- a/src/engine/gncJob.h
+++ b/src/engine/gncJob.h
@@ -65,6 +65,7 @@ void gncJobDestroy (GncJob *job);
 void gncJobSetID (GncJob *job, const char *id);
 void gncJobSetName (GncJob *job, const char *jobname);
 void gncJobSetReference (GncJob *job, const char *owner_reference);
+void gncJobSetRate (GncJob *job, gnc_numeric rate);
 void gncJobSetOwner (GncJob *job, GncOwner *owner);
 void gncJobSetActive (GncJob *job, gboolean active);
 
@@ -79,6 +80,7 @@ void gncJobCommitEdit (GncJob *job);
 const char * gncJobGetID (const GncJob *job);
 const char * gncJobGetName (const GncJob *job);
 const char * gncJobGetReference (const GncJob *job);
+gnc_numeric  gncJobGetRate (const GncJob *job);
 GncOwner   * gncJobGetOwner (GncJob *job);
 gboolean     gncJobGetActive (const GncJob *job);
 
@@ -103,6 +105,7 @@ gboolean gncJobEqual(const GncJob *a, const GncJob *b);
 #define JOB_ID          "id"
 #define JOB_NAME        "name"
 #define JOB_REFERENCE   "reference"
+#define JOB_RATE        "rate"
 #define JOB_OWNER       "owner"
 #define Q_JOB_OWNER     "owner_collection"
 #define JOB_ACTIVE      "active"
diff --git a/src/engine/test/test-job.c b/src/engine/test/test-job.c
index 9791b4f..243307f 100644
--- a/src/engine/test/test-job.c
+++ b/src/engine/test/test-job.c
@@ -42,12 +42,10 @@ test_string_fcn (QofBook *book, const char *message,
                  void (*set) (GncJob *, const char *str),
                  const char * (*get)(const GncJob *));
 
-#if 0
 static void
 test_numeric_fcn (QofBook *book, const char *message,
                   void (*set) (GncJob *, gnc_numeric),
                   gnc_numeric (*get)(const GncJob *));
-#endif
 
 static void
 test_bool_fcn (QofBook *book, const char *message,
@@ -89,6 +87,7 @@ test_job (void)
         test_string_fcn (book, "Id", gncJobSetID, gncJobGetID);
         test_string_fcn (book, "Name", gncJobSetName, gncJobGetName);
         test_string_fcn (book, "Reference", gncJobSetReference, gncJobGetReference);
+        test_numeric_fcn (book, "Rate", gncJobSetRate, gncJobGetRate);
 
         test_bool_fcn (book, "Active", gncJobSetActive, gncJobGetActive);
 
@@ -174,7 +173,6 @@ test_string_fcn (QofBook *book, const char *message,
     count++;
 }
 
-#if 0
 static void
 test_numeric_fcn (QofBook *book, const char *message,
                   void (*set) (GncJob *, gnc_numeric),
@@ -199,7 +197,6 @@ test_numeric_fcn (QofBook *book, const char *message,
     gncJobSetActive (job, FALSE);
     count++;
 }
-#endif
 
 static void
 test_bool_fcn (QofBook *book, const char *message,



Summary of changes:
 src/business/business-gnome/dialog-job.c           | 21 ++++++++++++-
 .../business-gnome/gtkbuilder/dialog-job.glade     | 28 +++++++++++++++++
 src/business/business-ledger/gncEntryLedgerLoad.c  | 13 ++++++++
 src/engine/gncJob.c                                | 36 ++++++++++++++++++++++
 src/engine/gncJob.h                                |  3 ++
 src/engine/test/test-job.c                         |  5 +--
 6 files changed, 101 insertions(+), 5 deletions(-)



More information about the gnucash-changes mailing list