X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fhomebank;a=blobdiff_plain;f=src%2Frep-stats.c;fp=src%2Frep_stats.c;h=34a19f41e02b05367df28082f27f713b1ea92d9d;hp=a9d85fa097ab8b990f4e4f84a3f43bfe4317b2ed;hb=a6c6b0df5492c2160ed97e3a376bdb2fe7c5ebc4;hpb=cd13d9691c46c2b2d6d459e9e6a76bed1c21b7a6 diff --git a/src/rep_stats.c b/src/rep-stats.c similarity index 86% rename from src/rep_stats.c rename to src/rep-stats.c index a9d85fa..34a19f4 100644 --- a/src/rep_stats.c +++ b/src/rep-stats.c @@ -1,5 +1,5 @@ /* HomeBank -- Free, easy, personal accounting for everyone. - * Copyright (C) 1995-2018 Maxime DOYEN + * Copyright (C) 1995-2019 Maxime DOYEN * * This file is part of HomeBank. * @@ -20,13 +20,13 @@ #include "homebank.h" -#include "rep_stats.h" +#include "rep-stats.h" -#include "list_operation.h" +#include "list-operation.h" #include "gtk-chart.h" #include "gtk-dateentry.h" -#include "dsp_mainwindow.h" +#include "dsp-mainwindow.h" #include "ui-account.h" #include "ui-payee.h" #include "ui-category.h" @@ -70,7 +70,7 @@ static guint n_radio_entries = G_N_ELEMENTS (radio_entries); static GtkActionEntry entries[] = { { "Filter" , ICONNAME_HB_FILTER , N_("Filter") , NULL, N_("Edit filter"), G_CALLBACK (ui_repdist_action_filter) }, - { "Refresh" , ICONNAME_REFRESH , N_("Refresh"), NULL, N_("Refresh results"), G_CALLBACK (ui_repdist_action_refresh) }, + { "Refresh" , ICONNAME_HB_REFRESH , N_("Refresh"), NULL, N_("Refresh results"), G_CALLBACK (ui_repdist_action_refresh) }, //{ "Export" , ICONNAME_HB_FILE_EXPORT , N_("Export") , NULL, N_("Export as CSV"), G_CALLBACK (ui_repdist_action_export) }, }; @@ -142,43 +142,30 @@ static gint ui_list_repdist_compare_func (GtkTreeModel *model, GtkTreeIter *a, -gchar *CYA_STATSELECT[] = { - N_("Category"), - N_("Subcategory"), - N_("Payee"), - N_("Tag"), - N_("Month"), - N_("Year"), - NULL +HbKvData CYA_REPORT_SRC[] = { + { REPORT_SRC_CATEGORY, N_("Category") }, + { REPORT_SRC_SUBCATEGORY, N_("Subcategory") }, + { REPORT_SRC_PAYEE, N_("Payee") }, + { REPORT_SRC_ACCOUNT, N_("Account") }, + { REPORT_SRC_TAG, N_("Tag") }, + { REPORT_SRC_MONTH, N_("Month") }, + { REPORT_SRC_YEAR, N_("Year") }, + { 0, NULL } }; -gchar *CYA_KIND2[] = { - N_("Exp. & Inc."), - N_("Expense"), - N_("Income"), - N_("Balance"), - NULL + +HbKvData CYA_REPORT_TYPE[] = { + { REPORT_TYPE_ALL, N_("Exp. & Inc.") }, + { REPORT_TYPE_EXPENSE, N_("Expense") }, + { REPORT_TYPE_INCOME, N_("Income") }, + { REPORT_TYPE_BALANCE, N_("Balance")} , + { 0, NULL } }; +extern gchar *CYA_REPORT_MODE[]; +extern HbKvData CYA_REPORT_INTVL[]; -//extern gchar *CYA_FLT_SELECT[]; - -gchar *CYA_MONTHS[] = -{ -N_("January"), -N_("February"), -N_("March"), -N_("April"), -N_("May"), -N_("June"), -N_("July"), -N_("August"), -N_("September"), -N_("October"), -N_("November"), -N_("December"), -NULL -}; +extern gchar *CYA_ABMONTHS[]; /* action functions -------------------- */ @@ -199,6 +186,7 @@ struct ui_repdist_data *data = user_data; ui_repdist_sensitive(data->window, NULL); } + static void ui_repdist_action_viewpie(GtkAction *action, gpointer user_data) { struct ui_repdist_data *data = user_data; @@ -209,14 +197,14 @@ gint tmpview; gtk_chart_set_type (GTK_CHART(data->RE_chart), CHART_TYPE_PIE); ui_repdist_sensitive(data->window, NULL); - tmpview = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_view)); + tmpview = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_type)); // ensure not exp & inc for piechart - if( tmpview == 0 ) + if( tmpview == REPORT_TYPE_ALL ) { - //g_signal_handler_block(data->CY_view, data->handler_id[HID_REPDIST_VIEW]); - gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_view), 1); - //g_signal_handler_unblock(data->CY_view, data->handler_id[HID_REPDIST_VIEW]); + //g_signal_handler_block(data->CY_type, data->handler_id[HID_REPDIST_VIEW]); + hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(data->CY_type), REPORT_TYPE_EXPENSE); + //g_signal_handler_unblock(data->CY_type, data->handler_id[HID_REPDIST_VIEW]); } } @@ -270,7 +258,7 @@ struct ui_repdist_data *data = user_data; //debug //create_deffilter_window(data->filter, TRUE); - if(ui_flt_manage_dialog_new(data->window, data->filter, TRUE) != GTK_RESPONSE_REJECT) + if(ui_flt_manage_dialog_new(GTK_WINDOW(data->window), data->filter, TRUE, FALSE) != GTK_RESPONSE_REJECT) { ui_repdist_compute(data->window, NULL); ui_repdist_update_date_widget(data->window, NULL); @@ -308,54 +296,6 @@ struct ui_repdist_data *data = user_data; */ - - -/* -** return the month list position correponding to the passed date -*/ -static gint DateInPer(guint32 from, guint32 opedate) -{ -GDate *date1, *date2; -gint pos; - - //debug - // this return sometimes -1, -2 which is wrong - - date1 = g_date_new_julian(from); - date2 = g_date_new_julian(opedate); - - pos = ((g_date_get_year(date2) - g_date_get_year(date1)) * 12) + g_date_get_month(date2) - g_date_get_month(date1); - - //g_print(" from=%d-%d ope=%d-%d => %d\n", g_date_get_month(date1), g_date_get_year(date1), g_date_get_month(date2), g_date_get_year(date2), pos); - - g_date_free(date2); - g_date_free(date1); - - return(pos); -} - -/* -** return the year list position correponding to the passed date -*/ -static gint DateInYear(guint32 from, guint32 opedate) -{ -GDate *date; -gint year_from, year_ope, pos; - - date = g_date_new_julian(from); - year_from = g_date_get_year(date); - g_date_set_julian(date, opedate); - year_ope = g_date_get_year(date); - g_date_free(date); - - pos = year_ope - year_from; - - //g_print(" from=%d ope=%d => %d\n", year_from, year_ope, pos); - - return(pos); -} - - static void ui_repdist_date_change(GtkWidget *widget, gpointer user_data) { struct ui_repdist_data *data; @@ -403,7 +343,7 @@ gint range; } else { - if(ui_flt_manage_dialog_new(data->window, data->filter, TRUE) != GTK_RESPONSE_REJECT) + if(ui_flt_manage_dialog_new(GTK_WINDOW(data->window), data->filter, TRUE, FALSE) != GTK_RESPONSE_REJECT) { ui_repdist_update_date_widget(data->window, NULL); ui_repdist_compute(data->window, NULL); @@ -413,177 +353,12 @@ gint range; } - -static gint ui_repdist_result_get_pos(gint tmpfor, guint from, Transaction *ope) -{ -gint pos = 0; - - switch(tmpfor) - { - case BY_REPDIST_CATEGORY: - { - Category *catentry = da_cat_get(ope->kcat); - if(catentry) - pos = (catentry->flags & GF_SUB) ? catentry->parent : catentry->key; - } - break; - case BY_REPDIST_SUBCATEGORY: - pos = ope->kcat; - break; - case BY_REPDIST_PAYEE: - pos = ope->kpay; - break; - case BY_REPDIST_MONTH: - pos = DateInPer(from, ope->date); - break; - case BY_REPDIST_YEAR: - pos = DateInYear(from, ope->date); - break; - } - return pos; -} - - - - -static void ui_repdist_detail(GtkWidget *widget, gpointer user_data) -{ -struct ui_repdist_data *data; -guint active = GPOINTER_TO_INT(user_data); -guint tmpfor; -GList *list; -GtkTreeModel *model; -GtkTreeIter iter; - - data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - - DB( g_print("\n[repdist] detail\n") ); - - /* clear and detach our model */ - model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_detail)); - gtk_list_store_clear (GTK_LIST_STORE(model)); - - if(data->detail) - { - tmpfor = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_by)); - - g_object_ref(model); /* Make sure the model stays with us after the tree view unrefs it */ - gtk_tree_view_set_model(GTK_TREE_VIEW(data->LV_detail), NULL); /* Detach model from view */ - - /* fill in the model */ - list = g_queue_peek_head_link(data->txn_queue); - while (list != NULL) - { - Transaction *ope = list->data; - - if(filter_test(data->filter, ope) == 1) - { - guint i, pos = 0; - - if( tmpfor != BY_REPDIST_TAG ) - { - if( (tmpfor == BY_REPDIST_CATEGORY || tmpfor == BY_REPDIST_SUBCATEGORY) && ope->flags & OF_SPLIT ) - { - guint nbsplit = da_splits_count(ope->splits); - Split *split; - - for(i=0;isplits[i]; - switch(tmpfor) - { - case BY_REPDIST_CATEGORY: - { - Category *catentry = da_cat_get(split->kcat); - if(catentry) - pos = (catentry->flags & GF_SUB) ? catentry->parent : catentry->key; - } - break; - case BY_REPDIST_SUBCATEGORY: - pos = split->kcat; - break; - } - - if( pos == active ) - { - - gtk_list_store_append (GTK_LIST_STORE(model), &iter); - gtk_list_store_set (GTK_LIST_STORE(model), &iter, - LST_DSPOPE_DATAS, ope, - -1); - - break; - } - - } - } - else - { - pos = ui_repdist_result_get_pos(tmpfor, data->filter->mindate, ope); - if( pos == active ) - { - - gtk_list_store_append (GTK_LIST_STORE(model), &iter); - gtk_list_store_set (GTK_LIST_STORE(model), &iter, - LST_DSPOPE_DATAS, ope, - -1); - - } - } - - } - else - /* the TAG process is particular */ - { - if(ope->tags != NULL) - { - guint32 *tptr = ope->tags; - - while(*tptr) - { - pos = *tptr - 1; - - DB( g_print(" -> storing tag %d %.2f\n", pos, ope->amount) ); - - if( pos == active ) - { - gtk_list_store_append (GTK_LIST_STORE(model), &iter); - gtk_list_store_set (GTK_LIST_STORE(model), &iter, - LST_DSPOPE_DATAS, ope, - -1); - - } - - tptr++; - } - - } - } - - - - } - - list = g_list_next(list); - } - - /* Re-attach model to view */ - gtk_tree_view_set_model(GTK_TREE_VIEW(data->LV_detail), model); - g_object_unref(model); - - gtk_tree_view_columns_autosize( GTK_TREE_VIEW(data->LV_detail) ); - - } - -} - - static void ui_repdist_update(GtkWidget *widget, gpointer user_data) { struct ui_repdist_data *data; gboolean byamount; GtkTreeModel *model; -gint page, tmpfor, tmpkind, column; +gint page, tmpsrc, tmptype, column; gboolean xval; gchar *title; @@ -594,21 +369,22 @@ gchar *title; model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_report)); byamount = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_byamount)); - tmpkind = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_view)); - tmpfor = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_by)); - + tmptype = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_type)); + //tmpsrc = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_src)); + tmpsrc = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_src)); + //debug option - DB( g_print(" option: byamount=%d tmpkind=%d '%s' tmpfor=%d '%s'\n\n", byamount, tmpkind, CYA_KIND2[tmpkind], tmpfor, CYA_STATSELECT[tmpfor]) ); + DB( g_print(" option: byamount=%d tmptype=%d '%s' tmpsrc=%d '%s'\n\n", byamount, tmptype, hbtk_get_label(CYA_REPORT_TYPE,tmptype), tmpsrc, hbtk_get_label(CYA_REPORT_SRC,tmpsrc)) ); // ensure not exp & inc for piechart page = gtk_notebook_get_current_page(GTK_NOTEBOOK(data->GR_result)); - if( page == 2 && tmpkind == 0 ) + if( page == 2 && tmptype == REPORT_TYPE_ALL ) { - g_signal_handler_block(data->CY_view, data->handler_id[HID_REPDIST_VIEW]); - gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_view), 1); - g_signal_handler_unblock(data->CY_view, data->handler_id[HID_REPDIST_VIEW]); - tmpkind = 1; + g_signal_handler_block(data->CY_type, data->handler_id[HID_REPDIST_VIEW]); + hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(data->CY_type), 1); + g_signal_handler_unblock(data->CY_type, data->handler_id[HID_REPDIST_VIEW]); + tmptype = REPORT_TYPE_EXPENSE; } // define view/sort column @@ -616,16 +392,16 @@ gchar *title; if( byamount ) { - switch( tmpkind ) + switch( tmptype ) { - case 0: //Inc & Exp - case 3: + case REPORT_TYPE_ALL: //Inc & Exp + case REPORT_TYPE_BALANCE: column = LST_REPDIST_BALANCE; break; - case 1: + case REPORT_TYPE_EXPENSE: column = LST_REPDIST_EXPENSE; break; - case 2: + case REPORT_TYPE_INCOME: column = LST_REPDIST_INCOME; break; } @@ -637,25 +413,25 @@ gchar *title; gtk_chart_set_color_scheme(GTK_CHART(data->RE_chart), PREFS->report_color_scheme); - ////TRANSLATORS: example 'Expense by Category' - title = g_strdup_printf(_("%s by %s"), _(CYA_KIND2[tmpkind]), _(CYA_STATSELECT[tmpfor]) ); + //TRANSLATORS: example 'Expense by Category' + title = g_strdup_printf(_("%s by %s"), hbtk_get_label(CYA_REPORT_TYPE,tmptype), hbtk_get_label(CYA_REPORT_SRC, tmpsrc) ); /* update absolute or not */ - gboolean abs = (tmpkind == 1 || tmpkind == 2) ? TRUE : FALSE; + gboolean abs = (tmptype == REPORT_TYPE_EXPENSE || tmptype == REPORT_TYPE_INCOME) ? TRUE : FALSE; gtk_chart_set_absolute(GTK_CHART(data->RE_chart), abs); /* show xval for month/year and no by amount display */ xval = FALSE; - if( !byamount && (tmpfor == BY_REPDIST_MONTH || tmpfor == BY_REPDIST_YEAR) ) + if( !byamount && (tmpsrc == REPORT_SRC_MONTH || tmpsrc == REPORT_SRC_YEAR) ) { xval = TRUE; - /*switch( tmpfor) + /*switch( tmpsrc) { - case BY_REPDIST_MONTH: + case REPORT_SRC_MONTH: gtk_chart_set_every_xval(GTK_CHART(data->RE_chart), 4); break; - case BY_REPDIST_YEAR: + case REPORT_SRC_YEAR: gtk_chart_set_every_xval(GTK_CHART(data->RE_chart), 2); break; }*/ @@ -665,14 +441,15 @@ gchar *title; /* update bar chart */ - if( tmpkind == 0 ) //dual exp/inc + if( tmptype == REPORT_TYPE_ALL ) //dual exp/inc { DB( g_print(" set bar to dual exp %d/inc %d\n\n", LST_REPDIST_EXPENSE, LST_REPDIST_INCOME) ); gtk_chart_set_dualdatas(GTK_CHART(data->RE_chart), model, LST_REPDIST_EXPENSE, LST_REPDIST_INCOME, title, NULL); } else { - column = LST_REPDIST_EXPENSE+(tmpkind-1)*2; + // /!\ hazardous here + column = LST_REPDIST_EXPENSE+(tmptype-1)*2; DB( g_print(" set bar to %d\n\n", column) ); gtk_chart_set_datas(GTK_CHART(data->RE_chart), model, column, title, NULL); } @@ -763,15 +540,17 @@ gchar *filename = NULL; GString *node; GIOChannel *io; gchar *name; -gint tmpfor; +gint tmpsrc; DB( g_print("\n[repdist] export result csv\n") ); data = user_data; //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - tmpfor = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_by)); - name = g_strdup_printf("hb-repstat_%s.csv", CYA_STATSELECT[tmpfor]); + //tmpsrc = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_src)); + tmpsrc = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_src)); + + name = g_strdup_printf("hb-repstat_%s.csv", hbtk_get_label(CYA_REPORT_SRC,tmpsrc)); if( ui_file_chooser_csv(GTK_WINDOW(data->window), GTK_FILE_CHOOSER_ACTION_SAVE, &filename, name) == TRUE ) { @@ -817,15 +596,16 @@ gchar *filename = NULL; GString *node; GIOChannel *io; gchar *name; -gint tmpfor; +gint tmpsrc; DB( g_print("\n[repdist] export detail csv\n") ); data = user_data; //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - tmpfor = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_by)); - name = g_strdup_printf("hb-repstat-detail_%s.csv", CYA_STATSELECT[tmpfor]); + //tmpsrc = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_src)); + tmpsrc = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_src)); + name = g_strdup_printf("hb-repstat-detail_%s.csv", hbtk_get_label(CYA_REPORT_SRC,tmpsrc)); if( ui_file_chooser_csv(GTK_WINDOW(data->window), GTK_FILE_CHOOSER_ACTION_SAVE, &filename, name) == TRUE ) { @@ -848,17 +628,124 @@ gint tmpfor; } +static void ui_repdist_detail(GtkWidget *widget, gpointer user_data) +{ +struct ui_repdist_data *data; +guint active = GPOINTER_TO_INT(user_data); +guint tmpsrc; +GList *list; +GtkTreeModel *model; +GtkTreeIter iter; + + data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); + + DB( g_print("\n[repdist] detail\n") ); + + /* clear and detach our model */ + model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_detail)); + gtk_list_store_clear (GTK_LIST_STORE(model)); + + if(data->detail) + { + //tmpsrc = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_src)); + tmpsrc = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_src)); + + g_object_ref(model); /* Make sure the model stays with us after the tree view unrefs it */ + gtk_tree_view_set_model(GTK_TREE_VIEW(data->LV_detail), NULL); /* Detach model from view */ + + /* fill in the model */ + list = g_queue_peek_head_link(data->txn_queue); + while (list != NULL) + { + Transaction *ope = list->data; + + if(filter_txn_match(data->filter, ope) == 1) + { + gboolean match = FALSE; + guint i, pos = 0; + + if( tmpsrc != REPORT_SRC_TAG ) + { + if( (tmpsrc == REPORT_SRC_CATEGORY || tmpsrc == REPORT_SRC_SUBCATEGORY) && ope->flags & OF_SPLIT ) + { + guint nbsplit = da_splits_length(ope->splits); + Split *split; + + for(i=0;isplits, i); + pos = category_report_id(split->kcat, (tmpsrc == REPORT_SRC_SUBCATEGORY) ? TRUE : FALSE); + if( pos == active ) + { + match = TRUE; + break; + } + } + } + else + { + pos = report_items_get_pos(tmpsrc, data->filter->mindate, ope); + if( pos == active ) + { + match = TRUE; + } + } + } + else + /* the TAG process is particular */ + { + if(ope->tags != NULL) + { + guint32 *tptr = ope->tags; + + while(*tptr) + { + pos = *tptr - 1; + + DB( g_print(" -> storing tag %d %.2f\n", pos, ope->amount) ); + + if( pos == active ) + { + match = TRUE; + break; + } + tptr++; + } + } + } + + if( match == TRUE ) + { + gtk_list_store_insert_with_values (GTK_LIST_STORE(model), &iter, -1, + LST_DSPOPE_DATAS, ope, + -1); + } + } + + list = g_list_next(list); + } + + /* Re-attach model to view */ + gtk_tree_view_set_model(GTK_TREE_VIEW(data->LV_detail), model); + g_object_unref(model); + + gtk_tree_view_columns_autosize( GTK_TREE_VIEW(data->LV_detail) ); + + } + +} + + static void ui_repdist_compute(GtkWidget *widget, gpointer user_data) { struct ui_repdist_data *data; -gint tmpfor, tmpkind; +gint tmpsrc, tmptype; guint32 from, to; GtkTreeModel *model; GtkTreeIter iter; GList *list, *tmplist = NULL; guint n_result, sortid; guint i; -GDate *date1, *date2; gdouble *tmp_income, *tmp_expense; gdouble exprate, incrate, balrate; @@ -866,11 +753,12 @@ gdouble exprate, incrate, balrate; data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - tmpfor = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_by)); - tmpkind = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_view)); + //tmpsrc = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_src)); + tmpsrc = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_src)); + tmptype = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_type)); - DB( g_print(" for=%d,kind=%d\n", tmpfor, tmpkind) ); + DB( g_print(" for=%d,kind=%d\n", tmpsrc, tmpkind) ); //get our min max date from = data->filter->mindate; @@ -883,41 +771,27 @@ gdouble exprate, incrate, balrate; DB( g_print(" nb-txn=%d\n", g_queue_get_length (data->txn_queue) ) ); - /* count number or results */ - switch(tmpfor) + //todo: remove this later on + n_result = report_items_count(tmpsrc, data->filter->mindate, data->filter->maxdate); + + switch(tmpsrc) { - case BY_REPDIST_CATEGORY: - case BY_REPDIST_SUBCATEGORY: - n_result = da_cat_get_max_key() + 1; + case REPORT_SRC_CATEGORY: + case REPORT_SRC_SUBCATEGORY: tmplist = category_glist_sorted(1); break; - case BY_REPDIST_PAYEE: - n_result = da_pay_get_max_key() + 1; + case REPORT_SRC_PAYEE: tmplist = payee_glist_sorted(1); break; - case BY_REPDIST_TAG: - n_result = da_tag_length(); - tmplist = tag_glist_sorted(1); + case REPORT_SRC_ACCOUNT: + tmplist = account_glist_sorted(1); break; - case BY_REPDIST_MONTH: - date1 = g_date_new_julian(from); - date2 = g_date_new_julian(to); - n_result = ((g_date_get_year(date2) - g_date_get_year(date1)) * 12) + g_date_get_month(date2) - g_date_get_month(date1) + 1; - g_date_free(date2); - g_date_free(date1); - break; - case BY_REPDIST_YEAR: - date1 = g_date_new_julian(from); - date2 = g_date_new_julian(to); - n_result = g_date_get_year(date2) - g_date_get_year(date1) + 1; - g_date_free(date2); - g_date_free(date1); + case REPORT_SRC_TAG: + tmplist = tag_glist_sorted(1); break; - default: - n_result = 0; } - DB( g_print(" %s :: n_result=%d\n", CYA_STATSELECT[tmpfor], n_result) ); + DB( g_print(" %s :: n_result=%d\n", hbtk_get_label(CYA_REPORT_SRC,tmpsrc), n_result) ); /* allocate some memory */ tmp_expense = g_malloc0((n_result+2) * sizeof(gdouble)); @@ -939,7 +813,7 @@ gdouble exprate, incrate, balrate; DB( g_print("** testing '%s', cat=%d==> %d\n", ope->memo, ope->kcat, filter_test(data->filter, ope)) ); - if( (filter_test(data->filter, ope) == 1) ) + if( (filter_txn_match(data->filter, ope) == 1) ) { guint32 pos = 0; gdouble trn_amount; @@ -952,7 +826,7 @@ gdouble exprate, incrate, balrate; //#1562372 in case of a split we need to take amount for filter categories only if( ope->flags & OF_SPLIT ) { - guint nbsplit = da_splits_count(ope->splits); + guint nbsplit = da_splits_length(ope->splits); Split *split; Category *catentry; gint sinsert; @@ -961,10 +835,10 @@ gdouble exprate, incrate, balrate; for(i=0;isplits[i]; + split = da_splits_get(ope->splits, i); catentry = da_cat_get(split->kcat); if(catentry == NULL) continue; - sinsert = ( catentry->filter == TRUE ) ? 1 : 0; + sinsert = ( catentry->flt_select == TRUE ) ? 1 : 0; if(data->filter->option[FILTER_CATEGORY] == 2) sinsert ^= 1; DB( g_print(" split '%s' insert=%d\n",catentry->name, sinsert) ); @@ -978,35 +852,35 @@ gdouble exprate, incrate, balrate; } - if( tmpfor != BY_REPDIST_TAG ) + if( tmpsrc != REPORT_SRC_TAG ) { - if( (tmpfor == BY_REPDIST_CATEGORY || tmpfor == BY_REPDIST_SUBCATEGORY) && ope->flags & OF_SPLIT ) + if( (tmpsrc == REPORT_SRC_CATEGORY || tmpsrc == REPORT_SRC_SUBCATEGORY) && ope->flags & OF_SPLIT ) { - guint nbsplit = da_splits_count(ope->splits); + guint nbsplit = da_splits_length(ope->splits); Split *split; Category *catentry; gint sinsert; for(i=0;isplits[i]; + split = da_splits_get(ope->splits, i); catentry = da_cat_get(split->kcat); if(catentry == NULL) continue; - sinsert = ( catentry->filter == TRUE ) ? 1 : 0; + sinsert = ( catentry->flt_select == TRUE ) ? 1 : 0; if(data->filter->option[FILTER_CATEGORY] == 2) sinsert ^= 1; DB( g_print(" split '%s' insert=%d\n",catentry->name, sinsert) ); if( (data->filter->option[FILTER_CATEGORY] == 0) || sinsert) { - switch(tmpfor) + switch(tmpsrc) { - case BY_REPDIST_CATEGORY: + case REPORT_SRC_CATEGORY: { pos = (catentry->flags & GF_SUB) ? catentry->parent : catentry->key; } break; - case BY_REPDIST_SUBCATEGORY: + case REPORT_SRC_SUBCATEGORY: pos = split->kcat; break; } @@ -1032,7 +906,7 @@ gdouble exprate, incrate, balrate; } else { - pos = ui_repdist_result_get_pos(tmpfor, from, ope); + pos = report_items_get_pos(tmpsrc, from, ope); if(trn_amount > 0.0) { tmp_income[pos] += trn_amount; @@ -1061,24 +935,15 @@ gdouble exprate, incrate, balrate; if(trn_amount > 0.0) { tmp_income[pos] += trn_amount; + data->total_income += trn_amount; } else { tmp_expense[pos] += trn_amount; + data->total_expense += trn_amount; } tptr++; } - - //#1195859 - if(trn_amount > 0.0) - { - data->total_income += trn_amount; - } - else - { - data->total_expense += trn_amount; - } - } } @@ -1112,17 +977,17 @@ gdouble exprate, incrate, balrate; /* filter empty results */ - if(tmpfor == BY_REPDIST_CATEGORY || tmpfor == BY_REPDIST_SUBCATEGORY || tmpfor == BY_REPDIST_PAYEE || tmpfor == BY_REPDIST_TAG) + if(tmpsrc == REPORT_SRC_CATEGORY || tmpsrc == REPORT_SRC_SUBCATEGORY || tmpsrc == REPORT_SRC_PAYEE || tmpsrc == REPORT_SRC_TAG) { - if( tmpkind == 1 && !tmp_expense[i] ) continue; - if( tmpkind == 2 && !tmp_income[i] ) continue; + if( tmptype == 1 && !tmp_expense[i] ) continue; + if( tmptype == 2 && !tmp_income[i] ) continue; if( !tmp_expense[i] && !tmp_income[i] ) continue; } /* get the result name */ - switch(tmpfor) + switch(tmpsrc) { - case BY_REPDIST_CATEGORY: + case REPORT_SRC_CATEGORY: { Category *entry = da_cat_get(i); if(entry != NULL) @@ -1134,7 +999,7 @@ gdouble exprate, incrate, balrate; } break; - case BY_REPDIST_SUBCATEGORY: + case REPORT_SRC_SUBCATEGORY: { Category *entry = da_cat_get(i); if(entry != NULL) @@ -1154,7 +1019,7 @@ gdouble exprate, incrate, balrate; } break; - case BY_REPDIST_PAYEE: + case REPORT_SRC_PAYEE: { Payee *entry = da_pay_get(i); if(entry != NULL) @@ -1165,7 +1030,18 @@ gdouble exprate, incrate, balrate; } break; - case BY_REPDIST_TAG: + case REPORT_SRC_ACCOUNT: + { + Account *entry = da_acc_get(i); + if(entry != NULL) + { + name = entry->name; + sortid = g_list_index(tmplist, entry); + } + } + break; + + case REPORT_SRC_TAG: { Tag *entry = da_tag_get(i+1); name = entry->name; @@ -1173,16 +1049,16 @@ gdouble exprate, incrate, balrate; } break; - case BY_REPDIST_MONTH: + case REPORT_SRC_MONTH: date = g_date_new_julian(from); g_date_add_months(date, i); //g_snprintf(buffer, 63, "%d-%02d", g_date_get_year(date), g_date_get_month(date)); - g_snprintf(buffer, 63, "%d-%s", g_date_get_year(date), _(CYA_MONTHS[g_date_get_month(date)-1])); + g_snprintf(buffer, 63, "%d-%s", g_date_get_year(date), _(CYA_ABMONTHS[g_date_get_month(date)])); g_date_free(date); name = buffer; break; - case BY_REPDIST_YEAR: + case REPORT_SRC_YEAR: date = g_date_new_julian(from); g_date_add_years(date, i); g_snprintf(buffer, 63, "%d", g_date_get_year(date)); @@ -1226,7 +1102,7 @@ gdouble exprate, incrate, balrate; /* update column 0 title */ GtkTreeViewColumn *column = gtk_tree_view_get_column( GTK_TREE_VIEW(data->LV_report), 0); - gtk_tree_view_column_set_title(column, _(CYA_STATSELECT[tmpfor])); + gtk_tree_view_column_set_title(column, hbtk_get_label(CYA_REPORT_SRC,tmpsrc)); gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data->LV_report)); @@ -1476,8 +1352,8 @@ static void ui_repdist_setup(struct ui_repdist_data *data) data->txn_queue = g_queue_new (); - data->filter = da_filter_malloc(); - filter_default_all_set(data->filter); + data->filter = da_flt_malloc(); + filter_reset(data->filter); data->detail = PREFS->stat_showdetail; @@ -1533,7 +1409,7 @@ struct WinGeometry *wg; g_queue_free (data->txn_queue); - da_filter_free(data->filter); + da_flt_free(data->filter); g_free(data); @@ -1553,6 +1429,7 @@ struct WinGeometry *wg; return FALSE; } + // the window creation GtkWidget *ui_repdist_window_new(void) { @@ -1585,9 +1462,6 @@ GError *error = NULL; DB( g_print(" - new window=%p, inst_data=%p\n", window, data) ); gtk_window_set_title (GTK_WINDOW (window), _("Statistics Report")); - - - //set the window icon gtk_window_set_icon_name(GTK_WINDOW (window), ICONNAME_HB_REP_STATS); @@ -1612,18 +1486,21 @@ GError *error = NULL; gtk_grid_attach (GTK_GRID (table), label, 0, row, 3, 1); row++; - label = make_label_widget(_("_View:")); + label = make_label_widget(_("_View by:")); gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1); - widget = make_cycle(label, CYA_KIND2); - data->CY_view = widget; + //widget = make_cycle(label, CYA_REPORT_SRC); + widget = hbtk_combo_box_new_with_data(label, CYA_REPORT_SRC); + data->CY_src = widget; gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1); row++; - label = make_label_widget(_("_By:")); + label = make_label_widget(_("_Type:")); gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1); - widget = make_cycle(label, CYA_STATSELECT); - data->CY_by = widget; - gtk_grid_attach (GTK_GRID (table), data->CY_by, 2, row, 1, 1); + //widget = make_cycle(label, CYA_REPORT_TXN_TYPE); + widget = hbtk_combo_box_new_with_data(label, CYA_REPORT_TYPE); + data->CY_type = widget; + gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1); + row++; widget = gtk_check_button_new_with_mnemonic (_("By _amount")); @@ -1644,7 +1521,6 @@ GError *error = NULL; data->RG_zoomx = widget; gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1); - /* row++; widget = gtk_check_button_new_with_mnemonic ("Legend"); @@ -1852,7 +1728,7 @@ GError *error = NULL; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_minor), GLOBALS->minor); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_byamount), PREFS->stat_byamount); - gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_view), 1); + hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(data->CY_type), REPORT_TYPE_EXPENSE); /* attach our minor to treeview */ g_object_set_data(G_OBJECT(gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_report))), "minor", (gpointer)data->CM_minor); @@ -1868,8 +1744,9 @@ GError *error = NULL; data->handler_id[HID_REPDIST_RANGE] = g_signal_connect (data->CY_range, "changed", G_CALLBACK (ui_repdist_range_change), NULL); - g_signal_connect (data->CY_by, "changed", G_CALLBACK (ui_repdist_compute), (gpointer)data); - data->handler_id[HID_REPDIST_VIEW] = g_signal_connect (data->CY_view, "changed", G_CALLBACK (ui_repdist_compute), (gpointer)data); + g_signal_connect (data->CY_src, "changed", G_CALLBACK (ui_repdist_compute), (gpointer)data); + + data->handler_id[HID_REPDIST_VIEW] = g_signal_connect (data->CY_type, "changed", G_CALLBACK (ui_repdist_compute), (gpointer)data); g_signal_connect (data->RG_zoomx, "value-changed", G_CALLBACK (ui_repdist_zoomx_callback), NULL); @@ -2081,8 +1958,8 @@ GtkTreeViewColumn *column; /* create list store */ store = gtk_list_store_new( NUM_LST_REPDIST, - G_TYPE_INT, - G_TYPE_INT, + G_TYPE_INT, //keep for compatibility with chart + G_TYPE_INT, G_TYPE_STRING, G_TYPE_DOUBLE, G_TYPE_DOUBLE,