X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fhomebank;a=blobdiff_plain;f=src%2Fhb-archive.c;h=0e88c48549f243252fb63d64c87738d249ff8291;hp=43cfbeac68dc2908a8908a31185bd89c0fe35733;hb=cd13d9691c46c2b2d6d459e9e6a76bed1c21b7a6;hpb=b84403141a4c3a32a594800eb3fcabdc856461f8 diff --git a/src/hb-archive.c b/src/hb-archive.c index 43cfbea..0e88c48 100644 --- a/src/hb-archive.c +++ b/src/hb-archive.c @@ -1,5 +1,5 @@ /* HomeBank -- Free, easy, personal accounting for everyone. - * Copyright (C) 1995-2017 Maxime DOYEN + * Copyright (C) 1995-2018 Maxime DOYEN * * This file is part of HomeBank. * @@ -36,14 +36,12 @@ extern struct HomeBank *GLOBALS; -/* = = = = = = = = = = = = = = = = = = = = */ -/* Archive */ - Archive *da_archive_malloc(void) { return g_malloc0(sizeof(Archive)); } + Archive *da_archive_clone(Archive *src_item) { Archive *new_item = g_memdup(src_item, sizeof(Archive)); @@ -51,20 +49,21 @@ Archive *new_item = g_memdup(src_item, sizeof(Archive)); if(new_item) { //duplicate the string - new_item->wording = g_strdup(src_item->wording); - + new_item->memo = g_strdup(src_item->memo); + if( da_splits_clone(src_item->splits, new_item->splits) > 0) new_item->flags |= OF_SPLIT; //Flag that Splits are active } return new_item; } + void da_archive_free(Archive *item) { if(item != NULL) { - if(item->wording != NULL) - g_free(item->wording); + if(item->memo != NULL) + g_free(item->memo); da_splits_free(item->splits); //item->flags &= ~(OF_SPLIT); //Flag that Splits are cleared @@ -73,6 +72,7 @@ void da_archive_free(Archive *item) } } + void da_archive_destroy(GList *list) { GList *tmplist = g_list_first(list); @@ -86,9 +86,13 @@ GList *tmplist = g_list_first(list); g_list_free(list); } + +/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + static gint da_archive_glist_compare_func(Archive *a, Archive *b) { - return hb_string_utf8_compare(a->wording, b->wording); + return hb_string_utf8_compare(a->memo, b->memo); } @@ -97,11 +101,13 @@ GList *da_archive_sort(GList *list) return g_list_sort(list, (GCompareFunc)da_archive_glist_compare_func); } + guint da_archive_length(void) { return g_list_length(GLOBALS->arc_list); } + void da_archive_consistency(Archive *item) { Account *acc; @@ -148,19 +154,21 @@ Payee *pay; Archive *da_archive_init_from_transaction(Archive *arc, Transaction *txn) { + DB( g_print("\n[scheduled] init from txn\n") ); + //fill it arc->amount = txn->amount; arc->kacc = txn->kacc; arc->kxferacc = txn->kxferacc; - arc->paymode = txn->paymode; - arc->flags = txn->flags & (OF_INCOME); + arc->paymode = txn->paymode; + arc->flags = txn->flags & (OF_INCOME); arc->status = txn->status; - arc->kpay = txn->kpay; + arc->kpay = txn->kpay; arc->kcat = txn->kcat; - if(txn->wording != NULL) - arc->wording = g_strdup(txn->wording); + if(txn->memo != NULL) + arc->memo = g_strdup(txn->memo); else - arc->wording = g_strdup(_("(new archive)")); + arc->memo = g_strdup(_("(new archive)")); if( da_splits_clone(txn->splits, arc->splits) > 0) arc->flags |= OF_SPLIT; //Flag that Splits are active @@ -169,16 +177,16 @@ Archive *da_archive_init_from_transaction(Archive *arc, Transaction *txn) } - - -static guint32 _sched_date_get_next_post(Archive *arc, guint32 nextdate) +static guint32 _sched_date_get_next_post(GDate *tmpdate, Archive *arc, guint32 nextdate) { -GDate *tmpdate; guint32 nextpostdate = nextdate; - DB( g_print("\n[scheduled] _sched_date_get_next_post\n") ); + //DB( g_print("\n[scheduled] date_get_next_post\n") ); + + g_date_set_julian(tmpdate, nextpostdate); + + //DB( g_print("in : %2d-%2d-%4d\n", g_date_get_day(tmpdate), g_date_get_month (tmpdate), g_date_get_year(tmpdate) ) ); - tmpdate = g_date_new_julian(nextpostdate); switch(arc->unit) { case AUTO_UNIT_DAY: @@ -195,9 +203,11 @@ guint32 nextpostdate = nextdate; break; } + //DB( g_print("out: %2d-%2d-%4d\n", g_date_get_day(tmpdate), g_date_get_month (tmpdate), g_date_get_year(tmpdate) ) ); + + /* get the final post date and free */ nextpostdate = g_date_get_julian(tmpdate); - g_date_free(tmpdate); return nextpostdate; } @@ -222,7 +232,7 @@ GDateWeekday wday; guint32 finalpostdate; gint shift; - DB( g_print("\n[scheduled] scheduled_get_postdate\n") ); + DB( g_print("\n[scheduled] get_postdate\n") ); finalpostdate = postdate; @@ -233,7 +243,7 @@ gint shift; { wday = g_date_get_weekday(tmpdate); - DB( g_print(" %s wday=%d\n", arc->wording, wday) ); + DB( g_print(" %s wday=%d\n", arc->memo, wday) ); if( wday >= G_DATE_SATURDAY ) { @@ -264,10 +274,14 @@ gint shift; guint32 scheduled_get_latepost_count(Archive *arc, guint32 jrefdate) { -guint32 curdate = jrefdate - arc->nextdate; +GDate *post_date; +guint32 curdate; guint32 nblate = 0; + //DB( g_print("\n[scheduled] get_latepost_count\n") ); + /* + curdate = jrefdate - arc->nextdate; switch(arc->unit) { case AUTO_UNIT_DAY: @@ -303,16 +317,21 @@ guint32 nblate = 0; // pre 5.1 way + post_date = g_date_new(); curdate = arc->nextdate; while(curdate <= jrefdate) { - curdate = _sched_date_get_next_post(arc, curdate); + curdate = _sched_date_get_next_post(post_date, arc, curdate); nblate++; // break if over limit or at 11 max (to display +10) if(nblate >= arc->limit || nblate >= 11) break; } + //DB( g_print(" nblate=%d\n", nblate) ); + + g_date_free(post_date); + return nblate; } @@ -320,8 +339,45 @@ guint32 nblate = 0; /* return 0 is max number of post is reached */ guint32 scheduled_date_advance(Archive *arc) { - arc->nextdate = _sched_date_get_next_post(arc, arc->nextdate); - +GDate *post_date; +gushort lastday; + + DB( g_print("\n[scheduled] date_advance\n") ); + + DB( g_print(" arc: '%s'\n", arc->memo ) ); + + post_date = g_date_new(); + g_date_set_julian(post_date, arc->nextdate); + // saved the current day number + lastday = g_date_get_day(post_date); + + arc->nextdate = _sched_date_get_next_post(post_date, arc, arc->nextdate); + + DB( g_print(" raw next post date: %2d-%2d-%4d\n", g_date_get_day(post_date), g_date_get_month (post_date), g_date_get_year(post_date) ) ); + + //for day > 28 we might have a gap to compensate later + if( (arc->unit==AUTO_UNIT_MONTH) || (arc->unit==AUTO_UNIT_YEAR) ) + { + if( lastday >= 28 ) + { + DB( g_print(" lastday:%d, daygap:%d\n", lastday, arc->daygap) ); + if( arc->daygap > 0 ) + { + g_date_add_days (post_date, arc->daygap); + arc->nextdate = g_date_get_julian (post_date); + lastday += arc->daygap; + DB( g_print(" adjusted post date: %2d-%2d-%4d\n", g_date_get_day(post_date), g_date_get_month (post_date), g_date_get_year(post_date) ) ); + } + + arc->daygap = CLAMP(lastday - g_date_get_day(post_date), 0, 3); + + DB( g_print(" daygap is %d\n", arc->daygap) ); + } + else + arc->daygap = 0; + } + + //#1556289 /* check limit, update and maybe break */ if(arc->flags & OF_LIMIT) @@ -333,7 +389,9 @@ guint32 scheduled_date_advance(Archive *arc) arc->nextdate = 0; } } - + + g_date_free(post_date); + return arc->nextdate; } @@ -399,7 +457,7 @@ Transaction *txn; { Archive *arc = list->data; - DB( g_print("\n eval %d for '%s'\n", scheduled_is_postable(arc), arc->wording) ); + DB( g_print("\n eval %d for '%s'\n", scheduled_is_postable(arc), arc->memo) ); if(scheduled_is_postable(arc) == TRUE) { @@ -412,13 +470,13 @@ Transaction *txn; while(mydate < maxpostdate) { - DB( hb_print_date(mydate, arc->wording) ); + DB( hb_print_date(mydate, arc->memo) ); da_transaction_init_from_template(txn, arc); txn->date = scheduled_get_postdate(arc, mydate); /* todo: ? fill in cheque number */ - transaction_add(txn, NULL, 0); + transaction_add(txn); GLOBALS->changes_count++; count++;