38 #include <glib/gi18n.h>
40 #include "Recurrence.h"
44 #include "dialog-utils.h"
45 #include "assistant-acct-period.h"
46 #include "assistant-utils.h"
47 #include "gnc-component-manager.h"
50 #include "gnc-frequency.h"
52 #include "gnc-gui-query.h"
54 #include "misc-gnome-utils.h"
55 #include "gnc-session.h"
57 #define ASSISTANT_ACCT_PERIOD_CM_CLASS "assistant-acct-period"
65 GtkWidget * assistant;
67 GtkWidget * period_remarks;
68 GtkWidget * close_results;
69 GtkWidget * book_details;
70 GtkWidget * book_title;
71 GtkTextView * book_notes;
72 GtkWidget * apply_label;
78 GDate prev_closing_date;
86 void ap_assistant_prepare (GtkAssistant *assistant, GtkWidget *page,
88 void ap_assistant_menu_prepare (GtkAssistant *assistant, gpointer user_data);
89 void ap_assistant_book_prepare (GtkAssistant *assistant, gpointer user_data);
90 void ap_assistant_apply_prepare (GtkAssistant *assistant, gpointer user_data);
91 void ap_assistant_summary_prepare (GtkAssistant *assistant, gpointer user_data);
93 gboolean ap_validate_menu (GtkAssistant *assistant, gpointer user_data);
95 void ap_assistant_finish (GtkAssistant *gtkassistant, gpointer user_data);
96 void ap_assistant_cancel (GtkAssistant *gtkassistant, gpointer user_data);
97 void ap_assistant_close (GtkAssistant *gtkassistant, gpointer user_data);
105 get_earliest_in_book (
QofBook *book)
112 q = qof_query_create_for(GNC_ID_SPLIT);
117 p1 = g_slist_prepend (NULL, TRANS_DATE_POSTED);
118 p1 = g_slist_prepend (p1, SPLIT_TRANS);
130 earliest = xaccQueryGetEarliestDateFound (q);
148 get_num_xactions_before_date(
QofBook *book,
time64 close_date)
157 q = qof_query_create_for(GNC_ID_TRANS);
162 param = g_slist_prepend (NULL, TRANS_DATE_POSTED);
164 pred = qof_query_date_predicate (QOF_COMPARE_LTE, QOF_DATE_MATCH_NORMAL, ts);
171 for (n = res; n; n = n->next) cnt ++;
185 switch (info->close_status)
191 str = _(
"The book was closed successfully.");
203 ap_assistant_destroy_cb (GtkObject *
object, gpointer data)
207 gnc_unregister_gui_component_by_data (ASSISTANT_ACCT_PERIOD_CM_CLASS, info);
210 recurrenceListFree(&info->period);
211 g_free (info->earliest_str);
218 ap_assistant_cancel (GtkAssistant *assistant, gpointer user_data)
221 gnc_close_gui_component_by_data (ASSISTANT_ACCT_PERIOD_CM_CLASS, info);
227 ap_assistant_close (GtkAssistant *assistant, gpointer user_data)
230 gnc_close_gui_component_by_data (ASSISTANT_ACCT_PERIOD_CM_CLASS, info);
236 ap_assistant_prepare (GtkAssistant *assistant, GtkWidget *page,
239 gint currentpage = gtk_assistant_get_current_page(assistant);
245 ap_assistant_menu_prepare(assistant, user_data);
249 ap_assistant_book_prepare (assistant, user_data);
253 ap_assistant_apply_prepare (assistant, user_data);
257 ap_assistant_summary_prepare (assistant, user_data);
265 ap_assistant_menu_prepare (GtkAssistant *assistant, gpointer user_data)
268 GDate period_begin, period_end, date_now;
273 ENTER (
"info=%p", info);
277 recurrenceListFree(&info->period);
278 gnc_frequency_save_to_recurrence(info->period_menu, &info->period, &info->closing_date);
281 g_date_clear (&period_begin, 1);
282 g_date_clear (&period_end, 1);
283 g_date_clear (&date_now, 1);
285 period_end = info->closing_date;
288 while (0 > g_date_compare(&period_end, &date_now ))
291 PINFO (
"Period = %d and End date is %d/%d/%d", nperiods,
292 g_date_get_month(&period_end),
293 g_date_get_day(&period_end),
294 g_date_get_year(&period_end));
295 period_begin = period_end;
296 recurrenceListNextInstance(info->period, &period_begin, &period_end);
299 if (g_date_valid (&period_end) != TRUE)
306 info->earliest = get_earliest_in_book (gnc_get_current_book());
308 PINFO (
"Date of earliest transaction is %" G_GINT64_FORMAT
" %s",
309 info->earliest,
gnc_ctime (&info->earliest));
312 str = g_strdup_printf (
316 ngettext(
"The earliest transaction date found in this book is %s. "
317 "Based on the selection made above, this book will be split "
319 "The earliest transaction date found in this book is %s. "
320 "Based on the selection made above, this book will be split "
325 gtk_label_set_text (GTK_LABEL(info->period_remarks), str);
332 ap_assistant_book_prepare (GtkAssistant *assistant, gpointer user_data)
337 const char *period_text;
341 GtkTextBuffer *buffer;
345 ENTER (
"info=%p", info);
348 cstr = get_close_status_str (info);
349 gtk_label_set_text (GTK_LABEL(info->close_results), cstr);
350 info->close_status = -1;
354 recurrenceListFree(&info->period);
355 gnc_frequency_save_to_recurrence(info->period_menu, &info->period, &info->closing_date);
358 g_date_get_day(&info->closing_date),
359 g_date_get_month(&info->closing_date),
360 g_date_get_year(&info->closing_date));
362 currbook = gnc_get_current_book();
363 ntrans = get_num_xactions_before_date(currbook,
370 _(
"You have asked for a book to be created. This book "
371 "will contain all transactions up to midnight %s "
372 "(for a total of %d transactions spread over %d accounts).\n\n "
373 "Amend the Title and Notes or Click on 'Forward' to proceed.\n "
374 "Click on 'Back' to adjust the dates or 'Cancel'.");
375 str = g_strdup_printf (period_text, close_date_str, ntrans, nacc);
376 gtk_label_set_text (GTK_LABEL(info->book_details), str);
379 gtk_widget_show (GTK_WIDGET (info->book_details));
383 g_date_get_day(&info->prev_closing_date),
384 g_date_get_month(&info->prev_closing_date),
385 g_date_get_year(&info->prev_closing_date));
387 str = g_strdup_printf (_(
"Period %s - %s"), prev_close_date_str, close_date_str);
388 gtk_entry_set_text (GTK_ENTRY(info->book_title), str);
390 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(info->book_notes));
391 gtk_text_buffer_set_text(buffer, str, -1);
399 ap_assistant_apply_prepare (GtkAssistant *assistant, gpointer user_data)
404 const char *apply_text =
405 _(
"The book will be created with the title %s when you "
406 "click on 'Apply'. Click on 'Back' to adjust, "
407 "or 'Cancel' to not create any book.");
409 btitle = gtk_entry_get_text (GTK_ENTRY(info->book_title));
410 str = g_strdup_printf (apply_text, btitle);
411 gtk_label_set_text (GTK_LABEL(info->apply_label), str);
418 ap_assistant_menu_changed_cb (GtkWidget *widget, gpointer user_data)
421 GtkAssistant *assistant = GTK_ASSISTANT(info->window);
422 gint num = gtk_assistant_get_current_page (assistant);
423 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
425 ENTER (
"info=%p", info);
426 ap_assistant_menu_prepare (assistant, info);
427 gtk_assistant_set_page_complete (assistant, page, ap_validate_menu (assistant, user_data));
433 ap_validate_menu (GtkAssistant *assistant, gpointer user_data)
437 ENTER(
"info=%p", info);
441 recurrenceListFree(&info->period);
442 gnc_frequency_save_to_recurrence(info->period_menu, &info->period, &info->closing_date);
444 if (0 <= g_date_compare(&info->prev_closing_date, &info->closing_date))
450 g_date_clear (&date_now, 1);
452 if (0 < g_date_compare(&info->closing_date, &date_now))
463 ap_assistant_finish (GtkAssistant *assistant, gpointer user_data)
466 GtkTextBuffer * buffer;
467 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);
489 info->close_status = 0;
492 info->prev_closing_date = info->closing_date;
493 recurrenceListNextInstance (info->period, &info->prev_closing_date,
494 &info->closing_date);
498 if (g_date_valid(&info->closing_date) == TRUE)
505 gnc_frequency_setup_recurrence (info->period_menu, NULL,
506 &info->closing_date);
508 gtk_assistant_set_current_page (GTK_ASSISTANT(info->window), 1);
516 ap_assistant_summary_prepare (GtkAssistant *assistant, gpointer user_data)
521 ENTER (
"info=%p", info);
527 msg = _(
"%s\nCongratulations! You are done closing books!\n");
529 str = g_strdup_printf (msg, get_close_status_str (info));
530 gtk_label_set_text (GTK_LABEL(info->summary), str);
544 builder = gtk_builder_new();
545 gnc_builder_add_from_file (builder ,
"assistant-acct-period.glade",
"Account Period Assistant");
546 window = GTK_WIDGET(gtk_builder_get_object (builder,
"Account Period Assistant"));
547 info->window = window;
550 gnc_assistant_set_colors (GTK_ASSISTANT (info->window));
553 gtk_assistant_set_page_complete (GTK_ASSISTANT (window),
554 GTK_WIDGET(gtk_builder_get_object(builder,
"start_page")),
556 gtk_assistant_set_page_complete (GTK_ASSISTANT (window),
557 GTK_WIDGET(gtk_builder_get_object(builder,
"book_page")),
559 gtk_assistant_set_page_complete (GTK_ASSISTANT (window),
560 GTK_WIDGET(gtk_builder_get_object(builder,
"finish_page")),
562 gtk_assistant_set_page_complete (GTK_ASSISTANT (window),
563 GTK_WIDGET(gtk_builder_get_object(builder,
"summary_page")),
566 info->close_status = -1;
571 info->earliest = get_earliest_in_book (gnc_get_current_book());
573 PINFO (
"date of earliest transaction is %" G_GINT64_FORMAT
" %s",
574 info->earliest,
gnc_ctime (&info->earliest));
576 g_date_clear (&info->closing_date, 1);
578 g_date_clear (&info->prev_closing_date, 1);
579 info->prev_closing_date = info->closing_date;
580 g_date_add_years (&info->closing_date, 1);
584 recurrenceSet(r, 1, PERIOD_MONTH, &info->closing_date, WEEKEND_ADJ_NONE);
586 info->period = g_list_append(info->period, r);
589 info->period_menu = GNC_FREQUENCY(
590 gnc_frequency_new_from_recurrence(info->period, &info->closing_date));
593 gnc_frequency_set_frequency_label_text(info->period_menu, _(
"Period:"));
594 gnc_frequency_set_date_label_text(info->period_menu, _(
"Closing Date:"));
598 box = GTK_WIDGET(gtk_builder_get_object(builder,
"period_hbox"));
599 gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (info->period_menu), TRUE, TRUE, 0);
600 g_signal_connect (info->period_menu,
"changed",
601 G_CALLBACK (ap_assistant_menu_changed_cb), info);
604 info->period_remarks = GTK_WIDGET(gtk_builder_get_object(builder,
"remarks_label"));
606 info->close_results = GTK_WIDGET(gtk_builder_get_object(builder,
"results_label"));
608 info->book_details = GTK_WIDGET(gtk_builder_get_object(builder,
"book_label"));
610 info->book_title = GTK_WIDGET(gtk_builder_get_object(builder,
"book_title_entry"));
612 info->book_notes = GTK_TEXT_VIEW(gtk_builder_get_object(builder,
"book_notes_view"));
614 info->apply_label = GTK_WIDGET(gtk_builder_get_object(builder,
"finish_page"));
616 info->summary = GTK_WIDGET(gtk_builder_get_object(builder,
"summary_label"));
618 g_signal_connect (G_OBJECT(window),
"destroy",
619 G_CALLBACK (ap_assistant_destroy_cb), info);
621 gtk_builder_connect_signals(builder, info);
622 g_object_unref(G_OBJECT(builder));
629 ap_close_handler (gpointer user_data)
633 gtk_widget_destroy (info->window);
645 gnc_acct_period_dialog (
void)
651 ap_assistant_create (info);
653 gnc_register_gui_component (ASSISTANT_ACCT_PERIOD_CM_CLASS,
654 NULL, ap_close_handler, info);
656 gtk_widget_show_all (info->window);
658 gnc_window_adjust_for_screen (GTK_WINDOW(info->window));
void gnc_gdate_set_today(GDate *gd)
void qof_query_add_term(QofQuery *query, QofQueryParamList *param_list, QofQueryPredData *pred_data, QofQueryOp op)
gint gnc_account_n_descendants(const Account *account)
utility functions for the GnuCash UI
#define PINFO(format, args...)
void qof_query_set_sort_order(QofQuery *q, QofQueryParamList *primary_sort_params, QofQueryParamList *secondary_sort_params, QofQueryParamList *tertiary_sort_params)
Use a 64-bit unsigned int timespec.
void qof_query_set_sort_increasing(QofQuery *q, gboolean prim_inc, gboolean sec_inc, gboolean tert_inc)
#define ENTER(format, args...)
struct _QofQuery QofQuery
time64 gnc_time64_get_day_end_gdate(const GDate *date)
void qof_query_set_max_results(QofQuery *q, int n)
char * qof_print_date(time64 secs)
convert single-entry accounts to clean double-entry
void qof_query_destroy(QofQuery *q)
void qof_query_set_book(QofQuery *q, QofBook *book)
GList * qof_query_run(QofQuery *query)
size_t qof_print_date_dmy_buff(gchar *buff, size_t buflen, int day, int month, int year)
#define QUERY_DEFAULT_SORT
time64 gnc_time(time64 *tbuf)
get the current local time
gchar * 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
const gchar * QofLogModule
void gnc_gdate_set_time64(GDate *gd, time64 time)
void timespecFromTime64(Timespec *ts, time64 t)