mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
[import-main-matcher] if multi-accounts, scan all accounts
if an ofx has info on multiple accounts, and selection includes multiple accounts, scan all of them. also further separation between UI and data processing.
This commit is contained in:
parent
2bafe700db
commit
6d1f3c5af6
@ -85,6 +85,10 @@ struct _main_matcher_info
|
|||||||
gboolean edit_desc;
|
gboolean edit_desc;
|
||||||
gboolean edit_notes;
|
gboolean edit_notes;
|
||||||
gboolean edit_memo;
|
gboolean edit_memo;
|
||||||
|
|
||||||
|
GHashTable *desc_hash;
|
||||||
|
GHashTable *notes_hash;
|
||||||
|
GHashTable *memo_hash;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum downloaded_cols
|
enum downloaded_cols
|
||||||
@ -236,6 +240,11 @@ gnc_gen_trans_list_delete (GNCImportMainMatcher *info)
|
|||||||
g_hash_table_foreach_remove (info->acct_id_hash, delete_hash, NULL);
|
g_hash_table_foreach_remove (info->acct_id_hash, delete_hash, NULL);
|
||||||
g_hash_table_destroy (info->acct_id_hash);
|
g_hash_table_destroy (info->acct_id_hash);
|
||||||
info->acct_id_hash = NULL;
|
info->acct_id_hash = NULL;
|
||||||
|
|
||||||
|
g_hash_table_destroy (info->desc_hash);
|
||||||
|
g_hash_table_destroy (info->notes_hash);
|
||||||
|
g_hash_table_destroy (info->memo_hash);
|
||||||
|
|
||||||
g_free (info);
|
g_free (info);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -457,6 +466,47 @@ resolve_conflicts (GNCImportMainMatcher *info)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
load_hash_tables (GNCImportMainMatcher *info)
|
||||||
|
{
|
||||||
|
GtkTreeModel *model = gtk_tree_view_get_model (info->view);
|
||||||
|
GtkTreeIter import_iter;
|
||||||
|
GList *accounts_list = NULL;
|
||||||
|
gboolean valid = gtk_tree_model_get_iter_first (model, &import_iter);
|
||||||
|
while (valid)
|
||||||
|
{
|
||||||
|
GNCImportTransInfo *trans_info = get_trans_info (model, &import_iter);
|
||||||
|
Split *s = gnc_import_TransInfo_get_fsplit (trans_info);
|
||||||
|
Account *acc = xaccSplitGetAccount (s);
|
||||||
|
if (!g_list_find (accounts_list, acc))
|
||||||
|
accounts_list = g_list_prepend (accounts_list, acc);
|
||||||
|
valid = gtk_tree_model_iter_next (model, &import_iter);
|
||||||
|
}
|
||||||
|
for (GList *m = accounts_list; m; m = m->next)
|
||||||
|
{
|
||||||
|
for (GList *n = xaccAccountGetSplitList (m->data); n; n = n->next)
|
||||||
|
{
|
||||||
|
const Split *s = n->data;
|
||||||
|
const Transaction *t = xaccSplitGetParent (s);
|
||||||
|
const gchar *key;
|
||||||
|
|
||||||
|
key = xaccTransGetDescription (t);
|
||||||
|
if (key && *key)
|
||||||
|
g_hash_table_insert (info->desc_hash, (gpointer)key, one);
|
||||||
|
|
||||||
|
key = xaccTransGetNotes (t);
|
||||||
|
if (key && *key)
|
||||||
|
g_hash_table_insert (info->notes_hash, (gpointer)key, one);
|
||||||
|
|
||||||
|
key = xaccSplitGetMemo (s);
|
||||||
|
if (key && *key)
|
||||||
|
g_hash_table_insert (info->memo_hash, (gpointer)key, one);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_list_free (accounts_list);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gnc_gen_trans_list_show_all (GNCImportMainMatcher *info)
|
gnc_gen_trans_list_show_all (GNCImportMainMatcher *info)
|
||||||
{
|
{
|
||||||
@ -482,6 +532,7 @@ gnc_gen_trans_list_show_all (GNCImportMainMatcher *info)
|
|||||||
xaccAccountGetAppendText(account));
|
xaccAccountGetAppendText(account));
|
||||||
|
|
||||||
gnc_gen_trans_list_create_matches (info);
|
gnc_gen_trans_list_create_matches (info);
|
||||||
|
load_hash_tables (info);
|
||||||
resolve_conflicts (info);
|
resolve_conflicts (info);
|
||||||
gtk_widget_show_all (GTK_WIDGET(info->main_widget));
|
gtk_widget_show_all (GTK_WIDGET(info->main_widget));
|
||||||
gnc_gen_trans_list_show_accounts_column (info);
|
gnc_gen_trans_list_show_accounts_column (info);
|
||||||
@ -966,15 +1017,13 @@ setup_entry (GtkWidget *entry, gboolean sensitive, GHashTable *hash,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
input_new_fields (GtkWidget *parent, RowInfo *info, GtkTreeStore *store,
|
input_new_fields (GNCImportMainMatcher *info, RowInfo *rowinfo,
|
||||||
gboolean edit_desc, gboolean edit_notes, gboolean edit_memo,
|
|
||||||
char **new_desc, char **new_notes, char **new_memo)
|
char **new_desc, char **new_notes, char **new_memo)
|
||||||
{
|
{
|
||||||
GtkWidget *desc_entry, *notes_entry, *memo_entry, *label;
|
GtkWidget *desc_entry, *notes_entry, *memo_entry, *label;
|
||||||
GtkWidget *dialog;
|
GtkWidget *dialog;
|
||||||
GtkBuilder *builder;
|
GtkBuilder *builder;
|
||||||
gboolean retval = FALSE;
|
gboolean retval = FALSE;
|
||||||
GHashTable *desc_hash, *notes_hash, *memo_hash;
|
|
||||||
|
|
||||||
builder = gtk_builder_new ();
|
builder = gtk_builder_new ();
|
||||||
gnc_builder_add_from_file (builder, "dialog-import.glade", "transaction_edit_dialog");
|
gnc_builder_add_from_file (builder, "dialog-import.glade", "transaction_edit_dialog");
|
||||||
@ -985,39 +1034,11 @@ input_new_fields (GtkWidget *parent, RowInfo *info, GtkTreeStore *store,
|
|||||||
memo_entry = GTK_WIDGET(gtk_builder_get_object (builder, "memo_entry"));
|
memo_entry = GTK_WIDGET(gtk_builder_get_object (builder, "memo_entry"));
|
||||||
notes_entry = GTK_WIDGET(gtk_builder_get_object (builder, "notes_entry"));
|
notes_entry = GTK_WIDGET(gtk_builder_get_object (builder, "notes_entry"));
|
||||||
|
|
||||||
desc_hash = g_hash_table_new (g_str_hash, g_str_equal);
|
setup_entry (desc_entry, info->edit_desc, info->desc_hash, xaccTransGetDescription (rowinfo->trans));
|
||||||
notes_hash = g_hash_table_new (g_str_hash, g_str_equal);
|
setup_entry (notes_entry, info->edit_notes, info->notes_hash, xaccTransGetNotes (rowinfo->trans));
|
||||||
memo_hash = g_hash_table_new (g_str_hash, g_str_equal);
|
setup_entry (memo_entry, info->edit_memo, info->memo_hash, xaccSplitGetMemo (rowinfo->split));
|
||||||
|
|
||||||
for (GList *n = xaccAccountGetSplitList (xaccSplitGetAccount (info->split));
|
gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (info->main_widget));
|
||||||
n; n = n->next)
|
|
||||||
{
|
|
||||||
const Split *s = n->data;
|
|
||||||
const Transaction *t = xaccSplitGetParent (s);
|
|
||||||
const gchar *key;
|
|
||||||
|
|
||||||
key = xaccTransGetDescription (t);
|
|
||||||
if (key && *key)
|
|
||||||
g_hash_table_insert (desc_hash, (gpointer)key, one);
|
|
||||||
|
|
||||||
key = xaccTransGetNotes (t);
|
|
||||||
if (key && *key)
|
|
||||||
g_hash_table_insert (notes_hash, (gpointer)key, one);
|
|
||||||
|
|
||||||
key = xaccSplitGetMemo (s);
|
|
||||||
if (key && *key)
|
|
||||||
g_hash_table_insert (memo_hash, (gpointer)key, one);
|
|
||||||
};
|
|
||||||
|
|
||||||
setup_entry (desc_entry, edit_desc, desc_hash, xaccTransGetDescription (info->trans));
|
|
||||||
setup_entry (notes_entry, edit_notes, notes_hash, xaccTransGetNotes (info->trans));
|
|
||||||
setup_entry (memo_entry, edit_memo, memo_hash, xaccSplitGetMemo (info->split));
|
|
||||||
|
|
||||||
g_hash_table_destroy (desc_hash);
|
|
||||||
g_hash_table_destroy (notes_hash);
|
|
||||||
g_hash_table_destroy (memo_hash);
|
|
||||||
|
|
||||||
gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent));
|
|
||||||
|
|
||||||
// run the dialog
|
// run the dialog
|
||||||
gtk_widget_show_all (dialog);
|
gtk_widget_show_all (dialog);
|
||||||
@ -1047,7 +1068,7 @@ gnc_gen_trans_edit_fields (GtkMenuItem *menuitem, GNCImportMainMatcher *info)
|
|||||||
GtkTreeModel *model;
|
GtkTreeModel *model;
|
||||||
GList *selected_rows, *row_info_list;
|
GList *selected_rows, *row_info_list;
|
||||||
GtkTreeStore* store;
|
GtkTreeStore* store;
|
||||||
char *new_desc, *new_notes, *new_memo;
|
char *new_desc = NULL, *new_notes = NULL, *new_memo = NULL;
|
||||||
|
|
||||||
g_return_if_fail (info != NULL);
|
g_return_if_fail (info != NULL);
|
||||||
ENTER("assign_transfer_account_to_selection_cb");
|
ENTER("assign_transfer_account_to_selection_cb");
|
||||||
@ -1066,8 +1087,7 @@ gnc_gen_trans_edit_fields (GtkMenuItem *menuitem, GNCImportMainMatcher *info)
|
|||||||
|
|
||||||
row_info_list = gnc_g_list_map (selected_rows, (GncGMapFunc) row_get_info, info);
|
row_info_list = gnc_g_list_map (selected_rows, (GncGMapFunc) row_get_info, info);
|
||||||
|
|
||||||
if (input_new_fields (info->main_widget, row_info_list->data, store,
|
if (input_new_fields (info, row_info_list->data,
|
||||||
info->edit_desc, info->edit_notes, info->edit_memo,
|
|
||||||
&new_desc, &new_notes, &new_memo))
|
&new_desc, &new_notes, &new_memo))
|
||||||
{
|
{
|
||||||
for (GList *n = row_info_list; n; n = g_list_next (n))
|
for (GList *n = row_info_list; n; n = g_list_next (n))
|
||||||
@ -1657,6 +1677,11 @@ gnc_gen_trans_list_new (GtkWidget *parent,
|
|||||||
info);
|
info);
|
||||||
// This ensure this dialog is closed when the session is closed.
|
// This ensure this dialog is closed when the session is closed.
|
||||||
gnc_gui_component_set_session (info->id, gnc_get_current_session());
|
gnc_gui_component_set_session (info->id, gnc_get_current_session());
|
||||||
|
|
||||||
|
info->desc_hash = g_hash_table_new (g_str_hash, g_str_equal);
|
||||||
|
info->notes_hash = g_hash_table_new (g_str_hash, g_str_equal);
|
||||||
|
info->memo_hash = g_hash_table_new (g_str_hash, g_str_equal);
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user