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 #include <gdk/gdkkeysyms.h>
00029
00030 #include "dialog-utils.h"
00031 #include "gnc-amount-edit.h"
00032 #include "gnc-currency-edit.h"
00033 #include "gnc-component-manager.h"
00034 #include "gnc-ui.h"
00035 #include "gnc-gui-query.h"
00036 #include "gnc-ui-util.h"
00037 #include "qof.h"
00038
00039 #include "dialog-search.h"
00040 #include "search-param.h"
00041 #include "app-utils/QuickFill.h"
00042 #include "app-utils/gnc-addr-quickfill.h"
00043
00044 #include "gncAddress.h"
00045 #include "gncCustomer.h"
00046 #include "gncCustomerP.h"
00047
00048 #include "business-gnome-utils.h"
00049 #include "dialog-customer.h"
00050 #include "dialog-job.h"
00051 #include "dialog-order.h"
00052 #include "dialog-invoice.h"
00053 #include "dialog-payment.h"
00054
00055 #define DIALOG_NEW_CUSTOMER_CM_CLASS "dialog-new-customer"
00056 #define DIALOG_EDIT_CUSTOMER_CM_CLASS "dialog-edit-customer"
00057
00058 #define GCONF_SECTION_SEARCH "dialogs/business/customer_search"
00059
00060 void gnc_customer_taxtable_check_cb (GtkToggleButton *togglebutton,
00061 gpointer user_data);
00062
00063 void gnc_customer_window_ok_cb (GtkWidget *widget, gpointer data);
00064 void gnc_customer_window_cancel_cb (GtkWidget *widget, gpointer data);
00065 void gnc_customer_window_help_cb (GtkWidget *widget, gpointer data);
00066 void gnc_customer_window_destroy_cb (GtkWidget *widget, gpointer data);
00067 void gnc_customer_name_changed_cb (GtkWidget *widget, gpointer data);
00068 void gnc_customer_addr2_insert_cb(GtkEditable *editable,
00069 gchar *new_text, gint new_text_length,
00070 gint *position, gpointer user_data);
00071 void gnc_customer_addr3_insert_cb(GtkEditable *editable,
00072 gchar *new_text, gint new_text_length,
00073 gint *position, gpointer user_data);
00074 void gnc_customer_addr4_insert_cb(GtkEditable *editable,
00075 gchar *new_text, gint new_text_length,
00076 gint *position, gpointer user_data);
00077 void gnc_customer_shipaddr2_insert_cb(GtkEditable *editable,
00078 gchar *new_text, gint new_text_length,
00079 gint *position, gpointer user_data);
00080 void gnc_customer_shipaddr3_insert_cb(GtkEditable *editable,
00081 gchar *new_text, gint new_text_length,
00082 gint *position, gpointer user_data);
00083 void gnc_customer_shipaddr4_insert_cb(GtkEditable *editable,
00084 gchar *new_text, gint new_text_length,
00085 gint *position, gpointer user_data);
00086 gboolean
00087 gnc_customer_addr2_key_press_cb( GtkEntry *entry, GdkEventKey *event,
00088 gpointer user_data );
00089 gboolean
00090 gnc_customer_addr3_key_press_cb( GtkEntry *entry, GdkEventKey *event,
00091 gpointer user_data );
00092 gboolean
00093 gnc_customer_addr4_key_press_cb( GtkEntry *entry, GdkEventKey *event,
00094 gpointer user_data );
00095 gboolean
00096 gnc_customer_shipaddr2_key_press_cb( GtkEntry *entry, GdkEventKey *event,
00097 gpointer user_data );
00098 gboolean
00099 gnc_customer_shipaddr3_key_press_cb( GtkEntry *entry, GdkEventKey *event,
00100 gpointer user_data );
00101 gboolean
00102 gnc_customer_shipaddr4_key_press_cb( GtkEntry *entry, GdkEventKey *event,
00103 gpointer user_data );
00104
00105 #define ADDR_QUICKFILL "GncAddress-Quickfill"
00106
00107 typedef enum
00108 {
00109 NEW_CUSTOMER,
00110 EDIT_CUSTOMER
00111 } CustomerDialogType;
00112
00113 struct _customer_select_window
00114 {
00115 QofBook * book;
00116 QofQuery * q;
00117 };
00118
00119 struct _customer_window
00120 {
00121 GtkWidget * dialog;
00122
00123 GtkWidget * id_entry;
00124 GtkWidget * company_entry;
00125
00126 GtkWidget * name_entry;
00127 GtkWidget * addr1_entry;
00128 GtkWidget * addr2_entry;
00129 GtkWidget * addr3_entry;
00130 GtkWidget * addr4_entry;
00131 GtkWidget * phone_entry;
00132 GtkWidget * fax_entry;
00133 GtkWidget * email_entry;
00134
00135 GtkWidget * shipname_entry;
00136 GtkWidget * shipaddr1_entry;
00137 GtkWidget * shipaddr2_entry;
00138 GtkWidget * shipaddr3_entry;
00139 GtkWidget * shipaddr4_entry;
00140 GtkWidget * shipphone_entry;
00141 GtkWidget * shipfax_entry;
00142 GtkWidget * shipemail_entry;
00143
00144 GtkWidget * currency_edit;
00145 GtkWidget * terms_menu;
00146 GtkWidget * discount_amount;
00147 GtkWidget * credit_amount;
00148
00149 GtkWidget * active_check;
00150 GtkWidget * taxincluded_menu;
00151 GtkWidget * notes_text;
00152
00153 GtkWidget * taxtable_check;
00154 GtkWidget * taxtable_menu;
00155
00156 GncTaxIncluded taxincluded;
00157 GncBillTerm * terms;
00158 CustomerDialogType dialog_type;
00159 GncGUID customer_guid;
00160 gint component_id;
00161 QofBook * book;
00162 GncCustomer * created_customer;
00163
00164 GncTaxTable * taxtable;
00165
00166
00167 QuickFill *addr2_quickfill;
00168 QuickFill *addr3_quickfill;
00169 QuickFill *addr4_quickfill;
00170 gint addrX_start_selection;
00171 gint addrX_end_selection;
00172 guint addrX_selection_source_id;
00173 };
00174
00175 void
00176 gnc_customer_taxtable_check_cb (GtkToggleButton *togglebutton,
00177 gpointer user_data)
00178 {
00179 CustomerWindow *cw = user_data;
00180
00181 if (gtk_toggle_button_get_active (togglebutton))
00182 gtk_widget_set_sensitive (cw->taxtable_menu, TRUE);
00183 else
00184 gtk_widget_set_sensitive (cw->taxtable_menu, FALSE);
00185 }
00186
00187 static GncCustomer *
00188 cw_get_customer (CustomerWindow *cw)
00189 {
00190 if (!cw)
00191 return NULL;
00192
00193 return gncCustomerLookup (cw->book, &cw->customer_guid);
00194 }
00195
00196 static void gnc_ui_to_customer (CustomerWindow *cw, GncCustomer *cust)
00197 {
00198 GtkTextBuffer* text_buffer;
00199 GtkTextIter start, end;
00200 gchar *text;
00201 GncAddress *addr, *shipaddr;
00202
00203 addr = gncCustomerGetAddr (cust);
00204 shipaddr = gncCustomerGetShipAddr (cust);
00205
00206 gnc_suspend_gui_refresh ();
00207
00208 gncCustomerBeginEdit (cust);
00209
00210 if (cw->dialog_type == NEW_CUSTOMER)
00211 qof_event_gen(QOF_INSTANCE(cust), QOF_EVENT_ADD, NULL);
00212
00213 gncCustomerSetID (cust, gtk_editable_get_chars
00214 (GTK_EDITABLE (cw->id_entry), 0, -1));
00215 gncCustomerSetName (cust, gtk_editable_get_chars
00216 (GTK_EDITABLE (cw->company_entry), 0, -1));
00217
00218 gncAddressSetName (addr, gtk_editable_get_chars
00219 (GTK_EDITABLE (cw->name_entry), 0, -1));
00220 gncAddressSetAddr1 (addr, gtk_editable_get_chars
00221 (GTK_EDITABLE (cw->addr1_entry), 0, -1));
00222 gncAddressSetAddr2 (addr, gtk_editable_get_chars
00223 (GTK_EDITABLE (cw->addr2_entry), 0, -1));
00224 gncAddressSetAddr3 (addr, gtk_editable_get_chars
00225 (GTK_EDITABLE (cw->addr3_entry), 0, -1));
00226 gncAddressSetAddr4 (addr, gtk_editable_get_chars
00227 (GTK_EDITABLE (cw->addr4_entry), 0, -1));
00228 gncAddressSetPhone (addr, gtk_editable_get_chars
00229 (GTK_EDITABLE (cw->phone_entry), 0, -1));
00230 gncAddressSetFax (addr, gtk_editable_get_chars
00231 (GTK_EDITABLE (cw->fax_entry), 0, -1));
00232 gncAddressSetEmail (addr, gtk_editable_get_chars
00233 (GTK_EDITABLE (cw->email_entry), 0, -1));
00234
00235 gncAddressSetName (shipaddr, gtk_editable_get_chars
00236 (GTK_EDITABLE (cw->shipname_entry), 0, -1));
00237 gncAddressSetAddr1 (shipaddr, gtk_editable_get_chars
00238 (GTK_EDITABLE (cw->shipaddr1_entry), 0, -1));
00239 gncAddressSetAddr2 (shipaddr, gtk_editable_get_chars
00240 (GTK_EDITABLE (cw->shipaddr2_entry), 0, -1));
00241 gncAddressSetAddr3 (shipaddr, gtk_editable_get_chars
00242 (GTK_EDITABLE (cw->shipaddr3_entry), 0, -1));
00243 gncAddressSetAddr4 (shipaddr, gtk_editable_get_chars
00244 (GTK_EDITABLE (cw->shipaddr4_entry), 0, -1));
00245 gncAddressSetPhone (shipaddr, gtk_editable_get_chars
00246 (GTK_EDITABLE (cw->shipphone_entry), 0, -1));
00247 gncAddressSetFax (shipaddr, gtk_editable_get_chars
00248 (GTK_EDITABLE (cw->shipfax_entry), 0, -1));
00249 gncAddressSetEmail (shipaddr, gtk_editable_get_chars
00250 (GTK_EDITABLE (cw->shipemail_entry), 0, -1));
00251
00252 gncCustomerSetActive (cust, gtk_toggle_button_get_active
00253 (GTK_TOGGLE_BUTTON (cw->active_check)));
00254 gncCustomerSetTaxIncluded (cust, cw->taxincluded);
00255
00256 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(cw->notes_text));
00257 gtk_text_buffer_get_bounds (text_buffer, &start, &end);
00258 text = gtk_text_buffer_get_text (text_buffer, &start, &end, FALSE);
00259 gncCustomerSetNotes (cust, text);
00260
00261
00262 gncCustomerSetCurrency (cust,
00263 gnc_currency_edit_get_currency (GNC_CURRENCY_EDIT
00264 (cw->currency_edit)));
00265 gncCustomerSetTerms (cust, cw->terms);
00266 gncCustomerSetDiscount (cust, gnc_amount_edit_get_amount
00267 (GNC_AMOUNT_EDIT (cw->discount_amount)));
00268 gncCustomerSetCredit (cust, gnc_amount_edit_get_amount
00269 (GNC_AMOUNT_EDIT (cw->credit_amount)));
00270
00271 gncCustomerSetTaxTableOverride
00272 (cust, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cw->taxtable_check)));
00273 gncCustomerSetTaxTable (cust, cw->taxtable);
00274
00275 gncCustomerCommitEdit (cust);
00276 gnc_resume_gui_refresh ();
00277 }
00278
00279 static gboolean check_edit_amount (GtkWidget *dialog, GtkWidget *amount,
00280 gnc_numeric *min, gnc_numeric *max,
00281 const char * error_message)
00282 {
00283 if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (amount)))
00284 {
00285 if (error_message)
00286 gnc_error_dialog (dialog, "%s", error_message);
00287 return TRUE;
00288 }
00289
00290 if (min || max)
00291 {
00292 gnc_numeric val = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (amount));
00293 if ((min && gnc_numeric_compare (*min, val) > 0) ||
00294 (max && gnc_numeric_compare (val, *max) > 0))
00295 {
00296 if (error_message)
00297 gnc_error_dialog (dialog, "%s", error_message);
00298 return TRUE;
00299 }
00300 }
00301 return FALSE;
00302 }
00303
00304 static gboolean check_entry_nonempty (GtkWidget *dialog, GtkWidget *entry,
00305 const char * error_message)
00306 {
00307 const char *res = gtk_entry_get_text (GTK_ENTRY (entry));
00308 if (safe_strcmp (res, "") == 0)
00309 {
00310 if (error_message)
00311 gnc_error_dialog (dialog, "%s", error_message);
00312 return TRUE;
00313 }
00314 return FALSE;
00315 }
00316
00317 void
00318 gnc_customer_window_ok_cb (GtkWidget *widget, gpointer data)
00319 {
00320 CustomerWindow *cw = data;
00321 gnc_numeric min, max;
00322 gchar *string;
00323
00324
00325 if (check_entry_nonempty (cw->dialog, cw->company_entry,
00326 _("You must enter a company name. "
00327 "If this customer is an individual (and not a company) "
00328 "you should enter the same value for:\nIdentification "
00329 "- Company Name, and\nPayment Address - Name.")))
00330 return;
00331
00332
00333 if (check_entry_nonempty (cw->dialog, cw->addr1_entry, NULL) &&
00334 check_entry_nonempty (cw->dialog, cw->addr2_entry, NULL) &&
00335 check_entry_nonempty (cw->dialog, cw->addr3_entry, NULL) &&
00336 check_entry_nonempty (cw->dialog, cw->addr4_entry, NULL))
00337 {
00338 const char *msg = _("You must enter a billing address.");
00339 gnc_error_dialog (cw->dialog, "%s", msg);
00340 return;
00341 }
00342
00343
00344 min = gnc_numeric_zero ();
00345 max = gnc_numeric_create (100, 1);
00346
00347 if (check_edit_amount (cw->dialog, cw->discount_amount, &min, &max,
00348 _("Discount percentage must be between 0-100 "
00349 "or you must leave it blank.")))
00350 return;
00351
00352 if (check_edit_amount (cw->dialog, cw->credit_amount, &min, NULL,
00353 _("Credit must be a positive amount or "
00354 "you must leave it blank.")))
00355 return;
00356
00357
00358 if (safe_strcmp (gtk_entry_get_text (GTK_ENTRY (cw->id_entry)), "") == 0)
00359 {
00360 string = gncCustomerNextID (cw->book);
00361 gtk_entry_set_text (GTK_ENTRY (cw->id_entry), string);
00362 g_free(string);
00363 }
00364
00365
00366 {
00367 GncCustomer *customer = cw_get_customer (cw);
00368 if (customer)
00369 {
00370 gnc_ui_to_customer (cw, customer);
00371 }
00372 cw->created_customer = customer;
00373 cw->customer_guid = *guid_null ();
00374 }
00375
00376 gnc_close_gui_component (cw->component_id);
00377 }
00378
00379 void
00380 gnc_customer_window_cancel_cb (GtkWidget *widget, gpointer data)
00381 {
00382 CustomerWindow *cw = data;
00383
00384 gnc_close_gui_component (cw->component_id);
00385 }
00386
00387 void
00388 gnc_customer_window_help_cb (GtkWidget *widget, gpointer data)
00389 {
00390 gnc_gnome_help(HF_HELP, HL_USAGE);
00391 }
00392
00393 void
00394 gnc_customer_window_destroy_cb (GtkWidget *widget, gpointer data)
00395 {
00396 CustomerWindow *cw = data;
00397 GncCustomer *customer = cw_get_customer (cw);
00398
00399 gnc_suspend_gui_refresh ();
00400
00401 if (cw->dialog_type == NEW_CUSTOMER && customer != NULL)
00402 {
00403 gncCustomerBeginEdit (customer);
00404 gncCustomerDestroy (customer);
00405 cw->customer_guid = *guid_null ();
00406 }
00407
00408 if (cw->addrX_selection_source_id)
00409 g_source_remove (cw->addrX_selection_source_id);
00410
00411 gnc_unregister_gui_component (cw->component_id);
00412 gnc_resume_gui_refresh ();
00413
00414 g_free (cw);
00415 }
00416
00417 void
00418 gnc_customer_name_changed_cb (GtkWidget *widget, gpointer data)
00419 {
00420 CustomerWindow *cw = data;
00421 char *fullname, *title;
00422 const char *id, *name;
00423
00424 if (!cw)
00425 return;
00426
00427 name = gtk_entry_get_text (GTK_ENTRY (cw->company_entry));
00428 if (!name || *name == '\0')
00429 name = _("<No name>");
00430
00431 id = gtk_entry_get_text (GTK_ENTRY (cw->id_entry));
00432
00433 fullname = g_strconcat (name, " (", id, ")", (char *)NULL);
00434
00435 if (cw->dialog_type == EDIT_CUSTOMER)
00436 title = g_strconcat (_("Edit Customer"), " - ", fullname, (char *)NULL);
00437 else
00438 title = g_strconcat (_("New Customer"), " - ", fullname, (char *)NULL);
00439
00440 gtk_window_set_title (GTK_WINDOW (cw->dialog), title);
00441
00442 g_free (fullname);
00443 g_free (title);
00444 }
00445
00446 static void
00447 gnc_customer_window_close_handler (gpointer user_data)
00448 {
00449 CustomerWindow *cw = user_data;
00450
00451 gtk_widget_destroy (cw->dialog);
00452
00453
00454 }
00455
00456 static void
00457 gnc_customer_window_refresh_handler (GHashTable *changes, gpointer user_data)
00458 {
00459 CustomerWindow *cw = user_data;
00460 const EventInfo *info;
00461 GncCustomer *customer = cw_get_customer (cw);
00462
00463
00464 if (!customer)
00465 {
00466 gnc_close_gui_component (cw->component_id);
00467 return;
00468 }
00469
00470
00471 if (changes)
00472 {
00473 info = gnc_gui_get_entity_events (changes, &cw->customer_guid);
00474 if (info && (info->event_mask & QOF_EVENT_DESTROY))
00475 {
00476 gnc_close_gui_component (cw->component_id);
00477 return;
00478 }
00479 }
00480 }
00481
00482 static gboolean
00483 find_handler (gpointer find_data, gpointer user_data)
00484 {
00485 const GncGUID *customer_guid = find_data;
00486 CustomerWindow *cw = user_data;
00487
00488 return(cw && guid_equal(&cw->customer_guid, customer_guid));
00489 }
00490
00491 static CustomerWindow *
00492 gnc_customer_new_window (QofBook *bookp, GncCustomer *cust)
00493 {
00494 CustomerWindow *cw;
00495 GladeXML *xml;
00496 GtkWidget *hbox, *edit;
00497 gnc_commodity *currency;
00498 GNCPrintAmountInfo print_info;
00499
00500
00501
00502
00503
00504 if (cust)
00505 {
00506 GncGUID customer_guid;
00507
00508 customer_guid = *gncCustomerGetGUID(cust);
00509 cw = gnc_find_first_gui_component (DIALOG_EDIT_CUSTOMER_CM_CLASS,
00510 find_handler, &customer_guid);
00511 if (cw)
00512 {
00513 gtk_window_present (GTK_WINDOW(cw->dialog));
00514 return(cw);
00515 }
00516 }
00517
00518
00519 if (cust)
00520 currency = gncCustomerGetCurrency (cust);
00521 else
00522 currency = gnc_default_currency ();
00523
00524
00525
00526
00527 cw = g_new0 (CustomerWindow, 1);
00528
00529 cw->book = bookp;
00530
00531
00532 xml = gnc_glade_xml_new ("customer.glade", "Customer Dialog");
00533 cw->dialog = glade_xml_get_widget (xml, "Customer Dialog");
00534
00535 g_object_set_data (G_OBJECT (cw->dialog), "dialog_info", cw);
00536
00537
00538 cw->id_entry = glade_xml_get_widget (xml, "id_entry");
00539 cw->company_entry = glade_xml_get_widget (xml, "company_entry");
00540
00541 cw->name_entry = glade_xml_get_widget (xml, "name_entry");
00542 cw->addr1_entry = glade_xml_get_widget (xml, "addr1_entry");
00543 cw->addr2_entry = glade_xml_get_widget (xml, "addr2_entry");
00544 cw->addr3_entry = glade_xml_get_widget (xml, "addr3_entry");
00545 cw->addr4_entry = glade_xml_get_widget (xml, "addr4_entry");
00546 cw->phone_entry = glade_xml_get_widget (xml, "phone_entry");
00547 cw->fax_entry = glade_xml_get_widget (xml, "fax_entry");
00548 cw->email_entry = glade_xml_get_widget (xml, "email_entry");
00549
00550 cw->shipname_entry = glade_xml_get_widget (xml, "shipname_entry");
00551 cw->shipaddr1_entry = glade_xml_get_widget (xml, "shipaddr1_entry");
00552 cw->shipaddr2_entry = glade_xml_get_widget (xml, "shipaddr2_entry");
00553 cw->shipaddr3_entry = glade_xml_get_widget (xml, "shipaddr3_entry");
00554 cw->shipaddr4_entry = glade_xml_get_widget (xml, "shipaddr4_entry");
00555 cw->shipphone_entry = glade_xml_get_widget (xml, "shipphone_entry");
00556 cw->shipfax_entry = glade_xml_get_widget (xml, "shipfax_entry");
00557 cw->shipemail_entry = glade_xml_get_widget (xml, "shipemail_entry");
00558
00559 cw->active_check = glade_xml_get_widget (xml, "active_check");
00560 cw->taxincluded_menu = glade_xml_get_widget (xml, "tax_included_menu");
00561 cw->notes_text = glade_xml_get_widget (xml, "notes_text");
00562
00563 cw->terms_menu = glade_xml_get_widget (xml, "terms_menu");
00564
00565 cw->taxtable_check = glade_xml_get_widget (xml, "taxtable_button");
00566 cw->taxtable_menu = glade_xml_get_widget (xml, "taxtable_menu");
00567
00568
00569 edit = gnc_currency_edit_new();
00570 gnc_currency_edit_set_currency (GNC_CURRENCY_EDIT(edit), currency);
00571 cw->currency_edit = edit;
00572
00573 hbox = glade_xml_get_widget (xml, "currency_box");
00574 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
00575
00576
00577 edit = gnc_amount_edit_new();
00578 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE);
00579 print_info = gnc_integral_print_info ();
00580 print_info.max_decimal_places = 5;
00581 gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info);
00582 gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit), 100000);
00583 cw->discount_amount = edit;
00584 gtk_widget_show (edit);
00585
00586 hbox = glade_xml_get_widget (xml, "discount_box");
00587 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
00588
00589
00590 edit = gnc_amount_edit_new();
00591 print_info = gnc_commodity_print_info (currency, FALSE);
00592 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE);
00593 gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info);
00594 gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit),
00595 gnc_commodity_get_fraction (currency));
00596 cw->credit_amount = edit;
00597 gtk_widget_show (edit);
00598
00599 hbox = glade_xml_get_widget (xml, "credit_box");
00600 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
00601
00602
00603 glade_xml_signal_autoconnect_full( xml,
00604 gnc_glade_autoconnect_full_func,
00605 cw);
00606
00607
00608 if (cust != NULL)
00609 {
00610 GtkTextBuffer* text_buffer;
00611 GncAddress *addr, *shipaddr;
00612 const char *string;
00613
00614 cw->dialog_type = EDIT_CUSTOMER;
00615 cw->customer_guid = *gncCustomerGetGUID (cust);
00616
00617 addr = gncCustomerGetAddr (cust);
00618 shipaddr = gncCustomerGetShipAddr (cust);
00619
00620 gtk_entry_set_text (GTK_ENTRY (cw->id_entry), gncCustomerGetID (cust));
00621 gtk_entry_set_text (GTK_ENTRY (cw->company_entry), gncCustomerGetName (cust));
00622
00623
00624 gtk_entry_set_text (GTK_ENTRY (cw->name_entry), gncAddressGetName (addr));
00625 gtk_entry_set_text (GTK_ENTRY (cw->addr1_entry), gncAddressGetAddr1 (addr));
00626 gtk_entry_set_text (GTK_ENTRY (cw->addr2_entry), gncAddressGetAddr2 (addr));
00627 gtk_entry_set_text (GTK_ENTRY (cw->addr3_entry), gncAddressGetAddr3 (addr));
00628 gtk_entry_set_text (GTK_ENTRY (cw->addr4_entry), gncAddressGetAddr4 (addr));
00629 gtk_entry_set_text (GTK_ENTRY (cw->phone_entry), gncAddressGetPhone (addr));
00630 gtk_entry_set_text (GTK_ENTRY (cw->fax_entry), gncAddressGetFax (addr));
00631 gtk_entry_set_text (GTK_ENTRY (cw->email_entry), gncAddressGetEmail (addr));
00632
00633
00634 gtk_entry_set_text (GTK_ENTRY (cw->shipname_entry), gncAddressGetName (shipaddr));
00635 gtk_entry_set_text (GTK_ENTRY (cw->shipaddr1_entry), gncAddressGetAddr1 (shipaddr));
00636 gtk_entry_set_text (GTK_ENTRY (cw->shipaddr2_entry), gncAddressGetAddr2 (shipaddr));
00637 gtk_entry_set_text (GTK_ENTRY (cw->shipaddr3_entry), gncAddressGetAddr3 (shipaddr));
00638 gtk_entry_set_text (GTK_ENTRY (cw->shipaddr4_entry), gncAddressGetAddr4 (shipaddr));
00639 gtk_entry_set_text (GTK_ENTRY (cw->shipphone_entry), gncAddressGetPhone (shipaddr));
00640 gtk_entry_set_text (GTK_ENTRY (cw->shipfax_entry), gncAddressGetFax (shipaddr));
00641 gtk_entry_set_text (GTK_ENTRY (cw->shipemail_entry), gncAddressGetEmail (shipaddr));
00642
00643
00644 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw->active_check),
00645 gncCustomerGetActive (cust));
00646
00647 string = gncCustomerGetNotes (cust);
00648 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(cw->notes_text));
00649 gtk_text_buffer_set_text (text_buffer, string, -1);
00650
00651 cw->component_id =
00652 gnc_register_gui_component (DIALOG_EDIT_CUSTOMER_CM_CLASS,
00653 gnc_customer_window_refresh_handler,
00654 gnc_customer_window_close_handler,
00655 cw);
00656 cw->terms = gncCustomerGetTerms (cust);
00657
00658 }
00659 else
00660 {
00661 cust = gncCustomerCreate (bookp);
00662 cw->customer_guid = *gncCustomerGetGUID (cust);
00663
00664 cw->dialog_type = NEW_CUSTOMER;
00665 cw->component_id =
00666 gnc_register_gui_component (DIALOG_NEW_CUSTOMER_CM_CLASS,
00667 gnc_customer_window_refresh_handler,
00668 gnc_customer_window_close_handler,
00669 cw);
00670
00671
00672 cw->terms = NULL;
00673 }
00674
00675
00676
00677 cw->taxincluded = gncCustomerGetTaxIncluded (cust);
00678 gnc_ui_taxincluded_optionmenu (cw->taxincluded_menu, &cw->taxincluded);
00679 gnc_ui_billterms_optionmenu (cw->terms_menu, bookp, TRUE, &cw->terms);
00680
00681 cw->taxtable = gncCustomerGetTaxTable (cust);
00682 gnc_ui_taxtables_optionmenu (cw->taxtable_menu, bookp, TRUE, &cw->taxtable);
00683 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw->taxtable_check),
00684 gncCustomerGetTaxTableOverride (cust));
00685 gnc_customer_taxtable_check_cb (GTK_TOGGLE_BUTTON (cw->taxtable_check), cw);
00686
00687
00688 cw->addr2_quickfill = gnc_get_shared_address_addr2_quickfill(cw->book, ADDR_QUICKFILL);
00689 cw->addr3_quickfill = gnc_get_shared_address_addr3_quickfill(cw->book, ADDR_QUICKFILL);
00690 cw->addr4_quickfill = gnc_get_shared_address_addr4_quickfill(cw->book, ADDR_QUICKFILL);
00691
00692
00693 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (cw->discount_amount),
00694 gncCustomerGetDiscount (cust));
00695 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (cw->credit_amount),
00696 gncCustomerGetCredit (cust));
00697
00698 gnc_gui_component_watch_entity_type (cw->component_id,
00699 GNC_CUSTOMER_MODULE_NAME,
00700 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
00701
00702 gtk_widget_show_all (cw->dialog);
00703
00704 return cw;
00705 }
00706
00707 CustomerWindow *
00708 gnc_ui_customer_edit (GncCustomer *cust)
00709 {
00710 CustomerWindow *cw;
00711
00712 if (!cust) return NULL;
00713
00714 cw = gnc_customer_new_window (gncCustomerGetBook(cust), cust);
00715
00716 return cw;
00717 }
00718
00719 CustomerWindow *
00720 gnc_ui_customer_new (QofBook *bookp)
00721 {
00722 CustomerWindow *cw;
00723
00724
00725 if (!bookp) return NULL;
00726
00727 cw = gnc_customer_new_window (bookp, NULL);
00728
00729 return cw;
00730 }
00731
00732
00733
00734 static void
00735 invoice_customer_cb (gpointer *cust_p, gpointer user_data)
00736 {
00737 struct _customer_select_window *sw = user_data;
00738 GncOwner owner;
00739 GncCustomer *cust;
00740
00741 g_return_if_fail (cust_p && user_data);
00742
00743 cust = *cust_p;
00744
00745 if (!cust)
00746 return;
00747
00748 gncOwnerInitCustomer (&owner, cust);
00749 gnc_invoice_search (NULL, &owner, sw->book);
00750 return;
00751 }
00752
00753 static void
00754 order_customer_cb (gpointer *cust_p, gpointer user_data)
00755 {
00756 struct _customer_select_window *sw = user_data;
00757 GncOwner owner;
00758 GncCustomer *cust;
00759
00760 g_return_if_fail (cust_p && user_data);
00761
00762 cust = *cust_p;
00763
00764 if (!cust)
00765 return;
00766
00767 gncOwnerInitCustomer (&owner, cust);
00768 gnc_order_search (NULL, &owner, sw->book);
00769 return;
00770 }
00771
00772 static void
00773 jobs_customer_cb (gpointer *cust_p, gpointer user_data)
00774 {
00775 struct _customer_select_window *sw = user_data;
00776 GncOwner owner;
00777 GncCustomer *cust;
00778
00779 g_return_if_fail (cust_p && user_data);
00780
00781 cust = *cust_p;
00782
00783 if (!cust)
00784 return;
00785
00786 gncOwnerInitCustomer (&owner, cust);
00787 gnc_job_search (NULL, &owner, sw->book);
00788 return;
00789 }
00790
00791 static void
00792 payment_customer_cb (gpointer *cust_p, gpointer user_data)
00793 {
00794 struct _customer_select_window *sw = user_data;
00795 GncOwner owner;
00796 GncCustomer *cust;
00797
00798 g_return_if_fail (cust_p && user_data);
00799
00800 cust = *cust_p;
00801
00802 if (!cust)
00803 return;
00804
00805 gncOwnerInitCustomer (&owner, cust);
00806 gnc_ui_payment_new (&owner, sw->book);
00807 return;
00808 }
00809
00810 static void
00811 edit_customer_cb (gpointer *cust_p, gpointer user_data)
00812 {
00813 GncCustomer *cust;
00814
00815 g_return_if_fail (cust_p);
00816 cust = *cust_p;
00817
00818 if (!cust)
00819 return;
00820
00821 gnc_ui_customer_edit (cust);
00822
00823 return;
00824 }
00825
00826 static gpointer
00827 new_customer_cb (gpointer user_data)
00828 {
00829 struct _customer_select_window *sw = user_data;
00830 CustomerWindow *cw;
00831
00832 g_return_val_if_fail (sw, NULL);
00833
00834 cw = gnc_ui_customer_new (sw->book);
00835 return cw_get_customer (cw);
00836 }
00837
00838 static void
00839 free_userdata_cb (gpointer user_data)
00840 {
00841 struct _customer_select_window *sw = user_data;
00842
00843 g_return_if_fail (sw);
00844
00845 qof_query_destroy (sw->q);
00846 g_free (sw);
00847 }
00848
00849 GNCSearchWindow *
00850 gnc_customer_search (GncCustomer *start, QofBook *book)
00851 {
00852 QofQuery *q, *q2 = NULL;
00853 QofIdType type = GNC_CUSTOMER_MODULE_NAME;
00854 struct _customer_select_window *sw;
00855 static GList *params = NULL;
00856 static GList *columns = NULL;
00857 static GNCSearchCallbackButton buttons[] =
00858 {
00859 { N_("View/Edit Customer"), edit_customer_cb},
00860 { N_("Customer's Jobs"), jobs_customer_cb},
00861
00862 { N_("Customer's Invoices"), invoice_customer_cb},
00863 { N_("Process Payment"), payment_customer_cb},
00864 { NULL },
00865 };
00866 (void)order_customer_cb;
00867
00868 g_return_val_if_fail (book, NULL);
00869
00870
00871 if (params == NULL)
00872 {
00873 params = gnc_search_param_prepend (params, _("Shipping Contact"), NULL, type,
00874 CUSTOMER_SHIPADDR, ADDRESS_NAME, NULL);
00875 params = gnc_search_param_prepend (params, _("Billing Contact"), NULL, type,
00876 CUSTOMER_ADDR, ADDRESS_NAME, NULL);
00877 params = gnc_search_param_prepend (params, _("Customer ID"), NULL, type,
00878 CUSTOMER_ID, NULL);
00879 params = gnc_search_param_prepend (params, _("Company Name"), NULL, type,
00880 CUSTOMER_NAME, NULL);
00881 }
00882
00883
00884 if (columns == NULL)
00885 {
00886 columns = gnc_search_param_prepend (columns, _("Contact"), NULL, type,
00887 CUSTOMER_ADDR, ADDRESS_NAME, NULL);
00888 columns = gnc_search_param_prepend (columns, _("Company"), NULL, type,
00889 CUSTOMER_NAME, NULL);
00890 columns = gnc_search_param_prepend (columns, _("ID #"), NULL, type,
00891 CUSTOMER_ID, NULL);
00892 }
00893
00894
00895 q = qof_query_create_for (type);
00896 qof_query_set_book (q, book);
00897
00898 #if 0
00899 if (start)
00900 {
00901 q2 = qof_query_copy (q);
00902 qof_query_add_guid_match (q2, g_slist_prepend (NULL, QOF_PARAM_GUID),
00903 gncCustomerGetGUID (start), QOF_QUERY_AND);
00904 }
00905 #endif
00906
00907
00908 sw = g_new0 (struct _customer_select_window, 1);
00909
00910 sw->book = book;
00911 sw->q = q;
00912
00913 return gnc_search_dialog_create (type, _("Find Customer"),
00914 params, columns, q, q2, buttons, NULL,
00915 new_customer_cb, sw, free_userdata_cb,
00916 GCONF_SECTION_SEARCH, NULL);
00917 }
00918
00919 GNCSearchWindow *
00920 gnc_customer_search_select (gpointer start, gpointer book)
00921 {
00922 if (!book) return NULL;
00923
00924 return gnc_customer_search (start, book);
00925 }
00926
00927 GNCSearchWindow *
00928 gnc_customer_search_edit (gpointer start, gpointer book)
00929 {
00930 if (start)
00931 gnc_ui_customer_edit (start);
00932
00933 return NULL;
00934 }
00935
00936 static gboolean
00937 idle_select_region_addr2(gpointer user_data)
00938 {
00939 CustomerWindow *wdata = user_data;
00940 g_return_val_if_fail(user_data, FALSE);
00941
00942
00943
00944 gtk_editable_select_region(GTK_EDITABLE(wdata->addr2_entry),
00945 wdata->addrX_start_selection,
00946 wdata->addrX_end_selection);
00947
00948 wdata->addrX_selection_source_id = 0;
00949 return FALSE;
00950 }
00951
00952 static gboolean
00953 idle_select_region_addr3(gpointer user_data)
00954 {
00955 CustomerWindow *wdata = user_data;
00956 g_return_val_if_fail(user_data, FALSE);
00957
00958 gtk_editable_select_region(GTK_EDITABLE(wdata->addr3_entry),
00959 wdata->addrX_start_selection,
00960 wdata->addrX_end_selection);
00961
00962 wdata->addrX_selection_source_id = 0;
00963 return FALSE;
00964 }
00965 static gboolean
00966 idle_select_region_addr4(gpointer user_data)
00967 {
00968 CustomerWindow *wdata = user_data;
00969 g_return_val_if_fail(user_data, FALSE);
00970
00971 gtk_editable_select_region(GTK_EDITABLE(wdata->addr4_entry),
00972 wdata->addrX_start_selection,
00973 wdata->addrX_end_selection);
00974 wdata->addrX_selection_source_id = 0;
00975 return FALSE;
00976 }
00977
00978 static gboolean
00979 idle_select_region_shipaddr2(gpointer user_data)
00980 {
00981 CustomerWindow *wdata = user_data;
00982 g_return_val_if_fail(user_data, FALSE);
00983
00984 gtk_editable_select_region(GTK_EDITABLE(wdata->shipaddr2_entry),
00985 wdata->addrX_start_selection,
00986 wdata->addrX_end_selection);
00987
00988 wdata->addrX_selection_source_id = 0;
00989 return FALSE;
00990 }
00991
00992 static gboolean
00993 idle_select_region_shipaddr3(gpointer user_data)
00994 {
00995 CustomerWindow *wdata = user_data;
00996 g_return_val_if_fail(user_data, FALSE);
00997
00998 gtk_editable_select_region(GTK_EDITABLE(wdata->shipaddr3_entry),
00999 wdata->addrX_start_selection,
01000 wdata->addrX_end_selection);
01001
01002 wdata->addrX_selection_source_id = 0;
01003 return FALSE;
01004 }
01005 static gboolean
01006 idle_select_region_shipaddr4(gpointer user_data)
01007 {
01008 CustomerWindow *wdata = user_data;
01009 g_return_val_if_fail(user_data, FALSE);
01010
01011 gtk_editable_select_region(GTK_EDITABLE(wdata->shipaddr4_entry),
01012 wdata->addrX_start_selection,
01013 wdata->addrX_end_selection);
01014 wdata->addrX_selection_source_id = 0;
01015 return FALSE;
01016 }
01017
01018
01019
01020 static gboolean
01021 gnc_customer_addr_common_insert_cb(GtkEditable *editable,
01022 gchar *new_text, gint new_text_length,
01023 gint *position, gpointer user_data, QuickFill *qf)
01024 {
01025 CustomerWindow *wdata = user_data;
01026 gchar *concatenated_text;
01027 QuickFill *match;
01028 const gchar *match_str;
01029 gint prefix_len, concatenated_text_len;
01030
01031 if (new_text_length <= 0)
01032 return FALSE;
01033
01034
01035
01036 {
01037 gchar *suffix = gtk_editable_get_chars(editable, *position, -1);
01038
01039 if (*suffix)
01040 {
01041 g_free(suffix);
01042 return FALSE;
01043 }
01044 g_free(suffix);
01045 }
01046
01047 {
01048 gchar *prefix = gtk_editable_get_chars(editable, 0, *position);
01049 prefix_len = strlen(prefix);
01050 concatenated_text = g_strconcat(prefix, new_text, (gchar*) NULL);
01051 concatenated_text_len = prefix_len + new_text_length;
01052 g_free(prefix);
01053 }
01054
01055 match = gnc_quickfill_get_string_match(qf, concatenated_text);
01056 g_free(concatenated_text);
01057 if (match)
01058 {
01059 const char* match_str = gnc_quickfill_string(match);
01060 if (match_str)
01061 {
01062 gint match_str_len = strlen(match_str);
01063 if (match_str_len > concatenated_text_len)
01064 {
01065
01066
01067 g_signal_handlers_block_matched (G_OBJECT (editable),
01068 G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, user_data);
01069
01070 gtk_editable_insert_text(editable,
01071 match_str + prefix_len,
01072 match_str_len - prefix_len,
01073 position);
01074
01075 g_signal_handlers_unblock_matched (G_OBJECT (editable),
01076 G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, user_data);
01077
01078
01079 g_signal_stop_emission_by_name (G_OBJECT (editable), "insert_text");
01080
01081
01082 *position = concatenated_text_len;
01083
01084
01085
01086 wdata->addrX_start_selection = *position;
01087 wdata->addrX_end_selection = -1;
01088
01089 return TRUE;
01090 }
01091 }
01092 }
01093 return FALSE;
01094 }
01095
01096 void gnc_customer_addr2_insert_cb(GtkEditable *editable,
01097 gchar *new_text, gint new_text_length,
01098 gint *position, gpointer user_data)
01099 {
01100 CustomerWindow *wdata = user_data;
01101 gboolean r;
01102
01103
01104
01105 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
01106 position, user_data, wdata->addr2_quickfill);
01107
01108
01109 if (r)
01110 {
01111
01112
01113 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_addr2,
01114 user_data);
01115 }
01116 }
01117
01118 void gnc_customer_addr3_insert_cb(GtkEditable *editable,
01119 gchar *new_text, gint new_text_length,
01120 gint *position, gpointer user_data)
01121 {
01122 CustomerWindow *wdata = user_data;
01123 gboolean r;
01124
01125
01126
01127 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
01128 position, user_data, wdata->addr3_quickfill);
01129
01130
01131 if (r)
01132 {
01133 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_addr3,
01134 user_data);
01135 }
01136 }
01137
01138 void gnc_customer_addr4_insert_cb(GtkEditable *editable,
01139 gchar *new_text, gint new_text_length,
01140 gint *position, gpointer user_data)
01141 {
01142 CustomerWindow *wdata = user_data;
01143 gboolean r;
01144
01145
01146
01147 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
01148 position, user_data, wdata->addr4_quickfill);
01149
01150
01151 if (r)
01152 {
01153 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_addr4,
01154 user_data);
01155 }
01156 }
01157
01158 void gnc_customer_shipaddr2_insert_cb(GtkEditable *editable,
01159 gchar *new_text, gint new_text_length,
01160 gint *position, gpointer user_data)
01161 {
01162 CustomerWindow *wdata = user_data;
01163 gboolean r;
01164
01165
01166
01167 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
01168 position, user_data, wdata->addr2_quickfill);
01169
01170
01171 if (r)
01172 {
01173 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_shipaddr2,
01174 user_data);
01175 }
01176 }
01177
01178 void gnc_customer_shipaddr3_insert_cb(GtkEditable *editable,
01179 gchar *new_text, gint new_text_length,
01180 gint *position, gpointer user_data)
01181 {
01182 CustomerWindow *wdata = user_data;
01183 gboolean r;
01184
01185
01186
01187 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
01188 position, user_data, wdata->addr3_quickfill);
01189
01190
01191 if (r)
01192 {
01193 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_shipaddr3,
01194 user_data);
01195 }
01196 }
01197
01198 void gnc_customer_shipaddr4_insert_cb(GtkEditable *editable,
01199 gchar *new_text, gint new_text_length,
01200 gint *position, gpointer user_data)
01201 {
01202 CustomerWindow *wdata = user_data;
01203 gboolean r;
01204
01205
01206
01207 r = gnc_customer_addr_common_insert_cb(editable, new_text, new_text_length,
01208 position, user_data, wdata->addr4_quickfill);
01209
01210
01211 if (r)
01212 {
01213 wdata->addrX_selection_source_id = g_idle_add(idle_select_region_shipaddr4,
01214 user_data);
01215 }
01216 }
01217
01218 static gboolean
01219 gnc_customer_common_key_press_cb( GtkEntry *entry,
01220 GdkEventKey *event,
01221 gpointer user_data, GtkWidget* editable )
01222 {
01223 gboolean done_with_input = FALSE;
01224
01225
01226
01227
01228
01229 switch ( event->keyval )
01230 {
01231 case GDK_Tab:
01232 case GDK_ISO_Left_Tab:
01233 if ( !( event->state & GDK_SHIFT_MASK) )
01234
01235 {
01236
01237
01238
01239 gtk_editable_select_region( GTK_EDITABLE(editable),
01240 0, 0 );
01241 }
01242 break;
01243 }
01244
01245 return( done_with_input );
01246 }
01247 gboolean
01248 gnc_customer_addr2_key_press_cb( GtkEntry *entry,
01249 GdkEventKey *event,
01250 gpointer user_data )
01251 {
01252 CustomerWindow *wdata = user_data;
01253 return gnc_customer_common_key_press_cb(entry, event, user_data,
01254 wdata->addr2_entry);
01255 }
01256 gboolean
01257 gnc_customer_addr3_key_press_cb( GtkEntry *entry,
01258 GdkEventKey *event,
01259 gpointer user_data )
01260 {
01261 CustomerWindow *wdata = user_data;
01262 return gnc_customer_common_key_press_cb(entry, event, user_data,
01263 wdata->addr3_entry);
01264 }
01265 gboolean
01266 gnc_customer_addr4_key_press_cb( GtkEntry *entry,
01267 GdkEventKey *event,
01268 gpointer user_data )
01269 {
01270 CustomerWindow *wdata = user_data;
01271 return gnc_customer_common_key_press_cb(entry, event, user_data,
01272 wdata->addr4_entry);
01273 }
01274 gboolean
01275 gnc_customer_shipaddr2_key_press_cb( GtkEntry *entry,
01276 GdkEventKey *event,
01277 gpointer user_data )
01278 {
01279 CustomerWindow *wdata = user_data;
01280 return gnc_customer_common_key_press_cb(entry, event, user_data,
01281 wdata->shipaddr2_entry);
01282 }
01283 gboolean
01284 gnc_customer_shipaddr3_key_press_cb( GtkEntry *entry,
01285 GdkEventKey *event,
01286 gpointer user_data )
01287 {
01288 CustomerWindow *wdata = user_data;
01289 return gnc_customer_common_key_press_cb(entry, event, user_data,
01290 wdata->shipaddr3_entry);
01291 }
01292 gboolean
01293 gnc_customer_shipaddr4_key_press_cb( GtkEntry *entry,
01294 GdkEventKey *event,
01295 gpointer user_data )
01296 {
01297 CustomerWindow *wdata = user_data;
01298 return gnc_customer_common_key_press_cb(entry, event, user_data,
01299 wdata->shipaddr4_entry);
01300 }