27 #include <glib/gi18n.h> 31 #include "dialog-utils.h" 32 #include "gnc-amount-edit.h" 34 #include "gnc-component-manager.h" 36 #include "gnc-gui-query.h" 39 #include "dialog-search.h" 40 #include "search-param.h" 41 #include "gnc-account-sel.h" 45 #include "gncEmployeeP.h" 48 #include "dialog-employee.h" 49 #include "dialog-invoice.h" 50 #include "dialog-payment.h" 51 #include "business-gnome-utils.h" 53 #define DIALOG_NEW_EMPLOYEE_CM_CLASS "dialog-new-employee" 54 #define DIALOG_EDIT_EMPLOYEE_CM_CLASS "dialog-edit-employee" 56 #define GNC_PREFS_GROUP_SEARCH "dialogs.business.employee-search" 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);
82 GtkWidget * username_entry;
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;
93 GtkWidget * language_entry;
95 GtkWidget * workday_amount;
96 GtkWidget * rate_amount;
97 GtkWidget * currency_edit;
98 GtkWidget * ccard_acct_check;
99 GtkWidget * ccard_acct_sel;
101 GtkWidget * active_check;
105 EmployeeDialogType dialog_type;
109 GncEmployee * created_employee;
113 ew_get_employee (EmployeeWindow *ew)
118 return gncEmployeeLookup (ew->book, &ew->employee_guid);
121 static void gnc_ui_to_employee (EmployeeWindow *ew, GncEmployee *employee)
125 addr = gncEmployeeGetAddr (employee);
127 gnc_suspend_gui_refresh ();
129 gncEmployeeBeginEdit (employee);
131 if (ew->dialog_type == NEW_EMPLOYEE)
134 gncEmployeeSetID (employee, gtk_entry_get_text (GTK_ENTRY (ew->id_entry)));
135 gncEmployeeSetUsername (employee, gtk_entry_get_text (GTK_ENTRY (ew->username_entry)));
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)));
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)));
155 (GNC_CURRENCY_EDIT (ew->currency_edit)));
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));
164 gncEmployeeCommitEdit (employee);
165 gnc_resume_gui_refresh ();
168 static gboolean check_entry_nonempty (GtkWidget *entry,
169 const char * error_message)
171 const char *res = gtk_entry_get_text (GTK_ENTRY (entry));
172 if (g_strcmp0 (res,
"") == 0)
181 static gboolean check_edit_amount (GtkWidget *amount)
183 GError *error = NULL;
184 if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT(amount), &error))
187 g_error_free (error);
194 gnc_employee_window_ok_cb (GtkWidget *widget, gpointer data)
196 EmployeeWindow *ew = data;
199 gnc_commodity *currency;
202 if (check_entry_nonempty (ew->name_entry,
203 _(
"You must enter a Payment-Address Name.")))
208 if (g_strcmp0 (gtk_entry_get_text (GTK_ENTRY (ew->id_entry)),
"") == 0)
210 string = gncEmployeeNextID (ew->book);
211 gtk_entry_set_text (GTK_ENTRY (ew->id_entry),
string);
216 if (check_edit_amount (GTK_WIDGET(ew->workday_amount)))
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),
226 if (check_edit_amount (GTK_WIDGET(ew->rate_amount)))
231 GncEmployee *employee = ew_get_employee (ew);
234 gnc_ui_to_employee (ew, employee);
236 ew->created_employee = employee;
240 gnc_close_gui_component (ew->component_id);
244 gnc_employee_window_cancel_cb (GtkWidget *widget, gpointer data)
246 EmployeeWindow *ew = data;
248 gnc_close_gui_component (ew->component_id);
252 gnc_employee_window_help_cb (GtkWidget *widget, gpointer data)
254 EmployeeWindow *ew = data;
255 gnc_gnome_help (GTK_WINDOW(ew->dialog), DF_MANUAL, DL_USAGE_EMPLOYEE);
259 gnc_employee_window_destroy_cb (GtkWidget *widget, gpointer data)
261 EmployeeWindow *ew = data;
262 GncEmployee *employee = ew_get_employee (ew);
264 gnc_suspend_gui_refresh ();
266 if (ew->dialog_type == NEW_EMPLOYEE && employee != NULL)
268 gncEmployeeBeginEdit (employee);
269 gncEmployeeDestroy (employee);
273 gnc_unregister_gui_component (ew->component_id);
274 gnc_resume_gui_refresh ();
280 gnc_employee_name_changed_cb (GtkWidget *widget, gpointer data)
282 EmployeeWindow *ew = data;
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);
293 gnc_employee_ccard_acct_toggled_cb (GtkToggleButton *button, gpointer data)
295 EmployeeWindow *ew = data;
300 bool active = gtk_toggle_button_get_active (button);
301 gtk_widget_set_sensitive (ew->ccard_acct_sel, active);
305 gnc_employee_window_close_handler (gpointer user_data)
307 EmployeeWindow *ew = user_data;
309 gtk_widget_destroy (ew->dialog);
313 gnc_employee_window_refresh_handler (GHashTable *changes, gpointer user_data)
315 EmployeeWindow *ew = user_data;
317 GncEmployee *employee = ew_get_employee (ew);
322 gnc_close_gui_component (ew->component_id);
329 info = gnc_gui_get_entity_events (changes, &ew->employee_guid);
330 if (info && (info->event_mask & QOF_EVENT_DESTROY))
332 gnc_close_gui_component (ew->component_id);
339 find_handler (gpointer
find_data, gpointer user_data)
342 EmployeeWindow *ew = user_data;
344 return(ew &&
guid_equal(&ew->employee_guid, employee_guid));
347 static EmployeeWindow *
348 gnc_employee_new_window (GtkWindow *parent,
350 GncEmployee *employee)
354 GtkWidget *hbox, *edit;
355 gnc_commodity *currency;
369 ew = gnc_find_first_gui_component (DIALOG_EDIT_EMPLOYEE_CM_CLASS,
370 find_handler, &employee_guid);
373 gtk_window_set_transient_for (GTK_WINDOW(ew->dialog), parent);
374 gtk_window_present (GTK_WINDOW(ew->dialog));
381 currency = gncEmployeeGetCurrency (employee);
388 ew = g_new0 (EmployeeWindow, 1);
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);
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");
402 g_object_set_data (G_OBJECT (ew->dialog),
"dialog_info", ew);
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"));
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"));
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"));
423 ew->currency_edit = edit;
425 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"currency_box"));
426 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
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);
438 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"hours_hbox"));
439 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
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),
448 ew->rate_amount = edit;
449 gtk_widget_show (edit);
451 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"rate_hbox"));
452 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
455 ew->ccard_acct_check = GTK_WIDGET(gtk_builder_get_object (builder,
"ccard_check"));
457 edit = gnc_account_sel_new();
459 gnc_account_sel_set_acct_filters (GNC_ACCOUNT_SEL(edit), acct_types, NULL);
460 g_list_free (acct_types);
462 ew->ccard_acct_sel = edit;
463 gtk_widget_show (edit);
465 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"ccard_acct_hbox"));
466 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
469 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ew);
472 if (employee != NULL)
476 ew->dialog_type = EDIT_EMPLOYEE;
479 addr = gncEmployeeGetAddr (employee);
481 gtk_entry_set_text (GTK_ENTRY (ew->id_entry), gncEmployeeGetID (employee));
482 gtk_entry_set_text (GTK_ENTRY (ew->username_entry), gncEmployeeGetUsername (employee));
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));
494 gtk_entry_set_text (GTK_ENTRY (ew->language_entry),
495 gncEmployeeGetLanguage (employee));
498 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ew->active_check),
499 gncEmployeeGetActive (employee));
502 gnc_register_gui_component (DIALOG_EDIT_EMPLOYEE_CM_CLASS,
503 gnc_employee_window_refresh_handler,
504 gnc_employee_window_close_handler,
509 employee = gncEmployeeCreate (bookp);
512 ew->dialog_type = NEW_EMPLOYEE;
514 gnc_register_gui_component (DIALOG_NEW_EMPLOYEE_CM_CLASS,
515 gnc_employee_window_refresh_handler,
516 gnc_employee_window_close_handler,
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));
529 ccard_acct = gncEmployeeGetCCard (employee);
530 if (ccard_acct == NULL)
532 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ew->ccard_acct_check), FALSE);
533 gtk_widget_set_sensitive (ew->ccard_acct_sel, FALSE);
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);
543 gnc_gui_component_watch_entity_type (ew->component_id,
544 GNC_EMPLOYEE_MODULE_NAME,
545 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
547 gtk_widget_show_all (ew->dialog);
549 g_object_unref(G_OBJECT(builder));
555 gnc_ui_employee_new (GtkWindow *parent, QofBook *bookp)
560 if (!bookp)
return NULL;
562 ew = gnc_employee_new_window (parent, bookp, NULL);
568 gnc_ui_employee_edit (GtkWindow *parent, GncEmployee *employee)
572 if (!employee)
return NULL;
574 ew = gnc_employee_new_window (parent, gncEmployeeGetBook(employee), employee);
582 invoice_employee_cb (GtkWindow *dialog, gpointer *employee_p, gpointer user_data)
586 GncEmployee *employee;
588 g_return_if_fail (employee_p && user_data);
590 employee = *employee_p;
595 gncOwnerInitEmployee (&owner, employee);
596 gnc_invoice_search (dialog, NULL, &owner, sw->book);
601 payment_employee_cb (GtkWindow *dialog, gpointer *employee_p, gpointer user_data)
605 GncEmployee *employee;
607 g_return_if_fail (employee_p && user_data);
609 employee = *employee_p;
614 gncOwnerInitEmployee (&owner, employee);
615 gnc_ui_payment_new (dialog, &owner, sw->book);
620 edit_employee_cb (GtkWindow *dialog, gpointer *employee_p, gpointer user_data)
622 GncEmployee *employee;
624 g_return_if_fail (employee_p && user_data);
626 employee = *employee_p;
631 gnc_ui_employee_edit (dialog, employee);
636 new_employee_cb (GtkWindow *dialog, gpointer user_data)
641 g_return_val_if_fail (user_data, NULL);
643 ew = gnc_ui_employee_new (dialog, sw->book);
644 return ew_get_employee (ew);
648 free_employee_cb (gpointer user_data)
652 g_return_if_fail (sw);
659 gnc_employee_search (GtkWindow *parent, GncEmployee *start, QofBook *book)
661 QofIdType type = GNC_EMPLOYEE_MODULE_NAME;
664 static GList *params = NULL;
665 static GList *columns = NULL;
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},
674 g_return_val_if_fail (book, NULL);
679 params = gnc_search_param_prepend (params, _(
"Employee ID"), NULL, type,
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);
690 columns = gnc_search_param_prepend (columns, _(
"Username"), NULL, type,
691 EMPLOYEE_USERNAME, NULL);
692 columns = gnc_search_param_prepend (columns, _(
"ID #"), NULL, type,
694 columns = gnc_search_param_prepend (columns, _(
"Name"), NULL, type,
695 EMPLOYEE_ADDR, ADDRESS_NAME, NULL);
699 q = qof_query_create_for (type);
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");
725 gnc_employee_search_select (GtkWindow *parent, gpointer start, gpointer book)
727 if (!book)
return NULL;
729 return gnc_employee_search (parent, start, book);
733 gnc_employee_search_edit (GtkWindow *parent, gpointer start, gpointer book)
736 gnc_ui_employee_edit (parent, start);
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
QofQuery * qof_query_copy(QofQuery *q)
Make a copy of the indicated query.
GtkWindow * gnc_ui_get_gtk_window(GtkWidget *widget)
Get a pointer to the widget's immediate top level GtkWindow.
gnc_commodity * gnc_default_currency(void)
Return the default currency set by the user.
const gchar * QofIdType
QofIdType declaration.
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'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.
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 !!
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...
const GncGUID * guid_null(void)
Returns a GncGUID which is guaranteed to never reference any entity.
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
The type used to store guids in C.
#define gncEmployeeGetGUID(E)
deprecated routines
The Credit card account is used to denote credit (e.g.