27 #include <glib/gi18n.h>
29 #include "dialog-utils.h"
30 #include "gnc-amount-edit.h"
31 #include "gnc-component-manager.h"
33 #include "gnc-gui-query.h"
35 #include "dialog-search.h"
36 #include "search-param.h"
42 #include "business-gnome-utils.h"
43 #include "dialog-job.h"
44 #include "dialog-invoice.h"
45 #include "dialog-payment.h"
47 #define DIALOG_NEW_JOB_CM_CLASS "dialog-new-job"
48 #define DIALOG_EDIT_JOB_CM_CLASS "dialog-edit-job"
50 #define GNC_PREFS_GROUP_SEARCH "dialogs.business.job-search"
52 void gnc_job_window_ok_cb (GtkWidget *widget, gpointer data);
53 void gnc_job_window_cancel_cb (GtkWidget *widget, gpointer data);
54 void gnc_job_window_help_cb (GtkWidget *widget, gpointer data);
55 void gnc_job_window_destroy_cb (GtkWidget *widget, gpointer data);
56 void gnc_job_name_changed_cb (GtkWidget *widget, gpointer data);
76 GtkWidget * cust_edit;
77 GtkWidget * name_entry;
78 GtkWidget * desc_entry;
79 GtkWidget * rate_entry;
80 GtkWidget * active_check;
82 JobDialogType dialog_type;
98 return gncJobLookup (jw->book, &jw->job_guid);
103 gnc_suspend_gui_refresh ();
104 gncJobBeginEdit (job);
108 gncJobSetID (job, gtk_editable_get_chars (GTK_EDITABLE (jw->id_entry),
110 gncJobSetName (job, gtk_editable_get_chars (GTK_EDITABLE (jw->name_entry),
112 gncJobSetReference (job, gtk_editable_get_chars
113 (GTK_EDITABLE (jw->desc_entry), 0, -1));
114 gncJobSetRate (job, gnc_amount_edit_get_amount
115 (GNC_AMOUNT_EDIT (jw->rate_entry)));
116 gncJobSetActive (job, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
117 (jw->active_check)));
119 GncOwner * old = gncJobGetOwner (job);
120 gnc_owner_get_owner (jw->cust_edit, &(jw->owner));
122 gncJobSetOwner (job, &(jw->owner));
125 gncJobCommitEdit (job);
126 gnc_resume_gui_refresh ();
136 res = gtk_entry_get_text (GTK_ENTRY (jw->name_entry));
137 if (g_strcmp0 (res,
"") == 0)
139 const char *message = _(
"The Job must be given a name.");
140 gnc_error_dialog(jw->dialog,
"%s", message);
145 gnc_owner_get_owner (jw->cust_edit, &(jw->owner));
146 res = gncOwnerGetName (&(jw->owner));
147 if (res == NULL || g_strcmp0 (res,
"") == 0)
149 const char *message = _(
"You must choose an owner for this job.");
150 gnc_error_dialog(jw->dialog,
"%s", message);
155 res = gtk_entry_get_text (GTK_ENTRY (jw->id_entry));
156 if (g_strcmp0 (res,
"") == 0)
158 string = gncJobNextID(jw->book);
159 gtk_entry_set_text (GTK_ENTRY (jw->id_entry),
string);
165 GncJob *job = jw_get_job (jw);
168 gnc_ui_to_job (jw, job);
173 jw->dialog_type = EDIT_JOB;
179 gnc_job_window_ok_cb (GtkWidget *widget, gpointer data)
184 if (!gnc_job_verify_ok (jw))
188 jw->created_job = jw_get_job (jw);
191 gnc_close_gui_component (jw->component_id);
195 gnc_job_window_cancel_cb (GtkWidget *widget, gpointer data)
199 gnc_close_gui_component (jw->component_id);
203 gnc_job_window_help_cb (GtkWidget *widget, gpointer data)
210 gnc_job_window_destroy_cb (GtkWidget *widget, gpointer data)
213 GncJob *job = jw_get_job (jw);
215 gnc_suspend_gui_refresh ();
217 if (jw->dialog_type == NEW_JOB && job != NULL)
219 gncJobBeginEdit (job);
224 gnc_unregister_gui_component (jw->component_id);
225 gnc_resume_gui_refresh ();
231 gnc_job_name_changed_cb (GtkWidget *widget, gpointer data)
234 char *fullname, *title;
235 const char *name, *id;
240 name = gtk_entry_get_text (GTK_ENTRY (jw->name_entry));
241 if (!name || *name ==
'\0')
242 name = _(
"<No name>");
244 id = gtk_entry_get_text (GTK_ENTRY (jw->id_entry));
246 fullname = g_strconcat (name,
" (",
id,
")", (
char *)NULL);
248 if (jw->dialog_type == EDIT_JOB)
249 title = g_strconcat (_(
"Edit Job"),
" - ", fullname, (
char *)NULL);
251 title = g_strconcat (_(
"New Job"),
" - ", fullname, (
char *)NULL);
253 gtk_window_set_title (GTK_WINDOW (jw->dialog), title);
260 gnc_job_window_close_handler (gpointer user_data)
264 gtk_widget_destroy (jw->dialog);
270 gnc_job_window_refresh_handler (GHashTable *changes, gpointer user_data)
274 GncJob *job = jw_get_job (jw);
279 gnc_close_gui_component (jw->component_id);
286 info = gnc_gui_get_entity_events (changes, &jw->job_guid);
287 if (info && (info->event_mask & QOF_EVENT_DESTROY))
289 gnc_close_gui_component (jw->component_id);
296 find_handler (gpointer
find_data, gpointer user_data)
298 const GncGUID *job_guid = find_data;
301 return(jw &&
guid_equal(&jw->job_guid, job_guid));
309 GtkWidget *owner_box, *owner_label, *edit, *hbox;
319 job_guid = *gncJobGetGUID (job);
320 jw = gnc_find_first_gui_component (DIALOG_EDIT_JOB_CM_CLASS,
321 find_handler, &job_guid);
324 gtk_window_present (GTK_WINDOW(jw->dialog));
334 gncOwnerCopy (owner, &(jw->owner));
337 builder = gtk_builder_new();
338 gnc_builder_add_from_file (builder,
"dialog-job.glade",
"Job Dialog");
341 jw->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"Job Dialog"));
344 jw->id_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"id_entry"));
345 jw->name_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"name_entry"));
346 jw->desc_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"desc_entry"));
347 jw->active_check = GTK_WIDGET(gtk_builder_get_object (builder,
"active_check"));
349 owner_box = GTK_WIDGET(gtk_builder_get_object (builder,
"customer_hbox"));
350 owner_label = GTK_WIDGET(gtk_builder_get_object (builder,
"owner_label"));
352 edit = gnc_amount_edit_new();
353 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE);
355 jw->rate_entry = edit;
356 gtk_widget_show (edit);
358 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"rate_entry"));
359 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
362 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, jw);
368 jw->job_guid = *gncJobGetGUID (job);
370 jw->dialog_type = EDIT_JOB;
371 jw->cust_edit = gnc_owner_edit_create (owner_label, owner_box,
374 gtk_entry_set_text (GTK_ENTRY (jw->id_entry), gncJobGetID (job));
375 gtk_entry_set_text (GTK_ENTRY (jw->name_entry), gncJobGetName (job));
376 gtk_entry_set_text (GTK_ENTRY (jw->desc_entry), gncJobGetReference (job));
377 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (jw->rate_entry),
378 gncJobGetRate (job));
379 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (jw->active_check),
380 gncJobGetActive (job));
382 jw->component_id = gnc_register_gui_component (DIALOG_EDIT_JOB_CM_CLASS,
383 gnc_job_window_refresh_handler,
384 gnc_job_window_close_handler,
389 job = gncJobCreate (bookp);
390 gncJobSetOwner (job, owner);
391 jw->job_guid = *gncJobGetGUID (job);
393 jw->dialog_type = NEW_JOB;
396 if (owner->owner.undefined)
398 jw->cust_edit = gnc_owner_edit_create (owner_label, owner_box,
403 jw->cust_edit = gnc_owner_select_create (owner_label, owner_box,
407 jw->component_id = gnc_register_gui_component (DIALOG_NEW_JOB_CM_CLASS,
408 gnc_job_window_refresh_handler,
409 gnc_job_window_close_handler,
413 gnc_job_name_changed_cb (NULL, jw);
414 gnc_gui_component_watch_entity_type (jw->component_id,
416 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
418 gtk_widget_show_all (jw->dialog);
421 gtk_widget_grab_focus(jw->name_entry);
428 g_object_unref(G_OBJECT(builder));
437 if (!book)
return NULL;
438 jw = gnc_ui_job_new (owner, book);
439 return jw_get_job (jw);
449 if (!bookp)
return NULL;
453 g_return_val_if_fail ((
gncOwnerGetType (ownerp) == GNC_OWNER_CUSTOMER) ||
456 gncOwnerCopy (ownerp, &owner);
459 gncOwnerInitCustomer (&owner, NULL);
461 jw = gnc_job_new_window (bookp, &owner, NULL);
466 gnc_ui_job_edit (
GncJob *job)
470 if (!job)
return NULL;
472 jw = gnc_job_new_window (
gncJobGetBook(job), gncJobGetOwner(job), job);
479 edit_job_cb (gpointer *job_p, gpointer user_data)
483 g_return_if_fail (job_p && user_data);
490 gnc_ui_job_edit (job);
494 invoice_job_cb (gpointer *job_p, gpointer user_data)
500 g_return_if_fail (job_p && user_data);
506 gncOwnerInitJob (&owner, job);
507 gnc_invoice_search (NULL, &owner, sw->book);
511 payment_job_cb (gpointer *job_p, gpointer user_data)
517 g_return_if_fail (job_p && user_data);
524 gncOwnerInitJob (&owner, job);
525 gnc_ui_payment_new (&owner, sw->book);
530 new_job_cb (gpointer user_data)
535 g_return_val_if_fail (user_data, NULL);
537 jw = gnc_ui_job_new (sw->owner, sw->book);
538 return jw_get_job (jw);
542 free_userdata_cb (gpointer user_data)
546 g_return_if_fail (sw);
558 static GList *params = NULL;
559 static GList *columns = NULL;
562 { N_(
"View/Edit Job"), edit_job_cb, NULL, TRUE},
563 { N_(
"View Invoices"), invoice_job_cb, NULL, TRUE},
564 { N_(
"Process Payment"), payment_job_cb, NULL, FALSE},
568 g_return_val_if_fail (book, NULL);
573 params = gnc_search_param_prepend (params, _(
"Owner's Name"), NULL, type,
574 JOB_OWNER, OWNER_NAME, NULL);
575 params = gnc_search_param_prepend (params, _(
"Only Active?"), NULL, type,
577 params = gnc_search_param_prepend (params, _(
"Billing ID"), NULL, type,
578 JOB_REFERENCE, NULL);
579 params = gnc_search_param_prepend (params, _(
"Rate"), NULL, type,
581 params = gnc_search_param_prepend (params, _(
"Job Number"), NULL, type,
583 params = gnc_search_param_prepend (params, _(
"Job Name"), NULL, type,
590 columns = gnc_search_param_prepend (columns, _(
"Billing ID"), NULL, type,
591 JOB_REFERENCE, NULL);
592 columns = gnc_search_param_prepend (columns, _(
"Rate"), NULL, type,
594 columns = gnc_search_param_prepend (columns, _(
"Company"), NULL, type,
595 JOB_OWNER, OWNER_NAME, NULL);
596 columns = gnc_search_param_prepend (columns, _(
"Job Name"), NULL, type,
598 columns = gnc_search_param_prepend (columns, _(
"ID #"), NULL, type,
603 q = qof_query_create_for (type);
610 owner = gncJobGetOwner (start);
618 (g_slist_prepend (NULL, QOF_PARAM_GUID),
632 gncJobGetGUID (start), QOF_QUERY_AND);
641 gncOwnerCopy (owner, &(sw->owner_def));
642 sw->owner = &(sw->owner_def);
647 return gnc_search_dialog_create (type, _(
"Find Job"),
648 params, columns, q, q2, buttons, NULL,
649 new_job_cb, sw, free_userdata_cb,
650 GNC_PREFS_GROUP_SEARCH, NULL);
656 gnc_job_search_select (gpointer start, gpointer book)
661 if (!book)
return NULL;
665 ownerp = gncJobGetOwner (j);
666 gncOwnerCopy (ownerp, &owner);
669 gncOwnerInitCustomer (&owner, NULL);
671 return gnc_job_search (start, &owner, book);
675 gnc_job_search_edit (gpointer start, gpointer book)
678 gnc_ui_job_edit (start);
const GncGUID * gncOwnerGetGUID(const GncOwner *owner)
gboolean gncOwnerEqual(const GncOwner *a, const GncOwner *b)
QofQuery * qof_query_copy(QofQuery *q)
struct _QofQuery QofQuery
void qof_query_destroy(QofQuery *q)
gboolean guid_equal(const GncGUID *guid_1, const GncGUID *guid_2)
void qof_query_set_book(QofQuery *q, QofBook *book)
void gnc_gnome_help(const char *file_name, const char *anchor)
void qof_query_add_guid_match(QofQuery *q, QofQueryParamList *param_list, const GncGUID *guid, QofQueryOp op)
GncOwnerType gncOwnerGetType(const GncOwner *owner)
const GncGUID * guid_null(void)
void qof_event_gen(QofInstance *entity, QofEventId event_type, gpointer event_data)
Invoke all registered event handlers using the given arguments.