30 #include <glib/gi18n.h>
32 #include "dialog-utils.h"
38 #include "gnc-gui-query.h"
40 #include "gnc-account-sel.h"
41 #include "gnc-component-manager.h"
42 #include "gnc-date-edit.h"
43 #include "gnc-session.h"
46 #define DIALOG_BOOK_CLOSE_CM_CLASS "dialog-book-close"
48 void gnc_book_close_response_cb(GtkDialog *, gint, GtkDialog *);
60 GtkWidget* close_date_widget;
61 GtkWidget* income_acct_widget;
62 GtkWidget* expense_acct_widget;
63 GtkWidget* desc_widget;
70 gint component_manager_id;
94 g_return_val_if_fail(cacb, NULL);
95 g_return_val_if_fail(cmdty, NULL);
97 txn = g_hash_table_lookup(cacb->txns, cmdty);
102 txn->total = gnc_numeric_zero();
117 g_hash_table_insert(cacb->txns, cmdty, txn);
129 static void close_accounts_cb(
Account *a, gpointer data)
138 g_return_if_fail(cacb);
139 g_return_if_fail(cacb->cbw);
140 g_return_if_fail(cacb->txns);
150 g_assert(acct_commodity);
152 txn = find_or_create_txn(cacb, acct_commodity);
156 xaccSplitSetParent(split, txn->txn);
173 g_return_if_fail(cmdty);
174 g_return_if_fail(txn);
175 g_return_if_fail(cacb);
176 g_return_if_fail(cacb->hash_size);
182 if (cacb->hash_size == 1 &&
184 acc = cacb->base_acct;
212 xaccSplitSetParent(split, txn->txn);
227 g_return_if_fail(cbw);
228 g_return_if_fail(acct);
231 cacb.base_acct = acct;
232 cacb.acct_type = acct_type;
233 cacb.txns = g_hash_table_new_full(g_direct_hash,
238 root_acct = gnc_book_get_root_account(cbw->book);
242 cacb.hash_size = g_hash_table_size(cacb.txns);
244 g_hash_table_foreach(cacb.txns, (GHFunc)finish_txn_cb, &cacb);
247 g_hash_table_destroy(cacb.txns);
250 static void close_handler(gpointer data)
252 GtkWidget *dialog = data;
254 gtk_widget_destroy(dialog);
257 static void destroy_cb(GtkObject *
object, gpointer data)
261 cbw = g_object_get_data(G_OBJECT(
object),
"CloseBookWindow");
263 if (cbw->component_manager_id)
265 gnc_unregister_gui_component(cbw->component_manager_id);
266 cbw->component_manager_id = 0;
272 gnc_book_close_response_cb(GtkDialog *dialog, gint response, GtkDialog *unused)
278 ENTER(
"dialog %p, response %d, unused %p", dialog, response, unused);
280 g_return_if_fail(dialog);
282 cbw = g_object_get_data(G_OBJECT(dialog),
"CloseBookWindow");
283 g_return_if_fail(cbw);
287 case GTK_RESPONSE_HELP:
290 case GTK_RESPONSE_OK:
291 cbw->close_date = gnc_date_edit_get_date(GNC_DATE_EDIT(cbw->close_date_widget));
292 cbw->close_date += (3600 * 12);
293 cbw->desc = gtk_entry_get_text(GTK_ENTRY(cbw->desc_widget));
295 income_acct = gnc_account_sel_get_account(GNC_ACCOUNT_SEL(cbw->income_acct_widget));
296 expense_acct = gnc_account_sel_get_account(GNC_ACCOUNT_SEL(cbw->expense_acct_widget));
300 gnc_error_dialog(cbw->dialog,
"%s",
301 _(
"Please select an Equity account to hold the total Period Income."));
307 gnc_error_dialog(cbw->dialog,
"%s",
308 _(
"Please select an Equity account to hold the total Period Expense."));
312 gnc_suspend_gui_refresh();
315 gnc_resume_gui_refresh();
319 gtk_widget_destroy(GTK_WIDGET(dialog));
330 GList* equity_list = NULL;
332 g_return_if_fail(book);
335 g_return_if_fail(cbw);
339 builder = gtk_builder_new();
340 gnc_builder_add_from_file (builder,
"dialog-book-close.glade",
"Close Book");
341 cbw->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"Close Book"));
343 PINFO(
"Closed Book Window is %p, Dialog is %p", cbw, cbw->dialog);
346 box = GTK_WIDGET(gtk_builder_get_object (builder,
"date_box"));
347 cbw->close_date_widget = gnc_date_edit_new(
gnc_time (NULL), FALSE, FALSE);
348 gtk_box_pack_start(GTK_BOX(box), cbw->close_date_widget, TRUE, TRUE, 0);
351 equity_list = g_list_prepend(equity_list, GINT_TO_POINTER(
ACCT_TYPE_EQUITY));
352 box = GTK_WIDGET(gtk_builder_get_object (builder,
"income_acct_box"));
353 cbw->income_acct_widget = gnc_account_sel_new();
354 gnc_account_sel_set_acct_filters(GNC_ACCOUNT_SEL(cbw->income_acct_widget),
356 gnc_account_sel_set_new_account_ability(GNC_ACCOUNT_SEL(cbw->income_acct_widget), TRUE);
357 gtk_box_pack_start(GTK_BOX(box), cbw->income_acct_widget, TRUE, TRUE, 0);
360 box = GTK_WIDGET(gtk_builder_get_object (builder,
"expense_acct_box"));
361 cbw->expense_acct_widget = gnc_account_sel_new();
362 gnc_account_sel_set_acct_filters(GNC_ACCOUNT_SEL(cbw->expense_acct_widget),
364 gnc_account_sel_set_new_account_ability(GNC_ACCOUNT_SEL(cbw->expense_acct_widget), TRUE);
365 gtk_box_pack_start(GTK_BOX(box), cbw->expense_acct_widget, TRUE, TRUE, 0);
368 cbw->desc_widget = GTK_WIDGET(gtk_builder_get_object (builder,
"desc_entry"));
371 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, cbw->dialog);
374 cbw->component_manager_id =
375 gnc_register_gui_component(DIALOG_BOOK_CLOSE_CM_CLASS, NULL, close_handler,
377 gnc_gui_component_set_session(cbw->component_manager_id,
378 gnc_get_current_session());
379 g_signal_connect(cbw->dialog,
"destroy", G_CALLBACK(destroy_cb), NULL);
382 g_object_set_data_full(G_OBJECT(cbw->dialog),
"CloseBookWindow", cbw, g_free);
384 g_object_unref(G_OBJECT(builder));
387 gtk_widget_show_all(cbw->dialog);
389 g_list_free(equity_list);
void xaccAccountSetType(Account *acc, GNCAccountType tip)
Transaction * xaccMallocTransaction(QofBook *book)
void xaccSplitSetBaseValue(Split *s, gnc_numeric value, const gnc_commodity *base_currency)
void gnc_account_append_child(Account *new_parent, Account *child)
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
void gnc_account_foreach_descendant(const Account *acc, AccountCb thunk, gpointer user_data)
utility functions for the GnuCash UI
#define PINFO(format, args...)
GNCAccountType xaccAccountGetType(const Account *acc)
gnc_numeric gnc_numeric_neg(gnc_numeric a)
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
void xaccTransSetDescription(Transaction *trans, const char *desc)
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
gboolean gnc_numeric_zero_p(gnc_numeric a)
API for Transactions and Splits (journal entries)
#define ENTER(format, args...)
void xaccTransSetCurrency(Transaction *trans, gnc_commodity *curr)
Account * gnc_account_lookup_by_name(const Account *parent, const char *name)
void xaccTransSetIsClosingTxn(Transaction *trans, gboolean is_closing)
Account handling public routines.
void xaccTransCommitEdit(Transaction *trans)
void xaccTransBeginEdit(Transaction *trans)
void gnc_gnome_help(const char *file_name, const char *anchor)
gnc_numeric xaccAccountGetBalanceAsOfDate(Account *acc, time64 date)
All type declarations for the whole Gnucash engine.
Split * xaccMallocSplit(QofBook *book)
gnc_commodity * gnc_account_or_default_currency(const Account *account, gboolean *currency_from_account_found)
void xaccTransSetDatePostedSecs(Transaction *trans, time64 secs)
void xaccAccountBeginEdit(Account *acc)
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
#define xaccAccountInsertSplit(acc, s)
#define LEAVE(format, args...)
Account * xaccMallocAccount(QofBook *book)
time64 gnc_time(time64 *tbuf)
get the current local time
void xaccAccountSetDescription(Account *acc, const char *str)
void xaccTransSetDateEnteredSecs(Transaction *trans, time64 secs)
void gnc_ui_close_book(QofBook *book)
API for Transactions and Splits (journal entries)
void xaccAccountCommitEdit(Account *acc)
void xaccAccountSetName(Account *acc, const char *str)
const gchar * QofLogModule
void xaccAccountSetCommodity(Account *acc, gnc_commodity *com)