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