31 #include <glib/gi18n.h>
35 #include "gnc-component-manager.h"
36 #include "gnc-date-edit.h"
39 #include "dialog-utils.h"
43 #include "assistant-utils.h"
48 #define GNC_PREFS_GROUP "dialogs.export.csv"
49 #define GNC_PREF_PANED_POS "paned-position"
50 #define ASSISTANT_CSV_EXPORT_CM_CLASS "assistant-csv-export"
57 void csv_export_assistant_prepare (GtkAssistant *assistant, GtkWidget *page, gpointer user_data);
58 void csv_export_assistant_finish (GtkAssistant *gtkassistant, gpointer user_data);
59 void csv_export_assistant_cancel (GtkAssistant *gtkassistant, gpointer user_data);
60 void csv_export_assistant_close (GtkAssistant *gtkassistant, gpointer user_data);
62 void csv_export_assistant_start_page_prepare (GtkAssistant *assistant, gpointer user_data);
63 void csv_export_assistant_account_page_prepare (GtkAssistant *gtkassistant, gpointer user_data);
64 void csv_export_assistant_file_page_prepare (GtkAssistant *assistant, gpointer user_data);
65 void csv_export_assistant_finish_page_prepare (GtkAssistant *assistant, gpointer user_data);
66 void csv_export_assistant_summary_page_prepare (GtkAssistant *assistant, gpointer user_data);
68 void csv_export_quote_cb (GtkToggleButton *button, gpointer user_data);
69 void csv_export_sep_cb (GtkWidget *radio, gpointer user_data);
70 void csv_export_custom_entry_cb (GtkWidget *widget, gpointer user_data);
72 void csv_export_show_range_cb (GtkRadioButton *button, gpointer user_data);
73 void csv_export_start_date_cb (GtkWidget *radio, gpointer user_data);
74 void csv_export_end_date_cb (GtkWidget *radio, gpointer user_data);
76 void csv_export_file_chooser_confirm_cb (GtkWidget *button,
CsvExportInfo *info);
78 static const gchar *finish_tree_string = N_(
80 "The account tree will be exported to the file '%s' when you click 'Apply'.\n\n"
81 "You can also verify your selections by clicking on 'Back' or 'Cancel' to Abort Export.\n");
83 static const gchar *finish_trans_string = N_(
85 "When you click 'Apply', the transactions will be exported to the file '%s' and"
86 " the number of accounts exported will be %u.\n\n"
87 "You can also verify your selections by clicking on 'Back' or 'Cancel' to Abort Export.\n");
89 static const gchar *start_tree_string = N_(
90 "This assistant will help you export the Account Tree to a file\n"
91 " with the separator specified below.\n\n"
92 "Select the settings you require for the file and then click 'Forward' to proceed"
93 " or 'Cancel' to Abort Export.\n");
95 static const gchar *start_trans_string = N_(
96 "This assistant will help you export the Transactions to a file\n"
97 " with the separator specified below.\n\n"
98 "There will be multiple rows for each transaction and may"
99 " require further manipulation to get them in a format you can use.\n\n"
100 "Each Transaction will appear once in the export and will be listed in"
101 " the order the accounts were processed\n\n"
102 "Select the settings you require for the file and then click 'Forward' to proceed"
103 " or 'Cancel' to Abort Export.\n");
112 csv_export_file_chooser_confirm_cb (GtkWidget *button,
CsvExportInfo *info)
114 GtkAssistant *assistant = GTK_ASSISTANT(info->window);
115 gint num = gtk_assistant_get_current_page (assistant);
116 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
120 gtk_assistant_set_page_complete (assistant, page, FALSE);
122 file_name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(info->file_chooser));
126 if (g_file_test (file_name, G_FILE_TEST_EXISTS))
128 const char *format = _(
"The file %s already exists. "
129 "Are you sure you want to overwrite it?");
132 if (!gnc_verify_dialog (NULL, FALSE, format, file_name))
136 info->file_name = g_strdup (file_name);
137 gtk_assistant_set_page_complete (assistant, page, TRUE);
143 gchar *filedir = g_path_get_dirname (filepath);
144 info->starting_dir = g_strdup (filedir);
150 DEBUG(
"file_name selected is %s", info->file_name);
151 DEBUG(
"starting directory is %s", info->starting_dir);
154 if(gtk_assistant_get_page_complete (assistant, page))
155 gtk_assistant_set_current_page (assistant, num + 1);
164 void csv_export_sep_cb (GtkWidget *radio, gpointer user_data)
169 GtkAssistant *assistant = GTK_ASSISTANT(info->window);
170 gint num = gtk_assistant_get_current_page (assistant);
171 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
173 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(radio)))
175 LEAVE(
"1st callback of pair. Defer to 2nd callback.");
179 name = gtk_buildable_get_name (GTK_BUILDABLE(radio));
181 gtk_widget_set_sensitive (info->custom_entry, FALSE);
182 info->use_custom = FALSE;
183 gtk_assistant_set_page_complete (assistant, page, TRUE);
185 if (g_strcmp0 (name,
"comma_radio") == 0)
186 info->separator_str =
",";
187 if (g_strcmp0 (name,
"colon_radio") == 0)
188 info->separator_str =
":";
189 if (g_strcmp0 (name,
"semicolon_radio") == 0)
190 info->separator_str =
";";
192 if (g_strcmp0 (name,
"custom_radio") == 0)
194 gtk_widget_set_sensitive (info->custom_entry, TRUE);
195 info->use_custom = TRUE;
196 if (gtk_entry_get_text_length (GTK_ENTRY(info->custom_entry)) == 0)
197 gtk_assistant_set_page_complete (assistant, page, FALSE);
207 void csv_export_quote_cb (GtkToggleButton *button, gpointer user_data)
211 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button)))
212 info->use_quotes = TRUE;
214 info->use_quotes = FALSE;
223 void csv_export_custom_entry_cb (GtkWidget *widget, gpointer user_data)
226 const gchar *custom_str;
228 GtkAssistant *assistant = GTK_ASSISTANT(info->window);
229 gint num = gtk_assistant_get_current_page (assistant);
230 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
232 custom_str = gtk_entry_get_text (GTK_ENTRY(info->custom_entry));
233 info->separator_str = strdup (custom_str);
235 if (info->use_custom == TRUE && gtk_entry_get_text_length (GTK_ENTRY(info->custom_entry)) == 0)
237 gtk_assistant_set_page_complete (assistant, page, FALSE);
239 gtk_assistant_set_page_complete (assistant, page, TRUE);
251 info->use_quotes = FALSE;
252 info->separator_str =
",";
253 info->file_name = NULL;
254 info->starting_dir = NULL;
255 info->trans_list = NULL;
258 info->starting_dir = gnc_get_default_directory (GNC_PREFS_GROUP);
269 csv_export_cursor_changed_cb (GtkWidget *widget, gpointer user_data)
276 account_tree = GNC_TREE_VIEW_ACCOUNT (info->csva.account_treeview);
280 gtk_widget_set_sensitive (info->csva.select_button, FALSE);
284 gtk_widget_set_sensitive (info->csva.select_button, num_children > 0);
300 tree = GNC_TREE_VIEW_ACCOUNT (info->csva.account_treeview);
322 csv_export_cursor_changed_cb (GTK_WIDGET(tree), info);
335 GtkTreeSelection* selection;
340 tree = GNC_TREE_VIEW_ACCOUNT(info->csva.account_treeview);
341 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(tree));
342 num_accounts = gtk_tree_selection_count_selected_rows (selection);
344 label = info->csva.num_acct_label;
346 string = g_strdup_printf (
"%d", num_accounts);
347 gtk_label_set_text (GTK_LABEL (label),
string);
360 csv_export_account_changed_cb (GtkTreeSelection *selection,
364 GtkAssistant *assistant = GTK_ASSISTANT(info->window);
365 gint num = gtk_assistant_get_current_page (assistant);
366 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
370 g_return_if_fail(GTK_IS_TREE_SELECTION(selection));
372 info->csva.num_accounts = update_accounts_tree (info);
375 if (info->csva.num_accounts > 0)
376 gtk_assistant_set_page_complete (assistant, page, TRUE);
378 gtk_assistant_set_page_complete (assistant, page, FALSE);
380 view = GNC_TREE_VIEW_ACCOUNT(info->csva.account_treeview);
391 csv_export_select_subaccounts_clicked_cb (GtkWidget *widget, gpointer user_data)
397 account_tree = GNC_TREE_VIEW_ACCOUNT (info->csva.account_treeview);
404 gtk_widget_grab_focus (info->csva.account_treeview);
419 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(info->csvd.start_date_choose)))
421 time_val = gnc_date_edit_get_date (GNC_DATE_EDIT(info->csvd.start_date));
423 info->csvd.start_time = time_val;
427 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(info->csvd.start_date_today)))
430 info->csvd.start_time = 0;
433 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(info->csvd.end_date_choose)))
435 time_val = gnc_date_edit_get_date (GNC_DATE_EDIT(info->csvd.end_date));
437 info->csvd.end_time = time_val;
441 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(info->csvd.start_date_today)))
444 info->csvd.end_time =
gnc_time (NULL);
455 csv_export_show_range_cb (GtkRadioButton *button, gpointer user_data)
460 g_return_if_fail (GTK_IS_RADIO_BUTTON(button));
462 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button));
463 gtk_widget_set_sensitive (info->csvd.table, active);
473 csv_export_date_changed_cb (GtkWidget *w, gpointer user_data)
477 get_filter_times (info);
487 csv_export_start_date_cb (GtkWidget *radio, gpointer user_data)
493 g_return_if_fail (GTK_IS_RADIO_BUTTON(radio));
495 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(radio)))
497 LEAVE(
"1st callback of pair. Defer to 2nd callback.");
501 name = gtk_buildable_get_name (GTK_BUILDABLE(radio));
502 active = (g_strcmp0 (name,
"start_date_choose") == 0 ? 1 : 0 );
503 gtk_widget_set_sensitive (info->csvd.start_date, active);
504 get_filter_times (info);
514 csv_export_end_date_cb (GtkWidget *radio, gpointer user_data)
520 g_return_if_fail (GTK_IS_RADIO_BUTTON(radio));
522 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(radio)))
524 LEAVE(
"1st callback of pair. Defer to 2nd callback.");
528 name = gtk_buildable_get_name (GTK_BUILDABLE(radio));
529 active = (g_strcmp0 (name,
"end_date_choose") == 0 ? 1 : 0 );
530 gtk_widget_set_sensitive (info->csvd.end_date, active);
531 get_filter_times (info);
543 get_earliest_in_book (
QofBook *book)
550 q = qof_query_create_for (GNC_ID_SPLIT);
555 p1 = g_slist_prepend (NULL, TRANS_DATE_POSTED);
556 p1 = g_slist_prepend (p1, SPLIT_TRANS);
568 earliest = xaccQueryGetEarliestDateFound (q);
588 csv_export_assistant_start_page_prepare (GtkAssistant *assistant,
592 gint num = gtk_assistant_get_current_page (assistant);
593 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
596 if (info->export_type == XML_EXPORT_TREE)
597 gtk_label_set_text (GTK_LABEL(info->start_label), gettext (start_tree_string));
599 gtk_label_set_text (GTK_LABEL(info->start_label), gettext (start_trans_string));
602 gtk_assistant_set_page_complete (assistant, page, TRUE);
607 csv_export_assistant_account_page_prepare (GtkAssistant *assistant,
611 gint num = gtk_assistant_get_current_page (assistant);
612 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
615 if (info->csva.num_accounts > 0)
616 gtk_assistant_set_page_complete (assistant, page, TRUE);
618 gtk_assistant_set_page_complete (assistant, page, FALSE);
623 csv_export_assistant_file_page_prepare (GtkAssistant *assistant,
627 gint num = gtk_assistant_get_current_page (assistant);
628 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
631 if (info->starting_dir)
632 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(info->file_chooser), info->starting_dir);
633 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(info->file_chooser),
"");
636 gtk_assistant_set_page_complete (assistant, page, FALSE);
641 csv_export_assistant_finish_page_prepare (GtkAssistant *assistant,
645 gint num = gtk_assistant_get_current_page (assistant);
646 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
650 if (info->export_type == XML_EXPORT_TREE)
651 text = g_strdup_printf (gettext (finish_tree_string), info->file_name);
653 text = g_strdup_printf (gettext (finish_trans_string), info->file_name, info->csva.num_accounts);
655 gtk_label_set_text (GTK_LABEL(info->finish_label), text);
659 gtk_assistant_set_page_complete (assistant, page, TRUE);
664 csv_export_assistant_summary_page_prepare (GtkAssistant *assistant,
669 gnc_set_default_directory (GNC_PREFS_GROUP, info->starting_dir);
672 text = _(
"There was a problem with the export, this could be due to lack of space, "
673 "permissions or unable to access folder. Check the trace file for further logging!\n"
674 "You may need to enable debugging.\n");
676 text = _(
"File exported successfully!\n");
678 mtext = g_strdup_printf (
"<span size=\"medium\"><b>%s</b></span>", text);
680 gtk_label_set_markup (GTK_LABEL(info->summary_label), mtext);
687 csv_export_assistant_prepare (GtkAssistant *assistant, GtkWidget *page,
692 if (page == info->start_page)
693 csv_export_assistant_start_page_prepare (assistant, user_data);
694 else if (page == info->account_page)
695 csv_export_assistant_account_page_prepare (assistant, user_data);
696 else if (page == info->file_page)
697 csv_export_assistant_file_page_prepare (assistant, user_data);
698 else if (page == info->finish_label)
699 csv_export_assistant_finish_page_prepare (assistant, user_data);
700 else if (page == info->summary_label)
701 csv_export_assistant_summary_page_prepare (assistant, user_data);
703 g_assert_not_reached();
711 csv_export_assistant_destroy_cb (GtkObject *
object, gpointer user_data)
714 gnc_unregister_gui_component_by_data (ASSISTANT_CSV_EXPORT_CM_CLASS, info);
719 csv_export_assistant_cancel (GtkAssistant *assistant, gpointer user_data)
722 gnc_close_gui_component_by_data (ASSISTANT_CSV_EXPORT_CM_CLASS, info);
726 csv_export_assistant_close (GtkAssistant *assistant, gpointer user_data)
729 gnc_close_gui_component_by_data (ASSISTANT_CSV_EXPORT_CM_CLASS, info);
733 csv_export_assistant_finish (GtkAssistant *assistant, gpointer user_data)
737 if (info->export_type == XML_EXPORT_TREE)
744 csv_export_close_handler (gpointer user_data)
748 g_free (info->file_name);
749 g_free (info->starting_dir);
751 gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(info->window));
752 gtk_widget_destroy (info->window);
763 GtkWidget *box, *h_box;
765 GtkWidget *
table, *hbox;
766 time64 start_time, end_time;
768 builder = gtk_builder_new();
769 gnc_builder_add_from_file (builder ,
"assistant-csv-export.glade",
"CSV Export Assistant");
770 window = GTK_WIDGET(gtk_builder_get_object (builder,
"CSV Export Assistant"));
771 info->window = window;
774 gnc_assistant_set_colors (GTK_ASSISTANT (info->window));
777 load_settings (info);
780 info->start_page = GTK_WIDGET(gtk_builder_get_object(builder,
"start_page"));
781 info->start_label = GTK_WIDGET(gtk_builder_get_object(builder,
"start_label"));
782 info->custom_entry = GTK_WIDGET(gtk_builder_get_object(builder,
"custom_entry"));
783 gtk_widget_set_sensitive (info->custom_entry, FALSE);
786 info->account_page = GTK_WIDGET(gtk_builder_get_object(builder,
"account_page"));
788 if (info->export_type == XML_EXPORT_TREE)
789 gtk_widget_destroy (info->account_page);
792 GtkTreeView *tree_view;
793 GtkTreeSelection *selection;
794 GtkWidget *box, *label;
796 info->csva.acct_info = GTK_WIDGET(gtk_builder_get_object (builder,
"acct_info_vbox"));
797 info->csva.num_acct_label = GTK_WIDGET(gtk_builder_get_object (builder,
"num_accounts_label"));
800 info->csva.account_treeview = GTK_WIDGET(tree_view);
802 selection = gtk_tree_view_get_selection (tree_view);
803 gtk_tree_selection_set_mode (selection, GTK_SELECTION_EXTENDED);
804 g_signal_connect (G_OBJECT(selection),
"changed",
805 G_CALLBACK(csv_export_account_changed_cb), info);
807 gtk_widget_show (info->csva.account_treeview);
808 box = GTK_WIDGET(gtk_builder_get_object (builder,
"account_scroll"));
809 gtk_container_add (GTK_CONTAINER(box), info->csva.account_treeview);
811 label = GTK_WIDGET(gtk_builder_get_object (builder,
"accounts_label"));
812 gtk_label_set_mnemonic_widget (GTK_LABEL(label), GTK_WIDGET(tree_view));
815 button = GTK_WIDGET(gtk_builder_get_object (builder,
"select_subaccounts_button"));
816 info->csva.select_button = button;
818 g_signal_connect (G_OBJECT(button),
"clicked",
819 G_CALLBACK(csv_export_select_subaccounts_clicked_cb), info);
820 g_signal_connect (G_OBJECT(info->csva.account_treeview),
"cursor_changed",
821 G_CALLBACK(csv_export_cursor_changed_cb), info);
824 button = GTK_WIDGET(gtk_builder_get_object (builder,
"show_range"));
827 start_time = get_earliest_in_book (gnc_get_current_book());
830 info->csvd.start_time = start_time;
831 info->csvd.end_time = end_time;
832 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), FALSE);
834 table = GTK_WIDGET(gtk_builder_get_object (builder,
"select_range_table"));
835 info->csvd.table = table;
836 gtk_widget_set_sensitive (GTK_WIDGET(table), FALSE);
838 info->csvd.start_date_choose = GTK_WIDGET(gtk_builder_get_object (builder,
"start_date_choose"));
839 info->csvd.start_date_today = GTK_WIDGET(gtk_builder_get_object (builder,
"start_date_today"));
840 info->csvd.end_date_choose = GTK_WIDGET(gtk_builder_get_object (builder,
"end_date_choose"));
841 info->csvd.end_date_today = GTK_WIDGET(gtk_builder_get_object (builder,
"end_date_today"));
844 info->csvd.start_date = gnc_date_edit_new (
gnc_time (NULL), FALSE, FALSE);
845 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"start_date_hbox"));
846 gtk_box_pack_start (GTK_BOX(hbox), info->csvd.start_date, TRUE, TRUE, 0);
847 gtk_widget_show (info->csvd.start_date);
848 gnc_date_edit_set_time (GNC_DATE_EDIT(info->csvd.start_date), start_time);
849 g_signal_connect (G_OBJECT(info->csvd.start_date),
"date-changed",
850 G_CALLBACK(csv_export_date_changed_cb), info);
853 info->csvd.end_date = gnc_date_edit_new (
gnc_time (NULL), FALSE, FALSE);
854 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"end_date_hbox"));
855 gtk_box_pack_start (GTK_BOX(hbox), info->csvd.end_date, TRUE, TRUE, 0);
856 gtk_widget_show (info->csvd.end_date);
857 gnc_date_edit_set_time (GNC_DATE_EDIT(info->csvd.end_date), end_time);
858 g_signal_connect (G_OBJECT (info->csvd.end_date),
"date-changed",
859 G_CALLBACK (csv_export_date_changed_cb), info);
862 show_acct_type_accounts (info);
863 update_accounts_tree (info);
867 info->file_page = GTK_WIDGET(gtk_builder_get_object(builder,
"file_page"));
868 info->file_chooser = gtk_file_chooser_widget_new (GTK_FILE_CHOOSER_ACTION_SAVE);
869 button = gtk_button_new_from_stock (GTK_STOCK_OK);
870 gtk_widget_set_size_request (button, 100, -1);
871 gtk_widget_show (button);
872 h_box = gtk_hbox_new (TRUE, 0);
873 gtk_box_pack_start(GTK_BOX(h_box), button, FALSE, FALSE, 0);
874 gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER(info->file_chooser), h_box);
875 g_signal_connect (G_OBJECT(button),
"clicked",
876 G_CALLBACK(csv_export_file_chooser_confirm_cb), info);
878 box = GTK_WIDGET(gtk_builder_get_object (builder,
"file_page"));
879 gtk_box_pack_start (GTK_BOX (box), info->file_chooser, TRUE, TRUE, 6);
880 gtk_widget_show (info->file_chooser);
883 info->finish_label = GTK_WIDGET(gtk_builder_get_object (builder,
"end_page"));
886 info->summary_label = GTK_WIDGET(gtk_builder_get_object (builder,
"summary_page"));
888 g_signal_connect (G_OBJECT(window),
"destroy",
889 G_CALLBACK(csv_export_assistant_destroy_cb), info);
891 gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW(info->window));
894 GObject *
object = gtk_builder_get_object (builder,
"paned");
895 gnc_prefs_bind (GNC_PREFS_GROUP, GNC_PREF_PANED_POS,
object,
"position");
898 gtk_builder_connect_signals (builder, info);
899 g_object_unref (G_OBJECT(builder));
917 info->export_type = export_type;
918 csv_export_assistant_create (info);
919 gnc_register_gui_component (ASSISTANT_CSV_EXPORT_CM_CLASS,
920 NULL, csv_export_close_handler,
922 gtk_widget_show_all (info->window);
923 gnc_window_adjust_for_screen (GTK_WINDOW(info->window));
void gnc_tree_view_account_get_view_info(GncTreeViewAccount *account_view, AccountViewInfo *avi)
time64 gnc_time64_get_today_start(void)
GList * gnc_tree_view_account_get_selected_accounts(GncTreeViewAccount *view)
Account * gnc_tree_view_account_get_cursor_account(GncTreeViewAccount *view)
time64 gnc_time64_get_today_end(void)
void qof_query_set_sort_order(QofQuery *q, QofQueryParamList *primary_sort_params, QofQueryParamList *secondary_sort_params, QofQueryParamList *tertiary_sort_params)
#define DEBUG(format, args...)
void csv_transactions_export(CsvExportInfo *info)
gchar * gnc_uri_get_path(const gchar *uri)
void gnc_tree_view_account_set_view_info(GncTreeViewAccount *account_view, AccountViewInfo *avi)
void qof_query_set_sort_increasing(QofQuery *q, gboolean prim_inc, gboolean sec_inc, gboolean tert_inc)
struct _QofQuery QofQuery
void qof_query_set_max_results(QofQuery *q, int n)
void gnc_tree_view_account_select_subaccounts(GncTreeViewAccount *view, Account *account)
void qof_query_destroy(QofQuery *q)
void gnc_prefs_bind(const gchar *group, const gchar *pref_name, gpointer object, const gchar *property)
GtkTreeView implementation for gnucash account tree.
void csv_tree_export(CsvExportInfo *info)
time64 gnc_time64_get_day_end(time64 time_val)
GtkTreeView * gnc_tree_view_account_new(gboolean show_root)
void qof_query_set_book(QofQuery *q, QofBook *book)
void gnc_file_csv_export(CsvExportType export_type)
Generic api to store and retrieve preferences.
time64 gnc_time64_get_day_start(time64 time_val)
GList * qof_query_run(QofQuery *query)
gint gnc_tree_view_account_count_children(GncTreeViewAccount *view, Account *account)
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
#define LEAVE(format, args...)
#define QUERY_DEFAULT_SORT
time64 gnc_time(time64 *tbuf)
get the current local time
Utility functions for convert uri in separate components and back.
API for Transactions and Splits (journal entries)
const gchar * QofLogModule