27 #include <glib/gi18n.h>
31 #include "dialog-utils.h"
34 #include "pricecell.h"
36 #include "checkboxcell.h"
38 #include "gnc-component-manager.h"
40 #include "gnome-utils/gnc-warnings.h"
43 #include "gncEntryLedger.h"
44 #include "gncEntryLedgerP.h"
45 #include "gncEntryLedgerLayout.h"
46 #include "gncEntryLedgerModel.h"
47 #include "gncEntryLedgerControl.h"
49 static QofLogModule log_module =
"Business Entry Ledger";
60 entry = gnc_entry_ledger_get_blank_entry (ledger);
63 if (!gncEntryIsOpen (entry))
64 gncEntryBeginEdit (entry);
65 gncEntryDestroy (entry);
69 ledger->blank_entry_edited = FALSE;
77 if (!ledger)
return NULL;
78 return gncEntryLookup (ledger->book, &(ledger->blank_entry_guid));
83 const char *name, gboolean *isnew)
85 const char *placeholder = _(
"The account %s does not allow transactions.");
86 const char *missing = _(
"The account %s does not exist. "
87 "Would you like to create it?");
91 GList *account_types = NULL;
99 if (!gnc_verify_dialog (ledger->parent, TRUE, missing, name))
107 account_types = g_list_prepend (account_types, (gpointer)
ACCT_TYPE_ASSET);
109 if ( ledger->is_cust_doc )
115 g_list_free ( account_types );
122 gnc_combo_cell_set_value (cell, account_name);
123 gnc_basic_cell_set_changed (&cell->cell, TRUE);
124 g_free (account_name);
130 gnc_error_dialog (ledger->parent, placeholder, name);
138 const char * cell_name)
144 cell = gnc_table_layout_get_cell (ledger->table->layout, cell_name);
147 name = gnc_basic_cell_get_value (cell);
148 return gnc_entry_ledger_get_account_by_name (ledger, cell, name, &dummy);
152 const char *cell_name)
158 if (gnc_table_layout_get_cell_changed (ledger->table->layout,
161 name = gnc_table_layout_get_cell_value (ledger->table->layout, cell_name);
162 return gncTaxTableLookupByName (ledger->book, name);
166 entry = gnc_entry_ledger_get_current_entry (ledger);
167 if (ledger->is_cust_doc)
168 return gncEntryGetInvTaxTable (entry);
170 return gncEntryGetBillTaxTable (entry);
174 const char * cell_name)
177 (
CheckboxCell *) gnc_table_layout_get_cell (ledger->table->layout, cell_name);
185 gint gnc_entry_ledger_get_type (
GncEntryLedger *ledger,
const char * cell_name)
188 (
RecnCell *) gnc_table_layout_get_cell (ledger->table->layout, cell_name);
193 return (gnc_recn_cell_get_flag (cell) -
'0');
198 const char *cell_name,
202 (
PriceCell *) gnc_table_layout_get_cell (ledger->table->layout, cell_name);
207 *value = gnc_price_cell_get_value (cell);
217 if (!ledger)
return NULL;
219 guid = gnc_table_get_vcell_data (ledger->table, vcell_loc);
220 if (!guid)
return NULL;
222 return gncEntryLookup (ledger->book, guid);
228 if (!ledger)
return NULL;
231 gnc_entry_ledger_get_entry (ledger,
232 ledger->table->current_cursor_loc.vcell_loc);
235 static void gnc_entry_ledger_config_action (
GncEntryLedger *ledger)
239 cell = (
ComboCell *) gnc_table_layout_get_cell (ledger->table->layout,
256 gnc_table_layout_get_cell (ledger->table->layout, ENTRY_ACTN_CELL), TRUE);
261 gnc_table_layout_get_cell (ledger->table->layout, ENTRY_ACTN_CELL), FALSE);
264 gnc_price_cell_set_fraction
266 gnc_table_layout_get_cell (ledger->table->layout, ENTRY_PRIC_CELL),
269 gnc_price_cell_set_fraction
271 gnc_table_layout_get_cell (ledger->table->layout, ENTRY_DISC_CELL),
274 gnc_price_cell_set_fraction
275 ((
PriceCell *) gnc_table_layout_get_cell (ledger->table->layout,
280 gnc_entry_ledger_config_action (ledger);
288 if (!book)
return NULL;
289 if (type < 0 || type >= GNCENTRY_NUM_REGISTER_TYPES)
return NULL;
294 ledger->traverse_to_new = TRUE;
295 ledger->prefs_group = NULL;
300 case GNCENTRY_ORDER_ENTRY:
301 case GNCENTRY_ORDER_VIEWER:
302 case GNCENTRY_INVOICE_ENTRY:
303 case GNCENTRY_INVOICE_VIEWER:
304 ledger->is_cust_doc = TRUE;
305 ledger->is_credit_note = FALSE;
307 case GNCENTRY_BILL_ENTRY:
308 case GNCENTRY_BILL_VIEWER:
309 case GNCENTRY_EXPVOUCHER_ENTRY:
310 case GNCENTRY_EXPVOUCHER_VIEWER:
311 case GNCENTRY_NUM_REGISTER_TYPES:
312 ledger->is_cust_doc = FALSE;
313 ledger->is_credit_note = FALSE;
315 case GNCENTRY_CUST_CREDIT_NOTE_ENTRY:
316 case GNCENTRY_CUST_CREDIT_NOTE_VIEWER:
317 ledger->is_cust_doc = TRUE;
318 ledger->is_credit_note = TRUE;
320 case GNCENTRY_VEND_CREDIT_NOTE_ENTRY:
321 case GNCENTRY_VEND_CREDIT_NOTE_VIEWER:
322 case GNCENTRY_EMPL_CREDIT_NOTE_ENTRY:
323 case GNCENTRY_EMPL_CREDIT_NOTE_VIEWER:
324 ledger->is_cust_doc = FALSE;
325 ledger->is_credit_note = TRUE;
328 PWARN (
"Bad GncEntryLedgerType");
335 ledger->blank_entry_edited = FALSE;
339 ledger->last_date_entered = *today;
344 TableLayout *layout = gnc_entry_ledger_layout_new (ledger);
345 TableModel *model = gnc_entry_ledger_model_new (type);
346 TableControl *control = gnc_entry_ledger_control_new ();
347 model->handler_user_data = ledger;
348 control->user_data = ledger;
350 ledger->table = gnc_table_new (layout, model, control);
353 gnc_entry_ledger_config_cells (ledger);
360 header = gnc_table_layout_get_cursor (ledger->table->layout, CURSOR_HEADER);
362 gnc_table_set_vcell (ledger->table, header, NULL, TRUE, TRUE, vcell_loc);
370 vloc.vcell_loc.virt_row = 1;
371 vloc.vcell_loc.virt_col = 0;
372 vloc.phys_row_offset = 0;
373 vloc.phys_col_offset = 0;
375 cursor = gnc_table_layout_get_cursor (ledger->table->layout,
"cursor");
377 gnc_table_set_vcell (ledger->table, cursor, NULL, TRUE, TRUE, vloc.vcell_loc);
379 if (gnc_table_find_close_valid_cell (ledger->table, &vloc, FALSE))
380 gnc_table_move_cursor (ledger->table, vloc);
383 g_warning (
"Can't find valid initial location");
388 gnc_entry_ledger_display_init (ledger);
391 gnc_entry_ledger_set_readonly(ledger, TRUE);
402 gnc_entry_ledger_clear_blank_entry (ledger);
403 gnc_entry_ledger_display_fini (ledger);
404 gnc_table_destroy (ledger->table);
411 if (!ledger)
return NULL;
412 return ledger->table;
419 ledger->order = order;
421 if (!ledger->query && order)
423 ledger->query = qof_query_create_for (GNC_ENTRY_MODULE_NAME);
426 g_slist_prepend (g_slist_prepend (NULL,
429 gncOrderGetGUID (order), QOF_QUERY_AND);
431 gnc_entry_ledger_display_refresh (ledger);
439 if (!ledger->invoice)
465 ledger->query = qof_query_create_for (GNC_ENTRY_MODULE_NAME);
469 switch (ledger->type)
471 case GNCENTRY_INVOICE_ENTRY:
472 case GNCENTRY_INVOICE_VIEWER:
473 case GNCENTRY_CUST_CREDIT_NOTE_ENTRY:
474 case GNCENTRY_CUST_CREDIT_NOTE_VIEWER:
475 type = ENTRY_INVOICE;
477 case GNCENTRY_BILL_ENTRY:
478 case GNCENTRY_BILL_VIEWER:
479 case GNCENTRY_EXPVOUCHER_ENTRY:
480 case GNCENTRY_EXPVOUCHER_VIEWER:
481 case GNCENTRY_VEND_CREDIT_NOTE_ENTRY:
482 case GNCENTRY_VEND_CREDIT_NOTE_VIEWER:
483 case GNCENTRY_EMPL_CREDIT_NOTE_ENTRY:
484 case GNCENTRY_EMPL_CREDIT_NOTE_VIEWER:
488 g_warning (
"Invalid Ledger type");
489 type = ENTRY_INVOICE;
493 q = qof_query_create_for (GNC_ENTRY_MODULE_NAME);
498 if ((ledger->type == GNCENTRY_INVOICE_ENTRY ||
499 ledger->type == GNCENTRY_CUST_CREDIT_NOTE_ENTRY) &&
500 gncOwnerGetEndGUID (gncInvoiceGetOwner (ledger->invoice)) != NULL)
503 const GncGUID *invoice_parent =
505 QofQuery *q2 = qof_query_create_for (GNC_ENTRY_MODULE_NAME);
513 QOF_PARAM_GUID, NULL),
514 NULL, QOF_QUERY_AND);
516 QOF_PARAM_GUID, NULL),
517 invoice_parent, QOF_QUERY_AND);
519 QOF_PARAM_GUID, NULL),
520 invoice_parent, QOF_QUERY_OR);
524 TRUE, QOF_QUERY_AND);
526 INVOICE_IS_POSTED, NULL),
527 TRUE, QOF_QUERY_AND);
531 OWNER_PARENTG, NULL),
532 invoice_parent, QOF_QUERY_OR);
536 QOF_PARAM_GUID, NULL),
537 NULL, QOF_QUERY_AND);
554 void gnc_entry_ledger_set_default_invoice (
GncEntryLedger *ledger,
558 ledger->invoice = invoice;
568 if (gncInvoiceGetOwnerType (invoice) == GNC_OWNER_VENDOR)
569 ledger->last_date_entered =
timespec_to_gdate(gncInvoiceGetDateOpened (invoice));
571 if (!ledger->query && invoice)
572 create_invoice_query (ledger);
574 gnc_entry_ledger_display_refresh (ledger);
580 if (!ledger->invoice)
return;
582 create_invoice_query (ledger);
583 gnc_entry_ledger_display_refresh (ledger);
586 void gnc_entry_ledger_set_parent (
GncEntryLedger *ledger, GtkWidget *parent)
589 ledger->parent = parent;
599 for (v_row = 1; v_row < table->num_virt_rows; v_row++)
603 e = gnc_entry_ledger_get_entry (ledger, vc_loc);
607 if (vcell_loc != NULL)
615 void gnc_entry_ledger_set_readonly (
GncEntryLedger *ledger, gboolean readonly)
623 switch (ledger->type)
625 case GNCENTRY_ORDER_ENTRY:
626 ledger->type = GNCENTRY_ORDER_VIEWER;
628 case GNCENTRY_INVOICE_ENTRY:
629 ledger->type = GNCENTRY_INVOICE_VIEWER;
630 create_invoice_query (ledger);
632 case GNCENTRY_BILL_ENTRY:
633 ledger->type = GNCENTRY_BILL_VIEWER;
634 create_invoice_query (ledger);
636 case GNCENTRY_EXPVOUCHER_ENTRY:
637 ledger->type = GNCENTRY_EXPVOUCHER_VIEWER;
638 create_invoice_query (ledger);
640 case GNCENTRY_CUST_CREDIT_NOTE_ENTRY:
641 ledger->type = GNCENTRY_CUST_CREDIT_NOTE_VIEWER;
642 create_invoice_query (ledger);
644 case GNCENTRY_VEND_CREDIT_NOTE_ENTRY:
645 ledger->type = GNCENTRY_VEND_CREDIT_NOTE_VIEWER;
646 create_invoice_query (ledger);
648 case GNCENTRY_EMPL_CREDIT_NOTE_ENTRY:
649 ledger->type = GNCENTRY_EMPL_CREDIT_NOTE_VIEWER;
650 create_invoice_query (ledger);
658 switch (ledger->type)
660 case GNCENTRY_ORDER_VIEWER:
661 ledger->type = GNCENTRY_ORDER_ENTRY;
663 case GNCENTRY_INVOICE_VIEWER:
664 ledger->type = GNCENTRY_INVOICE_ENTRY;
665 create_invoice_query (ledger);
667 case GNCENTRY_BILL_VIEWER:
668 ledger->type = GNCENTRY_BILL_ENTRY;
669 create_invoice_query (ledger);
671 case GNCENTRY_EXPVOUCHER_VIEWER:
672 ledger->type = GNCENTRY_EXPVOUCHER_ENTRY;
673 create_invoice_query (ledger);
675 case GNCENTRY_CUST_CREDIT_NOTE_VIEWER:
676 ledger->type = GNCENTRY_CUST_CREDIT_NOTE_ENTRY;
677 create_invoice_query (ledger);
679 case GNCENTRY_VEND_CREDIT_NOTE_VIEWER:
680 ledger->type = GNCENTRY_VEND_CREDIT_NOTE_ENTRY;
681 create_invoice_query (ledger);
683 case GNCENTRY_EMPL_CREDIT_NOTE_VIEWER:
684 ledger->type = GNCENTRY_EMPL_CREDIT_NOTE_ENTRY;
685 create_invoice_query (ledger);
693 gnc_table_model_set_read_only (ledger->table->model, readonly);
697 gnc_entry_ledger_clear_blank_entry (ledger);
700 gnc_entry_ledger_display_refresh (ledger);
709 if (gnc_table_current_cursor_changed (ledger->table, FALSE))
720 gint disc_type, disc_how;
721 gboolean taxable, taxincluded;
726 gnc_entry_ledger_get_numeric (ledger, ENTRY_QTY_CELL, &qty);
727 gnc_entry_ledger_get_numeric (ledger, ENTRY_PRIC_CELL, &price);
728 gnc_entry_ledger_get_numeric (ledger, ENTRY_DISC_CELL, &discount);
730 disc_type = gnc_entry_ledger_get_type (ledger, ENTRY_DISTYPE_CELL);
731 disc_how = gnc_entry_ledger_get_type (ledger, ENTRY_DISHOW_CELL);
734 if (ledger->type == GNCENTRY_BILL_ENTRY ||
735 ledger->type == GNCENTRY_BILL_VIEWER ||
736 ledger->type == GNCENTRY_EXPVOUCHER_ENTRY ||
737 ledger->type == GNCENTRY_EXPVOUCHER_VIEWER)
741 disc_how = GNC_DISC_PRETAX;
746 if (disc_type < 0 || disc_how < 0)
749 *value = gnc_numeric_zero ();
751 *tax_value = gnc_numeric_zero ();
755 taxable = gnc_entry_ledger_get_checkmark (ledger, ENTRY_TAXABLE_CELL);
756 taxincluded = gnc_entry_ledger_get_checkmark (ledger, ENTRY_TAXINCLUDED_CELL);
757 table = gnc_entry_ledger_get_taxtable (ledger, ENTRY_TAXTABLE_CELL);
760 if (ledger->type == GNCENTRY_EXPVOUCHER_ENTRY ||
761 ledger->type == GNCENTRY_EXPVOUCHER_VIEWER)
770 gnc_commodity *currency = gncInvoiceGetCurrency(ledger->invoice);
776 discount, disc_type, disc_how, denom,
777 value, NULL, &taxes);
792 if ((ledger == NULL) || (entry == NULL))
796 table = ledger->table;
800 for (v_row = table->num_virt_rows - 1; v_row > 0; v_row--)
801 for (v_col = 0; v_col < table->num_virt_cols; v_col++)
807 vcell = gnc_table_get_virtual_cell (table, vc_loc);
814 e = gncEntryLookup (ledger->book, vcell->vcell_data);
837 entry = gnc_entry_ledger_get_current_entry (ledger);
842 if (entry == gnc_entry_ledger_get_blank_entry (ledger))
844 gnc_entry_ledger_cancel_cursor_changes (ledger);
849 gnc_suspend_gui_refresh ();
850 if (!gncEntryIsOpen (entry))
851 gncEntryBeginEdit (entry);
857 order = gncEntryGetOrder (entry);
859 gncOrderRemoveEntry (order, entry);
861 invoice = gncEntryGetInvoice (entry);
863 gncInvoiceRemoveEntry (invoice, entry);
865 invoice = gncEntryGetBill (entry);
867 gncBillRemoveEntry (invoice, entry);
869 gncEntryDestroy (entry);
871 gnc_resume_gui_refresh ();
884 entry = gnc_entry_ledger_get_current_entry (ledger);
888 changed = gnc_table_current_cursor_changed (ledger->table, FALSE);
893 if (!changed && entry == gnc_entry_ledger_get_blank_entry (ledger))
896 gnc_suspend_gui_refresh ();
902 const char *title = _(
"Save the current entry?");
903 const char *message =
904 _(
"The current transaction has been changed. Would you like to "
905 "record the changes before duplicating this entry, or "
906 "cancel the duplication?");
910 dialog = gtk_message_dialog_new(GTK_WINDOW(ledger->parent),
911 GTK_DIALOG_DESTROY_WITH_PARENT,
912 GTK_MESSAGE_QUESTION,
915 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
917 gtk_dialog_add_buttons(GTK_DIALOG(dialog),
918 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
919 _(
"_Record"), GTK_RESPONSE_ACCEPT,
921 response = gnc_dialog_run(GTK_DIALOG(dialog), GNC_PREF_WARN_INV_ENTRY_DUP);
922 gtk_widget_destroy(dialog);
924 if (response != GTK_RESPONSE_ACCEPT)
926 gnc_resume_gui_refresh ();
930 if (!gnc_entry_ledger_commit_entry (ledger))
932 gnc_resume_gui_refresh ();
941 new_entry = gncEntryCreate (ledger->book);
942 gncEntryCopy (entry, new_entry, TRUE);
950 ledger->hint_entry = new_entry;
953 gnc_resume_gui_refresh ();
963 return ledger->query;
967 gnc_entry_ledger_set_prefs_group (
GncEntryLedger *ledger,
const gchar *
string)
972 ledger->prefs_group = string;
975 void gnc_entry_ledger_move_current_entry_updown (
GncEntryLedger *ledger,
983 blank = gnc_entry_ledger_get_blank_entry(ledger);
989 current = gnc_entry_ledger_get_current_entry(ledger);
990 if (!current || current == blank)
994 vcell_loc = ledger->table->current_cursor_loc.vcell_loc;
997 if (vcell_loc.virt_row == 0)
999 vcell_loc.virt_row--;
1003 vcell_loc.virt_row++;
1008 target = gnc_entry_ledger_get_entry(ledger, vcell_loc);
1009 if (!target || target == blank)
1023 if (g_date_compare(&d1, &d2) != 0)
1046 gnc_suspend_gui_refresh ();
1051 Timespec time_current = gncEntryGetDateEntered(current);
1052 Timespec time_target = gncEntryGetDateEntered(target);
1064 time_current.tv_sec++;
1066 time_target.tv_sec++;
1070 gncEntrySetDateEntered(current, time_target);
1071 gncEntrySetDateEntered(target, time_current);
1079 gnc_resume_gui_refresh ();
void gnc_combo_cell_set_autosize(ComboCell *cell, gboolean autosize)
const GncGUID * gncOwnerGetGUID(const GncOwner *owner)
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Dialog for create/edit an account.
utility functions for the GnuCash UI
gboolean timespec_equal(const Timespec *ta, const Timespec *tb)
Use a 64-bit unsigned int timespec.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Timespec gncEntryGetDate(const GncEntry *entry)
gnc_numeric gncAccountValueTotal(GList *list)
void gncInvoiceSortEntries(GncInvoice *invoice)
struct _QofQuery QofQuery
Account * gnc_ui_new_accounts_from_name_window_with_types(const char *name, GList *valid_types)
#define PWARN(format, args...)
gchar * gnc_get_account_name_for_register(const Account *account)
GDate timespec_to_gdate(Timespec ts)
Account handling public routines.
void qof_query_destroy(QofQuery *q)
void gncEntryComputeValue(gnc_numeric qty, gnc_numeric price, const GncTaxTable *tax_table, gboolean tax_included, gnc_numeric discount, GncAmountType discount_type, GncDiscountHow discount_how, int SCU, gnc_numeric *value, gnc_numeric *discount_value, GList **tax_value)
void qof_query_set_book(QofQuery *q, QofBook *book)
#define gncInvoiceGetGUID(x)
GDate gncEntryGetDateGDate(const GncEntry *entry)
void gnc_combo_cell_add_menu_item(ComboCell *cell, const char *menustr)
The ComboCell object implements a cell handler with a "combination-box" pull-down menu in it...
QofQuery * qof_query_merge(QofQuery *q1, QofQuery *q2, QofQueryOp op)
void gncEntrySetDateGDate(GncEntry *entry, const GDate *date)
void qof_query_add_guid_match(QofQuery *q, QofQueryParamList *param_list, const GncGUID *guid, QofQueryOp op)
void gnc_combo_cell_set_strict(ComboCell *cell, gboolean strict)
gboolean qof_book_is_readonly(const QofBook *book)
const GncGUID * guid_null(void)
Timespec timespec_now(void)
gboolean xaccAccountGetPlaceholder(const Account *acc)
void qof_query_add_boolean_match(QofQuery *q, QofQueryParamList *param_list, gboolean value, QofQueryOp op)
Business Entry Interface.
Account * gnc_account_lookup_for_register(const Account *base_account, const gchar *name)
const gchar * QofLogModule
GDate * gnc_g_date_new_today(void)