X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fhomebank;a=blobdiff_plain;f=src%2Fhb-filter.c;h=d9081562cf07d0c4d84bad973562a1572cff3365;hp=18c57774fc779c3be15aad00ddca1052bbf9d8c3;hb=refs%2Fheads%2Fupstream;hpb=27f6e3b112df235c8e9afc9911b1f6bce208a001 diff --git a/src/hb-filter.c b/src/hb-filter.c index 18c5777..d908156 100644 --- a/src/hb-filter.c +++ b/src/hb-filter.c @@ -1,5 +1,5 @@ /* HomeBank -- Free, easy, personal accounting for everyone. - * Copyright (C) 1995-2014 Maxime DOYEN + * Copyright (C) 1995-2019 Maxime DOYEN * * This file is part of HomeBank. * @@ -36,234 +36,357 @@ extern struct HomeBank *GLOBALS; extern struct Preferences *PREFS; +/* = = = = = = = = = = = = = = = = */ - -/* = = = = = = = = = = = = = = = = = = = = */ -/* Filter */ - -Filter *da_filter_malloc(void) -{ - return g_malloc0(sizeof(Filter)); -} - -void da_filter_free(Filter *flt) +void da_flt_free(Filter *flt) { + DB( g_print("da_flt_free\n") ); if(flt != NULL) { - g_free(flt->wording); + g_free(flt->memo); g_free(flt->info); g_free(flt->tag); g_free(flt); } } + +Filter *da_flt_malloc(void) +{ + DB( g_print("da_flt_malloc\n") ); + return g_malloc0(sizeof(Filter)); +} + + /* = = = = = = = = = = = = = = = = = = = = */ -gchar *filter_daterange_text_get(Filter *flt) + +void filter_status_acc_clear_except(Filter *flt, guint32 selkey) { -gchar buffer1[128]; -gchar buffer2[128]; -GDate *date; +GHashTableIter iter; +gpointer key, value; - date = g_date_new_julian(flt->mindate); - g_date_strftime (buffer1, 128-1, PREFS->date_format, date); - g_date_set_julian(date, flt->maxdate); - g_date_strftime (buffer2, 128-1, PREFS->date_format, date); - g_date_free(date); + // set all account + g_hash_table_iter_init (&iter, GLOBALS->h_acc); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + Account *item = value; + item->flt_select = item->key == selkey ? TRUE : FALSE; + } - return g_strdup_printf(_("from %s to %s"), buffer1, buffer2); } +void filter_status_pay_clear_except(Filter *flt, guint32 selkey) +{ +GHashTableIter iter; +gpointer key, value; + + // set all payee + g_hash_table_iter_init (&iter, GLOBALS->h_pay); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + Payee *item = value; + item->flt_select = item->key == selkey ? TRUE : FALSE; + } + +} + -static void filter_default_date_set(Filter *flt) +void filter_status_cat_clear_except(Filter *flt, guint32 selkey) { - flt->mindate = 693596; //01/01/1900 - flt->maxdate = 803533; //31/12/2200 +GHashTableIter iter; +gpointer key, value; + + // set all category + g_hash_table_iter_init (&iter, GLOBALS->h_cat); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + Category *item = value; + + + item->flt_select = FALSE; + if( (item->key == selkey) + //#1824561 don't forget subcat + //#1829076 but not when selkey is 0 + || ((item->parent == selkey) && selkey > 0) + ) + item->flt_select = TRUE; + } + } -static void filter_clear(Filter *flt) +/* = = = = = = = = = = = = = = = = */ + + +void filter_reset(Filter *flt) { -guint i; +gint i; + + DB( g_print("\n[filter] default reset all %p\n", flt) ); for(i=0;ioption[i] = 0; } - + + flt->option[FILTER_DATE] = 1; + flt->range = FLT_RANGE_LAST12MONTHS; + filter_preset_daterange_set(flt, flt->range, 0); + + for(i=0;ipaymode[i] = TRUE; + g_free(flt->info); - g_free(flt->wording); + g_free(flt->memo); g_free(flt->tag); flt->info = NULL; - flt->wording = NULL; + flt->memo = NULL; flt->tag = NULL; - flt->last_tab = 0; + //unsaved + flt->nbdaysfuture = 0; + flt->type = FLT_TYPE_ALL; + flt->status = FLT_STATUS_ALL; + flt->forceremind = PREFS->showremind; + + *flt->last_tab = '\0'; } -void filter_default_all_set(Filter *flt) +void filter_set_tag_by_id(Filter *flt, guint32 key) { -gint i; +Tag *tag; - DB( g_print("(filter) reset %p\n", flt) ); + DB( g_print("\n[filter] set tag by id\n") ); + + if(flt->tag) + { + g_free(flt->tag); + flt->tag = NULL; + } - filter_clear(flt); + tag = da_tag_get(key); + if(tag) + { + flt->tag = g_strdup(tag->name); + } +} - flt->range = FLT_RANGE_LAST12MONTHS; - flt->type = FLT_TYPE_ALL; - flt->status = FLT_STATUS_ALL; - flt->option[FILTER_DATE] = 1; - filter_default_date_set(flt); +static void filter_set_date_bounds(Filter *flt, guint32 kacc) +{ +GList *lst_acc, *lnk_acc; +GList *lnk_txn; - for(i=0;ipaymode[i] = TRUE; + DB( g_print("\n[filter] set date bounds %p\n", flt) ); + + flt->mindate = 0; + flt->maxdate = 0; + + lst_acc = g_hash_table_get_values(GLOBALS->h_acc); + lnk_acc = g_list_first(lst_acc); + while (lnk_acc != NULL) + { + Account *acc = lnk_acc->data; + + //#1674045 only rely on nosummary + //if( !(acc->flags & AF_CLOSED) ) + { + Transaction *txn; + + DB( g_print(" - do '%s'\n", acc->name) ); + + lnk_txn = g_queue_peek_head_link(acc->txn_queue); + if(lnk_txn) { + txn = lnk_txn->data; + if( (kacc == 0) || (txn->kacc == kacc) ) + { + if( flt->mindate == 0 ) + flt->mindate = txn->date; + else + flt->mindate = MIN(flt->mindate, txn->date); + } + } - filter_preset_daterange_set(flt, flt->range); + lnk_txn = g_queue_peek_tail_link(acc->txn_queue); + if(lnk_txn) { + txn = lnk_txn->data; + if( (kacc == 0) || (txn->kacc == kacc) ) + { + if( flt->maxdate == 0 ) + flt->maxdate = txn->date; + else + flt->maxdate = MAX(flt->maxdate, txn->date); + } + } + } + lnk_acc = g_list_next(lnk_acc); + } + + if( flt->mindate == 0 ) + //changed 5.3 + //flt->mindate = HB_MINDATE; + flt->mindate = GLOBALS->today - 365; + + if( flt->maxdate == 0 ) + //changed 5.3 + //flt->maxdate = HB_MAXDATE; + flt->maxdate = GLOBALS->today + flt->nbdaysfuture; + + g_list_free(lst_acc); } -void filter_preset_daterange_set(Filter *flt, gint range) +gboolean filter_preset_daterange_future_enable(gint range) { -GDate *date; -GList *list; -guint32 refjuliandate, month, year, qnum; - - // any date :: todo : get date of current accout only when account - flt->range = range; - if(g_list_length(GLOBALS->ope_list) > 0) // get all transaction date bound + switch( range ) { - GLOBALS->ope_list = da_transaction_sort(GLOBALS->ope_list); - list = g_list_first(GLOBALS->ope_list); - flt->mindate = ((Transaction *)list->data)->date; - list = g_list_last(GLOBALS->ope_list); - flt->maxdate = ((Transaction *)list->data)->date; + case FLT_RANGE_THISMONTH: + case FLT_RANGE_THISQUARTER: + case FLT_RANGE_THISYEAR: + case FLT_RANGE_LAST30DAYS: + case FLT_RANGE_LAST60DAYS: + case FLT_RANGE_LAST90DAYS: + case FLT_RANGE_LAST12MONTHS: + return TRUE; + break; } - else - filter_default_date_set(flt); + + return FALSE; +} + + +void filter_preset_daterange_add_futuregap(Filter *filter, gint nbdays) +{ + + DB( g_print("\n[filter] range add future gap\n") ); + //fixed > 5.1.7 + /*if( nbdays <= 0 ) + { + filter->nbdaysfuture = 0; + return; + }*/ + + filter->nbdaysfuture = 0; + if( filter_preset_daterange_future_enable(filter->range) ) + filter->nbdaysfuture = nbdays; + +} + + +void filter_preset_daterange_set(Filter *flt, gint range, guint32 kacc) +{ +GDate *tmpdate; +guint32 jtoday, jfiscal; +guint16 month, year, yfiscal, qnum; + + DB( g_print("\n[filter] daterange set %p %d\n", flt, range) ); + + flt->range = range; - // by default refjuliandate is today - // but we adjust if to max transaction date found - refjuliandate = GLOBALS->today; - if(flt->maxdate < refjuliandate) - refjuliandate = flt->maxdate; + jtoday = GLOBALS->today; + + tmpdate = g_date_new_julian(jtoday); + + month = g_date_get_month(tmpdate); + year = g_date_get_year(tmpdate); + DB( hb_print_date(jtoday , "today ") ); - date = g_date_new_julian(refjuliandate); - month = g_date_get_month(date); - year = g_date_get_year(date); - qnum = ((month - 1) / 3) + 1; + g_date_set_dmy(tmpdate, PREFS->fisc_year_day, PREFS->fisc_year_month, year); + jfiscal = g_date_get_julian(tmpdate); + DB( hb_print_date(jfiscal, "fiscal") ); - DB( g_print("m=%d, y=%d, qnum=%d\n", month, year, qnum) ); + yfiscal = (jtoday >= jfiscal) ? year : year-1; + qnum = 0; + if( range == FLT_RANGE_THISQUARTER || range == FLT_RANGE_LASTQUARTER ) + { + g_date_set_dmy(tmpdate, PREFS->fisc_year_day, PREFS->fisc_year_month, yfiscal); + while( (qnum < 5) && (g_date_get_julian(tmpdate) < jtoday) ) + { + qnum++; + g_date_add_months (tmpdate, 3); + } + DB( g_print(" qnum: %d\n", qnum ) ); + } + switch( range ) { case FLT_RANGE_THISMONTH: - g_date_set_day(date, 1); - flt->mindate = g_date_get_julian(date); - g_date_add_days(date, g_date_get_days_in_month(month, year)-1); - flt->maxdate = g_date_get_julian(date); - break; - case FLT_RANGE_LASTMONTH: - g_date_set_day(date, 1); - g_date_subtract_months(date, 1); - flt->mindate = g_date_get_julian(date); - month = g_date_get_month(date); - year = g_date_get_year(date); - g_date_add_days(date, g_date_get_days_in_month(month, year)-1); - flt->maxdate = g_date_get_julian(date); + g_date_set_dmy(tmpdate, 1, month, year); + if( range == FLT_RANGE_LASTMONTH ) + g_date_subtract_months(tmpdate, 1); + flt->mindate = g_date_get_julian(tmpdate); + month = g_date_get_month(tmpdate); + year = g_date_get_year(tmpdate); + g_date_add_days(tmpdate, g_date_get_days_in_month(month, year)); + flt->maxdate = g_date_get_julian(tmpdate) - 1; break; case FLT_RANGE_THISQUARTER: - g_date_set_day(date, 1); - g_date_set_month(date, (qnum-1)*3+1); - flt->mindate = g_date_get_julian(date); - g_date_add_months(date, 3); - g_date_subtract_days(date, 1); - flt->maxdate = g_date_get_julian(date); - break; - case FLT_RANGE_LASTQUARTER: - g_date_set_day(date, 1); - g_date_set_month(date, (qnum-1)*3+1); - g_date_subtract_months(date, 3); - flt->mindate = g_date_get_julian(date); - g_date_add_months(date, 3); - g_date_subtract_days(date, 1); - flt->maxdate = g_date_get_julian(date); + g_date_set_dmy(tmpdate, PREFS->fisc_year_day, PREFS->fisc_year_month, yfiscal); + if( range == FLT_RANGE_LASTQUARTER ) + g_date_subtract_months(tmpdate, 3); + g_date_add_months(tmpdate, 3 * (qnum-1) ); + flt->mindate = g_date_get_julian(tmpdate); + g_date_add_months(tmpdate, 3); + flt->maxdate = g_date_get_julian(tmpdate) - 1; break; case FLT_RANGE_THISYEAR: - g_date_set_dmy(date, PREFS->fisc_year_day, PREFS->fisc_year_month, year); - if( refjuliandate >= g_date_get_julian (date)) - { - flt->mindate = g_date_get_julian(date); - } - else - { - g_date_set_dmy(date, PREFS->fisc_year_day, PREFS->fisc_year_month, year-1); - flt->mindate = g_date_get_julian(date); - } - g_date_add_years (date, 1); - g_date_subtract_days (date, 1); - flt->maxdate = g_date_get_julian(date); - break; - case FLT_RANGE_LASTYEAR: - g_date_set_dmy(date, PREFS->fisc_year_day, PREFS->fisc_year_month, year); - if( refjuliandate >= g_date_get_julian (date)) - { - g_date_set_dmy(date, PREFS->fisc_year_day, PREFS->fisc_year_month, year-1); - flt->mindate = g_date_get_julian(date); - } - else - { - g_date_set_dmy(date, PREFS->fisc_year_day, PREFS->fisc_year_month, year-2); - flt->mindate = g_date_get_julian(date); - } - g_date_add_years (date, 1); - g_date_subtract_days (date, 1); - flt->maxdate = g_date_get_julian(date); + g_date_set_dmy(tmpdate, PREFS->fisc_year_day, PREFS->fisc_year_month, yfiscal); + if( range == FLT_RANGE_LASTYEAR ) + g_date_subtract_years(tmpdate, 1); + flt->mindate = g_date_get_julian(tmpdate); + g_date_add_years (tmpdate, 1); + flt->maxdate = g_date_get_julian(tmpdate) - 1; break; case FLT_RANGE_LAST30DAYS: - flt->mindate = refjuliandate - 30; - flt->maxdate = refjuliandate; + flt->mindate = jtoday - 30; + flt->maxdate = jtoday; break; case FLT_RANGE_LAST60DAYS: - flt->mindate = refjuliandate - 60; - flt->maxdate = refjuliandate; + flt->mindate = jtoday - 60; + flt->maxdate = jtoday; break; case FLT_RANGE_LAST90DAYS: - flt->mindate = refjuliandate - 90; - flt->maxdate = refjuliandate; + flt->mindate = jtoday - 90; + flt->maxdate = jtoday; break; case FLT_RANGE_LAST12MONTHS: - g_date_subtract_months(date, 12); - flt->mindate = g_date_get_julian(date); - flt->maxdate = refjuliandate; + g_date_set_julian (tmpdate, jtoday); + g_date_subtract_months(tmpdate, 12); + flt->mindate = g_date_get_julian(tmpdate); + flt->maxdate = jtoday; break; // case FLT_RANGE_OTHER: - - // case FLT_RANGE_ALLDATE: - - + //nothing to do + + case FLT_RANGE_ALLDATE: + filter_set_date_bounds(flt, kacc); + break; } - g_date_free(date); - + g_date_free(tmpdate); } + void filter_preset_type_set(Filter *flt, gint type) { + DB( g_print("\n[filter] preset type set\n") ); + /* any type */ flt->type = type; flt->option[FILTER_AMOUNT] = 0; @@ -290,72 +413,85 @@ void filter_preset_type_set(Filter *flt, gint type) void filter_preset_status_set(Filter *flt, gint status) { -Category *catitem; -GList *lcat, *list; + DB( g_print("\n[filter] preset status set\n") ); + /* any status */ flt->status = status; flt->option[FILTER_STATUS] = 0; - flt->reconciled = TRUE; - flt->reminded = TRUE; - flt->forceadd = FALSE; - flt->forcechg = FALSE; - flt->option[FILTER_CATEGORY] = 0; - lcat = list = g_hash_table_get_values(GLOBALS->h_cat); - while (list != NULL) - { - catitem = list->data; - catitem->filter = FALSE; - list = g_list_next(list); - } - g_list_free(lcat); + flt->option[FILTER_PAYMODE] = 0; + flt->reconciled = TRUE; + flt->cleared = TRUE; + //#1602835 fautly set + //flt->forceadd = TRUE; + //flt->forcechg = TRUE; switch( status ) { case FLT_STATUS_UNCATEGORIZED: flt->option[FILTER_CATEGORY] = 1; - catitem = da_cat_get(0); // no category - catitem->filter = TRUE; + filter_status_cat_clear_except(flt, 0); + flt->option[FILTER_PAYMODE] = 1; + flt->paymode[PAYMODE_INTXFER] = FALSE; break; case FLT_STATUS_UNRECONCILED: flt->option[FILTER_STATUS] = 2; flt->reconciled = TRUE; - //#1336882 - flt->reminded = FALSE; + flt->cleared = FALSE; + break; + + case FLT_STATUS_UNCLEARED: + flt->option[FILTER_STATUS] = 2; + flt->reconciled = FALSE; + flt->cleared = TRUE; + break; + + case FLT_STATUS_RECONCILED: + flt->option[FILTER_STATUS] = 1; + flt->reconciled = TRUE; + flt->cleared = FALSE; break; - } + case FLT_STATUS_CLEARED: + flt->option[FILTER_STATUS] = 1; + flt->reconciled = FALSE; + flt->cleared = TRUE; + break; + + } } -static gint filter_text_compare(gchar *txntext, gchar *searchtext, gboolean exact) +gchar *filter_daterange_text_get(Filter *flt) { -gint retval = 0; +gchar buffer1[128]; +gchar buffer2[128]; +gchar buffer3[128]; +GDate *date; +gchar *retval = NULL; - if( exact ) + DB( g_print("\n[filter] daterange text get\n") ); + + date = g_date_new_julian(flt->mindate); + g_date_strftime (buffer1, 128-1, PREFS->date_format, date); + + g_date_set_julian(date, flt->maxdate); + g_date_strftime (buffer2, 128-1, PREFS->date_format, date); + + if( flt->nbdaysfuture > 0 ) { - if( g_strstr_len(txntext, -1, searchtext) != NULL ) - { - DB( g_print(" found case '%s'\n", searchtext) ); - retval = 1; - } + g_date_set_julian(date, flt->maxdate + flt->nbdaysfuture); + g_date_strftime (buffer3, 128-1, PREFS->date_format, date); + retval = g_strdup_printf("%s — %s %s", buffer1, buffer2, buffer3); } else - { - gchar *word = g_utf8_casefold(txntext, -1); - gchar *needle = g_utf8_casefold(searchtext, -1); - - if( g_strrstr(word, needle) != NULL ) - { - DB( g_print(" found nocase '%s'\n", needle) ); - retval = 1; - } + retval = g_strdup_printf("%s — %s", buffer1, buffer2); + + g_date_free(date); - g_free(word); - g_free(needle); - } + //return g_strdup_printf(_("from %s to %s — "), buffer1, buffer2); return retval; } @@ -368,11 +504,34 @@ Payee *payitem; Category *catitem; gchar *tags; + DB( g_print("\n[filter] tnx search match\n") ); + if(flags & FLT_QSEARCH_MEMO) { - if(txn->wording) + //#1668036 always try match on txn memo first + if(txn->memo) + { + retval |= hb_string_utf8_strstr(txn->memo, needle, FALSE); + } + if(retval) goto end; + + //#1509485 + if(txn->flags & OF_SPLIT) { - retval |= filter_text_compare(txn->wording, needle, FALSE); + guint count, i; + Split *split; + + count = da_splits_length(txn->splits); + for(i=0;isplits, i); + tmpinsert = hb_string_utf8_strstr(split->memo, needle, FALSE); + retval |= tmpinsert; + if( tmpinsert ) + break; + } } if(retval) goto end; } @@ -381,7 +540,7 @@ gchar *tags; { if(txn->info) { - retval |= filter_text_compare(txn->info, needle, FALSE); + retval |= hb_string_utf8_strstr(txn->info, needle, FALSE); } if(retval) goto end; } @@ -391,33 +550,65 @@ gchar *tags; payitem = da_pay_get(txn->kpay); if(payitem) { - retval |= filter_text_compare(payitem->name, needle, FALSE); + retval |= hb_string_utf8_strstr(payitem->name, needle, FALSE); } if(retval) goto end; } if(flags & FLT_QSEARCH_CATEGORY) { - catitem = da_cat_get(txn->kcat); - if(catitem) + //#1509485 + if(txn->flags & OF_SPLIT) { - gchar *fullname = da_cat_get_fullname (catitem); + guint count, i; + Split *split; - retval |= filter_text_compare(fullname, needle, FALSE); - g_free(fullname); + count = da_splits_length(txn->splits); + for(i=0;isplits, i); + catitem = da_cat_get(split->kcat); + if(catitem) + { + tmpinsert = hb_string_utf8_strstr(catitem->fullname, needle, FALSE); + retval |= tmpinsert; + } + + if( tmpinsert ) + break; + } + } + else + { + catitem = da_cat_get(txn->kcat); + if(catitem) + { + retval |= hb_string_utf8_strstr(catitem->fullname, needle, FALSE); + } } if(retval) goto end; } if(flags & FLT_QSEARCH_TAGS) { - tags = transaction_tags_tostring(txn); + tags = tags_tostring(txn->tags); if(tags) { - retval |= filter_text_compare(tags, needle, FALSE); + retval |= hb_string_utf8_strstr(tags, needle, FALSE); } g_free(tags); - //if(retval) goto end; + if(retval) goto end; + } + + //#1741339 add quicksearch for amount + if(flags & FLT_QSEARCH_AMOUNT) + { + gchar formatd_buf[G_ASCII_DTOSTR_BUF_SIZE]; + + hb_strfnum(formatd_buf, G_ASCII_DTOSTR_BUF_SIZE-1, txn->amount, txn->kcur, FALSE); + retval |= hb_string_utf8_strstr(formatd_buf, needle, FALSE); } @@ -426,29 +617,33 @@ end: } -gint filter_test(Filter *flt, Transaction *txn) +gint filter_txn_match(Filter *flt, Transaction *txn) { Account *accitem; Payee *payitem; Category *catitem; gint insert; - //DB( g_print("(filter) test\n") ); + //DB( g_print("\n[filter] txn match\n") ); insert = 1; /*** start filtering ***/ - /* add/change force */ + /* force display */ if(flt->forceadd == TRUE && (txn->flags & OF_ADDED)) goto end; if(flt->forcechg == TRUE && (txn->flags & OF_CHANGED)) goto end; + /* force remind if not filter on status */ + if(flt->forceremind == TRUE && (txn->status == TXN_STATUS_REMIND)) + goto end; + /* date */ if(flt->option[FILTER_DATE]) { - insert = ( (txn->date >= flt->mindate) && (txn->date <= flt->maxdate) ) ? 1 : 0; + insert = ( (txn->date >= flt->mindate) && (txn->date <= (flt->maxdate + flt->nbdaysfuture) ) ) ? 1 : 0; if(flt->option[FILTER_DATE] == 2) insert ^= 1; } if(!insert) goto end; @@ -458,7 +653,7 @@ gint insert; accitem = da_acc_get(txn->kacc); if(accitem) { - insert = ( accitem->filter == TRUE ) ? 1 : 0; + insert = ( accitem->flt_select == TRUE ) ? 1 : 0; if(flt->option[FILTER_ACCOUNT] == 2) insert ^= 1; } } @@ -469,7 +664,7 @@ gint insert; payitem = da_pay_get(txn->kpay); if(payitem) { - insert = ( payitem->filter == TRUE ) ? 1 : 0; + insert = ( payitem->flt_select == TRUE ) ? 1 : 0; if(flt->option[FILTER_PAYEE] == 2) insert ^= 1; } } @@ -483,16 +678,16 @@ gint insert; Split *split; insert = 0; //fix: 1151259 - count = da_transaction_splits_count(txn); + count = da_splits_length(txn->splits); for(i=0;isplits[i]; + split = da_splits_get(txn->splits, i); catitem = da_cat_get(split->kcat); if(catitem) { - tmpinsert = ( catitem->filter == TRUE ) ? 1 : 0; + tmpinsert = ( catitem->flt_select == TRUE ) ? 1 : 0; if(flt->option[FILTER_CATEGORY] == 2) tmpinsert ^= 1; } insert |= tmpinsert; @@ -503,7 +698,7 @@ gint insert; catitem = da_cat_get(txn->kcat); if(catitem) { - insert = ( catitem->filter == TRUE ) ? 1 : 0; + insert = ( catitem->flt_select == TRUE ) ? 1 : 0; if(flt->option[FILTER_CATEGORY] == 2) insert ^= 1; } } @@ -515,9 +710,9 @@ gint insert; gint insert1 = 0, insert2 = 0; if(flt->reconciled) - insert1 = ( txn->flags & OF_VALID ) ? 1 : 0; - if(flt->reminded) - insert2 = ( txn->flags & OF_REMIND ) ? 1 : 0; + insert1 = ( txn->status == TXN_STATUS_RECONCILED ) ? 1 : 0; + if(flt->cleared) + insert2 = ( txn->status == TXN_STATUS_CLEARED ) ? 1 : 0; insert = insert1 | insert2; if(flt->option[FILTER_STATUS] == 2) insert ^= 1; @@ -539,7 +734,7 @@ gint insert; } if(!insert) goto end; -/* info/wording/tag */ +/* info/memo/tag */ if(flt->option[FILTER_TEXT]) { gchar *tags; @@ -550,17 +745,36 @@ gint insert; { if(txn->info) { - insert1 = filter_text_compare(txn->info, flt->info, flt->exact); + insert1 = hb_string_utf8_strstr(txn->info, flt->info, flt->exact); } } else insert1 = 1; - if(flt->wording) + if(flt->memo) { - if(txn->wording) + //#1668036 always try match on txn memo first + if(txn->memo) { - insert2 = filter_text_compare(txn->wording, flt->wording, flt->exact); + insert2 = hb_string_utf8_strstr(txn->memo, flt->memo, flt->exact); + } + + if( (insert2 == 0) && (txn->flags & OF_SPLIT) ) + { + guint count, i; + Split *split; + + count = da_splits_length(txn->splits); + for(i=0;isplits, i); + tmpinsert = hb_string_utf8_strstr(split->memo, flt->memo, flt->exact); + insert2 |= tmpinsert; + if( tmpinsert ) + break; + } } } else @@ -568,10 +782,10 @@ gint insert; if(flt->tag) { - tags = transaction_tags_tostring(txn); + tags = tags_tostring(txn->tags); if(tags) { - insert3 = filter_text_compare(tags, flt->tag, flt->exact); + insert3 = hb_string_utf8_strstr(tags, flt->tag, flt->exact); } g_free(tags); } @@ -587,7 +801,7 @@ gint insert; end: // DB( g_print(" %d :: %d :: %d\n", flt->mindate, txn->date, flt->maxdate) ); -// DB( g_print(" [%d] %s => %d (%d)\n", txn->account, txn->wording, insert, count) ); +// DB( g_print(" [%d] %s => %d (%d)\n", txn->account, txn->memo, insert, count) ); return(insert); }