/* 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_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"
/****************************************************************************/
/* 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);
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) },
};
" <toolbar name='ToolBar'>"
" <toolitem action='List'/>"
" <toolitem action='Line'/>"
-//" <toolitem action='Column'/>"
+" <toolitem action='Column'/>"
" <separator/>"
" <toolitem action='Detail'/>"
" <separator/>"
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;
}
-/*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;
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)
case 1:
ui_reptime_action_viewline(GTK_ACTION(action), user_data);
break;
+ case 2:
+ ui_reptime_action_viewcolumn (GTK_ACTION(action), user_data);
+ break;
}
}
** ============================================================================
*/
-
-
-
-/*
-** 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)
{
}
-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;i<nbsplit;i++)
- {
- split = ope->splits[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)
struct ui_reptime_data *data;
GtkTreeModel *model;
gint page;
-gint tmpfor;
+gint tmpsrc;
gchar *title;
-//gboolean xval;
DB( g_print("\n[reptime] update\n") );
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) );
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);
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 )
{
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 )
{
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);
+
}
}
+//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;
GList *list;
gint id;
guint n_result, i;
-GDate *date1, *date2;
gdouble *tmp_amount;
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);
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;i<nbsplit;i++)
- {
- split = ope->splits[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;i<nbsplit;i++)
- {
- split = ope->splits[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);
}
/* insert into the treeview */
for(i=0, id=0; i<n_result; i++)
{
- gchar *name, *fullcatname;
+ gchar intvlname[64];
gdouble value;
- gchar buffer[64];
- GDate *date;
- name = NULL;
- fullcatname = NULL;
+ if( !showempty && tmp_amount[i] == 0 )
+ continue;
+ report_interval_snprint_name(intvlname, sizeof(intvlname)-1, tmpintvl, from, i);
DB( g_print("try to insert item %d\n", i) );
- /* get the result name */
- switch(tmpslice)
- {
- case GROUPBY_REPTIME_DAY:
- date = g_date_new_julian (from + i);
- g_date_strftime (buffer, 63, PREFS->date_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));
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);
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;
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);
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);
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") );
}
g_queue_free (data->txn_queue);
- da_filter_free(data->filter);
+ da_flt_free(data->filter);
g_free(data);
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++;
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;
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;
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);
//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);
- /* 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);
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);
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);
return window;
}
+
/*
** ============================================================================
*/
}
-
/*
** create our statistic list
*/
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);
return retval;
}
+
+