X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fhb-account.c;h=9064868c71257d88d5ef18a4e0d5f8cce2b6dd29;hb=613fd4014fa5814bf2adce50574d520df8927ce1;hp=c3366e770167a414e02984c55bd8c19409f56847;hpb=5b7b5519d955cd0c99d094ba140514e0a2b73083;p=chaz%2Fhomebank diff --git a/src/hb-account.c b/src/hb-account.c index c3366e7..9064868 100644 --- a/src/hb-account.c +++ b/src/hb-account.c @@ -1,5 +1,5 @@ /* HomeBank -- Free, easy, personal accounting for everyone. - * Copyright (C) 1995-2014 Maxime DOYEN + * Copyright (C) 1995-2016 Maxime DOYEN * * This file is part of HomeBank. * @@ -38,26 +38,6 @@ extern struct HomeBank *GLOBALS; - - - -Account * -da_acc_clone(Account *src_item) -{ -Account *new_item = rc_dup(src_item, sizeof(Account)); - - DB( g_print("da_acc_clone\n") ); - if(new_item) - { - //duplicate the string - new_item->name = g_strdup(src_item->name); - new_item->number = g_strdup(src_item->number); - new_item->bankname = g_strdup(src_item->bankname); - } - return new_item; -} - - void da_acc_free(Account *item) { @@ -70,6 +50,10 @@ da_acc_free(Account *item) g_free(item->name); g_free(item->number); g_free(item->bankname); + g_free(item->notes); + + g_queue_free (item->txn_queue); + rc_free(item); } } @@ -78,8 +62,12 @@ da_acc_free(Account *item) Account * da_acc_malloc(void) { +Account *item; + DB( g_print("da_acc_malloc\n") ); - return rc_alloc(sizeof(Account)); + item = rc_alloc(sizeof(Account)); + item->txn_queue = g_queue_new (); + return item; } @@ -140,9 +128,9 @@ da_acc_length(void) /** * da_acc_remove: * - * remove an account from the GHashTable + * delete an account from the GHashTable * - * Return value: TRUE if the key was found and removed + * Return value: TRUE if the key was found and deleted * */ gboolean @@ -360,57 +348,68 @@ GList *list = g_hash_table_get_values(GLOBALS->h_acc); gboolean account_is_used(guint32 key) { +Account *acc; GList *list; +GList *lst_acc, *lnk_acc; +GList *lnk_txn; +gboolean retval; - list = g_list_first(GLOBALS->ope_list); - while (list != NULL) - { - Transaction *entry = list->data; - if( key == entry->kacc || key == entry->kxferacc) - return TRUE; - list = g_list_next(list); - } + retval = FALSE; + lst_acc = NULL; - list = g_list_first(GLOBALS->arc_list); - while (list != NULL) + acc = da_acc_get(key); + if( g_queue_get_length(acc->txn_queue) > 0 ) { - Archive *entry = list->data; - if( key == entry->kacc || key == entry->kxferacc) - return TRUE; - list = g_list_next(list); + retval = TRUE; + goto end; } - return FALSE; -} - -void -account_move(guint32 key1, guint32 key2) -{ -GList *list; - - list = g_list_first(GLOBALS->ope_list); - while (list != NULL) + lst_acc = g_hash_table_get_values(GLOBALS->h_acc); + lnk_acc = g_list_first(lst_acc); + while (lnk_acc != NULL) { - Transaction *entry = list->data; - if(entry->kacc == key1) - entry->kacc = key2; - if(entry->kxferacc == key1) - entry->kxferacc = key2; - list = g_list_next(list); + Account *acc = lnk_acc->data; + + if(acc->key != key) + { + lnk_txn = g_queue_peek_head_link(acc->txn_queue); + while (lnk_txn != NULL) + { + Transaction *entry = lnk_txn->data; + + if( key == entry->kxferacc) + { + retval = TRUE; + goto end; + } + + lnk_txn = g_list_next(lnk_txn); + } + } + lnk_acc = g_list_next(lnk_acc); } list = g_list_first(GLOBALS->arc_list); while (list != NULL) { Archive *entry = list->data; - if(entry->kacc == key1) - entry->kacc = key2; - if(entry->kxferacc == key1) - entry->kxferacc = key2; + + if( key == entry->kacc || key == entry->kxferacc) + { + retval = TRUE; + goto end; + } + list = g_list_next(list); } + +end: + g_list_free(lst_acc); + + return retval; } + static gchar * account_get_stripname(gchar *name) { @@ -453,46 +452,62 @@ gchar *stripname = account_get_stripname(newname); return FALSE; } -/* when we change the currency of an account, we must ensure - * xfer transaction account will be set to same currency + +/* + * change the account currency + * change every txn to currency + * ensure dst xfer transaction account will be set to same currency */ - /* -void account_set_currency(Account *item, guint32 kcur) +void account_set_currency(Account *acc, guint32 kcur) { GList *list; -Account *acc; +Account *dstacc; +gboolean *xfer_list; +guint32 maxkey, i; - if(item->kcur != kcur) + DB( g_print("\n[account] set currency\n") ); + + if(acc->kcur == kcur) { - item->kcur = kcur; - - list = g_list_first(GLOBALS->ope_list); - while (list != NULL) + DB( g_print(" - already ok, return\n") ); + return; + } + + DB( g_print(" - set for '%s'\n", acc->name) ); + + maxkey = da_acc_get_max_key () + 1; + xfer_list = g_malloc0(sizeof(gboolean) * maxkey ); + DB( g_print(" - alloc for %d account\n", da_acc_length() ) ); + + list = g_queue_peek_head_link(acc->txn_queue); + while (list != NULL) + { + Transaction *txn = list->data; + + txn->kcur = kcur; + if( (txn->paymode == PAYMODE_INTXFER) && (txn->kxferacc > 0) && (txn->kxfer > 0) ) { - Transaction *entry = list->data; - if(entry->paymode == PAYMODE_INTXFER) - { - if(entry->kacc == item->key) - { - // change target account - acc = da_acc_get (entry->kxferacc); - acc->kcur = kcur; - } - if(entry->kxferacc == item->key) - { - // change source account - acc = da_acc_get (entry->kacc); - acc->kcur = kcur; - } - } - - list = g_list_next(list); + xfer_list[txn->kxferacc] = TRUE; } + list = g_list_next(list); } + + acc->kcur = kcur; + DB( g_print(" - '%s'\n", acc->name) ); -} -*/ + for(i=1;idate <= GLOBALS->today) acc->bal_today -= trn->amount; - if(trn->flags & OF_VALID) + if(trn->status == TXN_STATUS_RECONCILED) + //if(trn->flags & OF_VALID) acc->bal_bank -= trn->amount; } @@ -519,7 +535,8 @@ static void account_balances_add_internal(Account *acc, Transaction *trn) if(trn->date <= GLOBALS->today) acc->bal_today += trn->amount; - if(trn->flags & OF_VALID) + if(trn->status == TXN_STATUS_RECONCILED) + //if(trn->flags & OF_VALID) acc->bal_bank += trn->amount; } @@ -529,7 +546,9 @@ static void account_balances_add_internal(Account *acc, Transaction *trn) */ gboolean account_balances_sub(Transaction *trn) { - if(!(trn->flags & OF_REMIND)) + + if(!(trn->status == TXN_STATUS_REMIND)) + //if(!(trn->flags & OF_REMIND)) { Account *acc = da_acc_get(trn->kacc); if(acc == NULL) return FALSE; @@ -545,7 +564,8 @@ gboolean account_balances_sub(Transaction *trn) */ gboolean account_balances_add(Transaction *trn) { - if(!(trn->flags & OF_REMIND)) + if(!(trn->status == TXN_STATUS_REMIND)) + //if(!(trn->flags & OF_REMIND)) { Account *acc = da_acc_get(trn->kacc); if(acc == NULL) return FALSE; @@ -556,49 +576,60 @@ gboolean account_balances_add(Transaction *trn) } - - - - +//todo: optim called 2 times from dsp_mainwindow void account_compute_balances(void) { -GList *lacc, *list; -Account *acc; -Transaction *trn; +GList *lst_acc, *lnk_acc; +GList *lnk_txn; DB( g_print("\naccount_compute_balances start\n") ); - /* set initial amount */ - lacc = list = g_hash_table_get_values(GLOBALS->h_acc); - while (list != NULL) + lst_acc = g_hash_table_get_values(GLOBALS->h_acc); + lnk_acc = g_list_first(lst_acc); + while (lnk_acc != NULL) { - acc = list->data; + Account *acc = lnk_acc->data; + + /* set initial amount */ acc->bal_bank = acc->initial; acc->bal_today = acc->initial; acc->bal_future = acc->initial; - list = g_list_next(list); - } - g_list_free(lacc); - - - /* compute every transaction */ - list = g_list_first(GLOBALS->ope_list); - while (list != NULL) - { - trn = list->data; - - if(!(trn->flags & OF_REMIND)) + + /* add every txn */ + lnk_txn = g_queue_peek_head_link(acc->txn_queue); + while (lnk_txn != NULL) { - account_balances_add(trn); + account_balances_add_internal(acc, lnk_txn->data); + lnk_txn = g_list_next(lnk_txn); } - list = g_list_next(list); + + lnk_acc = g_list_next(lnk_acc); } + g_list_free(lst_acc); DB( g_print("\naccount_compute_balances end\n") ); } +void account_convert_euro(Account *acc) +{ +GList *lnk_txn; + + lnk_txn = g_queue_peek_head_link(acc->txn_queue); + while (lnk_txn != NULL) + { + Transaction *txn = lnk_txn->data; + gdouble oldamount = txn->amount; + txn->amount = hb_amount_to_euro(oldamount); + DB( g_print("%10.6f => %10.6f, %s\n", oldamount, txn->amount, txn->wording) ); + //todo: sync child xfer + lnk_txn = g_list_next(lnk_txn); + } + acc->initial = hb_amount_to_euro(acc->initial); + acc->warning = hb_amount_to_euro(acc->warning); + acc->minimum = hb_amount_to_euro(acc->minimum); +}