1 /* ************************************************************************** */
2 /*                                                                            */
3 /*     Copyright (C) 2007 Dominique Parisot                                   */
4 /*          zionly@free.org                                                   */
5 /*          2008-2020 Pierre Biava (grisbi@pierre.biava.name)                 */
6 /*          https://www.grisbi.org/                                           */
7 /*                                                                            */
8 /*  This program is free software; you can redistribute it and/or modify      */
9 /*  it under the terms of the GNU General Public License as published by      */
10 /*  the Free Software Foundation; either version 2 of the License, or         */
11 /*  (at your option) any later version.                                       */
12 /*                                                                            */
13 /*  This program is distributed in the hope that it will be useful,           */
14 /*  but WITHOUT ANY WARRANTY; without even the implied warranty of            */
15 /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             */
16 /*  GNU General Public License for more details.                              */
17 /*                                                                            */
18 /*  You should have received a copy of the GNU General Public License         */
19 /*  along with this program; if not, write to the Free Software               */
20 /*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
21 /*                                                                            */
22 /* ************************************************************************** */
23 
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27 
28 #include "include.h"
29 #include <glib/gi18n.h>
30 
31 /*START_INCLUDE*/
32 #include "bet_hist.h"
33 #include "bet_data.h"
34 #include "bet_graph.h"
35 #include "bet_tab.h"
36 #include "dialog.h"
37 #include "export_csv.h"
38 #include "grisbi_app.h"
39 #include "gsb_automem.h"
40 #include "gsb_data_account.h"
41 #include "gsb_data_currency.h"
42 #include "gsb_data_fyear.h"
43 #include "gsb_data_transaction.h"
44 #include "gsb_file.h"
45 #include "gsb_fyear.h"
46 #include "gsb_real.h"
47 #include "gsb_rgba.h"
48 #include "mouse.h"
49 #include "navigation.h"
50 #include "print_tree_view_list.h"
51 #include "structures.h"
52 #include "traitement_variables.h"
53 #include "utils.h"
54 #include "utils_dates.h"
55 #include "utils_files.h"
56 #include "utils_real.h"
57 #include "utils_str.h"
58 #include "utils_widgets.h"
59 #include "erreur.h"
60 /*END_INCLUDE*/
61 
62 /*START_STATIC*/
63 static void bet_historical_add_average_amount ( GtkWidget *menu_item,
64                         GtkTreeSelection *tree_selection );
65 static void bet_historical_add_last_amount ( GtkWidget *menu_item,
66                         GtkTreeSelection *tree_selection );
67 static gboolean bet_historical_affiche_div ( GHashTable  *list_div, GtkWidget *tree_view );
68 static gboolean bet_historical_amount_differ_average ( GtkTreeModel *model,
69                         GtkTreeIter *iter );
70 static gboolean bet_historical_button_press ( GtkWidget *tree_view,
71                         GdkEventButton *ev );
72 static void bet_historical_context_menu ( GtkWidget *tree_view );
73 static GtkWidget *bet_historical_create_toolbar ( GtkWidget *parent,
74                         GtkWidget *tree_view );
75 static void bet_historical_div_cell_edited (GtkCellRendererText *cell,
76                         const gchar *path_string,
77                         const gchar *new_text,
78                         GtkWidget *tree_view );
79 static void bet_historical_div_cell_editing_started (GtkCellRenderer *cell,
80                         GtkCellEditable *editable,
81                         const gchar *path_string,
82                         GtkWidget *tree_view );
83 static gboolean bet_historical_div_toggle_clicked ( GtkCellRendererToggle *renderer,
84                         gchar *path_string,
85                         GtkTreeModel *model );
86 static void bet_historical_export_tab ( GtkWidget *menu_item,
87                         GtkTreeView *tree_view );
88 static GsbReal bet_historical_get_children_amount ( GtkTreeModel *model, GtkTreeIter *parent );
89 static GtkWidget *bet_historical_get_data_tree_view ( GtkWidget *container );
90 static gboolean bet_historical_get_full_div ( GtkTreeModel *model, GtkTreeIter *parent );
91 static gint bet_historical_get_type_transaction ( const GDate *date,
92                         GDate *start_current_fyear,
93                         GDate *date_max );
94 static gboolean bet_historical_initializes_account_settings ( gint account_number );
95 static void bet_historical_populate_div_model ( gpointer key,
96                         gpointer value,
97                         gpointer user_data );
98 static void bet_historical_print_tab ( GtkWidget *menu_item,
99                         GtkTreeView *tree_view );
100 static void bet_historical_row_collapse_all ( GtkTreeView *tree_view,
101                         GtkTreeIter *iter,
102                         GtkTreeModel *model );
103 static void bet_historical_row_collapsed_event ( GtkTreeView *tree_view,
104                         GtkTreeIter *iter,
105                         GtkTreePath *path,
106                         GtkTreeModel *model );
107 static void bet_historical_row_expanded_event ( GtkTreeView *tree_view,
108                         GtkTreeIter *iter,
109                         GtkTreePath *path,
110                         GtkTreeModel *model );
111 static gboolean bet_historical_set_background_color ( GtkWidget *tree_view );
112 static gboolean bet_historical_set_empty_sub_div ( GtkTreeModel *model, GtkTreeIter *parent );
113 static gboolean bet_historical_set_full_sub_div ( GtkTreeModel *model, GtkTreeIter *parent );
114 /*END_STATIC*/
115 
116 /*START_EXTERN*/
117 /*END_EXTERN*/
118 
119 /* blocage des signaux pour le tree_view pour les comptes de type GSB_TYPE_CASH */
120 static gboolean hist_block_signal = FALSE;
121 
122 /* toolbar */
123 static GtkWidget *bet_historical_toolbar;
124 
125 /* liste qui contient les transactions concernées */
126 static GHashTable *list_trans_hist = NULL;
127 
128 /**
129  * this is a tree model filter with 3 columns :
130  * the name, the number and a boolean to show it or not
131  * */
132 static GtkTreeModel *bet_fyear_model = NULL;
133 
134 /**
135  * this is a tree model filter from fyear_model_filter which
136  * show only the financial years which must be showed
137  * */
138 static GtkTreeModel *bet_fyear_model_filter = NULL;
139 
140 
141 /**
142  * Create the historical page
143  *
144  *
145  *
146  * */
bet_historical_create_page(void)147 GtkWidget *bet_historical_create_page ( void )
148 {
149     GtkWidget *page;
150     GtkWidget *frame;
151     GtkWidget *hbox;
152     GtkWidget *label_title;
153     GtkWidget *tree_view;
154     GtkWidget *account_page;
155 
156     devel_debug (NULL);
157     page = gtk_box_new ( GTK_ORIENTATION_VERTICAL, MARGIN_BOX );
158     gtk_widget_set_name ( page, "historical_page" );
159 
160     account_page = grisbi_win_get_account_page ();
161 
162     /* frame pour la barre d'outils */
163     frame = gtk_frame_new ( NULL );
164     gtk_box_pack_start ( GTK_BOX ( page ), frame, FALSE, FALSE, 0 );
165 
166     /* titre de la page */
167     label_title = gtk_label_new ( "bet_hist_title" );
168 	gtk_widget_set_halign (label_title, GTK_ALIGN_CENTER);
169     gtk_box_pack_start ( GTK_BOX ( page ), label_title, FALSE, FALSE, 5);
170     g_object_set_data ( G_OBJECT ( grisbi_win_get_account_page () ), "bet_hist_title", label_title);
171 
172     /* Choix des données sources */
173 	hbox = utils_widget_origin_data_new (account_page, SPP_ORIGIN_HISTORICAL);
174 	gtk_widget_set_halign (hbox, GTK_ALIGN_CENTER);
175     gtk_box_pack_start ( GTK_BOX ( page ), hbox, FALSE, FALSE, 5);
176     g_object_set_data ( G_OBJECT ( account_page ), "bet_historical_data", hbox );
177 
178     /* création de la liste des données */
179     tree_view = bet_historical_get_data_tree_view ( page );
180     g_object_set_data ( G_OBJECT ( account_page ), "bet_historical_treeview", tree_view );
181     g_object_set_data ( G_OBJECT ( tree_view ), "label_title", label_title );
182 
183     /* set the color of selected row */
184 	gtk_widget_set_name (tree_view, "colorized_tree_view");
185 
186     /* on y ajoute la barre d'outils */
187     bet_historical_toolbar = bet_historical_create_toolbar ( page, tree_view );
188     gtk_container_add ( GTK_CONTAINER ( frame ), bet_historical_toolbar );
189 
190     gtk_widget_show_all ( page );
191 
192     return page;
193 }
194 
195 
196 /**
197  *
198  *
199  *
200  *
201  * */
bet_historical_div_toggle_clicked(GtkCellRendererToggle * renderer,gchar * path_string,GtkTreeModel * model)202 gboolean bet_historical_div_toggle_clicked ( GtkCellRendererToggle *renderer,
203                         gchar *path_string,
204                         GtkTreeModel *model )
205 {
206     GtkTreeIter iter;
207 
208     /* devel_debug (path_string); */
209     if ( gtk_tree_model_get_iter_from_string ( GTK_TREE_MODEL ( model ), &iter, path_string ) )
210     {
211         gchar *str_amount;
212         gchar *str_average;
213         gint div_number;
214         gint sub_div_nb;
215         gint nbre_fils;
216         gint account_number;
217         gboolean valeur;
218         gboolean col_edited;
219 
220         gtk_tree_model_get ( GTK_TREE_MODEL ( model ), &iter,
221                         SPP_HISTORICAL_SELECT_COLUMN, &valeur,
222                         SPP_HISTORICAL_AVERAGE_COLUMN, &str_average,
223                         SPP_HISTORICAL_AVERAGE_AMOUNT, &str_amount,
224                         SPP_HISTORICAL_ACCOUNT_NUMBER, &account_number,
225                         SPP_HISTORICAL_DIV_NUMBER, &div_number,
226                         SPP_HISTORICAL_SUB_DIV_NUMBER, &sub_div_nb,
227                         SPP_HISTORICAL_EDITED_COLUMN, &col_edited,
228                         -1 );
229 
230         if ( col_edited == FALSE && valeur == FALSE )
231             return FALSE;
232 
233         if ( renderer )
234             valeur = 1 - valeur;
235 
236         if ( valeur == 1 )
237         {
238             /* printf ("avant - account_number = %d, div = %d, sub_div = %d\n",
239                         account_number, div, sub_div); */
240             bet_data_hist_add_div ( account_number, div_number, sub_div_nb );
241             bet_data_set_div_amount ( account_number, div_number, sub_div_nb,
242                         utils_real_get_from_string ( str_amount ) );
243             gtk_tree_store_set ( GTK_TREE_STORE ( model ), &iter,
244                         SPP_HISTORICAL_SELECT_COLUMN, 1,
245                         SPP_HISTORICAL_RETAINED_COLUMN, str_average,
246                         SPP_HISTORICAL_RETAINED_AMOUNT, str_amount,
247                         SPP_HISTORICAL_ACCOUNT_NUMBER, account_number,
248                         SPP_HISTORICAL_DIV_NUMBER, div_number,
249                         SPP_HISTORICAL_SUB_DIV_NUMBER, sub_div_nb,
250                         -1 );
251         }
252         else
253         {
254             bet_data_remove_div_hist ( account_number, div_number, sub_div_nb );
255             gtk_tree_store_set ( GTK_TREE_STORE ( model ), &iter,
256                         SPP_HISTORICAL_SELECT_COLUMN, FALSE,
257                         SPP_HISTORICAL_RETAINED_COLUMN, "",
258                         SPP_HISTORICAL_RETAINED_AMOUNT, str_amount,
259                         SPP_HISTORICAL_ACCOUNT_NUMBER, account_number,
260                         SPP_HISTORICAL_DIV_NUMBER, div_number,
261                         SPP_HISTORICAL_SUB_DIV_NUMBER, sub_div_nb,
262                         SPP_HISTORICAL_EDITED_COLUMN, TRUE,
263                         -1 );
264         }
265 
266         nbre_fils = gtk_tree_model_iter_n_children ( GTK_TREE_MODEL ( model ), &iter );
267         if ( nbre_fils > 0 )
268         {
269             if ( valeur == 1 )
270                 bet_historical_set_full_sub_div ( model, &iter );
271             else
272                 bet_historical_set_empty_sub_div ( model, &iter );
273         }
274         else
275         {
276             GtkTreeIter parent;
277             GsbReal amount;
278 
279             if ( gtk_tree_model_iter_parent ( GTK_TREE_MODEL ( model ), &parent, &iter ) )
280             {
281                 if ( bet_historical_get_full_div ( model, &parent ) )
282                 {
283                     amount = bet_historical_get_children_amount ( model, &parent );
284                     g_free ( str_amount );
285                     str_amount = utils_real_get_string ( amount );
286                     g_free ( str_average );
287                     str_average = utils_real_get_string_with_currency ( amount,
288                                 gsb_data_account_get_currency ( account_number ), TRUE );
289                     gtk_tree_store_set ( GTK_TREE_STORE ( model ),
290                                 &parent,
291                                 SPP_HISTORICAL_SELECT_COLUMN, TRUE,
292                                 SPP_HISTORICAL_RETAINED_COLUMN, str_average,
293                                 SPP_HISTORICAL_RETAINED_AMOUNT, str_amount,
294                                 -1);
295                     if ( bet_historical_amount_differ_average ( model, &parent) )
296                         bet_data_set_div_amount ( account_number, div_number, 0, amount );
297 
298                     bet_historical_row_collapse_all ( NULL, &parent, model );
299                 }
300                 else
301                 {
302                     bet_data_set_div_amount ( account_number, div_number, 0, null_real );
303                     gtk_tree_store_set ( GTK_TREE_STORE ( model ), &parent,
304                                 SPP_HISTORICAL_SELECT_COLUMN, FALSE,
305                                 SPP_HISTORICAL_RETAINED_COLUMN, "",
306                                 SPP_HISTORICAL_EDITED_COLUMN, TRUE,
307                                 -1 );
308                 }
309             }
310         }
311 
312         gsb_data_account_set_bet_maj ( account_number, BET_MAJ_ESTIMATE );
313         bet_data_update_bet_module ( account_number, GSB_HISTORICAL_PAGE );
314     }
315 
316     gsb_file_set_modified ( TRUE );
317 
318     return FALSE;
319 }
320 
321 
322 /**
323  *
324  *
325  *
326  *
327  * */
bet_historical_div_cell_editing_started(GtkCellRenderer * cell,GtkCellEditable * editable,const gchar * path_string,GtkWidget * tree_view)328 void bet_historical_div_cell_editing_started (GtkCellRenderer *cell,
329                         GtkCellEditable *editable,
330                         const gchar *path_string,
331                         GtkWidget *tree_view )
332 {
333     if ( GTK_IS_ENTRY ( editable ) )
334         gtk_editable_delete_text ( GTK_EDITABLE ( editable ), 0, -1 );
335 }
336 
337 
338 /**
339  *
340  *
341  *
342  *
343  * */
bet_historical_div_cell_edited(GtkCellRendererText * cell,const gchar * path_string,const gchar * new_text,GtkWidget * tree_view)344 void bet_historical_div_cell_edited (GtkCellRendererText *cell,
345                         const gchar *path_string,
346                         const gchar *new_text,
347                         GtkWidget *tree_view )
348 {
349     GtkTreeModel *model;
350     GtkTreeIter iter;
351 
352     /* devel_debug (new_text); */
353     model = gtk_tree_view_get_model ( GTK_TREE_VIEW ( tree_view ) );
354     if ( gtk_tree_model_get_iter_from_string ( GTK_TREE_MODEL ( model ), &iter, path_string ) )
355     {
356         GtkTreeIter parent;
357         gboolean valeur;
358         gboolean edited;
359         gint account_number;
360         gint currency_number;
361         gint div_number;
362         gint sub_div_nb;
363         gchar *tmp_str;
364         gchar *str_amount;
365         gboolean is_parent = FALSE;
366         GsbReal number;
367 
368         gtk_tree_model_get ( GTK_TREE_MODEL ( model ), &iter,
369                         SPP_HISTORICAL_SELECT_COLUMN, &valeur,
370                         SPP_HISTORICAL_ACCOUNT_NUMBER, &account_number,
371                         SPP_HISTORICAL_DIV_NUMBER, &div_number,
372                         SPP_HISTORICAL_SUB_DIV_NUMBER, &sub_div_nb,
373                         SPP_HISTORICAL_EDITED_COLUMN, &edited,
374                         -1 );
375 
376         if ( edited == FALSE )
377             return;
378 
379         is_parent = gtk_tree_model_iter_parent ( GTK_TREE_MODEL ( model ), &parent, &iter );
380         if ( is_parent == FALSE )
381         {
382             bet_historical_set_empty_sub_div ( model, &iter );
383             bet_historical_row_collapse_all ( GTK_TREE_VIEW ( tree_view ), &iter, model );
384         }
385 
386         number = utils_real_get_from_string ( new_text );
387         currency_number = gsb_data_account_get_currency ( account_number );
388         tmp_str = utils_real_get_string_with_currency ( number, currency_number, TRUE );
389         str_amount = utils_real_get_string ( number );
390 
391         if ( bet_data_search_div_hist ( account_number, div_number, sub_div_nb ) == FALSE )
392             bet_data_hist_add_div ( account_number, div_number, sub_div_nb );
393 
394         bet_data_set_div_edited  ( account_number, div_number, sub_div_nb, TRUE );
395         bet_data_set_div_amount ( account_number, div_number, sub_div_nb, number );
396         gtk_tree_store_set ( GTK_TREE_STORE ( model ), &iter,
397                             SPP_HISTORICAL_SELECT_COLUMN, TRUE,
398                             SPP_HISTORICAL_RETAINED_COLUMN, tmp_str,
399                             SPP_HISTORICAL_RETAINED_AMOUNT, str_amount,
400                             -1 );
401         g_free ( str_amount );
402         g_free ( tmp_str );
403 
404         if ( is_parent )
405             gtk_tree_store_set ( GTK_TREE_STORE ( model ),
406                         &parent,
407                         SPP_HISTORICAL_EDITED_COLUMN, FALSE,
408                         -1);
409 
410         if ( is_parent && bet_historical_get_full_div ( model, &parent ) )
411         {
412             number = bet_historical_get_children_amount ( model, &parent );
413             bet_data_set_div_amount ( account_number, div_number, 0, number );
414             str_amount = utils_real_get_string ( number );
415             tmp_str = utils_real_get_string_with_currency ( number, currency_number, TRUE );
416             gtk_tree_store_set ( GTK_TREE_STORE ( model ),
417                         &parent,
418                         SPP_HISTORICAL_SELECT_COLUMN, TRUE,
419                         SPP_HISTORICAL_RETAINED_COLUMN, tmp_str,
420                         SPP_HISTORICAL_RETAINED_AMOUNT, str_amount,
421                         SPP_HISTORICAL_EDITED_COLUMN, FALSE,
422                         -1);
423             g_free ( str_amount );
424             g_free ( tmp_str );
425         }
426 
427         gsb_data_account_set_bet_maj ( account_number, BET_MAJ_ESTIMATE );
428 
429         gsb_file_set_modified ( TRUE );
430     }
431 }
432 
433 
434 /**
435  *
436  *
437  *
438  *
439  * */
bet_historical_get_data_tree_view(GtkWidget * container)440 GtkWidget *bet_historical_get_data_tree_view ( GtkWidget *container )
441 {
442     GtkWidget *scrolled_window;
443     GtkWidget *tree_view;
444     GtkWidget *account_page;
445     GtkTreeStore *tree_model;
446     GtkTreeSelection *tree_selection;
447     GtkCellRenderer *cell;
448     GtkTreeViewColumn *column;
449     gchar *title;
450 
451     /* devel_debug (NULL); */
452     account_page = grisbi_win_get_account_page ();
453     tree_view = gtk_tree_view_new ( );
454 	gtk_widget_set_tooltip_text (tree_view, _("Amount retained: Enter a negative number for a debit\n"
455 											  "a positive number for a credit"));
456     g_object_set_data ( G_OBJECT ( account_page ), "hist_tree_view", tree_view );
457 
458     tree_model = gtk_tree_store_new ( SPP_HISTORICAL_NUM_COLUMNS,
459                         G_TYPE_BOOLEAN,     /* SPP_HISTORICAL_SELECT_COLUMN     */
460                         G_TYPE_STRING,      /* SPP_HISTORICAL_DESC_COLUMN       */
461                         G_TYPE_STRING,      /* SPP_HISTORICAL_CURRENT_COLUMN    */
462                         G_TYPE_STRING,      /* SPP_HISTORICAL_BALANCE_COLUMN    */
463                         G_TYPE_STRING,      /* SPP_HISTORICAL_BALANCE_AMOUNT    */
464                         G_TYPE_STRING,      /* SPP_HISTORICAL_AVERAGE_COLUMN    */
465                         G_TYPE_STRING,      /* SPP_HISTORICAL_AVERAGE_AMOUNT    */
466                         G_TYPE_STRING,      /* SPP_HISTORICAL_RETAINED_COLUMN   */
467                         G_TYPE_STRING,      /* SPP_HISTORICAL_RETAINED_AMOUNT   */
468                         G_TYPE_STRING,      /* SPP_HISTORICAL_BALANCE_COLOR     */
469                         G_TYPE_INT,         /* SPP_HISTORICAL_ACCOUNT_NUMBER    */
470                         G_TYPE_INT,         /* SPP_HISTORICAL_DIV_NUMBER        */
471                         G_TYPE_INT,         /* SPP_HISTORICAL_SUB_DIV_NUMBER    */
472                         G_TYPE_BOOLEAN,     /* SPP_HISTORICAL_EDITED_COLUMN     */
473                         GDK_TYPE_RGBA );    /* SPP_HISTORICAL_BACKGROUND_COLOR  */
474     gtk_tree_view_set_model ( GTK_TREE_VIEW (tree_view), GTK_TREE_MODEL ( tree_model ) );
475     g_object_unref ( G_OBJECT ( tree_model ) );
476 
477     gtk_tree_sortable_set_sort_column_id ( GTK_TREE_SORTABLE ( tree_model ),
478 					    SPP_HISTORICAL_DESC_COLUMN, GTK_SORT_ASCENDING );
479 
480     tree_selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW ( tree_view ) );
481     gtk_tree_selection_set_mode ( tree_selection, GTK_SELECTION_SINGLE );
482 
483     scrolled_window = gtk_scrolled_window_new ( NULL, NULL );
484     gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( scrolled_window ),
485                         GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC );
486     gtk_widget_set_size_request ( scrolled_window, -1, 250 );
487     gtk_container_add ( GTK_CONTAINER ( scrolled_window ), tree_view );
488     gtk_box_pack_start ( GTK_BOX ( container ), scrolled_window, TRUE, TRUE, 15 );
489 
490     /* create columns */
491     cell = gtk_cell_renderer_toggle_new ( );
492     g_object_set_data ( G_OBJECT ( account_page ), "toggle_cell", cell );
493     gtk_cell_renderer_toggle_set_radio ( GTK_CELL_RENDERER_TOGGLE ( cell ),
494                         FALSE );
495     g_object_set (cell, "xalign", 0.5, NULL);
496 	g_signal_connect ( cell,
497                         "toggled",
498                         G_CALLBACK (bet_historical_div_toggle_clicked),
499                         tree_model );
500 
501     column = gtk_tree_view_column_new_with_attributes ( _("Select"),
502                         cell,
503                         "active", SPP_HISTORICAL_SELECT_COLUMN,
504                         "cell-background-rgba", SPP_HISTORICAL_BACKGROUND_COLOR,
505                         NULL);
506     gtk_tree_view_column_set_alignment ( column, 0.5 );
507     gtk_tree_view_append_column ( GTK_TREE_VIEW ( tree_view ), column );
508     gtk_tree_view_column_set_resizable ( column, TRUE );
509     g_object_set_data ( G_OBJECT ( column ), "num_col_model",
510                         GINT_TO_POINTER ( SPP_HISTORICAL_SELECT_COLUMN ) );
511 
512     /* name of the div sous-div column*/
513     title = g_strdup ( _("Category") );
514     cell = gtk_cell_renderer_text_new ( );
515     column = gtk_tree_view_column_new_with_attributes ( title,
516                         cell,
517                         "text", SPP_HISTORICAL_DESC_COLUMN,
518                         "cell-background-rgba", SPP_HISTORICAL_BACKGROUND_COLOR,
519                         NULL);
520     g_object_set_data ( G_OBJECT ( account_page ), "historical_column_source",
521                         column );
522     gtk_tree_view_append_column ( GTK_TREE_VIEW ( tree_view ),
523                         GTK_TREE_VIEW_COLUMN ( column ) );
524     gtk_tree_view_column_set_expand ( GTK_TREE_VIEW_COLUMN ( column ), TRUE );
525     gtk_tree_view_column_set_resizable ( column, TRUE );
526     g_object_set_data ( G_OBJECT ( column ), "num_col_model",
527                         GINT_TO_POINTER ( SPP_HISTORICAL_DESC_COLUMN ) );
528 
529 	g_free (title);
530 
531     /* amount column */
532     cell = gtk_cell_renderer_text_new ( );
533     column = gtk_tree_view_column_new_with_attributes (
534                         _("Amount"), cell,
535                         "text", SPP_HISTORICAL_BALANCE_COLUMN,
536                         "foreground", SPP_HISTORICAL_BALANCE_COLOR,
537                         "cell-background-rgba", SPP_HISTORICAL_BACKGROUND_COLOR,
538                         NULL);
539     gtk_tree_view_append_column ( GTK_TREE_VIEW ( tree_view ),
540                         GTK_TREE_VIEW_COLUMN ( column ) );
541     g_object_set ( G_OBJECT ( GTK_CELL_RENDERER ( cell ) ), "xalign", 1.0, NULL );
542     gtk_tree_view_column_set_alignment ( column, 1 );
543     gtk_tree_view_column_set_clickable ( GTK_TREE_VIEW_COLUMN ( column ), FALSE );
544     gtk_tree_view_column_set_expand ( GTK_TREE_VIEW_COLUMN ( column ), TRUE );
545     gtk_tree_view_column_set_resizable ( column, TRUE );
546     g_object_set_data ( G_OBJECT ( column ), "num_col_model",
547                         GINT_TO_POINTER ( SPP_HISTORICAL_BALANCE_COLUMN ) );
548 
549     /* average column */
550     cell = gtk_cell_renderer_text_new ( );
551     column = gtk_tree_view_column_new_with_attributes (
552                         _("Average"), cell,
553                         "text", SPP_HISTORICAL_AVERAGE_COLUMN,
554                         "foreground", SPP_HISTORICAL_BALANCE_COLOR,
555                         "cell-background-rgba", SPP_HISTORICAL_BACKGROUND_COLOR,
556                         NULL);
557     gtk_tree_view_append_column ( GTK_TREE_VIEW ( tree_view ),
558                         GTK_TREE_VIEW_COLUMN ( column ) );
559     g_object_set ( G_OBJECT ( GTK_CELL_RENDERER ( cell ) ), "xalign", 1.0, NULL );
560     gtk_tree_view_column_set_alignment ( column, 1 );
561     gtk_tree_view_column_set_clickable ( GTK_TREE_VIEW_COLUMN ( column ), FALSE );
562     gtk_tree_view_column_set_expand ( GTK_TREE_VIEW_COLUMN ( column ), TRUE );
563     gtk_tree_view_column_set_resizable ( column, TRUE );
564     g_object_set_data ( G_OBJECT ( column ), "num_col_model",
565                         GINT_TO_POINTER ( SPP_HISTORICAL_AVERAGE_COLUMN ) );
566 
567     /* current fyear column */
568     cell = gtk_cell_renderer_text_new ( );
569     column = gtk_tree_view_column_new_with_attributes (
570                         _("Current fyear"), cell,
571                         "text", SPP_HISTORICAL_CURRENT_COLUMN,
572                         "foreground", SPP_HISTORICAL_BALANCE_COLOR,
573                         "cell-background-rgba", SPP_HISTORICAL_BACKGROUND_COLOR,
574                         NULL);
575     gtk_tree_view_append_column ( GTK_TREE_VIEW ( tree_view ),
576                         GTK_TREE_VIEW_COLUMN ( column ) );
577     g_object_set ( G_OBJECT ( GTK_CELL_RENDERER ( cell ) ), "xalign", 1.0, NULL );
578     gtk_tree_view_column_set_alignment ( column, 1 );
579     gtk_tree_view_column_set_clickable ( GTK_TREE_VIEW_COLUMN ( column ), FALSE );
580     gtk_tree_view_column_set_expand ( GTK_TREE_VIEW_COLUMN ( column ), TRUE );
581     gtk_tree_view_column_set_resizable ( column, TRUE );
582     g_object_set_data ( G_OBJECT ( column ), "num_col_model",
583                         GINT_TO_POINTER ( SPP_HISTORICAL_CURRENT_COLUMN ) );
584 
585     /* amount retained column */
586     cell = gtk_cell_renderer_text_new ( );
587     g_object_set_data ( G_OBJECT ( account_page ), "edited_cell", cell );
588 	gtk_cell_renderer_set_padding (GTK_CELL_RENDERER (cell), MARGIN_BOX, 0);
589     column = gtk_tree_view_column_new_with_attributes (
590                         _("Amount retained"), cell,
591                         "text", SPP_HISTORICAL_RETAINED_COLUMN,
592                         "foreground", SPP_HISTORICAL_BALANCE_COLOR,
593                         "editable", SPP_HISTORICAL_EDITED_COLUMN,
594                         "cell-background-rgba", SPP_HISTORICAL_BACKGROUND_COLOR,
595                         NULL);
596     gtk_tree_view_append_column ( GTK_TREE_VIEW ( tree_view ),
597                         GTK_TREE_VIEW_COLUMN ( column ) );
598     g_object_set ( G_OBJECT ( GTK_CELL_RENDERER ( cell ) ), "xalign", 1.0, NULL );
599     gtk_tree_view_column_set_alignment ( column, 1 );
600     gtk_tree_view_column_set_clickable ( GTK_TREE_VIEW_COLUMN ( column ), FALSE );
601     gtk_tree_view_column_set_expand ( GTK_TREE_VIEW_COLUMN ( column ), TRUE );
602     gtk_tree_view_column_set_resizable ( column, TRUE );
603     g_object_set_data ( G_OBJECT ( column ), "num_col_model",
604                         GINT_TO_POINTER ( SPP_HISTORICAL_RETAINED_COLUMN ) );
605 
606     g_signal_connect ( cell,
607                         "editing-started",
608                         G_CALLBACK (bet_historical_div_cell_editing_started),
609                         tree_view );
610     g_signal_connect ( cell,
611                         "edited",
612                         G_CALLBACK (bet_historical_div_cell_edited),
613                         tree_view );
614 
615     g_signal_connect ( G_OBJECT ( tree_view ),
616                         "row-collapsed",
617                         G_CALLBACK ( bet_historical_row_collapsed_event ),
618                         tree_model );
619 
620     g_signal_connect ( G_OBJECT ( tree_view ),
621                         "row-expanded",
622                         G_CALLBACK ( bet_historical_row_expanded_event ),
623                         tree_model );
624 
625     g_signal_connect ( G_OBJECT ( tree_view ),
626 		                "button-press-event",
627 		                G_CALLBACK ( bet_historical_button_press ),
628 		                NULL );
629 
630     gtk_widget_show_all ( scrolled_window );
631 
632     return tree_view;
633 }
634 
635 
636 /**
637  *
638  *
639  *
640  *
641  * */
bet_historical_populate_data(gint account_number)642 void bet_historical_populate_data ( gint account_number )
643 {
644     GtkWidget *tree_view;
645     GtkTreeModel *model;
646     GtkTreePath *path = NULL;
647     gint fyear_number;
648     GDate *date_jour;
649     GDate *date_min;
650     GDate *date_max;
651     GDate *start_current_fyear;
652     GSList* tmp_list;
653     GHashTable *list_div;
654     TransactionCurrentFyear *tcf = NULL;
655 
656     devel_debug_int ( account_number );
657     tree_view = g_object_get_data (G_OBJECT ( grisbi_win_get_account_page () ), "bet_historical_treeview" );
658     if ( GTK_IS_TREE_VIEW ( tree_view ) == FALSE )
659         return;
660 
661     /* Initializes account settings */
662     bet_historical_initializes_account_settings ( account_number );
663 
664     model = gtk_tree_view_get_model ( GTK_TREE_VIEW ( tree_view ) );
665     gtk_tree_store_clear ( GTK_TREE_STORE ( model ) );
666 
667     /* calculate date_jour, date_min and date_max */
668     date_jour = gdate_today ( );
669 
670     fyear_number = gsb_data_account_get_bet_hist_fyear ( account_number );
671     if ( fyear_number == 0 )
672     {
673         date_min = gdate_today ( );
674         g_date_subtract_years ( date_min, 1 );
675         date_max = gdate_today ( );
676         g_date_subtract_days ( date_max, 1 );
677     }
678     else
679     {
680         date_min = gsb_date_copy ( gsb_data_fyear_get_beginning_date ( fyear_number ) );
681         date_max = gsb_date_copy ( gsb_data_fyear_get_end_date ( fyear_number ) );
682     }
683 
684     /* calculate the current_fyear */
685     start_current_fyear = bet_historical_get_start_date_current_fyear ( );
686 
687     list_div = g_hash_table_new_full ( g_str_hash,
688                         g_str_equal,
689                         (GDestroyNotify) g_free,
690                         (GDestroyNotify) struct_free_bet_historical );
691 
692     /* on initialise ici la liste des transactions pour les graphiques mensuels */
693     if ( list_trans_hist )
694         g_hash_table_remove_all ( list_trans_hist );
695 
696     list_trans_hist = g_hash_table_new_full ( g_str_hash,
697                                     g_str_equal,
698                                     (GDestroyNotify) g_free,
699                                     (GDestroyNotify) struct_free_bet_transaction_current_fyear );
700 
701     /* search transactions of the account  */
702     tmp_list = gsb_data_transaction_get_complete_transactions_list ( );
703     while ( tmp_list )
704     {
705         gint transaction_number;
706         gint tmp_account_number;
707         const GDate *date;
708         gint type_de_transaction;
709 
710         transaction_number = gsb_data_transaction_get_transaction_number ( tmp_list->data );
711         tmp_list = tmp_list -> next;
712 
713         tmp_account_number =  gsb_data_transaction_get_account_number ( transaction_number );
714         if ( tmp_account_number != account_number )
715             continue;
716 
717         date = gsb_data_transaction_get_date ( transaction_number );
718         /* ignore transaction which are before date_min */
719         if ( g_date_compare ( date, date_min ) < 0 )
720             continue;
721 
722         /* ignore transaction which is after date_jour */
723         if ( g_date_compare ( date, date_jour ) > 0 )
724             continue;
725 
726         /* ignore splitted transactions */
727         if ( gsb_data_transaction_get_split_of_transaction (
728          transaction_number ) == TRUE )
729             continue;
730 
731         /* on détermine le type de transaction pour l'affichage */
732         type_de_transaction = bet_historical_get_type_transaction ( date, start_current_fyear, date_max );
733 
734         tcf = struct_initialise_transaction_current_fyear ();
735         tcf->transaction_number = transaction_number;
736         tcf->date = gsb_date_copy ( date );
737         tcf->type_de_transaction = type_de_transaction;
738 
739         g_hash_table_insert ( list_trans_hist, utils_str_itoa ( transaction_number ), tcf );
740         bet_data_populate_div ( transaction_number, TRUE, list_div, type_de_transaction, tcf );
741     }
742 
743     bet_historical_affiche_div ( list_div, tree_view );
744 
745     g_hash_table_remove_all ( list_div );
746 	g_hash_table_unref (list_div);
747     g_date_free ( date_jour );
748     g_date_free ( date_min );
749     g_date_free ( date_max );
750     g_date_free ( start_current_fyear );
751 
752     bet_historical_set_background_color ( tree_view );
753 	path = gtk_tree_path_new_first ();
754     bet_array_list_select_path (tree_view, path);
755     gtk_tree_path_free (path);
756 }
757 
758 
759 /**
760  *
761  *
762  *
763  *
764  * */
bet_historical_affiche_div(GHashTable * list_div,GtkWidget * tree_view)765 gboolean bet_historical_affiche_div ( GHashTable  *list_div, GtkWidget *tree_view )
766 {
767     /* devel_debug (NULL); */
768     g_hash_table_foreach ( list_div, bet_historical_populate_div_model, tree_view );
769 
770     return FALSE;
771 }
772 
773 
774 /**
775  *
776  *
777  *
778  *
779  * */
bet_historical_populate_div_model(gpointer key,gpointer value,gpointer user_data)780 void bet_historical_populate_div_model ( gpointer key,
781                         gpointer value,
782                         gpointer user_data )
783 {
784     BetHist *sh = (BetHist*) value;
785     BetRange *sbr = sh -> sbr;
786     GtkTreeView *tree_view = ( GtkTreeView * ) user_data;
787     GtkTreeModel *model;
788     GtkTreeIter parent;
789     GHashTableIter iter;
790     gpointer sub_key, sub_value;
791     gchar *div_name = NULL;
792     gchar *str_balance;
793     gchar *str_balance_amount;
794     gchar *str_average;
795     gchar *str_amount;
796     gchar *str_retained = NULL;
797     gchar *str_current_fyear;
798     gint div_number;
799     gint account_nb;
800     gint currency_number;
801     gint nbre_sub_div = 0;
802     gboolean sub_div_visible = FALSE;
803     gboolean edited = TRUE;
804     GsbReal period = { 12, 0 };
805     GsbReal average;
806     GsbReal retained;
807     GsbReal amount;
808     KindAccount kind;
809 	GrisbiWinEtat *w_etat;
810 
811 	w_etat = (GrisbiWinEtat *) grisbi_win_get_w_etat ();
812 
813     div_number = sh -> div;
814     div_name = bet_data_get_div_name ( div_number, 0, NULL );
815     account_nb = sh -> account_nb;
816     kind = gsb_data_account_get_kind ( account_nb );
817     if ( kind == GSB_TYPE_CASH && w_etat->bet_cash_account_option == 0 )
818         edited = FALSE;
819 
820     currency_number = gsb_data_account_get_currency ( account_nb );
821 
822     model = gtk_tree_view_get_model ( tree_view );
823 
824     str_balance_amount = utils_real_get_string ( sbr->current_balance );
825     str_balance = utils_real_get_string_with_currency ( sbr -> current_balance, currency_number, TRUE );
826     average = gsb_real_div ( sbr -> current_balance, period );
827     str_amount = utils_real_get_string ( average );
828     str_average = utils_real_get_string_with_currency ( average, currency_number, TRUE );
829 
830     str_current_fyear = utils_real_get_string_with_currency ( sbr -> current_fyear, currency_number, TRUE );
831 
832     gtk_tree_store_append ( GTK_TREE_STORE ( model ), &parent, NULL);
833     gtk_tree_store_set ( GTK_TREE_STORE ( model ),
834                         &parent,
835                         SPP_HISTORICAL_DESC_COLUMN, div_name,
836                         SPP_HISTORICAL_CURRENT_COLUMN, str_current_fyear,
837                         SPP_HISTORICAL_BALANCE_COLUMN, str_balance,
838                         SPP_HISTORICAL_BALANCE_AMOUNT, str_balance_amount,
839                         SPP_HISTORICAL_AVERAGE_COLUMN, str_average,
840                         SPP_HISTORICAL_AVERAGE_AMOUNT, str_amount,
841                         SPP_HISTORICAL_RETAINED_AMOUNT, str_amount,
842                         SPP_HISTORICAL_ACCOUNT_NUMBER, account_nb,
843                         SPP_HISTORICAL_DIV_NUMBER, div_number,
844                         SPP_HISTORICAL_SUB_DIV_NUMBER, 0,
845                         SPP_HISTORICAL_EDITED_COLUMN, edited,
846                         -1);
847 
848     if ( bet_data_search_div_hist ( account_nb, div_number, 0 )
849      &&
850      ( bet_data_get_div_edited ( account_nb, div_number, 0 )
851       ||
852       g_hash_table_size ( sh -> list_sub_div ) < 1 ) )
853     {
854         retained = bet_data_hist_get_div_amount ( account_nb, div_number, 0 );
855         g_free ( str_amount );
856         str_amount = utils_real_get_string ( retained );
857         str_retained = utils_real_get_string_with_currency ( retained, currency_number, TRUE );
858         gtk_tree_store_set ( GTK_TREE_STORE ( model ),
859                         &parent,
860                         SPP_HISTORICAL_SELECT_COLUMN, TRUE,
861                         SPP_HISTORICAL_RETAINED_COLUMN, str_retained,
862                         SPP_HISTORICAL_RETAINED_AMOUNT, str_amount,
863                         -1);
864         g_free ( str_retained );
865     }
866 /* printf ("division = %d div_name = %s\n", div_number, div_name);  */
867     g_free ( div_name );
868         g_free ( str_balance );
869         g_free ( str_balance_amount );
870     g_free ( str_average );
871     g_free ( str_amount );
872     g_free ( str_current_fyear );
873 
874     if ( ( nbre_sub_div = g_hash_table_size ( sh -> list_sub_div ) ) < 1 )
875         return;
876 
877     g_hash_table_iter_init ( &iter, sh -> list_sub_div );
878     while ( g_hash_table_iter_next ( &iter, &sub_key, &sub_value ) )
879     {
880         BetHist *sub_sh = (BetHist* ) sub_value;
881         BetRange *sub_sbr = sub_sh -> sbr;
882         GtkTreeIter fils;
883         gchar **tab_str = NULL;
884 
885         if ( nbre_sub_div == 1 && sub_sh -> div == 0 )
886             return;
887 
888         div_name = bet_data_get_div_name ( div_number, sub_sh -> div, NULL );
889 /*         printf ("division = %d sub_div = %d div_name = %s\n", div_number, sub_sh -> div, div_name);  */
890         if ( div_name && g_utf8_strrchr ( div_name, -1, ':' ) )
891         {
892             tab_str = g_strsplit ( div_name, ":", 2 );
893             if ( g_strv_length ( tab_str ) > 1 )
894             {
895                 g_free ( div_name );
896                 div_name = g_strdup ( g_strstrip ( tab_str[1] ) );
897             }
898             g_strfreev ( tab_str );
899         }
900 
901         str_balance_amount = utils_real_get_string ( sub_sbr->current_balance );
902         str_balance = utils_real_get_string_with_currency ( sub_sbr -> current_balance,
903                         currency_number, TRUE );
904         average = gsb_real_div ( sub_sbr -> current_balance, period );
905         str_amount = utils_real_get_string ( average );
906         str_average = utils_real_get_string_with_currency ( average,
907                         currency_number, TRUE );
908         str_current_fyear = utils_real_get_string_with_currency ( sub_sbr -> current_fyear,
909                         currency_number, TRUE );
910 
911         gtk_tree_store_append ( GTK_TREE_STORE ( model ), &fils, &parent );
912         gtk_tree_store_set ( GTK_TREE_STORE ( model ),
913                         &fils,
914                         SPP_HISTORICAL_DESC_COLUMN, div_name,
915                         SPP_HISTORICAL_CURRENT_COLUMN, str_current_fyear,
916                         SPP_HISTORICAL_BALANCE_COLUMN, str_balance,
917                         SPP_HISTORICAL_BALANCE_AMOUNT, str_balance_amount,
918                         SPP_HISTORICAL_AVERAGE_COLUMN, str_average,
919                         SPP_HISTORICAL_AVERAGE_AMOUNT, str_amount,
920                         SPP_HISTORICAL_RETAINED_AMOUNT, str_amount,
921                         SPP_HISTORICAL_ACCOUNT_NUMBER, account_nb,
922                         SPP_HISTORICAL_DIV_NUMBER, div_number,
923                         SPP_HISTORICAL_SUB_DIV_NUMBER, sub_sh -> div,
924                         SPP_HISTORICAL_EDITED_COLUMN, edited,
925                         -1);
926 
927         if ( bet_data_search_div_hist ( account_nb, div_number, sub_sh -> div ) )
928         {
929             GtkTreePath *path;
930 
931             if ( bet_data_get_div_edited ( account_nb, div_number, sub_sh -> div ) )
932             {
933                 /* printf ("account_nb = %d div_number = %d sub_sh -> div = %d\n", account_nb, div_number, sub_sh -> div ); */
934                 retained = bet_data_hist_get_div_amount ( account_nb, div_number, sub_sh -> div );
935                 g_free ( str_amount );
936                 str_amount = utils_real_get_string ( retained );
937                 str_retained = utils_real_get_string_with_currency ( retained, currency_number, TRUE );
938 
939                 edited = FALSE;
940                 gtk_tree_store_set ( GTK_TREE_STORE ( model ),
941                         &parent,
942                         SPP_HISTORICAL_EDITED_COLUMN, edited,
943                         -1);
944             }
945             else
946             {
947                 bet_data_set_div_amount ( account_nb, div_number, sub_sh -> div, average );
948                 str_retained = g_strdup ( str_average );
949                 edited = TRUE;
950             }
951             gtk_tree_store_set ( GTK_TREE_STORE ( model ),
952                         &fils,
953                         SPP_HISTORICAL_SELECT_COLUMN, TRUE,
954                         SPP_HISTORICAL_RETAINED_COLUMN, str_retained,
955                         SPP_HISTORICAL_RETAINED_AMOUNT, str_amount,
956                         -1);
957             sub_div_visible = TRUE;
958             path = gtk_tree_model_get_path ( model, &fils );
959             gtk_tree_view_expand_to_path ( tree_view, path );
960 
961             g_free ( str_retained );
962             gtk_tree_path_free ( path );
963         }
964         g_free ( div_name );
965         g_free ( str_balance );
966         g_free ( str_balance_amount );
967         g_free ( str_average );
968         g_free ( str_amount );
969         g_free ( str_current_fyear );
970     }
971 
972     if ( sub_div_visible && bet_historical_get_full_div ( model, &parent ) )
973     {
974         amount = bet_historical_get_children_amount ( model, &parent );
975         str_amount = utils_real_get_string ( amount );
976         str_retained = utils_real_get_string_with_currency ( amount, currency_number, TRUE );
977 
978         gtk_tree_store_set ( GTK_TREE_STORE ( model ),
979                     &parent,
980                     SPP_HISTORICAL_SELECT_COLUMN, TRUE,
981                     SPP_HISTORICAL_RETAINED_COLUMN, str_retained,
982                     SPP_HISTORICAL_RETAINED_AMOUNT, str_amount,
983                     SPP_HISTORICAL_EDITED_COLUMN, edited,
984                     -1);
985         g_free ( str_amount );
986         g_free ( str_retained );
987 
988         if ( edited )
989         {
990             GtkTreePath *path;
991 
992             path = gtk_tree_model_get_path ( model, &parent );
993             gtk_tree_view_collapse_row ( tree_view, path );
994             gtk_tree_selection_select_iter ( gtk_tree_view_get_selection ( tree_view ), &parent );
995 
996             gtk_tree_path_free ( path );
997         }
998     }
999 }
1000 
1001 
1002 /**
1003  * create and fill the list store of the fyear
1004  * come here mean that fyear_model_filter is NULL
1005  *
1006  * \param
1007  *
1008  * \return TRUE ok, FALSE problem
1009  * */
bet_historical_fyear_create_combobox_store(void)1010 gboolean bet_historical_fyear_create_combobox_store ( void )
1011 {
1012     gchar *titre;
1013 
1014     /* devel_debug (NULL); */
1015     /* the fyear list store, contains 3 columns :
1016      * FYEAR_COL_NAME : the name of the fyear
1017      * FYEAR_COL_NUMBER : the number of the fyear
1018      * FYEAR_COL_VIEW : it the fyear should be showed */
1019 
1020     titre = g_strdup ( _("12 months rolling") );
1021     bet_fyear_model = GTK_TREE_MODEL ( gtk_list_store_new ( 3,
1022                         G_TYPE_STRING,
1023                         G_TYPE_INT,
1024                         G_TYPE_BOOLEAN ));
1025     bet_fyear_model_filter = gtk_tree_model_filter_new ( bet_fyear_model, NULL );
1026     gtk_tree_model_filter_set_visible_column ( GTK_TREE_MODEL_FILTER (
1027                         bet_fyear_model_filter ),
1028                         FYEAR_COL_VIEW );
1029     gsb_fyear_update_fyear_list_new ( bet_fyear_model,
1030                         bet_fyear_model_filter,
1031                         titre );
1032     g_free ( titre );
1033 
1034     return TRUE;
1035 }
1036 
1037 
1038 /**
1039  *
1040  *
1041  *
1042  *
1043  * */
bet_historical_get_fyear_from_combobox(GtkWidget * combo_box)1044 gint bet_historical_get_fyear_from_combobox ( GtkWidget *combo_box )
1045 {
1046     gint fyear_number = 0;
1047     GtkTreeIter iter;
1048 
1049     /* devel_debug (NULL); */
1050     if ( !gtk_combo_box_get_active_iter ( GTK_COMBO_BOX ( combo_box ), &iter ) )
1051         return 0;
1052 
1053     if ( bet_fyear_model_filter )
1054     {
1055         gtk_tree_model_get ( GTK_TREE_MODEL ( bet_fyear_model_filter ),
1056                         &iter,
1057                         FYEAR_COL_NUMBER, &fyear_number,
1058                         -1 );
1059     }
1060 
1061     return fyear_number;
1062 }
1063 
1064 /**
1065  *
1066  *
1067  *
1068  *
1069  * */
bet_historical_set_fyear_from_combobox(GtkWidget * combo_box,gint fyear)1070 void bet_historical_set_fyear_from_combobox ( GtkWidget *combo_box, gint fyear )
1071 {
1072     gsb_fyear_select_iter_by_number ( combo_box,
1073                     bet_fyear_model,
1074                     bet_fyear_model_filter,
1075                     fyear );
1076 }
1077 
1078 
1079 /**
1080  *
1081  *
1082  *
1083  *
1084  * */
bet_historical_refresh_data(GtkTreeModel * tab_model,GDate * date_min,GDate * date_max)1085 void bet_historical_refresh_data ( GtkTreeModel *tab_model,
1086                         GDate *date_min,
1087                         GDate *date_max )
1088 {
1089     GtkWidget *tree_view;
1090     GtkTreeModel *model;
1091     GtkTreeIter iter;
1092     GtkTreeIter fils_iter;
1093 
1094     devel_debug (NULL);
1095     tree_view = g_object_get_data ( G_OBJECT (grisbi_win_get_account_page () ), "bet_historical_treeview" );
1096     model = gtk_tree_view_get_model ( GTK_TREE_VIEW ( tree_view ) );
1097 
1098     if ( gtk_tree_model_get_iter_first ( GTK_TREE_MODEL ( model ), &iter ) )
1099     {
1100         gboolean valeur;
1101         gint account_number;
1102 
1103         /* test du numero de compte */
1104         gtk_tree_model_get ( GTK_TREE_MODEL ( model ), &iter,
1105                         SPP_HISTORICAL_ACCOUNT_NUMBER, &account_number,
1106                         -1 );
1107         if ( account_number != gsb_gui_navigation_get_current_account ( ) )
1108             return;
1109 
1110         do
1111         {
1112             gtk_tree_model_get ( GTK_TREE_MODEL ( model ), &iter,
1113                         SPP_HISTORICAL_SELECT_COLUMN, &valeur,
1114                         -1 );
1115             if ( valeur == 1 )
1116             {
1117                 bet_array_list_add_new_hist_line ( tab_model,
1118                         GTK_TREE_MODEL ( model ), &iter,
1119                         date_min, date_max );
1120             }
1121             else if ( gtk_tree_model_iter_children (
1122                         GTK_TREE_MODEL ( model ),
1123                         &fils_iter, &iter ) )
1124             {
1125                 do
1126                 {
1127                     gtk_tree_model_get ( GTK_TREE_MODEL ( model ),
1128                                 &fils_iter,
1129                                 SPP_HISTORICAL_SELECT_COLUMN, &valeur,
1130                                 -1 );
1131 
1132                     if ( valeur == 1 )
1133                     {
1134                         bet_array_list_add_new_hist_line ( tab_model,
1135                                 GTK_TREE_MODEL ( model ), &fils_iter,
1136                                 date_min, date_max );
1137                     }
1138                 }
1139 	            while ( gtk_tree_model_iter_next (
1140                         GTK_TREE_MODEL ( model ), &fils_iter ) );
1141             }
1142 
1143         } while ( gtk_tree_model_iter_next ( GTK_TREE_MODEL ( model ), &iter ) );
1144     }
1145 }
1146 
1147 
1148 /**
1149  *
1150  *
1151  *
1152  *
1153  * */
bet_historical_get_full_div(GtkTreeModel * model,GtkTreeIter * parent)1154 gboolean bet_historical_get_full_div ( GtkTreeModel *model, GtkTreeIter *parent )
1155 {
1156     GtkTreeIter fils_iter;
1157     gint valeur;
1158 
1159     if ( gtk_tree_model_iter_children ( GTK_TREE_MODEL ( model ), &fils_iter, parent ) )
1160     {
1161         do
1162         {
1163             gtk_tree_model_get ( GTK_TREE_MODEL ( model ), &fils_iter,
1164                         SPP_HISTORICAL_SELECT_COLUMN, &valeur,
1165                         -1 );
1166 
1167             if ( valeur == FALSE )
1168             {
1169                 return FALSE;
1170             }
1171         }
1172         while ( gtk_tree_model_iter_next ( GTK_TREE_MODEL ( model ), &fils_iter ) );
1173     }
1174     return TRUE;
1175 }
1176 
1177 
1178 /**
1179  *
1180  *
1181  *
1182  *
1183  * */
bet_historical_set_full_sub_div(GtkTreeModel * model,GtkTreeIter * parent)1184 gboolean bet_historical_set_full_sub_div ( GtkTreeModel *model, GtkTreeIter *parent )
1185 {
1186     GtkTreeView *tree_view;
1187     GtkTreeIter fils_iter;
1188     gint edited = 0;
1189 
1190     if ( gtk_tree_model_iter_children ( GTK_TREE_MODEL ( model ), &fils_iter, parent ) )
1191     {
1192         gchar *str_amount;
1193         gchar *str_retained;
1194         gint account_nb;
1195         gint div_number;
1196         gint sub_div_nb;
1197         GsbReal retained;
1198 
1199         do
1200         {
1201             gtk_tree_model_get ( GTK_TREE_MODEL ( model ), &fils_iter,
1202                         SPP_HISTORICAL_AVERAGE_AMOUNT, &str_amount,
1203                         SPP_HISTORICAL_ACCOUNT_NUMBER, &account_nb,
1204                         SPP_HISTORICAL_DIV_NUMBER, &div_number,
1205                         SPP_HISTORICAL_SUB_DIV_NUMBER, &sub_div_nb,
1206                         SPP_HISTORICAL_EDITED_COLUMN, &edited,
1207                         -1 );
1208 
1209             retained = utils_real_get_from_string ( str_amount );
1210             bet_data_hist_add_div ( account_nb, div_number, sub_div_nb );
1211             bet_data_set_div_amount ( account_nb, div_number, sub_div_nb,
1212                         utils_real_get_from_string ( str_amount ) );
1213             str_retained = utils_real_get_string_with_currency ( retained,
1214                         gsb_data_account_get_currency ( account_nb ), TRUE );
1215             gtk_tree_store_set ( GTK_TREE_STORE ( model ), &fils_iter,
1216                         SPP_HISTORICAL_SELECT_COLUMN, TRUE,
1217                         SPP_HISTORICAL_RETAINED_COLUMN, str_retained,
1218                         SPP_HISTORICAL_RETAINED_AMOUNT, str_amount,
1219                         -1 );
1220             g_free ( str_amount );
1221             g_free ( str_retained );
1222         }
1223         while ( gtk_tree_model_iter_next ( GTK_TREE_MODEL ( model ), &fils_iter ) );
1224     }
1225 
1226     if ( edited )
1227     {
1228         tree_view = g_object_get_data ( G_OBJECT ( grisbi_win_get_account_page () ),
1229                         "bet_historical_treeview" );
1230         gtk_tree_view_collapse_row ( tree_view,
1231                         gtk_tree_model_get_path ( model, parent ) );
1232         gtk_tree_selection_select_iter ( gtk_tree_view_get_selection (
1233                         tree_view ), parent );
1234     }
1235 
1236     return FALSE;
1237 }
1238 
1239 
1240 /**
1241  *
1242  *
1243  *
1244  *
1245  * */
bet_historical_set_empty_sub_div(GtkTreeModel * model,GtkTreeIter * parent)1246 gboolean bet_historical_set_empty_sub_div ( GtkTreeModel *model, GtkTreeIter *parent )
1247 {
1248     GtkTreeIter fils_iter;
1249 
1250     if ( gtk_tree_model_iter_children ( GTK_TREE_MODEL ( model ), &fils_iter, parent ) )
1251     {
1252         gchar *str_amount;
1253         gint account_nb;
1254         gint div_number;
1255         gint sub_div_nb;
1256 
1257         do
1258         {
1259             gtk_tree_model_get ( GTK_TREE_MODEL ( model ), &fils_iter,
1260                         SPP_HISTORICAL_AVERAGE_AMOUNT, &str_amount,
1261                         SPP_HISTORICAL_ACCOUNT_NUMBER, &account_nb,
1262                         SPP_HISTORICAL_DIV_NUMBER, &div_number,
1263                         SPP_HISTORICAL_SUB_DIV_NUMBER, &sub_div_nb,
1264                         -1 );
1265             bet_data_remove_div_hist ( account_nb, div_number, sub_div_nb );
1266             gtk_tree_store_set ( GTK_TREE_STORE ( model ), &fils_iter,
1267                         SPP_HISTORICAL_SELECT_COLUMN, FALSE,
1268                         SPP_HISTORICAL_RETAINED_COLUMN, "",
1269                         SPP_HISTORICAL_RETAINED_AMOUNT, str_amount,
1270                         SPP_HISTORICAL_EDITED_COLUMN, TRUE,
1271                         -1 );
1272             g_free ( str_amount );
1273         }
1274         while ( gtk_tree_model_iter_next ( GTK_TREE_MODEL ( model ), &fils_iter ) );
1275     }
1276 
1277     return FALSE;
1278 }
1279 
1280 
1281 /**
1282  *
1283  *
1284  *
1285  *
1286  * */
bet_historical_get_children_amount(GtkTreeModel * model,GtkTreeIter * parent)1287 GsbReal bet_historical_get_children_amount ( GtkTreeModel *model, GtkTreeIter *parent )
1288 {
1289     GtkTreeIter fils_iter;
1290     gchar *str_amount;
1291     GsbReal amount = null_real;
1292 
1293     if ( gtk_tree_model_iter_children ( GTK_TREE_MODEL ( model ), &fils_iter, parent ) )
1294     {
1295         do
1296         {
1297             gtk_tree_model_get ( GTK_TREE_MODEL ( model ), &fils_iter,
1298                         SPP_HISTORICAL_RETAINED_AMOUNT, &str_amount,
1299                         -1 );
1300             amount = gsb_real_add ( amount,
1301                                 utils_real_get_from_string ( str_amount ) );
1302         }
1303         while ( gtk_tree_model_iter_next ( GTK_TREE_MODEL ( model ), &fils_iter ) );
1304     }
1305 
1306     return amount;
1307 }
1308 
1309 
1310 /**
1311  *
1312  *
1313  *
1314  *
1315  * */
bet_historical_row_collapsed_event(GtkTreeView * tree_view,GtkTreeIter * iter,GtkTreePath * path,GtkTreeModel * model)1316 void bet_historical_row_collapsed_event ( GtkTreeView *tree_view,
1317                         GtkTreeIter *iter,
1318                         GtkTreePath *path,
1319                         GtkTreeModel *model )
1320 {
1321     bet_historical_set_background_color ( GTK_WIDGET ( tree_view ) );
1322 }
1323 
1324 
1325 /**
1326  *
1327  *
1328  *
1329  *
1330  * */
bet_historical_row_expanded_event(GtkTreeView * tree_view,GtkTreeIter * iter,GtkTreePath * path,GtkTreeModel * model)1331 void bet_historical_row_expanded_event ( GtkTreeView *tree_view,
1332                         GtkTreeIter *iter,
1333                         GtkTreePath *path,
1334                         GtkTreeModel *model )
1335 {
1336     gint account_nb;
1337     gint div_number;
1338 
1339     gtk_tree_model_get ( GTK_TREE_MODEL ( model ), iter,
1340                         SPP_HISTORICAL_ACCOUNT_NUMBER, &account_nb,
1341                         SPP_HISTORICAL_DIV_NUMBER, &div_number,
1342                         -1 );
1343 
1344     if ( bet_data_get_div_edited ( account_nb, div_number, 0 ) == TRUE )
1345     {
1346         gtk_tree_view_collapse_row ( tree_view, path );
1347         gtk_tree_selection_select_iter ( gtk_tree_view_get_selection ( tree_view ), iter );
1348     }
1349     bet_historical_set_background_color ( GTK_WIDGET ( tree_view ) );
1350 }
1351 
1352 
1353 /**
1354  * Cette fonction compare le montant de la colonne montant retenu avec le montant
1355  * de la colonne moyenne
1356  *
1357  * \ return O si egal -1 ou 1 si différent
1358  * */
bet_historical_amount_differ_average(GtkTreeModel * model,GtkTreeIter * iter)1359 gboolean bet_historical_amount_differ_average ( GtkTreeModel *model,
1360                         GtkTreeIter *iter )
1361 {
1362     gchar *str_average;
1363     gchar *str_amount;
1364 
1365     gtk_tree_model_get ( GTK_TREE_MODEL ( model ), iter,
1366                         SPP_HISTORICAL_AVERAGE_AMOUNT, &str_average,
1367                         SPP_HISTORICAL_RETAINED_AMOUNT, &str_amount,
1368                         -1 );
1369 
1370     return gsb_real_cmp ( utils_real_get_from_string ( str_average ),
1371                         utils_real_get_from_string ( str_amount ) );
1372 }
1373 
1374 
1375 /**
1376  *
1377  *
1378  *
1379  *
1380  * */
bet_historical_row_collapse_all(GtkTreeView * tree_view,GtkTreeIter * iter,GtkTreeModel * model)1381 void bet_historical_row_collapse_all ( GtkTreeView *tree_view,
1382                         GtkTreeIter *iter,
1383                         GtkTreeModel *model )
1384 {
1385     if ( tree_view == NULL )
1386         tree_view = g_object_get_data ( G_OBJECT ( grisbi_win_get_account_page () ), "bet_historical_treeview" );
1387     gtk_tree_view_collapse_row ( tree_view,
1388                 gtk_tree_model_get_path ( model, iter ) );
1389     gtk_tree_selection_select_iter ( gtk_tree_view_get_selection (
1390                 tree_view ), iter );
1391 }
1392 
1393 
1394 /**
1395  * called when we press a button on the list
1396  *
1397  * \param tree_view
1398  * \param ev
1399  *
1400  * \return FALSE
1401  * */
bet_historical_button_press(GtkWidget * tree_view,GdkEventButton * ev)1402 gboolean bet_historical_button_press ( GtkWidget *tree_view,
1403                         GdkEventButton *ev )
1404 {
1405 	/* show the popup */
1406 	if ( ev -> button == RIGHT_BUTTON )
1407         bet_historical_context_menu ( tree_view );
1408 
1409     return FALSE;
1410 }
1411 
1412 
1413 /**
1414  * Pop up a menu with several actions to apply to historical list.
1415  *
1416  * \param
1417  *
1418  */
bet_historical_context_menu(GtkWidget * tree_view)1419 void bet_historical_context_menu ( GtkWidget *tree_view )
1420 {
1421     GtkWidget *menu, *menu_item;
1422     GtkTreeModel *model;
1423     GtkTreeSelection *tree_selection;
1424     GtkTreeIter iter;
1425 
1426     tree_selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW ( tree_view ) );
1427 
1428     if ( !gtk_tree_selection_get_selected ( GTK_TREE_SELECTION ( tree_selection ),
1429      &model, &iter ) )
1430         return;
1431 
1432     menu = gtk_menu_new ();
1433 
1434     /* Add last amount menu */
1435     menu_item = utils_menu_item_new_from_image_label ("gtk-add-16.png",
1436 													  _("Assign the amount of the last operation"));
1437     g_signal_connect ( G_OBJECT ( menu_item ),
1438                         "activate",
1439                         G_CALLBACK ( bet_historical_add_last_amount ),
1440                         tree_selection );
1441 
1442     if ( gtk_tree_model_iter_n_children ( model, &iter ) > 0 )
1443         gtk_widget_set_sensitive ( menu_item, FALSE );
1444     else
1445         gtk_widget_set_sensitive ( menu_item, TRUE );
1446 
1447     gtk_menu_shell_append ( GTK_MENU_SHELL ( menu ), menu_item );
1448 
1449     /* Separator */
1450     gtk_menu_shell_append ( GTK_MENU_SHELL ( menu ), gtk_separator_menu_item_new ( ) );
1451     gtk_widget_show ( menu_item );
1452 
1453 
1454     /* Add average amount menu */
1455     menu_item = utils_menu_item_new_from_image_label ("gtk-copy-16.png", _("Copy the average amount"));
1456     g_signal_connect ( G_OBJECT ( menu_item ),
1457                         "activate",
1458                         G_CALLBACK ( bet_historical_add_average_amount ),
1459                         tree_selection );
1460 
1461     gtk_menu_shell_append ( GTK_MENU_SHELL ( menu ), menu_item );
1462 
1463     /* Finish all. */
1464     gtk_widget_show_all ( menu );
1465 
1466 #if GTK_CHECK_VERSION (3,22,0)
1467 	gtk_menu_popup_at_pointer (GTK_MENU (menu), NULL);
1468 #else
1469 
1470     gtk_menu_popup ( GTK_MENU( menu ), NULL, NULL, NULL, NULL,
1471                         3, gtk_get_current_event_time ( ) );
1472 #endif
1473 }
1474 
1475 
1476 /**
1477  * add the amount of the last transaction with the same division and sub-division
1478  *
1479  * /param menu item
1480  * /param row selected
1481  *
1482  * */
bet_historical_add_last_amount(GtkWidget * menu_item,GtkTreeSelection * tree_selection)1483 void bet_historical_add_last_amount ( GtkWidget *menu_item,
1484                         GtkTreeSelection *tree_selection )
1485 {
1486     GtkTreeModel *model;
1487     GtkTreeIter parent;
1488     GtkTreeIter iter;
1489     gint account_number;
1490     gint div_number;
1491     gint sub_div_nb;
1492     gint currency_number;
1493     gchar *tmp_str;
1494     gchar *str_amount;
1495     GsbReal amount;
1496 
1497     if ( !gtk_tree_selection_get_selected ( GTK_TREE_SELECTION ( tree_selection ),
1498      &model, &iter ) )
1499         return;
1500 
1501     gtk_tree_model_get ( GTK_TREE_MODEL ( model ), &iter,
1502                         SPP_HISTORICAL_ACCOUNT_NUMBER, &account_number,
1503                         SPP_HISTORICAL_DIV_NUMBER, &div_number,
1504                         SPP_HISTORICAL_SUB_DIV_NUMBER, &sub_div_nb,
1505                         -1 );
1506 
1507     amount = gsb_data_transaction_get_last_transaction_with_div_sub_div (
1508                         account_number,
1509                         div_number,
1510                         sub_div_nb,
1511                         gsb_data_account_get_bet_hist_data ( account_number ) );
1512 
1513     currency_number = gsb_data_account_get_currency ( account_number );
1514     str_amount = utils_real_get_string ( amount );
1515 
1516     tmp_str = utils_real_get_string_with_currency ( amount, currency_number, TRUE );
1517     /* printf ("div = %d sub_div_nb = %d tmp_str = %s\n", div_number, sub_div_nb, tmp_str); */
1518     if ( bet_data_search_div_hist ( account_number, div_number, sub_div_nb ) == FALSE )
1519         bet_data_hist_add_div ( account_number, div_number, sub_div_nb );
1520 
1521     bet_data_set_div_edited  ( account_number, div_number, sub_div_nb, TRUE );
1522     bet_data_set_div_amount ( account_number, div_number, sub_div_nb, amount );
1523     gtk_tree_store_set ( GTK_TREE_STORE ( model ), &iter,
1524                         SPP_HISTORICAL_SELECT_COLUMN, TRUE,
1525                         SPP_HISTORICAL_RETAINED_COLUMN, tmp_str,
1526                         SPP_HISTORICAL_RETAINED_AMOUNT, str_amount,
1527                         SPP_HISTORICAL_ACCOUNT_NUMBER, account_number,
1528                         SPP_HISTORICAL_DIV_NUMBER, div_number,
1529                         SPP_HISTORICAL_SUB_DIV_NUMBER, sub_div_nb,
1530                         -1 );
1531 
1532     if ( gtk_tree_model_iter_parent ( GTK_TREE_MODEL ( model ), &parent, &iter ) )
1533         gtk_tree_store_set ( GTK_TREE_STORE ( model ),
1534                         &parent,
1535                         SPP_HISTORICAL_EDITED_COLUMN, FALSE,
1536                         -1);
1537 
1538     gsb_data_account_set_bet_maj ( account_number, BET_MAJ_ESTIMATE );
1539 
1540     gsb_file_set_modified ( TRUE );
1541 }
1542 
1543 
1544 /**
1545  * add the average amount of the item
1546  *
1547  * /param menu item
1548  * /param row selected
1549  *
1550  * */
bet_historical_add_average_amount(GtkWidget * menu_item,GtkTreeSelection * tree_selection)1551 void bet_historical_add_average_amount ( GtkWidget *menu_item,
1552                         GtkTreeSelection *tree_selection )
1553 {
1554     GtkTreeModel *model;
1555     GtkTreeIter iter;
1556     gchar *path_string;
1557 
1558     if ( !gtk_tree_selection_get_selected ( GTK_TREE_SELECTION ( tree_selection ),
1559      &model, &iter ) )
1560         return;
1561 
1562     path_string = gtk_tree_path_to_string ( gtk_tree_model_get_path ( model, &iter ) );
1563     if ( path_string )
1564         bet_historical_div_toggle_clicked ( NULL, path_string, model );
1565 }
1566 
1567 
1568 /**
1569  *
1570  *
1571  *
1572  *
1573  * */
bet_historical_initializes_account_settings(gint account_number)1574 gboolean bet_historical_initializes_account_settings ( gint account_number )
1575 {
1576     GtkWidget *button = NULL;
1577     GtkWidget *combo = NULL;
1578     GtkWidget *account_page;
1579     GtkTreeViewColumn *column;
1580     gchar *title;
1581     gint fyear_number;
1582     gint origin;
1583     gpointer pointeur;
1584 
1585     account_page = grisbi_win_get_account_page ();
1586     /* set data origin */
1587     origin = gsb_data_account_get_bet_hist_data ( account_number );
1588     if ( origin )
1589     {
1590         button = g_object_get_data ( G_OBJECT ( account_page ), "bet_hist_button_2" );
1591         gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( button ), TRUE );
1592         bet_data_set_div_ptr ( 1 );
1593         title = g_strdup ( _("Budgetary line") );
1594     }
1595     else
1596     {
1597         button = g_object_get_data ( G_OBJECT ( account_page ), "bet_hist_button_1" );
1598         gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( button ), TRUE );
1599         bet_data_set_div_ptr ( 0 );
1600         title = g_strdup ( _("Category") );
1601     }
1602 
1603     column = g_object_get_data ( G_OBJECT ( account_page ),
1604                         "historical_column_source" );
1605     gtk_tree_view_column_set_title ( GTK_TREE_VIEW_COLUMN ( column ), title );
1606     g_free ( title );
1607 
1608     /* set fyear */
1609     combo = g_object_get_data ( G_OBJECT ( account_page ), "bet_hist_fyear_combo" );
1610     fyear_number = gsb_data_account_get_bet_hist_fyear ( account_number );
1611 
1612     pointeur = g_object_get_data ( G_OBJECT ( combo ), "pointer" );
1613     g_signal_handlers_block_by_func ( G_OBJECT ( combo ),
1614                         G_CALLBACK (utils_widget_origin_fyear_clicked),
1615                         pointeur );
1616 
1617     gsb_fyear_select_iter_by_number ( combo,
1618                         bet_fyear_model,
1619                         bet_fyear_model_filter,
1620                         fyear_number );
1621 
1622     g_signal_handlers_unblock_by_func ( G_OBJECT ( combo ),
1623                         G_CALLBACK (utils_widget_origin_fyear_clicked),
1624                         pointeur );
1625 
1626     return FALSE;
1627 }
1628 
1629 
1630 /**
1631  * set the background colors of the list
1632  *
1633  * \param tree_view
1634  *
1635  * \return FALSE
1636  * */
bet_historical_set_background_color(GtkWidget * tree_view)1637 gboolean bet_historical_set_background_color ( GtkWidget *tree_view )
1638 {
1639     GtkTreeModel *model;
1640     GtkTreeIter iter;
1641     GtkTreeIter fils_iter;
1642 
1643     if ( !tree_view )
1644 	    return FALSE;
1645 
1646     model = gtk_tree_view_get_model ( GTK_TREE_VIEW ( tree_view ) );
1647 
1648     if ( gtk_tree_model_get_iter_first ( GTK_TREE_MODEL ( model ), &iter ) )
1649     {
1650 		GtkTreePath *path;
1651         gint current_color = 0;
1652 
1653         do
1654         {
1655             gtk_tree_store_set ( GTK_TREE_STORE ( model ),
1656                         &iter,
1657                         SPP_HISTORICAL_BACKGROUND_COLOR,
1658                         gsb_rgba_get_couleur_with_indice ( "couleur_fond", current_color ),
1659                         -1 );
1660             current_color = !current_color;
1661 
1662 			path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
1663             if ( gtk_tree_model_iter_children ( GTK_TREE_MODEL ( model ), &fils_iter, &iter )
1664              &&
1665               gtk_tree_view_row_expanded ( GTK_TREE_VIEW ( tree_view ), path))
1666             {
1667                 do
1668                 {
1669                     gtk_tree_store_set ( GTK_TREE_STORE ( model ),
1670                         &fils_iter,
1671                         SPP_HISTORICAL_BACKGROUND_COLOR,
1672                         gsb_rgba_get_couleur_with_indice ( "couleur_fond", current_color ),
1673                         -1 );
1674                     current_color = !current_color;
1675                 }
1676                 while ( gtk_tree_model_iter_next ( GTK_TREE_MODEL ( model ), &fils_iter ) );
1677             }
1678 			gtk_tree_path_free (path);
1679         }
1680         while ( gtk_tree_model_iter_next ( GTK_TREE_MODEL ( model ), &iter ) );
1681     }
1682 
1683     return FALSE;
1684 }
1685 
1686 
1687 /**
1688  *
1689  *
1690  *
1691  *
1692  * */
bet_historical_g_signal_block_tree_view(void)1693 void bet_historical_g_signal_block_tree_view ( void )
1694 {
1695     GtkWidget *account_page;
1696     GtkTreeView *tree_view;
1697     gpointer cell;
1698     GtkTreeModel *tree_model;
1699 
1700     account_page = grisbi_win_get_account_page ();
1701     hist_block_signal = TRUE;
1702     tree_view = g_object_get_data ( G_OBJECT ( account_page ), "hist_tree_view" );
1703     tree_model = gtk_tree_view_get_model ( GTK_TREE_VIEW ( tree_view ) );
1704 
1705     cell = g_object_get_data ( G_OBJECT ( account_page ), "toggle_cell" );
1706     g_signal_handlers_block_by_func ( cell, bet_historical_div_toggle_clicked, tree_model );
1707     g_signal_handlers_block_by_func ( tree_view, bet_historical_button_press, NULL );
1708 }
1709 
1710 
1711 /**
1712  *
1713  *
1714  *
1715  *
1716  * */
bet_historical_g_signal_unblock_tree_view(void)1717 void bet_historical_g_signal_unblock_tree_view ( void )
1718 {
1719     GtkWidget *account_page;
1720     GtkTreeView *tree_view;
1721     gpointer cell;
1722     GtkTreeModel *tree_model;
1723 
1724     if ( hist_block_signal == FALSE )
1725         return;
1726     account_page = grisbi_win_get_account_page ();
1727 
1728     hist_block_signal = FALSE;
1729     tree_view = g_object_get_data ( G_OBJECT ( account_page ), "hist_tree_view" );
1730     tree_model = gtk_tree_view_get_model ( GTK_TREE_VIEW ( tree_view ) );
1731     cell = g_object_get_data ( G_OBJECT ( account_page ), "toggle_cell" );
1732 
1733     g_signal_handlers_unblock_by_func ( cell, bet_historical_div_toggle_clicked, tree_model );
1734     g_signal_handlers_unblock_by_func ( tree_view, bet_historical_button_press, NULL );
1735 }
1736 
1737 
1738 /**
1739  *
1740  *
1741  *
1742  *
1743  * */
bet_historical_set_page_title(gint account_number)1744 void bet_historical_set_page_title ( gint account_number )
1745 {
1746     GtkWidget *widget;
1747     gchar *title;
1748     gchar *hist_srce_name;
1749     gint result;
1750 
1751     hist_srce_name = bet_historical_get_hist_source_name ( account_number );
1752     result = gsb_data_account_get_bet_hist_fyear ( account_number );
1753     if ( result == 0 )
1754         title = g_strdup_printf (
1755                     _("Amounts by %s on 12 months rolling for the account: '%s'"),
1756                     hist_srce_name,
1757                     gsb_data_account_get_name ( account_number ) );
1758     else
1759         title = g_strdup_printf (
1760                     _("Amounts by %s in %s for the account: '%s'"),
1761                     hist_srce_name,
1762                     gsb_data_fyear_get_name ( result ),
1763                     gsb_data_account_get_name ( account_number ) );
1764 
1765     widget = GTK_WIDGET ( g_object_get_data ( G_OBJECT ( grisbi_win_get_account_page () ), "bet_hist_title") );
1766     gtk_label_set_label ( GTK_LABEL ( widget ), title );
1767 
1768     g_free ( hist_srce_name );
1769     g_free ( title );
1770 }
1771 
1772 
1773 /**
1774  * retourne la date de début de l'exercice en cours ou la date de l'année en cours.
1775  *
1776  *
1777  * \return date de début de la période courante
1778  * */
bet_historical_get_start_date_current_fyear(void)1779 GDate *bet_historical_get_start_date_current_fyear ( void )
1780 {
1781     GDate *date = NULL;
1782     gint fyear_number = 0;
1783 
1784     date = gdate_today ( );
1785     fyear_number = gsb_data_fyear_get_from_date ( date );
1786 
1787     if ( fyear_number <= 0 )
1788     {
1789         g_date_set_month ( date, 1 );
1790         g_date_set_day ( date, 1 );
1791 
1792         return date;
1793     }
1794     else
1795     {
1796         g_date_free ( date );
1797         date = gsb_data_fyear_get_beginning_date ( fyear_number );
1798 
1799         return gsb_date_copy ( date );
1800     }
1801 }
1802 
1803 
1804 /**
1805  * discrimine les opérations appartenant à l'exercice en cours
1806  *
1807  * \param date                  date de l'opération est > date_min de recherche
1808  * \param start_current_fyear   date de début de l'exercice en cours
1809  * \param date_max              date max de recherche des données passées
1810  *
1811  * \return 0    opération <= à date_max et < start_current_fyear (n'appartient pas à l'exercice en cours)
1812  * \return 1    opération > start_current_fyear (appartient à l'exercice en cours)
1813  * \return 2    opération <= à date_max et > start_current_fyear (appartient à l'exercice en cours) *
1814  * \return -1   toutes les autres opérations ( aucune à priori )
1815  * */
bet_historical_get_type_transaction(const GDate * date,GDate * start_current_fyear,GDate * date_max)1816 gint bet_historical_get_type_transaction ( const GDate *date,
1817                         GDate *start_current_fyear,
1818                         GDate *date_max )
1819 {
1820     gint result = -1;
1821 
1822     if ( g_date_compare ( date, date_max ) <= 0 )
1823     {
1824         if ( g_date_compare ( date, start_current_fyear ) >= 0 )
1825             result = 2;
1826         else
1827             result = 0;
1828     }
1829     else
1830     {
1831         if ( g_date_compare ( date, start_current_fyear ) >= 0 )
1832             result = 1;
1833     }
1834 
1835     return result;
1836 }
1837 
1838 
1839 /**
1840  * cache l'exercice courant et les exercices futurs
1841  *
1842  *
1843  *
1844  * */
bet_historical_fyear_hide_present_futures_fyears(void)1845 void bet_historical_fyear_hide_present_futures_fyears ( void )
1846 {
1847     GDate *date;
1848     GSList *tmp_list;
1849 
1850     date = gdate_today ( );
1851 
1852     tmp_list = gsb_data_fyear_get_fyears_list ( );
1853     while (tmp_list)
1854     {
1855         FyearStruct *fyear;
1856 
1857         fyear = tmp_list -> data;
1858 
1859         /* check the fyear only if the dates are valid */
1860         if ( fyear -> beginning_date && fyear -> end_date )
1861         {
1862             if ( g_date_compare ( date, fyear -> beginning_date ) >= 0
1863              &&
1864              g_date_compare ( date, fyear -> end_date ) <= 0 )
1865             {
1866                 gsb_fyear_hide_iter_by_name ( bet_fyear_model, fyear -> fyear_name );
1867             }
1868             else if ( g_date_compare ( date, fyear -> beginning_date ) <= 0 )
1869             {
1870                 gsb_fyear_hide_iter_by_name ( bet_fyear_model, fyear -> fyear_name );
1871             }
1872         }
1873         tmp_list = tmp_list -> next;
1874     }
1875 
1876     g_date_free ( date );
1877 }
1878 
1879 
1880 /**
1881  *
1882  *
1883  *
1884  *
1885  * */
bet_historical_create_toolbar(GtkWidget * parent,GtkWidget * tree_view)1886 GtkWidget *bet_historical_create_toolbar ( GtkWidget *parent,
1887                         GtkWidget *tree_view )
1888 {
1889     GtkWidget *toolbar;
1890     GtkToolItem *item;
1891 
1892     toolbar = gtk_toolbar_new ( );
1893     g_object_set_data ( G_OBJECT ( toolbar ), "tree_view", tree_view );
1894     g_object_set_data ( G_OBJECT ( toolbar ), "page", parent );
1895 
1896     /* print button */
1897     item = utils_buttons_tool_button_new_from_image_label ("gtk-print-24.png", _("Print"));
1898     gtk_widget_set_tooltip_text ( GTK_WIDGET ( item ), _("Print the array") );
1899     g_signal_connect ( G_OBJECT ( item ),
1900                         "clicked",
1901                         G_CALLBACK ( bet_historical_print_tab ),
1902                         tree_view );
1903     gtk_toolbar_insert ( GTK_TOOLBAR ( toolbar ), item, -1 );
1904 
1905     /* Export button */
1906     item = utils_buttons_tool_button_new_from_image_label ("gsb-export-24.png", _("Export"));
1907     gtk_widget_set_tooltip_text ( GTK_WIDGET ( item ), _("Export the array") );
1908     g_signal_connect ( G_OBJECT ( item ),
1909                         "clicked",
1910                         G_CALLBACK ( bet_historical_export_tab ),
1911                         tree_view );
1912     gtk_toolbar_insert ( GTK_TOOLBAR ( toolbar ), item, -1 );
1913 
1914 #ifdef HAVE_GOFFICE
1915     /* sectors button */
1916     item = utils_buttons_tool_button_new_from_image_label ("gsb-graph-sectors-24.png", _("Data graph"));
1917     gtk_widget_set_tooltip_text ( GTK_WIDGET ( item ), _("Display the pie graph") );
1918     g_signal_connect ( G_OBJECT ( item ),
1919                         "clicked",
1920                         G_CALLBACK ( bet_graph_sectors_graph_new ),
1921                         tree_view );
1922     gtk_toolbar_insert ( GTK_TOOLBAR ( toolbar ), item, -1 );
1923 
1924     /* monthly button */
1925     item = bet_graph_button_menu_new ( toolbar,
1926                         "historical_graph",
1927                         G_CALLBACK ( bet_graph_montly_graph_new ),
1928                         tree_view );
1929     gtk_toolbar_insert ( GTK_TOOLBAR ( toolbar ), item, -1 );
1930 #endif /* HAVE_GOFFICE */
1931 
1932     return ( toolbar );
1933 
1934 }
1935 
1936 
1937 /**
1938  *
1939  *
1940  *
1941  *
1942  * */
bet_historical_update_toolbar(gint toolbar_style)1943 void bet_historical_update_toolbar ( gint toolbar_style )
1944 {
1945     gtk_toolbar_set_style ( GTK_TOOLBAR ( bet_historical_toolbar ), toolbar_style );
1946 }
1947 
1948 
1949 /**
1950  *
1951  *
1952  *
1953  *
1954  * */
bet_historical_export_tab(GtkWidget * menu_item,GtkTreeView * tree_view)1955 void bet_historical_export_tab ( GtkWidget *menu_item,
1956                         GtkTreeView *tree_view )
1957 {
1958     GtkWidget *dialog;
1959     gint resultat;
1960     gchar *filename;
1961     gchar *tmp_last_directory;
1962 
1963     dialog = gtk_file_chooser_dialog_new ( _("Export the historical data"),
1964 					   GTK_WINDOW ( grisbi_app_get_active_window (NULL) ),
1965 					   GTK_FILE_CHOOSER_ACTION_SAVE,
1966 					   "gtk-cancel", GTK_RESPONSE_CANCEL,
1967 					   "gtk-save", GTK_RESPONSE_OK,
1968 					   NULL);
1969 
1970     gtk_file_chooser_set_current_name ( GTK_FILE_CHOOSER ( dialog ), "division.csv");
1971     gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER ( dialog ), gsb_file_get_last_path () );
1972     gtk_file_chooser_set_do_overwrite_confirmation ( GTK_FILE_CHOOSER ( dialog ), TRUE);
1973     gtk_window_set_position ( GTK_WINDOW ( dialog ), GTK_WIN_POS_CENTER_ON_PARENT );
1974 
1975     resultat = gtk_dialog_run ( GTK_DIALOG ( dialog ));
1976 
1977     switch ( resultat )
1978     {
1979 	case GTK_RESPONSE_OK :
1980 	    filename = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER ( dialog ) );
1981         tmp_last_directory = utils_files_selection_get_last_directory ( GTK_FILE_CHOOSER ( dialog ), TRUE );
1982         gsb_file_update_last_path ( tmp_last_directory );
1983         g_free ( tmp_last_directory );
1984 	    gtk_widget_destroy ( GTK_WIDGET ( dialog ) );
1985 
1986 	    /* vérification que c'est possible est faite par la boite de dialogue */
1987 	    if ( !gsb_csv_export_tree_view_list ( filename, tree_view ) )
1988 	    {
1989             dialogue_error ( _("Cannot save file.") );
1990             return;
1991 	    }
1992 
1993 	    break;
1994 
1995 	default :
1996 	    gtk_widget_destroy ( GTK_WIDGET ( dialog ));
1997 	    return;
1998     }
1999 }
2000 
2001 
2002 /**
2003  *
2004  *
2005  *
2006  *
2007  * */
bet_historical_print_tab(GtkWidget * menu_item,GtkTreeView * tree_view)2008 void bet_historical_print_tab ( GtkWidget *menu_item,
2009                         GtkTreeView *tree_view )
2010 {
2011     GtkTreeSelection *selection;
2012 
2013     selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW ( tree_view ) );
2014 
2015     if ( !gtk_tree_selection_get_selected ( GTK_TREE_SELECTION ( selection ), NULL, NULL ) )
2016     {
2017         GtkTreePath *path;
2018 
2019         path = gtk_tree_path_new_first ( );
2020         gtk_tree_selection_select_path ( selection, path );
2021         gtk_tree_path_free ( path );
2022     }
2023 
2024     print_tree_view_list ( menu_item, tree_view );
2025 }
2026 
2027 
2028 /**
2029  *
2030  *
2031  *
2032  *
2033  * */
bet_historical_get_hist_source_name(gint account_number)2034 gchar *bet_historical_get_hist_source_name ( gint account_number )
2035 {
2036     gint result ;
2037 
2038     if ( account_number == -1 )
2039         return g_strdup ( _("Categories") );
2040 
2041     result = gsb_data_account_get_bet_hist_data ( account_number );
2042     if ( result )
2043         return g_strdup ( _("Budgetary lines") );
2044     else
2045         return g_strdup ( _("Categories") );
2046 }
2047 
2048 
2049 /**
2050  *
2051  *
2052  * \param
2053  *
2054  * \return TRUE
2055  * */
bet_historical_get_list_trans_current_fyear(void)2056 GHashTable *bet_historical_get_list_trans_current_fyear ( void )
2057 {
2058     return list_trans_hist;
2059 }
2060 
2061 
2062 /**
2063  *
2064  *
2065  * \param
2066  *
2067  * \return
2068  **/
bet_historical_get_bet_fyear_model_filter(void)2069 GtkTreeModel *bet_historical_get_bet_fyear_model_filter (void)
2070 {
2071 	return bet_fyear_model_filter;
2072 }
2073 
2074 /**
2075  *
2076  *
2077  * \param
2078  *
2079  * \return
2080  **/
bet_historical_get_toolbar(void)2081 GtkWidget *bet_historical_get_toolbar (void)
2082 {
2083 	return bet_historical_toolbar;
2084 }
2085 
2086 /**
2087  *
2088  *
2089  * \param
2090  *
2091  * \return
2092  **/
2093 /* Local Variables: */
2094 /* c-basic-offset: 4 */
2095 /* End: */
2096