00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "config.h"
00025
00026 #include <gtk/gtk.h>
00027 #include <glib/gi18n.h>
00028
00029 #include "dialog-utils.h"
00030 #include "gnc-amount-edit.h"
00031 #include "gnc-currency-edit.h"
00032 #include "gnc-component-manager.h"
00033 #include "gnc-ui.h"
00034 #include "gnc-gui-query.h"
00035 #include "gnc-ui-util.h"
00036 #include "qof.h"
00037 #include "dialog-search.h"
00038 #include "search-param.h"
00039 #include "gnc-account-sel.h"
00040
00041 #include "gncAddress.h"
00042 #include "gncEmployee.h"
00043 #include "gncEmployeeP.h"
00044 #include "gncOwner.h"
00045
00046 #include "dialog-employee.h"
00047 #include "dialog-invoice.h"
00048 #include "dialog-payment.h"
00049
00050 #define DIALOG_NEW_EMPLOYEE_CM_CLASS "dialog-new-employee"
00051 #define DIALOG_EDIT_EMPLOYEE_CM_CLASS "dialog-edit-employee"
00052
00053 #define GCONF_SECTION_SEARCH "dialogs/business/employee_search"
00054
00055 void gnc_employee_window_ok_cb (GtkWidget *widget, gpointer data);
00056 void gnc_employee_window_cancel_cb (GtkWidget *widget, gpointer data);
00057 void gnc_employee_window_help_cb (GtkWidget *widget, gpointer data);
00058 void gnc_employee_window_destroy_cb (GtkWidget *widget, gpointer data);
00059 void gnc_employee_name_changed_cb (GtkWidget *widget, gpointer data);
00060 void gnc_employee_ccard_acct_toggled_cb (GtkToggleButton *button, gpointer data);
00061
00062 typedef enum
00063 {
00064 NEW_EMPLOYEE,
00065 EDIT_EMPLOYEE
00066 } EmployeeDialogType;
00067
00068 struct _employee_select_window
00069 {
00070 QofBook * book;
00071 QofQuery * q;
00072 };
00073
00074 struct _employee_window
00075 {
00076 GtkWidget * dialog;
00077
00078 GtkWidget * id_entry;
00079 GtkWidget * username_entry;
00080
00081 GtkWidget * name_entry;
00082 GtkWidget * addr1_entry;
00083 GtkWidget * addr2_entry;
00084 GtkWidget * addr3_entry;
00085 GtkWidget * addr4_entry;
00086 GtkWidget * phone_entry;
00087 GtkWidget * fax_entry;
00088 GtkWidget * email_entry;
00089
00090 GtkWidget * language_entry;
00091
00092 GtkWidget * workday_amount;
00093 GtkWidget * rate_amount;
00094 GtkWidget * currency_edit;
00095 GtkWidget * ccard_acct_check;
00096 GtkWidget * ccard_acct_sel;
00097
00098 GtkWidget * active_check;
00099
00100
00101
00102 EmployeeDialogType dialog_type;
00103 GncGUID employee_guid;
00104 gint component_id;
00105 QofBook * book;
00106 GncEmployee * created_employee;
00107 };
00108
00109 static GncEmployee *
00110 ew_get_employee (EmployeeWindow *ew)
00111 {
00112 if (!ew)
00113 return NULL;
00114
00115 return gncEmployeeLookup (ew->book, &ew->employee_guid);
00116 }
00117
00118 static void gnc_ui_to_employee (EmployeeWindow *ew, GncEmployee *employee)
00119 {
00120 GncAddress *addr;
00121
00122 addr = gncEmployeeGetAddr (employee);
00123
00124 gnc_suspend_gui_refresh ();
00125
00126 gncEmployeeBeginEdit (employee);
00127
00128 if (ew->dialog_type == NEW_EMPLOYEE)
00129 qof_event_gen(QOF_INSTANCE(employee), QOF_EVENT_ADD, NULL);
00130
00131 gncEmployeeSetID (employee, gtk_editable_get_chars
00132 (GTK_EDITABLE (ew->id_entry), 0, -1));
00133 gncEmployeeSetUsername (employee, gtk_editable_get_chars
00134 (GTK_EDITABLE (ew->username_entry), 0, -1));
00135
00136 gncAddressSetName (addr, gtk_editable_get_chars
00137 (GTK_EDITABLE (ew->name_entry), 0, -1));
00138 gncAddressSetAddr1 (addr, gtk_editable_get_chars
00139 (GTK_EDITABLE (ew->addr1_entry), 0, -1));
00140 gncAddressSetAddr2 (addr, gtk_editable_get_chars
00141 (GTK_EDITABLE (ew->addr2_entry), 0, -1));
00142 gncAddressSetAddr3 (addr, gtk_editable_get_chars
00143 (GTK_EDITABLE (ew->addr3_entry), 0, -1));
00144 gncAddressSetAddr4 (addr, gtk_editable_get_chars
00145 (GTK_EDITABLE (ew->addr4_entry), 0, -1));
00146 gncAddressSetPhone (addr, gtk_editable_get_chars
00147 (GTK_EDITABLE (ew->phone_entry), 0, -1));
00148 gncAddressSetFax (addr, gtk_editable_get_chars
00149 (GTK_EDITABLE (ew->fax_entry), 0, -1));
00150 gncAddressSetEmail (addr, gtk_editable_get_chars
00151 (GTK_EDITABLE (ew->email_entry), 0, -1));
00152
00153 gncEmployeeSetActive (employee, gtk_toggle_button_get_active
00154 (GTK_TOGGLE_BUTTON (ew->active_check)));
00155 gncEmployeeSetLanguage (employee, gtk_editable_get_chars
00156 (GTK_EDITABLE (ew->language_entry), 0, -1));
00157
00158
00159 gncEmployeeSetWorkday (employee, gnc_amount_edit_get_amount
00160 (GNC_AMOUNT_EDIT (ew->workday_amount)));
00161 gncEmployeeSetRate (employee, gnc_amount_edit_get_amount
00162 (GNC_AMOUNT_EDIT (ew->rate_amount)));
00163 gncEmployeeSetCurrency (employee, gnc_currency_edit_get_currency
00164 (GNC_CURRENCY_EDIT (ew->currency_edit)));
00165
00166
00167 gncEmployeeSetCCard (employee,
00168 (gtk_toggle_button_get_active
00169 (GTK_TOGGLE_BUTTON (ew->ccard_acct_check)) ?
00170 gnc_account_sel_get_account
00171 (GNC_ACCOUNT_SEL (ew->ccard_acct_sel)) : NULL));
00172
00173 gncEmployeeCommitEdit (employee);
00174 gnc_resume_gui_refresh ();
00175 }
00176
00177 #if 0
00178 static gboolean check_edit_amount (GtkWidget *dialog, GtkWidget *amount,
00179 gnc_numeric *min, gnc_numeric *max,
00180 const char * error_message)
00181 {
00182 if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (amount)))
00183 {
00184 if (error_message)
00185 gnc_error_dialog (dialog, error_message);
00186 return TRUE;
00187 }
00188
00189 if (min || max)
00190 {
00191 gnc_numeric val = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (amount));
00192 if ((min && gnc_numeric_compare (*min, val) > 0) ||
00193 (max && gnc_numeric_compare (val, *max) > 0))
00194 {
00195 if (error_message)
00196 gnc_error_dialog (dialog, error_message);
00197 return TRUE;
00198 }
00199 }
00200 return FALSE;
00201 }
00202 #endif
00203
00204 static gboolean check_entry_nonempty (GtkWidget *dialog, GtkWidget *entry,
00205 const char * error_message)
00206 {
00207 const char *res = gtk_entry_get_text (GTK_ENTRY (entry));
00208 if (safe_strcmp (res, "") == 0)
00209 {
00210 if (error_message)
00211 gnc_error_dialog (dialog, "%s", error_message);
00212 return TRUE;
00213 }
00214 return FALSE;
00215 }
00216
00217 void
00218 gnc_employee_window_ok_cb (GtkWidget *widget, gpointer data)
00219 {
00220 EmployeeWindow *ew = data;
00221 gchar *string;
00222
00223
00224 if (check_entry_nonempty (ew->dialog, ew->username_entry,
00225 _("You must enter a username.")))
00226 return;
00227
00228
00229 if (check_entry_nonempty (ew->dialog, ew->name_entry,
00230 _("You must enter the employee's name.")))
00231 return;
00232
00233
00234 if (check_entry_nonempty (ew->dialog, ew->addr1_entry, NULL) &&
00235 check_entry_nonempty (ew->dialog, ew->addr2_entry, NULL) &&
00236 check_entry_nonempty (ew->dialog, ew->addr3_entry, NULL) &&
00237 check_entry_nonempty (ew->dialog, ew->addr4_entry, NULL))
00238 {
00239 const char *msg = _("You must enter an address.");
00240 gnc_error_dialog (ew->dialog, "%s", msg);
00241 return;
00242 }
00243
00244
00245 if (safe_strcmp (gtk_entry_get_text (GTK_ENTRY (ew->id_entry)), "") == 0)
00246 {
00247 string = gncEmployeeNextID (ew->book);
00248 gtk_entry_set_text (GTK_ENTRY (ew->id_entry), string);
00249 g_free(string);
00250 }
00251
00252
00253 {
00254 GncEmployee *employee = ew_get_employee (ew);
00255 if (employee)
00256 {
00257 gnc_ui_to_employee (ew, employee);
00258 }
00259 ew->created_employee = employee;
00260 ew->employee_guid = *guid_null ();
00261 }
00262
00263 gnc_close_gui_component (ew->component_id);
00264 }
00265
00266 void
00267 gnc_employee_window_cancel_cb (GtkWidget *widget, gpointer data)
00268 {
00269 EmployeeWindow *ew = data;
00270
00271 gnc_close_gui_component (ew->component_id);
00272 }
00273
00274 void
00275 gnc_employee_window_help_cb (GtkWidget *widget, gpointer data)
00276 {
00277 gnc_gnome_help(HF_HELP, HL_USAGE);
00278 }
00279
00280 void
00281 gnc_employee_window_destroy_cb (GtkWidget *widget, gpointer data)
00282 {
00283 EmployeeWindow *ew = data;
00284 GncEmployee *employee = ew_get_employee (ew);
00285
00286 gnc_suspend_gui_refresh ();
00287
00288 if (ew->dialog_type == NEW_EMPLOYEE && employee != NULL)
00289 {
00290 gncEmployeeBeginEdit (employee);
00291 gncEmployeeDestroy (employee);
00292 ew->employee_guid = *guid_null ();
00293 }
00294
00295 gnc_unregister_gui_component (ew->component_id);
00296 gnc_resume_gui_refresh ();
00297
00298 g_free (ew);
00299 }
00300
00301 void
00302 gnc_employee_name_changed_cb (GtkWidget *widget, gpointer data)
00303 {
00304 EmployeeWindow *ew = data;
00305 char *fullname, *title;
00306 const char *name, *id;
00307
00308 if (!ew)
00309 return;
00310
00311 name = gtk_entry_get_text (GTK_ENTRY (ew->name_entry));
00312 if (!name || *name == '\0')
00313 name = _("<No name>");
00314
00315 id = gtk_entry_get_text (GTK_ENTRY (ew->id_entry));
00316
00317 fullname = g_strconcat (name, " (", id, ")", (char *)NULL);
00318
00319 if (ew->dialog_type == EDIT_EMPLOYEE)
00320 title = g_strconcat (_("Edit Employee"), " - ", fullname, (char *)NULL);
00321 else
00322 title = g_strconcat (_("New Employee"), " - ", fullname, (char *)NULL);
00323
00324 gtk_window_set_title (GTK_WINDOW (ew->dialog), title);
00325
00326 g_free (fullname);
00327 g_free (title);
00328 }
00329
00330 void
00331 gnc_employee_ccard_acct_toggled_cb (GtkToggleButton *button, gpointer data)
00332 {
00333 EmployeeWindow *ew = data;
00334
00335 if (!ew)
00336 return;
00337
00338 if (gtk_toggle_button_get_active (button))
00339 {
00340 gtk_widget_set_sensitive (ew->ccard_acct_sel, TRUE);
00341 gtk_widget_show (ew->ccard_acct_sel);
00342 }
00343 else
00344 {
00345 gtk_widget_set_sensitive (ew->ccard_acct_sel, TRUE);
00346 gtk_widget_hide (ew->ccard_acct_sel);
00347 }
00348 }
00349
00350 static void
00351 gnc_employee_window_close_handler (gpointer user_data)
00352 {
00353 EmployeeWindow *ew = user_data;
00354
00355 gtk_widget_destroy (ew->dialog);
00356 }
00357
00358 static void
00359 gnc_employee_window_refresh_handler (GHashTable *changes, gpointer user_data)
00360 {
00361 EmployeeWindow *ew = user_data;
00362 const EventInfo *info;
00363 GncEmployee *employee = ew_get_employee (ew);
00364
00365
00366 if (!employee)
00367 {
00368 gnc_close_gui_component (ew->component_id);
00369 return;
00370 }
00371
00372
00373 if (changes)
00374 {
00375 info = gnc_gui_get_entity_events (changes, &ew->employee_guid);
00376 if (info && (info->event_mask & QOF_EVENT_DESTROY))
00377 {
00378 gnc_close_gui_component (ew->component_id);
00379 return;
00380 }
00381 }
00382 }
00383
00384 static gboolean
00385 find_handler (gpointer find_data, gpointer user_data)
00386 {
00387 const GncGUID *employee_guid = find_data;
00388 EmployeeWindow *ew = user_data;
00389
00390 return(ew && guid_equal(&ew->employee_guid, employee_guid));
00391 }
00392
00393 static EmployeeWindow *
00394 gnc_employee_new_window (QofBook *bookp,
00395 GncEmployee *employee)
00396 {
00397 EmployeeWindow *ew;
00398 GladeXML *xml;
00399 GtkWidget *hbox, *edit;
00400 gnc_commodity *currency;
00401 GNCPrintAmountInfo print_info;
00402 GList *acct_types;
00403 Account *ccard_acct;
00404
00405
00406
00407
00408
00409 if (employee)
00410 {
00411 GncGUID employee_guid;
00412
00413 employee_guid = *gncEmployeeGetGUID (employee);
00414 ew = gnc_find_first_gui_component (DIALOG_EDIT_EMPLOYEE_CM_CLASS,
00415 find_handler, &employee_guid);
00416 if (ew)
00417 {
00418 gtk_window_present (GTK_WINDOW(ew->dialog));
00419 return(ew);
00420 }
00421 }
00422
00423
00424 if (employee)
00425 currency = gncEmployeeGetCurrency (employee);
00426 else
00427 currency = gnc_default_currency ();
00428
00429
00430
00431
00432 ew = g_new0 (EmployeeWindow, 1);
00433
00434 ew->book = bookp;
00435
00436
00437 xml = gnc_glade_xml_new ("employee.glade", "Employee Dialog");
00438 ew->dialog = glade_xml_get_widget (xml, "Employee Dialog");
00439
00440 g_object_set_data (G_OBJECT (ew->dialog), "dialog_info", ew);
00441
00442
00443 ew->id_entry = glade_xml_get_widget (xml, "id_entry");
00444 ew->username_entry = glade_xml_get_widget (xml, "username_entry");
00445
00446 ew->name_entry = glade_xml_get_widget (xml, "name_entry");
00447 ew->addr1_entry = glade_xml_get_widget (xml, "addr1_entry");
00448 ew->addr2_entry = glade_xml_get_widget (xml, "addr2_entry");
00449 ew->addr3_entry = glade_xml_get_widget (xml, "addr3_entry");
00450 ew->addr4_entry = glade_xml_get_widget (xml, "addr4_entry");
00451 ew->phone_entry = glade_xml_get_widget (xml, "phone_entry");
00452 ew->fax_entry = glade_xml_get_widget (xml, "fax_entry");
00453 ew->email_entry = glade_xml_get_widget (xml, "email_entry");
00454
00455 ew->language_entry = glade_xml_get_widget (xml, "language_entry");
00456 ew->active_check = glade_xml_get_widget (xml, "active_check");
00457
00458
00459 edit = gnc_currency_edit_new();
00460 gnc_currency_edit_set_currency (GNC_CURRENCY_EDIT(edit), currency);
00461 ew->currency_edit = edit;
00462
00463 hbox = glade_xml_get_widget (xml, "currency_box");
00464 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
00465
00466
00467 edit = gnc_amount_edit_new();
00468 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE);
00469 print_info = gnc_integral_print_info ();
00470 print_info.max_decimal_places = 5;
00471 gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info);
00472 gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit), 100000);
00473 ew->workday_amount = edit;
00474 gtk_widget_show (edit);
00475
00476 hbox = glade_xml_get_widget (xml, "hours_hbox");
00477 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
00478
00479
00480 edit = gnc_amount_edit_new();
00481 print_info = gnc_commodity_print_info (currency, FALSE);
00482 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE);
00483 gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info);
00484 gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit),
00485 gnc_commodity_get_fraction (currency));
00486 ew->rate_amount = edit;
00487 gtk_widget_show (edit);
00488
00489 hbox = glade_xml_get_widget (xml, "rate_hbox");
00490 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
00491
00492
00493 ew->ccard_acct_check = glade_xml_get_widget (xml, "ccard_check");
00494
00495 edit = gnc_account_sel_new();
00496 acct_types = g_list_prepend(NULL, (gpointer)ACCT_TYPE_CREDIT);
00497 gnc_account_sel_set_acct_filters (GNC_ACCOUNT_SEL(edit), acct_types, NULL);
00498 g_list_free (acct_types);
00499
00500 ew->ccard_acct_sel = edit;
00501 gtk_widget_show (edit);
00502
00503 hbox = glade_xml_get_widget (xml, "ccard_acct_hbox");
00504 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
00505
00506
00507 glade_xml_signal_autoconnect_full( xml,
00508 gnc_glade_autoconnect_full_func,
00509 ew);
00510
00511
00512 if (employee != NULL)
00513 {
00514 GncAddress *addr;
00515
00516 ew->dialog_type = EDIT_EMPLOYEE;
00517 ew->employee_guid = *gncEmployeeGetGUID (employee);
00518
00519 addr = gncEmployeeGetAddr (employee);
00520
00521 gtk_entry_set_text (GTK_ENTRY (ew->id_entry), gncEmployeeGetID (employee));
00522 gtk_entry_set_text (GTK_ENTRY (ew->username_entry), gncEmployeeGetUsername (employee));
00523
00524
00525 gtk_entry_set_text (GTK_ENTRY (ew->name_entry), gncAddressGetName (addr));
00526 gtk_entry_set_text (GTK_ENTRY (ew->addr1_entry), gncAddressGetAddr1 (addr));
00527 gtk_entry_set_text (GTK_ENTRY (ew->addr2_entry), gncAddressGetAddr2 (addr));
00528 gtk_entry_set_text (GTK_ENTRY (ew->addr3_entry), gncAddressGetAddr3 (addr));
00529 gtk_entry_set_text (GTK_ENTRY (ew->addr4_entry), gncAddressGetAddr4 (addr));
00530 gtk_entry_set_text (GTK_ENTRY (ew->phone_entry), gncAddressGetPhone (addr));
00531 gtk_entry_set_text (GTK_ENTRY (ew->fax_entry), gncAddressGetFax (addr));
00532 gtk_entry_set_text (GTK_ENTRY (ew->email_entry), gncAddressGetEmail (addr));
00533
00534 gtk_entry_set_text (GTK_ENTRY (ew->language_entry),
00535 gncEmployeeGetLanguage (employee));
00536
00537
00538 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ew->active_check),
00539 gncEmployeeGetActive (employee));
00540
00541 ew->component_id =
00542 gnc_register_gui_component (DIALOG_EDIT_EMPLOYEE_CM_CLASS,
00543 gnc_employee_window_refresh_handler,
00544 gnc_employee_window_close_handler,
00545 ew);
00546 }
00547 else
00548 {
00549 employee = gncEmployeeCreate (bookp);
00550 ew->employee_guid = *gncEmployeeGetGUID (employee);
00551
00552 ew->dialog_type = NEW_EMPLOYEE;
00553 ew->component_id =
00554 gnc_register_gui_component (DIALOG_NEW_EMPLOYEE_CM_CLASS,
00555 gnc_employee_window_refresh_handler,
00556 gnc_employee_window_close_handler,
00557 ew);
00558 }
00559
00560
00561
00562
00563 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (ew->workday_amount),
00564 gncEmployeeGetWorkday (employee));
00565 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (ew->rate_amount),
00566 gncEmployeeGetRate (employee));
00567
00568
00569 ccard_acct = gncEmployeeGetCCard (employee);
00570 if (ccard_acct == NULL)
00571 {
00572 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ew->ccard_acct_check), FALSE);
00573 gtk_widget_set_sensitive (ew->ccard_acct_sel, FALSE);
00574 }
00575 else
00576 {
00577 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ew->ccard_acct_check), TRUE);
00578 gnc_account_sel_set_account (GNC_ACCOUNT_SEL (ew->ccard_acct_sel), ccard_acct, FALSE);
00579 }
00580
00581
00582
00583 gnc_gui_component_watch_entity_type (ew->component_id,
00584 GNC_EMPLOYEE_MODULE_NAME,
00585 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
00586
00587 gtk_widget_show_all (ew->dialog);
00588
00589 if (ccard_acct == NULL)
00590 gtk_widget_hide (ew->ccard_acct_sel);
00591
00592 return ew;
00593 }
00594
00595 EmployeeWindow *
00596 gnc_ui_employee_new (QofBook *bookp)
00597 {
00598 EmployeeWindow *ew;
00599
00600
00601 if (!bookp) return NULL;
00602
00603 ew = gnc_employee_new_window (bookp, NULL);
00604
00605 return ew;
00606 }
00607
00608 EmployeeWindow *
00609 gnc_ui_employee_edit (GncEmployee *employee)
00610 {
00611 EmployeeWindow *ew;
00612
00613 if (!employee) return NULL;
00614
00615 ew = gnc_employee_new_window (gncEmployeeGetBook(employee), employee);
00616
00617 return ew;
00618 }
00619
00620
00621
00622 static void
00623 invoice_employee_cb (gpointer *employee_p, gpointer user_data)
00624 {
00625 struct _employee_select_window *sw = user_data;
00626 GncOwner owner;
00627 GncEmployee *employee;
00628
00629 g_return_if_fail (employee_p && user_data);
00630
00631 employee = *employee_p;
00632
00633 if (!employee)
00634 return;
00635
00636 gncOwnerInitEmployee (&owner, employee);
00637 gnc_invoice_search (NULL, &owner, sw->book);
00638 return;
00639 }
00640
00641 static void
00642 payment_employee_cb (gpointer *employee_p, gpointer user_data)
00643 {
00644 struct _employee_select_window *sw = user_data;
00645 GncOwner owner;
00646 GncEmployee *employee;
00647
00648 g_return_if_fail (employee_p && user_data);
00649
00650 employee = *employee_p;
00651
00652 if (!employee)
00653 return;
00654
00655 gncOwnerInitEmployee (&owner, employee);
00656 gnc_ui_payment_new (&owner, sw->book);
00657 return;
00658 }
00659
00660 static void
00661 edit_employee_cb (gpointer *employee_p, gpointer user_data)
00662 {
00663 GncEmployee *employee;
00664
00665 g_return_if_fail (employee_p && user_data);
00666
00667 employee = *employee_p;
00668
00669 if (!employee)
00670 return;
00671
00672 gnc_ui_employee_edit (employee);
00673 return;
00674 }
00675
00676 static gpointer
00677 new_employee_cb (gpointer user_data)
00678 {
00679 struct _employee_select_window *sw = user_data;
00680 EmployeeWindow *ew;
00681
00682 g_return_val_if_fail (user_data, NULL);
00683
00684 ew = gnc_ui_employee_new (sw->book);
00685 return ew_get_employee (ew);
00686 }
00687
00688 static void
00689 free_employee_cb (gpointer user_data)
00690 {
00691 struct _employee_select_window *sw = user_data;
00692
00693 g_return_if_fail (sw);
00694
00695 qof_query_destroy (sw->q);
00696 g_free (sw);
00697 }
00698
00699 GNCSearchWindow *
00700 gnc_employee_search (GncEmployee *start, QofBook *book)
00701 {
00702 QofIdType type = GNC_EMPLOYEE_MODULE_NAME;
00703 struct _employee_select_window *sw;
00704 QofQuery *q, *q2 = NULL;
00705 static GList *params = NULL;
00706 static GList *columns = NULL;
00707 static GNCSearchCallbackButton buttons[] =
00708 {
00709 { N_("View/Edit Employee"), edit_employee_cb},
00710 { N_("Expense Vouchers"), invoice_employee_cb},
00711 { N_("Process Payment"), payment_employee_cb},
00712 { NULL },
00713 };
00714
00715 g_return_val_if_fail (book, NULL);
00716
00717
00718 if (params == NULL)
00719 {
00720 params = gnc_search_param_prepend (params, _("Employee ID"), NULL, type,
00721 EMPLOYEE_ID, NULL);
00722 params = gnc_search_param_prepend (params, _("Employee Username"), NULL,
00723 type, EMPLOYEE_USERNAME, NULL);
00724 params = gnc_search_param_prepend (params, _("Employee Name"), NULL,
00725 type, EMPLOYEE_ADDR, ADDRESS_NAME, NULL);
00726 }
00727
00728
00729 if (columns == NULL)
00730 {
00731 columns = gnc_search_param_prepend (columns, _("Username"), NULL, type,
00732 EMPLOYEE_USERNAME, NULL);
00733 columns = gnc_search_param_prepend (columns, _("ID #"), NULL, type,
00734 EMPLOYEE_ID, NULL);
00735 columns = gnc_search_param_prepend (columns, _("Name"), NULL, type,
00736 EMPLOYEE_ADDR, ADDRESS_NAME, NULL);
00737 }
00738
00739
00740 q = qof_query_create_for (type);
00741 qof_query_set_book (q, book);
00742
00743 #if 0
00744 if (start)
00745 {
00746 q2 = qof_query_copy (q);
00747 qof_query_add_guid_match (q2, g_slist_prepend (NULL, QOF_PARAM_GUID),
00748 gncEmployeeGetGUID (start), QOF_QUERY_AND);
00749 }
00750 #endif
00751
00752
00753 sw = g_new0 (struct _employee_select_window, 1);
00754 sw->book = book;
00755 sw->q = q;
00756
00757 return gnc_search_dialog_create (type, _("Find Employee"),
00758 params, columns, q, q2,
00759 buttons, NULL, new_employee_cb,
00760 sw, free_employee_cb,
00761 GCONF_SECTION_SEARCH, NULL);
00762 }
00763
00764 GNCSearchWindow *
00765 gnc_employee_search_select (gpointer start, gpointer book)
00766 {
00767 if (!book) return NULL;
00768
00769 return gnc_employee_search (start, book);
00770 }
00771
00772 GNCSearchWindow *
00773 gnc_employee_search_edit (gpointer start, gpointer book)
00774 {
00775 if (start)
00776 gnc_ui_employee_edit (start);
00777
00778 return NULL;
00779 }