X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fhomebank;a=blobdiff_plain;f=src%2Fhb-payee.c;h=fa49406810fa077dd56bb8cc5fb109ad9448f62c;hp=5992a4d0e544d98b264bfac12462e54bb1a67868;hb=236cb5e47660876f46488ea8f76ecd5bebfa1fac;hpb=59c5e08a64798d4303ae7eb3a2713bc93d98fa7b diff --git a/src/hb-payee.c b/src/hb-payee.c index 5992a4d..fa49406 100644 --- a/src/hb-payee.c +++ b/src/hb-payee.c @@ -1,5 +1,5 @@ /* HomeBank -- Free, easy, personal accounting for everyone. - * Copyright (C) 1995-2016 Maxime DOYEN + * Copyright (C) 1995-2019 Maxime DOYEN * * This file is part of HomeBank. * @@ -37,6 +37,10 @@ extern struct HomeBank *GLOBALS; /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ +//Payee * +//da_pay_clone + + void da_pay_free(Payee *item) { @@ -83,20 +87,6 @@ Payee *item; /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ -static void da_pay_max_key_ghfunc(gpointer key, Payee *item, guint32 *max_key) -{ - *max_key = MAX(*max_key, item->key); -} - -static gboolean da_pay_name_grfunc(gpointer key, Payee *item, gchar *name) -{ - if( name && item->name ) - { - if(!strcasecmp(name, item->name)) - return TRUE; - } - return FALSE; -} /** * da_pay_length: @@ -109,29 +99,30 @@ da_pay_length(void) return g_hash_table_size(GLOBALS->h_pay); } -/* -gboolean -da_pay_create_none(void) -{ -Payee *pay; -guint32 *new_key; - DB( g_print("da_pay_insert none\n") ); - - pay = da_pay_malloc(); - new_key = g_new0(guint32, 1); - *new_key = 0; - pay->key = 0; - pay->name = g_strdup(""); - - DB( g_print(" -> insert id: %d\n", *new_key) ); +static void +da_pay_max_key_ghfunc(gpointer key, Payee *item, guint32 *max_key) +{ + *max_key = MAX(*max_key, item->key); +} - g_hash_table_insert(GLOBALS->h_pay, new_key, pay); +/** + * da_pay_get_max_key: + * + * Get the biggest key from the GHashTable + * + * Return value: the biggest key value + * + */ +guint32 +da_pay_get_max_key(void) +{ +guint32 max_key = 0; - return TRUE; + g_hash_table_foreach(GLOBALS->h_pay, (GHFunc)da_pay_max_key_ghfunc, &max_key); + return max_key; } -*/ /** @@ -150,6 +141,7 @@ da_pay_remove(guint32 key) return g_hash_table_remove(GLOBALS->h_pay, &key); } + /** * da_pay_insert: * @@ -185,51 +177,59 @@ gboolean da_pay_append(Payee *item) { Payee *existitem; -guint32 *new_key; DB( g_print("da_pay_append\n") ); - /* ensure no duplicate */ - //g_strstrip(item->name); - if( item->name != NULL ) + existitem = da_pay_get_by_name( item->name ); + if( existitem == NULL ) { - existitem = da_pay_get_by_name( item->name ); - if( existitem == NULL ) - { - new_key = g_new0(guint32, 1); - *new_key = da_pay_get_max_key() + 1; - item->key = *new_key; - - DB( g_print(" -> append id: %d\n", *new_key) ); - - g_hash_table_insert(GLOBALS->h_pay, new_key, item); - return TRUE; - } + item->key = da_pay_get_max_key() + 1; + da_pay_insert(item); + return TRUE; } DB( g_print(" -> %s already exist: %d\n", item->name, item->key) ); - return FALSE; } + /** - * da_pay_get_max_key: + * da_pay_append_if_new: * - * Get the biggest key from the GHashTable + * append a new payee into the GHashTable * - * Return value: the biggest key value + * Return value: existing or new payee * */ -guint32 -da_pay_get_max_key(void) +Payee * +da_pay_append_if_new(gchar *rawname) { -guint32 max_key = 0; +Payee *retval = NULL; - g_hash_table_foreach(GLOBALS->h_pay, (GHFunc)da_pay_max_key_ghfunc, &max_key); - return max_key; + retval = da_pay_get_by_name(rawname); + if(retval == NULL) + { + retval = da_pay_malloc(); + retval->key = da_pay_get_max_key() + 1; + retval->name = g_strdup(rawname); + g_strstrip(retval->name); + da_pay_insert(retval); + } + + return retval; } +static gboolean +da_pay_name_grfunc(gpointer key, Payee *item, gchar *name) +{ + if( name && item->name ) + { + if(!strcasecmp(name, item->name)) + return TRUE; + } + return FALSE; +} /** @@ -241,15 +241,27 @@ guint32 max_key = 0; * */ Payee * -da_pay_get_by_name(gchar *name) +da_pay_get_by_name(gchar *rawname) { +Payee *retval = NULL; +gchar *stripname; + DB( g_print("da_pay_get_by_name\n") ); - return g_hash_table_find(GLOBALS->h_pay, (GHRFunc)da_pay_name_grfunc, name); + if( rawname ) + { + stripname = g_strdup(rawname); + g_strstrip(stripname); + if( strlen(stripname) == 0 ) + retval = da_pay_get(0); + else + retval = g_hash_table_find(GLOBALS->h_pay, (GHRFunc)da_pay_name_grfunc, stripname); + g_free(stripname); + } + return retval; } - /** * da_pay_get: * @@ -270,6 +282,9 @@ da_pay_get(guint32 key) void da_pay_consistency(Payee *item) { g_strstrip(item->name); + //5.2.4 we drop internal xfer here as it will disapear + if( item->paymode == PAYMODE_INTXFER ) + item->paymode = PAYMODE_XFER; } @@ -451,62 +466,30 @@ payee_rename(Payee *item, const gchar *newname) { Payee *existitem; gchar *stripname; +gboolean retval = FALSE; stripname = g_strdup(newname); g_strstrip(stripname); existitem = da_pay_get_by_name(stripname); - if( existitem != NULL ) + if( existitem != NULL && existitem->key != item->key) { - if( existitem->key == item->key ) - return TRUE; + DB( g_print("- error, same name already exist with other key %d <> %d\n",existitem->key, item->key) ); + g_free(stripname); } else { + DB( g_print("- renaming\n") ); g_free(item->name); - item->name = g_strdup(stripname); - return TRUE; + item->name = stripname; + retval = TRUE; } - g_free(stripname); - - return FALSE; + return retval; } -/** - * payee_append_if_new: - * - * append a new payee into the GHashTable - * - * Return value: a new Payee or NULL - * - */ -Payee * -payee_append_if_new(gchar *name) -{ -gchar *stripname; -Payee *item; - - stripname = g_strdup(name); - g_strstrip(stripname); - item = da_pay_get_by_name(stripname); - - if(item == NULL) - { - item = da_pay_malloc(); - item->name = g_strdup(stripname); - da_pay_append(item); - } - else - item = NULL; - - g_free(stripname); - - return item; -} - static gint payee_glist_name_compare_func(Payee *a, Payee *b) { @@ -521,7 +504,8 @@ payee_glist_key_compare_func(Payee *a, Payee *b) } -GList *payee_glist_sorted(gint column) +GList * +payee_glist_sorted(gint column) { GList *list = g_hash_table_get_values(GLOBALS->h_pay); @@ -532,21 +516,25 @@ GList *list = g_hash_table_get_values(GLOBALS->h_pay); } - -void -payee_load_csv(gchar *filename) +gboolean +payee_load_csv(gchar *filename, gchar **error) { +gboolean retval; GIOChannel *io; gchar *tmpstr; gint io_stat; +gchar **str_array; const gchar *encoding; +gint nbcol; encoding = homebank_file_getencoding(filename); + DB( g_print(" -> encoding should be %s\n", encoding) ); + retval = TRUE; + *error = NULL; io = g_io_channel_new_file(filename, "r", NULL); if(io != NULL) { - DB( g_print(" -> encoding should be %s\n", encoding) ); if( encoding != NULL ) { g_io_channel_set_encoding(io, encoding, NULL); @@ -561,15 +549,54 @@ const gchar *encoding; { if( tmpstr != NULL) { + DB( g_print("\n + strip\n") ); hb_string_strip_crlf(tmpstr); - DB( g_print(" read %s\n", tmpstr) ); + DB( g_print(" + split '%s'\n", tmpstr) ); + str_array = g_strsplit (tmpstr, ";", 2); + // payee;category : later paymode? - if( payee_append_if_new( tmpstr ) ) + nbcol = g_strv_length (str_array); + if( nbcol > 2 ) { - GLOBALS->changes_count++; + *error = _("invalid CSV format"); + retval = FALSE; + DB( g_print(" + error %s\n", *error) ); } - + else + { + Payee *pay = NULL; + Category *cat = NULL; + + if( nbcol >= 1 ) + { + DB( g_print(" add pay:'%s' ?\n", str_array[0]) ); + pay = da_pay_append_if_new(str_array[0]); + DB( g_print(" pay: %p\n", pay) ); + if( pay != NULL ) + { + GLOBALS->changes_count++; + } + } + + if( nbcol == 2 ) + { + DB( g_print(" add cat:'%s'\n", str_array[1]) ); + cat = da_cat_append_ifnew_by_fullname(str_array[1]); + + DB( g_print(" cat: %p %p\n", cat, pay) ); + if( cat != NULL ) + { + if( pay != NULL) + { + DB( g_print(" set default cat to %d\n", cat->key) ); + pay->kcat = cat->key; + } + GLOBALS->changes_count++; + } + } + } + g_strfreev (str_array); } g_free(tmpstr); } @@ -578,6 +605,7 @@ const gchar *encoding; g_io_channel_unref (io); } + return retval; } @@ -596,15 +624,33 @@ gchar *outstr; while (list != NULL) { Payee *item = list->data; + gchar *fullcatname; if(item->key != 0) { - outstr = g_strdup_printf("%s\n", item->name); - g_io_channel_write_chars(io, outstr, -1, NULL, NULL); + fullcatname = NULL; + if( item->kcat > 0 ) + { + Category *cat = da_cat_get(item->kcat); + + if( cat != NULL ) + { + fullcatname = cat->fullname; + } + } - DB( g_print("%s", outstr) ); + if( fullcatname != NULL ) + outstr = g_strdup_printf("%s;%s\n", item->name, fullcatname); + else + outstr = g_strdup_printf("%s;\n", item->name); + + DB( g_print(" + export %s\n", outstr) ); + + g_io_channel_write_chars(io, outstr, -1, NULL, NULL); g_free(outstr); + g_free(fullcatname); + } list = g_list_next(list); } @@ -612,7 +658,5 @@ gchar *outstr; g_io_channel_unref (io); } - } -