From 50350c40a737577a705eea3b4bd9f577fdd9e704 Mon Sep 17 00:00:00 2001 From: Robert Fewell <14uBobIT@gmail.com> Date: Sat, 17 Oct 2015 19:43:17 +0100 Subject: [PATCH] Bug 754533 Add CSV Register Export Allow you to do a CSV export of the active Register View --- src/gnome/gnc-plugin-page-register.c | 18 ++++++ src/gnome/gnc-plugin-page-register.h | 10 +++ src/gnome/gnc-plugin-page-register2.c | 18 ++++++ src/gnome/gnc-plugin-page-register2.h | 11 ++++ src/import-export/csv-exp/Makefile.am | 3 + .../csv-exp/assistant-csv-export.c | 64 ++++++++++++++++--- .../csv-exp/assistant-csv-export.h | 14 +++- .../csv-exp/csv-transactions-export.c | 52 +++++++++------ .../csv-exp/gnc-plugin-csv-export-ui.xml | 1 + .../csv-exp/gnc-plugin-csv-export.c | 39 +++++++++++ 10 files changed, 201 insertions(+), 29 deletions(-) diff --git a/src/gnome/gnc-plugin-page-register.c b/src/gnome/gnc-plugin-page-register.c index b5973a1a22..cfbd953238 100644 --- a/src/gnome/gnc-plugin-page-register.c +++ b/src/gnome/gnc-plugin-page-register.c @@ -1803,6 +1803,24 @@ gnc_plugin_page_register_summarybar_position_changed (gpointer prefs, gchar* pre (position == GTK_POS_TOP ? 0 : -1) ); } +/** This function is called to get the query associated with this + * plugin page. + * + * @param page A pointer to the GncPluginPage. + */ +Query * +gnc_plugin_page_register_get_query (GncPluginPage *plugin_page) +{ + GncPluginPageRegister *page; + GncPluginPageRegisterPrivate *priv; + + g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page)); + + page = GNC_PLUGIN_PAGE_REGISTER (plugin_page); + priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page); + return gnc_ledger_display_get_query (priv->ledger); +} + /************************************************************/ /* "Sort By" Dialog */ /************************************************************/ diff --git a/src/gnome/gnc-plugin-page-register.h b/src/gnome/gnc-plugin-page-register.h index 9bf0ee8c45..23af07f3cb 100644 --- a/src/gnome/gnc-plugin-page-register.h +++ b/src/gnome/gnc-plugin-page-register.h @@ -41,6 +41,7 @@ #include "gnc-ledger-display.h" #include "gnc-plugin-page.h" #include "gnc-split-reg.h" +#include "Query.h" G_BEGIN_DECLS @@ -133,6 +134,15 @@ GNCSplitReg * gnc_plugin_page_register_get_gsr (GncPluginPage *plugin_page); +/** Get the Query associated with this "register" plugin page. + * + * @param plugin_page The "register" page to modify. + * + * @return The query. + */ +Query * +gnc_plugin_page_register_get_query (GncPluginPage *plugin_page); + /** Get the Account associated with this register page. * * @param page A "register" page. diff --git a/src/gnome/gnc-plugin-page-register2.c b/src/gnome/gnc-plugin-page-register2.c index 3b2772c990..7e1bc9f01e 100644 --- a/src/gnome/gnc-plugin-page-register2.c +++ b/src/gnome/gnc-plugin-page-register2.c @@ -1825,6 +1825,24 @@ gnc_plugin_page_register2_summarybar_position_changed (gpointer prefs, gchar* pr (position == GTK_POS_TOP ? 0 : -1) ); } +/** This function is called to get the query associated with this + * plugin page. + * + * @param page A pointer to the GncPluginPage. + */ +Query * +gnc_plugin_page_register2_get_query (GncPluginPage *plugin_page) +{ + GncPluginPageRegister2 *page; + GncPluginPageRegister2Private *priv; + + g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER2(plugin_page)); + + page = GNC_PLUGIN_PAGE_REGISTER2 (plugin_page); + priv = GNC_PLUGIN_PAGE_REGISTER2_GET_PRIVATE(page); + return gnc_ledger_display2_get_query (priv->ledger); +} + /*#################################################################################*/ /*#################################################################################*/ diff --git a/src/gnome/gnc-plugin-page-register2.h b/src/gnome/gnc-plugin-page-register2.h index eaf8add5e8..f4986fdc4b 100644 --- a/src/gnome/gnc-plugin-page-register2.h +++ b/src/gnome/gnc-plugin-page-register2.h @@ -31,6 +31,7 @@ #include "gnc-ledger-display2.h" #include "gnc-plugin-page.h" #include "gnc-split-reg2.h" +#include "Query.h" G_BEGIN_DECLS /** @ingroup Register @@ -136,6 +137,16 @@ GNCLedgerDisplay2 * gnc_plugin_page_register2_get_ledger (GncPluginPage *plugin_page); +/** Get the Query associated with this "register" plugin page. + * + * @param plugin_page A "register" page. + * + * @return The query. + */ +Query * +gnc_plugin_page_register2_get_query (GncPluginPage *plugin_page); + + /** Get the Account associated with this register page. * * @param page A "register" page. diff --git a/src/import-export/csv-exp/Makefile.am b/src/import-export/csv-exp/Makefile.am index 2e8f1a74cd..c6ceabd39e 100644 --- a/src/import-export/csv-exp/Makefile.am +++ b/src/import-export/csv-exp/Makefile.am @@ -38,6 +38,9 @@ AM_CPPFLAGS = \ -I${top_srcdir}/src/app-utils \ -I${top_srcdir}/src/gnome \ -I${top_srcdir}/src/gnome-utils \ + -I${top_srcdir}/src/register/ledger-core \ + -I${top_srcdir}/src/register/register-core \ + -I${top_srcdir}/src/register/register-gnome \ -I${top_srcdir}/src/import-export \ -I${top_srcdir}/src/libqof/qof \ -I${top_srcdir}/lib/libc \ diff --git a/src/import-export/csv-exp/assistant-csv-export.c b/src/import-export/csv-exp/assistant-csv-export.c index 21ce9ef0df..be97491bd3 100644 --- a/src/import-export/csv-exp/assistant-csv-export.c +++ b/src/import-export/csv-exp/assistant-csv-export.c @@ -87,12 +87,22 @@ static const gchar *finish_trans_string = N_( "You can also verify your selections by clicking on 'Back' or 'Cancel' to Abort Export.\n"); static const gchar *start_tree_string = N_( - "This assistant will help you export the Account Tree to a file\n" - " with the separator specified below.\n\n" - "Select the settings you require for the file and then click 'Forward' to proceed" - " or 'Cancel' to Abort Export.\n"); + "This assistant will help you export the Account Tree to a file\n" + " with the separator specified below.\n\n" + "Select the settings you require for the file and then click 'Forward' to proceed" + " or 'Cancel' to Abort Export.\n"); static const gchar *start_trans_string = N_( + "This assistant will help you export the Transactions to a file\n" + " with the separator specified below.\n\n" + "There will be multiple rows for each transaction and may" + " require further manipulation to get them in a format you can use.\n\n" + "Each Transaction will appear once in the export and will be listed in" + " the order the accounts were processed\n\n" + "Select the settings you require for the file and then click 'Forward' to proceed" + " or 'Cancel' to Abort Export.\n"); + +static const gchar *start_trans_simple_string = N_( "This assistant will help you export the Transactions to a file\n" " with the separator specified below.\n\n" "There will be multiple rows for each transaction and may require further" @@ -617,7 +627,12 @@ csv_export_assistant_start_page_prepare (GtkAssistant *assistant, if (info->export_type == XML_EXPORT_TREE) gtk_label_set_text (GTK_LABEL(info->start_label), gettext (start_tree_string)); else - gtk_label_set_text (GTK_LABEL(info->start_label), gettext (start_trans_string)); + { + if ((info->export_type == XML_EXPORT_REGISTER) && (info->account == NULL)) + gtk_label_set_text (GTK_LABEL(info->start_label), gettext (start_trans_string)); + else + gtk_label_set_text (GTK_LABEL(info->start_label), gettext (start_trans_simple_string)); + } /* Enable the Assistant Buttons */ gtk_assistant_set_page_complete (assistant, page, TRUE); @@ -671,7 +686,12 @@ csv_export_assistant_finish_page_prepare (GtkAssistant *assistant, if (info->export_type == XML_EXPORT_TREE) text = g_strdup_printf (gettext (finish_tree_string), info->file_name); else - text = g_strdup_printf (gettext (finish_trans_string), info->file_name, info->csva.num_accounts); + { + if ((info->export_type == XML_EXPORT_REGISTER) && (info->account != NULL)) + text = g_strdup_printf (gettext (finish_trans_string), info->file_name, 1); + else + text = g_strdup_printf (gettext (finish_trans_string), info->file_name, info->csva.num_accounts); + } gtk_label_set_text (GTK_LABEL(info->finish_label), text); g_free (text); @@ -805,11 +825,13 @@ csv_export_assistant_create (CsvExportInfo *info) /* Account Page */ info->account_page = GTK_WIDGET(gtk_builder_get_object(builder, "account_page")); - if (info->export_type == XML_EXPORT_TREE) + if ((info->export_type == XML_EXPORT_TREE) || (info->export_type == XML_EXPORT_REGISTER)) { GtkWidget *chkbox = GTK_WIDGET(gtk_builder_get_object(builder, "simple_layout")); - gtk_widget_destroy (chkbox); + // If export is an account tree or info->account is NULL (Search/gl register) + if ((info->export_type == XML_EXPORT_TREE) || (info->account == NULL)) + gtk_widget_destroy (chkbox); gtk_widget_destroy (info->account_page); } else @@ -947,3 +969,29 @@ gnc_file_csv_export (CsvExportType export_type) gtk_widget_show_all (info->window); gnc_window_adjust_for_screen (GTK_WINDOW(info->window)); } + + +/********************************************************************\ + * gnc_file_csv_export_register * + * opens up a assistant to export register transactions based. * * + * Args: export_type * + * Args: Query * + * Args: Account * + * Return: nothing * +\********************************************************************/ +void +gnc_file_csv_export_register (CsvExportType export_type, Query *q, Account *acc) +{ + CsvExportInfo *info; + + info = g_new0 (CsvExportInfo, 1); + info->export_type = export_type; + info->query = q; + info->account = acc; + csv_export_assistant_create (info); + gnc_register_gui_component (ASSISTANT_CSV_EXPORT_CM_CLASS, + NULL, csv_export_close_handler, + info); + gtk_widget_show_all (info->window); + gnc_window_adjust_for_screen (GTK_WINDOW(info->window)); +} diff --git a/src/import-export/csv-exp/assistant-csv-export.h b/src/import-export/csv-exp/assistant-csv-export.h index 7ea44161da..b9dcc61ac0 100644 --- a/src/import-export/csv-exp/assistant-csv-export.h +++ b/src/import-export/csv-exp/assistant-csv-export.h @@ -29,11 +29,13 @@ #define GNC_ASSISTANT_CSV_EXPORT_H #include "Account.h" +#include "Query.h" typedef enum { XML_EXPORT_TREE, - XML_EXPORT_TRANS + XML_EXPORT_TRANS, + XML_EXPORT_REGISTER } CsvExportType; typedef struct @@ -68,6 +70,9 @@ typedef struct CsvExportDate csvd; CsvExportAcc csva; GList *trans_list; + + Query *query; + Account *account; GtkWidget *start_page; GtkWidget *account_page; @@ -96,9 +101,14 @@ typedef struct } CsvExportInfo; -/** The gnc_file_csv_export() will let the user export thte +/** The gnc_file_csv_export() will let the user export the * account tree or transactions to a delimited file. */ void gnc_file_csv_export (CsvExportType export_type); +/** The gnc_file_csv_export_register() will let the user export the + * active register transactions to a delimited file. + */ +void gnc_file_csv_export_register (CsvExportType export_type, Query *query, Account *acc); + #endif diff --git a/src/import-export/csv-exp/csv-transactions-export.c b/src/import-export/csv-exp/csv-transactions-export.c index 215a8907f4..85904256fc 100644 --- a/src/import-export/csv-exp/csv-transactions-export.c +++ b/src/import-export/csv-exp/csv-transactions-export.c @@ -570,26 +570,29 @@ make_complex_split_line (Transaction *trans, Split *split, CsvExportInfo *info) static void account_splits (CsvExportInfo *info, Account *acc, FILE *fh ) { - Query *q; GSList *p1, *p2; GList *splits; QofBook *book; - q = qof_query_create_for (GNC_ID_SPLIT); - book = gnc_get_current_book(); - qof_query_set_book (q, book); + // Setup the query for normal transaction export + if (info->export_type == XML_EXPORT_TRANS) + { + info->query = qof_query_create_for (GNC_ID_SPLIT); + book = gnc_get_current_book(); + qof_query_set_book (info->query, book); - /* Sort by transaction date */ - p1 = g_slist_prepend (NULL, TRANS_DATE_POSTED); - p1 = g_slist_prepend (p1, SPLIT_TRANS); - p2 = g_slist_prepend (NULL, QUERY_DEFAULT_SORT); - qof_query_set_sort_order (q, p1, p2, NULL); + /* Sort by transaction date */ + p1 = g_slist_prepend (NULL, TRANS_DATE_POSTED); + p1 = g_slist_prepend (p1, SPLIT_TRANS); + p2 = g_slist_prepend (NULL, QUERY_DEFAULT_SORT); + qof_query_set_sort_order (info->query, p1, p2, NULL); - xaccQueryAddSingleAccountMatch (q, acc, QOF_QUERY_AND); - xaccQueryAddDateMatchTT (q, TRUE, info->csvd.start_time, TRUE, info->csvd.end_time, QOF_QUERY_AND); + xaccQueryAddSingleAccountMatch (info->query, acc, QOF_QUERY_AND); + xaccQueryAddDateMatchTT (info->query, TRUE, info->csvd.start_time, TRUE, info->csvd.end_time, QOF_QUERY_AND); + } /* Run the query */ - for (splits = qof_query_run (q); splits; splits = splits->next) + for (splits = qof_query_run (info->query); splits; splits = splits->next) { Split *split; Transaction *trans; @@ -609,7 +612,11 @@ void account_splits (CsvExportInfo *info, Account *acc, FILE *fh ) if (g_list_find (info->trans_list, trans) != NULL) continue; - // Simple Layout + // Look for blank split + if (xaccSplitGetAccount (split) == NULL) + continue; + + // This will be a simple layout equivalent to a single line register view. if (info->simple_layout) { line = make_simple_trans_line (acc, trans, split, info); @@ -655,7 +662,8 @@ void account_splits (CsvExportInfo *info, Account *acc, FILE *fh ) } info->trans_list = g_list_prepend (info->trans_list, trans); // add trans to trans_list } - qof_query_destroy (q); + if (info->export_type == XML_EXPORT_TRANS) + qof_query_destroy (info->query); g_list_free (splits); } @@ -729,13 +737,19 @@ void csv_transactions_export (CsvExportInfo *info) } g_free (header); - /* Go through list of accounts */ - for (ptr = info->csva.account_list, i = 0; ptr; ptr = g_list_next(ptr), i++) + if (info->export_type == XML_EXPORT_TRANS) { - acc = ptr->data; - DEBUG("Account being processed is : %s", xaccAccountGetName (acc)); - account_splits (info, acc, fh); + /* Go through list of accounts */ + for (ptr = info->csva.account_list, i = 0; ptr; ptr = g_list_next(ptr), i++) + { + acc = ptr->data; + DEBUG("Account being processed is : %s", xaccAccountGetName (acc)); + account_splits (info, acc, fh); + } } + else + account_splits (info, info->account, fh); + g_list_free (info->trans_list); // free trans_list } else diff --git a/src/import-export/csv-exp/gnc-plugin-csv-export-ui.xml b/src/import-export/csv-exp/gnc-plugin-csv-export-ui.xml index 566e9801ff..2a46ce389c 100644 --- a/src/import-export/csv-exp/gnc-plugin-csv-export-ui.xml +++ b/src/import-export/csv-exp/gnc-plugin-csv-export-ui.xml @@ -5,6 +5,7 @@ + diff --git a/src/import-export/csv-exp/gnc-plugin-csv-export.c b/src/import-export/csv-exp/gnc-plugin-csv-export.c index 7b11068e15..de144b7173 100644 --- a/src/import-export/csv-exp/gnc-plugin-csv-export.c +++ b/src/import-export/csv-exp/gnc-plugin-csv-export.c @@ -30,6 +30,12 @@ #include "assistant-csv-export.h" +#include "gnc-plugin-page-register.h" +/*################## Added for Reg2 #################*/ +#include "gnc-plugin-page-register2.h" +/*################## Added for Reg2 #################*/ +#include "Query.h" + static void gnc_plugin_csv_export_class_init (GncPluginCsvExportClass *klass); static void gnc_plugin_csv_export_init (GncPluginCsvExport *plugin); static void gnc_plugin_csv_export_finalize (GObject *object); @@ -37,6 +43,7 @@ static void gnc_plugin_csv_export_finalize (GObject *object); /* Command callbacks */ static void gnc_plugin_csv_export_tree_cmd (GtkAction *action, GncMainWindowActionData *data); static void gnc_plugin_csv_export_trans_cmd (GtkAction *action, GncMainWindowActionData *data); +static void gnc_plugin_csv_export_register_cmd (GtkAction *action, GncMainWindowActionData *data); #define PLUGIN_ACTIONS_NAME "gnc-plugin-csv-export-actions" #define PLUGIN_UI_FILENAME "gnc-plugin-csv-export-ui.xml" @@ -53,6 +60,11 @@ static GtkActionEntry gnc_plugin_actions [] = N_("Export the Transactions to a CSV file"), G_CALLBACK (gnc_plugin_csv_export_trans_cmd) }, + { + "CsvExportRegisterAction", GTK_STOCK_CONVERT, N_("Export _Active Register to CSV..."), NULL, + N_("Export the Active Register to a CSV file"), + G_CALLBACK (gnc_plugin_csv_export_register_cmd) + }, }; static guint gnc_plugin_n_actions = G_N_ELEMENTS (gnc_plugin_actions); @@ -156,6 +168,33 @@ gnc_plugin_csv_export_trans_cmd (GtkAction *action, gnc_file_csv_export(XML_EXPORT_TRANS); } +static void +gnc_plugin_csv_export_register_cmd (GtkAction *action, + GncMainWindowActionData *data) +{ + Query *query; + GList *splits; + Account *acc; + + GncPluginPage *page = gnc_main_window_get_current_page (data->window); + + if (GNC_IS_PLUGIN_PAGE_REGISTER(page)) + { + query = gnc_plugin_page_register_get_query (page); + acc = gnc_plugin_page_register_get_account (GNC_PLUGIN_PAGE_REGISTER(page)); + gnc_file_csv_export_register (XML_EXPORT_REGISTER, query, acc); + } + +/*################## Added for Reg2 #################*/ + if (GNC_IS_PLUGIN_PAGE_REGISTER2(page)) + { + query = gnc_plugin_page_register2_get_query (page); + acc = gnc_plugin_page_register2_get_account (GNC_PLUGIN_PAGE_REGISTER2(page)); + gnc_file_csv_export_register (XML_EXPORT_REGISTER, query, acc); + } +/*################## Added for Reg2 #################*/ +} + /************************************************************ * Plugin Bootstrapping * ************************************************************/