/* 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.
*
#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"
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) },
};
-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 -------------------- */
ui_repdist_sensitive(data->window, NULL);
}
+
static void ui_repdist_action_viewpie(GtkAction *action, gpointer user_data)
{
struct ui_repdist_data *data = user_data;
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]);
}
}
//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);
*/
-
-
-/*
-** 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;
}
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);
}
-
-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;i<nbsplit;i++)
- {
- split = ope->splits[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;
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
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;
}
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;
}*/
/* 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);
}
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 )
{
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 )
{
}
+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;i<nbsplit;i++)
+ {
+ split = da_splits_get(ope->splits, 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;
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;
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));
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;
//#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;
for(i=0;i<nbsplit;i++)
{
- split = ope->splits[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( 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;i<nbsplit;i++)
{
- split = ope->splits[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;
}
}
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;
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;
- }
-
}
}
/* 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)
}
break;
- case BY_REPDIST_SUBCATEGORY:
+ case REPORT_SRC_SUBCATEGORY:
{
Category *entry = da_cat_get(i);
if(entry != NULL)
}
break;
- case BY_REPDIST_PAYEE:
+ case REPORT_SRC_PAYEE:
{
Payee *entry = da_pay_get(i);
if(entry != NULL)
}
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;
}
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));
/* 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));
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;
g_queue_free (data->txn_queue);
- da_filter_free(data->filter);
+ da_flt_free(data->filter);
g_free(data);
return FALSE;
}
+
// the window creation
GtkWidget *ui_repdist_window_new(void)
{
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);
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"));
data->RG_zoomx = widget;
gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1);
-
/*
row++;
widget = gtk_check_button_new_with_mnemonic ("Legend");
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);
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);
/* 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,