X-Git-Url: https://git.brokenzipper.com/gitweb?p=chaz%2Fhomebank;a=blobdiff_plain;f=src%2Frep-time.c;fp=src%2Frep_time.c;h=97d02f3cf1312bd4cc8a19b911655a43410e4e87;hp=6684389df4500ebfdc9f43a3e6ead2a7ec1e2af3;hb=236cb5e47660876f46488ea8f76ecd5bebfa1fac;hpb=8892e90b335f94c296462a91534334b674226cd9 diff --git a/src/rep_time.c b/src/rep-time.c similarity index 77% rename from src/rep_time.c rename to src/rep-time.c index 6684389..97d02f3 100644 --- a/src/rep_time.c +++ b/src/rep-time.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,18 +20,19 @@ #include "homebank.h" -#include "rep_time.h" +#include "rep-time.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" #include "ui-filter.h" #include "ui-transaction.h" +#include "ui-tag.h" /****************************************************************************/ @@ -52,7 +53,7 @@ extern struct Preferences *PREFS; /* prototypes */ static void ui_reptime_action_viewlist(GtkAction *action, gpointer user_data); -//static void ui_reptime_action_viewcolumn(GtkAction *action, gpointer user_data); +static void ui_reptime_action_viewcolumn(GtkAction *action, gpointer user_data); static void ui_reptime_action_viewline(GtkAction *action, gpointer user_data); static void ui_reptime_action_detail(GtkAction *action, gpointer user_data); //static void ui_reptime_action_filter(GtkAction *action, gpointer user_data); @@ -64,13 +65,13 @@ static void ui_reptime_list_set_cur(GtkTreeView *treeview, guint32 kcur); static GtkRadioActionEntry radio_entries[] = { { "List" , ICONNAME_HB_VIEW_LIST , N_("List") , NULL, N_("View results as list") , 0 }, { "Line" , ICONNAME_HB_VIEW_LINE , N_("Line") , NULL, N_("View results as lines") , 1 }, -// { "Column" , ICONNAME_HB_VIEW_COLUMN, N_("Column") , NULL, N_("View results as column"), 2 }, + { "Column" , ICONNAME_HB_VIEW_COLUMN, N_("Column") , NULL, N_("View results as column"), 2 }, }; static guint n_radio_entries = G_N_ELEMENTS (radio_entries); static GtkActionEntry entries[] = { // { "Filter" , ICONNAME_HB_FILTER , N_("Filter") , NULL, N_("Edit the filter"), G_CALLBACK (ui_reptime_action_filter) }, - { "Refresh" , ICONNAME_REFRESH , N_("Refresh"), NULL, N_("Refresh results"), G_CALLBACK (ui_reptime_action_refresh) }, + { "Refresh" , ICONNAME_HB_REFRESH , N_("Refresh"), NULL, N_("Refresh results"), G_CALLBACK (ui_reptime_action_refresh) }, // { "Export" , ICONNAME_HB_FILE_EXPORT, N_("Export") , NULL, N_("Export as CSV"), G_CALLBACK (ui_reptime_action_export) }, }; @@ -92,7 +93,7 @@ static const gchar *ui_info = " " " " " " -//" " +" " " " " " " " @@ -120,33 +121,34 @@ static gint ui_list_reptime_compare_func (GtkTreeModel *model, GtkTreeIter *a, static GString *ui_list_reptime_to_string(GtkTreeView *treeview, gboolean clipboard); -gchar *CYA_TIMESELECT[] = { N_("Account"), N_("Category"), N_("Payee"), NULL }; +HbKvData CYA_REPORT_SRC_TREND[] = { + { REPORT_SRC_ACCOUNT, N_("Account") }, + { REPORT_SRC_CATEGORY, N_("Category") }, + { REPORT_SRC_PAYEE, N_("Payee") }, + { REPORT_SRC_TAG, N_("Tag") }, + { 0, NULL } +}; +HbKvData CYA_REPORT_INTVL[] = { + { REPORT_INTVL_DAY, N_("Day") }, + { REPORT_INTVL_WEEK, N_("Week") }, + { REPORT_INTVL_MONTH, N_("Month") }, + { REPORT_INTVL_QUARTER, N_("Quarter") }, + { REPORT_INTVL_HALFYEAR,N_("Half Year") }, + { REPORT_INTVL_YEAR, N_("Year") }, + { 0, NULL } +}; -gchar *CYA_VIEWBY[] = { N_("Day"), N_("Week"), N_("Month"), N_("Quarter"), N_("Year"), NULL }; -//extern gchar *CYA_FLT_SELECT[]; +extern gchar *RA_REPORT_TIME_MODE[]; +extern gchar *CYA_ABMONTHS[]; + -gchar *CYA_ABMONTHS[] = -{ -NULL, -N_("Jan"), -N_("Feb"), -N_("Mar"), -N_("Apr"), -N_("May"), -N_("Jun"), -N_("Jul"), -N_("Aug"), -N_("Sep"), -N_("Oct"), -N_("Nov"), -N_("Dec"), -}; /* action functions -------------------- */ + static void ui_reptime_action_viewlist(GtkAction *action, gpointer user_data) { struct ui_reptime_data *data = user_data; @@ -167,7 +169,7 @@ struct ui_reptime_data *data = user_data; } -/*static void ui_reptime_action_viewcolumn(GtkAction *action, gpointer user_data) +static void ui_reptime_action_viewcolumn(GtkAction *action, gpointer user_data) { struct ui_reptime_data *data = user_data; @@ -176,7 +178,7 @@ struct ui_reptime_data *data = user_data; ui_reptime_sensitive(data->window, NULL); ui_reptime_update(data->window, NULL); -}*/ +} static void ui_reptime_action_mode (GtkRadioAction *action, GtkRadioAction *current, gpointer user_data) @@ -192,6 +194,9 @@ gint value; case 1: ui_reptime_action_viewline(GTK_ACTION(action), user_data); break; + case 2: + ui_reptime_action_viewcolumn (GTK_ACTION(action), user_data); + break; } } @@ -240,74 +245,9 @@ struct ui_reptime_data *data = user_data; ** ============================================================================ */ - - - -/* -** return the month list position correponding to the passed date -*/ -static gint DateInMonth(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); -} - -static gint DateInQuarter(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))/3; - - DB( 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_reptime_date_change(GtkWidget *widget, gpointer user_data) { @@ -392,163 +332,6 @@ gchar *daterange; } -static void ui_reptime_detail(GtkWidget *widget, gpointer user_data) -{ -struct ui_reptime_data *data; -guint active = GPOINTER_TO_INT(user_data); -guint tmpfor, tmpslice; -gboolean showall; -guint32 from; -guint i; -GList *list; -GtkTreeModel *model; -GtkTreeIter iter; -guint32 selkey; - - data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data"); - - DB( g_print("\n[reptime] detail\n") ); - - tmpfor = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_for)); - tmpslice = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_view)); - showall = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_all)); - selkey = 0; - - switch(tmpfor) - { - case FOR_REPTIME_ACCOUNT: - selkey = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc)); - break; - case FOR_REPTIME_CATEGORY: - selkey = ui_cat_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_cat)); - break; - case FOR_REPTIME_PAYEE: - selkey = ui_pay_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_pay)); - break; - } - - //DB( g_print(" for=%d, view by=%d :: key=%d\n", tmpfor, tmpslice, selkey) ); - - //get our min max date - from = data->filter->mindate; - //to = data->filter->maxdate; - - /* 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) - { - 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; - guint32 pos = 0; - gboolean include = FALSE; - - //DB( g_print(" get %s\n", ope->ope_Word) ); - - switch(tmpfor) - { - case FOR_REPTIME_ACCOUNT: - if( selkey == ope->kacc ) - include = TRUE; - break; - case FOR_REPTIME_CATEGORY: - { - Category *catentry; - - if( ope->flags & OF_SPLIT ) - { - guint nbsplit = da_splits_count(ope->splits); - Split *split; - - for(i=0;isplits[i]; - catentry = da_cat_get(split->kcat); - if(catentry != NULL) //#1340142 - { - if( selkey == catentry->parent || selkey == catentry->key ) - include = TRUE; - - } - } - } - else - { - catentry = da_cat_get(ope->kcat); - if(catentry != NULL) //#1340142 - { - if( selkey == catentry->parent || selkey == catentry->key ) - include = TRUE; - - } - } - } - break; - case FOR_REPTIME_PAYEE: - if( selkey == ope->kpay ) - include = TRUE; - break; - } - - if( include == TRUE || showall == TRUE ) - { - - switch(tmpslice) - { - case GROUPBY_REPTIME_DAY: - pos = ope->date - from; - break; - - case GROUPBY_REPTIME_WEEK: - pos = (ope->date - from)/7; - break; - - case GROUPBY_REPTIME_MONTH: - pos = DateInMonth(from, ope->date); - break; - - case GROUPBY_REPTIME_QUARTER: - pos = DateInQuarter(from, ope->date); - break; - - case GROUPBY_REPTIME_YEAR: - pos = DateInYear(from, ope->date); - break; - } - - DB( g_print("** pos=%d\n", pos) ); - - //insert - 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); - } - - - } - - 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_reptime_update(GtkWidget *widget, gpointer user_data) @@ -556,9 +339,8 @@ static void ui_reptime_update(GtkWidget *widget, gpointer user_data) struct ui_reptime_data *data; GtkTreeModel *model; gint page; -gint tmpfor; +gint tmpsrc; gchar *title; -//gboolean xval; DB( g_print("\n[reptime] update\n") ); @@ -567,15 +349,14 @@ gchar *title; model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_report)); //byamount = 0; - tmpfor = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_for)); - //tmpslice = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_view)); + tmpsrc = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_src)); + //tmpintvl = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_intvl)); // ensure not exp & inc for piechart page = gtk_notebook_get_current_page(GTK_NOTEBOOK(data->GR_result)); DB( g_print(" page %d\n\n", page) ); - //DB( g_print(" tmpslice %d\n\n", tmpslice) ); - + //DB( g_print(" tmpintvl %d\n\n", tmpintvl) ); //column = LST_REPTIME_POS; //DB( g_print(" sort on column %d\n\n", column) ); @@ -584,8 +365,11 @@ gchar *title; gtk_chart_show_legend(GTK_CHART(data->RE_line), FALSE, FALSE); gtk_chart_show_xval(GTK_CHART(data->RE_line), TRUE); - ////TRANSLATORS: example 'Expense by Category' - title = g_strdup_printf(_("%s Over Time"), _(CYA_TIMESELECT[tmpfor]) ); + //visible = (tmpmode == REPORT_RESULT_TOTAL) ? TRUE : FALSE; + //gtk_chart_show_average(GTK_CHART(data->RE_line), data->average, visible); + + //TRANSLATORS: example 'Category Over Time' + title = g_strdup_printf(_("%s Over Time"), hbtk_get_label(CYA_REPORT_SRC_TREND, tmpsrc) ); gtk_chart_set_datas(GTK_CHART(data->RE_line), model, LST_REPTIME_AMOUNT, title, NULL); g_free(title); @@ -626,15 +410,15 @@ gchar *filename = NULL; GString *node; GIOChannel *io; gchar *name; -gint tmpfor; +gint tmpsrc; DB( g_print("\n[reptime] 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_for)); - name = g_strdup_printf("hb-reptime_%s.csv", CYA_TIMESELECT[tmpfor]); + tmpsrc = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_src)); + name = g_strdup_printf("hb-reptime_%s.csv", hbtk_get_label(CYA_REPORT_SRC_TREND, tmpsrc) ); if( ui_file_chooser_csv(GTK_WINDOW(data->window), GTK_FILE_CHOOSER_ACTION_SAVE, &filename, name) == TRUE ) { @@ -680,15 +464,15 @@ gchar *filename = NULL; GString *node; GIOChannel *io; gchar *name; -gint tmpfor; +gint tmpsrc; DB( g_print("\n[reptime] 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_for)); - name = g_strdup_printf("hb-reptime-detail_%s.csv", CYA_TIMESELECT[tmpfor]); + tmpsrc = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_src)); + name = g_strdup_printf("hb-reptime-detail_%s.csv", hbtk_get_label(CYA_REPORT_SRC_TREND, tmpsrc) ); if( ui_file_chooser_csv(GTK_WINDOW(data->window), GTK_FILE_CHOOSER_ACTION_SAVE, &filename, name) == TRUE ) { @@ -714,27 +498,31 @@ gint tmpfor; static void ui_reptime_update_for(GtkWidget *widget, gpointer user_data) { struct ui_reptime_data *data; -gint tmpfor; +gint tmpsrc; gboolean visible; DB( g_print("\n[reptime] update for\n") ); 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_for)); + tmpsrc = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_src)); - visible = tmpfor == 0 ? TRUE : FALSE; + visible = tmpsrc == REPORT_SRC_ACCOUNT ? TRUE : FALSE; hb_widget_visible(data->LB_acc, visible); hb_widget_visible(data->PO_acc, visible); - visible = tmpfor == 1 ? TRUE : FALSE; + visible = tmpsrc == REPORT_SRC_CATEGORY ? TRUE : FALSE; hb_widget_visible(data->LB_cat, visible); hb_widget_visible(data->PO_cat, visible); - visible = tmpfor == 2 ? TRUE : FALSE; + visible = tmpsrc == REPORT_SRC_PAYEE ? TRUE : FALSE; hb_widget_visible(data->LB_pay, visible); hb_widget_visible(data->PO_pay, visible); + visible = tmpsrc == REPORT_SRC_TAG ? TRUE : FALSE; + hb_widget_visible(data->LB_tag, visible); + hb_widget_visible(data->PO_tag, visible); + } @@ -753,10 +541,106 @@ struct ui_reptime_data *data; } +//TODO: this is temporary, as at end we will enable filter +static void ui_reptime_compute_set_filter(Filter *flt, gint tmpsrc, guint32 selkey) +{ + //inactive all filters + flt->option[FILTER_CATEGORY] = 0; + flt->option[FILTER_PAYEE] = 0; + flt->option[FILTER_ACCOUNT] = 0; + flt->option[FILTER_TEXT] = 0; + + switch(tmpsrc) + { + case REPORT_SRC_ACCOUNT: + flt->option[FILTER_ACCOUNT] = 1; + filter_status_acc_clear_except(flt, selkey); + break; + case REPORT_SRC_CATEGORY: + flt->option[FILTER_CATEGORY] = 1; + filter_status_cat_clear_except(flt, selkey); + break; + case REPORT_SRC_PAYEE: + flt->option[FILTER_PAYEE] = 1; + filter_status_pay_clear_except(flt, selkey); + break; + case REPORT_SRC_TAG: + flt->option[FILTER_TEXT] = 1; + filter_set_tag_by_id(flt, selkey); + break; + } + + +} + + +static void ui_reptime_detail(GtkWidget *widget, gpointer user_data) +{ +struct ui_reptime_data *data; +guint active = GPOINTER_TO_INT(user_data); +guint tmpintvl; +guint32 from; +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[reptime] detail\n") ); + + //tmpsrc = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_src)); + tmpintvl = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_intvl)); + + //ui_reptime_compute_set_filter was already called here + + //get our min max date + from = data->filter->mindate; + //to = data->filter->maxdate; + + /* 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) + { + 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; + guint pos; + + if(filter_txn_match(data->filter, ope) == 1) + { + pos = report_interval_get_pos(tmpintvl, from, ope); + if( pos == active ) + { + 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_reptime_compute(GtkWidget *widget, gpointer user_data) { struct ui_reptime_data *data; -gint tmpfor, tmpslice; +gint tmpsrc, tmpintvl, range, showempty; guint32 from, to; gboolean cumul; gboolean showall; @@ -768,7 +652,6 @@ GtkTreeIter iter; GList *list; gint id; guint n_result, i; -GDate *date1, *date2; gdouble *tmp_amount; guint32 selkey; @@ -776,34 +659,50 @@ guint32 selkey; 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_for)); - tmpslice = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_view)); - cumul = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_cumul)); - showall = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_all)); + tmpsrc = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_src)); + tmpintvl = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_intvl)); + cumul = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_cumul)); + showall = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_all)); + range = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_range)); + showempty = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_showempty)); + selkey = 0; data->accnum = 0; - - switch(tmpfor) + switch(tmpsrc) { - case FOR_REPTIME_ACCOUNT: + case REPORT_SRC_ACCOUNT: selkey = ui_acc_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_acc)); if(showall == FALSE) data->accnum = selkey; break; - case FOR_REPTIME_CATEGORY: + case REPORT_SRC_CATEGORY: selkey = ui_cat_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_cat)); break; - case FOR_REPTIME_PAYEE: + case REPORT_SRC_PAYEE: selkey = ui_pay_comboboxentry_get_key(GTK_COMBO_BOX(data->PO_pay)); break; + case REPORT_SRC_TAG: + selkey = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->PO_tag)); + break; } - DB( g_print(" for=%d, view by=%d :: key=%d\n", tmpfor, tmpslice, selkey) ); + if( showall == TRUE ) + { + data->filter->option[FILTER_CATEGORY] = 0; + data->filter->option[FILTER_PAYEE] = 0; + data->filter->option[FILTER_ACCOUNT] = 0; + data->filter->option[FILTER_TEXT] = 0; + } + else + ui_reptime_compute_set_filter(data->filter, tmpsrc, selkey); + + + DB( g_print(" source=%d-%s, intvl=%d-%s:: key=%d\n", tmpsrc, hbtk_get_label(CYA_REPORT_SRC_TREND, tmpsrc), tmpintvl, hbtk_get_label(CYA_REPORT_INTVL, tmpintvl), selkey) ); //to remove > 5.0.2 //#1715532 5.0.5: no... but only showall - if(showall == TRUE) + if( (showall == TRUE) && (range == FLT_RANGE_ALLDATE) ) { filter_preset_daterange_set(data->filter, data->filter->range, data->accnum); ui_reptime_update_quickdate(widget, NULL); @@ -817,180 +716,43 @@ guint32 selkey; g_queue_free (data->txn_queue); data->txn_queue = hbfile_transaction_get_partial(data->filter->mindate, data->filter->maxdate); + n_result = report_interval_count(tmpintvl, from, to); - /* count number or results */ - switch(tmpslice) - { - case GROUPBY_REPTIME_DAY: - n_result = 1 + (to - from); - break; - case GROUPBY_REPTIME_WEEK: - n_result = 1 + ((to - from) / 7); - break; - case GROUPBY_REPTIME_MONTH: - date1 = g_date_new_julian(from); - date2 = g_date_new_julian(to); - n_result = 1 + ((g_date_get_year(date2) - g_date_get_year(date1)) * 12) + g_date_get_month(date2) - g_date_get_month(date1); - g_date_free(date2); - g_date_free(date1); - break; - case GROUPBY_REPTIME_QUARTER: - date1 = g_date_new_julian(from); - date2 = g_date_new_julian(to); - n_result = 1 + (((g_date_get_year(date2) - g_date_get_year(date1)) * 12) + g_date_get_month(date2) - g_date_get_month(date1))/3; - g_date_free(date2); - g_date_free(date1); - break; - case GROUPBY_REPTIME_YEAR: - date1 = g_date_new_julian(from); - date2 = g_date_new_julian(to); - n_result = 1 + g_date_get_year(date2) - g_date_get_year(date1); - g_date_free(date2); - g_date_free(date1); - break; - default: - n_result = 0; - } - - DB( g_print(" %s :: n_result=%d\n", CYA_TIMESELECT[tmpfor], n_result) ); + DB( g_print(" %s :: n_result=%d\n", hbtk_get_label(CYA_REPORT_SRC_TREND, tmpsrc), n_result) ); /* allocate some memory */ - tmp_amount = g_malloc0((n_result+2) * sizeof(gdouble)); if(tmp_amount) { - guint32 kcur; - - /* set currency */ - kcur = GLOBALS->kcur; - if( (tmpfor == FOR_REPTIME_ACCOUNT) && (showall == FALSE) ) - { - Account *acc = da_acc_get(selkey); - - if( acc != NULL ) - { - kcur = acc->kcur; - } - } - - ui_reptime_list_set_cur(GTK_TREE_VIEW(data->LV_report), kcur); - gtk_chart_set_currency(GTK_CHART(data->RE_line), kcur); - - /* compute the results */ list = g_queue_peek_head_link(data->txn_queue); while (list != NULL) { Transaction *ope = list->data; - gboolean include = FALSE; - //debug - DB( g_print("** testing '%s', cat=%d==> %d\n", ope->memo, ope->kcat, filter_test(data->filter, ope)) ); - - // add usage of payee or category - switch(tmpfor) - { - case FOR_REPTIME_ACCOUNT: - if( selkey == ope->kacc ) - include = TRUE; - break; - case FOR_REPTIME_CATEGORY: - { - Category *catentry; - - if( ope->flags & OF_SPLIT ) - { - guint nbsplit = da_splits_count(ope->splits); - Split *split; - - for(i=0;isplits[i]; - catentry = da_cat_get(split->kcat); - if(catentry != NULL) //#1340142 - { - if( selkey == catentry->parent || selkey == catentry->key ) - include = TRUE; - } - } - } - else - { - catentry = da_cat_get(ope->kcat); - if(catentry != NULL) //#1340142 - { - if( selkey == catentry->parent || selkey == catentry->key ) - include = TRUE; - } - } - - } - break; - case FOR_REPTIME_PAYEE: - if( selkey == ope->kpay ) - include = TRUE; - break; - } + //DB( g_print("\n** testing '%s', cat=%d==> %d\n", ope->memo, ope->kcat, filter_txn_match(data->filter, ope)) ); - if( include == TRUE || showall == TRUE) + if( (filter_txn_match(data->filter, ope) == 1) ) { - guint32 pos = 0; + guint pos; gdouble trn_amount; - - switch(tmpslice) - { - case GROUPBY_REPTIME_DAY: - pos = ope->date - from; - break; - - case GROUPBY_REPTIME_WEEK: - pos = (ope->date - from)/7; - break; - - case GROUPBY_REPTIME_MONTH: - pos = DateInMonth(from, ope->date); - break; - case GROUPBY_REPTIME_QUARTER: - pos = DateInQuarter(from, ope->date); - break; - - case GROUPBY_REPTIME_YEAR: - pos = DateInYear(from, ope->date); - break; - } + trn_amount = report_txn_amount_get(data->filter, ope); - trn_amount = 0.0; + if( tmpsrc == REPORT_SRC_ACCOUNT && showall == TRUE ) + trn_amount = hb_amount_base(trn_amount, ope->kcur); - if( (tmpfor == FOR_REPTIME_CATEGORY) && (ope->flags & OF_SPLIT) ) + pos = report_interval_get_pos(tmpintvl, from, ope); + if( pos <= n_result ) { - guint nbsplit = da_splits_count(ope->splits); - Split *split; - Category *catentry; - - for(i=0;isplits[i]; - catentry = da_cat_get(split->kcat); - if(catentry != NULL) //#1340142 - { - //#1678230 miss showall - if( showall == TRUE || selkey == catentry->parent || selkey == catentry->key ) - trn_amount += split->amount; - } - } + DB( g_print("** pos=%d : add of %.2f\n", pos, trn_amount) ); + tmp_amount[pos] += trn_amount; } else - trn_amount = ope->amount; - - trn_amount = hb_amount_base(trn_amount, ope->kcur); - - DB( g_print("** pos=%d : add of %.2f\n", pos, trn_amount) ); - - tmp_amount[pos] += trn_amount; - + { + DB( g_print("** pos=%d : invalid offset\n", pos) ); + } } - list = g_list_next(list); } @@ -1005,83 +767,49 @@ guint32 selkey; /* insert into the treeview */ for(i=0, id=0; idate_format, date); - g_date_free(date); - name = buffer; - break; - - case GROUPBY_REPTIME_WEEK: - date = g_date_new_julian(from); - g_date_add_days(date, i*7); - //g_snprintf(buffer, 63, "%d-%02d", g_date_get_year(date), g_date_get_month(date)); - g_snprintf(buffer, 63, "%d-%d", g_date_get_year(date), g_date_get_monday_week_of_year(date)); - g_date_free(date); - name = buffer; - break; - - case GROUPBY_REPTIME_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_ABMONTHS[g_date_get_month(date)])); - g_date_free(date); - name = buffer; - break; - - case GROUPBY_REPTIME_QUARTER: - date = g_date_new_julian(from); - g_date_add_months(date, i*3); - //g_snprintf(buffer, 63, "%d-%02d", g_date_get_year(date), g_date_get_month(date)); - g_snprintf(buffer, 63, "%d-%d", g_date_get_year(date), ((g_date_get_month(date)-1)/3)+1); - g_date_free(date); - name = buffer; - break; - - case GROUPBY_REPTIME_YEAR: - date = g_date_new_julian(from); - g_date_add_years(date, i); - g_snprintf(buffer, 63, "%d", g_date_get_year(date)); - g_date_free(date); - name = buffer; - break; - } - cumulation += tmp_amount[i]; - value = cumul == TRUE ? cumulation : tmp_amount[i]; + value = (cumul == TRUE) ? cumulation : tmp_amount[i]; + DB( g_print(" inserting %2d, '%s', %9.2f\n", i, intvlname, value) ); - //DB( g_print(" inserting %2d, '%s', %9.2f\n", i, name, value) ); - - gtk_list_store_append (GTK_LIST_STORE(model), &iter); - gtk_list_store_set (GTK_LIST_STORE(model), &iter, + gtk_list_store_insert_with_values (GTK_LIST_STORE(model), &iter, -1, LST_REPTIME_POS, id++, LST_REPTIME_KEY, i, - LST_REPTIME_TITLE, name, + LST_REPTIME_TITLE, intvlname, LST_REPTIME_AMOUNT, value, -1); - g_free(fullcatname); } + + // set chart and listview currency + guint32 kcur = GLOBALS->kcur; + if( (showall == FALSE) && (tmpsrc == REPORT_SRC_ACCOUNT) ) + { + Account *acc = da_acc_get(selkey); + if( acc != NULL ) + kcur = acc->kcur; + + gtk_chart_set_overdrawn(GTK_CHART(data->RE_line), acc->minimum); + } + + ui_reptime_list_set_cur(GTK_TREE_VIEW(data->LV_report), kcur); + gtk_chart_set_currency(GTK_CHART(data->RE_line), kcur); + /* 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_VIEWBY[tmpslice])); + if(column) + gtk_tree_view_column_set_title(column, hbtk_get_label(CYA_REPORT_INTVL, tmpintvl) ); gtk_tree_view_columns_autosize (GTK_TREE_VIEW(data->LV_report)); @@ -1090,15 +818,18 @@ guint32 selkey; g_object_unref(model); //update average + gtk_label_set_text(GTK_LABEL(data->TX_info), ""); + + if( cumul == TRUE ) { gchar *info; gchar buf[128]; average = cumulation / n_result; + data->average = average; hb_strfmon(buf, 127, average, kcur, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_minor)) ); - ////TRANSLATORS: count of transaction in balancedrawn / count of total transaction under abalancedrawn amount threshold info = g_strdup_printf(_("Average: %s"), buf); gtk_label_set_text(GTK_LABEL(data->TX_info), info); g_free(info); @@ -1109,16 +840,9 @@ guint32 selkey; g_free(tmp_amount); ui_reptime_update(widget, user_data); - } - - - -/* -** update sensitivity -*/ static void ui_reptime_sensitive(GtkWidget *widget, gpointer user_data) { struct ui_reptime_data *data; @@ -1286,6 +1010,7 @@ gboolean showall; gtk_widget_set_sensitive(GTK_WIDGET(data->PO_acc), showall^1); gtk_widget_set_sensitive(GTK_WIDGET(data->PO_cat), showall^1); gtk_widget_set_sensitive(GTK_WIDGET(data->PO_pay), showall^1); + gtk_widget_set_sensitive(GTK_WIDGET(data->PO_tag), showall^1); ui_reptime_compute(widget, data); @@ -1302,14 +1027,15 @@ static void ui_reptime_setup(struct ui_reptime_data *data, guint32 accnum) 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 = 0; /* 3.4 : make int transfer out of stats */ - data->filter->option[FILTER_PAYMODE] = 1; - data->filter->paymode[PAYMODE_INTXFER] = FALSE; + //todo: for compatibility with < 5.3, keep this unset, but normally it should be set + //data->filter->option[FILTER_PAYMODE] = 1; + //data->filter->paymode[PAYMODE_INTXFER] = FALSE; filter_preset_daterange_set(data->filter, PREFS->date_range_rep, data->accnum); @@ -1336,6 +1062,8 @@ static void ui_reptime_setup(struct ui_reptime_data *data, guint32 accnum) ui_cat_comboboxentry_populate(GTK_COMBO_BOX(data->PO_cat), GLOBALS->h_cat); gtk_combo_box_set_active(GTK_COMBO_BOX(data->PO_cat), 0); + ui_tag_combobox_populate(GTK_COMBO_BOX_TEXT(data->PO_tag)); + DB( g_print(" all ok\n") ); } @@ -1375,7 +1103,7 @@ struct WinGeometry *wg; g_queue_free (data->txn_queue); - da_filter_free(data->filter); + da_flt_free(data->filter); g_free(data); @@ -1454,10 +1182,11 @@ GError *error = NULL; gtk_grid_attach (GTK_GRID (table), label, 0, row, 3, 1); row++; - label = make_label_widget(_("_For:")); + label = make_label_widget(_("_View by:")); gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1); - widget = make_cycle(label, CYA_TIMESELECT); - data->CY_for = widget; + //widget = make_cycle(label, CYA_TIMESELECT); + widget = hbtk_combo_box_new_with_data(label, CYA_REPORT_SRC_TREND); + data->CY_src = widget; gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1); row++; @@ -1484,6 +1213,14 @@ GError *error = NULL; data->PO_pay = widget; gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1); + row++; + label = make_label_widget(_("_Tag:")); + data->LB_tag = label; + gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1); + widget = ui_tag_combobox_new(label); + data->PO_tag = widget; + gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1); + row++; widget = gtk_check_button_new_with_mnemonic (_("Select _all")); data->CM_all = widget; @@ -1495,12 +1232,19 @@ GError *error = NULL; gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1); row++; - label = make_label_widget(_("_View by:")); + label = make_label_widget(_("Inter_val:")); gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1); - widget = make_cycle(label, CYA_VIEWBY); - data->CY_view = widget; + //widget = make_cycle(label, CYA_REPORT_INTVL); + widget = hbtk_combo_box_new_with_data(label, CYA_REPORT_INTVL); + data->CY_intvl = widget; gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1); + row++; + widget = gtk_check_button_new_with_mnemonic (_("Show empty line")); + data->CM_showempty = widget; + gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1); + + row++; widget = gtk_check_button_new_with_mnemonic (_("Euro _minor")); data->CM_minor = widget; @@ -1514,7 +1258,6 @@ GError *error = NULL; data->RG_zoomx = widget; gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1); - row++; widget = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL); gtk_grid_attach (GTK_GRID (table), widget, 0, row, 3, 1); @@ -1695,7 +1438,8 @@ GError *error = NULL; //todo:should move this gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_minor), GLOBALS->minor); - gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_view), 1); + //duplicate, see below + //gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_intvl), 1); /* 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); @@ -1703,20 +1447,22 @@ GError *error = NULL; - /* signal connect */ - g_signal_connect (window, "delete-event", G_CALLBACK (ui_reptime_dispose), (gpointer)data); + /* signal connect */ + g_signal_connect (window, "delete-event", G_CALLBACK (ui_reptime_dispose), (gpointer)data); g_signal_connect (data->CM_cumul, "toggled", G_CALLBACK (ui_reptime_compute), NULL); g_signal_connect (data->CM_minor, "toggled", G_CALLBACK (ui_reptime_toggle_minor), NULL); - data->handler_id[HID_REPTIME_MINDATE] = g_signal_connect (data->PO_mindate, "changed", G_CALLBACK (ui_reptime_date_change), (gpointer)data); - data->handler_id[HID_REPTIME_MAXDATE] = g_signal_connect (data->PO_maxdate, "changed", G_CALLBACK (ui_reptime_date_change), (gpointer)data); + data->handler_id[HID_REPTIME_MINDATE] = g_signal_connect (data->PO_mindate, "changed", G_CALLBACK (ui_reptime_date_change), (gpointer)data); + data->handler_id[HID_REPTIME_MAXDATE] = g_signal_connect (data->PO_maxdate, "changed", G_CALLBACK (ui_reptime_date_change), (gpointer)data); data->handler_id[HID_REPTIME_RANGE] = g_signal_connect (data->CY_range, "changed", G_CALLBACK (ui_reptime_range_change), NULL); - g_signal_connect (data->CY_for, "changed", G_CALLBACK (ui_reptime_for), (gpointer)data); - data->handler_id[HID_REPTIME_VIEW] = g_signal_connect (data->CY_view, "changed", G_CALLBACK (ui_reptime_compute), (gpointer)data); + g_signal_connect (data->CY_src, "changed", G_CALLBACK (ui_reptime_for), (gpointer)data); + data->handler_id[HID_REPTIME_VIEW] = g_signal_connect (data->CY_intvl, "changed", G_CALLBACK (ui_reptime_compute), (gpointer)data); + + g_signal_connect (data->CM_showempty, "toggled", G_CALLBACK (ui_reptime_compute), NULL); //setup, init and show window ui_reptime_setup(data, accnum); @@ -1725,6 +1471,7 @@ GError *error = NULL; g_signal_connect (data->PO_acc, "changed", G_CALLBACK (ui_reptime_compute), NULL); g_signal_connect (data->PO_cat, "changed", G_CALLBACK (ui_reptime_compute), NULL); g_signal_connect (data->PO_pay, "changed", G_CALLBACK (ui_reptime_compute), NULL); + g_signal_connect (data->PO_tag, "changed", G_CALLBACK (ui_reptime_compute), NULL); g_signal_connect (data->RG_zoomx, "value-changed", G_CALLBACK (ui_reptime_zoomx_callback), NULL); @@ -1745,7 +1492,8 @@ GError *error = NULL; gtk_window_move(GTK_WINDOW(window), wg->l, wg->t); gtk_window_resize(GTK_WINDOW(window), wg->w, wg->h); - gtk_combo_box_set_active(GTK_COMBO_BOX(data->CY_view), GROUPBY_REPTIME_MONTH); + //todo: !! here + hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(data->CY_intvl), REPORT_INTVL_MONTH); gtk_widget_show_all (window); @@ -1773,6 +1521,7 @@ GError *error = NULL; return window; } + /* ** ============================================================================ */ @@ -1873,7 +1622,6 @@ static void ui_reptime_list_set_cur(GtkTreeView *treeview, guint32 kcur) } - /* ** create our statistic list */ @@ -1903,6 +1651,7 @@ GtkTreeViewColumn *column; column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("Time slice")); renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, "xalign", 1.0, NULL); gtk_tree_view_column_pack_start(column, renderer, TRUE); //gtk_tree_view_column_set_cell_data_func(column, renderer, ope_result_cell_data_function, NULL, NULL); gtk_tree_view_column_add_attribute(column, renderer, "text", LST_REPTIME_TITLE); @@ -1956,3 +1705,5 @@ gdouble val1, val2; return retval; } + +