GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
dialog-vendor.c
1 /*
2  * dialog-vendor.c -- Dialog for Vendor entry
3  * Copyright (C) 2001 Derek Atkins
4  * Author: Derek Atkins <[email protected]>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of
9  * the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, contact:
18  *
19  * Free Software Foundation Voice: +1-617-542-5942
20  * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
21  * Boston, MA 02110-1301, USA [email protected]
22  */
23 
24 #include "config.h"
25 
26 #include <gtk/gtk.h>
27 #include <glib/gi18n.h>
28 
29 #include "dialog-utils.h"
30 #include "gnc-currency-edit.h"
31 #include "gnc-component-manager.h"
32 #include "gnc-ui.h"
33 #include "gnc-gui-query.h"
34 #include "gnc-ui-util.h"
35 #include "qof.h"
36 #include "dialog-search.h"
37 #include "search-param.h"
38 
39 #include "gncAddress.h"
40 #include "gncVendor.h"
41 #include "gncVendorP.h"
42 
43 #include "business-gnome-utils.h"
44 #include "dialog-vendor.h"
45 #include "dialog-job.h"
46 #include "dialog-order.h"
47 #include "dialog-invoice.h"
48 #include "dialog-payment.h"
49 
50 #define DIALOG_NEW_VENDOR_CM_CLASS "dialog-new-vendor"
51 #define DIALOG_EDIT_VENDOR_CM_CLASS "dialog-edit-vendor"
52 
53 #define GNC_PREFS_GROUP_SEARCH "dialogs.business.vendor-search"
54 
55 void gnc_vendor_taxtable_check_cb (GtkToggleButton *togglebutton, gpointer user_data);
56 void gnc_vendor_window_ok_cb (GtkWidget *widget, gpointer data);
57 void gnc_vendor_window_cancel_cb (GtkWidget *widget, gpointer data);
58 void gnc_vendor_window_help_cb (GtkWidget *widget, gpointer data);
59 void gnc_vendor_window_destroy_cb (GtkWidget *widget, gpointer data);
60 void gnc_vendor_name_changed_cb (GtkWidget *widget, gpointer data);
61 void gnc_vendor_terms_changed_cb (GtkWidget *widget, gpointer data);
62 void gnc_vendor_taxincluded_changed_cb (GtkWidget *widget, gpointer data);
63 void gnc_vendor_taxtable_changed_cb (GtkWidget *widget, gpointer data);
64 
65 typedef enum
66 {
67  NEW_VENDOR,
68  EDIT_VENDOR
69 } VendorDialogType;
70 
72 {
73  QofBook * book;
74  QofQuery * q;
75 };
76 
78 {
79  GtkWidget * dialog;
80 
81  GtkWidget * id_entry;
82  GtkWidget * company_entry;
83 
84  GtkWidget * name_entry;
85  GtkWidget * addr1_entry;
86  GtkWidget * addr2_entry;
87  GtkWidget * addr3_entry;
88  GtkWidget * addr4_entry;
89  GtkWidget * phone_entry;
90  GtkWidget * fax_entry;
91  GtkWidget * email_entry;
92  GtkWidget * terms_menu;
93  GtkWidget * currency_edit;
94 
95  GtkWidget * active_check;
96  GtkWidget * taxincluded_menu;
97  GtkWidget * notes_text;
98 
99  GtkWidget * taxtable_check;
100  GtkWidget * taxtable_menu;
101 
102  GncTaxIncluded taxincluded;
103  GncBillTerm * terms;
104  VendorDialogType dialog_type;
105  GncGUID vendor_guid;
106  gint component_id;
107  QofBook * book;
108  GncVendor * created_vendor;
109 
110  GncTaxTable * taxtable;
111 };
112 
113 void
114 gnc_vendor_taxtable_check_cb (GtkToggleButton *togglebutton,
115  gpointer user_data)
116 {
117  VendorWindow *vw = user_data;
118 
119  if (gtk_toggle_button_get_active (togglebutton))
120  gtk_widget_set_sensitive (vw->taxtable_menu, TRUE);
121  else
122  gtk_widget_set_sensitive (vw->taxtable_menu, FALSE);
123 }
124 
125 static GncVendor *
126 vw_get_vendor (VendorWindow *vw)
127 {
128  if (!vw)
129  return NULL;
130 
131  return gncVendorLookup (vw->book, &vw->vendor_guid);
132 }
133 
134 static void gnc_ui_to_vendor (VendorWindow *vw, GncVendor *vendor)
135 {
136  GtkTextBuffer* text_buffer;
137  GtkTextIter start, end;
138  gchar *text;
139  GncAddress *addr;
140 
141  addr = gncVendorGetAddr (vendor);
142 
143  gnc_suspend_gui_refresh ();
144  gncVendorBeginEdit (vendor);
145 
146  if (vw->dialog_type == NEW_VENDOR)
147  qof_event_gen(QOF_INSTANCE(vendor), QOF_EVENT_ADD, NULL);
148 
149  gncVendorSetID (vendor, gtk_editable_get_chars
150  (GTK_EDITABLE (vw->id_entry), 0, -1));
151  gncVendorSetName (vendor, gtk_editable_get_chars
152  (GTK_EDITABLE (vw->company_entry), 0, -1));
153 
154  gncAddressSetName (addr, gtk_editable_get_chars
155  (GTK_EDITABLE (vw->name_entry), 0, -1));
156  gncAddressSetAddr1 (addr, gtk_editable_get_chars
157  (GTK_EDITABLE (vw->addr1_entry), 0, -1));
158  gncAddressSetAddr2 (addr, gtk_editable_get_chars
159  (GTK_EDITABLE (vw->addr2_entry), 0, -1));
160  gncAddressSetAddr3 (addr, gtk_editable_get_chars
161  (GTK_EDITABLE (vw->addr3_entry), 0, -1));
162  gncAddressSetAddr4 (addr, gtk_editable_get_chars
163  (GTK_EDITABLE (vw->addr4_entry), 0, -1));
164  gncAddressSetPhone (addr, gtk_editable_get_chars
165  (GTK_EDITABLE (vw->phone_entry), 0, -1));
166  gncAddressSetFax (addr, gtk_editable_get_chars
167  (GTK_EDITABLE (vw->fax_entry), 0, -1));
168  gncAddressSetEmail (addr, gtk_editable_get_chars
169  (GTK_EDITABLE (vw->email_entry), 0, -1));
170 
171  gncVendorSetActive (vendor, gtk_toggle_button_get_active
172  (GTK_TOGGLE_BUTTON (vw->active_check)));
173  gncVendorSetTaxIncluded (vendor, vw->taxincluded);
174 
175  text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(vw->notes_text));
176  gtk_text_buffer_get_bounds (text_buffer, &start, &end);
177  text = gtk_text_buffer_get_text (text_buffer, &start, &end, FALSE);
178  gncVendorSetNotes (vendor, text);
179 
180  gncVendorSetTerms (vendor, vw->terms);
181  gncVendorSetCurrency (vendor,
182  gnc_currency_edit_get_currency (GNC_CURRENCY_EDIT
183  (vw->currency_edit)));
184 
185  gncVendorSetTaxTableOverride
186  (vendor, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (vw->taxtable_check)));
187  gncVendorSetTaxTable (vendor, vw->taxtable);
188 
189  gncVendorCommitEdit (vendor);
190  gnc_resume_gui_refresh ();
191 }
192 
193 static gboolean check_entry_nonempty (GtkWidget *dialog, GtkWidget *entry,
194  const char * error_message)
195 {
196  const char *res = gtk_entry_get_text (GTK_ENTRY (entry));
197  if (g_strcmp0 (res, "") == 0)
198  {
199  if (error_message)
200  gnc_error_dialog (dialog, "%s", error_message);
201  return TRUE;
202  }
203  return FALSE;
204 }
205 
206 void
207 gnc_vendor_window_ok_cb (GtkWidget *widget, gpointer data)
208 {
209  VendorWindow *vw = data;
210  gchar *string;
211 
212  /* Check for valid company name */
213  if (check_entry_nonempty (vw->dialog, vw->company_entry,
214  _("You must enter a company name. "
215  "If this vendor is an individual (and not a company) "
216  "you should enter the same value for:\nIdentification "
217  "- Company Name, and\nPayment Address - Name.")))
218  return;
219 
220  /* Make sure we have an address */
221  if (check_entry_nonempty (vw->dialog, vw->addr1_entry, NULL) &&
222  check_entry_nonempty (vw->dialog, vw->addr2_entry, NULL) &&
223  check_entry_nonempty (vw->dialog, vw->addr3_entry, NULL) &&
224  check_entry_nonempty (vw->dialog, vw->addr4_entry, NULL))
225  {
226  const char *msg = _("You must enter a payment address.");
227  gnc_error_dialog (vw->dialog, "%s", msg);
228  return;
229  }
230 
231  /* Check for valid id and set one if necessary */
232  if (g_strcmp0 (gtk_entry_get_text (GTK_ENTRY (vw->id_entry)), "") == 0)
233  {
234  string = gncVendorNextID(vw->book);
235  gtk_entry_set_text (GTK_ENTRY (vw->id_entry), string);
236  g_free(string);
237  }
238 
239  /* Now save it off */
240  {
241  GncVendor *vendor = vw_get_vendor (vw);
242  if (vendor)
243  {
244  gnc_ui_to_vendor (vw, vendor);
245  }
246  vw->created_vendor = vendor;
247  vw->vendor_guid = *guid_null ();
248  }
249 
250  gnc_close_gui_component (vw->component_id);
251 }
252 
253 void
254 gnc_vendor_window_cancel_cb (GtkWidget *widget, gpointer data)
255 {
256  VendorWindow *vw = data;
257 
258  gnc_close_gui_component (vw->component_id);
259 }
260 
261 void
262 gnc_vendor_window_help_cb (GtkWidget *widget, gpointer data)
263 {
264  gnc_gnome_help(HF_HELP, HL_USAGE_VENDOR);
265 }
266 
267 void
268 gnc_vendor_window_destroy_cb (GtkWidget *widget, gpointer data)
269 {
270  VendorWindow *vw = data;
271  GncVendor *vendor = vw_get_vendor (vw);
272 
273  gnc_suspend_gui_refresh ();
274 
275  if (vw->dialog_type == NEW_VENDOR && vendor != NULL)
276  {
277  gncVendorBeginEdit (vendor);
278  gncVendorDestroy (vendor);
279  vw->vendor_guid = *guid_null ();
280  }
281 
282  gnc_unregister_gui_component (vw->component_id);
283  gnc_resume_gui_refresh ();
284 
285  g_free (vw);
286 }
287 
288 void
289 gnc_vendor_name_changed_cb (GtkWidget *widget, gpointer data)
290 {
291  VendorWindow *vw = data;
292  char *name, *id, *fullname, *title;
293 
294  if (!vw)
295  return;
296 
297  name = gtk_editable_get_chars (GTK_EDITABLE (vw->company_entry), 0, -1);
298  if (!name || *name == '\0')
299  name = g_strdup (_("<No name>"));
300 
301  id = gtk_editable_get_chars (GTK_EDITABLE (vw->id_entry), 0, -1);
302 
303  fullname = g_strconcat (name, " (", id, ")", (char *)NULL);
304 
305  if (vw->dialog_type == EDIT_VENDOR)
306  title = g_strconcat (_("Edit Vendor"), " - ", fullname, (char *)NULL);
307  else
308  title = g_strconcat (_("New Vendor"), " - ", fullname, (char *)NULL);
309 
310  gtk_window_set_title (GTK_WINDOW (vw->dialog), title);
311 
312  g_free (name);
313  g_free (id);
314  g_free (fullname);
315  g_free (title);
316 }
317 
318 void
319 gnc_vendor_terms_changed_cb (GtkWidget *widget, gpointer data)
320 {
321  GtkComboBox *cbox = GTK_COMBO_BOX (widget);
322  VendorWindow *vw = data;
323 
324  if (!vw) return;
325  if (!cbox) return;
326 
327  vw->terms = gnc_simple_combo_get_value (cbox);
328 }
329 
330 void
331 gnc_vendor_taxincluded_changed_cb (GtkWidget *widget, gpointer data)
332 {
333  GtkComboBox *cbox = GTK_COMBO_BOX (widget);
334  VendorWindow *vw = data;
335 
336  if (!vw) return;
337  if (!cbox) return;
338 
339  vw->taxincluded = GPOINTER_TO_INT (gnc_simple_combo_get_value (cbox));
340 }
341 
342 void
343 gnc_vendor_taxtable_changed_cb (GtkWidget *widget, gpointer data)
344 {
345  GtkComboBox *cbox = GTK_COMBO_BOX (widget);
346  VendorWindow *vw = data;
347 
348  if (!vw) return;
349  if (!cbox) return;
350 
351  vw->taxtable = gnc_simple_combo_get_value (cbox);
352 }
353 
354 static void
355 gnc_vendor_window_close_handler (gpointer user_data)
356 {
357  VendorWindow *vw = user_data;
358 
359  gtk_widget_destroy (vw->dialog);
360 }
361 
362 static void
363 gnc_vendor_window_refresh_handler (GHashTable *changes, gpointer user_data)
364 {
365  VendorWindow *vw = user_data;
366  const EventInfo *info;
367  GncVendor *vendor = vw_get_vendor (vw);
368 
369  /* If there isn't a vendor behind us, close down */
370  if (!vendor)
371  {
372  gnc_close_gui_component (vw->component_id);
373  return;
374  }
375 
376  /* Next, close if this is a destroy event */
377  if (changes)
378  {
379  info = gnc_gui_get_entity_events (changes, &vw->vendor_guid);
380  if (info && (info->event_mask & QOF_EVENT_DESTROY))
381  {
382  gnc_close_gui_component (vw->component_id);
383  return;
384  }
385  }
386 }
387 
388 static gboolean
389 find_handler (gpointer find_data, gpointer user_data)
390 {
391  const GncGUID *vendor_guid = find_data;
392  VendorWindow *vw = user_data;
393 
394  return(vw && guid_equal(&vw->vendor_guid, vendor_guid));
395 }
396 
397 static VendorWindow *
398 gnc_vendor_new_window (QofBook *bookp, GncVendor *vendor)
399 {
400  VendorWindow *vw;
401  GtkBuilder *builder;
402  GtkWidget *edit, *hbox;
403  gnc_commodity *currency;
404 
405  /*
406  * Find an existing window for this vendor. If found, bring it to
407  * the front.
408  */
409  if (vendor)
410  {
411  GncGUID vendor_guid;
412 
413  vendor_guid = *gncVendorGetGUID (vendor);
414  vw = gnc_find_first_gui_component (DIALOG_EDIT_VENDOR_CM_CLASS,
415  find_handler, &vendor_guid);
416  if (vw)
417  {
418  gtk_window_present (GTK_WINDOW(vw->dialog));
419  return(vw);
420  }
421  }
422 
423  /* Find the default currency */
424  if (vendor)
425  currency = gncVendorGetCurrency (vendor);
426  else
427  currency = gnc_default_currency ();
428 
429  /*
430  * No existing vendor window found. Build a new one.
431  */
432  vw = g_new0 (VendorWindow, 1);
433 
434  vw->book = bookp;
435 
436  /* Find the dialog */
437  builder = gtk_builder_new();
438  gnc_builder_add_from_file (builder, "dialog-vendor.glade", "terms_store");
439  gnc_builder_add_from_file (builder, "dialog-vendor.glade", "tax_included_store");
440  gnc_builder_add_from_file (builder, "dialog-vendor.glade", "taxtable_store");
441  gnc_builder_add_from_file (builder, "dialog-vendor.glade", "Vendor Dialog");
442  vw->dialog = GTK_WIDGET (gtk_builder_get_object (builder, "Vendor Dialog"));
443 
444  /* Get entry points */
445  vw->id_entry = GTK_WIDGET (gtk_builder_get_object (builder, "id_entry"));
446  vw->company_entry = GTK_WIDGET (gtk_builder_get_object (builder, "company_entry"));
447 
448  vw->name_entry = GTK_WIDGET (gtk_builder_get_object (builder, "name_entry"));
449  vw->addr1_entry = GTK_WIDGET (gtk_builder_get_object (builder, "addr1_entry"));
450  vw->addr2_entry = GTK_WIDGET (gtk_builder_get_object (builder, "addr2_entry"));
451  vw->addr3_entry = GTK_WIDGET (gtk_builder_get_object (builder, "addr3_entry"));
452  vw->addr4_entry = GTK_WIDGET (gtk_builder_get_object (builder, "addr4_entry"));
453  vw->phone_entry = GTK_WIDGET (gtk_builder_get_object (builder, "phone_entry"));
454  vw->fax_entry = GTK_WIDGET (gtk_builder_get_object (builder, "fax_entry"));
455  vw->email_entry = GTK_WIDGET (gtk_builder_get_object (builder, "email_entry"));
456 
457  vw->active_check = GTK_WIDGET (gtk_builder_get_object (builder, "active_check"));
458  vw->taxincluded_menu = GTK_WIDGET (gtk_builder_get_object (builder, "tax_included_menu"));
459  vw->notes_text = GTK_WIDGET (gtk_builder_get_object (builder, "notes_text"));
460  vw->terms_menu = GTK_WIDGET (gtk_builder_get_object (builder, "terms_menu"));
461 
462  vw->taxtable_check = GTK_WIDGET (gtk_builder_get_object (builder, "taxtable_button"));
463  vw->taxtable_menu = GTK_WIDGET (gtk_builder_get_object (builder, "taxtable_menu"));
464 
465  /* Currency */
466  edit = gnc_currency_edit_new();
467  gnc_currency_edit_set_currency (GNC_CURRENCY_EDIT(edit), currency);
468  vw->currency_edit = edit;
469 
470  hbox = GTK_WIDGET (gtk_builder_get_object (builder, "currency_box"));
471  gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
472 
473  /* Setup signals */
474  gtk_builder_connect_signals_full( builder,
475  gnc_builder_connect_full_func,
476  vw);
477 
478  /* Setup initial values */
479  if (vendor != NULL)
480  {
481  GtkTextBuffer* text_buffer;
482  GncAddress *addr;
483  const char *string;
484 
485  vw->dialog_type = EDIT_VENDOR;
486  vw->vendor_guid = *gncVendorGetGUID (vendor);
487 
488  addr = gncVendorGetAddr (vendor);
489 
490  gtk_entry_set_text (GTK_ENTRY (vw->id_entry), gncVendorGetID (vendor));
491  gtk_entry_set_text (GTK_ENTRY (vw->company_entry), gncVendorGetName (vendor));
492 
493  /* Setup Address */
494  gtk_entry_set_text (GTK_ENTRY (vw->name_entry), gncAddressGetName (addr));
495  gtk_entry_set_text (GTK_ENTRY (vw->addr1_entry), gncAddressGetAddr1 (addr));
496  gtk_entry_set_text (GTK_ENTRY (vw->addr2_entry), gncAddressGetAddr2 (addr));
497  gtk_entry_set_text (GTK_ENTRY (vw->addr3_entry), gncAddressGetAddr3 (addr));
498  gtk_entry_set_text (GTK_ENTRY (vw->addr4_entry), gncAddressGetAddr4 (addr));
499  gtk_entry_set_text (GTK_ENTRY (vw->phone_entry), gncAddressGetPhone (addr));
500  gtk_entry_set_text (GTK_ENTRY (vw->fax_entry), gncAddressGetFax (addr));
501  gtk_entry_set_text (GTK_ENTRY (vw->email_entry), gncAddressGetEmail (addr));
502 
503  /* Set toggle buttons */
504  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vw->active_check),
505  gncVendorGetActive (vendor));
506 
507  string = gncVendorGetNotes (vendor);
508  text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(vw->notes_text));
509  gtk_text_buffer_set_text (text_buffer, string, -1);
510 
511  vw->component_id =
512  gnc_register_gui_component (DIALOG_EDIT_VENDOR_CM_CLASS,
513  gnc_vendor_window_refresh_handler,
514  gnc_vendor_window_close_handler,
515  vw);
516 
517  vw->terms = gncVendorGetTerms (vendor);
518 
519  }
520  else
521  {
522  vendor = gncVendorCreate (bookp);
523  vw->vendor_guid = *gncVendorGetGUID (vendor);
524 
525  vw->dialog_type = NEW_VENDOR;
526  vw->component_id =
527  gnc_register_gui_component (DIALOG_NEW_VENDOR_CM_CLASS,
528  gnc_vendor_window_refresh_handler,
529  gnc_vendor_window_close_handler,
530  vw);
531 
532  /* XXX: Get the default Billing Terms */
533  vw->terms = NULL;
534  }
535 
536  /* I know that vendor exists here -- either passed in or just created */
537 
538  vw->taxincluded = gncVendorGetTaxIncluded (vendor);
539  gnc_taxincluded_combo (GTK_COMBO_BOX(vw->taxincluded_menu), vw->taxincluded);
540  gnc_billterms_combo (GTK_COMBO_BOX(vw->terms_menu), bookp, TRUE, vw->terms);
541 
542  vw->taxtable = gncVendorGetTaxTable (vendor);
543  gnc_taxtables_combo (GTK_COMBO_BOX(vw->taxtable_menu), bookp, TRUE, vw->taxtable);
544  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vw->taxtable_check),
545  gncVendorGetTaxTableOverride (vendor));
546  gnc_vendor_taxtable_check_cb (GTK_TOGGLE_BUTTON (vw->taxtable_check), vw);
547 
548  gnc_gui_component_watch_entity_type (vw->component_id,
549  GNC_VENDOR_MODULE_NAME,
550  QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
551 
552  gtk_widget_show_all (vw->dialog);
553  g_object_unref(G_OBJECT(builder));
554 
555  return vw;
556 }
557 
558 VendorWindow *
559 gnc_ui_vendor_new (QofBook *bookp)
560 {
561  VendorWindow *vw;
562 
563  /* Make sure required options exist */
564  if (!bookp) return NULL;
565 
566  vw = gnc_vendor_new_window (bookp, NULL);
567  return vw;
568 }
569 
570 VendorWindow *
571 gnc_ui_vendor_edit (GncVendor *vendor)
572 {
573  VendorWindow *vw;
574 
575  if (!vendor) return NULL;
576 
577  vw = gnc_vendor_new_window (gncVendorGetBook(vendor), vendor);
578 
579  return vw;
580 }
581 
582 /* Functions for vendor selection widgets */
583 
584 static void
585 invoice_vendor_cb (gpointer *vendor_p, gpointer user_data)
586 {
587  struct _vendor_select_window *sw = user_data;
588  GncOwner owner;
589  GncVendor *vendor;
590 
591  g_return_if_fail (vendor_p && user_data);
592 
593  vendor = *vendor_p;
594 
595  if (!vendor)
596  return;
597 
598  gncOwnerInitVendor (&owner, vendor);
599  gnc_invoice_search (NULL, &owner, sw->book);
600  return;
601 }
602 
603 static void
604 order_vendor_cb (gpointer *vendor_p, gpointer user_data)
605 {
606  struct _vendor_select_window *sw = user_data;
607  GncOwner owner;
608  GncVendor *vendor;
609 
610  g_return_if_fail (vendor_p && user_data);
611 
612  vendor = *vendor_p;
613 
614  if (!vendor)
615  return;
616 
617  gncOwnerInitVendor (&owner, vendor);
618  gnc_order_search (NULL, &owner, sw->book);
619  return;
620 }
621 
622 static void
623 jobs_vendor_cb (gpointer *vendor_p, gpointer user_data)
624 {
625  struct _vendor_select_window *sw = user_data;
626  GncOwner owner;
627  GncVendor *vendor;
628 
629  g_return_if_fail (vendor_p && user_data);
630 
631  vendor = *vendor_p;
632 
633  if (!vendor)
634  return;
635 
636  gncOwnerInitVendor (&owner, vendor);
637  gnc_job_search (NULL, &owner, sw->book);
638  return;
639 }
640 
641 static void
642 payment_vendor_cb (gpointer *vendor_p, gpointer user_data)
643 {
644  struct _vendor_select_window *sw = user_data;
645  GncOwner owner;
646  GncVendor *vendor;
647 
648  g_return_if_fail (vendor_p && user_data);
649 
650  vendor = *vendor_p;
651 
652  if (!vendor)
653  return;
654 
655  gncOwnerInitVendor (&owner, vendor);
656  gnc_ui_payment_new (&owner, sw->book);
657  return;
658 }
659 
660 static void
661 edit_vendor_cb (gpointer *vendor_p, gpointer user_data)
662 {
663  GncVendor *vendor;
664 
665  g_return_if_fail (vendor_p && user_data);
666 
667  vendor = *vendor_p;
668 
669  if (!vendor)
670  return;
671 
672  gnc_ui_vendor_edit (vendor);
673  return;
674 }
675 
676 static gpointer
677 new_vendor_cb (gpointer user_data)
678 {
679  struct _vendor_select_window *sw = user_data;
680  VendorWindow *vw;
681 
682  g_return_val_if_fail (user_data, NULL);
683 
684  vw = gnc_ui_vendor_new (sw->book);
685  return vw_get_vendor (vw);
686 }
687 
688 static void
689 free_vendor_cb (gpointer user_data)
690 {
691  struct _vendor_select_window *sw = user_data;
692  g_return_if_fail (sw);
693 
694  qof_query_destroy (sw->q);
695  g_free (sw);
696 }
697 
699 gnc_vendor_search (GncVendor *start, QofBook *book)
700 {
701  QofIdType type = GNC_VENDOR_MODULE_NAME;
702  struct _vendor_select_window *sw;
703  QofQuery *q, *q2 = NULL;
704  static GList *params = NULL;
705  static GList *columns = NULL;
706  static GNCSearchCallbackButton buttons[] =
707  {
708  { N_("View/Edit Vendor"), edit_vendor_cb, NULL, TRUE},
709  { N_("Vendor's Jobs"), jobs_vendor_cb, NULL, TRUE},
710  // { N_("Vendor Orders"), order_vendor_cb, NULL, TRUE},
711  { N_("Vendor's Bills"), invoice_vendor_cb, NULL, TRUE},
712  { N_("Pay Bill"), payment_vendor_cb, NULL, FALSE},
713  { NULL },
714  };
715  (void)order_vendor_cb;
716 
717  g_return_val_if_fail (book, NULL);
718 
719  /* Build parameter list in reverse order */
720  if (params == NULL)
721  {
722  params = gnc_search_param_prepend (params, _("Billing Contact"), NULL, type,
723  VENDOR_ADDR, ADDRESS_NAME, NULL);
724  params = gnc_search_param_prepend (params, _("Vendor ID"), NULL, type,
725  VENDOR_ID, NULL);
726  params = gnc_search_param_prepend (params, _("Company Name"), NULL, type,
727  VENDOR_NAME, NULL);
728  }
729 
730  /* Build the column list in reverse order */
731  if (columns == NULL)
732  {
733  columns = gnc_search_param_prepend (columns, _("Contact"), NULL, type,
734  VENDOR_ADDR, ADDRESS_NAME, NULL);
735  columns = gnc_search_param_prepend (columns, _("Company"), NULL, type,
736  VENDOR_NAME, NULL);
737  columns = gnc_search_param_prepend (columns, _("ID #"), NULL, type,
738  VENDOR_ID, NULL);
739  }
740 
741  /* Build the queries */
742  q = qof_query_create_for (type);
743  qof_query_set_book (q, book);
744 
745 #if 0
746  if (start)
747  {
748  q2 = qof_query_copy (q);
749  qof_query_add_guid_match (q2, g_slist_prepend (NULL, QOF_PARAM_GUID),
750  gncVendorGetGUID (start), QOF_QUERY_AND);
751  }
752 #endif
753 
754  /* launch select dialog and return the result */
755  sw = g_new0 (struct _vendor_select_window, 1);
756  sw->book = book;
757  sw->q = q;
758 
759  return gnc_search_dialog_create (type, _("Find Vendor"),
760  params, columns, q, q2, buttons, NULL,
761  new_vendor_cb, sw, free_vendor_cb,
762  GNC_PREFS_GROUP_SEARCH, NULL);
763 }
764 
766 gnc_vendor_search_select (gpointer start, gpointer book)
767 {
768  if (!book) return NULL;
769 
770  return gnc_vendor_search (start, book);
771 }
772 
774 gnc_vendor_search_edit (gpointer start, gpointer book)
775 {
776  if (start)
777  gnc_ui_vendor_edit (start);
778 
779  return NULL;
780 }
void gnc_currency_edit_set_currency(GNCCurrencyEdit *gce, const gnc_commodity *currency)
utility functions for the GnuCash UI
GncTaxIncluded
Definition: gncTaxTable.h:100
QofQuery * qof_query_copy(QofQuery *q)
struct _QofQuery QofQuery
Definition: qofquery.h:90
Definition: guid.h:65
gnc_commodity * gnc_default_currency(void)
Definition: gnc-ui-util.c:939
const gchar * QofIdType
Definition: qofid.h:85
Currency selection widget.
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)
gnc_commodity * gnc_currency_edit_get_currency(GNCCurrencyEdit *gce)
void gnc_gnome_help(const char *file_name, const char *anchor)
#define gncVendorGetBook(X)
Definition: gncVendor.h:130
void qof_query_add_guid_match(QofQuery *q, QofQueryParamList *param_list, const GncGUID *guid, QofQueryOp op)
GtkWidget * gnc_currency_edit_new(void)
const GncGUID * guid_null(void)
Vendor Interface.
an Address object
void qof_event_gen(QofInstance *entity, QofEventId event_type, gpointer event_data)
Invoke all registered event handlers using the given arguments.