27 #include <glib/gi18n.h>
29 #include "dialog-utils.h"
30 #include "gnc-component-manager.h"
31 #include "gnc-date-edit.h"
33 #include "gnc-gui-query.h"
36 #include "gnucash-sheet.h"
37 #include "dialog-search.h"
38 #include "search-param.h"
41 #include "gncOrderP.h"
43 #include "gncEntryLedger.h"
45 #include "dialog-order.h"
46 #include "dialog-invoice.h"
47 #include "business-gnome-utils.h"
48 #include "dialog-date-close.h"
49 #include "gnome-search/gnc-general-search.h"
51 #define DIALOG_NEW_ORDER_CM_CLASS "dialog-new-order"
52 #define DIALOG_EDIT_ORDER_CM_CLASS "dialog-edit-order"
53 #define DIALOG_VIEW_ORDER_CM_CLASS "dialog-view-order"
55 #define GNC_PREFS_GROUP_SEARCH "dialogs.business.order-search"
57 void gnc_order_window_ok_cb (GtkWidget *widget, gpointer data);
58 void gnc_order_window_cancel_cb (GtkWidget *widget, gpointer data);
59 void gnc_order_window_help_cb (GtkWidget *widget, gpointer data);
60 void gnc_order_window_invoice_cb (GtkWidget *widget, gpointer data);
61 void gnc_order_window_close_order_cb (GtkWidget *widget, gpointer data);
62 void gnc_order_window_destroy_cb (GtkWidget *widget, gpointer data);
84 GtkWidget * ref_entry;
85 GtkWidget * notes_text;
86 GtkWidget * opened_date;
87 GtkWidget * closed_date;
88 GtkWidget * active_check;
93 GtkWidget * close_order_button;
95 GtkWidget * owner_box;
96 GtkWidget * owner_label;
97 GtkWidget * owner_choice;
102 OrderDialogType dialog_type;
111 static void gnc_order_update_window (
OrderWindow *ow);
119 return gncOrderLookup (ow->book, &ow->order_guid);
124 GtkTextBuffer* text_buffer;
125 GtkTextIter start, end;
130 if (ow->dialog_type == VIEW_ORDER)
133 gnc_suspend_gui_refresh ();
134 gncOrderBeginEdit (order);
136 gncOrderSetID (order, gtk_editable_get_chars
137 (GTK_EDITABLE (ow->id_entry), 0, -1));
139 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(ow->notes_text));
140 gtk_text_buffer_get_bounds (text_buffer, &start, &end);
141 text = gtk_text_buffer_get_text (text_buffer, &start, &end, FALSE);
142 gncOrderSetNotes (order, text);
144 gncOrderSetReference (order, gtk_editable_get_chars
145 (GTK_EDITABLE (ow->ref_entry), 0, -1));
147 ts = gnc_date_edit_get_date_ts (GNC_DATE_EDIT (ow->opened_date));
148 gncOrderSetDateOpened (order, ts);
150 if (ow->active_check)
151 gncOrderSetActive (order, gtk_toggle_button_get_active
152 (GTK_TOGGLE_BUTTON (ow->active_check)));
154 gnc_owner_get_owner (ow->owner_choice, &(ow->owner));
155 gncOrderSetOwner (order, &(ow->owner));
157 gncOrderCommitEdit (order);
158 gnc_resume_gui_refresh ();
167 res = gtk_entry_get_text (GTK_ENTRY (ow->id_entry));
168 if (g_strcmp0 (res,
"") == 0)
170 gnc_error_dialog (ow->dialog,
"%s",
171 _(
"The Order must be given an ID."));
176 gnc_owner_get_owner (ow->owner_choice, &(ow->owner));
177 res = gncOwnerGetName (&(ow->owner));
178 if (res == NULL || g_strcmp0 (res,
"") == 0)
180 gnc_error_dialog (ow->dialog,
"%s",
181 _(
"You need to supply Billing Information."));
191 if (!gnc_entry_ledger_check_close (ow->dialog, ow->ledger))
194 if (!gnc_order_window_verify_ok (ow))
199 GncOrder *order = ow_get_order (ow);
202 gnc_ui_to_order (ow, order);
205 ow->created_order = order;
211 gnc_order_window_ok_cb (GtkWidget *widget, gpointer data)
215 if (!gnc_order_window_ok_save (ow))
221 gnc_close_gui_component (ow->component_id);
225 gnc_order_window_cancel_cb (GtkWidget *widget, gpointer data)
229 gnc_close_gui_component (ow->component_id);
233 gnc_order_window_help_cb (GtkWidget *widget, gpointer data)
239 gnc_order_window_invoice_cb (GtkWidget *widget, gpointer data)
244 if (!gnc_order_window_verify_ok (ow))
248 gnc_invoice_search (NULL, &(ow->owner), ow->book);
251 gnc_order_update_window (ow);
255 gnc_order_window_close_order_cb (GtkWidget *widget, gpointer data)
260 char *message, *label;
261 gboolean non_inv = FALSE;
265 if (!gnc_order_window_verify_ok (ow))
269 order = ow_get_order (ow);
274 if (gncOrderGetEntries (order) == NULL)
276 gnc_error_dialog (ow->dialog,
"%s",
277 _(
"The Order must have at least one Entry."));
282 entries = gncOrderGetEntries (order);
283 for ( ; entries ; entries = entries->next)
286 if (gncEntryGetInvoice (entry) == NULL)
299 message = _(
"This order contains entries that have not been invoiced. "
300 "Are you sure you want to close it out before "
301 "you invoice all the entries?");
303 if (gnc_verify_dialog (ow->dialog, FALSE,
"%s", message) == FALSE)
308 message = _(
"Do you really want to close the order?");
309 label = _(
"Close Date");
312 if (!gnc_dialog_date_close_parented (ow->dialog, message, label, TRUE, &ts))
315 gncOrderSetDateClosed (order, ts);
318 gnc_order_window_ok_save (ow);
321 ow->dialog_type = VIEW_ORDER;
322 gnc_entry_ledger_set_readonly (ow->ledger, TRUE);
325 gnc_order_update_window (ow);
329 gnc_order_window_destroy_cb (GtkWidget *widget, gpointer data)
332 GncOrder *order = ow_get_order (ow);
334 gnc_suspend_gui_refresh ();
336 if (ow->dialog_type == NEW_ORDER && order != NULL)
338 gncOrderBeginEdit (order);
339 gncOrderDestroy (order);
344 gnc_entry_ledger_destroy (ow->ledger);
345 gnc_unregister_gui_component (ow->component_id);
346 gnc_resume_gui_refresh ();
352 gnc_order_owner_changed_cb (GtkWidget *widget, gpointer data)
360 if (ow->dialog_type == VIEW_ORDER)
363 gnc_owner_get_owner (ow->owner_choice, &(ow->owner));
366 order = ow_get_order (ow);
367 gncOrderSetOwner (order, &(ow->owner));
369 if (ow->dialog_type == EDIT_ORDER)
377 char const *msg = gncJobGetReference (
gncOwnerGetJob (&(ow->owner)));
378 gtk_entry_set_text (GTK_ENTRY (ow->ref_entry), msg ? msg :
"");
382 gtk_entry_set_text (GTK_ENTRY (ow->ref_entry),
"");
390 gnc_order_window_close_handler (gpointer user_data)
394 gtk_widget_destroy (ow->dialog);
398 gnc_order_window_refresh_handler (GHashTable *changes, gpointer user_data)
402 GncOrder *order = ow_get_order (ow);
407 gnc_close_gui_component (ow->component_id);
414 info = gnc_gui_get_entity_events (changes, &ow->order_guid);
415 if (info && (info->event_mask & QOF_EVENT_DESTROY))
417 gnc_close_gui_component (ow->component_id);
428 gboolean hide_cd = FALSE;
430 order = ow_get_order (ow);
431 owner = gncOrderGetOwner (order);
433 if (ow->owner_choice)
435 gtk_container_remove (GTK_CONTAINER (ow->owner_box), ow->owner_choice);
436 gtk_widget_destroy (ow->owner_choice);
439 switch (ow->dialog_type)
444 gnc_owner_edit_create (ow->owner_label, ow->owner_box, ow->book,
449 gnc_owner_select_create (ow->owner_label, ow->owner_box, ow->book,
454 g_signal_connect (ow->owner_choice,
"changed",
455 G_CALLBACK (gnc_order_owner_changed_cb),
458 gtk_widget_show_all (ow->dialog);
461 GtkTextBuffer* text_buffer;
465 gtk_entry_set_text (GTK_ENTRY (ow->ref_entry),
466 gncOrderGetReference (order));
468 string = gncOrderGetNotes (order);
469 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(ow->notes_text));
470 gtk_text_buffer_set_text (text_buffer,
string, -1);
472 ts = gncOrderGetDateOpened (order);
475 gnc_date_edit_set_time (GNC_DATE_EDIT (ow->opened_date),
480 gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ow->opened_date), ts);
484 if (ow->dialog_type == NEW_ORDER)
487 ts = gncOrderGetDateClosed (order);
490 gnc_date_edit_set_time (GNC_DATE_EDIT (ow->closed_date),
496 gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ow->closed_date), ts);
499 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ow->active_check),
500 gncOrderGetActive (order));
504 gnc_gui_component_watch_entity_type (ow->component_id,
505 GNC_ORDER_MODULE_NAME,
506 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
508 gnc_table_refresh_gui (gnc_entry_ledger_get_table (ow->ledger), TRUE);
512 gtk_widget_hide (ow->closed_date);
513 gtk_widget_hide (ow->cd_label);
514 gtk_widget_hide (ow->hide1);
515 gtk_widget_hide (ow->hide2);
518 if (ow->dialog_type == VIEW_ORDER)
521 gtk_widget_set_sensitive (ow->id_entry, FALSE);
522 gtk_widget_set_sensitive (ow->opened_date, FALSE);
523 gtk_widget_set_sensitive (ow->closed_date, FALSE);
524 gtk_widget_set_sensitive (ow->notes_text, FALSE);
527 gtk_widget_hide (ow->close_order_button);
532 find_handler (gpointer
find_data, gpointer user_data)
534 const GncGUID *order_guid = find_data;
537 return(ow &&
guid_equal(&ow->order_guid, order_guid));
541 gnc_order_new_window (
QofBook *bookp, OrderDialogType type,
546 GtkWidget *vbox, *regWidget, *hbox, *date;
548 const char * class_name;
553 class_name = DIALOG_EDIT_ORDER_CM_CLASS;
557 class_name = DIALOG_VIEW_ORDER_CM_CLASS;
569 order_guid = *gncOrderGetGUID(order);
570 ow = gnc_find_first_gui_component (class_name, find_handler,
574 gtk_window_present (GTK_WINDOW(ow->dialog));
584 ow->dialog_type = type;
587 gncOwnerCopy (owner, &(ow->owner));
590 builder = gtk_builder_new();
591 gnc_builder_add_from_file (builder,
"dialog-order.glade",
"Order Entry Dialog");
592 ow->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"Order Entry Dialog"));
595 ow->id_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"id_entry"));
596 ow->ref_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"ref_entry"));
597 ow->notes_text = GTK_WIDGET(gtk_builder_get_object (builder,
"notes_text"));
598 ow->active_check = GTK_WIDGET(gtk_builder_get_object (builder,
"active_check"));
599 ow->owner_box = GTK_WIDGET(gtk_builder_get_object (builder,
"owner_hbox"));
600 ow->owner_label = GTK_WIDGET(gtk_builder_get_object (builder,
"owner_label"));
602 ow->cd_label = GTK_WIDGET(gtk_builder_get_object (builder,
"cd_label"));
603 ow->hide1 = GTK_WIDGET(gtk_builder_get_object (builder,
"hide1"));
604 ow->hide2 = GTK_WIDGET(gtk_builder_get_object (builder,
"hide2"));
605 ow->close_order_button = GTK_WIDGET(gtk_builder_get_object (builder,
"close_order_button"));
609 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"opened_date_hbox"));
610 date = gnc_date_edit_new (time (NULL), FALSE, FALSE);
611 gtk_box_pack_start (GTK_BOX (hbox), date, TRUE, TRUE, 0);
612 gtk_widget_show (date);
613 ow->opened_date = date;
615 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"closed_date_hbox"));
616 date = gnc_date_edit_new (time (NULL), FALSE, FALSE);
617 gtk_box_pack_start (GTK_BOX (hbox), date, TRUE, TRUE, 0);
618 gtk_widget_show (date);
619 ow->closed_date = date;
625 entry_ledger = gnc_entry_ledger_new (ow->book, GNCENTRY_ORDER_ENTRY);
629 entry_ledger = gnc_entry_ledger_new (ow->book, GNCENTRY_ORDER_VIEWER);
634 ow->ledger = entry_ledger;
637 gnc_entry_ledger_set_default_order (entry_ledger, order);
644 regWidget = gnucash_register_new (gnc_entry_ledger_get_table (entry_ledger));
646 ow->reg = GNUCASH_REGISTER (regWidget);
647 gnucash_sheet_set_window (gnucash_register_get_sheet (ow->reg), ow->dialog);
648 gnc_entry_ledger_set_parent (entry_ledger, ow->dialog);
650 vbox = GTK_WIDGET(gtk_builder_get_object (builder,
"ledger_vbox"));
652 gtk_box_pack_start (GTK_BOX(vbox), regWidget, TRUE, TRUE, 2);
655 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ow);
658 ow->order_guid = *gncOrderGetGUID (order);
660 gtk_entry_set_text (GTK_ENTRY (ow->id_entry), gncOrderGetID (order));
663 gnc_register_gui_component (class_name,
664 gnc_order_window_refresh_handler,
665 gnc_order_window_close_handler,
668 gnc_table_realize_gui (gnc_entry_ledger_get_table (entry_ledger));
671 gnc_order_update_window (ow);
674 gnc_order_owner_changed_cb (ow->owner_choice, ow);
676 g_object_unref(G_OBJECT(builder));
688 GtkWidget *hbox, *date;
692 ow->dialog_type = NEW_ORDER;
694 order = gncOrderCreate (bookp);
695 gncOrderSetOwner (order, owner);
698 gncOwnerCopy (owner, &(ow->owner));
701 builder = gtk_builder_new();
702 gnc_builder_add_from_file (builder,
"dialog-order.glade",
"New Order Dialog");
704 ow->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"New Order Dialog"));
706 g_object_set_data (G_OBJECT (ow->dialog),
"dialog_info", ow);
709 ow->id_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"entry_id"));
710 ow->ref_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"entry_ref"));
711 ow->notes_text = GTK_WIDGET(gtk_builder_get_object (builder,
"text_notes"));
712 ow->owner_box = GTK_WIDGET(gtk_builder_get_object (builder,
"bill_owner_hbox"));
713 ow->owner_label = GTK_WIDGET(gtk_builder_get_object (builder,
"bill_owner_label"));
716 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"date_opened_hbox"));
717 date = gnc_date_edit_new (time (NULL), FALSE, FALSE);
718 gtk_box_pack_start (GTK_BOX (hbox), date, TRUE, TRUE, 0);
719 gtk_widget_show (date);
720 ow->opened_date = date;
723 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ow);
726 ow->order_guid = *gncOrderGetGUID (order);
727 string = gncOrderNextID(bookp);
728 gtk_entry_set_text (GTK_ENTRY (ow->id_entry),
string);
732 gnc_register_gui_component (DIALOG_NEW_ORDER_CM_CLASS,
733 gnc_order_window_refresh_handler,
734 gnc_order_window_close_handler,
738 gnc_order_update_window (ow);
741 if (GNC_IS_GENERAL_SEARCH(ow->owner_choice))
743 gnc_general_search_grab_focus(GNC_GENERAL_SEARCH(ow->owner_choice));
747 gnc_order_owner_changed_cb (ow->owner_choice, ow);
749 g_object_unref(G_OBJECT(builder));
758 OrderDialogType type;
760 if (!order)
return NULL;
764 Timespec ts = gncOrderGetDateClosed (order);
765 if (ts.tv_sec || ts.tv_nsec)
769 ow = gnc_order_new_window (gncOrderGetBook(order), type, order,
770 gncOrderGetOwner (order));
785 case GNC_OWNER_CUSTOMER:
786 case GNC_OWNER_VENDOR:
788 gncOwnerCopy (ownerp, &owner);
791 g_warning (
"Cannot deal with unknown Owner types");
797 gncOwnerInitJob (&owner, NULL);
800 if (!bookp)
return NULL;
802 ow = gnc_order_window_new_order (bookp, &owner);
810 edit_order_cb (gpointer *order_p, gpointer user_data)
814 g_return_if_fail (order_p && user_data);
819 gnc_ui_order_edit (order);
825 new_order_cb (gpointer user_data)
830 g_return_val_if_fail (user_data, NULL);
832 ow = gnc_ui_order_new (sw->owner, sw->book);
833 return ow_get_order (ow);
837 free_order_cb (gpointer user_data)
841 g_return_if_fail (sw);
853 static GList *params = NULL;
854 static GList *columns = NULL;
857 { N_(
"View/Edit Order"), edit_order_cb, NULL, TRUE},
861 g_return_val_if_fail (book, NULL);
866 params = gnc_search_param_prepend (params, _(
"Order Notes"), NULL, type,
868 params = gnc_search_param_prepend (params, _(
"Date Closed"), NULL, type,
870 params = gnc_search_param_prepend (params, _(
"Is Closed?"), NULL, type,
871 ORDER_IS_CLOSED, NULL);
872 params = gnc_search_param_prepend (params, _(
"Date Opened"), NULL, type,
874 params = gnc_search_param_prepend (params, _(
"Owner Name "), NULL, type,
875 ORDER_OWNER, OWNER_NAME, NULL);
876 params = gnc_search_param_prepend (params, _(
"Order ID"), NULL, type,
883 columns = gnc_search_param_prepend (columns, _(
"Billing ID"), NULL, type,
884 ORDER_REFERENCE, NULL);
885 columns = gnc_search_param_prepend (columns, _(
"Company"), NULL, type,
886 ORDER_OWNER, OWNER_PARENT,
888 columns = gnc_search_param_prepend (columns, _(
"Closed"), NULL, type,
890 columns = gnc_search_param_prepend (columns, _(
"Opened"), NULL, type,
892 columns = gnc_search_param_prepend (columns, _(
"Num"), NULL, type,
897 q = qof_query_create_for (type);
907 q3 = qof_query_create_for (type);
909 (g_slist_prepend (NULL, QOF_PARAM_GUID),
913 (g_slist_prepend (NULL, OWNER_PARENTG),
931 gncOrderGetGUID (start), QOF_QUERY_AND);
940 gncOwnerCopy (owner, &(sw->owner_def));
941 sw->owner = &(sw->owner_def);
946 return gnc_search_dialog_create (type, _(
"Find Order"),
947 params, columns, q, q2,
948 buttons, NULL, new_order_cb,
949 sw, free_order_cb, GNC_PREFS_GROUP_SEARCH,
954 gnc_order_search_select (gpointer start, gpointer book)
959 if (!book)
return NULL;
963 ownerp = gncOrderGetOwner (o);
964 gncOwnerCopy (ownerp, &owner);
967 gncOwnerInitCustomer (&owner, NULL);
969 return gnc_order_search (start, NULL, book);
973 gnc_order_search_edit (gpointer start, gpointer book)
976 gnc_ui_order_edit (start);
const GncGUID * gncOwnerGetGUID(const GncOwner *owner)
utility functions for the GnuCash UI
gboolean timespec_equal(const Timespec *ta, const Timespec *tb)
QofQuery * qof_query_copy(QofQuery *q)
Use a 64-bit unsigned int timespec.
struct _QofQuery QofQuery
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)
QofQuery * qof_query_merge(QofQuery *q1, QofQuery *q2, QofQueryOp op)
void gnc_table_init_gui(GtkWidget *widget, gchar *state_section)
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)
GncOwnerType gncOwnerGetType(const GncOwner *owner)
GncJob * gncOwnerGetJob(const GncOwner *owner)
const GncGUID * guid_null(void)
time64 gnc_time(time64 *tbuf)
get the current local time
void timespecFromTime64(Timespec *ts, time64 t)