27 #include <glib/gi18n.h>
29 #include "dialog-utils.h"
30 #include "gnc-amount-edit.h"
32 #include "gnc-component-manager.h"
34 #include "gnc-gui-query.h"
37 #include "dialog-search.h"
38 #include "search-param.h"
39 #include "gnc-account-sel.h"
43 #include "gncEmployeeP.h"
46 #include "dialog-employee.h"
47 #include "dialog-invoice.h"
48 #include "dialog-payment.h"
50 #define DIALOG_NEW_EMPLOYEE_CM_CLASS "dialog-new-employee"
51 #define DIALOG_EDIT_EMPLOYEE_CM_CLASS "dialog-edit-employee"
53 #define GNC_PREFS_GROUP_SEARCH "dialogs.business.employee-search"
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);
79 GtkWidget * username_entry;
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;
90 GtkWidget * language_entry;
92 GtkWidget * workday_amount;
93 GtkWidget * rate_amount;
94 GtkWidget * currency_edit;
95 GtkWidget * ccard_acct_check;
96 GtkWidget * ccard_acct_sel;
98 GtkWidget * active_check;
102 EmployeeDialogType dialog_type;
115 return gncEmployeeLookup (ew->book, &ew->employee_guid);
122 addr = gncEmployeeGetAddr (employee);
124 gnc_suspend_gui_refresh ();
126 gncEmployeeBeginEdit (employee);
128 if (ew->dialog_type == NEW_EMPLOYEE)
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));
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));
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));
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)));
164 (GNC_CURRENCY_EDIT (ew->currency_edit)));
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));
173 gncEmployeeCommitEdit (employee);
174 gnc_resume_gui_refresh ();
178 static gboolean check_edit_amount (GtkWidget *dialog, GtkWidget *amount,
180 const char * error_message)
182 if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (amount)))
185 gnc_error_dialog (dialog, error_message);
191 gnc_numeric val = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (amount));
196 gnc_error_dialog (dialog, error_message);
204 static gboolean check_entry_nonempty (GtkWidget *dialog, GtkWidget *entry,
205 const char * error_message)
207 const char *res = gtk_entry_get_text (GTK_ENTRY (entry));
208 if (g_strcmp0 (res,
"") == 0)
211 gnc_error_dialog (dialog,
"%s", error_message);
218 gnc_employee_window_ok_cb (GtkWidget *widget, gpointer data)
224 if (check_entry_nonempty (ew->dialog, ew->username_entry,
225 _(
"You must enter a username.")))
229 if (check_entry_nonempty (ew->dialog, ew->name_entry,
230 _(
"You must enter the employee's name.")))
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))
239 const char *msg = _(
"You must enter an address.");
240 gnc_error_dialog (ew->dialog,
"%s", msg);
245 if (g_strcmp0 (gtk_entry_get_text (GTK_ENTRY (ew->id_entry)),
"") == 0)
247 string = gncEmployeeNextID (ew->book);
248 gtk_entry_set_text (GTK_ENTRY (ew->id_entry),
string);
257 gnc_ui_to_employee (ew, employee);
259 ew->created_employee = employee;
263 gnc_close_gui_component (ew->component_id);
267 gnc_employee_window_cancel_cb (GtkWidget *widget, gpointer data)
271 gnc_close_gui_component (ew->component_id);
275 gnc_employee_window_help_cb (GtkWidget *widget, gpointer data)
281 gnc_employee_window_destroy_cb (GtkWidget *widget, gpointer data)
286 gnc_suspend_gui_refresh ();
288 if (ew->dialog_type == NEW_EMPLOYEE && employee != NULL)
290 gncEmployeeBeginEdit (employee);
291 gncEmployeeDestroy (employee);
295 gnc_unregister_gui_component (ew->component_id);
296 gnc_resume_gui_refresh ();
302 gnc_employee_name_changed_cb (GtkWidget *widget, gpointer data)
305 char *fullname, *title;
306 const char *name, *id;
311 name = gtk_entry_get_text (GTK_ENTRY (ew->name_entry));
312 if (!name || *name ==
'\0')
313 name = _(
"<No name>");
315 id = gtk_entry_get_text (GTK_ENTRY (ew->id_entry));
317 fullname = g_strconcat (name,
" (",
id,
")", (
char *)NULL);
319 if (ew->dialog_type == EDIT_EMPLOYEE)
320 title = g_strconcat (_(
"Edit Employee"),
" - ", fullname, (
char *)NULL);
322 title = g_strconcat (_(
"New Employee"),
" - ", fullname, (
char *)NULL);
324 gtk_window_set_title (GTK_WINDOW (ew->dialog), title);
331 gnc_employee_ccard_acct_toggled_cb (GtkToggleButton *button, gpointer data)
338 if (gtk_toggle_button_get_active (button))
340 gtk_widget_set_sensitive (ew->ccard_acct_sel, TRUE);
341 gtk_widget_show (ew->ccard_acct_sel);
345 gtk_widget_set_sensitive (ew->ccard_acct_sel, TRUE);
346 gtk_widget_hide (ew->ccard_acct_sel);
351 gnc_employee_window_close_handler (gpointer user_data)
355 gtk_widget_destroy (ew->dialog);
359 gnc_employee_window_refresh_handler (GHashTable *changes, gpointer user_data)
368 gnc_close_gui_component (ew->component_id);
375 info = gnc_gui_get_entity_events (changes, &ew->employee_guid);
376 if (info && (info->event_mask & QOF_EVENT_DESTROY))
378 gnc_close_gui_component (ew->component_id);
385 find_handler (gpointer
find_data, gpointer user_data)
387 const GncGUID *employee_guid = find_data;
390 return(ew &&
guid_equal(&ew->employee_guid, employee_guid));
394 gnc_employee_new_window (
QofBook *bookp,
399 GtkWidget *hbox, *edit;
414 ew = gnc_find_first_gui_component (DIALOG_EDIT_EMPLOYEE_CM_CLASS,
415 find_handler, &employee_guid);
418 gtk_window_present (GTK_WINDOW(ew->dialog));
425 currency = gncEmployeeGetCurrency (employee);
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"));
441 g_object_set_data (G_OBJECT (ew->dialog),
"dialog_info", ew);
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"));
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"));
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"));
462 ew->currency_edit = edit;
464 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"currency_box"));
465 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
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);
477 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"hours_hbox"));
478 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
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),
487 ew->rate_amount = edit;
488 gtk_widget_show (edit);
490 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"rate_hbox"));
491 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
494 ew->ccard_acct_check = GTK_WIDGET(gtk_builder_get_object (builder,
"ccard_check"));
496 edit = gnc_account_sel_new();
498 gnc_account_sel_set_acct_filters (GNC_ACCOUNT_SEL(edit), acct_types, NULL);
499 g_list_free (acct_types);
501 ew->ccard_acct_sel = edit;
502 gtk_widget_show (edit);
504 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"ccard_acct_hbox"));
505 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
508 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ew);
511 if (employee != NULL)
515 ew->dialog_type = EDIT_EMPLOYEE;
518 addr = gncEmployeeGetAddr (employee);
520 gtk_entry_set_text (GTK_ENTRY (ew->id_entry), gncEmployeeGetID (employee));
521 gtk_entry_set_text (GTK_ENTRY (ew->username_entry), gncEmployeeGetUsername (employee));
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));
533 gtk_entry_set_text (GTK_ENTRY (ew->language_entry),
534 gncEmployeeGetLanguage (employee));
537 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ew->active_check),
538 gncEmployeeGetActive (employee));
541 gnc_register_gui_component (DIALOG_EDIT_EMPLOYEE_CM_CLASS,
542 gnc_employee_window_refresh_handler,
543 gnc_employee_window_close_handler,
548 employee = gncEmployeeCreate (bookp);
551 ew->dialog_type = NEW_EMPLOYEE;
553 gnc_register_gui_component (DIALOG_NEW_EMPLOYEE_CM_CLASS,
554 gnc_employee_window_refresh_handler,
555 gnc_employee_window_close_handler,
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));
568 ccard_acct = gncEmployeeGetCCard (employee);
569 if (ccard_acct == NULL)
571 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ew->ccard_acct_check), FALSE);
572 gtk_widget_set_sensitive (ew->ccard_acct_sel, FALSE);
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);
582 gnc_gui_component_watch_entity_type (ew->component_id,
583 GNC_EMPLOYEE_MODULE_NAME,
584 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
586 gtk_widget_show_all (ew->dialog);
588 if (ccard_acct == NULL)
589 gtk_widget_hide (ew->ccard_acct_sel);
591 g_object_unref(G_OBJECT(builder));
597 gnc_ui_employee_new (
QofBook *bookp)
602 if (!bookp)
return NULL;
604 ew = gnc_employee_new_window (bookp, NULL);
614 if (!employee)
return NULL;
616 ew = gnc_employee_new_window (gncEmployeeGetBook(employee), employee);
624 invoice_employee_cb (gpointer *employee_p, gpointer user_data)
630 g_return_if_fail (employee_p && user_data);
632 employee = *employee_p;
637 gncOwnerInitEmployee (&owner, employee);
638 gnc_invoice_search (NULL, &owner, sw->book);
643 payment_employee_cb (gpointer *employee_p, gpointer user_data)
649 g_return_if_fail (employee_p && user_data);
651 employee = *employee_p;
656 gncOwnerInitEmployee (&owner, employee);
657 gnc_ui_payment_new (&owner, sw->book);
662 edit_employee_cb (gpointer *employee_p, gpointer user_data)
666 g_return_if_fail (employee_p && user_data);
668 employee = *employee_p;
673 gnc_ui_employee_edit (employee);
678 new_employee_cb (gpointer user_data)
683 g_return_val_if_fail (user_data, NULL);
685 ew = gnc_ui_employee_new (sw->book);
686 return ew_get_employee (ew);
690 free_employee_cb (gpointer user_data)
694 g_return_if_fail (sw);
703 QofIdType type = GNC_EMPLOYEE_MODULE_NAME;
706 static GList *params = NULL;
707 static GList *columns = NULL;
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},
716 g_return_val_if_fail (book, NULL);
721 params = gnc_search_param_prepend (params, _(
"Employee ID"), NULL, type,
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);
732 columns = gnc_search_param_prepend (columns, _(
"Username"), NULL, type,
733 EMPLOYEE_USERNAME, NULL);
734 columns = gnc_search_param_prepend (columns, _(
"ID #"), NULL, type,
736 columns = gnc_search_param_prepend (columns, _(
"Name"), NULL, type,
737 EMPLOYEE_ADDR, ADDRESS_NAME, NULL);
741 q = qof_query_create_for (type);
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);
766 gnc_employee_search_select (gpointer start, gpointer book)
768 if (!book)
return NULL;
770 return gnc_employee_search (start, book);
774 gnc_employee_search_edit (gpointer start, gpointer book)
777 gnc_ui_employee_edit (start);
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
gnc_commodity * gnc_default_currency(void)
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)
const GncGUID * guid_null(void)
void qof_event_gen(QofInstance *entity, QofEventId event_type, gpointer event_data)
Invoke all registered event handlers using the given arguments.
#define gncEmployeeGetGUID(E)