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