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