38 #include <glib/gi18n.h> 40 #include "Recurrence.h" 44 #include "dialog-utils.h" 45 #include "assistant-acct-period.h" 46 #include "gnc-component-manager.h" 50 #include "gnc-frequency.h" 51 #include "gnc-gui-query.h" 53 #include "misc-gnome-utils.h" 54 #include "gnc-session.h" 56 #define ASSISTANT_ACCT_PERIOD_CM_CLASS "assistant-acct-period" 58 static QofLogModule log_module = GNC_MOD_ASSISTANT;
64 GtkWidget * assistant;
66 GtkWidget * period_remarks;
67 GtkWidget * close_results;
68 GtkWidget * book_details;
69 GtkWidget * book_title;
70 GtkTextView * book_notes;
71 GtkWidget * apply_label;
77 GDate prev_closing_date;
85 void ap_assistant_prepare (GtkAssistant *assistant, GtkWidget *page,
87 void ap_assistant_menu_prepare (GtkAssistant *assistant, gpointer user_data);
88 void ap_assistant_book_prepare (GtkAssistant *assistant, gpointer user_data);
89 void ap_assistant_apply_prepare (GtkAssistant *assistant, gpointer user_data);
90 void ap_assistant_summary_prepare (GtkAssistant *assistant, gpointer user_data);
92 gboolean ap_validate_menu (GtkAssistant *assistant, gpointer user_data);
94 void ap_assistant_finish (GtkAssistant *gtkassistant, gpointer user_data);
95 void ap_assistant_cancel (GtkAssistant *gtkassistant, gpointer user_data);
96 void ap_assistant_close (GtkAssistant *gtkassistant, gpointer user_data);
104 get_earliest_in_book (QofBook *book)
111 q = qof_query_create_for(GNC_ID_SPLIT);
116 p1 = g_slist_prepend (NULL, TRANS_DATE_POSTED);
117 p1 = g_slist_prepend (p1, SPLIT_TRANS);
129 earliest = xaccQueryGetEarliestDateFound (q);
147 get_num_xactions_before_date(QofBook *book,
time64 close_date)
151 QofQueryPredData *pred;
155 q = qof_query_create_for(GNC_ID_TRANS);
160 param = g_slist_prepend (NULL, TRANS_DATE_POSTED);
161 pred = qof_query_date_predicate (QOF_COMPARE_LTE, QOF_DATE_MATCH_NORMAL, close_date);
168 for (n = res; n; n = n->next) cnt ++;
182 switch (info->close_status)
188 str = _(
"The book was closed successfully.");
200 ap_assistant_destroy_cb (GtkWidget *
object, gpointer data)
204 gnc_unregister_gui_component_by_data (ASSISTANT_ACCT_PERIOD_CM_CLASS, info);
207 recurrenceListFree(&info->period);
208 g_free (info->earliest_str);
215 ap_assistant_cancel (GtkAssistant *assistant, gpointer user_data)
218 gnc_close_gui_component_by_data (ASSISTANT_ACCT_PERIOD_CM_CLASS, info);
224 ap_assistant_close (GtkAssistant *assistant, gpointer user_data)
227 gnc_close_gui_component_by_data (ASSISTANT_ACCT_PERIOD_CM_CLASS, info);
233 ap_assistant_prepare (GtkAssistant *assistant, GtkWidget *page,
236 gint currentpage = gtk_assistant_get_current_page(assistant);
242 ap_assistant_menu_prepare(assistant, user_data);
246 ap_assistant_book_prepare (assistant, user_data);
250 ap_assistant_apply_prepare (assistant, user_data);
254 ap_assistant_summary_prepare (assistant, user_data);
262 ap_assistant_menu_prepare (GtkAssistant *assistant, gpointer user_data)
265 GDate period_begin, period_end, date_now;
266 char *str, *earliest_str;
270 ENTER (
"info=%p", info);
274 recurrenceListFree(&info->period);
275 gnc_frequency_save_to_recurrence(info->period_menu, &info->period, &info->closing_date);
278 g_date_clear (&period_begin, 1);
279 g_date_clear (&period_end, 1);
280 g_date_clear (&date_now, 1);
282 period_end = info->closing_date;
285 while (0 > g_date_compare(&period_end, &date_now ))
288 PINFO (
"Period = %d and End date is %d/%d/%d", nperiods,
289 g_date_get_month(&period_end),
290 g_date_get_day(&period_end),
291 g_date_get_year(&period_end));
292 period_begin = period_end;
293 recurrenceListNextInstance(info->period, &period_begin, &period_end);
296 if (g_date_valid (&period_end) != TRUE)
303 info->earliest = get_earliest_in_book (gnc_get_current_book());
305 earliest_str =
gnc_ctime (&info->earliest);
306 PINFO (
"Date of earliest transaction is %" G_GINT64_FORMAT
" %s",
307 info->earliest, earliest_str);
308 g_free (earliest_str);
311 str = g_strdup_printf (
315 ngettext(
"The earliest transaction date found in this book is %s. " 316 "Based on the selection made above, this book will be split " 318 "The earliest transaction date found in this book is %s. " 319 "Based on the selection made above, this book will be split " 324 gtk_label_set_text (GTK_LABEL(info->period_remarks), str);
331 ap_assistant_book_prepare (GtkAssistant *assistant, gpointer user_data)
336 const char *period_text;
340 GtkTextBuffer *buffer;
344 ENTER (
"info=%p", info);
347 cstr = get_close_status_str (info);
348 gtk_label_set_text (GTK_LABEL(info->close_results), cstr);
349 info->close_status = -1;
353 recurrenceListFree(&info->period);
354 gnc_frequency_save_to_recurrence(info->period_menu, &info->period, &info->closing_date);
357 g_date_get_day(&info->closing_date),
358 g_date_get_month(&info->closing_date),
359 g_date_get_year(&info->closing_date));
361 currbook = gnc_get_current_book();
362 ntrans = get_num_xactions_before_date(currbook,
371 _(
"You have asked for a book to be created. This book " 372 "will contain all transactions up to midnight %s " 373 "(for a total of %d transactions spread over %d accounts).\n\n" 374 "Amend the Title and Notes or Click on \"Next\" to proceed.\n" 375 "Click on \"Back\" to adjust the dates or \"Cancel\".");
376 str = g_strdup_printf (period_text, close_date_str, ntrans, nacc);
377 gtk_label_set_text (GTK_LABEL(info->book_details), str);
380 gtk_widget_show (GTK_WIDGET (info->book_details));
384 g_date_get_day(&info->prev_closing_date),
385 g_date_get_month(&info->prev_closing_date),
386 g_date_get_year(&info->prev_closing_date));
388 str = g_strdup_printf (_(
"Period %s - %s"), prev_close_date_str, close_date_str);
389 gtk_entry_set_text (GTK_ENTRY(info->book_title), str);
391 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(info->book_notes));
392 gtk_text_buffer_set_text(buffer, str, -1);
400 ap_assistant_apply_prepare (GtkAssistant *assistant, gpointer user_data)
405 const char *apply_text =
406 _(
"The book will be created with the title %s when you " 407 "click on \"Apply\". Click on \"Back\" to adjust, " 408 "or \"Cancel\" to not create any book.");
410 btitle = gtk_entry_get_text (GTK_ENTRY(info->book_title));
411 str = g_strdup_printf (apply_text, btitle);
412 gtk_label_set_text (GTK_LABEL(info->apply_label), str);
419 ap_assistant_menu_changed_cb (GtkWidget *widget, gpointer user_data)
422 GtkAssistant *assistant = GTK_ASSISTANT(info->window);
423 gint num = gtk_assistant_get_current_page (assistant);
424 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
426 ENTER (
"info=%p", info);
427 ap_assistant_menu_prepare (assistant, info);
428 gtk_assistant_set_page_complete (assistant, page, ap_validate_menu (assistant, user_data));
434 ap_validate_menu (GtkAssistant *assistant, gpointer user_data)
438 ENTER(
"info=%p", info);
442 recurrenceListFree(&info->period);
443 gnc_frequency_save_to_recurrence(info->period_menu, &info->period, &info->closing_date);
445 if (0 <= g_date_compare(&info->prev_closing_date, &info->closing_date))
451 g_date_clear (&date_now, 1);
453 if (0 < g_date_compare(&info->closing_date, &date_now))
464 ap_assistant_finish (GtkAssistant *assistant, gpointer user_data)
467 GtkTextBuffer * buffer;
468 GtkTextIter startiter, enditer;
473 ENTER(
"info=%p", info);
475 btitle = gtk_entry_get_text (GTK_ENTRY(info->book_title));
476 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(info->book_notes));
477 len = gtk_text_buffer_get_char_count (buffer);
478 gtk_text_buffer_get_iter_at_offset(buffer, &startiter, 0);
479 gtk_text_buffer_get_iter_at_offset(buffer, &enditer, len);
481 bnotes = gtk_text_buffer_get_text(buffer, &startiter, &enditer , 0);
482 PINFO(
"Book title is - %s\n", btitle);
487 info->close_status = 0;
490 info->prev_closing_date = info->closing_date;
491 recurrenceListNextInstance (info->period, &info->prev_closing_date,
492 &info->closing_date);
496 if (g_date_valid(&info->closing_date) == TRUE)
503 gnc_frequency_setup_recurrence (info->period_menu, NULL,
504 &info->closing_date);
506 gtk_assistant_set_current_page (GTK_ASSISTANT(info->window), 1);
514 ap_assistant_summary_prepare (GtkAssistant *assistant, gpointer user_data)
519 ENTER (
"info=%p", info);
525 msg = _(
"%s\nCongratulations! You are done closing books!\n");
527 str = g_strdup_printf (msg, get_close_status_str (info));
528 gtk_label_set_text (GTK_LABEL(info->summary), str);
543 builder = gtk_builder_new();
544 gnc_builder_add_from_file (builder ,
"assistant-acct-period.glade",
"account_period_assistant");
545 window = GTK_WIDGET(gtk_builder_get_object (builder,
"account_period_assistant"));
546 info->window = window;
549 gtk_widget_set_name (GTK_WIDGET(window),
"gnc-id-assistant-account-period");
552 gtk_assistant_set_page_complete (GTK_ASSISTANT (window),
553 GTK_WIDGET(gtk_builder_get_object(builder,
"start_page")),
555 gtk_assistant_set_page_complete (GTK_ASSISTANT (window),
556 GTK_WIDGET(gtk_builder_get_object(builder,
"book_page")),
558 gtk_assistant_set_page_complete (GTK_ASSISTANT (window),
559 GTK_WIDGET(gtk_builder_get_object(builder,
"finish_page")),
561 gtk_assistant_set_page_complete (GTK_ASSISTANT (window),
562 GTK_WIDGET(gtk_builder_get_object(builder,
"summary_page")),
565 info->close_status = -1;
570 info->earliest = get_earliest_in_book (gnc_get_current_book());
572 earliest_str =
gnc_ctime (&info->earliest);
573 PINFO (
"date of earliest transaction is %" G_GINT64_FORMAT
" %s",
574 info->earliest, earliest_str);
575 g_free (earliest_str);
577 g_date_clear (&info->closing_date, 1);
579 g_date_clear (&info->prev_closing_date, 1);
580 info->prev_closing_date = info->closing_date;
581 g_date_add_years (&info->closing_date, 1);
585 recurrenceSet(r, 1, PERIOD_MONTH, &info->closing_date, WEEKEND_ADJ_NONE);
587 info->period = g_list_append(info->period, r);
590 info->period_menu = GNC_FREQUENCY(
591 gnc_frequency_new_from_recurrence(info->period, &info->closing_date));
594 gnc_frequency_set_frequency_label_text(info->period_menu, _(
"Period"));
595 gnc_frequency_set_date_label_text(info->period_menu, _(
"Closing Date"));
599 box = GTK_WIDGET(gtk_builder_get_object(builder,
"period_hbox"));
600 gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (info->period_menu), TRUE, TRUE, 0);
601 g_signal_connect (info->period_menu,
"changed",
602 G_CALLBACK (ap_assistant_menu_changed_cb), info);
605 info->period_remarks = GTK_WIDGET(gtk_builder_get_object(builder,
"remarks_label"));
607 info->close_results = GTK_WIDGET(gtk_builder_get_object(builder,
"results_label"));
609 info->book_details = GTK_WIDGET(gtk_builder_get_object(builder,
"book_label"));
611 info->book_title = GTK_WIDGET(gtk_builder_get_object(builder,
"book_title_entry"));
613 info->book_notes = GTK_TEXT_VIEW(gtk_builder_get_object(builder,
"book_notes_view"));
615 info->apply_label = GTK_WIDGET(gtk_builder_get_object(builder,
"finish_page"));
617 info->summary = GTK_WIDGET(gtk_builder_get_object(builder,
"summary_label"));
619 g_signal_connect (G_OBJECT(window),
"destroy",
620 G_CALLBACK (ap_assistant_destroy_cb), info);
622 gtk_builder_connect_signals(builder, info);
623 g_object_unref(G_OBJECT(builder));
630 ap_close_handler (gpointer user_data)
634 gtk_widget_destroy (info->window);
646 gnc_acct_period_dialog (
void)
652 ap_assistant_create (info);
654 gnc_register_gui_component (ASSISTANT_ACCT_PERIOD_CM_CLASS,
655 NULL, ap_close_handler, info);
657 gtk_widget_show_all (info->window);
659 gnc_window_adjust_for_screen (GTK_WINDOW(info->window));
size_t qof_print_date_dmy_buff(gchar *buff, size_t buflen, int day, int month, int year)
qof_print_date_dmy_buff Convert a date as day / month / year integers into a localized string represe...
void qof_query_add_term(QofQuery *q, QofQueryParamList *param_list, QofQueryPredData *pred_data, QofQueryOp op)
This is the general function that adds a new Query Term to a query.
gint gnc_account_n_descendants(const Account *account)
Return the number of descendants of the specified account.
Date and Time handling routines.
utility functions for the GnuCash UI
#define PINFO(format, args...)
Print an informational note.
void qof_query_set_sort_order(QofQuery *q, QofQueryParamList *params1, QofQueryParamList *params2, QofQueryParamList *params3)
When a query is run, the results are sorted before being returned.
void gnc_gdate_set_today(GDate *gd)
Set a GDate to the current day.
void qof_query_set_sort_increasing(QofQuery *q, gboolean prim_inc, gboolean sec_inc, gboolean tert_inc)
When a query is run, the results are sorted before being returned.
#define ENTER(format, args...)
Print a function entry debugging message.
void qof_query_set_max_results(QofQuery *q, int n)
Set the maximum number of results that should be returned.
convert single-entry accounts to clean double-entry
char * qof_print_date(time64 secs)
Convenience; calls through to qof_print_date_dmy_buff().
void qof_query_destroy(QofQuery *query)
Frees the resources associate with a Query object.
void qof_query_set_book(QofQuery *query, QofBook *book)
Set the book to be searched.
#define MAX_DATE_LENGTH
The maximum length of a string created by the date printers.
GList * qof_query_run(QofQuery *query)
Perform the query, return the results.
void gnc_gdate_set_time64(GDate *gd, time64 time)
Set a GDate to a time64.
time64 gnc_time64_get_day_end_gdate(const GDate *date)
The gnc_time64_get_day_end() routine will take the given time in GLib GDate format and adjust it to t...
#define QUERY_DEFAULT_SORT
Default sort object type.
time64 gnc_time(time64 *tbuf)
get the current time
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
char * gnc_ctime(const time64 *secs)
Return a string representation of a date from a 64-bit time value.
API for Transactions and Splits (journal entries)
#define QOF_QUERY_FIRST_TERM
First/only term is same as 'and'.