GnuCash c935c2f+
Loading...
Searching...
No Matches
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
58void gnc_employee_window_ok_cb (GtkWidget *widget, gpointer data);
59void gnc_employee_window_cancel_cb (GtkWidget *widget, gpointer data);
60void gnc_employee_window_help_cb (GtkWidget *widget, gpointer data);
61void gnc_employee_window_destroy_cb (GtkWidget *widget, gpointer data);
62void gnc_employee_name_changed_cb (GtkWidget *widget, gpointer data);
63void gnc_employee_ccard_acct_toggled_cb (GtkToggleButton *button, gpointer data);
64
65typedef 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
112static GncEmployee *
113ew_get_employee (EmployeeWindow *ew)
114{
115 if (!ew)
116 return NULL;
117
118 return gncEmployeeLookup (ew->book, &ew->employee_guid);
119}
120
121static 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
168static 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
181static 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
193void
194gnc_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
243void
244gnc_employee_window_cancel_cb (GtkWidget *widget, gpointer data)
245{
246 EmployeeWindow *ew = data;
247
248 gnc_close_gui_component (ew->component_id);
249}
250
251void
252gnc_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
258void
259gnc_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
279void
280gnc_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
292void
293gnc_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
304static void
305gnc_employee_window_close_handler (gpointer user_data)
306{
307 EmployeeWindow *ew = user_data;
308
309 gtk_widget_destroy (ew->dialog);
310}
311
312static void
313gnc_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
338static gboolean
339find_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
347static EmployeeWindow *
348gnc_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
554EmployeeWindow *
555gnc_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
567EmployeeWindow *
568gnc_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
581static void
582invoice_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
600static void
601payment_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
619static void
620edit_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
635static gpointer
636new_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
647static void
648free_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
658GNCSearchWindow *
659gnc_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
724GNCSearchWindow *
725gnc_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
732GNCSearchWindow *
733gnc_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}
Currency selection widget.
utility functions for the GnuCash UI
an Address object
Employee Interface.
Business Interface: Object OWNERs.
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Retrieve the fraction for the specified commodity.
#define gncEmployeeGetGUID(E)
deprecated routines
const gchar * QofIdType
QofIdType declaration.
Definition qofid.h:80
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
void gnc_currency_edit_set_currency(GNCCurrencyEdit *gce, const gnc_commodity *currency)
Set the widget to display a certain currency name.
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...
gnc_commodity * gnc_currency_edit_get_currency(GNCCurrencyEdit *gce)
Retrieve the displayed currency of the widget.
const GncGUID * guid_null(void)
Returns a GncGUID which is guaranteed to never reference any entity.
Definition guid.cpp:165
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:237
GtkWindow * gnc_ui_get_gtk_window(GtkWidget *widget)
Get a pointer to the widget's immediate top level GtkWindow.
void gnc_gnome_help(GtkWindow *parent, const char *file_name, const char *anchor)
Launch the systems default help browser, gnome's yelp for linux, and open to a given link within a gi...
gnc_commodity * gnc_default_currency(void)
Return the default currency set by the user.
void qof_query_add_guid_match(QofQuery *q, QofQueryParamList *param_list, const GncGUID *guid, QofQueryOp op)
DOCUMENT ME !!
QofQuery * qof_query_copy(QofQuery *q)
Make a copy of the indicated query.
void qof_query_set_book(QofQuery *query, QofBook *book)
Set the book to be searched.
void qof_query_destroy(QofQuery *query)
Frees the resources associate with a Query object.
STRUCTS.
The type used to store guids in C.
Definition guid.h:75
QofBook reference.
Definition qofbook-p.hpp:47
A Query.
Definition qofquery.cpp:75