27 #include <glib/gi18n.h> 30 #include "dialog-utils.h" 31 #include "gnc-component-manager.h" 32 #include "gnc-date-edit.h" 34 #include "gnc-gui-query.h" 37 #include "gnucash-register.h" 39 #include "dialog-search.h" 40 #include "search-param.h" 43 #include "gncOrderP.h" 47 #include "dialog-order.h" 48 #include "dialog-invoice.h" 49 #include "business-gnome-utils.h" 50 #include "dialog-date-close.h" 51 #include "gnc-general-search.h" 53 #define DIALOG_NEW_ORDER_CM_CLASS "dialog-new-order" 54 #define DIALOG_EDIT_ORDER_CM_CLASS "dialog-edit-order" 55 #define DIALOG_VIEW_ORDER_CM_CLASS "dialog-view-order" 57 #define GNC_PREFS_GROUP_SEARCH "dialogs.business.order-search" 59 void gnc_order_window_ok_cb (GtkWidget *widget, gpointer data);
60 void gnc_order_window_cancel_cb (GtkWidget *widget, gpointer data);
61 void gnc_order_window_help_cb (GtkWidget *widget, gpointer data);
62 void gnc_order_window_invoice_cb (GtkWidget *widget, gpointer data);
63 void gnc_order_window_close_order_cb (GtkWidget *widget, gpointer data);
64 void gnc_order_window_destroy_cb (GtkWidget *widget, gpointer data);
86 GtkWidget * ref_entry;
87 GtkWidget * notes_text;
88 GtkWidget * opened_date;
89 GtkWidget * closed_date;
90 GtkWidget * active_check;
93 GtkWidget * close_order_button;
95 GtkWidget * owner_box;
96 GtkWidget * owner_label;
97 GtkWidget * owner_choice;
99 GnucashRegister * reg;
100 GncEntryLedger * ledger;
102 OrderDialogType dialog_type;
106 GncOrder * created_order;
111 static void gnc_order_update_window (OrderWindow *ow);
114 ow_get_order (OrderWindow *ow)
119 return gncOrderLookup (ow->book, &ow->order_guid);
122 static void gnc_ui_to_order (OrderWindow *ow, GncOrder *order)
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_entry_get_text (GTK_ENTRY (ow->id_entry)));
138 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(ow->notes_text));
139 gtk_text_buffer_get_bounds (text_buffer, &start, &end);
140 text = gtk_text_buffer_get_text (text_buffer, &start, &end, FALSE);
141 gncOrderSetNotes (order, text);
143 gncOrderSetReference (order, gtk_entry_get_text (GTK_ENTRY (ow->ref_entry)));
145 tt = gnc_date_edit_get_date (GNC_DATE_EDIT (ow->opened_date));
146 gncOrderSetDateOpened (order, tt);
148 if (ow->active_check)
149 gncOrderSetActive (order, gtk_toggle_button_get_active
150 (GTK_TOGGLE_BUTTON (ow->active_check)));
152 gnc_owner_get_owner (ow->owner_choice, &(ow->owner));
153 gncOrderSetOwner (order, &(ow->owner));
155 gncOrderCommitEdit (order);
156 gnc_resume_gui_refresh ();
161 gnc_order_window_verify_ok (OrderWindow *ow)
166 res = gtk_entry_get_text (GTK_ENTRY (ow->id_entry));
167 if (g_strcmp0 (res,
"") == 0)
169 gnc_error_dialog (GTK_WINDOW (ow->dialog),
"%s",
170 _(
"The Order must be given an ID."));
175 gnc_owner_get_owner (ow->owner_choice, &(ow->owner));
176 res = gncOwnerGetName (&(ow->owner));
177 if (res == NULL || g_strcmp0 (res,
"") == 0)
179 gnc_error_dialog (GTK_WINDOW (ow->dialog),
"%s",
180 _(
"You need to supply Billing Information."));
188 gnc_order_window_ok_save (OrderWindow *ow)
193 if (!gnc_order_window_verify_ok (ow))
198 GncOrder *order = ow_get_order (ow);
201 gnc_ui_to_order (ow, order);
204 ow->created_order = order;
210 gnc_order_window_ok_cb (GtkWidget *widget, gpointer data)
212 OrderWindow *ow = data;
214 if (!gnc_order_window_ok_save (ow))
220 gnc_close_gui_component (ow->component_id);
224 gnc_order_window_cancel_cb (GtkWidget *widget, gpointer data)
226 OrderWindow *ow = data;
228 gnc_close_gui_component (ow->component_id);
232 gnc_order_window_help_cb (GtkWidget *widget, gpointer data)
234 OrderWindow *ow = data;
235 gnc_gnome_help (GTK_WINDOW(ow->dialog), DF_MANUAL, DL_USAGE_BILL);
239 gnc_order_window_invoice_cb (GtkWidget *widget, gpointer data)
241 OrderWindow *ow = data;
244 if (!gnc_order_window_verify_ok (ow))
248 gnc_invoice_search (gtk_window_get_transient_for(GTK_WINDOW(ow->dialog)), NULL, &(ow->owner), ow->book);
251 gnc_order_update_window (ow);
255 gnc_order_window_close_order_cb (GtkWidget *widget, gpointer data)
257 OrderWindow *ow = 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 (GTK_WINDOW (ow->dialog),
"%s",
277 _(
"The Order must have at least one Entry."));
282 entries = gncOrderGetEntries (order);
283 for ( ; entries ; entries = entries->next)
285 GncEntry *entry = entries->data;
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 (GTK_WINDOW (ow->dialog), FALSE,
"%s", message) == FALSE)
308 message = _(
"Do you really want to close the order?");
309 label = _(
"Close Date");
311 if (!gnc_dialog_date_close_parented (ow->dialog, message, label, TRUE, &t))
314 gncOrderSetDateClosed (order, t);
317 gnc_order_window_ok_save (ow);
320 ow->dialog_type = VIEW_ORDER;
321 gnc_entry_ledger_set_readonly (ow->ledger, TRUE);
324 gnc_order_update_window (ow);
328 gnc_order_window_destroy_cb (GtkWidget *widget, gpointer data)
330 OrderWindow *ow = data;
331 GncOrder *order = ow_get_order (ow);
333 gnc_suspend_gui_refresh ();
335 if (ow->dialog_type == NEW_ORDER && order != NULL)
337 gncOrderBeginEdit (order);
338 gncOrderDestroy (order);
344 gnc_unregister_gui_component (ow->component_id);
345 gnc_resume_gui_refresh ();
351 gnc_order_owner_changed_cb (GtkWidget *widget, gpointer data)
353 OrderWindow *ow = data;
359 if (ow->dialog_type == VIEW_ORDER)
362 gnc_owner_get_owner (ow->owner_choice, &(ow->owner));
365 order = ow_get_order (ow);
366 gncOrderSetOwner (order, &(ow->owner));
368 if (ow->dialog_type == EDIT_ORDER)
376 char const *msg = gncJobGetReference (
gncOwnerGetJob (&(ow->owner)));
377 gtk_entry_set_text (GTK_ENTRY (ow->ref_entry), msg ? msg :
"");
381 gtk_entry_set_text (GTK_ENTRY (ow->ref_entry),
"");
389 gnc_order_window_close_handler (gpointer user_data)
391 OrderWindow *ow = user_data;
393 gtk_widget_destroy (ow->dialog);
397 gnc_order_window_refresh_handler (GHashTable *changes, gpointer user_data)
399 OrderWindow *ow = user_data;
401 GncOrder *order = ow_get_order (ow);
406 gnc_close_gui_component (ow->component_id);
413 info = gnc_gui_get_entity_events (changes, &ow->order_guid);
414 if (info && (info->event_mask & QOF_EVENT_DESTROY))
416 gnc_close_gui_component (ow->component_id);
423 gnc_order_update_window (OrderWindow *ow)
427 gboolean hide_cd = FALSE;
429 order = ow_get_order (ow);
430 owner = gncOrderGetOwner (order);
432 if (ow->owner_choice)
434 gtk_container_remove (GTK_CONTAINER (ow->owner_box), ow->owner_choice);
435 gtk_widget_destroy (ow->owner_choice);
438 switch (ow->dialog_type)
443 gnc_owner_edit_create (ow->owner_label, ow->owner_box, ow->book,
448 gnc_owner_select_create (ow->owner_label, ow->owner_box, ow->book,
453 g_signal_connect (ow->owner_choice,
"changed",
454 G_CALLBACK (gnc_order_owner_changed_cb),
457 gtk_widget_show_all (ow->dialog);
460 GtkTextBuffer* text_buffer;
464 gtk_entry_set_text (GTK_ENTRY (ow->ref_entry),
465 gncOrderGetReference (order));
467 string = gncOrderGetNotes (order);
468 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(ow->notes_text));
469 gtk_text_buffer_set_text (text_buffer,
string, -1);
471 tt = gncOrderGetDateOpened (order);
474 gnc_date_edit_set_time (GNC_DATE_EDIT (ow->opened_date),
479 gnc_date_edit_set_time (GNC_DATE_EDIT (ow->opened_date), tt);
483 if (ow->dialog_type == NEW_ORDER)
486 tt = gncOrderGetDateClosed (order);
489 gnc_date_edit_set_time (GNC_DATE_EDIT (ow->closed_date),
495 gnc_date_edit_set_time (GNC_DATE_EDIT (ow->closed_date), tt);
498 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ow->active_check),
499 gncOrderGetActive (order));
503 gnc_gui_component_watch_entity_type (ow->component_id,
504 GNC_ORDER_MODULE_NAME,
505 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
511 gtk_widget_hide (ow->closed_date);
512 gtk_widget_hide (ow->cd_label);
515 if (ow->dialog_type == VIEW_ORDER)
518 gtk_widget_set_sensitive (ow->id_entry, FALSE);
519 gtk_widget_set_sensitive (ow->opened_date, FALSE);
520 gtk_widget_set_sensitive (ow->closed_date, FALSE);
521 gtk_widget_set_sensitive (ow->notes_text, FALSE);
524 gtk_widget_hide (ow->close_order_button);
529 find_handler (gpointer
find_data, gpointer user_data)
532 OrderWindow *ow = user_data;
534 return(ow &&
guid_equal(&ow->order_guid, order_guid));
538 gnc_order_new_window (GtkWindow *parent, QofBook *bookp, OrderDialogType type,
543 GtkWidget *vbox, *regWidget, *hbox, *date;
544 GncEntryLedger *entry_ledger = NULL;
545 const char * class_name;
550 class_name = DIALOG_EDIT_ORDER_CM_CLASS;
554 class_name = DIALOG_VIEW_ORDER_CM_CLASS;
566 order_guid = *gncOrderGetGUID(order);
567 ow = gnc_find_first_gui_component (class_name, find_handler,
571 gtk_window_present (GTK_WINDOW(ow->dialog));
572 gtk_window_set_transient_for (GTK_WINDOW(ow->dialog), parent);
580 ow = g_new0 (OrderWindow, 1);
582 ow->dialog_type = type;
585 gncOwnerCopy (owner, &(ow->owner));
588 builder = gtk_builder_new();
589 gnc_builder_add_from_file (builder,
"dialog-order.glade",
"order_entry_dialog");
590 ow->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"order_entry_dialog"));
591 gtk_window_set_transient_for (GTK_WINDOW(ow->dialog), parent);
594 gtk_widget_set_name (GTK_WIDGET(ow->dialog),
"gnc-id-order");
595 gnc_widget_style_context_add_class (GTK_WIDGET(ow->dialog),
"gnc-class-orders");
598 ow->id_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"id_entry"));
599 ow->ref_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"ref_entry"));
600 ow->notes_text = GTK_WIDGET(gtk_builder_get_object (builder,
"notes_text"));
601 ow->active_check = GTK_WIDGET(gtk_builder_get_object (builder,
"active_check"));
602 ow->owner_box = GTK_WIDGET(gtk_builder_get_object (builder,
"owner_hbox"));
603 ow->owner_label = GTK_WIDGET(gtk_builder_get_object (builder,
"owner_label"));
605 ow->cd_label = GTK_WIDGET(gtk_builder_get_object (builder,
"cd_label"));
606 ow->close_order_button = GTK_WIDGET(gtk_builder_get_object (builder,
"close_order_button"));
610 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"opened_date_hbox"));
611 date = gnc_date_edit_new (time (NULL), FALSE, FALSE);
612 gtk_box_pack_start (GTK_BOX (hbox), date, TRUE, TRUE, 0);
613 gtk_widget_show (date);
614 ow->opened_date = date;
616 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"closed_date_hbox"));
617 date = gnc_date_edit_new (time (NULL), FALSE, FALSE);
618 gtk_box_pack_start (GTK_BOX (hbox), date, TRUE, TRUE, 0);
619 gtk_widget_show (date);
620 ow->closed_date = date;
635 ow->ledger = entry_ledger;
647 ow->reg = GNUCASH_REGISTER (regWidget);
648 gnucash_sheet_set_window (gnucash_register_get_sheet (ow->reg), ow->dialog);
649 gnc_entry_ledger_set_parent (entry_ledger, ow->dialog);
651 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,
671 gnc_order_update_window (ow);
674 gnc_order_owner_changed_cb (ow->owner_choice, ow);
676 g_object_unref(G_OBJECT(builder));
682 gnc_order_window_new_order (GtkWindow *parent, QofBook *bookp,
GncOwner *owner)
688 GtkWidget *hbox, *date;
690 ow = g_new0 (OrderWindow, 1);
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"));
705 gtk_window_set_transient_for (GTK_WINDOW(ow->dialog), parent);
708 gtk_widget_set_name (GTK_WIDGET(ow->dialog),
"gnc-id-new-order");
709 gnc_widget_style_context_add_class (GTK_WIDGET(ow->dialog),
"gnc-class-orders");
711 g_object_set_data (G_OBJECT (ow->dialog),
"dialog_info", ow);
714 ow->id_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"entry_id"));
715 ow->ref_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"entry_ref"));
716 ow->notes_text = GTK_WIDGET(gtk_builder_get_object (builder,
"text_notes"));
717 ow->owner_box = GTK_WIDGET(gtk_builder_get_object (builder,
"bill_owner_hbox"));
718 ow->owner_label = GTK_WIDGET(gtk_builder_get_object (builder,
"bill_owner_label"));
721 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"date_opened_hbox"));
722 date = gnc_date_edit_new (time (NULL), FALSE, FALSE);
723 gtk_box_pack_start (GTK_BOX (hbox), date, TRUE, TRUE, 0);
724 gtk_widget_show (date);
725 ow->opened_date = date;
728 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ow);
731 ow->order_guid = *gncOrderGetGUID (order);
732 string = gncOrderNextID(bookp);
733 gtk_entry_set_text (GTK_ENTRY (ow->id_entry),
string);
737 gnc_register_gui_component (DIALOG_NEW_ORDER_CM_CLASS,
738 gnc_order_window_refresh_handler,
739 gnc_order_window_close_handler,
743 gnc_order_update_window (ow);
746 if (GNC_IS_GENERAL_SEARCH(ow->owner_choice))
748 gnc_general_search_grab_focus(GNC_GENERAL_SEARCH(ow->owner_choice));
752 gnc_order_owner_changed_cb (ow->owner_choice, ow);
754 g_object_unref(G_OBJECT(builder));
760 gnc_ui_order_edit (GtkWindow *parent, GncOrder *order)
763 OrderDialogType type;
765 if (!order)
return NULL;
768 if (gncOrderGetDateClosed (order) == INT64_MAX)
771 ow = gnc_order_new_window (parent, gncOrderGetBook(order), type, order,
772 gncOrderGetOwner (order));
778 gnc_ui_order_new (GtkWindow *parent,
GncOwner *ownerp, QofBook *bookp)
787 case GNC_OWNER_CUSTOMER:
788 case GNC_OWNER_VENDOR:
790 gncOwnerCopy (ownerp, &owner);
793 g_warning (
"Cannot deal with unknown Owner types");
799 gncOwnerInitJob (&owner, NULL);
802 if (!bookp)
return NULL;
804 ow = gnc_order_window_new_order (parent, bookp, &owner);
812 edit_order_cb (GtkWindow *dialog, gpointer *order_p, gpointer user_data)
816 g_return_if_fail (order_p && user_data);
821 gnc_ui_order_edit (dialog, order);
827 new_order_cb (GtkWindow *dialog, gpointer user_data)
832 g_return_val_if_fail (user_data, NULL);
834 ow = gnc_ui_order_new (dialog, sw->owner, sw->book);
835 return ow_get_order (ow);
839 free_order_cb (gpointer user_data)
843 g_return_if_fail (sw);
850 gnc_order_search (GtkWindow *parent, GncOrder *start,
GncOwner *owner, QofBook *book)
855 static GList *params = NULL;
856 static GList *columns = NULL;
859 { N_(
"View/Edit Order"), edit_order_cb, NULL, TRUE},
863 g_return_val_if_fail (book, NULL);
868 params = gnc_search_param_prepend (params, _(
"Order Notes"), NULL, type,
870 params = gnc_search_param_prepend (params, _(
"Date Closed"), NULL, type,
872 params = gnc_search_param_prepend (params, _(
"Is Closed?"), NULL, type,
873 ORDER_IS_CLOSED, NULL);
874 params = gnc_search_param_prepend (params, _(
"Date Opened"), NULL, type,
876 params = gnc_search_param_prepend (params, _(
"Owner Name"), NULL, type,
877 ORDER_OWNER, OWNER_NAME, NULL);
878 params = gnc_search_param_prepend (params, _(
"Order ID"), NULL, type,
885 columns = gnc_search_param_prepend (columns, _(
"Billing ID"), NULL, type,
886 ORDER_REFERENCE, NULL);
887 columns = gnc_search_param_prepend (columns, _(
"Company"), NULL, type,
888 ORDER_OWNER, OWNER_PARENT,
890 columns = gnc_search_param_prepend (columns, _(
"Closed"), NULL, type,
892 columns = gnc_search_param_prepend (columns, _(
"Opened"), NULL, type,
894 columns = gnc_search_param_prepend (columns, _(
"Num"), NULL, type,
899 q = qof_query_create_for (type);
909 q3 = qof_query_create_for (type);
911 (g_slist_prepend (NULL, QOF_PARAM_GUID),
915 (g_slist_prepend (NULL, OWNER_PARENTG),
933 gncOrderGetGUID (start), QOF_QUERY_AND);
942 gncOwnerCopy (owner, &(sw->owner_def));
943 sw->owner = &(sw->owner_def);
948 return gnc_search_dialog_create (parent, type, _(
"Find Order"),
949 params, columns, q, q2,
950 buttons, NULL, new_order_cb,
951 sw, free_order_cb, GNC_PREFS_GROUP_SEARCH,
952 NULL,
"gnc-class-orders");
956 gnc_order_search_select (GtkWindow *parent, gpointer start, gpointer book)
961 if (!book)
return NULL;
965 ownerp = gncOrderGetOwner (o);
966 gncOwnerCopy (ownerp, &owner);
969 gncOwnerInitCustomer (&owner, NULL);
971 return gnc_order_search (parent, start, NULL, book);
975 gnc_order_search_edit (GtkWindow *parent, gpointer start, gpointer book)
978 gnc_ui_order_edit (parent, start);
const GncGUID * gncOwnerGetGUID(const GncOwner *owner)
Get the GncGUID of the immediate owner.
utility functions for the GnuCash UI
QofQuery * qof_query_copy(QofQuery *q)
Make a copy of the indicated query.
GncEntryLedger * gnc_entry_ledger_new(QofBook *book, GncEntryLedgerType type)
Create and return a new GncEntry Ledger.
GtkWidget * gnucash_register_new(Table *table, const gchar *state_section)
this already has scrollbars attached
const gchar * QofIdType
QofIdType declaration.
void gnc_table_refresh_gui(Table *table, gboolean do_scroll)
Refresh the whole GUI from the table.
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 gnc_entry_ledger_set_default_order(GncEntryLedger *ledger, GncOrder *order)
Set the default order for this ledger.
void qof_query_set_book(QofQuery *query, QofBook *book)
Set the book to be searched.
gboolean gnc_entry_ledger_check_close(GtkWidget *parent, GncEntryLedger *ledger)
This will ask the user if they really want to make a change.
QofQuery * qof_query_merge(QofQuery *q1, QofQuery *q2, QofQueryOp op)
Combine two queries together using the Boolean set (logical) operator 'op'.
Public declarations of GnucashRegister class.
void qof_query_add_guid_match(QofQuery *q, QofQueryParamList *param_list, const GncGUID *guid, QofQueryOp op)
DOCUMENT ME !!
GncOwnerType gncOwnerGetType(const GncOwner *owner)
Returns the GncOwnerType of this owner.
GncJob * gncOwnerGetJob(const GncOwner *owner)
If the given owner is of type GNC_OWNER_JOB, returns the pointer to the job object.
void gnc_entry_ledger_destroy(GncEntryLedger *ledger)
Destroy the GncEntry Ledger.
const GncGUID * guid_null(void)
Returns a GncGUID which is guaranteed to never reference any entity.
time64 gnc_time(time64 *tbuf)
get the current time
Table * gnc_entry_ledger_get_table(GncEntryLedger *ledger)
Get the Table.
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
The type used to store guids in C.