gnucash maint: This patch allows the ability to skip rows when importing transactions.

Geert Janssens gjanssens at code.gnucash.org
Sat Sep 27 08:08:15 EDT 2014


Updated	 via  https://github.com/Gnucash/gnucash/commit/2a7ad686 (commit)
	from  https://github.com/Gnucash/gnucash/commit/bef98600 (commit)



commit 2a7ad6867c005dcdd7880e4b2b125ed013fa7c36
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sat Sep 20 13:50:12 2014 +0100

    This patch allows the ability to skip rows when importing transactions.

diff --git a/src/import-export/csv-imp/assistant-csv-trans-import.c b/src/import-export/csv-imp/assistant-csv-trans-import.c
index 5864c29..0c1e8a4 100644
--- a/src/import-export/csv-imp/assistant-csv-trans-import.c
+++ b/src/import-export/csv-imp/assistant-csv-trans-import.c
@@ -75,8 +75,9 @@ typedef struct
     GtkWidget       *check_butt;                    /**< The widget for the check label button */
     GtkWidget       *start_row_spin;                /**< The widget for the start row spinner */
     GtkWidget       *end_row_spin;                  /**< The widget for the end row spinner */
-    int              start_row;                     /**< The start row */
-    int              end_row;                       /**< The end row */
+    GtkWidget       *skip_rows;                     /**< The widget for Skip alternate rows from start row */
+    int              start_row;                     /**< The liststore start row, smallest is 0 */
+    int              end_row;                       /**< The liststore end row, max number of rows -1 */
 
     GncCsvParseData *parse_data;                    /**< The actual data we are previewing */
     GOCharmapSel    *encselector;                   /**< The widget for selecting the encoding */
@@ -141,9 +142,10 @@ void csv_import_trans_assistant_match_page_prepare (GtkAssistant *assistant, gpo
 void csv_import_trans_assistant_finish_page_prepare (GtkAssistant *assistant, gpointer user_data);
 void csv_import_trans_assistant_summary_page_prepare (GtkAssistant *assistant, gpointer user_data);
 
-void csv_import_trans_srow_cb (GtkWidget *spin, gpointer user_data );
-void csv_import_trans_erow_cb (GtkWidget *spin, gpointer user_data );
-void csv_import_trans_auto_cb (GtkWidget *cb, gpointer user_data );
+void csv_import_trans_srow_cb (GtkWidget *spin, gpointer user_data);
+void csv_import_trans_erow_cb (GtkWidget *spin, gpointer user_data);
+void csv_import_trans_skiprows_cb (GtkWidget *checkbox, gpointer user_data);
+void csv_import_trans_auto_cb (GtkWidget *cb, gpointer user_data);
 void csv_import_trans_file_chooser_confirm_cb (GtkWidget *button, CsvImportTrans *info);
 
 static void gnc_csv_preview_update_assist (CsvImportTrans* info);
@@ -235,22 +237,23 @@ void row_selection_update (CsvImportTrans* info)
     GtkListStore *store;
     GtkTreeIter iter;
     gboolean valid;
-    int i;
+    int i = 0;
 
     store = GTK_LIST_STORE(gtk_tree_view_get_model (info->treeview));
 
+    /* Start of file */
     for ( i = 0; i <= info->start_row; i++)
     {
         /* Modify background color of rows less than start row */
         if (info->start_row == i)
         {
-            valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i );
+            valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
             if (valid)
                 gtk_list_store_set (store, &iter, 0, NULL, -1);
         }
         else
         {
-            valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i );
+            valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
             if (valid)
                 gtk_list_store_set (store, &iter, 0, "pink", -1);
             valid = gtk_tree_model_iter_next (GTK_TREE_MODEL(store), &iter);
@@ -260,6 +263,7 @@ void row_selection_update (CsvImportTrans* info)
 
     }
 
+    /* End of File */
     for ( i = info->num_of_rows - 1; i >= info->end_row; i--)
     {
         /* Modify background color of rows more than end row */
@@ -279,6 +283,26 @@ void row_selection_update (CsvImportTrans* info)
                 gtk_list_store_set (store, &iter, 0, NULL, -1);
         }
     }
+
+    /* Remove background color from the start row to end row */
+    for ( i = info->start_row + 1; i <= info->end_row; i++)
+    {
+        valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
+        if (valid)
+            gtk_list_store_set (store, &iter, 0, NULL, -1);
+    }
+
+    /* Skip rows */
+    if (info->parse_data->skip_rows == TRUE)
+    {
+        for ( i = info->start_row + 1; i <= info->end_row; i = i + 2)
+        {
+            /* Modify background color of alternate rows from the start row */
+            valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
+            if (valid)
+                gtk_list_store_set (store, &iter, 0, "pink", -1);
+        }
+    }
 }
 
 
@@ -298,7 +322,7 @@ void csv_import_trans_srow_cb (GtkWidget *spin, gpointer user_data)
     info->parse_data->start_row = info->start_row;
 
     adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->end_row_spin));
-    gtk_adjustment_set_lower (adj, info->start_row + 1 );
+    gtk_adjustment_set_lower (adj, info->start_row + 1);
 
     /* Refresh the row highlighting */
     row_selection_update (info);
@@ -321,7 +345,7 @@ void csv_import_trans_erow_cb (GtkWidget *spin, gpointer user_data)
     info->parse_data->end_row = info->end_row + 1;
 
     adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->start_row_spin));
-    gtk_adjustment_set_upper (adj, info->end_row + 1 );
+    gtk_adjustment_set_upper (adj, info->end_row + 1);
 
     /* Refresh the row highlighting */
     row_selection_update (info);
@@ -354,6 +378,23 @@ void csv_import_trans_auto_cb (GtkWidget *cb, gpointer user_data)
 }
 
 
+/*******************************************************
+ * csv_import_trans_skiprows_cb
+ *
+ * call back for import skip rows checkbox
+ *******************************************************/
+void csv_import_trans_skiprows_cb (GtkWidget *checkbox, gpointer user_data)
+{
+    CsvImportTrans *info = user_data;
+
+    /* Set the skip_rows variable */
+    info->parse_data->skip_rows = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbox));
+
+    /* Refresh the row highlighting */
+    row_selection_update (info);
+}
+
+
 /** Returns the cell renderer from a column in the preview's treeview.
  * @param info The display of the data being imported
  * @param col The number of the column whose cell renderer is being retrieved
@@ -975,7 +1016,7 @@ gboolean preview_settings_valid (CsvImportTrans* info)
     gtk_tree_model_get_iter_first (store, &iter);
 
     /* Get an iterator for the first required row in the data store. */
-    gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(datastore), &iter2, NULL, info->start_row );
+    gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(datastore), &iter2, NULL, info->start_row);
 
     /* Go through each of the columns. */
     for (i = 0; i < ncols; i++)
@@ -1263,7 +1304,6 @@ static
 void load_settings (CsvImportTrans *info)
 {
     info->start_row = 0;
-    info->start_row = 0;
     info->account_page_step = TRUE;
     info->match_parse_run = FALSE;
     info->file_name = NULL;
@@ -1340,6 +1380,8 @@ csv_import_trans_assistant_preview_page_prepare (GtkAssistant *assistant,
         /* Set spin buttons not sensative */
         gtk_widget_set_sensitive (info->start_row_spin, FALSE);
         gtk_widget_set_sensitive (info->end_row_spin, FALSE);
+        gtk_widget_set_sensitive (info->skip_rows, FALSE);
+        info->parse_data->skip_rows = FALSE;
 
         /* Set check button label */
         gtk_label_set_text (GTK_LABEL(info->check_label), _("Skip Errors"));
@@ -1357,6 +1399,10 @@ csv_import_trans_assistant_preview_page_prepare (GtkAssistant *assistant,
         gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->end_row_spin), info->num_of_rows);
     }
 
+    /* Set start row */
+    adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->start_row_spin));
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->start_row_spin), 1);
+
     /* Update the row selection highlight */
     row_selection_update (info);
 }
@@ -1706,6 +1752,7 @@ csv_import_trans_assistant_create (CsvImportTrans *info)
 
         info->start_row_spin = GTK_WIDGET(gtk_builder_get_object (builder, "start_row"));
         info->end_row_spin = GTK_WIDGET(gtk_builder_get_object (builder, "end_row"));
+        info->skip_rows = GTK_WIDGET(gtk_builder_get_object (builder, "skip_rows"));
         info->check_label = GTK_WIDGET(gtk_builder_get_object (builder, "check_label"));
         info->check_butt = GTK_WIDGET(gtk_builder_get_object (builder, "check_butt"));
 
diff --git a/src/import-export/csv-imp/assistant-csv-trans-import.glade b/src/import-export/csv-imp/assistant-csv-trans-import.glade
index 154fe45..d61fb30 100644
--- a/src/import-export/csv-imp/assistant-csv-trans-import.glade
+++ b/src/import-export/csv-imp/assistant-csv-trans-import.glade
@@ -22,7 +22,7 @@ All transactions imported will be associated to one account for each import and
 
 Various options exist for specifying the delimiter as well as a fixed width option. With the fixed width option, double click on the bar above the displayed rows to set the column width.
 
-There is an option for specifying the start and end row which can be used if you have some header text or multiple accounts in the same file.</property>
+There is an option for specifying the start row, end row and an option to skip alternate rows begining from the start row. These can be used if you have some header text, a points collected status row or multiple accounts in the same file.</property>
         <property name="wrap">True</property>
       </object>
       <packing>
@@ -152,6 +152,21 @@ Select location and file name for the Import, then click 'OK'...
                   </packing>
                 </child>
                 <child>
+                  <object class="GtkCheckButton" id="skip_rows">
+                    <property name="label" translatable="yes">Skip alternate rows from the start row</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="draw_indicator">True</property>
+                    <signal name="toggled" handler="csv_import_trans_skiprows_cb" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
                   <object class="GtkHSeparator" id="hseparator7">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
@@ -160,7 +175,7 @@ Select location and file name for the Import, then click 'OK'...
                     <property name="expand">False</property>
                     <property name="fill">True</property>
                     <property name="padding">8</property>
-                    <property name="position">1</property>
+                    <property name="position">2</property>
                   </packing>
                 </child>
                 <child>
@@ -219,7 +234,7 @@ Select location and file name for the Import, then click 'OK'...
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">True</property>
-                    <property name="position">2</property>
+                    <property name="position">3</property>
                   </packing>
                 </child>
                 <child>
@@ -232,7 +247,7 @@ Select location and file name for the Import, then click 'OK'...
                     <property name="expand">False</property>
                     <property name="fill">False</property>
                     <property name="padding">10</property>
-                    <property name="position">3</property>
+                    <property name="position">4</property>
                   </packing>
                 </child>
                 <child>
@@ -308,7 +323,7 @@ Select location and file name for the Import, then click 'OK'...
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
-                    <property name="position">4</property>
+                    <property name="position">5</property>
                   </packing>
                 </child>
                 <child>
@@ -321,7 +336,7 @@ Select location and file name for the Import, then click 'OK'...
                     <property name="expand">False</property>
                     <property name="fill">False</property>
                     <property name="padding">10</property>
-                    <property name="position">5</property>
+                    <property name="position">6</property>
                   </packing>
                 </child>
               </object>
diff --git a/src/import-export/csv-imp/gnc-csv-model.c b/src/import-export/csv-imp/gnc-csv-model.c
index 41a4ab6..db2c184 100644
--- a/src/import-export/csv-imp/gnc-csv-model.c
+++ b/src/import-export/csv-imp/gnc-csv-model.c
@@ -340,6 +340,7 @@ GncCsvParseData* gnc_csv_new_parse_data (void)
     parse_data->chunk = g_string_chunk_new(100 * 1024);
     parse_data->start_row = 0;
     parse_data->end_row = 1000;
+    parse_data->skip_rows = FALSE;
     return parse_data;
 }
 
@@ -1077,7 +1078,7 @@ int gnc_csv_parse_to_trans (GncCsvParseData* parse_data, Account* account,
         /* This flag is TRUE if there are any errors in this row. */
         gboolean errors = FALSE;
         gchar* error_message = NULL;
-        TransPropertyList* list = trans_property_list_new (account, parse_data->date_format, parse_data->currency_format );
+        TransPropertyList* list = trans_property_list_new (account, parse_data->date_format, parse_data->currency_format);
         GncCsvTransLine* trans_line = NULL;
 
         for (j = 0; j < line->len; j++)
@@ -1184,7 +1185,10 @@ int gnc_csv_parse_to_trans (GncCsvParseData* parse_data, Account* account,
         }
         else
         {
-            i++;
+            if (parse_data->skip_rows == FALSE)
+                i++;
+            else
+                i = i + 2;
         }
     }
 
diff --git a/src/import-export/csv-imp/gnc-csv-model.h b/src/import-export/csv-imp/gnc-csv-model.h
index ba8f6da..4b00782 100644
--- a/src/import-export/csv-imp/gnc-csv-model.h
+++ b/src/import-export/csv-imp/gnc-csv-model.h
@@ -115,6 +115,7 @@ typedef struct
     int date_format;            /**< The format of the text in the date columns from date_format_internal. */
     int start_row;              /**< The start row to generate transactions from. */
     int end_row;                /**< The end row to generate transactions from. */
+    gboolean skip_rows;         /**< Skip Alternate Rows from start row. */
     int currency_format;        /**< The currency format, 0 for locale, 1 for comma dec and 2 for period */
 } GncCsvParseData;
 



Summary of changes:
 .../csv-imp/assistant-csv-trans-import.c           | 71 ++++++++++++++++++----
 .../csv-imp/assistant-csv-trans-import.glade       | 27 ++++++--
 src/import-export/csv-imp/gnc-csv-model.c          |  8 ++-
 src/import-export/csv-imp/gnc-csv-model.h          |  1 +
 4 files changed, 87 insertions(+), 20 deletions(-)



More information about the gnucash-changes mailing list