GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
dialog-employee.c
1 /*
2  * dialog-employee.c -- Dialog for Employee 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-amount-edit.h"
31 #include "gnc-currency-edit.h"
32 #include "gnc-component-manager.h"
33 #include "gnc-ui.h"
34 #include "gnc-gui-query.h"
35 #include "gnc-ui-util.h"
36 #include "qof.h"
37 #include "dialog-search.h"
38 #include "search-param.h"
39 #include "gnc-account-sel.h"
40 
41 #include "gncAddress.h"
42 #include "gncEmployee.h"
43 #include "gncEmployeeP.h"
44 #include "gncOwner.h"
45 
46 #include "dialog-employee.h"
47 #include "dialog-invoice.h"
48 #include "dialog-payment.h"
49 
50 #define DIALOG_NEW_EMPLOYEE_CM_CLASS "dialog-new-employee"
51 #define DIALOG_EDIT_EMPLOYEE_CM_CLASS "dialog-edit-employee"
52 
53 #define GNC_PREFS_GROUP_SEARCH "dialogs.business.employee-search"
54 
55 void gnc_employee_window_ok_cb (GtkWidget *widget, gpointer data);
56 void gnc_employee_window_cancel_cb (GtkWidget *widget, gpointer data);
57 void gnc_employee_window_help_cb (GtkWidget *widget, gpointer data);
58 void gnc_employee_window_destroy_cb (GtkWidget *widget, gpointer data);
59 void gnc_employee_name_changed_cb (GtkWidget *widget, gpointer data);
60 void gnc_employee_ccard_acct_toggled_cb (GtkToggleButton *button, gpointer data);
61 
62 typedef enum
63 {
64  NEW_EMPLOYEE,
65  EDIT_EMPLOYEE
66 } EmployeeDialogType;
67 
69 {
70  QofBook * book;
71  QofQuery * q;
72 };
73 
75 {
76  GtkWidget * dialog;
77 
78  GtkWidget * id_entry;
79  GtkWidget * username_entry;
80 
81  GtkWidget * name_entry;
82  GtkWidget * addr1_entry;
83  GtkWidget * addr2_entry;
84  GtkWidget * addr3_entry;
85  GtkWidget * addr4_entry;
86  GtkWidget * phone_entry;
87  GtkWidget * fax_entry;
88  GtkWidget * email_entry;
89 
90  GtkWidget * language_entry;
91 
92  GtkWidget * workday_amount;
93  GtkWidget * rate_amount;
94  GtkWidget * currency_edit;
95  GtkWidget * ccard_acct_check;
96  GtkWidget * ccard_acct_sel;
97 
98  GtkWidget * active_check;
99 
100  /* ACL? */
101 
102  EmployeeDialogType dialog_type;
103  GncGUID employee_guid;
104  gint component_id;
105  QofBook * book;
106  GncEmployee * created_employee;
107 };
108 
109 static GncEmployee *
110 ew_get_employee (EmployeeWindow *ew)
111 {
112  if (!ew)
113  return NULL;
114 
115  return gncEmployeeLookup (ew->book, &ew->employee_guid);
116 }
117 
118 static void gnc_ui_to_employee (EmployeeWindow *ew, GncEmployee *employee)
119 {
120  GncAddress *addr;
121 
122  addr = gncEmployeeGetAddr (employee);
123 
124  gnc_suspend_gui_refresh ();
125 
126  gncEmployeeBeginEdit (employee);
127 
128  if (ew->dialog_type == NEW_EMPLOYEE)
129  qof_event_gen(QOF_INSTANCE(employee), QOF_EVENT_ADD, NULL);
130 
131  gncEmployeeSetID (employee, gtk_editable_get_chars
132  (GTK_EDITABLE (ew->id_entry), 0, -1));
133  gncEmployeeSetUsername (employee, gtk_editable_get_chars
134  (GTK_EDITABLE (ew->username_entry), 0, -1));
135 
136  gncAddressSetName (addr, gtk_editable_get_chars
137  (GTK_EDITABLE (ew->name_entry), 0, -1));
138  gncAddressSetAddr1 (addr, gtk_editable_get_chars
139  (GTK_EDITABLE (ew->addr1_entry), 0, -1));
140  gncAddressSetAddr2 (addr, gtk_editable_get_chars
141  (GTK_EDITABLE (ew->addr2_entry), 0, -1));
142  gncAddressSetAddr3 (addr, gtk_editable_get_chars
143  (GTK_EDITABLE (ew->addr3_entry), 0, -1));
144  gncAddressSetAddr4 (addr, gtk_editable_get_chars
145  (GTK_EDITABLE (ew->addr4_entry), 0, -1));
146  gncAddressSetPhone (addr, gtk_editable_get_chars
147  (GTK_EDITABLE (ew->phone_entry), 0, -1));
148  gncAddressSetFax (addr, gtk_editable_get_chars
149  (GTK_EDITABLE (ew->fax_entry), 0, -1));
150  gncAddressSetEmail (addr, gtk_editable_get_chars
151  (GTK_EDITABLE (ew->email_entry), 0, -1));
152 
153  gncEmployeeSetActive (employee, gtk_toggle_button_get_active
154  (GTK_TOGGLE_BUTTON (ew->active_check)));
155  gncEmployeeSetLanguage (employee, gtk_editable_get_chars
156  (GTK_EDITABLE (ew->language_entry), 0, -1));
157 
158  /* Parse and set the workday and rate amounts */
159  gncEmployeeSetWorkday (employee, gnc_amount_edit_get_amount
160  (GNC_AMOUNT_EDIT (ew->workday_amount)));
161  gncEmployeeSetRate (employee, gnc_amount_edit_get_amount
162  (GNC_AMOUNT_EDIT (ew->rate_amount)));
163  gncEmployeeSetCurrency (employee, gnc_currency_edit_get_currency
164  (GNC_CURRENCY_EDIT (ew->currency_edit)));
165 
166  /* Fill in the CCard Acct */
167  gncEmployeeSetCCard (employee,
168  (gtk_toggle_button_get_active
169  (GTK_TOGGLE_BUTTON (ew->ccard_acct_check)) ?
170  gnc_account_sel_get_account
171  (GNC_ACCOUNT_SEL (ew->ccard_acct_sel)) : NULL));
172 
173  gncEmployeeCommitEdit (employee);
174  gnc_resume_gui_refresh ();
175 }
176 
177 #if 0
178 static gboolean check_edit_amount (GtkWidget *dialog, GtkWidget *amount,
179  gnc_numeric *min, gnc_numeric *max,
180  const char * error_message)
181 {
182  if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (amount)))
183  {
184  if (error_message)
185  gnc_error_dialog (dialog, error_message);
186  return TRUE;
187  }
188  /* We've got a valid-looking number; check mix/max */
189  if (min || max)
190  {
191  gnc_numeric val = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (amount));
192  if ((min && gnc_numeric_compare (*min, val) > 0) ||
193  (max && gnc_numeric_compare (val, *max) > 0))
194  {
195  if (error_message)
196  gnc_error_dialog (dialog, error_message);
197  return TRUE;
198  }
199  }
200  return FALSE;
201 }
202 #endif
203 
204 static gboolean check_entry_nonempty (GtkWidget *dialog, GtkWidget *entry,
205  const char * error_message)
206 {
207  const char *res = gtk_entry_get_text (GTK_ENTRY (entry));
208  if (g_strcmp0 (res, "") == 0)
209  {
210  if (error_message)
211  gnc_error_dialog (dialog, "%s", error_message);
212  return TRUE;
213  }
214  return FALSE;
215 }
216 
217 void
218 gnc_employee_window_ok_cb (GtkWidget *widget, gpointer data)
219 {
220  EmployeeWindow *ew = data;
221  gchar *string;
222 
223  /* Check for valid username */
224  if (check_entry_nonempty (ew->dialog, ew->username_entry,
225  _("You must enter a username.")))
226  return;
227 
228  /* Check for valid username */
229  if (check_entry_nonempty (ew->dialog, ew->name_entry,
230  _("You must enter the employee's name.")))
231  return;
232 
233  /* Make sure we have an address */
234  if (check_entry_nonempty (ew->dialog, ew->addr1_entry, NULL) &&
235  check_entry_nonempty (ew->dialog, ew->addr2_entry, NULL) &&
236  check_entry_nonempty (ew->dialog, ew->addr3_entry, NULL) &&
237  check_entry_nonempty (ew->dialog, ew->addr4_entry, NULL))
238  {
239  const char *msg = _("You must enter an address.");
240  gnc_error_dialog (ew->dialog, "%s", msg);
241  return;
242  }
243 
244  /* Set the employee id if one has not been chosen */
245  if (g_strcmp0 (gtk_entry_get_text (GTK_ENTRY (ew->id_entry)), "") == 0)
246  {
247  string = gncEmployeeNextID (ew->book);
248  gtk_entry_set_text (GTK_ENTRY (ew->id_entry), string);
249  g_free(string);
250  }
251 
252  /* Now save it off */
253  {
254  GncEmployee *employee = ew_get_employee (ew);
255  if (employee)
256  {
257  gnc_ui_to_employee (ew, employee);
258  }
259  ew->created_employee = employee;
260  ew->employee_guid = *guid_null ();
261  }
262 
263  gnc_close_gui_component (ew->component_id);
264 }
265 
266 void
267 gnc_employee_window_cancel_cb (GtkWidget *widget, gpointer data)
268 {
269  EmployeeWindow *ew = data;
270 
271  gnc_close_gui_component (ew->component_id);
272 }
273 
274 void
275 gnc_employee_window_help_cb (GtkWidget *widget, gpointer data)
276 {
277  gnc_gnome_help(HF_HELP, HL_USAGE_EMPLOYEE);
278 }
279 
280 void
281 gnc_employee_window_destroy_cb (GtkWidget *widget, gpointer data)
282 {
283  EmployeeWindow *ew = data;
284  GncEmployee *employee = ew_get_employee (ew);
285 
286  gnc_suspend_gui_refresh ();
287 
288  if (ew->dialog_type == NEW_EMPLOYEE && employee != NULL)
289  {
290  gncEmployeeBeginEdit (employee);
291  gncEmployeeDestroy (employee);
292  ew->employee_guid = *guid_null ();
293  }
294 
295  gnc_unregister_gui_component (ew->component_id);
296  gnc_resume_gui_refresh ();
297 
298  g_free (ew);
299 }
300 
301 void
302 gnc_employee_name_changed_cb (GtkWidget *widget, gpointer data)
303 {
304  EmployeeWindow *ew = data;
305  char *fullname, *title;
306  const char *name, *id;
307 
308  if (!ew)
309  return;
310 
311  name = gtk_entry_get_text (GTK_ENTRY (ew->name_entry));
312  if (!name || *name == '\0')
313  name = _("<No name>");
314 
315  id = gtk_entry_get_text (GTK_ENTRY (ew->id_entry));
316 
317  fullname = g_strconcat (name, " (", id, ")", (char *)NULL);
318 
319  if (ew->dialog_type == EDIT_EMPLOYEE)
320  title = g_strconcat (_("Edit Employee"), " - ", fullname, (char *)NULL);
321  else
322  title = g_strconcat (_("New Employee"), " - ", fullname, (char *)NULL);
323 
324  gtk_window_set_title (GTK_WINDOW (ew->dialog), title);
325 
326  g_free (fullname);
327  g_free (title);
328 }
329 
330 void
331 gnc_employee_ccard_acct_toggled_cb (GtkToggleButton *button, gpointer data)
332 {
333  EmployeeWindow *ew = data;
334 
335  if (!ew)
336  return;
337 
338  if (gtk_toggle_button_get_active (button))
339  {
340  gtk_widget_set_sensitive (ew->ccard_acct_sel, TRUE);
341  gtk_widget_show (ew->ccard_acct_sel);
342  }
343  else
344  {
345  gtk_widget_set_sensitive (ew->ccard_acct_sel, TRUE);
346  gtk_widget_hide (ew->ccard_acct_sel);
347  }
348 }
349 
350 static void
351 gnc_employee_window_close_handler (gpointer user_data)
352 {
353  EmployeeWindow *ew = user_data;
354 
355  gtk_widget_destroy (ew->dialog);
356 }
357 
358 static void
359 gnc_employee_window_refresh_handler (GHashTable *changes, gpointer user_data)
360 {
361  EmployeeWindow *ew = user_data;
362  const EventInfo *info;
363  GncEmployee *employee = ew_get_employee (ew);
364 
365  /* If there isn't a employee behind us, close down */
366  if (!employee)
367  {
368  gnc_close_gui_component (ew->component_id);
369  return;
370  }
371 
372  /* Next, close if this is a destroy event */
373  if (changes)
374  {
375  info = gnc_gui_get_entity_events (changes, &ew->employee_guid);
376  if (info && (info->event_mask & QOF_EVENT_DESTROY))
377  {
378  gnc_close_gui_component (ew->component_id);
379  return;
380  }
381  }
382 }
383 
384 static gboolean
385 find_handler (gpointer find_data, gpointer user_data)
386 {
387  const GncGUID *employee_guid = find_data;
388  EmployeeWindow *ew = user_data;
389 
390  return(ew && guid_equal(&ew->employee_guid, employee_guid));
391 }
392 
393 static EmployeeWindow *
394 gnc_employee_new_window (QofBook *bookp,
395  GncEmployee *employee)
396 {
397  EmployeeWindow *ew;
398  GtkBuilder *builder;
399  GtkWidget *hbox, *edit;
400  gnc_commodity *currency;
401  GNCPrintAmountInfo print_info;
402  GList *acct_types;
403  Account *ccard_acct;
404 
405  /*
406  * Find an existing window for this employee. If found, bring it to
407  * the front.
408  */
409  if (employee)
410  {
411  GncGUID employee_guid;
412 
413  employee_guid = *gncEmployeeGetGUID (employee);
414  ew = gnc_find_first_gui_component (DIALOG_EDIT_EMPLOYEE_CM_CLASS,
415  find_handler, &employee_guid);
416  if (ew)
417  {
418  gtk_window_present (GTK_WINDOW(ew->dialog));
419  return(ew);
420  }
421  }
422 
423  /* Find the default currency */
424  if (employee)
425  currency = gncEmployeeGetCurrency (employee);
426  else
427  currency = gnc_default_currency ();
428 
429  /*
430  * No existing employee window found. Build a new one.
431  */
432  ew = g_new0 (EmployeeWindow, 1);
433 
434  ew->book = bookp;
435 
436  /* Find the dialog */
437  builder = gtk_builder_new();
438  gnc_builder_add_from_file (builder, "dialog-employee.glade", "Employee Dialog");
439  ew->dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Employee Dialog"));
440 
441  g_object_set_data (G_OBJECT (ew->dialog), "dialog_info", ew);
442 
443  /* Get entry points */
444  ew->id_entry = GTK_WIDGET(gtk_builder_get_object (builder, "id_entry"));
445  ew->username_entry = GTK_WIDGET(gtk_builder_get_object (builder, "username_entry"));
446 
447  ew->name_entry = GTK_WIDGET(gtk_builder_get_object (builder, "name_entry"));
448  ew->addr1_entry = GTK_WIDGET(gtk_builder_get_object (builder, "addr1_entry"));
449  ew->addr2_entry = GTK_WIDGET(gtk_builder_get_object (builder, "addr2_entry"));
450  ew->addr3_entry = GTK_WIDGET(gtk_builder_get_object (builder, "addr3_entry"));
451  ew->addr4_entry = GTK_WIDGET(gtk_builder_get_object (builder, "addr4_entry"));
452  ew->phone_entry = GTK_WIDGET(gtk_builder_get_object (builder, "phone_entry"));
453  ew->fax_entry = GTK_WIDGET(gtk_builder_get_object (builder, "fax_entry"));
454  ew->email_entry = GTK_WIDGET(gtk_builder_get_object (builder, "email_entry"));
455 
456  ew->language_entry = GTK_WIDGET(gtk_builder_get_object (builder, "language_entry"));
457  ew->active_check = GTK_WIDGET(gtk_builder_get_object (builder, "active_check"));
458 
459  /* Currency */
460  edit = gnc_currency_edit_new();
461  gnc_currency_edit_set_currency (GNC_CURRENCY_EDIT(edit), currency);
462  ew->currency_edit = edit;
463 
464  hbox = GTK_WIDGET(gtk_builder_get_object (builder, "currency_box"));
465  gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
466 
467  /* WORKDAY: Value */
468  edit = gnc_amount_edit_new();
469  gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE);
470  print_info = gnc_integral_print_info ();
471  print_info.max_decimal_places = 5;
472  gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info);
473  gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit), 100000);
474  ew->workday_amount = edit;
475  gtk_widget_show (edit);
476 
477  hbox = GTK_WIDGET(gtk_builder_get_object (builder, "hours_hbox"));
478  gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
479 
480  /* RATE: Monetary Value */
481  edit = gnc_amount_edit_new();
482  print_info = gnc_commodity_print_info (currency, FALSE);
483  gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE);
484  gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info);
485  gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit),
486  gnc_commodity_get_fraction (currency));
487  ew->rate_amount = edit;
488  gtk_widget_show (edit);
489 
490  hbox = GTK_WIDGET(gtk_builder_get_object (builder, "rate_hbox"));
491  gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
492 
493  /* CCard Account Selection */
494  ew->ccard_acct_check = GTK_WIDGET(gtk_builder_get_object (builder, "ccard_check"));
495 
496  edit = gnc_account_sel_new();
497  acct_types = g_list_prepend(NULL, (gpointer)ACCT_TYPE_CREDIT);
498  gnc_account_sel_set_acct_filters (GNC_ACCOUNT_SEL(edit), acct_types, NULL);
499  g_list_free (acct_types);
500 
501  ew->ccard_acct_sel = edit;
502  gtk_widget_show (edit);
503 
504  hbox = GTK_WIDGET(gtk_builder_get_object (builder, "ccard_acct_hbox"));
505  gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
506 
507  /* Setup signals */
508  gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ew);
509 
510  /* Setup initial values */
511  if (employee != NULL)
512  {
513  GncAddress *addr;
514 
515  ew->dialog_type = EDIT_EMPLOYEE;
516  ew->employee_guid = *gncEmployeeGetGUID (employee);
517 
518  addr = gncEmployeeGetAddr (employee);
519 
520  gtk_entry_set_text (GTK_ENTRY (ew->id_entry), gncEmployeeGetID (employee));
521  gtk_entry_set_text (GTK_ENTRY (ew->username_entry), gncEmployeeGetUsername (employee));
522 
523  /* Setup Address */
524  gtk_entry_set_text (GTK_ENTRY (ew->name_entry), gncAddressGetName (addr));
525  gtk_entry_set_text (GTK_ENTRY (ew->addr1_entry), gncAddressGetAddr1 (addr));
526  gtk_entry_set_text (GTK_ENTRY (ew->addr2_entry), gncAddressGetAddr2 (addr));
527  gtk_entry_set_text (GTK_ENTRY (ew->addr3_entry), gncAddressGetAddr3 (addr));
528  gtk_entry_set_text (GTK_ENTRY (ew->addr4_entry), gncAddressGetAddr4 (addr));
529  gtk_entry_set_text (GTK_ENTRY (ew->phone_entry), gncAddressGetPhone (addr));
530  gtk_entry_set_text (GTK_ENTRY (ew->fax_entry), gncAddressGetFax (addr));
531  gtk_entry_set_text (GTK_ENTRY (ew->email_entry), gncAddressGetEmail (addr));
532 
533  gtk_entry_set_text (GTK_ENTRY (ew->language_entry),
534  gncEmployeeGetLanguage (employee));
535 
536  /* Set toggle buttons */
537  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ew->active_check),
538  gncEmployeeGetActive (employee));
539 
540  ew->component_id =
541  gnc_register_gui_component (DIALOG_EDIT_EMPLOYEE_CM_CLASS,
542  gnc_employee_window_refresh_handler,
543  gnc_employee_window_close_handler,
544  ew);
545  }
546  else
547  {
548  employee = gncEmployeeCreate (bookp);
549  ew->employee_guid = *gncEmployeeGetGUID (employee);
550 
551  ew->dialog_type = NEW_EMPLOYEE;
552  ew->component_id =
553  gnc_register_gui_component (DIALOG_NEW_EMPLOYEE_CM_CLASS,
554  gnc_employee_window_refresh_handler,
555  gnc_employee_window_close_handler,
556  ew);
557  }
558 
559 
560  /* I know that employee exists here -- either passed in or just created */
561  /* Set the workday and rate values */
562  gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (ew->workday_amount),
563  gncEmployeeGetWorkday (employee));
564  gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (ew->rate_amount),
565  gncEmployeeGetRate (employee));
566 
567 
568  ccard_acct = gncEmployeeGetCCard (employee);
569  if (ccard_acct == NULL)
570  {
571  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ew->ccard_acct_check), FALSE);
572  gtk_widget_set_sensitive (ew->ccard_acct_sel, FALSE);
573  }
574  else
575  {
576  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ew->ccard_acct_check), TRUE);
577  gnc_account_sel_set_account (GNC_ACCOUNT_SEL (ew->ccard_acct_sel), ccard_acct, FALSE);
578  }
579 
580  /* XXX: Set the ACL */
581 
582  gnc_gui_component_watch_entity_type (ew->component_id,
583  GNC_EMPLOYEE_MODULE_NAME,
584  QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
585 
586  gtk_widget_show_all (ew->dialog);
587 
588  if (ccard_acct == NULL)
589  gtk_widget_hide (ew->ccard_acct_sel);
590 
591  g_object_unref(G_OBJECT(builder));
592 
593  return ew;
594 }
595 
597 gnc_ui_employee_new (QofBook *bookp)
598 {
599  EmployeeWindow *ew;
600 
601  /* Make sure required options exist */
602  if (!bookp) return NULL;
603 
604  ew = gnc_employee_new_window (bookp, NULL);
605 
606  return ew;
607 }
608 
610 gnc_ui_employee_edit (GncEmployee *employee)
611 {
612  EmployeeWindow *ew;
613 
614  if (!employee) return NULL;
615 
616  ew = gnc_employee_new_window (gncEmployeeGetBook(employee), employee);
617 
618  return ew;
619 }
620 
621 /* Functions for employee selection widgets */
622 
623 static void
624 invoice_employee_cb (gpointer *employee_p, gpointer user_data)
625 {
626  struct _employee_select_window *sw = user_data;
627  GncOwner owner;
628  GncEmployee *employee;
629 
630  g_return_if_fail (employee_p && user_data);
631 
632  employee = *employee_p;
633 
634  if (!employee)
635  return;
636 
637  gncOwnerInitEmployee (&owner, employee);
638  gnc_invoice_search (NULL, &owner, sw->book);
639  return;
640 }
641 
642 static void
643 payment_employee_cb (gpointer *employee_p, gpointer user_data)
644 {
645  struct _employee_select_window *sw = user_data;
646  GncOwner owner;
647  GncEmployee *employee;
648 
649  g_return_if_fail (employee_p && user_data);
650 
651  employee = *employee_p;
652 
653  if (!employee)
654  return;
655 
656  gncOwnerInitEmployee (&owner, employee);
657  gnc_ui_payment_new (&owner, sw->book);
658  return;
659 }
660 
661 static void
662 edit_employee_cb (gpointer *employee_p, gpointer user_data)
663 {
664  GncEmployee *employee;
665 
666  g_return_if_fail (employee_p && user_data);
667 
668  employee = *employee_p;
669 
670  if (!employee)
671  return;
672 
673  gnc_ui_employee_edit (employee);
674  return;
675 }
676 
677 static gpointer
678 new_employee_cb (gpointer user_data)
679 {
680  struct _employee_select_window *sw = user_data;
681  EmployeeWindow *ew;
682 
683  g_return_val_if_fail (user_data, NULL);
684 
685  ew = gnc_ui_employee_new (sw->book);
686  return ew_get_employee (ew);
687 }
688 
689 static void
690 free_employee_cb (gpointer user_data)
691 {
692  struct _employee_select_window *sw = user_data;
693 
694  g_return_if_fail (sw);
695 
696  qof_query_destroy (sw->q);
697  g_free (sw);
698 }
699 
701 gnc_employee_search (GncEmployee *start, QofBook *book)
702 {
703  QofIdType type = GNC_EMPLOYEE_MODULE_NAME;
704  struct _employee_select_window *sw;
705  QofQuery *q, *q2 = NULL;
706  static GList *params = NULL;
707  static GList *columns = NULL;
708  static GNCSearchCallbackButton buttons[] =
709  {
710  { N_("View/Edit Employee"), edit_employee_cb, NULL, TRUE},
711  { N_("Expense Vouchers"), invoice_employee_cb, NULL, TRUE},
712  { N_("Process Payment"), payment_employee_cb, NULL, FALSE},
713  { NULL },
714  };
715 
716  g_return_val_if_fail (book, NULL);
717 
718  /* Build parameter list in reverse order */
719  if (params == NULL)
720  {
721  params = gnc_search_param_prepend (params, _("Employee ID"), NULL, type,
722  EMPLOYEE_ID, NULL);
723  params = gnc_search_param_prepend (params, _("Employee Username"), NULL,
724  type, EMPLOYEE_USERNAME, NULL);
725  params = gnc_search_param_prepend (params, _("Employee Name"), NULL,
726  type, EMPLOYEE_ADDR, ADDRESS_NAME, NULL);
727  }
728 
729  /* Build the column list in reverse order */
730  if (columns == NULL)
731  {
732  columns = gnc_search_param_prepend (columns, _("Username"), NULL, type,
733  EMPLOYEE_USERNAME, NULL);
734  columns = gnc_search_param_prepend (columns, _("ID #"), NULL, type,
735  EMPLOYEE_ID, NULL);
736  columns = gnc_search_param_prepend (columns, _("Name"), NULL, type,
737  EMPLOYEE_ADDR, ADDRESS_NAME, NULL);
738  }
739 
740  /* Build the queries */
741  q = qof_query_create_for (type);
742  qof_query_set_book (q, book);
743 
744 #if 0
745  if (start)
746  {
747  q2 = qof_query_copy (q);
748  qof_query_add_guid_match (q2, g_slist_prepend (NULL, QOF_PARAM_GUID),
749  gncEmployeeGetGUID (start), QOF_QUERY_AND);
750  }
751 #endif
752 
753  /* launch select dialog and return the result */
754  sw = g_new0 (struct _employee_select_window, 1);
755  sw->book = book;
756  sw->q = q;
757 
758  return gnc_search_dialog_create (type, _("Find Employee"),
759  params, columns, q, q2,
760  buttons, NULL, new_employee_cb,
761  sw, free_employee_cb,
762  GNC_PREFS_GROUP_SEARCH, NULL);
763 }
764 
766 gnc_employee_search_select (gpointer start, gpointer book)
767 {
768  if (!book) return NULL;
769 
770  return gnc_employee_search (start, book);
771 }
772 
774 gnc_employee_search_edit (gpointer start, gpointer book)
775 {
776  if (start)
777  gnc_ui_employee_edit (start);
778 
779  return NULL;
780 }
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Business Interface: Object OWNERs.
void gnc_currency_edit_set_currency(GNCCurrencyEdit *gce, const gnc_commodity *currency)
utility functions for the GnuCash UI
QofQuery * qof_query_copy(QofQuery *q)
gint gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
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)
void qof_query_add_guid_match(QofQuery *q, QofQueryParamList *param_list, const GncGUID *guid, QofQueryOp op)
GtkWidget * gnc_currency_edit_new(void)
Employee Interface.
const GncGUID * guid_null(void)
an Address object
void qof_event_gen(QofInstance *entity, QofEventId event_type, gpointer event_data)
Invoke all registered event handlers using the given arguments.
#define gncEmployeeGetGUID(E)
Definition: gncEmployee.h:131