1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 Maxime DOYEN
4 * This file is part of HomeBank.
6 * HomeBank is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * HomeBank is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "dsp-mainwindow.h"
24 #include "list-scheduled.h"
25 #include "hub-scheduled.h"
27 #include "ui-transaction.h"
30 /****************************************************************************/
32 /****************************************************************************/
41 /* our global datas */
42 extern struct HomeBank
*GLOBALS
;
43 extern struct Preferences
*PREFS
;
45 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
47 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
49 ui_hub_scheduled_get_selected_item(GtkTreeView
*treeview
)
51 GtkTreeSelection
*treeselection
;
55 treeselection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview
));
56 if( gtk_tree_selection_get_selected(treeselection
, &model
, &iter
) )
60 gtk_tree_model_get(GTK_TREE_MODEL(model
), &iter
, LST_DSPUPC_DATAS
, &arc
, -1);
68 static void ui_hub_scheduled_onRowActivated (GtkTreeView
*treeview
,
70 GtkTreeViewColumn
*col
,
73 //struct hbfile_data *data;
76 DB( g_print ("\n[hub-scheduled] row double-clicked\n") );
78 //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(treeview, GTK_TYPE_WINDOW)), "inst_data");
80 arc
= ui_hub_scheduled_get_selected_item(treeview
);
81 ui_mainwindow_defarchive(arc
);
85 static void ui_hub_scheduled_do_post(Archive
*arc
, gboolean doedit
, gpointer user_data
)
87 struct hbfile_data
*data
= user_data
;
92 DB( g_print("\n[hub-scheduled] do post\n") );
95 window
= create_deftransaction_window(GTK_WINDOW(data
->window
), TRANSACTION_EDIT_ADD
, TRUE
, 0);
97 /* fill in the transaction */
98 txn
= da_transaction_malloc();
99 da_transaction_init_from_template(txn
, arc
);
100 txn
->date
= scheduled_get_postdate(arc
, arc
->nextdate
);
102 deftransaction_set_transaction(window
, txn
);
104 result
= gtk_dialog_run (GTK_DIALOG (window
));
106 DB( g_print(" - dialog result is %d\n", result
) );
108 if(result
== HB_RESPONSE_ADD
|| result
== GTK_RESPONSE_ACCEPT
)
110 deftransaction_get(window
, NULL
);
111 transaction_add(GTK_WINDOW(GLOBALS
->mainwindow
), txn
);
112 GLOBALS
->changes_count
++;
114 scheduled_date_advance(arc
);
116 DB( g_print(" - added 1 transaction to %d\n", txn
->kacc
) );
119 da_transaction_free(txn
);
121 deftransaction_dispose(window
, NULL
);
122 gtk_widget_destroy (window
);
127 static void ui_hub_scheduled_editpost_cb(GtkWidget
*widget
, gpointer user_data
)
129 struct hbfile_data
*data
= user_data
;
131 DB( g_print("\n[hub-scheduled] editpost\n") );
133 Archive
*arc
= ui_hub_scheduled_get_selected_item(GTK_TREE_VIEW(data
->LV_upc
));
137 ui_hub_scheduled_do_post(arc
, TRUE
, data
);
138 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_SENSITIVE
|UF_REFRESHALL
));
143 static void ui_hub_scheduled_post_cb(GtkWidget
*widget
, gpointer user_data
)
145 struct hbfile_data
*data
= user_data
;
147 DB( g_print("\n[hub-scheduled] post\n") );
149 Archive
*arc
= ui_hub_scheduled_get_selected_item(GTK_TREE_VIEW(data
->LV_upc
));
153 if( scheduled_is_postable(arc
) )
155 Transaction
*txn
= da_transaction_malloc ();
157 da_transaction_init_from_template(txn
, arc
);
158 txn
->date
= scheduled_get_postdate(arc
, arc
->nextdate
);
159 transaction_add(GTK_WINDOW(GLOBALS
->mainwindow
), txn
);
161 GLOBALS
->changes_count
++;
162 scheduled_date_advance(arc
);
164 da_transaction_free (txn
);
168 ui_hub_scheduled_do_post(arc
, FALSE
, data
);
171 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_SENSITIVE
|UF_REFRESHALL
));
176 static void ui_hub_scheduled_skip_cb(GtkWidget
*widget
, gpointer user_data
)
178 struct hbfile_data
*data
= user_data
;
180 DB( g_print("\n[hub-scheduled] skip\n") );
182 Archive
*arc
= ui_hub_scheduled_get_selected_item(GTK_TREE_VIEW(data
->LV_upc
));
183 if( (arc
!= NULL
) && (arc
->flags
& OF_AUTO
) )
185 GLOBALS
->changes_count
++;
186 scheduled_date_advance(arc
);
188 ui_hub_scheduled_populate(GLOBALS
->mainwindow
, NULL
);
189 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_SENSITIVE
));
195 static void ui_hub_scheduled_update(GtkWidget
*widget
, gpointer user_data
)
197 struct hbfile_data
*data
;
200 DB( g_print("\n[hub-scheduled] update\n") );
202 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
204 //filter = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_sched_filter));
206 Archive
*arc
= ui_hub_scheduled_get_selected_item(GTK_TREE_VIEW(data
->LV_upc
));
210 DB( g_print("archive is %s\n", arc
->memo
) );
212 gtk_widget_set_sensitive(GTK_WIDGET(data
->BT_sched_skip
), TRUE
);
213 gtk_widget_set_sensitive(GTK_WIDGET(data
->BT_sched_post
), TRUE
);
214 gtk_widget_set_sensitive(GTK_WIDGET(data
->BT_sched_editpost
), TRUE
);
218 gtk_widget_set_sensitive(GTK_WIDGET(data
->BT_sched_skip
), FALSE
);
219 gtk_widget_set_sensitive(GTK_WIDGET(data
->BT_sched_post
), FALSE
);
220 gtk_widget_set_sensitive(GTK_WIDGET(data
->BT_sched_editpost
), FALSE
);
227 static void ui_hub_scheduled_selection_cb(GtkTreeSelection
*treeselection
, gpointer user_data
)
229 ui_hub_scheduled_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection
)), GINT_TO_POINTER(UF_SENSITIVE
));
235 ** called after load, importamiga, on demand
237 void ui_hub_scheduled_postall(GtkWidget
*widget
, gpointer user_data
)
239 //struct hbfile_data *data;
241 gint usermode
= GPOINTER_TO_INT(user_data
);
243 DB( g_print("\n[hub-scheduled] post all\n") );
245 //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
247 count
= scheduled_post_all_pending();
257 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_REFRESHALL
));
261 txt
= _("No transaction to add");
263 txt
= _("transaction added: %d");
265 ui_dialog_msg_infoerror(GTK_WINDOW(GLOBALS
->mainwindow
), GTK_MESSAGE_INFO
,
266 _("Check scheduled transactions result"),
274 void ui_hub_scheduled_populate(GtkWidget
*widget
, gpointer user_data
)
276 struct hbfile_data
*data
;
288 DB( g_print("\n[hub-scheduled] populate\n") );
290 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
292 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(data
->LV_upc
));
293 gtk_list_store_clear (GTK_LIST_STORE(model
));
295 homebank_app_date_get_julian();
297 maxpostdate
= scheduled_date_get_post_max();
299 date
= g_date_new_julian (maxpostdate
);
300 g_date_strftime (buffer
, 256-1, PREFS
->date_format
, date
);
303 gtk_label_set_text(GTK_LABEL(data
->LB_maxpostdate
), buffer
);
306 list
= g_list_first(GLOBALS
->arc_list
);
309 Archive
*arc
= list
->data
;
312 guint nbdays
, nblate
;
314 if((arc
->flags
& OF_AUTO
) ) //&& arc->kacc > 0)
317 nbdays
= arc
->nextdate
- maxpostdate
;
318 nblate
= scheduled_get_latepost_count(arc
, GLOBALS
->today
);
320 DB( g_print(" - append '%s' : %d\n", arc
->memo
, nbdays
) );
322 if(arc
->flags
& OF_INCOME
)
333 /* insert normal txn */
334 acc
= da_acc_get(arc
->kacc
);
337 totinc
+= hb_amount_base(inc
, acc
->kcur
);
338 totexp
+= hb_amount_base(exp
, acc
->kcur
);
340 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
341 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
342 LST_DSPUPC_DATAS
, arc
,
343 LST_DSPUPC_NEXT
, nbdays
,
344 LST_DSPUPC_ACCOUNT
, acc
,
345 LST_DSPUPC_MEMO
, arc
->memo
,
346 LST_DSPUPC_EXPENSE
, exp
,
347 LST_DSPUPC_INCOME
, inc
,
348 LST_DSPUPC_NB_LATE
, nblate
,
351 /* insert internal xfer txn : 1378836 */
352 if(arc
->paymode
== PAYMODE_INTXFER
)
354 acc
= da_acc_get(arc
->kxferacc
);
357 totinc
+= hb_amount_base(-inc
, acc
->kcur
);
358 totexp
+= hb_amount_base(-exp
, acc
->kcur
);
360 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
361 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
362 LST_DSPUPC_DATAS
, arc
,
363 LST_DSPUPC_NEXT
, nbdays
,
364 LST_DSPUPC_ACCOUNT
, acc
,
365 LST_DSPUPC_MEMO
, arc
->memo
,
366 LST_DSPUPC_EXPENSE
, -inc
,
367 LST_DSPUPC_INCOME
, -exp
,
368 LST_DSPUPC_NB_LATE
, nblate
,
373 list
= g_list_next(list
);
379 gtk_list_store_append (GTK_LIST_STORE(model
), &iter
);
380 gtk_list_store_set (GTK_LIST_STORE(model
), &iter
,
381 LST_DSPUPC_DATAS
, NULL
,
382 LST_DSPUPC_ACCOUNT
, NULL
,
383 LST_DSPUPC_MEMO
, _("Total"),
384 LST_DSPUPC_EXPENSE
, totexp
,
385 LST_DSPUPC_INCOME
, totinc
,
389 ui_hub_scheduled_update(widget
, NULL
);
394 GtkWidget
*ui_hub_scheduled_create(struct hbfile_data
*data
)
396 GtkWidget
*hub
, *hbox
, *vbox
, *bbox
, *sw
, *tbar
;
397 GtkWidget
*label
, *widget
;
398 GtkToolItem
*toolitem
;
400 DB( g_print("\n[hub-scheduled] create\n") );
402 hub
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, 0);
403 gtk_container_set_border_width(GTK_CONTAINER(hub
), SPACING_SMALL
);
404 //data->GR_upc = hub;
406 vbox
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, 0);
407 //gtk_widget_set_margin_top(GTK_WIDGET(vbox), 0);
408 //gtk_widget_set_margin_bottom(GTK_WIDGET(vbox), SPACING_SMALL);
409 //gtk_widget_set_margin_start(GTK_WIDGET(vbox), 2*SPACING_SMALL);
410 //gtk_widget_set_margin_end(GTK_WIDGET(vbox), SPACING_SMALL);
411 gtk_box_pack_start (GTK_BOX (hub
), vbox
, TRUE
, TRUE
, 0);
413 sw
= gtk_scrolled_window_new (NULL
, NULL
);
414 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw
), GTK_SHADOW_ETCHED_IN
);
415 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw
), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
416 gtk_box_pack_start (GTK_BOX (vbox
), sw
, TRUE
, TRUE
, 0);
418 widget
= (GtkWidget
*)create_list_upcoming();
419 data
->LV_upc
= widget
;
420 gtk_container_add (GTK_CONTAINER (sw
), widget
);
422 tbar
= gtk_toolbar_new();
423 gtk_toolbar_set_icon_size (GTK_TOOLBAR(tbar
), GTK_ICON_SIZE_MENU
);
424 gtk_toolbar_set_style(GTK_TOOLBAR(tbar
), GTK_TOOLBAR_ICONS
);
425 gtk_style_context_add_class (gtk_widget_get_style_context (tbar
), GTK_STYLE_CLASS_INLINE_TOOLBAR
);
426 gtk_box_pack_start (GTK_BOX (vbox
), tbar
, FALSE
, FALSE
, 0);
428 label
= make_label_group(_("Scheduled transactions"));
429 toolitem
= gtk_tool_item_new();
430 gtk_container_add (GTK_CONTAINER(toolitem
), label
);
431 gtk_toolbar_insert(GTK_TOOLBAR(tbar
), GTK_TOOL_ITEM(toolitem
), -1);
433 toolitem
= gtk_separator_tool_item_new ();
434 gtk_tool_item_set_expand (toolitem
, FALSE
);
435 gtk_separator_tool_item_set_draw(GTK_SEPARATOR_TOOL_ITEM(toolitem
), FALSE
);
436 gtk_toolbar_insert(GTK_TOOLBAR(tbar
), GTK_TOOL_ITEM(toolitem
), -1);
439 bbox
= gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL
);
440 toolitem
= gtk_tool_item_new();
441 gtk_container_add (GTK_CONTAINER(toolitem
), bbox
);
442 gtk_toolbar_insert(GTK_TOOLBAR(tbar
), GTK_TOOL_ITEM(toolitem
), -1);
444 widget
= gtk_button_new_with_label(_("Skip"));
445 data
->BT_sched_skip
= widget
;
446 gtk_box_pack_start (GTK_BOX (bbox
), widget
, FALSE
, FALSE
, 0);
448 widget
= gtk_button_new_with_label(_("Edit & Post"));
449 data
->BT_sched_editpost
= widget
;
450 gtk_box_pack_start (GTK_BOX (bbox
), widget
, FALSE
, FALSE
, 0);
452 //TRANSLATORS: Posting a scheduled transaction is the action to materialize it into its target account.
453 //TRANSLATORS: Before that action the automated transaction occurrence is pending and not yet really existing.
454 widget
= gtk_button_new_with_label (_("Post"));
455 data
->BT_sched_post
= widget
;
456 gtk_box_pack_start (GTK_BOX (bbox
), widget
, FALSE
, FALSE
, 0);
458 toolitem
= gtk_separator_tool_item_new ();
459 gtk_tool_item_set_expand (toolitem
, FALSE
);
460 gtk_separator_tool_item_set_draw(GTK_SEPARATOR_TOOL_ITEM(toolitem
), FALSE
);
461 gtk_toolbar_insert(GTK_TOOLBAR(tbar
), GTK_TOOL_ITEM(toolitem
), -1);
463 hbox
= gtk_box_new(GTK_ORIENTATION_VERTICAL
, 0);
464 gtk_widget_set_valign (hbox
, GTK_ALIGN_CENTER
);
465 toolitem
= gtk_tool_item_new();
466 gtk_container_add (GTK_CONTAINER(toolitem
), hbox
);
467 gtk_toolbar_insert(GTK_TOOLBAR(tbar
), GTK_TOOL_ITEM(toolitem
), -1);
469 label
= make_label(_("maximum post date"), 0.0, 0.7);
470 gtk_widget_set_halign (label
, GTK_ALIGN_CENTER
);
471 gimp_label_set_attributes (GTK_LABEL (label
), PANGO_ATTR_SCALE
, PANGO_SCALE_SMALL
, -1);
472 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, 0);
474 label
= make_label(NULL
, 0.0, 0.7);
475 data
->LB_maxpostdate
= label
;
476 gtk_widget_set_halign (label
, GTK_ALIGN_CENTER
);
477 gimp_label_set_attributes (GTK_LABEL (label
), PANGO_ATTR_SCALE
, PANGO_SCALE_SMALL
, -1);
478 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, 0);
481 g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data
->LV_upc
)), "changed", G_CALLBACK (ui_hub_scheduled_selection_cb
), NULL
);
482 g_signal_connect (GTK_TREE_VIEW(data
->LV_upc
), "row-activated", G_CALLBACK (ui_hub_scheduled_onRowActivated
), NULL
);
483 g_signal_connect (G_OBJECT (data
->BT_sched_skip
), "clicked", G_CALLBACK (ui_hub_scheduled_skip_cb
), data
);
484 g_signal_connect (G_OBJECT (data
->BT_sched_editpost
), "clicked", G_CALLBACK (ui_hub_scheduled_editpost_cb
), data
);
485 g_signal_connect (G_OBJECT (data
->BT_sched_post
), "clicked", G_CALLBACK (ui_hub_scheduled_post_cb
), data
);